マル開発日記

マルAndroidデベロッパ

サイコロを100回振ったとき、何回1の目がでるのが妥当?

今回はAndroidから離れます。タイトルのような確率・統計の話題です。
タイトルにあるような問題はどう解いたら良いのでしょうか。。実は公式があります。

試行回数nがそれなり(10~20以上くらい?)に大きいときは、確率pのブレは以下となりますでしょう。

se = √(p×(1 - p) / n)

割とシンプル。(数式エディタも使わないシンプルさ)

1が出る確率は1/6 (約0.167)、試行回数を100にすると。

se = √(0.167 × 0.833 / 100) = 0.0373

100回サイコロを振った場合、2倍のseの範囲は

p-2se ~ p+2se

0.167 ̟- 2×0.0373 ~ 0.167 + 2×0.0373

0.09 〜 0.24

回数は100回なので100倍すると、9~24回

サイコロを100回振った時、信頼度95%で1の目が9~24回でます。

興味あるかたは是非サイコロを振って確かめてください(笑)
(もしかしたら数学的な表現に一部誤りがあるかもしれませんが、自分は数学者ではないのでクレーム禁止)

参考文献
https://ja.m.wikipedia.org/wiki/%e4%ba%8c%e9%a0%85%e5%88%86%e5%b8%83

いままで気づかなかった

 Android開発ネタです。Dialogについてです。

 Dialogのボタンリスナに DialogInterface.OnClickListener ってのがあるんですが、イベント発生時にリスナに渡されるのは

 onClick(DialogInterface dialog, int which)


 なので、DialogInterfaceとやらが渡されます。DialogはDialogInterfaceを継承しているので、これをDialogにキャストすれば Dialog のオブジェクトとして触ることができます。
 例えばDialogにセットしたView(例えばEditText等)をonClickイベント時に使いたいと思って、DialogのAPIでgetViewなるものはないかな~ってずっと探してたんですけど、なかった。そんなメソッド。自分はゲッタはgetXXXと思い込んでいたもので。getWindowからViewを辿ってできそうな気もしてたけどちょっと面倒くさいし、なのでコード的にベストプラクティスでない方法(例えばfinalを利用するとか)でViewにアタッチしてたんです。

 で、今日なんとなくDialog APIのページを眺めていたら、あるじゃないか、findViewById とやらが。API 1の時からアルじゃないか。。

 結論は、、思い込みは良くない!でした。(こんな話して面白がる人いるのかな?)

new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
EditText text = ((Dialog) dialog).findViewById(R.id.edit);
String name = text.getText().toString();
...
}
}
});

 と美しくかける。

GCP Cloud Translation API

 久々の投稿になります。こういう時は大抵宣伝です…

 私はGoogleの回し者ではございません。自分の作ったコードを公開してちょっとドヤ顔をしてみたいだけです(それもどーかと)
 今回、Python3でGCP の Cloud Translation API を利用した翻訳スクリプトを書きました。Web上とかでGoogle翻訳を使うことはもちろん手軽にできますが、ちょっと長い文章とか翻訳する時ちょっとかったるいなーと思ったのでスクリプトにしてみました。
 もうひとつ、Androidアプリの多言語化も自動化してみたくて、strings.xmlの自動翻訳もできるようにしました!機械翻訳のクオリティでもいいからアプリを多言語化してみたいという方はおすすめです。今後、もっと機械翻訳の精度が向上してくれれば、安心して自動翻訳によるコンテンツ提供ができますね!

 さて以上のスクリプトGitHubに公開していますが、まだ Cloud Translation API を使ったことがないという方は、まず本家のページを参考にPythonで扱えるようになるまで練習してみてください。ある程度雰囲気が分かったらpipでGitHubからスクリプトをインストールしてみてください。(インストール方法等はGitHubのREADMEにあります。ちなみにREADMEの英訳はスクリプトで作りました。ちょっと変な表現あるかな。。とは思ったのですが、とんちんかんではなく理解できる範囲の英訳になっているのではないでしょうか)
 インストールが終われば、コマンドが登録されるのでCLIで操作できます。(コマンドだけで翻訳できるので、最低Pythonの環境構築の知識さえあれば利用できます。)
 
 使用上の注意として、APIは有料なので不正利用されないようにキーの管理はしっかり、また翻訳のし過ぎには気を付けてください。
 
 それでは良いアンドロイドライフを!

github.com

Googleアカウントは2段階認証しましょう

 ひとつのGmailアドレスでアカウントを登録すれば、おそらくそのアカウントで全てのGoogleのサービスを利用できるようになります。AndroidアプリをGoogle Playで公開するときも、Admob(Adsenseのモバイルアプリ版?)にログインするときも、はてまた最近始めたGCP(Google Cloud Platform)を利用するときも同じGoogleアカウントでできます。ものすごーく便利なんですが、もしこれを乗っ取られたら本当に大変な被害になりそうです。
 特にGCPなんかはうっかり使いすぎるとすぐウン万、ウン十万とか逝って。。クラウド死とかいうワードもあるくらいですから。もちろんサービスの課金方法を良く理解することも必須ですが、不正利用を防ぐためにも必ず二段階認証したほうが良いですね。
 設定はとても簡単です。でも、Googleのヘルプページの説明がイマイチ?なので若干躊躇するかも知れません。でもやることは本当に簡単です。気を付けないといけないのは、認証アプリまたはSMSを利用する端末をうっかり紛失してしまうとログインが不能になってしまうことです。自分はまだスマホを無くしたことないけど、もし無くしたらきっと寒い思いをするでしょう(笑)。確か、バックアップコードとかいうのも2段階認証の設定時に出てくるはずなので、忘れずどこかにメモって適当な金庫に保管するのが良いと思います(笑)
 とにかく、2段階認証はGoogleのサービスを利用する上で必須だと思うので、まだしてない方は絶対してくださいねー

