When an autopopup completion is active, `⌃↓` and `⌃↑` will close it and move the caret down or up in the editor.

f:id:tomorrowkey:20191115135413p:plain

When an autopopup completion is active, ⌃↓ and ⌃↑ will close it and move the caret down or up in the editor.

コード補完が表示されているときに、 では、コード補完の候補を移動しますが、⌃↓⌃↑ を使うことで、エディタでのキャレット移動が可能です。

A tip of Android Studio for the day. Android Studio allows you to search through the classes, files, tool windows, actions, settings, and symbols of your project by double pressing the `Shift` key.

f:id:tomorrowkey:20191114175302p:plain

Android Studio allows you to search through the classes, files, tool windows, actions, settings, and symbols of your project by double pressing the Shift key.

Android StudioShift キーを2回押すことで、プロジェクト内のクラス、ファイル、ツールウインドウ、アクション、設定、シンボルを横断して検索することができます。

A tip of Android Studio for the day. When using basic code completion (⌃Space), you don't need to type upper-case letters in CamelHump names.

f:id:tomorrowkey:20191011131136p:plain

When using basic code completion (⌃Space), you don't need to type upper-case letters in CamelHump names. It is enough to type the initial letters of the camel names in lower case, and they will be smartly recognized.

通常のコード補完(⌃Space)を使っている場合、大文字小文字を気にする必要はなくありません。またキャメルケースの頭文字だけをタイプすることで補完することもできます。

例えば sdf と打てば SimpleDateFormat が補完されます。

A tip of Android Studio for the day. If you need more workspace, you can hide the tool windows bars: click in the lower left corner.

f:id:tomorrowkey:20191009145043p:plain

