おすすめカレーメニュー紹介アプリ "derry" &いかに俺がチキンマサラトマトトッピングご飯大盛りが好きか

カレー Advent Calendar 2015 7日の記事です。

今年からやたらとカレーを食べまくっていて、すっかりカレーエンジニアとして一部では知名度を(多分)上げてきている俺ですが、好きが高じてカレーアプリを作ってしまったのでまず宣伝させてください。

"derry" と言います

おいしいカレーを提案 - derry(デリー)
カテゴリ: フード/ドリンク, ライフスタイル

どんなアプリ?

  • 検索したけど沢山お店が出てきて迷ってしまう
  • 検索時の設定が多すぎて調べるのが大変

というありがちな問題を解決した

  • 設定の必要なし
  • お店ではなく そのお店のおすすめメニュー
  • 起動してシェイクすると 自動的に一品 のみ紹介
    • 別のメニューを見ることも出来ます

する、つまり「カレーが食べたい時に起動してもらえれば、一品紹介するので迷わずそこに食べに行ってください」というアプリです。

カレー大好きな同僚達 "カレー四天王" (五人) で作りました。

チリチリについて語りたい

そんなアプリを作る元になった、俺のまさ原点とも言うべきカレー屋さんの、宇宙一好きなカレーを、今日はderryのレビューを使ってご紹介します。

このレビューを書くためにアプリを作ったと言っても過言ではない、 "チキンマサラトマトトッピングご飯大盛り" @ Curry House チリチリ です。


渋谷に勤めてる人の特権、それは平日の11:00〜15:30のみ営業で土日・祝は休みなこのお店に行けるということだ。

店内にも書いてある"体調をよくするカレー"の要となるルーは、インドカレーをベースに各種スパイスが散りばめられ、一皿分に一つ玉ねぎが入っている。

このルーが共通で、ミックスやビーンズやポークカレーが展開されるわけだが、ここは是非辛口であるチキンマサラを頼んで欲しい。そしてトマトのトッピングを必ずつけること、お兄さんとの約束だ。トマトの程よい酸味がルーの味を後押しし、引き立ててくれる。

Shinya Tsunematsuさん(@tnmt)が投稿した写真 -

少し大きめのチキンは一口で食べず、スプーンで食べたいボリュームにくずしながら食べるのがオススメだ。

程よくほぐれるチキンの断面にルーが触れ、そして徐々に染みていく様は、初々しいカップルが初めて手をつなぎ親密さを増していく様子と似ている。新鮮だが情熱的なこの出会い、これもこのカレーを至高たらしめる要素の一つだ。

そしてライスとトマトとチキンを一スプーンに乗せて口に運ぼう。チキンを多め、トマトをいったん乗せなくしてみるのもまた、ありだ。どの一口も都度新しい感動を与えてくれるだろう。

そしてこれを楽しみきるには通常のゴハンの量では少し足らない。あえてゴハン大盛りを紹介する理由はここにある。

食べ終わった後に残るのは、スポーツの後のような爽快感。「◯◯のカレーが食べたい」はよく言うのだけれども、ここに関してはどうしても「チリチリに行きたい」と言ってしまう。このカレーは単なる食事ではなく、チリチリそしてチキンマサラという行為なのだ。


いかがでしょうか。

少しでも美味しさが伝わってもらえたら嬉しいです、そして気になったら是非足を運んでみてください。

"derry" では今後もこんな感じで自分たちで食べてきたカレー屋とおすすめメニューを紹介していきます。中にはちょっと様子のおかしいレビューもありますが、そこは優しく見守ってやっていただければ。

チリチリに出会ったのが4年前。今でも週一で足が向いてしまう名店中の名店、この世にこの店をオープンしてくれた店主ご夫婦に畏敬の念と、アプリを作るインスピレーションを授けてくれた感謝の念を忘れず、今後も通わせていただきます。

Jenkins ユーザ・カンファレンス 2015 東京に行ってきた&発表してきた

Jenkins ユーザ・カンファレンス 2015 東京
東京で"JenkinsとPuppet+ServerspecでインフラCI"というタイトルで発表してきました。

