#yapcasia 2014 に行ってきた

今年はタイミングよく休みが取れそうだったので、8/29(金)と8/30(土)の2日通しでYAPC Asiaに参加しました。

Perlの退潮とエンジニアのお祭り

最も印象的だったトラックは、@dankogaiさんのSwiftの発表です。寝坊したため聞きそびれましたが、イベントレポートにとても興味深い一節がありました。

perlが選択されなくなってきているのは認めざるを得ないが今すぐなくなることはないし,言語は一つではないのでPerlマインドをシェアしつつそれをシフトしていけるようにしておくことが大事

実際、Web開発の世界で定番と呼べるようなコマンドラインツールで、比較的最近開発されたものの実装言語を見てみると、だいたいnode.js/Ruby/Python/Goのいずれか。「Perl製の便利ツールが出たぞ!」という話はあまり聞かないです。

Webアプリの世界においても、Perlは下火なようにみえます。昔からやっているサービス等で、社内にメンテナンスを継続する必要のあるPerl製サービスがあるとか、社内にPerlの知見と人員があるとかいった会社では今後もPerlを使い続けるだろうけど、スタートアップが選ぶのはPHP >= Ruby >> Python で、Perlはリストにも上らない。

実体験としても、Perlはさまざまな書き方を覚える楽しみがあって、ちょっとしたスクリプトを書くのはとても楽しいです。しかし、他人の書いたコードを読むのは大変だし、Perlで大規模なアプリケーションを作るには十分な規律が必要そう、という印象を受けます。

日本のPerl Mongerの代表的な人物の1人から、「perlが選択されなくなってきているのは認めざるを得ない」という発言が出てきたのは、今回のYAPCで一番印象的な出来事かな、と思います。

一方で、「Perl」の名を関したカンファレンスが1,300人もの参加者を集めるのは驚異的。同規模の技術系イベントとしてはWordpressのイベント(Wordcamp Tokyo)がありますが、こちらは入場無料。スポンサーチケットの来場者が多いとはいえ、500名の来場者が自費(3,000〜5,000円)でチケットを購入して来場するという吸引力の強さは、他のイベントにはないものです。また、来場者や発表者のバックグラウンドも必ずしもPerlだけではない。YAPC 2013の「エンジニアのエンジニアによるエンジニアのためのお祭り」という標語は、今年も受け継がれているように感じました。

個別のトークについて

Mojoliciousを使ったwebアプリケーション開発 実践編

YAPC 2014のサイトのコードを題材にして、PerlのMVCフレームワークを使った開発スタイルを学ぶトークでした。Perlは100行までの世界しか知らないので、未知の世界を垣間見れたのは良かったです。

この発表中に、YAPC 2014のコードがGitHubに上がってることを知ったので、その後サイトの英語の誤りを修正するプルリクエストを送ったりしました(@yusukebeさんにマージしていただきました!)。

Java for Perl Mongers

Javaは言語としてはイケる子だというような発表でした。Javaの欠点としてよくいわれるポイントは、だいたいはIDEが何とかしてくれる。でも、JVNの取り扱いだけはどうしても大変みたいです。。。

Lightning Talks Day 1

PECLのコミッタの方が登壇したのが印象的でした。PECLの各モジュールのメンテは個人の情熱で行われているとのことで、某モジュールのバグが5年たっても直らないとか、某モジュールが某OSでインストールできなくて泣きそうとかでも無闇に石は投げないようにしようと思いました。

半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情(5.6対応)

2日目の最初に聞いたトーク。非常にテンポよく進む、楽しいトークでした。内容面でも、最近のPHPのラクさを支えるComposer、PSR、IDEといった要素をしっかり紹介しているのが好印象でした。

それでも、ベストトーク賞を取ったのは驚きです。自分が聞いた範囲ではベストトークでしたし、実際投票もしましたが、まさか受賞するとは…。Perlの人は(というか、RubyやPythonの人も)PHPを嫌っている人が多いと思ってたので、とても意外。実際、ランチのときも隣の席で「最近はPHPやってる」「自分はPHPはグチャグチャすぎて無理」みたいな会話が繰り広げられてました。PHPがメインだけど他の言語にも手を出してるPHPerの人も結構参加していて、そういう人達の票がドサっと入った結果なのかな、と。

