2014年11月29日土曜日

[Android] アプリのメソッド数を知るには

dex-method-countsというツールを使うと、APK内に含まれるメソッド数をパッケージ毎に知ることができる。

レポジトリをクローンしてきたらまずはツールのビルド。

./gradlew assemble

ビルドしたら、レポジトリのディレクトリで下記のコマンドを実行すると、指定のAPKのメソッド数をカウントしてくれる。

./dex-method-counts path/to/app.apk

アウトプットはこんな感じ

Read in 49877 method IDs.
<root>: 49877
    : 8
    android: 8768
        accessibilityservice: 6
        accounts: 4
        animation: 2
        app: 308
        bluetooth: 2
        content: 260
            pm: 24
            res: 51
            ...
        support: 6302
            annotation: 3
            v4: 6299
                accessibilityservice: 41
                app: 1371
        ...
    butterknife: 161
        internal: 89
    com: 30662
        bumptech: 2113
            glide: 2113
                ...
        google: 22969
            ...
Overall method count: 49877

ご覧のように、パッケージごとに細かくメソッド数を算出してくれる。

下記のようなエラー(いわゆる65K問題)が出てしまった時、削るライブラリの候補を考えるのに便利。

trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.

2014年11月13日木曜日

Nexus 5にAndroid 5.0(Lollipop)のFactory Imageを焼く

11/13についにAndroid 5.0のNexusu端末向けFactory Imageが公開されました。
Nexus4など一部端末は遅れるようですが、楽しみですね

前提条件

  • adbfastbootがコマンドラインから使えること
  • 端末内の必要なデータはバックアップしてあること

手順

  1. Factory Imageをダウンロード、解凍する

  2. Factory Imageを回答したディレクトリ内にターミナルで移動する

  3. bootloaderに再起動する。

    adb reboot bootloader
  4. bootloaderをアンロックします。

    fastboot oem unlock

    端末上で音量ボタンで"Yes"を選択し、電源ボタンでOKしてください。
    ※これを実行しないとFactory Imageを焼けませんが、保証がなくなるので充分注意してください。
    当方では一切責任を負いません。
    ※実行すると端末内のデータがすべて消えます。予めバックアップをとっておいてください。

  5. 予め用意されている、必要なデータをすべて焼くスクリプトを実行します。

    sh flash-all.sh

以上で手順は終わりです。 作業が終わったら端末が自動的に再起動します。

※"missing system.img"ダイアログが表示される場合

稀に"missing system.img"と出てうまくFactory Imageが焼けない事があるようです。
そんな場合は、下記の手順で進めるとうまくいくようです。

  1. image-hammerhead-lrx21o.zipを解凍する
  2. bootloaderを焼く

    fastboot flash bootloader <bootloaderファイル名>
  3. radioを焼く

    fastboot flash radio <radioファイル名>
  4. 一度bootloaderを再起動する

    fastboot reboot-bootloader
  5. 残りのファイルを焼く(image-hammerhead-lrx21o.zip内のファイル)

    fastboot flash recovery recovery.img
    fastboot flash boot boot.img
    fastboot flash system system.img
    fastboot flash cache cache.img
    fastboot flash userdata userdata.img
  6. 再起動する

    fastboot reboot

こちらからは以上です。 よいLollipopライフを!

参考:

2014年11月6日木曜日

GooglePlayストアで英語圏のレビューを見る方法(ブラウザ限定)

アドレスバーのURL末尾に下記内容を追記する。

&hl=en

hl=xxがすでにURLについている場合は置き換えてください。

hlhost languageの略です。enは英語。
このあたりに他の言語コードも書いてあるので、置き換えてみると他の言語のレビューも閲覧できます。

日本ではマイナーなアプリの評判を見るときに重宝します。

2014年9月9日火曜日

[Android] ActionBarPullToRefreshがうまく動かない時にやるべきたった一つのこと

