yo_waka's blog

418 I'm a teapot

MacからLinuxに乗り換えた

そろそろ家のMacbook Air (2013 Mid)が限界にきてたので、Thinkpad X1 Carbon (Gen 5th)を買ってArchLinux入れた。 この時期は毎年Lenovoのオンラインショップで40%以上ディスカウントされてるらしく、SSD以外モリモリでつけても17万円を切って財布にやさしい。

久々のLinux環境だけど、GUIも非常にサクサク動いてて満足度高い。 昔の印象だと輝度やボリュームが調整できなかったり、ファンクションキー効かなかったりした記憶があるけど、特に何もせずに最初から使えて、これが現代か・・という感じだった。 X1 Carbonは当たり前だけどCarbon素材なので、冬にいきなり膝の上においても冷たくないのはMacと比べて地味によい。

インストール

pockeさんの記事が詳しく、ArchWiki と合わせて見ながらやって特に詰まるところはなかった。 自分はデュアルブートにはせず、すべてLinux用にパーティション切った。 arch-chrootした後、reboot後にもwifi-menuが使えるよう pacman -S dialog wpa_supplicant を入れておかないと無線しかない環境だとつらくて1回やり直した。

デスクトップ環境

特にこだわりないのでGNOME3にしました。GDMからログインしてます。 なんだかんだGUIからWiFiBluetoothの設定ができるのは便利。 昔Unity使ってて結構重い感じだったけど、GNOME Shellは今のところ快適。

GNOME3.22からはデフォルトでWaylandを使うようになったらしく、.xinitrcや.xsessionにxrdbやxsetの設定を書いても実行されなくてハマった。 Waylandのドキュメントを見たらdesktopファイルに書くという記述があったので、見よう見真似で設定したら動いた。

~/.config/autostart/startup.desktop

[Desktop Entry]
Name=Startup
GenericName=Startup
Comment=Startup settings
Exec=/usr/local/bin/startup
Terminal=false
StartupNotify=true
Type=Application
Categories=X11;Legacy;Startup

/usr/local/bin/startup

#!/bin/sh

xrdb -merge /home/yo_waka/.Xresources
xset b off
xset r rate 200 30

日本語環境

最初ibus-skkを入れたところ何故かインプットメソッドが動かなくて、ibus-mozcを入れたら動いた。 無変換キーとカタカナ/ひらがなキーを切り替えに使ってる。 たまに変換が暴走することがあるので、よいやつがあれば切り替えたい。

フォントはNoto-FontsをYaourtで入れたら自動で設定された。 正直日本語フォントはMacがやっぱり一番だなーと思うけど、Noto-Fonts(特にsans-serif)も非常に綺麗でいい意味で裏切られた。 特にPDF開いたときにとても読みやすくて、GNOME標準のEvinceがとてもよいものに感じるw

ランチャー

MacのAlfredライクなAlbertというのをYaourtで入れた。 アプリの起動くらいしかしないので特に不満なし。

ターミナル

GNOME Terminalも使いやすいけど、透過させたかったのでrxvt-unicodeを入れた。 urxvtはXResourcesで見た目をカスタマイズできるのがよい感じ。

このような設定になった。

! Common
URxvt.geometry:             200x40
URxvt.scrollBar_right:      true
URxvt.scrollBar_floating:   true
URxvt.scrollstyle:          plain
URxvt.cursorBlink:          true
URxvt.cursorUnderline:      false
URxvt.pointerBlank:         true
URxvt.visualBell:           false
URxvt.saveLines:            3000
URxvt.fading:               40

URxvt.perl-ext-common:      default,tabbed

!! Tab
URxvt.tabbed.tabbar-fg:     2
URxvt.tabbed.tabbar-bg:     #001020
URxvt.tabbed.tab-fg:        3
URxvt.tabbed.tab-bg:        #001020

!! InputMethod
URxvt.perl-ext:             xim-onthespot
URxvt.preeditType:          OnTheSpot

!! Font list and Spacing
URxvt.font:                 xft:azuki_font:size=16
URxvt.letterSpace:          -1