Perl入学式 in YAPC::Asia Tokyo 2014

自分は『初めてのPerl』をひと通り読んだ程度の知識はあるので、完全なPerl初心者というわけでもないのですが、復習も兼ねて参加してみました。受講生5人に対しTA1人という非常に至れり尽くせりな体制で、「全員が分かるまで教える」というスタイルを貫いているのが印象的でした。「Perl入学式」のコミュニティの分厚さを感じました。

Lightning Talks Day 2

立ち見でした。自分以外にも、座席が無い人が大勢。。。

まとめ

  • 「perlが選択されなくなってきているのは認めざるを得ない」
  • 一方で、Perlコミュニティは非常にアツい
  • Perlの文化が他の言語にも伝播している
  • 会場のキャパシティは無理があったのでは

『リーダブルコード』読書メモ 第1章・第2章

理解しやすいコード

  • コードを書く上で最も重要なコンセプト:コードは理解しやすくなければいけない
  • 読みやすさの基本定理:コードは他の人が最短時間で理解できるように書かなければいけない

名前に情報を詰め込む

明解な単語を選ぶ

Webページを取得するなら、getPage()よりfetchPage()やdownloadPage()の方が明確

tmpやretvalのような汎用的な単語を避ける

  • tmp という名前は、生存期間が短くて、一時的な保管が最も大切な変数にだけ使う
  • ループイテレータ(i,j,k等)は使ってもよいが、複数ある場合はそれぞれに意味のある名前をつけるべき
  • tmp・it・retval のような汎用的な名前を使うときは、それ相応の理由を用意しよう

抽象的な名前よりも具体的な名前を使う

DISALLOW_EVIL_CONSTRUCTORS → EVILがどういう意味か分からない → DISALLOW_COPY_AND_ASSIGN

–run_locally → –extra_logging と –use_ local_database の2つに分割

直交する概念は無理に 1 つにまとめようとせずに、別々に使えるようにするといい。

名前に情報を追加する

  • 変数名に値の単位を入れる:delay_secs, size_mb, max_kbps, gegrees_cw
  • 重要な属性を追加する:plaintext_password, unescaped_comment, html_utf8, data_urlenc

名前の長さを決める

  • スコープが小さければ短い名前でもいい
  • 長い名前を入力するのは問題じゃない:大抵のエディタには単語補完機能が付いている
  • 頭文字と省略形:新しいチームメイトはその名前の意味を理解できるだろうか? 理解できるなら問題ない。
  • 不要な単語を投げ捨てる:convertToString() → toString()

名前のフォーマットで情報を伝える

GoogleのC++コーディング規約の例

  • 定数は CONSTANT_NAME ではなく kConstantName:MACRO_ NAME のような #define マクロと簡単に区別できる
  • クラスのメンバ変数は、offset_ のように最後の文字がアンダースコア

WordPressにインストールしたプラグインまとめ

Disqus Comment System

各種SNSアカウントでログインしてのコメントを可能にする。

Akismet

コメント欄のスパム避け。Disqus使ってるなら不要? 商用利用でなければ無料で使える。

WP Multibyte Patch

日本語対応を改善するらしい。

JP Markdown

Markdown形式での記事投稿を可能にする。

Crayon Syntax Highliter

コードのシンタックスハイライトを効かせる。一応使えているのでこれを使っているけど、気に入らない部分も結構ある。
シンタックスハイライトプラグインとして有名なSyntaxHighlighter Evolvedは、Markdownプラグインとの相性が悪いらしく、実体参照を二重に変換してしまうのが問題(プラグイン自体に手を入れれば何とかなりそう)。

WP Social Bookmarking Light

ソーシャルボタン系のプラグインはいくつかあるが、本プラグインは作者が日本人で、はてなブックマーク等の国産サービスに対応しているのが特徴。

WP Twitter

Twitter連携。

Cloudinary