ActionBar-PullToRefreshはAndroidでいわゆるpull-to-refreshな画面を実装するときによく使われるライブラリですが、いつの間にかDeprecatedになっていたようです。

README.mdを見ると、

PLEASE NOTE, THIS PROJECT IS NO LONGER BEING MAINTAINED

と思いっきり書いてあるのですが、すっかり見落としてました。

じゃあ代わりに何使えばいいのよ、ということで色々探してみたのですが、Commitをさかのぼってたら見つけました

dostiharise commented on 94da7fc on 5 May
Why is the project being abandoned? Is there a better version?

asfdfdfd commented on 94da7fc on 15 May
That's why: https://twitter.com/chrisbanes/status/460799199941230593

dostiharise commented on 94da7fc on 27 Jun
Ah, thanks! @asfdfdfd :+1:

で、貼り付けられてるtweetを見ると

SwipeRefreshLayoutの方がイケてるからそっち使ってね、ということらしいです。

ちゃんとREADMEに書いておいてほしいところですが、Googleの提供するSupport Libraryでまかなえるようになったのはうれしいですね。

2014年8月26日火曜日

Pebbleを一年間使ってきた私がLG G Watchを使ってみて思ったこと

2013/5/19から約1年3ヶ月ほどPebbleを使ってたけど、この度ちょっと魔が差してLG G Watchを購入した。
一週間ほど使ってみて、Pebbleとくらべて感じたことをまとめておく。

Pebbleのよい点

- 文字盤(画面)が見やすい

Pebbleはe-paper displayなので、白黒ではあるけれども、外でも画面が確認しやすい。

- 電池持ちがよい

Pebbleは毎日使っても約一週間電池が持つ。

- シェイクして通知を削除、が気持ちいい。

これはPebbleというよりもYaNCというPebbleの拡張アプリの機能だけど、腕を振ることでPebbleに来た通知を消去できる。Pebble本体を触ることなく確認した通知を消せるので、慣れると非常に楽。

- 入力方法の制限

Pebbleにはボタンが4つしかついてないので、入力デバイスとしてできることは非常に限られてしまっている。
ただ、ボタンが4つしかないからこそ使い方に迷うことは少ないし、シンプルにまとまっていると思う。

Pebbleのちょっと足りない点

- 日本語表示に対応していない。

日本語というか、アルファベット以外は表示できない。
Pebble単体で使おうとするとGmailや電話の通知はすべて内容が白い四角になってしまう。(Unicodeもサポートするよ!って公式は言ってるけどいつになるのやら…)
ただし、前に述べたYaNCというアプリを使うと日本語も表示できる。

G Watch(Android Wear)のよい点

- 日本語が標準機能で表示できる

起動してすぐ、特に複雑な設定もなく日本語を使えるのはありがたい。

- フルカラーで見た目キレイ。

キレイ。日光の下でもちゃんと見れるとなおよかった。

- Google Now/Androidとの連携

やはりGoogle謹製なだけあってGoogle Nowのカードがそのまま見れたりするのはとても便利。

- 入力方法が多彩。

タッチパネルなのでまあ、スマートフォンと同じような操作ができる。サードパーティ製のAndroid Wear用キーボードアプリもあるし。使いやすいかどうかは別として。
あと、時計に話しかけてメモ作成とかメッセージ送信とか未来を感じるよね。ナイトライダーとかスーパージェッターとか。

- 拡張性の高さ

PebbleもSDK提供されててサードパーティ製アプリたくさんあったけど、スペック的にもAndroid Wearの方が色々できそうで高まる。何つくろうかな。

G Watch(Android Wear)のちょっと足りない点

- 日光の下で文字盤(画面)が見づらい。

というか見えない。手で覆ってあげればなんとか見えるかなー、っていうレベル。
これは時計としてはかなり致命的なのでは…

- 電池が持たない

