All Your Baseの日記

モバイルアプリを開発しています。

【Android】Calligraphyでカスタムフォントを設定する

f:id:ayb:20171022195730j:plain

AndroidでCalligraphyというライブラリを使ってカスタムフォントを簡単に設定する方法をメモしておきます。詳しい使い方は公式を参照してください(英語)。

github.com

Calligraphyの導入

app/build.gradle にCalligraphyを追加して、Syncします。Calligraphyの最新バージョンはGitHubのリポジトリを確認します。

dependencies {
    compile 'uk.co.chrisjenx:calligraphy:2.3.0'
}

assetsフォルダにフォントファイルを配置

assetsフォルダにフォントファイルを配置します。assetsフォルダがなければ、右クリックして作ります(下記画像参照)。assetsフォルダができたら、assetsフォルダの上でフォントファイルをペーストすればOKですね。

f:id:ayb:20171022194950p:plain

Calligraphyの初期化

ApplicationクラスあたりでCalligraphyの初期化を行います。マニフェストのApplicationの設定を忘れずにしておきましょう。

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        CalligraphyConfig.initDefault(new CalligraphyConfig.Builder()
                .setDefaultFontPath("PixelMplus10-Regular.ttf")
                .setFontAttrId(R.attr.fontPath)
                .build()
        );
    }
}

Activityにアタッチ。

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
}

カスタムフォントを適用できました。

f:id:ayb:20171022195601p:plain

LINEモバイル+VAIO Phone Aを契約した

f:id:ayb:20171022104441j:plain

LINEモバイルのSIMを契約して、ついでにVAIO Phone Aを購入しました。

mobile.line.me

LINEモバイルにした理由

現在、格安SIMは1枚だけ契約していたんですけど、お昼時にデータが降りてこなくてつらかったので、乗り換え先を検討していました。それはLINEモバイルも一緒かもしれないですけど、以下の理由でLINEモバイルを試してみることにしました。

  • Twitterがデータ通信のカウントフリー

3個くらい理由あるだろと思って書き始めましたけど1個しかなかった...。

LINEモバイルの「コミュニケーションフリープラン」というプランにするとLINE、Twitter、Facebook、Instagramのデータ通信がカウントフリーになります。自分は鬼のようにTwitterをやるので、このプランが魅力的でした。

VAIO Phone Aを購入した理由

今はHUAWEIの端末(HUAWEI VNS-L22、Android 7.0)をメインで使っているんですが、あまりHUAWEIの端末を使いたくない、もっとカッコ良い端末を使いたいという気分からVAIO Phoneを使うことにしました。以前、VAIO Phone(VA-10J)を使っていて気に入っていたこともあります。

お値段は21,800円、Android 6.0.1です。値段は安いです。

開封の儀

VAIO Phone A、かっこいいし、画面も大きくて良い感じです。LINEモバイルのSIMは、既に設定してあったので、開封してすぐに使えます。快適。

「Reactive Programming on Android with RxJava」を読んだ

f:id:ayb:20171008102030j:plain

「Reactive Programming on Android with RxJava」を読みました。英語ですけど、リアクティブプログラミングについてわかりやすく書いてあって良かったです。内容もAndroid向けでいい感じでした。

Reactive Programming on Android with RxJava (English Edition)

Reactive Programming on Android with RxJava (English Edition)

目次

  • RxJavaの基礎
    • リアクティブプログラミングとは
    • RxJavaのコアコンポーネント
    • オペレーター
    • マルチスレッド
  • RxJavaの応用
    • Androidにおけるリアクティブモデリング
    • バックプレッシャー
    • エラーハンドリング

内容についてはご自身の目でお確かめください。

【Kotlin】RecyclerViewのレイアウトを動的に切り替える

f:id:ayb:20171008094929j:plain

動的にというのかどうかわかりませんが、RecyclerViewのレイアウトを切り替えながら使いたい時があると思うのでそのためのメモ。

getItemViewType をオーバーライドして、ViewTypeを変更する処理を書きます。ViewTypeはInteger型です。そのあと、onCreateViewHolderにviewTypeが渡されてくるので、ここでviewTypeに応じてレイアウトを切り替えてあげればOKです。

internal class MyAdapter(var data : ArrayList<Chat>): RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyViewHolder {
        when(viewType) {
            0 -> return MyViewHolder(LayoutInflater.from(parent?.context).inflate(R.layout.chat_user, parent, false))
            else -> return MyViewHolder(LayoutInflater.from(parent?.context).inflate(R.layout.chat_bot, parent, false))
        }
    }

    override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {
        //省略
    }

    override fun getItemCount(): Int = data.size

    override fun getItemViewType(position: Int): Int {
        return if(data.get(position).isUser) 0 else 1
    }

    fun add(chat: Chat) {
        data.add(chat)
    }

    internal class MyViewHolder(view: View): RecyclerView.ViewHolder(view) {
        val textView: TextView?

        init {
            textView = view.findViewById(R.id.text)
        }
    }
}