!! Color Scheme and Opacity - gruvbox-dark https://github.com/morhetz/gruvbox
URxvt.depth:                32
URxvt.color0:               [90]#282828
URxvt.color1:               [90]#cc241d
URxvt.color2:               [90]#98971a
URxvt.color3:               [90]#d79921
URxvt.color4:               [90]#458588
URxvt.color5:               [90]#b16286
URxvt.color6:               [90]#689d6a
URxvt.color7:               [90]#a89984
URxvt.color8:               [90]#928374
URxvt.color9:               [90]#fb4934
URxvt.color10:              [90]#b8bb26
URxvt.color11:              [90]#fabd2f
URxvt.color12:              [90]#83a598
URxvt.color13:              [90]#d3869b
URxvt.color14:              [90]#8ec07c
URxvt.color15:              [90]#ebdbb2
URxvt.foreground:           [90]#ebdbb2
URxvt.background:           [80]#282828
URxvt.colorIT:              [90]#8ec07c
URxvt.colorBD:              [90]#d5c4a1
URxvt.colorUL:              [90]#83a598
URxvt.scrollColor:          [90]#504945

シェル

最近は補完が便利なのでfishに乗り換えた。シェルの設定で重くなりがちだったので設定が少なくてすむのが好き。 fishermanで以下を入れて使っている。

  • z
  • fzf
  • ghq
  • git_util

GoogleDrive

memo というCLIツールでメモを書いていて、GoogleDriveでリストを同期させているので無いと日常が死ぬ。 Linux向け公式クライアントはない模様だけど、gdriveというのがシンプルで使いやすそうだったので入れてみた。 fuseでマウントするやつもあったけど、依存パッケージが多かったのでやめた。

# Drive上のmemoディレクトリのIDを取得
$ gdrive list -q 'name contains "memo" and trashed=false'

# memoディレクトリに同期ダウンロード
$ gdrive sync download <ID> memo

# memoディレクトリを同期アップロード
$ gdrive sync upload memo <ID>

ディレクトリ名やファイル名を直接指定すると重複して作成されるので、IDを指定する必要がある。 IDは一度作ると変わらないようなので履歴からサクッと同期は可能ではある。 これで今まで通りできるようにはなったものの、公式クライアントが欲しい。

その他開発ツール系

全部Yaourtでインストールできて便利。

  • git
  • docker
  • tmux
  • neovim
  • tig

dockerは一瞬で立ち上がるのでMacのときよりめっちゃ使っていきそう。

不満なところ

これまで常用していた、Tweetdeck、Kindleのクライアントアプリがないこと。 Wineを入れれば使えるがWine入れたくない。。。 Tweetdeckはブラウザ版がよくできてるのでいいけど、Kindle Cloud Readerはオフライン機能が使いやすくないのでElectronの機運が高まってきた。

出戻ったワイワイ

Github Pagesで書いてたけど思い立ってはてなブログに戻した。 インポートスクリプト書いたものの、記事数多くないしMarkdownだし手でコピった方が早かったんじゃという気がしてきた。

ReactiveCocoa Tokyo

先週になりますが、「ReactiveCocoa Tokyoというイベントがあり、そこでfreee社での導入の経緯やMVVMでのReactiveCocoaの使い方について話してきました。

ReactiveCocoaは役割上ロックインされがちで、そこをなるべくゆるやかに導入していくにはというのが ninjinkunさんの発表に対して、ロックインされると各レイヤに統一感出ていいよと、対比ぽい感じができたのでよかったです。

ReactiveCocoaの魅力は、MVVMのコンポーネント間のインターフェースを統一できること、またアプリ固有の非同期処理や入力処理を統一的なインターフェースでラップできるフレームワークとして使えることです。 自分が知る限りでは上記のことをやるならReactiveCocoaが一番よくできていてまた開発も活発だと思います。

@ikesyoさんに懇親会で聞いた限りだと、Swiftブランチは実運用にはもうちょっと時間がかかりそうだなという印象です。でも粛々と開発は進んでいるようなので期待。

終わった後、同日開催のiOS/Swift勉強会@ヤフーをピザとビール片手にみんなで眺めたというのもちょっと新鮮で楽しかった。 会場の迷惑にならないので思う存分ワイワイできるw

freee社で50人規模の勉強会を開催するのは初めてだったのですが、当日欠席する人も思ったより少なくてよかった。これをきっかけにReactiveCocoaの導入事例が増えるといいなあ。

