34
PHP エエエエエエエエエ Perl エ Web エエエエエエエエ エエ エエ

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

Embed Size (px)

Citation preview

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

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

た話不破 崇行

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

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

• ごく普通の独身男性

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

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

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

今日のおはなし

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

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

撮影・録音について

•ご自由にどうぞ

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

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

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

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

私のスペック

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

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

2016年今の会社へ転職

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

私のスペック

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

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

2016年今の会社へ転職

ほとんど PHP

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

私のスペック

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

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

2016年今の会社へ転職

Perl案件なんて無かった

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

私のスペック

•使ったことがある言語•普段使っている• 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アプリを作った話

人生の大体は PHP だった

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

いじって遊んでたレベル

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

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

Perl に対する思い出と偏見

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

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

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

Perl を触るきっかけ

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

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

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

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

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

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

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

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

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

PHP の限界

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

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

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

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

可能になった

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

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

PHP のメリット

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

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

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

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

PHP のデメリット

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

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

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

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

事例紹介

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

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

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

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

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

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

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

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

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

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

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

を減らしたりする手法

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

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アプリを作った話

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アプリを作った話

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

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

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

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

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アプリを作った話

Perl で困ったこと

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

リファレンスの少なさ

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

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

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

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

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

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

• Komodo IDE• Visual Studio Code

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

フレームワーク

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

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

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

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

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

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

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

Mojolicious のいいところ

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

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

Perl の勉強の仕方

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

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

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

まとめ

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