【Android】RxでEditTextの入力内容を監視する

f:id:ayb:20171001202042j:plain

JakeさんのRxBindingを使ってEditTextへの入力内容をリアクティブ的に監視してみます。

github.com

まずはapp/build.gradleのdependenciesに追加してSyncします。

dependencies {
    //中略
    compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0' //追加
}

RxTextView#textChangeEvent にEditTextをセットしてあげると、入力内容が流れていきます。

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.EditText;

import com.jakewharton.rxbinding2.widget.RxTextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        EditText editText = findViewById(R.id.edit_text);

        RxTextView.textChangeEvents(editText)
                .subscribe(textChange -> Log.i("textChange", textChange.text().toString()));
    }
}

【Android】RxAndroidを導入する

f:id:ayb:20171001160559j:plain

今更感が拭えないですが、RxAndroidの導入方法をメモしておきます。

github.com

app/build.gradleにRxAndroidとRxJavaを追加して、Syncします。

dependencies {

    //中略

    compile 'io.reactivex.rxjava2:rxandroid:2.0.1' //追加
    compile 'io.reactivex.rxjava2:rxjava:2.1.3' //追加
}

これでとりあえず導入はできるんですが、ラムダ式を書くと怒られてダルいです。

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Observable.just("one", "two", "three", "four", "five")
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(result -> Log.i("result", result));
    }
}

通常はRetrolambdaを導入するものと思います。

www.allyourbase.jp

今回は「Set language level to 8」ってやればRetrolambdaを導入しなくてもOKでした(Android Studio 3.0 Canary 8で確認)。

f:id:ayb:20171001155611p:plain

app/build.gradleのcompileOptionsに勝手に追加されています。PATHにJava 8が通っていないといけないはず。

compileOptions {
    targetCompatibility 1.8
    sourceCompatibility 1.8
}

「Androidアプリ開発74のアンチパターン」を読んだ

f:id:ayb:20170930143441j:plain

最近発売された「Androidアプリ開発74のアンチパターン」がAmazonから届いたので、早速感想を書いてみます。この本、Androidに入門した後くらいに読むと勉強になる本であると感じました。KotlinやRxにも触れられていていい感じです。

Androidアプリ開発 74のアンチパターン

Androidアプリ開発 74のアンチパターン

Kotlin入門

Kotlinの基本文法が16ページにわたって解説されています。Kotlin入門するのにちょうどいいです。内容としては、変数、基本型、条件分岐、繰り返し、例外、クラス定義とプロパティ、メソッド定義、コンストラクタ、クラスの継承、インターフェース定義、Null安全といったところ。

ただ、この本の他の部分はJavaで書かれているので、この章だけ浮いている感じになっているのが少し残念であると感じました。せっかく文法を解説してくれたので、アンチパターン的な部分についてもKotlinで書いてくれると嬉しかったです。

ライブラリ

ライブラリについての章も設けられていて、GlideとOkHttpが紹介されています。Androidの入門書ではあまりライブラリに触れられているものがないので、こういう章があるのはとてもありがたいと思いました。

オープンソースのライブラリのライセンス表記についてのアンチパターンなど、誰かに言われなきゃ間違えそうなところについて解説されているのはとても良かったです。ライセンス表記はきちんと書きましょう。

個人的には、ライブラリとしてRetrofitとか入れてくれるといいかなと思います。最近はあまり使わないけどButterKnifeとかもとても好きなライブラリです。あとはDataBindingとかでしょうか。

Rx

本書の最後の最後で4ページほどRxについて触れられています。こういうものがあるんだよ、ということを知れるという意味で、とても良いですね。概念の存在を知らないと勉強したくても勉強できないですから。

Rxについての内容としては、こういう風に導入してこういう風に書くんだよ、というくらいの内容が書かれています。思い切って一章を割いて解説してくれると私としてはとても助かりましたが、それは贅沢というものですね。

アンチパターン集

ようやく本題。本書「Androidアプリ開発74のアンチパターン」は、Androidアプリ開発に関する74個のアンチパターンについての本です。アンチパターンとは、本書の言葉を借りれば「落とし穴」です。陥らない方が良いものです。

本書は、Androidアプリ開発における落とし穴に落ちてしまった人に、その対処策をしっかり教える一冊です。よくあるアンチパターンを74に厳選し、回避策やリカバリーを丁寧に解説しました。

具体的には、Android端末を用意せずに開発している、Eclipse(ADT)で開発している、といった初歩的なアンチパターン(?)から始まり、ListViewでViewHolderを使っていない、AsyncTaskでキャンセルじの処理を記述していない、など参考になるアンチパターンが解説されています。

