YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話

Preview:

Citation preview

PHP エンジニアが初めてPerl で Web アプリを作っ

た話不破 崇行

こんにちは!不破 崇行 ( ふわ たかゆき )• 札幌市内の IT 企業に在籍しています

• ごく普通の独身男性

• JAWS-UG や JAZ-UG とかでも色々発表とかしてます• 好きな AWS プロダクト :Cloud Watch• 好きな Azure プロダクト : App Service

• 簿記 4 級受けました。• 結果は明後日届く?• 来年は 3 級受けたい。

今日のおはなし

• 普段使っている PHP から Perl を使い始めた時に気づいた事• PHP と Perl の違いについて• フレームワークは Mojolicious が良かった

撮影・録音について

•ご自由にどうぞ

• 私の顔写真などは著作権フリーです。

どうして Perl を触ることにしたのか

私のスペック

2013年新卒で札幌の IT企業に就職

2014年横浜の IT企業(SIer, Java屋 )に転職

2016年今の会社へ転職

私のスペック

2013年新卒で札幌の IT企業に就職

2014年横浜の IT企業(SIer, Java屋 )へ転職

2016年今の会社へ転職

ほとんど PHP

私のスペック

2013年新卒で札幌の IT企業に就職

2014年横浜の IT企業(SIer, Java屋 )へ転職

2016年今の会社へ転職

Perl案件なんて無かった

私のスペック

•使ったことがある言語•普段使っている• PHP(5.x, 7.0), Javascript(jQuery, backbone.js, yui.js など )• Moodle(CMS) を長年扱っており、これが PHP だった

•多少出来る• Python, Java, C#

•触ったことがある• Perl

人生の大体は PHP だった

• 高校時代に物心が付いた頃からPHP 三昧な人生を送っていた• 高校時代から Moodle(CMS)

いじって遊んでたレベル

• 人生 28 年目にして GitHub はPHP だらけ

Perl に対する思い出と偏見

• 高校生時代に学校のホームページにアクセスカウンタや掲示板を設置したことがある• その時 Perl のスクリプトを書いた

• Perl といえば「掲示板」程度

Perl を触るきっかけ

• PHP で感じた限界• これからお話しします

• 新しい言語への挑戦• エンジニアとして、色んな言語を触れるようにしたい

• 新しいサービスを作る時の言語選定

「エンジニアなら言語は多く持て」

• プログラミングの師匠から教わって今でも覚えている言葉

• 中学生の頃に教わった事で、「使える言語と技が多ければメシは食える」と言われた

• とりあえず触ってみてチュートリアルやってみてから善し悪しを決めよう• 触ってみてから dis る習慣を付ける

PHP の限界

PHP を巡る状況 ( 私見 )• フレームワークが乱立しており、若干混乱気味• Symfony, SlimPHP, Codeigniter, Ethna などなど

• 処理速度はかなり改善されている• PHP7.0 で大幅にアップしている

• HHVM の登場• まだまだ安定しないものの、 JIT( 実行時コンパイラ ) 方式による動作も

可能になった

• あくまで Web アプリ向け言語

PHP のメリット

• Web アプリに特化した言語• WordPress や Moodle も PHP を採用しているが、

Web アプリを作るために特化されているため PHP が採用されている

• 言語実装的にも Web アプリ開発として割り切っている感じが強い• ( 私見です )

PHP のデメリット

• Web アプリ以外の事には基本的に向かない• 実装自体は出来るが、非常に泥臭い処理をしている

• ( 実例はこれからお話しします )

• 大規模になるとアプリが肥大化して重たくなるケースが多い

事例紹介

事例:WordPress のケース疑似 cron• 「予約投稿」機能などスケジュール機能がある

が、全て「疑似 cron 」という機能で動いている•ユーザーからのアクセス時に裏で cron っぽい機能が動き始める仕様

ページ表示リクエストここで cron処理を回す

事例:疑似 cron を PHP で実装したケース

•右は、 WordPress 内のキャッシュを準備している

•更に後続の処理で文字列処理等もしている

• 「 WordPress が重たい」原因の 1 つで、ここを改善すると高速化出来る。

事例: RSS フィードにおける XPath の処理• SEO 対策のため、 RSS フィードの中をいじる場合• Google ニュースなどに引っかかりやすくするために、 a タグ

を減らしたりする手法

XPath の処理 (PHP)• DOM(HTML) の中にある <a> タグを削除したい場合

$dom = new DOMDocument();$dom->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'));$xpath = new DOMXPath($dom);

$div_format_dom = $xpath->query(‘//div[@class=“container”]’)->item(0);

//<div class=“container”> 内の <a> タグノードを取り出す$links = $xpath->query('//a', $div_format_dom);//1 つずつループを回していき、 <a> タグを削除するforeach ($links as $link) { $link_child = $link->childNodes->item(0); if ($link->hasChildNodes()) { $link->parentNode->replaceChild($link_child, $link); }}

XPath の処理を Perl で実装した場合• XML::XPath を使用した場合

use Encode; use LWP::Simple; use XML::XPath; use XML::XPath::XMLParser; use DateTime; use DateTime::Format::HTTP;   my $rss = LWP::Simple::get( ‘http://example.com/feed’); my $xml = XML::XPath->new( $rss ); my $nodeset = $xml->find('/rss/channel//item');   foreach my $node ($match->get_nodelist() ) {      $match->removeChild($child);}

PHP だと冗長になる理由• 1 つのオブジェクトの中にメソッドと変数が入り乱れてしま

うことが多いため、混乱する• もちろん実装方針によります

$testObject->get();$value = $testObject->value;

Perl だとスッキリした

•モジュール設計の要因もあるが、子要素削除の部分がスッキリしている

use Encode; use LWP::Simple; use XML::XPath; use XML::XPath::XMLParser; my $rss = LWP::Simple::get( ‘http://example.com/feed’); my $xml = XML::XPath->new( $rss ); my $nodeset = $xml->find('/rss/channel//item');   foreach my $node ($match->get_nodelist() ) {      $match->removeChild($child);}

Perl で困ったこと

リファレンスの少なさ

IDE• IntelliJ/phpStorm など「 IDE があって当たり前」だったので、

色々探したけどコード補完を縦横無尽にやってくれるツールが少ない

•欲しい機能• ハイライト• コード補完• 検索• インスペクタ• デバッガ• テスト実行

個人的にしっくりくるツール

• Komodo IDE• Visual Studio Code

フレームワーク

• PHP に比べるとメジャーなフレームワークが少ない感触• 今回試したフレームワークは Amon2 と Mojolicious

Mojolicious• Web アプリ向けのフレームワーク• デプロイ用のツールが試験系 / 本番系で充実している• Morbo• 開発用シングルプロセスサーバー。

プロジェクト内ファイルの変更をトリガーとしたアプリ再起動機構。

• hypenotoad• 本番環境に最適化したプリフォーク

ウェブサーバー。無停止アップグレードに対応。

Mojolicious のいいところ

•簡易なルーティング機能• MVC で実装することが出来る

Perl の勉強の仕方

• 「キーボードを打った分だけ強くなれる」という教えをもらったことがあるため、とにかくソースを写経する

• GitHub で Perl のソースコードをとにかく眺める

まとめ

• 言語仕様や特徴を押さえて、言語選定をしよう• 「すべて xx 言語で揃えよう」というのは非常に危険• 多様性を受け入れよう