MacでGCEにsshログイン

 GCE(Google Compute Engine)の仮想マシンsshログインするとき、"ブラウザウィンドウで開く"でも良いと思いますが、自分のMac Bookでは全画面表示になってしまいすげぇ見辛かったのでターミナルからsshログインしてみました(Windowsで試した時は全画面じゃなくて良かったんですが)。

 Macでターミナルを立ち上げ、ssh-keygenで鍵を作ります。やり方はググればいっぱい出てくる。

 作ったsshの公開鍵はサーバ側の.ssh/authorized_keysに追記するのではなく、Compute Engineのダッシュボードからメタデータに移動して登録するみたいです(GitHubの時と同じような感じ)。authorized_keysを自分で触ろうとすると、なぜかいつの間にかファイルが消えてしまったりします(多分セキュリティ対策?)

 鍵の用意できたらMacのターミナルからログインしやすくするために、(ローカルの).ssh/configのファイルでHOSTを追加しておきます。


HOST garigari <- 適当な愛称をつける
HOSTNAME xxx.xxx.xxx.xxx <- GCEの外部IP
USER hogehoge <- サーバ側のユーザ名(だと思う)
IDENTITYFILE ~/.ssh/id_rsa_xxxxxxx <- 作った秘密鍵のファイル場所を指定


そうすると、macのターミナル上から

ssh yaseyase@garigari

のような感じでログインできます、ちなみにyaseyaseは公開鍵のテキストの中身に入ってるユーザ名じゃないといけないみたいです。
(ちょっと試行錯誤しました。。)

ブラウザウィンドウから接続すると毎回自動で鍵を作ってるようでかなり安全な感じがしますが、セキュリティより利便性を優先するなら使い慣れたターミナルでログインするのが良いかな思います。

補足:
その他の接続の方法としてgcloudってやつがあり、こっちのほうが良さそうだけど、自分はanaconda3をインストールしたときpythonのパスが3系になってしまって、gcloudは2系じゃないとだめなようなので、とりあえず普通のsshログインを試してみた次第です。

原因がわかりました。多分。GCEは公開鍵内に書かれたユーザidをみて、それから勝手?にuseraddし、そのユーザの.sshに公開鍵を置くようですね。なので、vpsにログインするような感じではうまくいかないみたいです。ウボァー

情報爆発

 ITに興味あって日々お勉強されてる方はときたま情報爆発起こりませんか。情報は爆発だ(笑)。こちらが快感になってくればよろしいかと思います。
 最近はクラウドに興味を持ち出したんですが、メジャーなサービスとしてAWSGCP、Azureとかありますよね。既に三通り(-_-;)自分はGCPから始めて、GCEでひとつ仮想マシンを立ち上げてます。それから必要な知識はsshとかwwwサーバとかは少なくとも必要になるんですね。wwwはセキュリティを意識しながら設定し、フレームワークとか選ぶとなるとPHPとかpythonとかルビーとかを選ぶことになると思います。そして、仮にPHPを選んだ場合はWordPressとかララベルとか。。そして、クライアント側はJavaScriptjQueryとかそしてもっと新しいやつとか。んで、ラズパイをIoTしたいんで家からはDDNSとか立ち上げたいんですね。できれば。DNSはプライマリとかセカンダリ用意しないといけないみたいだし、まぁとりあえず適当なサービスを利用させてもらうかも(笑)
 すでに何をやりたいか分からなくなっている。これを自分は情報爆発と呼んでいます。そして、SwiftとかKotlinとかはてまたLinuxカーネルとかも興味もち始めてます。終わってる(笑)

不安モデル

 不安モデルを作成しました!
 まずココロのモデルとなるボールのような球体を作成します。次に棒のようなものでこのココロを串刺しにし、地面に固定します。不安とはこのココロが揺れる最大振幅などで定義します。
 ココロが揺れるために外力が必要です。外力となりえるのは例えば健康状態とか将来設計とか仕事のノルマとかいろいろです。外気温など直接身体に影響するようなものも考えられます。
 ココロを安定するにはどうしたら良いのでしょうか。上に挙げた外力を弱める方法が直接的に働きますが、自分の力だけではどうしようもないこともあります。
 もうひとつの方法として、棒の強度を上げる(簡単にココロが揺れない)というのもあります。じゃあ棒の強度ってなんなのって話になりますが、それは自信とやらなんじゃないんでしょうか。自信が無いときはやたら不安に感じますのでね。。
 不安が強いときはいろんな方法で不安を可視化すると良いと思います。デベロッパ視点で。