初歩的な内容が多いのでAndroid入門したての人には自信を持ってお勧めできる本ですし、私のようにもっといい感じのAndroidエンジニアになりたいと思っている人にもお勧めです。

Androidアプリ開発 74のアンチパターン

Androidアプリ開発 74のアンチパターン

ボイスチェンジャーを使って女声の実況動画を作る

f:id:ayb:20170925214921j:plain

需要があるのか全然わかりませんが、ボイスレコーダーを使って女声の実況動画を作ることに成功しましたので、その方法を書いておきます。

女性になりきって実況動画を作りたい方や、何らかの事情で女性になりきって実況動画を作らなければならない方。参考にしていただければと思います。

Windows

まず必要なのはWindows環境です。Windows環境がないと女声の実況動画を撮影するのは難しいと思います。諦めてください。

ただ、Macしかない場合でも、BootCampを使ってWindows環境を作れば大丈夫です。私はBootCampを使ってWindows環境を作りました。BootCampについての詳細はググってください。

デスクトップキャプチャ

次に、デスクトップキャプチャを撮影するためのソフトを入手します。これは「AG-Desktop」というフリーソフトが良かったです。私はこれを使いました。詳細はググってください。

www.vector.co.jp

ボイスチェンジャー

次に、ボイスチェンジャー的なソフトを入手します。これは「恋声」というソフトを使います。このソフトが男声を女声に変換してくれます(逆もできます)。詳細はググってください。

恋声

ヘッドセット

ヘッドセットもあると良いですね。私はElecomの安いヘッドセットを買いました。こだわるなら高いものを買った方が良いみたいです。何事も同じです。

動画の撮影

さて、これで準備が整いました。恋声を起動して、女声に変換できていることを確認します。確認したら、AG-Desktopを起動してデスクトップキャプチャを開始します。もちろん、ヘッドセットも接続しておいてください。

出来上がったのが、以下の動画になります。我ながら、メッチャ可愛い声ですね。とてもいい感じに女声の動画を作ることができました。興味を持った方、レッツトライ!

Vimで入力モードに入るためのコマンドまとめ

f:id:ayb:20170924180631j:plain

Vimの入力モード(インサートモード)に入る時のコマンドがいくつかあるんですけど、うろ覚えだったので調べてメモしておきます。

コマンド 意味
i 現在のカーソルの位置から入力する
a 現在のカーソルの位置の次の位置から入力する
o 現在のカーソルの位置の1行下に行を追加して、その行に入力する
O 現在のカーソルの位置の1行上に行を追加して、その行に入力する
I カーソルを行頭に移動してから入力する
A カーソルを行末に移動してから入力する
s 現在のカーソルの位置にある文字を削除してから入力する
cw 現在のカーソルの位置にある単語を削除してから入力する

WordPressから、はてなブログに移転した

f:id:ayb:20170923215235j:plain

WordPressで運営していたブログの一つを、はてなブログ(ここ)に移転しました。

はてなブログに移転した理由は、

  • はてなブログのシンタックスハイライトが綺麗
  • WordPressの機能をほとんど使っていない
  • サーバー代が安い

といったところです。

はてなブログのシンタックスハイライトが綺麗

シンタックスハイライトとは、コードなどを綺麗に表示する機能ですね。

WordPressでももちろんシンタックスハイライトはできます。いろいろ試してみたんですが、はてなブログのシンタックスハイライトの方がいいかなと思いました。はてなブログのシンタックスハイライトは本当に綺麗です。

あと、WordPressでは文字をエスケープする必要があったんですが(試した範囲では)、はてなブログはそこら辺もいい感じにやってくれてとても良いです。

WordPressの機能をほとんど使っていない

WordPressは高機能なCMSなので、はてなブログにない機能をたくさん追加することができます。でも、技術的なメモとか読書感想文を書くのにそんなに機能はいらないです。

普通にブログをやっていて、はてなブログになくてWordPressにある機能でなくて困る機能ってあんまりないです。メールフォームくらいでしょうか。メールフォームは頑張ればはてなブログでもなんとかなりますし、メールフォームがあってもどうせ大した連絡はこないですし、他の連絡手段もあるから、まあいいかと思いました。

サーバー代が安い

はてなブログは基本無料なんですが、私は有料プラン(はてなブログプロ)を使っています。料金は長期契約だと600円/月になります。

WordPressのサーバーは、500円/月のwpXクラウドを使っています。これはWordPress 1個あたりの料金なので、ブログを増やせば500円 × 個数だけ費用がかかってしまいます。

はてなブログは、600円/月で10個までブログを運用できるので、ブログを複数運用するならはてなブログの方が安くなります。

まとめ

はてなTシャツ欲しい!