Kuchitama Tech Note

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

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)

Packerにやられた話(´・ω・`)

お久しぶりです。 以前、Chef-Soloを使って、AMIの状態を収束させるフレームワークを作りました。

このフレームワークはGitHubで公開してます。 https://github.com/Kuchitama/ec2_automation

ただですね…

先日こんな記事が…

Packer & Chef-SoloでAmazon EC2のAMIを簡単に作る方法

ネタがダダ被りじゃねーか!!

なにはともあれ、とにかく、packerとやら試してみようと試してみました

結果…

ダダ被りじゃねーか!!

いや、もちろんオレオレフレームワークよりよっぽど高機能ですが…

NeoBundle のChef Cookbookを公開しました

お久しぶりです。kuchitamaです。

最近は、会社のブログ書いたり、会社のブログ書いたり、関Javaで発表したり、会社のブログ書いたりしてて、こっちの方は全く更新していませんでした。

久々の更新で緊張してますが、今日は会社のブログネタを転用して、ここでもChefネタです。 今回は、NeoBundleのCookbookを作って公開したので、ちょっと宣伝してみます。

NeoBundle Cookbook

NeoBundleは言わずと知れた、暗黒美夢王こと@ShougoMatsuさんが作られたVimプラグインですね。 こいつがいてくれるだけで、僕のVim環境は無限の広がりを見せるので、新しくサーバを立てた時に利用できる状態になっていて欲しいわけです。 インストール手順は自分でまとめたのですが、やはりVagrantなどでサクッと仮想マシンを立ち上げていろいろ試してみる時にいちいちインストール手順を踏むのは面倒なので、自動構築するためにCookbook化してみました。 そのため、現状のNeoBundle Cookbookはkuchitama的においしい設定になっていて、ちょっと汎用的でない部分がありますが、そのうち調整していくつもりです。

使い方

NeoBundle Cookbookはgithubで公開しています。

基本的にはChefリポジトリgit clone して、設定を書いてやるだけです。

]$ cd <chef-repository>/cookbooks
]$ git clone https://github.com/Kuchitama/neobundle.git
]$ cd ..
]$ vim localhost.json

{
  "run_list" : [
    "recipe[neobundle]"
  ],
  "neobundle" : {
    "user" : "vagrant",
    "group" : "vagrant",
    "vim_home" : "/home/vagrant/.vim"
  }
}

これで、準備が整いました。あとは、Chefを実行するだけです。

Attribute

NeoBundle CookbookのAttributeは下記の3つがあります。 * user * group * vim_home

userとgroup

vimを利用する権限を設定します。 例えば、vagrantで作成した仮想マシンを使用しているのであれば、userもgroupもvagrantを指定します。 userもgroupも初期値が設定されていませんので、設定する必要があります。

vim_home

vim_homeには、vimホームフォルダを作成するパスを設定します。 大体の場合に、ユーザのホームフォルダ直下に.vimを作成する事になると思います。

knife-soloとBerkshelfを使う

knife-soloとBerkshelfを使うとかなりお手軽にリモートサーバにNeoBundleをインストールする事が出来ます。 それぞれのインストールについてはこちらを参照して頂ければいいと思います。

まず、knife solo init <repository> でknife solo リポジトリを作ります。

つぎに、作成したリポジトリ直下にあるBerksfileを以下のように編集します。

cookbook "neobundle", git: "https://github.com/Kuchitama/neobundle.git"

そして、knife solo prepare <user>@<remotehost>で、作成されたjsonファイルを編集して、knife solo cook <user>@<remotehost>を実行すればOKです。

まとめ

以上、簡単にNeoBundle Cookbookの使いかたについて解説してみました。 最初に書いた通り、とりあえず自分が楽をするために書いたので、かなり汎用化されていない部分があります。 ちょこちょこといじって、 - ブログネタ - もっといいCookbookを作って行こうと思います。 課題としては以下の感じでしょうか。

  • テストを書く test-kitchen serverspec
  • Resourceに切り出せそうな処理を切り出す ** フォルダ権限の変更とか
  • vim_homeの設定が冗長な気がする ** ohaiとかでなんとかならんかなー

この辺、ちまちまと直して行きたいと思います。

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

突然のVimコマンドを作った

なぜ作ったのか

基本的には思いつきが全て。 ただ理由を挙げるとするなら、最近vimでいろいろプラグインを使って遊んでたりするので、 自分でも作ってみようかなぁとか思ってたのが大きい。 今回、プラグインではなくコマンドを作成したのは、ここ(C++でゲームプログラミング 【Vim Advent Calendar 2012】Vim プラグインを github で公開するまで【1日目】を読んだから。

なので、そのうちプラグイン化するつもり。

vimスクリプトについて調べるのには、下の3つの情報源が本当に役立った。 ありがとうございました。

解説(というか自分のためのメモ)

コマンドの定義

ユーザコマンドの定義は次の書式 :command[!] [{属性}...] {コマンド名} {実行するコマンド}

関数を呼び出すにはcall {関数}の書式で、callコマンドを通して関数を呼び出さなくては行けない。 それは、面倒なので、自作コマンドとして定義しておく事で、保存するときの:wとか終了の:qみたいなノリで自作関数を呼び出せる。

属性に-nargs={引数の数}を指定し、呼び出す関数に<args>を引数として指定する事で、コマンドの引数を関数に渡せる。

詳細はここを参照↓

Hack #158: ユーザコマンドを定義する

関数定義

関数のスコープにはグローバルスコープとスクリプトスコープがある。 グローバルスコープは関数名がg:から始まる関数のことで、グローバル域で有効になる。 今回だとg:totuzen関数がそれにあたる。

スクリプトスコープはs:から始まる関数で、その名の通りスクリプトファイル内でのみ有効になる。 なので、s:mozisu関数はスクリプトファイル内からしか呼び出せない。

モテる男のVim Script短期集中講座

日本語を含む文字数のカウント

文字数の取得はstrlen({文字列})だが、普通にutf-8のマルチバイト文字をstrlenすると、日本語の文字は1文字あたり3文字分カウントされてしまう。

:echo strlen('a')
#=> 1

:echo strlen('あ')
#=> 3

これを回避するために、substituteを使って、文字を全て1バイト文字に変換してしまってから、strlenで文字数を数える

substitute({ソース文字列},{置換元パターン},{置換文字列},{フラグ})

substitute("ほげfuga", ".", "x", "g")
#=> xxxxxx

strlen(substitute("ほげfuga", ".", "x", "g"))
#=> 6

名無しのvim使い → Vimスクリプトリファレンス → 03. 変数 → 文字列型

備忘録 Vimのスクリプトでの置換用関数

ソースコード全文

使い方

↑上のtotuzen.vimファイルどこかに保存して、:source totuzen.vimとコマンドを実行すればOK

:Totuzen "突然のvim"とかコマンドを入れると、いい感じに突然の死っぽくしてくれる

書いたはいいが…

ここまで書いて、そう言えばVim Advent Calendar 2012がまだ続いてたなー、vimmerの方々はどうやらクリスマス終了のお知らせを受け取ったみたいだなーとか思ったのだけど、このネタすでに増産されてて車輪の再発名もいいところだった… まぁ、当たり前だよね…

ましてや、はじめてVimプラグインを書いた話 - metropolisなんて、ネタかぶりもいいところ… しかも、僕は後発のくせに特に目新しい機能なんてないしね…

でも、あくまで自分の勉強用に始めた事なのでいいのです。 誰かやってるからって何もしないより、とりあえず自分の手を動かしてみる方がいいよね。 趣味コーディングだしね。

というわけで、アドベントカレンダーには参加せずにひっそりとブログ更新です。 (ちなみに、突然の死の先達たちのコードはまだ読んでないです。プラグイン化まで実現してから、ゆっくりと読ませて頂いて、自分の実装と比較するつもり)

Vimテクニックバイブル ?作業効率をカイゼンする150の技

Vimテクニックバイブル ?作業効率をカイゼンする150の技