大阪から駆けつけてくれた @ikesyoさん、主催の @ninjinkunさん、社内でいろいろ調整してくれた @yonekawaさん、トップバッターで話してくれた @tinpayさん、LT発表者の皆様ありがとうございました!

f:id:yo_waka:20141112031225j:plain

f:id:yo_waka:20141112031242j:plain

@ymrl 写真拝借しました。当日はありがとうございました。

volley(サブプロジェクト)のbuildToolsVersionをafterEvaluateで上書く

Android StudioがBetaになったので、0.8.2に上げようとしたらモジュールのビルドでハマった。

Android Studioのバージョンを上げるときは、build.gradleを弄る時でもある。 Betaに上げるからには最新版のGradleプラグインAndroid SDKコンパイル&ビルドできるようにしたい。

// project/gradle/gradle-wrapper.properties
distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip

// project/build.gradle
buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.12.+'
  }
}

// project/app/build.gradle
android {
  compileSdkVersion 20
  buildToolsVersion '20.0.0'
}

しかしビルドエラー。
ルートプロジェクトのGradleプラグインのバージョンを0.12に上げると、buildToolsVersionが"19.1"以上でないとビルドできない。
僕の環境ではvolleyをモジュール(submodule)として組み込んでいて、compileSdkVersionとbuildToolsVersionがこのように指定されている。

// modules/volley/build.gradle
android {
  compileSdkVersion 19
  buildToolsVersion = 19
}

volleyのソースを見る限りbuildToolsVersionを20に上げても特に問題なさそうなので、何とかしてビルドが実行される前にandroid()の中身を上書きしたい。
と思って、Gradle User Guideを眺めていたら、Project.afterEvaluate()というものを見つけた。 Project.afterEvaluate()は、そのプロジェクトのビルドスクリプトが評価された後に実行されるらしい。まさにやりたいことと一致!

Gradleで分からないことがあれば、Gradle User Guideを見るのがオススメ。 Gradleのバージョンごとに用意されているので、使っているものに合わせて見るとよさげ(ちょくちょく変わったりするので)。

subprojects { subproject ->
  afterEvaluate {
    if (subproject.plugins.hasPlugin('android-library')) {
      android {
        compileSdkVersion 20
        buildToolsVersion '20.0.0'
      }
    }
  }
}

これで、モジュールとして組み込んでいるライブラリプロジェクト全てのcompileSdkVersionとbuildToolsVersionをアプリのそれと合わせることができる。
もし特定のプロジェクトだけどうしても"19.1"でビルドしたければ、プロジェクトごとに指定すればおk。

project(':modules:volley') {
  afterEvaluate {
    android {
      compileSdkVersion 20
      buildToolsVersion '19.1'
    }
  }
}

Android meets RxJava

少し、いやかなり前に渋谷Javaで「Android meets RxJava」というタイトルでLTしてきました。 スライド上げるのが遅くなってすいません。。。

freeeのAndroidアプリの開発前にチーム内で考えていたのが、テストの書きやすさを考慮するとどうしてもFragmentとAPIのやりとり含むビジネスロジックを切り分けたいというところで、 ViewController/ViewModel/Modelを上手く疎に分けられる仕組みが必要でした。

先行して開発していたiPhone版では、ReactiveCocoaを導入して上手くいったこともあり、FRPが出来るJavaのいいライブラリはないか探していたところ、上手くマッチしそうだったのがRxJavaでした。
RxJavaのObservable、Subscriber、Func/Actionを使うことで、API呼び出し/モデルへの変換/画面への表示を上手く切り分けることが可能になります。 また、ViewModelのプロパティをFragmentからバインディングすることにより、データの状態をFragment側で管理する必要がなくなります。

Fragment側でデータの状態を持ってしまうと、いざそのテストを書く際にUIが必要になるので非常にめんどくさい。ViewModelまでで完結できればユニットテストだけでOK。 とはいえ、スライドにも書いてますが、ビジネスロジックがそこまで複雑でなければEventBusなどでやり取りするのもアリだと思います。

こういうFRPなライブラリをクライアントアプリで使うと、コアな部分で使うためどうしてもロックインを防げないのがデメリットです。 Reactive Streamsによる標準化に期待。