読者です 読者をやめる 読者になる 読者になる

山下寛人オフィシャルブログ

オイシックス株式会社 執行役員 システム本部長 山下寛人の公式ブログです。

Raspberry Pi 3でWifi接続(PEAP, MSCHAPv2)

ここ最近電子工作をがんばっています。同じITの世界なのにこんなに知らないことがあったのかと改めて実感しています。新しく知ることが多くて面白いです。

さてラズパイ3はWifiモジュールが標準装備になっていることを知り、いろいろ試行錯誤したので記録しておきます。

Wifiと一口に言ってもたくさん種類があります。
正確な説明を簡単にするのは難しいので、設定に必要な知識のみ大胆に端折って紹介します。

接続の方式にはWEP、WPA、WPA2があります。WPA2以外は解読する手法が見つかっているので現在では安全ではありません。WPA2にもWPAパーソナルとWPAエンタープライズがあります。よくWifiにつなげる方法として紹介されているのはWPAパーソナルと思われます。
例えばこういうもの
qiita.com

WPAエンタープライズはその名の通り企業内でよく使われる方式のようです。こちらは設定がより難しくなっています。さらにこの中でも種類がいくつかあるようです。オイシックスではPEAP, MSCHAPv2でした。この場合の設定は以下のようにすればできました。
/etc/wpa_supplicant/wpa_supplicant.conf

country=GB
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
	ssid="SSID名"
	priority=1
	key_mgmt=WPA-EAP
	pairwise=CCMP
	auth_alg=OPEN
	eap=PEAP
	identity="ユーザー名"
	password=hash:ハッシュ化したパスワード
	phase1="peaplabel=0"
	phase2="auth=MSCHAPV2"
}

パスワードをハッシュ化するには以下のコマンドを使います。

echo -n 'password_in_plaintext' | iconv -t utf16le | openssl md4

またDHCPにするため以下設定ファイルを変更しました。
/etc/network/interfaces

iface wlan0 inet manual
↓
iface wlan0 inet dhcp

追加
iface default inet dhcp

その他のコマンド。
設定ファイルを変えて接続を試す場合はifdown,ifupを使います。

sudo ifdown wlan0
sudo ifup wlan0

wifiの接続状態を確認するにはiwconfigコマンドが使えます。

iwconfig

以上、下記のサイトが一番参考になりました。
eparon.me

Go言語入門(書籍)

10年以上前になりますが飛松君という優秀な学生インターンがいました。7月にその彼から本を出したという連絡がありました。

Amazon CAPTCHA

やっと全部読み終えたので感想。

3/4くらいGo言語そのものの説明になっています。1/4くらいがGoでラズパイを使う内容の紹介になっています。Go言語そのものの部分はリファレンス的で過不足なく網羅的に言語仕様を説明する内容になっています。Go言語やる人は手元にこの1冊があると便利でしょう。

この本の特色はやはりラズパイの部分です。ラズパイは一般的にはPythonRubyで使うことが多いようですがあえてGolangでやるところが面白いです。ネイティブコードにコンパイルするのでリソースが少ないラズパイでもパフォーマンスがよく動かせそうです。またクロスコンパイルができるという特徴をうまく活かしてコンパイルは性能の良いパソコンでやって実行だけラズパイでするという方法を紹介しています。

私はラズパイ全くの初心者だったのでこの本だけではちょっと厳しかったです。未経験者は別にラズパイ入門本はあったほうがいいと思います。とはいえGo言語の幅広さを体験できるところは面白いです。

Windowsでrsyncを使う(公開鍵利用)

rsync便利ですよね。サーバーとファイルを同期するときにファイルが大量にある場合は差分だけ高速に同期できます。しかしwindowsには標準で付属していません。

www.itefix.net

そこでcwRsyncというソフトを使います。cygwinの必要なところが同梱されていてそのうえでrsyncを動かしているようです。cygwinは別途インストールしなくてよいので使う分には意識する必要はありません。
有料版とフリー版があって有料版はインストーラーがあるようですがフリー版はありません。どこに置いてもいいのでパスを通せば大丈夫です。

サーバーにアクセスする際にAWSなどでは公開鍵が必要になります。これを使うにはひと工夫いります。

まずファイルの配置場所が決まっていないのでrsyncコマンドで指定します。またファイルのパスはcygwin方式で指定する必要があります。次のようになります。

