2018年3月19日

ScalaMatsuri 2018に行ってきた

今年も昨日と今日東京国際交流館で行われた「ScalaMatsuri 2018」にお邪魔してきました。

去年の初参加の際にレベルの高いセッションの数々はとても刺激になったので、今年はScalaを本格的に使うための学びを得られるようなものを選んでみました。

1日目

Scalaの言語特性の一つとしてComposabilityが高いことがあげられ、それによって問題を分割(分割統治)しやすくなり実装が簡単になるという事が説明されました。講演後の質問で、分割される事によって可読性が下がる事については、HowとWhatがうまく分離できていないとそうなる恐れもあるという回答は個人的にしっくりきました。

「暗黙」とうまく付き合うためのTips
ScalaのハマりどころであるImplicitについて、InteliJ IDEAを使った調査方法のデモや、理解を進めるためのコツなどが分かりやすく解説されました。”Enrich my library”パターンの効用として出てきた今は非推奨のJavaConversionsの動きがエグかったです。。

Listのmapを改善するところから始まり、Optionやエラーを絡めた場合の例がどれも実用的で改善される感じが肌で感じられたのがよかったです。
(Javascriptでdeferやpromiseに初めて触った時の体験に近かったかも)

Scalaでの部分的な関数型プログラミング
避けられない副作用を認識し、それを取り除いていきながら純粋な層と副作用のある層を分離していったら、純粋な層はテスト可能な核となるビジネスルールになったというところは自分たちのシステムを見直す観点としてとても興味深かったです。

関数型プログラミングの比較対象としてよく出てくるHaskellとScalaの違いを、サンプルコードを交えながら解説されました。

JVM上で動くHaskellであるEtaを紹介する講演でしたが、最初にHaskellとScalaの違いについて、”HaskellではIOが型に現れるためコンパイラでチェックが可能”という説明が目から鱗でした。
(あとログ出力も副作用扱いというのも驚きました、、なにそれこわい)

Scalaらしいオブジェクト指向プログラミング
Scalaの言語特性を生かした依存性の管理方法などが説明されました。”コンストラクタを見れば依存関係が分かる”といったところから、コード設計の見通しや不穏なところを感じ取るところは過去の経験ならではといった感じでした。

ブロックチェーンはどうやって動くのか、オレを5歳児だと思って説明してくれ
ビットコインなどで使われるブロックチェーン技術について、歴史的経緯や使われている技術、分散システム特有の問題などを踏まえながら、実際に講演者が作成した手荷物トラッキングを例に説明されました。

2日目

今年もアンカンファレンス形式で行われましたが、結構聞きたかった内容が被りました。。

JVM+ScalaでLambdaを使用すると性能や費用的に問題があった(でもScalaは使いたい)ため、scala.jsでJavascriptに変換(+フロントエンド側とコード共有)してnode.js上で動かすという事例の説明でしたが、実験ではなく既に本番投入されているのが驚きでした。

VS Code Scala
Language Server Protocolの説明と、講演者が開発されているVS Code上でScalaを開発するためのプラグインの紹介が行われました。

エンジニア組織づくり(オフレコ枠)
研修教育や組織体制などの悩みや知見が共有されました。

人材ブラックホール化計画(オフレコ枠)
各社の採用戦略やどういう人材を求めているかなどについて意見が交わされました。

JVM Web Application Metrics & Monitoring
メトリクスの収集方法や形式、JVMで取得するべき項目についての説明が行われました。その中で今後Java界隈ではデファクトになりそうというMicrometerがいいとの事で、この辺の情報は手薄だったのでとても参考になりました。

前にScalaPBに入門してみたものの、あえなく挫折したので再入門の意味も込めて選択しました。スマホアプリ界隈では採用事例を多く聞くようになったgRPCですが、ScalaにはFinagleやAkkaもあるせいか、メッセージ再送やリトライなどについて質問が集まっていたのが印象的でした。

Scalaで転職すると年収は上がるのか(オフレコ枠?)
会場内で無記名で転職前と転職後の年収の変化について投票を行い、その結果の開票と傾向について議論が行われました。

おわりに

この記事を書きながら去年の内容と見比べてみたのですが、少しScalaを触った影響かより実用的な内容を多く選択したような気がしました。今年はgRPC(ScalaPB)を使った既存資産(Java)との連携や、モナド周りの一層の理解に努めてみたいです。

2017年5月14日

Raspberry Pi 3にmitmproxyを導入する


仕事での開発時によくお世話になっているmitmproxyですが、週末プライベートでの開発時にふと使いたくなったものの、自宅PCは無線LANの無いWindowsデスクトップだったり、有線LANの無いMacbook Proだったりするので、そのどちらも持っているRaspberry Pi 3(以下RasPi3)に導入してみました。

準備

まず本作業の前提条件として、RasPi3の無線LAN(wlan0)はアクセスポイントとして利用するため、有線LAN(eth0)もしくはUSB-LAN(eth1)などwlan0以外からインターネットへ接続できている必要があります。

