Kuchitama Tech Note

はてな記法がいつまでたっても覚えられないので、はてなダイアリーからマークダウンが使えるこっちに引っ越してきました。

Scala+PlayでWebSocketプログラミング

最近、TypetalkにWebSocketを利用したAPIが追加されてて、WebSocketに興味を持つようになりました。

ストリーミング | Typetalk API | Nulab Developers

で、クライアントサイドのプログラミングだけでなくサーバサイドもちょっとやってみたかったので簡単にサンプルを作ってみました。

WebSocketで接続したら、じゃんけんが出来ます。 使い方などはREADMEに記載しているので、良かったら試してやってください。

Kuchitama/socket-janken · GitHub

今回、サーバサイドの実装には得意のPlayframeworkを使ってScalaで実装しました。 PlayframeworkはAkkaのアクターを使ったWebSocket実装をデフォルトで提供してくれているので、かなり簡単に作れました。 作ったサンプルアプリはHerokuで公開してあります。

Play2.3から、WebSocketの利用方法が2種類に増えたみたいなんですが、サンプルとか記事が見当たらなかったので、多少でもこれからPlayでWebSocketを試してみようかという人の助けになれば幸いです。

あと、初めてHerokuボタンを設置してみました。

Deploy

こっちも試して頂けると幸いです。

AnsibleをProxy環境下で利用する

Ansibleをなんで存在してるのかよくわからない仕事の邪魔にしかならないようなProxy環境下で利用する際のメモ書きです。

入門Ansible

入門Ansible

Proxy環境内の実行マシンからAWSなどのProxy環境外のサーバに対して操作を行う場合を想定しています。 対象のOSはCentOS6で、Vagrantを利用して下記のBoxからイメージを立ち上げ、Ansibleのインストール、実行を行いました。

CentoOS6.4 https://github.com/2creatives/vagrant-centos/releases/download/v6.4.2/centos64-x86_64-20140116.box

目次

  • Proxy環境下でのAnsibleのインストール
  • Proxy環境下でのAnsible実行
  • Proxy環境下のCentOS6でAnsibleを実行

Proxy環境下でのAnsibleのインストール

下ごしらえ

まずはAnsibleのインストールを行います。 とりあえず、一通りhttp, https, ftpに対してProxyを通すように設定しておきます。 インストール自体にはこの設定は不要かもしれませんが、どうせProxy環境から出れない以上は必要なので最初にやってしまいます。

echo "export http_proxy=<PROXY_HOST>:<PROXY_PORT>" >> ~/.bash_profile
echo "export https_proxy=<PROXY_HOST>:<PROXY_PORT>" >> ~/.bash_profile
echo "export ftp_proxy=<PROXY_HOST>:<PROXY_PORT>" >> ~/.bash_profile
source ~/.bash_profile

yumコマンドもProxyを通すように設定します。

sudo sh -c 'echo "proxy=https://<PROXY_HOST>:<PROXY_PORT>/" >> /etc/yum.conf'

インストール

ここまで出来たら、Ansibleのインストール作業に入ります。

まずは、rpmの取得から。 rpmコマンドの実行時にプロキシを通すように指定します。

sudo rpm --httpproxy <PROXY_HOST> --httpport <PROXY_PORT> -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpmが取得出来たら、yumコマンドを使ってAnsibleとそのた必要なものをインストール/アップデートします。

sudo yum install -y ansible sshpass
sudo yum update -y openssh

これでAnsibleはインストール出来たはずです。

Proxy環境下でのAnsible実行

Ansibleのインストールが出来てもそのままでは、Ansibleの実行ができません。 なぜなら、AnsbileがSSHでリモートマシンに接続するときにProxyを通らないから。

というわけで、corkscrewでProxyを通してSSHが実行出来るようにします。 まずは、corkscrewのインストール

cd /tmp
curl -o  corkscrew-2.0.tar.gz http://www.agroman.net/corkscrew/corkscrew-2.0.tar.gz
tar -xzf corkscrew-2.0.tar.gz