rsync -e "ssh -i /cygdrive/c/Users/h-yamashita/Documents/id_rsa.txt"

cygwin方式のパス表記は、ドライブ名を/cygdrive/ドライブ名/という形で指定します。また¥をスラッシュに変えます。
公開鍵以外のwindows側のファイルパスもcygwin方式にします。

公開鍵のファイルはそのままではpermissionエラーになります。これはファイルのオーナーをadministratorにすることで解消できました。
ファイルを右クリック
→プロパティ
→セキュリティ タブ
→詳細設定
→ウィンドウ上部の「所有者」右の「変更」
→テキストボックスに「administrator」と入れる
→名前の確認
→全部OK

他は通常のrsyncコマンドと全く同じように使えます。

これで快適にファイル同期ができるでしょう。

KotlinでスマートにJSONをさばく

KotlinでJSONを使う場合、言語そのものには機能がないのでライブラリを使うことになります。Javaのものも含め選択肢は多様です。JavaScriptと違いJavaやKotlinは型がしっかりしている言語なのでJSONマッピングするクラスをあらかじめ作っておいてそこに当てはめるようなものが多いようです。でもそれだとJSON自体はデータ形式はいろいろ柔軟に変えられますが受けるほうはそんなに柔軟にできません。またモックを作るときは余分なクラスを作らずさっと済ませたい場合もあります。こういうときMapやListベースでJSONを使えるとよいです。

Moshiというライブラリはそういった使い方ができます。しかし値を取ったらキャストしないとその中の値が取れずいまいちスマートにできませんでした。

map = map["grouped"] as Map<*, *>
map = map["category_name"] as Map<*, *>

一番よかったのはklaxonです。Kotlin用です。
github.com
使い方は

var obj = Parser.parse(JSONのストリーム)

こうするとArrayに相当するJsonArrayもしくはMapに相当するJsonObjectが返ってきます。

var productsDictionary = obj.lookup<JsonArray<String>>("grouped.category_name.doclist.docs.category_name")

こういった具合にlookupメソッドでJavaScript的に一発で中の方の値にアクセスできます。

注意すべき点としては日本語が文字化けします。内部ではUTF-8でも1バイトずつ処理していました。でもunicodeエスケープしておけば対応できるようになっていました。
unicodeエスケープというのは、\u9999みたいな形で文字を表現するやり方です。昔のJavaではプロパティファイルを作るときにnative2asciiコマンドを使ってこんなことをしたと思います。今時もうやりませんが・・
一番手軽なやり方はcommonsのStringEscapeUtilsを使う方法です。

jsonstr = StringEscapeUtils.escapeJava(jsonstr).replace("\\\"", "\"")

ダブルコーテーションの前にバックスラッシュがついてしまうのでreplaceコマンドで消しています。こうやって

var obj = Parser().parse(jsonstr.byteInputStream()) as JsonObject

として渡してやれば日本語も文字化けしません。

型がしっかりしたKotlinでもJavaScript並にすっきり書けました。なおかつflatMap,map,filterなど使ってスマートに処理できます。

いい加減ウイルスと言うのをやめよう

JTB不正アクセスの被害にあってニュースになっています。一連の報道でどうも違和感があるのはJTBは被害者なのに加害者みたいな報道のされ方をしているということ。これはJTBに限ったことではありません。
www.yomiuri.co.jp
www.asahi.com

大昔の個人情報漏洩事故は本当にうっかりとしか言えないようなものでした。webサーバーに誰でも見える状態で個人情報のCSVファイルが置いてあったり内部の人ならごっそりデータを取れるようになっていたりしていたことがありました。でも標的型攻撃はしっかり管理していてもやられます。昔は現金むき出しで置いてあって盗まれていたのが、今はしっかり金庫に入れてあったにも関わらず破られて盗まれるわけです。盗まれた人に責任を問うのは酷だと思います。

どうしてそうなるのか。1つは、技術的なことなので昔と今の違いがよく知られていなくて昔のような感覚が残っているのではないかと思います。また徐々にうっかり度合いが下がって攻撃度合いが上がってきたのでそういう感覚が残っているとも考えられます。

もう1つは犯人が見えないということ。ものすごい悪いやつがいるのですが見えないからとりあえず見える人を悪者にしてしまいます。無意識にやっていると思います。