また、/sbin/ifconfig -aコマンドを実行してwlan0が見えない場合、/etc/network/interfacesファイルを編集してwlan0を有効にします。
(iface wlan0 manualの先頭#を削除、次の行のwpa-conf先頭に#を追加)

hostapdのインストール

上記状態であることが確認できたら、以下のコマンドでRasPi3のwlan0をアクセスポイント化するhostapdをインストールします。
sudo apt-get update
sudo apt-get install hostapd
インストールが成功したら、/etc/hostapd/hostapd.conf設定ファイルを作成して以下の設定を書き込みます。
interface=wlan0
ssid=(SSID名)
country_code=JP
hw_mode=g
channel=1
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
ieee80211n=1
wpa=2
wpa_passphrase=(SSIDパスフレーズ)
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
設定ファイル作成が完了したら、wlan0に割り当てるIPアドレスを/etc/dhcpcd.confに設定します。
interface wlan0
static ip_address=192.168.137.1/24
最後にsudo hostapd /etc/hostapd/hostapd.confを実行してアクセスポイントを起動します。

OpenSSLのアップデート

次に、最新版のmitmproxyを導入する(apt-getでインストールできるmitmproxyはバージョンが古い)ため、OpenSSLを最新版にアップデートします。
最新版のOpenSSLパッケージを取得するため、/etc/apt/sources.list.d/backports.list設定ファイルを作成して、以下のDebian Backportsのリポジトリーを追加します。
deb http://httpredir.debian.org/debian jessie-backports main contrib non-free
追加したら、以下のコマンドを実行して上記リポジトリーのGPG鍵をインストールします。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7638D0442B90D010
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 8B48AD6246925553
上記コマンド実行後、sudo apt-get updateを実行してパッケージデータベースの更新を行います。

最後に以下のコマンドを実行して、最新版のOpenSSLにアップデートします。
sudo apt-get install -t jessie-backports -y openssl libssl-dev

最新版Pythonのインストール

mitmproxyはPython 3.5以上が必要ですが、RasPi3には3.4系までしかインストールされていないため、最新版ソースをダウンロードしてビルド&インストールします。
curl -O https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
tar xvfJ Python-3.6.1.tar.xz
cd Python-3.6.1
./configure
make
sudo make install
インストールが完了したら、pip3をアップグレードします。
sudo pip3 install --upgrade pip

mitmproxyのインストール

ここまでの作業で最新版のmitmproxyをインストールする準備が整ったので、以下のコマンドを実行してインストールします。
sudo pip3 install mitmproxy
インストールが完了したら、以下のコマンドのどちらかを実行してmitmproxyを起動します。
mitmproxy --insecure --port 1324
mitmweb --insecure --no-browser --web-iface 192.168.0.3 --port 1324

接続テスト

ここまでで、hostapdとmitmproxyが起動した状態になりましたので、スマホなどの無線LANクライアントをhostapdで作成したアクセスポイントに接続します。
今回は導入を簡単にするため、DHCPサーバーなどのインストールは行っていないため、IPアドレスなどの情報は全て手入力します。
上記までの設定の場合、IPアドレスは192.168.137.2、Proxyサーバーアドレスは192.168.137.1、ポート番号は1324となります。

最後に

ここまでの設定で、スマホのHTTP通信は見えるるようになっているかと思いますが、HTTPS通信も見る場合はmitm.itに接続してSSL証明書をインストールするといった作業が必要になります。

また、前述の通りDHCPサーバーの導入や、mitmproxyを透過型モードで動作させるための設定(iptablesやnet.ipv4.ip_forwardなど)は今回行っていないため、必要であれば以下のページを参考に設定してみるといいかもしれません。

Raspberry Pi 3 アクセスポイント化 〜hostapd〜 - はっとてっくろぐ
Raspberry PiとスマートフォンをWiFiでアドホック接続 - karaage. [からあげ]
Raspberry PI 3 + MITMProxy – Adam Engle
Raspberry Pi Debian Backports · superjamie/lazyweb Wiki · GitHub

2017年2月26日

ScalaMatsuri 2017に行ってきた

昨日と今日は、プログラミング言語Scalaのカンファレンスである「ScalaMatsuri 2017」に初参加してきました。

Scala自体は業務でも個人でもまだ使えていないのですが、前職で少し触る機会があったのと、一緒に行こうという事で勢いでチケットを買ってみた次第です。

1日目

事前に発表された講演内容で、自分のScalaレベルと興味のある分野からセッションを選択しました。

Readable Scala

少し触っていた頃に、"~>"とか今まで見たことない(そしてググりにくい)記号が多くて愕然としていたのを思い出したのですが、「”パラダイムやイディオムを知らないから可読性が低い”という主張は意味をなさない」というのは耳の痛いところでした。また、それらがコードをいかに読みやすくするかに主眼を置いて設計されている事がよく分かったセッションでした。
(そしてsprayが今はもうメンテナンスされていない事を今さら知る。。あとググりにくいのは”tilde greater than scala”みたいにすれば探せるのを知ってだいぶ改善された)

新サービスをゼロから開発してローンチするのに大切だった3つのこと

Twitterに新機能(新サービス)を追加した際の知見として、「まずは上から下までとにかくつないで動かす」「内部状態と変更の流れを管理する(一方向にする)」「ちゃんと名前をつけることが大切」があげられていました。個人的には、旧システムからの移行を一部のモデルから行うためにFutureを導入して解決していったくだりがFutureを理解する参考になりました。

Akkaで分散システムの障害に備える

本セッションでは、「障害を前提としたシステム(アンチフラジャイル)」「レジリエントなシステム」をAkkaでどう実現するかが語られましたが、システム障害に対する今までの考え方や備えを改めさせる可能性を感じました。

ゲームサーバのためのScala/Play

もともとPHPで開発していた自社ゲームタイトルのサーバーサイドをScala/Playで実装した事例として、規模感やインフラ周りのTips集などが語られたので、業種や経緯とかいろいろ思い出しながら聞かせて頂きましたが、Scalaの"better Java"としての事例は今後増えていって欲しいなと思いました。
(FPバリバリで書かれているのかもしれませんが。。)

DMMのAPI GatewayをAkka StreamsとAkka HTTPで作り込んでみた


こちらもPHPで作られた旧認証基盤を置き換えるというお話だったので、いろいろ思い出しながら聞かせて頂きました。プロダクションレベルでAkkaが導入された事例としても興味深かったです。


メタメタにしてやんよ。(メタプログラミングもしくは Shapeless のすすめ)

”入出力がデータではなくプログラム”であるマクロとして、Scalaマクロ(今は使ってはいけない)から、それに代わるScala.metaとshapelessの例をライブコーディングで見ることができました。

Scala & Sparkによるデータ・エンジニアリング 7大レシピ

組織でデータを集めて分析に使うために必要な7つの”レシピ”と、その解決方法を聞くことができましたが、前半のレシピにあったチームへの根回しやデータの品質を高める努力は海外でも同じだったのが意外でした。

ChatWorkのScala採用プロダクト “Falcon” リリースまでの失敗と成功の歴史

動いているサービスをScalaに置き換えるプロジェクトとしては国内有数の規模だったかと思われますが、それだけに苦労も多かった感じがひしひしと伝わる内容でした。

2日目

”アンカンファレンス”という、参加者の投票や参加者の中で発表したい(もしくは聞いてみたい)内容を当日決めるといった形式で行われました。

Ad Serving System on Finagle and Thrift

前日の講演でシリアライズライブラリーのThriftを多く見かけたので、使っている事例を聞こうと選択しました。シリアライズしたデータはMySQLのBLOBに入れる(=インデックス付きのKVS)ソリューションはおっと思いましたが、ScalaScriptをSQLのDML代わりに使う事で解決されたのが印象的でした。

採用担当者CTOぶっちゃけ座談会

各社の採用戦略や求められるエンジニア像が生々しく語られました。オフレコだったので詳しい内容は書けないものの、今回メモった量が一番多いセッションでしたw

Poorman’s Type Classes Revisited

Scala初学者が理解に苦しむ(らしい)implicitについて、なぜこれが導入されたのかをHaskellの例を交えて詳しく解説されました。実は1日目のReadable Scalaでもimplicitについては触れられてたのですが、その時は正直分からなかったのがこのセッションで何となく理解することができました。

JavaエンジニアのScalaの話が聞きたい

もともとJavaや他の言語で開発していた組織の中で、Scalaに変えるメリットや導入に関する悩みをざっくばらんにお話する(ちょっとだけ自分も混ぜてもらった)会でした。ScalaをFPで書くか"better Java"で書くかのさじ加減については、「ミッションクリティカルな部分はFP、(リリースの)速さを求められる部分は非FP」という回答が得られたのは個人的には収穫でした。

Lensの基本と基礎

最後のセッションは、「var使えばよくね?」という自分への戒めとして(笑)こちらを選択させて頂きました。”getter/setterを抽象化する”という例をライブコーディングを交えながらの講演で、こちらも理解できれば可能性が広がる感じがしました。
(LL言語のゆるふわなアクセスをカタい形で持ってくる理解、ではないんだろうな。。)

おわりに

今回初めての参加で多少背伸びし過ぎた感はありましたが、ここ最近自己研鑽の時間を疎かにしがちだったので、いい刺激をもらうことができました。
また、今まではAdTech界隈での採用事例が多かったところに、ぽつぽつ他業界でもScalaが採用されつつあるのが印象的でした。
(特にFOLIOさんのようなFinTech系企業でのScala採用は、Javaの牙城にどれだけ食い込めるのか気になります)