cd corkscrew-2.0
./configure
make && sudo make install

corkscrewがインストールできたら、ssh_configに設定を追記します。

sudo cp /etc/ssh/ssh_config /etc/ssh/ssh_config.back # 一応バックアップしておく
sudo sh -c 'echo "ProxyCommand /usr/local/bin/corkscrew <PROXY_HOST> <PROXY_PORT> %h %p" >> /etc/ssh/ssh_config'

これで、SSHもProxy経由で実行出来るようになります。

Proxy環境下のCentOS6でAnsibleを実行

どうもCentOS6は癖があるようで、ここまでの手順を完了していてもAnsibleをきちんと実行する事が出来ません。 (参考 https://groups.google.com/d/msg/ansible-project/ExWKdVE7mwQ/ZtycBhQ4mt4J

というわけで、Ansibleの実行時に -c ssh とオプションに指定してやる必要があります。 毎回、-c オプションをつけるのが面倒な場合は、 ansible.cfgファイルにtransport = smart を追記してやれば良さそうです。 -cオプションできちんと動作する事は確認しました。

ansible -m setup -u <USER> -k -c ssh

関西Scalaビギナーズでsbtについて話してきました

ついに、ついについに関西Scalaビギナーズで発表しました。ということで、感想を殴り書き

関西Scalaビギナーズ

とりあえず使えるSBT

発表内容としては、とりあえずちょっとScalaの入門書かなにか読んでみて、PlayFramework!でScala使いたいというぐらいの人向けにSBTで詰まる事が無いよう最低限sbtを使う方法をまとめてあります。

資料にも発表にも入れ忘れていたのですが、.sbtファイルを編集するにあたって非常に大事な事があります。

それは

.sbtファイルでは式の後に空行を挟まないといけないこと

です。

ご注意ください.

発表するまでは、この発表がホントにビギナー向けに作ったけど、参加者って実は想定しているほどビギナーじゃないんじゃなかろうか? という不安がありました。

しかし、発表後初心者向けにワークショップもどきをやってみた感触だと、この内容でも役立ててもらえそうな感じがあったので、それは大丈夫のような気がしてます。

ワークショップ

今回は、後半はいくつか平行してワークショップやもくもく会、座談会が行われました。 僕も1セッションワークショップを担当しました。

何をやるかもろくに考えてないまま突入したワークショップでしたが、それでも参加してくださる方がいらっしゃって嬉しかったです。 ただ、内容はぐだぐだになってしまった感がちょっとあり申し訳ない感じもありました。 最低限、環境構築はステップをまとめておくべきだったと反省しています。

ワークショップの内容とサンプルコードはGitHubにまとめ直してあるので、これからScalaを始めたい人に見て欲しいです。

もしくは、これからScalaを始める人を教える人に、ちょっとでも参考になると嬉しいです。

https://github.com/Kuchitama/scalakb4_workshop

ワークショップでは上記のStep2までをやってみようという感じで進めました。 機会があればちゃんとリベンジしたいなぁ。

お知らせ

10月にプログラマーズナイトというイベントがあります。 DJの流す音楽を聞きながら夜通しエンジニアトークするイベントです。 飛び込みLTも歓迎なのでぜひぜひご参加ください。 私もスタッフとして参加してます。

EMLauncherのユーザ登録システムを公開しました

EMLaucherにメールアドレスを登録するEMLauncherResiterというシステムを自作しました。 EMLauncherRegister

EMLauncherについてはこちら

EMLauncherは開発元のKLabさんでは、Googleアカウントを利用した認証を使っているためか、メーあるドレスの登録機能がなく、登録するためには直接SQLを叩いて登録する必要があります。

https://github.com/KLab/emlauncher/blob/master/config/emlauncher_config_sample.php#L30-L36

EMLauncherの機能の検証にはこれで充分なんですが、会社などで利用する場合には、毎回SQLを叩いていられないので、メールアドレスの登録機能を開発することにしました。 本来なら、EMLaucherに機能追加してPullRequestを送るべきなんだと思いますが、残念ながら私は、PHPはある程度読めますが、書けないため、別のアプリケーションとしてRubyで実装してしまいました。

基本的にセキュリティは下記のようにAWSのSecurityGroup任せにしてありますが、登録するメールアドレスのドメインを限定させる事もできます。

環境のイメージは、↓の感じです。

あまり需要もないような気がしますが、せっかく作ったので公開します。

Clojureエンジニア交流会に参加してきました

AAAで喋った翌日に大阪でClojureエンジニアの交流会に参加してきました。

大阪でClojure勉強会

経緯

にゃんぱすーでバズった(?)nyampass@tnoborioさんが開催してくださった会です。 (バズの経緯はこちら)

一応、「はじめてのClojure」出版記念という名目で北は北海道から南は九州まで全国ツアーをしているそうです。 (が、著者割引の書籍は前日の名古屋で完売したため買えず。残念…)

はじめてのClojure (I・O BOOKS)

はじめてのClojure (I・O BOOKS)

Twitterとかで tnoborioさんが全国行脚みたいなの構想してるのは、ちょっとだけ補足してたのですが、超個人的な事情から6月〜つい先日までめっちゃ忙しくて、それ以上のキャッチアップも何もできていなかったのですが、ある日 @ykomatsu0 さんにDM頂いてこの会の存在を知りました。 そして、超忙しいのにドストライクに用事がなく、奇跡的に参加することが出来ました。

この日のツイートは #jusoclj のタグをつけています。

やったこと

今回の基本的な流れとしては、

  • 会の趣旨説明 by @tnoborio さん
  • 軽く自己紹介 by 参加者全員
  • LightTableハンズオン
  • もくもく会
  • LT
  • 懇親会

って感じでした。

自己紹介タイム

みんなで軽く自己紹介をしました。 この時に @tnoda_ さんは資料用意してのLT気味に自己紹介をしてくれました。

2012年末にmitori_cljなるものを主催されてたそうで、 これはいいイベントで参加したかったなぁと思いました。 こんなイベントが開催されていることに全く気づけなくで残念でした… (これに参加されてる方、Kyoto.cljとかClojureお菓子会でつながってたはずなのに、なんでアンテナ引っかからなかったんだろ…)

自由にパクっていいとのことなので、いつか参加 or 主催 したいです。

LightTable

@tnoborioさんにLightTableの使い方をハンズオン形式で教えてもらいました。 触ってみた感想としては、使いやすいとかわかりやすい以前に、 なんか面白い って思わせてくれるIDEでした。 いろいろいじってみて、vimキーバインドにしたりゴニョゴニョしましたが、やっぱり初めて触るのでスグには手に馴染みませんでしたが、Pluginや設定次第かな〜という気がします。 今回のもくもく会では、とりあえず手に馴染んだvimを使ったほうが作業がはかどるので、早々に使うのを止めましたが、もうちょっと時間があるときにゆっくり触りたいと思います。

もくもく会

実は1年ほど前に2つほどClojure製のサービスをherokuで運用していたのですが、全くメンテしていなかったので、そのメンテを行っていました。 ちなみに、そのうちの一つははてなブログRSSをカテゴリでフィルタするサービスで、この記事のサイドバーに出しているRSSリンクはそのサービスを利用しています。 やってることは、通常のRSSを取得して、指定したカテゴリに一致する記事の要素だけをフィルタリングしているという超簡単なことなのですが、あまり効率とか考えずに実装していました。 なので、パフォーマンスチューニングをちょっとやろうかなぁと思って、昔書いた実装を思い出しつつ、チューニングできそうなポイントを探していました。 で、ポイントの一つとして取得した結果をしばらくキャッシュしてサーバ間通信を減らそうと思って、こんなキャッシュライブラリを見つけました。

clojure/core.cache

のんびりドキュメント読んでたら、時間がなくなっちゃってちゃんと組み込みできませんでしたが、だいたいの感触はつかめたので、適当に時間のあるときに組み込もうと思います。 もし、他にいいキャッシュライブラリ知ってる方がいらっしゃればご紹介ください。

LTタイム

Clojureでのゲームプログラミングの話

nekoie(@rnkv)さんにはClojureAndroidなどのスマートフォン向けゲームプログラミングについて教えてもらいました。 libGDXというゲームフレームワークでもClojure開発をされてたそうで、デモも見せてもらったんですが、今日の発表はUnityでした。

う〜ん、Clojure幅広い… 資料はこちらで公開されています。

ProjectEuler の結果チューニング

cuzic0さんは、もくもく会中にProjectEulerのProblem 10を説いていたそうで、ご自身の回答とGitHubなんかに公開されてる他の人の回答の実行速度比較を出されていました。 で、どうにもパフォーマンスが出ないという問題を、みんなで寄ってたかって(と言いつつほぼ@tnodaさんの功績)チューニングしてました。 結果、@tnodaさんのこの記事がめっちゃ効きました。

Java の配列を利用してメモリと時間の壁を突破する.

私は基本的にWebプログラマーでよっぽどのことがないと、実行速度のチューニングをする機会はない(あってもSQLのチューニングやキャッシュ化ぐらい)ので、いい勉強になりました。

懇親会

nyampassのこととか、Tokyo.cljのこととか、なごやこわいのこととか色々話しました。 あと、Scalaのことも話しましたね。 話してるうちにちゃんとSICP読まないとなーって気分になってしまいました。 ちょっと、頑張っちゃおうかなぁ。 でも、その前にはじめてのClojureを読まねば。

感想

自分のリアルな生活圏の中にClojure使ってる人がいないし、最近仕事もプライベートもScalaRubyばっかり書いてて1年ぐらいClojureを使ってなかったんですが、やっぱりClojureも楽しいですね。 それに、つかってるユーザが根強いです。 多くはなくても、こだわりをもって使ってる人が多いので、話をしてて非常に楽しかったです。 Kyoto.cljを開催して以来、ちらほらと断続的に第2回の開催を呼びかけられるんですが、 本当に需要があるのかつかめきれずずっと放置になってました。 でも、今回の勉強会に参加してやっぱりたまにはClojureユーザが集まる機会が必要だと感じました。 今は、ScalaMatsuriを控えていて、しばらくはScala漬の予定ですが、一息ついたらまた本格的にClojure活動を再開しようと思いました。

GitリポジトリとPackerを連携させるPackerRemoteをリリースしました

PackerをHttpリクエストで実行するPackerRemoteというツールを作りました。

Packerについては本家とか、Ryuzee.comさんとか、あと手前味噌ですがFuRyuTechBlogなんかを見て頂けるといいかと思います。

で、PackerRemoteなんですが、何がしたかったかというと、PackerでProvisionerとして実行するChef-Soloリポジトリや、シェルスクリプトをGitHubやBitBucketで管理して、Pushされたタイミングで、マシンイメージを新しく作り直して欲しかったんです。 Pushのタイミングで実行してマシンイメージを作り直す事で、常に最新状態に保てて、マシンイメージの管理コストを下げる事が出来ます。

やりたい事のイメージとしてはこんな感じ↓です。

GitリポジトリのServiceHookでHttpリクエストを受け取ったら、

  1. リポジトリをpullして
  2. packer buildを実行する

という一連の動作を実行してくれます。

で、ちょうどパーフェクトRubyを読んで、コマンドラインツールとかGemとかSinatraとかの扱いを、「あーこんな感じかぁ」程度にはわかってきたので、いっちょ自分で作ってみる事にしました。 (Goじゃなくてすいません…)

本当に最低限の機能しかなくて、機能強化はしていきたいんですが、とりあえず動く事は動くので、えいやっと公開しちゃいます。 ドキュメントとか超適当な英語書いてるので、「お前は何を言っているんだ」状態になったらすいません。 ここのコメントでも、TwitterでもGitHubのIssuesやプルリでも何でもいいのでご意見くだされば、対応します。

最後に

それJenkinsで出来るよとか言わないでね。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)