画像ホスティングサービス・Cloudinaryのサービスを利用するためのプラグイン。

WP Clean Up

DBの不要レコード(自動保存された下書き等)を消すことができる。

WordPressのTwitter連携はWP Twitterで

WordPressで投稿を行う時、Twitterに投稿の告知を行いたいことがあると思います。その際に使えるプラグインもいくつかあるようです。

最も有名なのは、 WP to Twitter でしょう。ただ、このプラグイン、投稿を行うためのTwitterアプリ開発者アカウントを作る必要があります。単に自動投稿が行いたいだけなのに、面倒くさい!(Twitterには1アプリあたりの利用者数の制限があるので、仕方ない面もあるのですが…)

その点、 WP Twitter は、自分のTwitterアカウントでWP Twitterアプリの認証を行うだけで使えます。

投稿機能が手軽に使えるだけでも嬉しいですが、さらにこのプラグインには、Twitterウィジェットも同梱されています。また、ShareThisというサービスが提供しているソーシャルメディア共有ボタンも付いてます(これはこのブログでは使ってません)。簡単かつ高機能なプラグインなので、オススメです。

herokuにWordPressを立てた

経緯

このブログは元々 http://ryo511.blog.jp/ というURLでlivedoor Blogのサービスを利用して運営していました。livedoor Blogは結構優秀なサービスで、「***.blog.jp」ドメインが使えたり、アクセス解析・SEO・集客も結構強かったりします。

ただ、一点、「Markdownで投稿できない」という大きな不満があり(※)、Markdownで投稿できるブログサービスも色々検討したのですが、Wordpressが一番無難かな、という結論に至りました。

※:MarsEdit等の外部エディタを使うことで、Markdownでの投稿はできますが、こちらはこちらでコードの整形が上手くできないという問題がありました。

バックエンドはさくらVPS・AWS・Digital Ocean・wordpress.comあたりも検討しましたが、「基本無料」かつ「広告無し」という点で、herokuを選択しました。

WordPressをherokuに設置する

herokuにはレンタルサーバーやVPSとは異なる、独特の作法があります。一般的なWordpressの使い方を若干アレンジする必要があります。herokuでWordpressを動かす具体的な方法については、以下の記事が参考になります。

WordPressのブログをherokuで立ち上げて、何かメリットあるの?

アカウントの作成からデプロイまで、ひと通りの手順が載っており、大変参考になる記事です。注意が必要なのは、2013年5月の記事なので、若干情報が古い、ということです。

2013年5月の時点では、herokuはオフィシャルにはPHPをサポートしていなかったため、BuildPackという仕組みを使ってPHPを使えるようにする必要がありました。しかし、2014年4月に、herokuはPHPのサポートをアナウンスし、2014年8月現在ではBuildPack無しでもWordpressを動かすことができます。

herokuのPHPサポート

herokuでオフィシャルにサポートされているPHP実行環境は、PHPの最新安定版(現時点ではPHP5.5.15)及びHHVMの最新安定版(現時点ではhhvm3.20)です。HHVMは、Facebookが開発したPHPの実行環境で、PHPコードがそのまま実行できる上、実行速度が向上する、という点に特徴があります。

WordPressの場合、HHVM対応を見越したコードが書かれているわけではないので、全機能が100%動作する保証はありません。とはいえ、現在のところ不具合には遭遇していないので、このブログはHHVMで動かしています。

HHVMを使う

herokuでHHVMを使うには、 上で紹介した記事 の手順を若干アレンジする必要があります。

まず、herokuでアプリを作る時(heroku createコマンドの実行時)にBuildPackを使用していますが、これは不要です。BuildPackを使用しているか確認するためには、以下のコマンドを実行します。

ここで、「BUILDPACK_URL=git://github.com/iphoting/heroku-buildpack-php-tyler.git」といった文字列が表示されたら、BuildPackを使用しています。BuildPackを使用しないようにするには、以下のコマンドを実行します。

BuildPack設定を削除すると、herokuは自動的にデフォルトのPHPを使用するようになります。次に、HHVMを使うための設定を行います。Wordpressのディレクトリに移動して、「composer.json」という名前で以下のファイルを作成します。