Jenkins自体は広い用途で利用されているし、セッションを聞きに来られる方々も様々だと思っていたので、発表の準備でPuppetやServerspecの説明をどれくらいするかで悩んだりしましたが、どうしてCIをしたかったのか、時系列で流れを説明した方が伝わるのではないかと考えこんなスライドになりました。
ビルドの内容はまんま載せたので、同じようなことをやりたい方の参考になれば幸いです。

"ask the speaker"のセッションで @kohsukekawa に質問したり、実際に失敗したビルドログを見て相談にのっていただいたりして感謝です。
サイバード社さんのサーバ構築周りの作りこまれたフローも刺激になりましたし、セッション後に色々と情報交換出来ました。

Jenkinsはまだ使い始めて浅いので、こんな風に使える・使ってるんだー!というシーンやアイデアを沢山知れて勉強になりました。
"これからやりたいこと・まだ出来ていないこと"に載せた部分も解決出来そうと分かったし、"鉄は熱い〜"ということでモチベーションが高いうちにすぐ改善しよう。

MySQL Casual Talks vol.7に行ってきた

今回は後輩エンジニアである @hfm ことおっくんの社外勉強会登壇デビュー戦を応援に行くのが1つ大きな目的。

当日の様子はtogetterから伺えます。肝心の彼の発表ですが、TLから拾う限り

  • やばい話キタ
  • タイトル
    • 地獄感
    • 既につらい
    • 地雷臭
  • 4.0ハラスメント
  • 怖すぎる
  • ガチュアル
  • ただただ、すごい

と参加されていた皆様を恐怖のドン底に陥れるには十分な内容だったと感じます。スライドはこちら

では実際はどんな感じで進めていたかというところで、スライドの最後やおっくんの後日エントリに先輩エンジニアへの謝辞はありましたが、手助け出来たのはほんの少しで、ほぼ一人で頑張ったというのが合っているかなあと思います。

検証や当日の手順などメンテ完遂までに試行錯誤した記録として、Issueはマイルストン内に大小ありつつも34 issues、1つのIssueに133コメントがついたものもありました、すごい。他にもこの1年色々な実績はあるんだけれど、このタスクに関してはホントによく頑張った。

おまけで後日談。

メンテを終えて2日後、いきなりおっくんが銀髪になって現れたのにはビックリして、志村けんばりに二度見したのも良い思い出。

登壇された皆様、主催いつもありがとうございます @myfinder、お疲れさまでした。

Vagrantのshell provisionerでApacheのビルド済tarボールをOSバージョン毎に作る術

Pepabo AdventCalendar 2014の10日目の記事です。昨日はあんちぽサンタ記事を見て入社したlaughkでした。明日はhisaichi5518です。

ソフトウェアのビルド方法について。

  • 今年は特にセキュリティ関連でCVE対応が多かったり
  • 経年したサービスのOSは刷新したいけど同じミドルウェアのバージョンを使いたかったり

な時に、rpmをビルドするのはしんどい(弊社は主にRHELクローンなディストリを使っています)ということで、今年は社内でVagrantを利用した、ビルド済ソフトウェアのtarボールを作るのが流行りました。

今日はその一例としてApacheのビルドについて。サンプルのプロジェクトを tnmt/vagrant-build-apache22に置きました。

git clone https://github.com/tnmt/vagrant-build-apache22
vagrant up cent6_build_apache22
vagrant up cent7_build_apache22

するだけで、CentOS6, CentOS7用のApache 2.2のビルド済tarボールが出来て、vagrant up したカレントディレクトリに配置されます。

ディレクトリ配置は

├── Vagrantfile -> vagrant/Vagrantfile
└── vagrant
    ├── Vagrantfile
    ├── build-apache2.2.sh
    └── install-facter.sh

で、スクリプトは

  • build-apache2.2.sh : Apacheビルド用
  • install-facter.sh : facterインストール

の2つです。今回はVagrantのVirtualBoxのイメージにhfmvagrantcloudのイメージを使っています。Vagrantfileに記載されている hfm4/centos6, hfm4/centos7がそれぞれそうですね。ビルド済みのtarボールは各OSに配置して展開するだけですぐ使えます、お手軽。

