スマホアプリの通信デバック

HTTPS通信を除く方法はいくつか存在している。どちらもオレオレ証明書をインポートすればHTTPSの通信もキャプチャできるようになる。

iPhoneアプリ

いくつか試したけどこれが一番。 dev.classmethod.jp

Androidアプリ

play.google.com

トラブル解決の方法論

プログラムであれ、NWであれ、クラウドであれ、オンプレであれ、およそシステムの構築にはトラブル発生がつきものである。トラブル解決には2通りの方向性がある。「できないこと」を確認するアプローチ「できること」を確認するアプローチだ。

できないことを確認するアプローチ

「できないこと」というトラブル事象そのものから、ボトムアップ式にトラブル原因までさかのぼっていく方式がこちら。「できないこと」の事実の積み重ねが有効なのは、事前にトラブル発生要因の絞り込みができている場合である。

できることを確認するアプローチ

「どこまでならできるのか」「どこからできないのか」の線引をはっきりさせるアプローチがこちらだ。最も基本的な機能からトップダウンでトラブルが発生していく事象まで確認内容を細分化していく。

どちらを採用すべきか?

多くの場合はトラブル原因は事前に想定していのと全く違うことが多い。「DB更新のロジック誤りだと思って調べてみたら、そもそも対象となるデータそのものが存在していなかった場合」などだ。この場合ボトムアップ式だとそもそも全く見当違いの方向に走り続けている可能性がある。そうなるとどれだけ時間とコストをかけてもそもそも解決にいたらない。

そのためトラブル対応のコツはボトムアップ式に「何ができないか」を確認するのではなく、トップダウン的に「何がどこまでならできるているか」を確認するべき。上の例でいえば「DBプロセスは起動しているし、DBにアクセスはできているし、DBの更新処理が正しく動作している場合としていない場合がある。していないのはXXXのリソースにアクセスする場合のみである」など。

範囲を絞りきった後の最後の一手

「本当はXXXであるべきなのに、なぜか〜になっている」というところまで迫ったらできるだけデバックで取得できる情報を増やすこと。例えばアクセスログの代わりに、wiresharkですべてのパケットの中身を確認するなどだ。

追記

最後の一手に使える手段の多寡が解決能力の違いを生む
- 日本語のドキュメントでなく英語のドキュメントを読む
- ソースコードを読む

Pythonでのイテレータの利用

Pythonでindex込みでループする場合はenumerateが一般的であるが、イテレータを使う方法もある。下のようにiter()*1イテレータオブジェクトを用意し、next()関数で次の要素の取得を行う。

next() vs Forループ

イテレータオブジェクトのnext()を利用するのは、ループ対象の要素でindex毎に実施する処理が異なる場合で、forループを用いるのは処理の内容が同じ場合と使い分けるのがよいと思う。

iter_tree = tree.iter()
# print(tree) # <Element 'subroutineDec' at 0x10fd59e58>
# print(next(iter_tree)) # <Element 'subroutineDec' at 0x10fd59e58>

subroutineElm = next(iter_tree)
assert subroutineElm.tag == 'subroutineDec'

kwElm = next(iter_tree)
assert kwElm.text.strip() in ['constructor', 'function', 'method']

2. 組み込み関数 — Python 3.6.5 ドキュメント

*1:組み込み関数iter()の利用もあり

Javaの型

実はJavaに関して書くのは初めてだったりする。
Nand2Tetrisを読んだおかげでこのあたりも意識するようになってきた。

プリミティブ型

こちらは変数には値そのものが格納される。

  • boolean
  • byte
  • char
  • short
  • int
  • float
  • long
  • doubule

参照型

こちらは変数には参照先のアドレスが格納される。

  • 配列型
  • クラス型

クラス型とはようするにオブジェクトのこと。文字列もStringクラスを利用するため参照型である。