作成できたら、このファイルをgit addしてcommitしてgit push heroku masterすれば、自動的にHHVMが使用されるようになります。

ネット上の情報では、herokuでHHVMを動かす際の設定として「”hhvm”: “3.0.1″」のように特定のバージョンを指定しているものがありますが、この書き方ではherokuが提供するHHVMのバージョンが上がった際にバージョンが特定できず、デフォルトのPHPが使用されてしまいます。「*」と書くと、「バージョン指定なし」となり、HHVMの最新版が使用されます。

なお、PHP/HHVMの特定のマイナーバージョンを指定する場合、「”php”:”~5.5.15″」としておけば、「PHP5.5系で、5.5.15以上のバージョン」という指定になります。マイナーバージョンが上がると後方互換性が失われることがあるので、安全を期するならこの記法を使いましょう(この記法はherokuの公式ドキュメントでも推奨されている書き方です)。

Nginxを使う

HHVMを使う設定を行いましたが、herokuのデフォルトではWebサーバーはApache 2.4が使用されます。さらなる高速化を求めて、Nginxを使用する設定を行います。

WordPressのディレクトリに移動して、「Procfile」という名前で以下のファイルを作成します。

あとは、このファイルをgitにコミットして、herokuにpushすれば、自動的にNginxが使用されるようになります。

ここまでの手順を適用すると、herokuのダッシュボードでは以下のように表示されるはずです。

以上で、HHVM+Nginx環境のセットアップは完了です。

Markdownを使えるようにする

まだ、引っ越しの理由であった「Markdownが使えない」は解消されていません(WordpressはMarkdownでの投稿は公式サポートしていません)。そこで、プラグインを使用します。

WordPress用のMarkdownプラグインにはWP-MarkdownとJP Markdownがありますが、Wodpressの最新版(3.9.2)に対応している点と、最終更新日が新しい(2014-08-03)点を考慮して、 JP Markdown の方を使用します。

インストールは、プラグインをダウンロードして解凍し、解凍後のフォルダを丸ごとWordpressの wp-content/plugins ディレクトリの中に置くだけです。後は例のごとくherokuにpushすれば、Wordpressの管理画面のプラグイン一覧にJP Markdownが現れるので、これを有効にすればOK。

なお、編集はMarkdownで行えますが、保存後はHTMLに変換されます。

画像アップロード

herokuのインスタンスは定期的に再起動されます。そのため、画像ファイルをアップロードするには外部サービスを利用する必要があります。

このブログでは、 Cloudinary というサービスを試験的に利用しています。Wordpressプラグインがあるので、簡単に使い始められます。

Cloudinaryのセットアップに関しては、 Wodrpress on heroku というスライドが参考になりました。

livedoor Blogからの記事移行

WordPressは、Movable Type形式であれば普通にインポートできます。livedoor Blogのエクスポートは有料機能で、かつ、どのような形式で書き出されるか分からなかったので、FC2ブログを経由するという裏技を使いました。

FC2ブログのお引越し機能は、通常のブログサービスのインポート機能とは異なり、Webページのスクレイピングを行って記事データを取得します。また、FC2ブログはMovable Type形式のエクスポート機能を無料で利用できるので、

  1. FC2ブログのお引越し機能で、livedoor Blogから記事データを抜き出す
  2. FC2ブログのエクスポート機能でMovable Type形式の記事データを書き出す

という手順でインポートするための記事データを作成しました。

ただ、改めて調べてみると、有料プランで書き出されるデータ形式は Movable Type形式のようです(公式ヘルプ)。livedoor Blogの書き出し機能は月額300円程度で使えるので、有料機能を使っても良かったですね。。。

感想

PaaSをちゃんと利用するのはこれが初めてだったのですが、herokuは非常に便利ですね。多少クセはあるものの、「基本無料」の魔力には逆らえません。今はWordpressだけですが、アプリケーションを動かすのにも使ってみようと思います。

また、Wordpressは食わず嫌いをしていましたが、管理画面の使いやすさと、情報の豊富さはとても素晴らしいです。