一日ちょっと使うともう電池がなくなってしまう。
一週間充電しなくても大丈夫なPebbleに慣れてしまっているとちょっと不満。
スマートフォンと一緒に充電するようにしてしまえばいいんだけれども、専用のクレードルが必要なので充電をうっかり忘れてしまうと致命的。
そうか、書いてて気づいたけど旅行に行くときはクレードル持ち歩かなきゃなのか…

- たまに時刻の更新が遅れる

バッテリーの消費対策のためなのか、待機モードの時に時刻が更新されないことがあるみたい。時刻を確認→20秒もたたないうちにもう一度確認したら2分進んでる、とか。駅に向かってる途中にこれやられると脱力するよね。

まとめ

時計+スマートフォンに来た通知の確認、という程度の用途だとまだPebbleの方に軍配が上がる。
G Watchだと日光の下で時刻の確認すら満足にできないし、稼働時間もまだまだ心許ない。
ただ、音声入力とか「子どもの頃に夢見た未来デバイス」という感じでテンションは上がる(現状テンション上がるだけなのが…うん…) 。
まあまだ人柱感の強いデバイスではあるし、今後の発展に期待、という感じでした。

2014年5月6日火曜日

超チューニング祭に参加してきた

2014/04/26(土) - 04/27(日)に開催されたニコニコ超会議3の、超チューニング祭に参加してきました。

SP版ニコニコ動画のトップページをチョッパヤにしてくれ、という課題に友人と二人で二日間かけて取り組んできました。

特に賞には引っかからなかったのですが、せっかく参加したので今回行った高速化の施策を軽く紹介しようと思います。

  1. jQueryからZepto.jsに変更
  2. JavaScriptの結合・圧縮
  3. 画像をCSSスプライトにまとめる
  4. 画像を減色
  5. HTMLの書き直しと圧縮
  6. CSSの書き直しと圧縮
  7. ファーストビューより下の画像を遅延読み込み

1. jQueryからZepto.jsに変更

共通ライブラリとして読み込まれていたjQueryをZepto.jsに変更しました。
これだけで、68KBくらい削減できます

2. JavaScriptの結合・圧縮

トップページだけで10個ものJavaScriptファイルが読み込まれていたので、uglify.jsを利用して1ファイルに結合・圧縮してしまいました。
また、アカウント設定なしでGoogle Analyticsのurchin.jsが読み込まれていたので削除してしまいました(なお本番のトップページでもアカウント設定なしで読み込まれている模様)。そもそもurchin.jsとかかなり古いコードなのでやめてほしいですね…

3. 画像をCSSスプライトにまとめる

サムネイルとか動的に切り替わる画像以外はCSSスプライトにまとめると、リクエスト数が減っていい感じです。
画像のスプライト化には自作のGruntタスクであるgrunt-spritesheet-generatorを利用しました。

4. 画像を減色

imageoptimとimagealphaを使って画像を減色します。特にpng画像はimagealphaを使うことで60-70%ほどサイズを削減できます。

5. HTMLの書き直しと圧縮

UIの改善のための書き直しと併せて、タグのネストを浅くしたりしました。
その上でgrunt-contrib-htmlminを使いコメントや改行コード、不要なスペースを削除しました。

6. CSSの書き直しと圧縮

grunt-cssoを使ってcssの圧縮をしました。cssoを利用すると、コメントや空行の削除だけでなくcssの構造的な最適化まですることができます。
また、SASSに書き直して利便性を上げるとともに未使用のCSSプロパティを消しています。

7. ファーストビューより下の画像を遅延読み込み

CSSスプライトにまとめられない画像(バナーや動画のサムネイルなど)は、ユーザーのスクロールに合わせて遅延読み込みされるようにしています。こうするとファーストビューより下の画像のリクエストを遅らせることができます。表示領域に入らなかった画像はリクエストされることもありません。この機能の実装にはlazyloadというライブラリを使っています。


以上です。