以降は何故この方法をとったかと、工夫しているについて。

何故シェルスクリプトか

大きくは2つ

  • ちょっとした修正を加えやすいようにしたい
  • OSのバージョンが変わってもそのまま同じスクリプトを利用したい

というところでしょうか。もしこれがrpmをビルドしようとするとspecファイルで差異を吸収することになりますが、シェルスクリプトの方が読み書きに慣れている人が多いのでメンテしやすさでもメリットがありました。スクリプトの内容自体はなるべく実際にビルドする手順を再現するだけのシンプルに保つように心がけています。

また、ソースの取得もシェルスクリプト内で行っているのでビルドに必要な環境(今回のサンプルにあるようなgitリポジトリ)はVagrantfileとスクリプトだけで良く、管理が楽というのもあります。1枚のスクリプトにしておくと取り回しも便利です。

Apacheの場合もパッチの追加やモジュールを同時ビルドしたり(サンプルプロジェクトではmod_extract_forwardedも同時にビルドしています)、他サービスに持っていってconfigureオプションを変えたりが簡単に出来ますし、先の例の通りOSのバージョン差も全く気にせずに済んでいるのが分かるかと思います。

facterを使ってる

これは工夫というほどではないですが。

弊社では構成管理ツールにPuppetを利用しており、社内で共用しているベースのVMイメージは既にPuppetがインストールされているため、Facterもインストール済ですが、最小構成のOSインストールイメージにはFacterがインストールされていないため、今回のスクリプトでは build-apache2.2.sh から install-facter.sh を呼び出しています。

さて、そのFacterは何に使っているかですが build-apache2.2.sh の こちら でOSのバージョンなどの取得に利用しています。シェルでも取れるけどこんな感じで値が取れるという例です。

platform=$(
    arch=$( facter architecture )
    os=$( facter operatingsystem )
    release=$( facter operatingsystemrelease)
    echo ${os}${release%.?}-${arch}
)

スクリプト内ではこれをビルド済みのtarボールの名前のsuffixに利用しています。

実際これをどう運用しているか

先にPuppetを利用していると書きましたが、そのリポジトリにtarボールをコミットしておき

define tarball_deploy (
  $source,
  $dest
) {

  $command = "tar xzf ${name} -C ${dest}"

  file { $name:
    source => $source,
    notify => Exec[$command],
  }

  exec { $command:
    refreshonly => true,
  }

}

のようなdefineを作っておけば

$version = "2.2.29-0"
tarball_deploy {
  "/usr/local/src/apache-${version}.tar.gz":
    source => "puppet:///modules/web/usr/local/src/apache-${version}-${os}.tar.gz",
    dest => '/usr/local';
}

といったマニフェストで展開が可能です(※ ${os}はカスタムファクター)

以上、最近はパッケージと適材適所でこのように素朴にビルドするのを組み合わせて効率化を図っています。素朴にビルドする例としては他にもanybuildを利用したものなどがあります。こちらは@lamanotramaスライドがありますので御覧ください。

はー今年は何だか色々なものをいっぱいビルドしたなー、来年は平和だといいですね…。

Fedora 21へのアップグレード

アップグレード定期報告。

オフィシャルの案内にある通り、Fedora 21からはfedupに--productというオプションが必要。

https://github.com/wgwoods/fedup/blob/master/fedup/commandline.py にもある通り

  • server
  • cloud
  • workstation
  • nonproduct

から選ぶ。以下を実行

sudo fedup-cli --network 21 \
  --product nonproduct \
  --nogpgcheck \
  --debuglog ~/fedup21debug.log

--nogpgcheckは無しだと

setting up repos...
getting boot images...
.treeinfo.signed

Downloading failed: invalid data in .treeinfo: File contains no section headers.
file: /var/cache/system-upgrade/.treeinfo, line: 1
'-----BEGIN PGP SIGNED MESSAGE-----\n'

なエラーで止まってしまった為…良い子はマネしないでね!