幸福なプログラマ

プログラマは幸福になれる。

Javascriptで連想配列にキーが存在するかチェックする方法

連想配列にキーが存在するかチェックしたい時やりがちな判定

var map = {"key": 0};
if (map["key"]) {
    // "key"がmapに存在する
}

でも、これだと if (0) となるためkeyが存在するのにfalseとなる。

そこで以下のようにするのが正しい

var map = {"key": 0};
if ("key" in map) {
    // "key"がmapに存在する
}

jQueryで親要素へのイベント伝播を防ぐ

jQueryでクリックイベントを設定する際、以下のように子要素と親要素両方にイベントを設定すると、子→親の順にイベントが走る。 これを イベントバブリング と呼ぶらしい。

<tr>
    <td>Test</td>
<td>
jQuery(function($) {
  $('tr').click(function(e){
    alert('tr click');
  });
  $('td').click(function(e){
    alert('td click');
  });
});

 

子要素のイベントだけ発生させ、親要素のイベントは発生させたくない。そんなときは stopPropagation() を使うことで、子から親への伝播を止めることができる。

jQuery(function($) {
  $('tr').click(function(e){
    alert('tr click');
  });
  $('td').click(function(e){
    alert('td click');
    // 親へのイベントの伝播を止める
    e.stopPropagation();
  });
});

こんな感じで。

iOSデバイスにiOS12ベータ版を入れる方法

公式見れば全部書いてあるけど一応備忘録として。

  1. アップデートしたいiOSバイスから https://beta.apple.com/profile このURLにアクセスする
  2. ページ中程にある プロファイルをダウンロード ボタンを押す
  3. Appleデベロッパーアカウントでログインするとプロファイルが自動でダウンロードされる
  4. ダイアログが表示されるので、インストールすることを許可して端末再起動
  5. このタイミングではiOS12へのアップデートはまだ終わっていなくて、 設定->一般->ソフトウエア・アップデート を見るとアップデートの進捗が確認できる。終わるまで待つ。
  6. 終わったら同じ画面内に 今すぐインストール みたいな表記が出るので、タップしてインストール。終わり

当然、iOS12サポート対象端末じゃないといけないので注意。

Navigation Architecture Component を使えるようにする

Google I/O 2018 でAndroid Studioの新機能、Navigation Architecture Componentが発表されました。

どうやらXcodeで言うところのStoryBoardのようなものらしいです。iOS開発をしたことがないので一つもピンときていません。

とりあえず、Navigation Architecture Componentを使えるようにするところまでやってみたいと思います。

1. Android Studio 3.2をインストールする

  • 3.2以降でしか使えないらしいので、こちらからインストールします。
    • 3.3もあるけど、Googleのドキュメント類は3.2準拠っぽいのでよくわからない人は大人しく3.2インストールした方がいいです。

2. build.gradedependencies 更新

プロジェクトを作成し、 build.gradedependencies に以下の記述追加

def navigationVersion = '1.0.0-alpha05'
implementation "android.arch.navigation:navigation-fragment:$navigationVersion"
implementation "android.arch.navigation:navigation-ui:$navigationVersion"
  • バージョンは現時点のものなので、都度最新を確認してください。

3. Android StudioのNavigation Editor機能を有効にする

  • Android Studio > Preferences (windowsの場合は Settings) から Experimental を選んで Enable Navigation Editor にチェックを入れる f:id:javabayashi:20180912212045p:plain

4. Navigationファイルを作る

  • Navigationファイルというものを作って、その上にポンポンとレイアウトを配置していくイメージのようです。
  • Android Studiores ディレクトリ上で右クリックし、New > Android Resource File を選択します。
  • リソース作成ダイアログが表示されるので、ファイル名適当、 Resource typeNavigation にしてOKボタンを押します。
    • Navigation が選択肢にない人は手順3の設定見直してAndroid Studio再起動したら出てくるかもしれないです。
    • Root elementDirectory name はデフォルトでいいです。
  • OKボタンを押すと res 配下に navigation ディレクトリが作成され、その中に先ほど指定した名前でNavigationファイルが作成されています。

これでNavigation Architecture Componentを使う準備が整いました。 Navigation Architecture Componentの使い方については追々記事にしていければと思います。

参考 Implement navigation with the Navigation Architecture Component  |  Android Developers

iPhoneで開発サーバーにのみ繋いでインターネットには接続させない方法

背景

自社サーバーには繋がっているけど他社のAPIサーバーには繋がっていない状況を作り出してテストしたい、なんてことがありました。

解決方法

結論から書くと、開発マシンにプロキシサーバーを立てて、iPhoneからそのプロキシサーバーを経由してネットワークアクセスさせました。 ※開発マシンはmacの想定

手順

  1. Squid をインストールする
    • プロキシサーバー立てることができるソフト
    • brewで簡単インストール brew install squid
    • squid.conf っていう設定ファイルあるけど、今回の用途だとデフォルトで問題なし
    • brew services start squid で起動
  2. iPadでプロキシ経由するよう設定
    • wifi設定から設定可能、調べればすぐわかる
  3. 各々、アプリ内のAPI接続先を開発マシン上のサーバーに設定しておく

おしまい。

これで開発マシン上で公開しているAPIサーバーには繋がるけど、インターネットには繋がらない状況を作り出せます。

iPhoneって書いたけど、iPadでもandroidでも一緒だと思う。

Vagrant upでのエラー

Vagrant upしたときに

Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

上記のようなエラーが発生することがある。 これは、ホスト側のVirtual BoxのバージョンとBoxにゲスト側にインストールされているVirtualBox Guest Additionのバージョンが異なるため発生している場合があり、vagrant-vbguestを実行することで解決できるようです。

まずはvagrant-vbguestのインストール

vagrant plugin install vagrant-vbguest

vbguest実行

vagrant vbguest

これでvagrant upしてもエラーが出なくなるはず。

Picassoでエラーの詳細を取得する

Picassoでエラー発生時のコールバックを取得するとき

Picasso.with(context).load(URL).into(ImageView, new Callback() {
        @Override
        public void onSuccess() {
        }

        @Override
        public void onError() {
        }
});

こんな感じに書くことができるけど、これだとエラーの詳細を取得することができない。

以下のようにbuilderにlistenerを設定することでStackTraceなりResponseCodeなり、エラーの詳細を取得することができる。

Picasso.Builder builder = new Picasso.Builder(context);
builder.listener(new Picasso.Listener() {
        @Override
        public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
        }
});
builder.build().load(URL).into(ImageView);