js/css/画像をすべてインラインで書いてしまいリクエストを一つにする、とか思いもよらない(でも言われてみれば合理的)な施策があったり、なかなか勉強になりました。(個人的には画像をローカルストレージにキャッシュするのが面白かったです)

他の人と同じ課題をもらって実装を競うとかしたことのない経験だったのでなかなか面白かったです。
次こんな機会があったらLTもしてみたいですね。

※一応実際のコードもおいておきます

参考(他の参加者の記事):
- 本の虫: 超会議3の超チューニング祭の感想
- レポート - 超チューニング祭で努力賞(最速賞)をとるためにやったこと - Qiita
- ニコ動 超チューニング祭で最優秀賞もらいました
- 超チューニング祭に参加した - masarakki's blog
- JavaScript - 超チューニング祭に参加&表彰した - Qiita
- kmizu/slide_cho_tuning
- 超会議の偏った感想 - mizchi's blog

2014年4月25日金曜日

Homebrewで入れたNode.jsのnpmが更新できない時にすべきたった一つのこと

一度Node.jsをアンインストールして、再インストールしましょう。

HomebrewからインストールしたNode.jsのnpmを npm update で更新しようとすると、下記のようなエラーが出る事があります。

npm ERR! error rolling back Error: Refusing to delete: /usr/local/bin/npm not in /usr/local/lib/node_modules/npm
npm ERR! error rolling back     at clobberFail (/usr/local/Cellar/node/0.10.15/lib/node_modules/npm/lib/utils/gently-rm.js:41:12)
npm ERR! error rolling back     at next (/usr/local/Cellar/node/0.10.15/lib/node_modules/npm/lib/utils/gently-rm.js:27:14)
npm ERR! error rolling back     at /usr/local/Cellar/node/0.10.15/lib/node_modules/npm/lib/utils/gently-rm.js:36:12
npm ERR! error rolling back     at Object.oncomplete (fs.js:107:15)
npm ERR! error rolling back  npm@1.3.7 { [Error: Refusing to delete: /usr/local/bin/npm not in /usr/local/lib/node_modules/npm] code: 'EEXIST', path: '/usr/local/bin/npm' }
npm ERR! Refusing to delete: /usr/local/bin/npm not in /usr/local/lib/node_modules/npm
File exists: /usr/local/bin/npm
Move it away, and try again.

参考: Error: Refusing to delete: /usr/local/bin/npm #3794

これ、8ヶ月くらい前(2014/04現在)からずっと問題になっていたんですが、3週間ほど前に解決したようです。

参考: node: install npm using tarball. #28075

解決方法は簡単。HomebrewからインストールしたNode.jsを一旦削除して、再インストールするだけ。

brew uninstall node
brew install node

これでnpmが npm update で更新できるようになります。

2013年12月25日水曜日

[FreeMarker] ftl名前空間のすゝめ

つい最近知ったのですが、ftlにも名前空間があります。
例えば、ある画面にマクロを定義しているFTLを複数読み込む時、そのFTL毎に名前空間を分ける、ということができます。

名前空間の使い方

これの何がいいかというと、名前空間を分けると各FTLで定義した変数名やマクロ名が衝突しなくなります。
library-a.ftlfoo というマクロを定義し、 library-b.ftl でも同名のマクロを定義し、この2つのFTLを同じ画面で読み込み、それぞれのマクロを同時に、別のマクロとして使うことができるようになります。

<#-- library-a.ftl -->
<#macro copyright date>  
    <p>Copyright © $(date) John Smith. All rights reserved.</p>
</#macro>  

<#assign mail = "jsmith@acme.com">

上記のライブラリFTLを lib/library-a.ftl とします。
そして、このライブラリFTLを top.ftl で利用します。

<#inclde "/lib/library-a.ftl">

このように書くと、 copyright マクロと mail 変数がグローバルな名前空間に定義されてしまいます。
これだと、仮に top.ftl ですでに copyright という名前のマクロや mail という変数を定義していると、名前が衝突してエラーになってしまいます。(変数は同じものとして扱われます)