もう1つは「ウイルス」という名前にあると思います。今回はJTBの公式発表でも「ウイルスに感染」とあり
不正アクセスによる個人情報流出の可能性について
NHKでも「ウイルスに感染」という見出しで報道しています。
www3.nhk.or.jp

コンピューターウイルスというものはもともとあるコンピューター上で動作するとフロッピーディスクやネットワークを通じて他のコンピューターに自分自身をコピーして動作してさらに他のコンピューターにコピーして広がっていきます。その様子が風邪のようなウイルスに似ているのでコンピューターウイルスと呼ばれるようになりました。

しかし風邪のようなウイルスは誰かが悪意をもって作ったものではなく自然に発生するものです。コンピューターウイルスというとなんか自然発生的にできて自然に広がっていくようなものに思えてしまいます。風邪やインフルエンザのように予防をしなかった人が悪いようなイメージができてしまいます。でも実際はすっごい悪いやつがどこかにいて悪いことを企んで作っているわけです。だから最近は英語では「マルウェア」と言っています。malicious=悪意のある、ソフトウェアです。

日本語だとマルウェアといってもピンと来ません。もっと悪そうな名前がいいですね。悪質プログラム。地雷プログラム。なんかもっといい名前はないでしょうか。いずれにしても名は体を表すのでウイルスという名前は適切でないので呼び方は変えたほうがいいですね。あと犯人はつかまえてテレビに出して欲しいです。

Mithrilを使ってみた(MVC,Virtual DOM)

今後の開発でMithrilを使っていこうという話が出ているので使ってみました。

MithrilというのはJavaScriptMVCフレームワークです。あまりメジャーではありません。メジャーなものではBackbone.jsやAngularといったものがあります。流行りのReact.jsというのもありますね。AngularはMVWでReactはV(View)だけらしいです。他のものはちらっとググっただけなのでよくわかりません。でもMithril含めある程度の範囲の違いはあるもののざっくり同じ範疇だと思っていいのではないかと思います。

感想としては最初の敷居はちょっと高いです。公式のgetting startedがややわかりにくいと思います。余計なことが書いてあるしミニマムな解説になっていません。また外部の入門的な記事があまりありません。そのため要はどんな仕組みなのか把握するのに手間取りました。そこでわかったことを紹介してみようと思います。

Mithrilの目的はMVCフレームワークなので、ModelとViewを分けることです。JQueryのイメージは画面をぐりぐりいじりまわす感じです。これだと複雑なアプリケーションになってくるとコードが煩雑になってきます。そこで画面内の情報を抽象化したオブジェクトをmodelとしてviewと分離することでわかりやすくしようとするものです。例えばECサイトだと画面に商品が並んでいてカゴに入れるボタンがついていて、ショッピングカートがあります。こういう商品やショッピングカートをオブジェクトとするのですね。modelが変わったらそれに応じてviewが変わるイメージです。カゴに入れるボタンを押すとショッピングカートオブジェクトの中に商品が加わり、画面でも表示されるということです。

Mithrilが提供する仕組みは主にViewだと思います。
最小限の使い方は
1)画面を描画するfunctionを用意する
2)画面内にはめこむところを指定して組み込む
こうするとクリックなどのイベントを拾って画面を再描画してくれます。
そしてデータがちょっとしか変わらないのに画面が全部再描画になると重くなるので自動的に差分だけ反映してくれるのが特徴です。これがVirtual DOMです。

1)はこんな具合です。

csstest.view = function() {
  return m("span", {class: csstest.getClass()}, csstest.value);
}

これでspanタグに囲まれたHTMLが出力されます。

2)はこんなふうになります。

m.mount(document.getElementById("csstest"),
  {controller:function() {}, view: csstest.view}
);

これでコンテンツが表示されます。

これだけだとただHTMLを書いたほうがよっぽど早いです。1)をちょっと変えてonclickイベントを追加してみましょう。

csstest.view = function() {
  return m("span",
    {class: csstest.getClass(),
     onclick: function() {csstest.change();}
    },
    csstest.value);
}

呼び先のメソッドなどのコードは以下です。

Testclass = function(val) {
  this.value = val;
  this.change = function() {
    this.value = 1;
  };
  this.getClass = function() {
    if (this.value == 0) {
      return "red";
    } else {
      return "yellow";
    }
  }
};
var csstest = new Testclass(0);

