yapc::hokkaido phpエンジニアがperlでwebアプリを作った話
TRANSCRIPT
![Page 1: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/1.jpg)
PHP エンジニアが初めてPerl で Web アプリを作っ
た話不破 崇行
![Page 2: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/2.jpg)
こんにちは!不破 崇行 ( ふわ たかゆき )• 札幌市内の IT 企業に在籍しています
• ごく普通の独身男性
• JAWS-UG や JAZ-UG とかでも色々発表とかしてます• 好きな AWS プロダクト :Cloud Watch• 好きな Azure プロダクト : App Service
• 簿記 4 級受けました。• 結果は明後日届く?• 来年は 3 級受けたい。
![Page 3: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/3.jpg)
今日のおはなし
• 普段使っている PHP から Perl を使い始めた時に気づいた事• PHP と Perl の違いについて• フレームワークは Mojolicious が良かった
![Page 4: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/4.jpg)
撮影・録音について
•ご自由にどうぞ
• 私の顔写真などは著作権フリーです。
![Page 5: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/5.jpg)
どうして Perl を触ることにしたのか
![Page 6: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/6.jpg)
私のスペック
2013年新卒で札幌の IT企業に就職
2014年横浜の IT企業(SIer, Java屋 )に転職
2016年今の会社へ転職
![Page 7: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/7.jpg)
私のスペック
2013年新卒で札幌の IT企業に就職
2014年横浜の IT企業(SIer, Java屋 )へ転職
2016年今の会社へ転職
ほとんど PHP
![Page 8: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/8.jpg)
私のスペック
2013年新卒で札幌の IT企業に就職
2014年横浜の IT企業(SIer, Java屋 )へ転職
2016年今の会社へ転職
Perl案件なんて無かった
![Page 9: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/9.jpg)
私のスペック
•使ったことがある言語•普段使っている• PHP(5.x, 7.0), Javascript(jQuery, backbone.js, yui.js など )• Moodle(CMS) を長年扱っており、これが PHP だった
•多少出来る• Python, Java, C#
•触ったことがある• Perl
![Page 10: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/10.jpg)
人生の大体は PHP だった
• 高校時代に物心が付いた頃からPHP 三昧な人生を送っていた• 高校時代から Moodle(CMS)
いじって遊んでたレベル
• 人生 28 年目にして GitHub はPHP だらけ
![Page 11: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/11.jpg)
Perl に対する思い出と偏見
• 高校生時代に学校のホームページにアクセスカウンタや掲示板を設置したことがある• その時 Perl のスクリプトを書いた
• Perl といえば「掲示板」程度
![Page 12: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/12.jpg)
Perl を触るきっかけ
• PHP で感じた限界• これからお話しします
• 新しい言語への挑戦• エンジニアとして、色んな言語を触れるようにしたい
• 新しいサービスを作る時の言語選定
![Page 13: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/13.jpg)
「エンジニアなら言語は多く持て」
• プログラミングの師匠から教わって今でも覚えている言葉
• 中学生の頃に教わった事で、「使える言語と技が多ければメシは食える」と言われた
• とりあえず触ってみてチュートリアルやってみてから善し悪しを決めよう• 触ってみてから dis る習慣を付ける
![Page 14: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/14.jpg)
PHP の限界
![Page 15: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/15.jpg)
PHP を巡る状況 ( 私見 )• フレームワークが乱立しており、若干混乱気味• Symfony, SlimPHP, Codeigniter, Ethna などなど
• 処理速度はかなり改善されている• PHP7.0 で大幅にアップしている
• HHVM の登場• まだまだ安定しないものの、 JIT( 実行時コンパイラ ) 方式による動作も
可能になった
• あくまで Web アプリ向け言語
![Page 16: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/16.jpg)
PHP のメリット
• Web アプリに特化した言語• WordPress や Moodle も PHP を採用しているが、
Web アプリを作るために特化されているため PHP が採用されている
• 言語実装的にも Web アプリ開発として割り切っている感じが強い• ( 私見です )
![Page 17: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/17.jpg)
PHP のデメリット
• Web アプリ以外の事には基本的に向かない• 実装自体は出来るが、非常に泥臭い処理をしている
• ( 実例はこれからお話しします )
• 大規模になるとアプリが肥大化して重たくなるケースが多い
![Page 18: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/18.jpg)
事例紹介
![Page 19: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/19.jpg)
事例:WordPress のケース疑似 cron• 「予約投稿」機能などスケジュール機能がある
が、全て「疑似 cron 」という機能で動いている•ユーザーからのアクセス時に裏で cron っぽい機能が動き始める仕様
ページ表示リクエストここで cron処理を回す
![Page 20: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/20.jpg)
事例:疑似 cron を PHP で実装したケース
•右は、 WordPress 内のキャッシュを準備している
•更に後続の処理で文字列処理等もしている
• 「 WordPress が重たい」原因の 1 つで、ここを改善すると高速化出来る。
![Page 21: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/21.jpg)
事例: RSS フィードにおける XPath の処理• SEO 対策のため、 RSS フィードの中をいじる場合• Google ニュースなどに引っかかりやすくするために、 a タグ
を減らしたりする手法
![Page 22: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/22.jpg)
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); }}
![Page 23: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/23.jpg)
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);}
![Page 24: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/24.jpg)
PHP だと冗長になる理由• 1 つのオブジェクトの中にメソッドと変数が入り乱れてしま
うことが多いため、混乱する• もちろん実装方針によります
$testObject->get();$value = $testObject->value;
![Page 25: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/25.jpg)
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);}
![Page 26: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/26.jpg)
Perl で困ったこと
![Page 27: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/27.jpg)
リファレンスの少なさ
![Page 28: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/28.jpg)
IDE• IntelliJ/phpStorm など「 IDE があって当たり前」だったので、
色々探したけどコード補完を縦横無尽にやってくれるツールが少ない
•欲しい機能• ハイライト• コード補完• 検索• インスペクタ• デバッガ• テスト実行
![Page 29: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/29.jpg)
個人的にしっくりくるツール
• Komodo IDE• Visual Studio Code
![Page 30: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/30.jpg)
フレームワーク
• PHP に比べるとメジャーなフレームワークが少ない感触• 今回試したフレームワークは Amon2 と Mojolicious
![Page 31: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/31.jpg)
Mojolicious• Web アプリ向けのフレームワーク• デプロイ用のツールが試験系 / 本番系で充実している• Morbo• 開発用シングルプロセスサーバー。
プロジェクト内ファイルの変更をトリガーとしたアプリ再起動機構。
• hypenotoad• 本番環境に最適化したプリフォーク
ウェブサーバー。無停止アップグレードに対応。
![Page 32: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/32.jpg)
Mojolicious のいいところ
•簡易なルーティング機能• MVC で実装することが出来る
![Page 33: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/33.jpg)
Perl の勉強の仕方
• 「キーボードを打った分だけ強くなれる」という教えをもらったことがあるため、とにかくソースを写経する
• GitHub で Perl のソースコードをとにかく眺める
![Page 34: YAPC::Hokkaido PHPエンジニアがPerlでWebアプリを作った話](https://reader035.vdocuments.mx/reader035/viewer/2022062523/586f774c1a28ab10258b676b/html5/thumbnails/34.jpg)
まとめ
• 言語仕様や特徴を押さえて、言語選定をしよう• 「すべて xx 言語で揃えよう」というのは非常に危険• 多様性を受け入れよう