これだと、再利用可能なコードとは言えません。
そこで、 import という、別の構文を使ってライブラリFTLを読み込みます。

<#-- top.ftl -->
<#import "/lib/library-a.ftl" as libA>
<@libA.copyright date="2012-2013"/>
${libA.mail}

<#-- 出力内容
<p>Copyright © 2012-2013 John Smith. All rights reserved.</p>
jsmith@acme.com
-->

import を使ってライブラリFTLを読み込むと、新しい名前空間が作成されます。
この新しい名前空間からは、ライブラリFTL内で定義された変数か、グローバルで定義された変数か、データモデルの変数(Javaのアクションクラスから渡された変数)しか見ることができません。

この新しい名前空間にある2つの変数(マクロ)に top.ftl からアクセスするには、 import 構文で as の後ろに指定された名前を使います。この場合、上のコードで示したように、 libA.copyright, libA.mail という形で library-a.ftl で定義された変数やマクロにアクセスできます。

このように import 構文を使ってFTLを読み込むと、たとえ top.ftl で同名の変数やマクロが定義されていたとしても衝突してエラーにはなりません。

別の名前空間内の変数を編集する

<#-- top.ftl -->
<#import "/lib/library-a.ftl" as libA>
${libA.mail}
<#assign mail="jsmith@other.com" in libA>
${libA.mail}

<#-- 出力内容
jsmith@acme.com
jsmith@other.com
-->

データモデルと名前空間

データモデルの変数はどこからでも参照できます。
例えば user という名前の変数がデータモデルにあった場合、lib/library-a.ftl はこの user 変数にアクセスできます。

<#-- library-a.ftl -->
<#macro copyright date>  
    <p>Copyright © $(date) ${user}. All rights reserved.</p>
</#macro>  

<#assign mail = "${user}@acme.com">

user が"Fred"だった場合、下記のようになります。

<#import "/lib/library-a.ftl" as libA>
<@libA.copyright date="2012-2013"/>
${libA.mail}

<#-- 出力内容
<p>Copyright © 2012-2013 Fred. All rights reserved.</p>
Fred@acme.com
-->

ただし、名前空間内でデータモデルと同名の変数が宣言されていた場合、後者が勝ちます。

名前空間のライフサイクル

同じFTLを別名で複数回 import で読み込んだ場合、名前空間は最初の読み込みに対してのみ作られ、以後の読み込みは同一の名前空間に対する別名となります。

<#import "/lib/library-a.ftl" as libA>
<#import "/lib/library-a.ftl" as foo>
<#import "/lib/library-a.ftl" as bar>
${libA.mail}, ${foo.mail}, ${bar.mail}
<#assign mail="jsmith@other.com" in my>
${libA.mail}, ${foo.mail}, ${bar.mail}

<#-- 出力内容
jsmith@acme.com, jsmith@acme.com, jsmith@acme.com,
jsmith@other.com, jsmith@other.com, jsmith@other.com,
-->

グローバル変数とローカル変数

FTLにもグローバル変数とローカル変数があります。

assign(ローカル変数)

<#assign foo="bar">