こうすると、クリックで色が変わります。onclickイベントではオブジェクトの値を1に変えているだけです。でも色が変わるのがミソです。これはviewで再描画が走っているからです。画面をいじるという考え方とは発想が違うのがわかると思います。

Mithrilの機能は描画が主ですがわかりやすくメンテナンスしやすいMVCにするには以下のようにするとよいでしょう。
・画面を構成する要素をModelオブジェクトにする
ビジネスロジックはModelオブジェクトに実装する
・画面操作的なロジック(onclickなど)はview modelオブジェクトを作ってそこにまとめる
このへんはMithrilのgetting startedのサンプルを参照するとよいでしょう。

画面の描画がHTMLタグでなくm()で記述するというのがなかなかやっかいなところです。これについてはHTMLタグで書ける仕組みが用意されています。MSXといいます。

解説としては以上です。

所感としては慣れれば複雑なjsアプリをいい感じに書けそうではあるがもうちょっとこなれてほしいかなと思います。ドキュメントが変わればだいぶよくなりそうですし、プログラムの記述方法も初めて使う人がすっと理解できるようになるとよいと思います。これからに期待ですね。

Kotlin評価

昨年からAndroid開発で一部から注目されていたKotlinですが社内でも話題に出たのでしばらくぶりに情報収集してみました。

まず2月に1.0がリリースされました。正式版です。

またAndroidだけでなくサーバーサイドでの導入検討も進んでいるようでいろいろ試した記事が増えました。アプリ開発とサーバーサイド開発を同じ言語でできるというのは大きな魅力です。Javaとの互換性が高くJavaアプリケーションには比較的問題なく取り入れられそうです。springbootでもJava、Groovy、Kotlinが標準的に選択できるようになっています。

Groovyと何が違うの?という疑問があるのでもう少し詳しく見てみましょう。

その前にJavaとの比較。
Javaは今となっては文法がめんどくさいです。徐々に簡易に書けるように言語仕様が変わってきていますがRubyなどと比べてだいぶ遅れをとっていると思います。もう今さらドラスティックに変えるのは難しいのでしょう。変わると困る人が大勢いるので。もちろんKotlinはセミコロン不要です。これすごい大事。

Rubyとの比較。
Rubyインタープリターという点が大きく違います。Kotlinはコンパイル言語です。Rubyだと関数はソース上、呼び出すところの前に書く必要があります。また型もゆるいです。

Groovyはこれらの点ではKotlinと同じです。Javaと比べて簡潔な書き方がいろいろ用意されています。またRubyと違いコンパイル言語です。Android開発もできます。そうなると後発のKotlinは何がいいのかということになります。

一番の違いはタイプセーフを前提に設計された言語かどうかということです。Groovyは基本的には型なしで使う前提で設計されていると思います。比較的最近@TypeCheckedというアノテーションをつけることで型チェックができるようになりました。しかしもともとが型なしだっただけに、変数を宣言する時defで宣言すると今までどおり型なしになります。簡単に書けたところでもキャストが必要になったりします。それがどういう法則になっているのかよくわからず試行錯誤が必要だったりします。またクラスに後からメソッドを足すようなこと(メタプログラミング)もコンパイルエラーになります。細かいところに後付感があります。

一方のKotlinはもともとタイプセーフなのでGroovyのような支障はないと思われます。

またNull Safetyの仕組みも大きく違うところです。SwiftやJava8でいうoptionalに相当するものです。Groovyにはありません。Java8のoptionalが使えるようですが言語的に強制されないのであまり効果ないように思います。

Kotlinの場合はSwiftよりも洗練されていると思います。Swiftは言語仕様で強制されているのでNullPointerExceptionの防止の観点ではとても手堅い感じになっています。しかしラップしたりアンラップしたりでコードが?や!で若干うっとおしくなります。コーディング中もコンパイラに怒られながら?や!を書く作業をしなくてはなりません。

Kotlinだとif文でnullチェックするとその後はメソッドが使えるようになります。すばらしい。

同様にifで型チェックすると自動的にキャストされてその後はキャストしたクラスのメソッドが書けるようになります。


Kotlinの公式サイトの「Try it」をクリックするとブラウザ上でIDEが開いてサンプルプログラムが動かせます。Examplesの下のProblemsに練習問題が入っています。Kotlin関係なくちょっとした頭のトレーニングになっておもしろいです。