If you need more workspace, you can hide the tool windows bars: click in the lower left corner. If necessary, you can show the tool window buttons just for a moment. To do that, press the key Alt (for Windows/*nix) or Command (for Mac) twice and keep it down. While the key is pressed, the tool window buttons are visible.

ツールウインドウのボタンを左下のボタンで非表示できます。

f:id:tomorrowkey:20191009145648p:plain

こんな感じで非表示にすることができます。

f:id:tomorrowkey:20191009145836g:plain

非表示になっているときに、このボタンを表示したければ、 Alt (Windows/Linux), Command (macOS)を2回押し2回目の打鍵を押し続ける間表示されつづけます。

A tip of Android Studio for the day. To compare two directories, select one or both of them in the Project view and press ⌘D.

f:id:tomorrowkey:20191008130804p:plain

To compare two directories, select one or both of them in the Project view and press ⌘D.

プロジェクトビューで2つのディレクトリを選択した状態で ⌘D を押すと、それらを比較することができます。

f:id:tomorrowkey:20191008130652p:plain

こんな感じ

A tip of Android Studio for the day. You can easily open an external file for editing, if you just drag it from the Explorer or Finder to the editor.

f:id:tomorrowkey:20191007114352p:plain

You can easily open an external file for editing, if you just drag it from the Explorer or Finder to the editor.

Android Studioで開いているプロジェクト外のファイルでも、エクスプローラやフィンダーからドラッグアンドドロップすれば、編集することができます。

Charlesを快適に使うためにやっていること

Charles Web Debugging Proxy とても便利ですよね。

今でこそ、StethoFlipper などの、Androidアプリ側に仕込むライブラリでも事足りるようにもなってきましたが、通信内容の改ざんや特定のリクエストのみ他のサーバに転送したりなど、多岐にわたる機能がとても便利なため、どうしてもこれらのライブラリでは手が届かないところは、Charlesを使い続けています。

そもそも Charles って何なの?どう使うの?といった内容のブログは山程あるので、そういった方はそちらを見ていただくとして、私が紹介したいのは、Charlesをよりストレスフリーに使うためのテクニックをご紹介したいと思います。mitmproxy など、他のプロキシツールでも使えるテクニックです。

Charlesを使いながら面倒だなあと思うこと

Charlesを日常で使っていて面倒なことといえば、プロキシの設定じゃないでしょうか。AndroidWiFiのプロキシを設定しようと思った場合、設定アプリのWiFiの画面を表示して、いま接続しているWiFiのオプションを開き、プロキシを設定するモードにして、IPアドレスを設定して、ポート番号を指定して… となかなかステップ数が多く、モバイルの小さい画面でIPアドレスを打つのはなかなかストレスフルです。そもそもIPアドレスを設定するためには、プロキシサーバになる母艦のIPアドレスを知る必要があるので、ターミナルでifconfig とか打たないといけないですね*1

逆にプロキシを使いたくない時もまた面倒だなあと思うことがあります。プロキシの設定がされたままではAndroid側は通信をすることができないので、母艦でCharlesを立ち上げ続けておく必要があります。Charlesはそんなに軽いアプリケーションというわけでもなく、必要ないときには起動しておきたくないので、モバイル側のプロキシの設定を消す必要があります。 ここで消したら再び使いたいときに、また奥まった機能の小さな画面でIPアドレス打ったりしないといけません。

PAC

日々プロキシの設定をしたり消したりしているうちに、あるオプションに気づきました。

プロキシの自動設定
プロキシの自動設定

プロキシの種類を指定するところに「プロキシの自動設定」とあります。なんとも甘味な響きに胸を打たれ、なんなのかと調べました。 調べてみると、これはプロキシに関する設定を定義として配布できる仕組みだと分かりました。

ja.wikipedia.org

起源はNetscape時代から始まっており、なかなか歴史があるものなのですが、全然知りませんでした。 これを使えば小さい画面でポチポチプロキシの設定することから開放されそうです。

PACをどう書くのか

PACファイルはhttp(s) によってアクセスできる場所に置いておく必要があります。Amazon S3Google Cloud Storageが手軽で適当だと思いました。 そこに次のようなファイルを置くとプロキシが有効になります。

function FindProxyForURL(url, host) {
  if (isPlainHostName(host) || isInNet(host,"127.0.0.1", "255.255.255.255")) {
    return "DIRECT";
  } else {
    return "PROXY 192.168.10.2:8888; DIRECT";
  }
}

PACファイルはJavascriptで記述します。FindProxyForURL という関数によってプロキシを使うかどうかを判定します。 この記述内容であれば、「通信先がローカルホストでなければ 192.168.10.2:8888 をプロキシとして使う」という内容になっています。

逆にプロキシを使わない場合は、次のようなファイルにしておきます。

function FindProxyForURL(url, host) {
  return "DIRECT";
}

DIRECT という文字列を返すと、プロキシを使いません。

詳しい書式は割愛します。プロキシ自動設定ファイル - HTTP | MDN あたりが詳しいです。

あとは、このファイルにアクセスするためのURLをモバイル側のプロキシの設定として設定するだけです。

プロキシの設定
プロキシの設定

日常でPACを使うために

Amazon S3Google Cloud Storageなどにファイルを置くようにすればファイルの更新も容易ですが、IPアドレスを調べたり、ファイルを更新したりといった作業も面倒だと思い、ツールを作りました。

github.com

コマンド一つでPACファイルを通してプロキシの有効/無効を切り替えることができるツールです。 局所的にそこだけコマンドを紹介すると、次のようなコマンドになります。

$ pac enable # プロキシ有効化
$ pac disable # プロキシ無効化

詳しい pacコマンドの設定や使い方は次節に書きます。

pac コマンドの使い方

設定

pacコマンドを使うためには、まず設定をする必要があります。これは、pacファイルをどこに置いておくか、という設定なので、誰しもがやる必要があります。 例えば Amazon S3にファイルを置く場合は次のようになります。

---
s3:
  bucket: your-bucket-name
  path: /

だいたい読み取れるんじゃないかと思いますが、この内容で、 s3://your-bucket-name/yout-name.pac という場所にPACファイルができます*2。 自分の環境に合わせてバケット名やパスを設定できます。

プロキシの有効化

次のコマンドで有効になります。

$ pac enable

内部で aws コマンドを使っているため、あらかじめ認証が通るようにしておく必要があります。

プロキシの無効化

$ pac disable

補足

  • Google Cloud Storageのことも書きましたが、実はサポートしていません。自分が使う範囲で使えるなーと思ったので、公開しました。気が向いたらGCSを対応するかもしれませんが、PR貰えれば嬉しいです。
  • Androidを中心に例を挙げましたが、もちろんiOSでも使うことができます。

最後に

PACファイルという存在を知ってから、プロキシを設定しなくてはならない、解除しなくてはならない、といったシチュエーションでだいぶストレスが減りました。通信内容を確認したいと思ったときに手軽にそれを使うことができるのは、とてもよいものですね。気持ちよく開発をすることができます。

*1:毎回この設定をしなくてはならない、というわけではありません。DHCPによって概ね同じIPがわりふられるようになっているんじゃないかと思うので、設定しなくていいシチュエーションの方がほとんどです。

*2:yout-name.pac にはログインユーザーの名前が入ります