変数の定義や置き換えができます。
特定の名前空間内に変数を作成したり、置き換えることもできます。
(<#assign someValue = "foo" in someNamespace>)

assign を利用して宣言された変数は、名前空間が変わると参照できません。

global(グローバル変数)

<#global foo="bar">

global を使って定義された変数は、すべての名前空間で参照できます。 しかし、個々の名前空間内で同名の変数が定義されていると、その名前空間からはグローバル変数の方にはアクセスできません。
ただし、その場合でも globals という特別な変数を介してアクセスすることはできます。

${.globals.foo}

globals を介してグローバル変数にアクセスできるだけでなく、データモデルの変数にもアクセスすることができます。

local(ローカル変数)

<#local foo="bar">

local 構文はマクロや関数の中でのみ使用することができます マクロ/関数内で local を利用して作られた変数は、そのマクロ/関数外からは参照できません。

つまりどうしたらいい?

  • ライブラリFTLを読み込むときは import で読み込む
  • マクロから参照したい変数が親FTLにある場合、 global を使って宣言する
  • マクロや関数内では、特に意図した場合でない限り local を使って変数宣言する

参考

FreeMarker Manual - Namespaces
FreeMarker Manual - local
FreeMarker Manual - assign
FreeMarker Manual - global

2013年12月5日木曜日

HomebrewからSubversion 1.7をインストールする

普通に brew install subversion してしまうと1.8がインストールされてしまうので、下記のようにする。

brew tap hombrew/versions
brew info subversion17
brew install subversion17

これでSubversion 1.7がインストールされる。

2013年11月19日火曜日

[Android]動的にリソースを取得する

ステータスバーにバッテリー残量を表示させようとして詰まったのでメモ。
動的にリソースを変更したい時はこうすると捗る。

getResources().getIdentifier(resourceName, resourceType, getPackageName());

上記コードでリソースのIDが取得できる。
resourceNameにはリソースの名前を、
resourceTypeにはリソースのタイプ(string, id, drawable…)を
指定する。

ちなみに、

getResources().getIdentifier("@drawable/ic_launcher", null, getPackageName());

みたいにリソース名にタイプを含めちゃっても取得できる。

[Android]特定のPreferenceに依存するPreferenceをつくる

特定のスイッチがオンの時に有効になって、オフの時には使えないスイッチを作る方法です。
ガリガリコード書かなきゃいけないのかと思ったら、xmlの設定だけでいけました。

<SwitchPreference
    android:key="pref1"
    android:title="pref1_title"
    android:switchTextOff="OFF"
    android:switchTextOn="ON"
    android:defaultValue="true"/>

<SwitchPreference
    android:key="pref2"
    android:title="pref2_title"
    android:switchTextOff="OFF"
    android:switchTextOn="ON"
    android:defaultValue="true"
    android:dependency="pref2"/>

android:dependency="foo" と指定すると、指定されたkeyを持つPreferenceの状態に依存するPreferenceが作れます。

2013年10月3日木曜日

Chrome 30で「新しいタブ」を従来のものに戻す方法

最近のChromeのアップデートで「新しいタブ」のデザインが刷新された。 タブの真ん中に検索ボックスを配置するのは明らかに初心者を意識した変更だけど、オムニボックスから検索が可能なことがわかっていれば改悪である。

なによりも、右下の「最近閉じたタブ」がなくなってしまったのが非常に不便でならない。

というわけで、もとの「新しいタブ」に戻してみた。 やり方は簡単。

  1. オムニボックスから chrome:flags にアクセス

  2. 「Instant Extended API を有効にする」オプションを「無効」にする

以上。 これで見慣れた「新しいタブ」に戻った。

2013年9月4日水曜日

tmuxinatorで思うように画面分割できないときにやるべきたった一つのこと

例によってタイトルは釣り。

最近tmuxを使い始めて、ついでにtmuxinatorも入れてみました。
iTermを起動したらすぐに作業が開始できていい感じです。
ただ、標準のレイアウトではうまく画面分割できなかったのでこんな感じで設定してみました。

1. tmuxを起動し、手動で画面を分割する

C-b %C-b " を活用して画面を任意のレイアウトに分割します。

2. 分割の設定を取得

tmux list-windows を実行すると下記のように表示され、画面分割の細かい設定が取得できます

    tmux list-windows
    0: zsh* (3 panes) [364x84] [layout 4e2c,364x84,0,0{182x84,0,0,5,181x84,183,0[181x42,183,0,6,181x41,183,43,7]}] @2 (active)

3. 分割の設定をtmuxinatorの設定ファイルに転記する

上記コマンドで取得したレイアウト情報を転記します。
必要なのは layout より後ろの部分です。

    # .tmuxinator/foo.yml

    windows:
        - editor: 
            layout: 4e2c,364x84,0,0{182x84,0,0,5,181x84,183,0[181x42,183,0,6,181x41,183,43,7]}
            panes:
                - ls
                - cd workspace
                - # empty pane

以上、こんな感じで幸せになれました。

2013年8月26日月曜日

zshでgitの補完機能を使う

zshでgitのブランチ名等を補完できるようにします。
homebrewからzshとgitをインストールしてる前提です。

homebrewからgitをインストールしてると、一緒に git-completion.zsh がインストールされるので、これを使います。

1. .zshrcに設定追加

以下の内容を追加します。既存の内容と重複する場合は適宜調整してください。

fpath=($(brew --prefix)/share/zsh/site-functions $fpath)

autoload -U compinit
compinit -u

2. zcompdumpの再構築

以下のコマンドを実行します。

rm -f ~/.zcompdump; compinit

実行後に source ~/.zshrc するかzsh再起動すればブランチ名が補完されるようになってます。
以上。

2013年8月23日金曜日

rbenvとruby-buildでrubyを使う

  1. opensslとreadlineをインストール

    brew install openssl readline
  2. homebrewからインストールしたopensslとreadlineを使用するためにリンク

    brew link readline --force
    brew link openssl --force
  3. rubyのインストール

rbenv install -l でインストール可能なrubyが一覧できる。今回は2.0.0-p247をインストールする。

    CONFIGURE_OPTS="--with-readline-dir=/usr/local --with-openssl-dir=/usr/local" rbenv install 2.0.0-p247
  1. opensslとreadlineのリンク解除

brew doctor で警告が出るためリンク解除しておく

    brew unlink openssl
    brew unlink readline
  1. インストール済みrubyの確認

    rbenv versions
     *system (set by /Users/foo/.rbenv/version)
      2.0.0-p247
  2. デフォルトで使用するrubyの設定

    rbenv global 2.0.0-p247
  3. 特定のディレクトリ内で利用する

    cd foo
    rbenv local 2.0.0-p247

2013年8月21日水曜日

Macにrbenvをインストール

Chef/Vagrantをやってみたくなったのでruby環境を作る。
Macのrubyはバージョンが古いので新しいのを使えるようにしなきゃならない。

そこで出てくるのがrubyのバージョン管理ツール。
rvmにしようかrbenvにしようか迷ったけど、結局rbenvにしてみた。
理由はHomebrewから導入できるから。

手順

  1. rbenvとruby-buildをインストールする

    brew install rbenv ruby-build
    echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.zshrc

これだけ!
簡単でした。

2013年7月16日火曜日

jsrender 1.0preから1.0betaにバージョンアップした時に躓いたところ

javascriptテンプレートエンジンの一つであるJsRender
今日久しぶりにレポジトリを確認したら1.0betaにバージョンアップしてました。
今まで使っていたのが1.0pre。ただ jsrender.js を更新するだけでは使えず、コード側にもちょっと更新作業が必要でした。

ヘルパー

1.0preでは jsviews.helpers がヘルパー登録用メソッドだったのですが、1.0betaでは jsviews.views.helpers に移動しています。

// 1.0pre ----------
jsviews.helpers({
  fooHelper: function() {},
  barHelper: function() {}
});

// 1.0beta ----------
jsviews.views.helpers({
  fooHelper: function() {},
  barHelper: function() {}
});

カスタムタグ

1.0preではヘルパーと同様に登録用メソッドが jsviews.tags から jsviews.views.tags に移動しています。
また、1.0preではカスタムタグの描画メソッドも this.renderContent から this.tagCtx.render に変わっています。

// 1.0pre ----------
jsviews.tags({
  fooTag: function(param) {
    var ret = '';
    // カスタムタグのロジック…

    ret = this.renderContent(param);

    return ret;
  },
  barTag: functioN() {}
});

// 1.0beta ----------
jsviews.views.tags({
  fooTag: function(param) {
    var ret = '';    
    // カスタムタグのロジック…

    ret = this.tagCtx.render(param);

    return ret;
  },
  barTag: function() {}
});

とりあえず現時点で対応したのは上記の点のみ。
別件ですがjsrender.min.jsにバージョン番号つけてほしい…(jsrender-1.0beta.min.jsみたいに)

2013年6月4日火曜日

Nexus 4を買って真っ先にしたこと(root化とか色々)

Nexus4買いました。

最初は日本のGoogle Play Storeから発売されるの待ってたんですが、日本のストアから製品情報が削除されたという話を見て、ついAmazonで購入。

以下に開封してからの2時間弱くらいでやった作業をまとめておきます。
ちなみにキャリアはドコモです。作業PCはMacbook Air。

今使ってる端末のデータのバックアップ

使っていた端末はCyanogenMod 10.1を入れたGalaxy Nexus。
Nexus4に引き継ぎたいデータだけに絞ってTitanium Backupでバックアップ -> PCに保存
主にゲームのセーブデータ系ですね。
アプリ全部のバックアップはとくにしませんでした。
最近はGoogleアカウントとひもづけると、前の端末で使ってたアプリを自動でダウンロードしてくれるので。

bootloaderのアンロック

adbやfastbootはPCに入っている前提。
検証してないけど最近はandroid sdk入れたらfastbootコマンドも入ってるんですかね。
sdk managerから最新版ダウンロードしたらfastbootコマンドも入ってたような気がする。

  1. PCにつないで下記のコマンドを実行し、bootloaderに再起動

    adb reboot bootloader
  2. ドロイドくんが分解されてる画面になったら、以下のコマンドを実行

    fastboot oem unlock
  3. ボリュームボタン上下で Yes を選択、電源ボタンで決定。

これでbootloaderのアンロックは完了

ClockworkMod Recoveryの導入

  1. ClockworkModの公式サイトから、Nexus4用のリカバリイメージをダウンロード。
  2. 適当なフォルダに入れて recovery.img にリネームする。
  3. ターミナルを開き、 recovery.img をダウンロードしたフォルダに移動し、下記のコマンドを実行

    adb reboot bootloader
    fastboot flash recovery recovery.img

以上でClockworkMod Recoveryの導入は完了。
bootloaderのメニューで Recovery Mode を選ぶとClockworkMod Recoveryが起動するようになっている。

root取得

  1. このリンクから SU_Busybox_Package.zip をダウンロードする(参考)。
  2. ダウンロードしたzipファイルをNexus4の内部ストレージの直下に配置する。
  3. 下記のコマンドを実行してリカバリにモードに入る。

    adb reboot bootloader
  4. Recovery Mode を選択しリカバリを起動。
  5. ボリュームボタン上下を使い install zip from sdcard を選択、電源ボタンで決定し今度は Choose zip from sdcard を選ぶ。
  6. 内部ストレージ直下に配置した SU_Busybox_Package.zip を選択し、電源ボタンを押す。
  7. 処理が終わったら reboot system now を選択して再起動。
  8. アプリの一覧にSuper SUがあればroot化完了。

CyanogenMod 10.1の導入

  1. Google PlayからROM Managerをダウンロード
  2. ROM ManagerからCyanogenModとGoogle Appsをダウンロード
  3. ダウンロード完了したらそのままインストラクションにしたがってリカバリに再起動 -> インストール完了

APNの設定

moperaの場合は下記の2つを追加。
CyanogenModなら最初から入ってる気がする。

  • mopera.net
  • open.mopera.net

ボイスメールの番号設定

留守電の設定です。
電話アプリの設定から「ボイスメール」 -> 「セットアップ」 -> 「ボイスメールの番号」と選択。 番号は「1417」を入力

バックアップしたデータの復元

最初にバックアップを取ったアプリのデータをTitanium Backupで復元する


以上、こんな感じ。