2019年6月30日

ScalaMatsuri 2019に行ってきた


前回の投稿が「ScalaMatsuri 2018に行ってきた」で、その間何も投稿していなかったのかと軽くショックなのですが、今年は初日が平日開催だったのでお休みを頂いてお邪魔してきました。

1日目

Scalaライブラリを作る前に知っておきたいメンテナンスのこと
ライブラリを提供するにあたって、どうやったら使ってもらいやすいか(特にJavaとの相互運用性)や、リリースバージョン間の互換性や依存関係など、普段のサービス開発とは異なった視点が必要なところは面白そうに感じました。

Scalaにおける型クラス入門
”型クラス≒型システムにより支援されたストラテジパターン”という切り口が個人的にしっくりきたのと、Scala2のimplicitとScala3からのdelegate-forに書き方が変わるという情報が収穫でした。

コードで理解するPlayFrameworkの脆弱性
PlayFrameworkで過去に報告された脆弱性を例に、何が原因でどう対策したのかの解説が行われたのですが、どれも何気に普段の開発でも踏みやすいような内容だったので、後からじわじわと空恐ろしくなりました。。

ScalaプロジェクトでEffを使用する利点
Futureとfor式を使ってScalaっぽく書きたい(けど挫折した)身としては、より便利とおすすめされるEffはとても気になりました。

こんなに違うScalaとKotlin
ScalaとKotlinの構文的やリストの挙動の違いを見て、Scalaと構文が似てる気持ちでKotlinに入門すると痛い目を見そうな感じがしました。

DOT計算をやさしく説明する
不勉強でうまく感想を書くことができませんが(汗)、プログラミング言語が満たす性質を証明する何か(チューリング完全?)のような印象を受けました。

ハイパフォーマンスScala
ExecutionContextやリストの特性、Boxing/Unboxingの挙動に気を使うことでより高いパフォーマンスを出すコードを書くためのコツを知ることができました。計測大事。

Scala💛Graal
個人的に最近気になっているGraalについてTwitter社での取り組みについての発表でしたが、GraalVMとGraalは異なるもの(後者はJavaでのJIT実装)で、JVM標準のJITよりモダンなコードで書かれたGraalをチューニングすることでパフォーマンス改善を行うための試行錯誤の過程が面白かったです。

継続とDI
オブジェクト指向言語でよく行われている委譲とDIに対し、関数型言語では”継続”というアプローチを取ることでアドホックに合成がしやすいなど、両言語の特性を使えるScalaならではの使いどころなどが説明されました。

2日目

仕事でScalaを使おう - Arm Tresure DataでのAirframe活用事例
Scalaのロギングライブラリを探していた際、たまたま見つけたのがairframe-logで、そこからちょっと気になっていたので今回いい機会となりました。

いかにして我々は10年もののPerlプロダクトをScalaでリプレースしたか
”レガシーシステムをScalaでリプレースする”は鬼門のように感じていた時期があったのですが、こうやって着々と完走した事例が紹介されるのを見ると、必要なのはやりきる力なんだと改めて思いました。

over40の転職成功事例(オフレコ枠?)
今いらっしゃる職場に至るまでの経緯(しくじり)とその対処法、組織での振る舞いや心構えなどの発表と議論が行われました。

ScalaでWeb開発するときのデファクトな構成が知りたい
Webフレームワーク、DBライブラリ、JSONライブラリのそれぞれで、参加者の方が業務でよく使われているプロダクトの多数決とそのいいところの共有が行われました。

gRPC gateway with Scala
セッション後の質疑応答の中で、実務としてのマイクロサービスでの開発や運用が普通に語られているのが印象的でした。

From Go To Scala Easy vs Simple
Go言語とScala(とKotlin)の"Simple"と"Easy"の感じ方の違いや、C++やSwiftも参戦しての熱い議論(プロレス)が行われました。みんなちがってみんないい。

Finagle(thrift) admin-page probrem
Finagleでやり取りされるthriftのraw dataが格納されたMySQL(KVSとして有名!)の管理ツール画面フォームを、thriftのコンパイラが生成するASTより生成する発表が行われました。

おわりに

Scalaを触る時間が少しずつ増えてきたせいか、アカデミックな内容からより実務的な内容を選択したような気がしました。implicitは怖さが少し軽減されてきたので、次は既存の課題をScalaらしい関心の分離が行えるような取り組みを行っていきたいと思います。

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