ローカル環境
- CentOSをVirtualBoxにインストールする - tkr's blog(2013-01-20)
- Mac の VirtualBox に CentOS 6.3 minimal をインストールしてターミナルから ssh で操作できるようにする - ゆっくり備忘録(2012-08-29)
- DHCPはやめた方がいい
- ntpdateで時間合わせ
- selinux無効化
- VirtualBox for OSX に Linux(CentOS6.3)をインストール - あぱーブログ(2012-09-22)
- 「マシンの搭載メモリが652MB以下の場合は強制的にテキストモードになります」
- VirtualBoxにCentOSをインストールしてsshで接続する(2013-06-30)
PSGI/Plack
→PSGI/Plack - Perl Superglue for Web Frameworks and Web Servers
- PSGI…Perl Web Server Gateway Interface。ウェブサーバとPerlアプリケーションをつなぐインタフェースの仕様。
- Plack…PSGIという仕様を実装したソフトウェア。
対応しているウェブサーバと、対応しているPerlアプリケーションは以下に。
- Perl Hackers Hub:第1回 PSGI/Plack―フレームワークとサーバをつなぐエンジン (1)|gihyo.jp … 技術評論社
- Perl Hackers Hub:第1回 PSGI/Plack―フレームワークとサーバをつなぐエンジン (2)|gihyo.jp … 技術評論社
- Perl Hackers Hub:第1回 PSGI/Plack―フレームワークとサーバをつなぐエンジン (3)|gihyo.jp … 技術評論社
- “psgi” on SlideShare(スライドいっぱい)
PSGIによるHello World
my $app = sub { my $env = shift; return [ 200, [ 'Content-Type' => 'text/plain' ], [ "Hello World" ], ]; };
クライアントのIPを表示するPSGIアプリケーション
my $app = sub { my $env = shift; return [ 200, [ "Content-Type", "text/plain" ], [ "Hello $env->{REMOTE_ADDR}" ], ]; };
PSGIサーバ
plackup
Plack::Server::Standalone::Prefork::Server::Starter(PSSPSS)…「Plack::Server::Standalone ベースのマルチプロセス httpd である Plack::Server::Standalone::Prefork に、完全無停止での更新機能を追加した httpd」
Starlet…シンプル
Starman…Net::Server::PreForkをベースにしたHTTPサーバ。HTTP1.1対応、UNIXソケットへのバインド。
- StarletとStarmanの違い→Starman-Starlet.txt
プリフォークサーバ…予め一定数の子プロセスをforkしておき(プリ/フォーク)、並列に処理を行うタイプのサーバ(Starmanはデフォルトで5つ、Starletは10)。
「プリフォークサーバでは、コネクションの維持イコールプロセスの占有なので、HTTPのKeepAliveは無効にするのが一般的」
(Apache2.0系ではKeepAliveTimeoutは15秒、2.2.9では5秒)
Starman
Server::Starter
ホットデプロイとは、「再起動の時にリクエストの処理を続けながら、変更の内容を反映するための手段」。
Server::Starterはこれを可能にするcpanモジュール。
kill -HUPシグナルを受け取ると、新しいサーバプログラムを立ち上げる(古いのも立ち上がったまま)。
新しいサーバプログラムが正常に立ち上がったら、古いプログラム対しkillを実行。
Server::StarterがHUPシグナルを受け取った際、--interval の間にサーバがエラー終了しないと、サーバの立ち上げに成功したと見なして新しいサーバにディスパッチを開始してしまいます*1。よって、立ち上げに1秒以上時間がかかるサーバを運用する場合、このオプションを指定していないとエラーの検知ができない上に、接続ができない時間が発生してしまいます。
- PSGI/Plackアプリケーションの起動方法いろいろと本番環境アレコレ - blog.nomadscafe.jp
- Server::Starter + Starman で HUP 再起動が上手くいかないことがある - Craftworks Tech Blog - Branch
Monit
プロセス監視。Daemontools, Supervisorに代わって。
- monit使う場合は定期的にmonit monitor allしたほうが良い - うまいぼうぶろぐ
http://hogem.hatenablog.com/entry/20090723/1248358467
SSH の監視設定例
PID ファイルのパスと起動・停止方法を設定する。
check process sshd with pidfile /var/run/sshd.pid start program = "/etc/init.d/sshd start" with timeout 3 seconds stop program = "/etc/init.d/sshd stop"
Nginx
ディレクトリ構成
- Webアプリのディレクトリ事情 - ゆーすけべー日記(2013-01-30)
MacBook@yusuke % tree -L 1 -F . ├── Makefile.PL ├── cli/……………………コマンドラインツール、cronから等。 ├── config/………………「development.pl」と「production.pl」とか。 ├── deploy/………………Cinnamonの設定ファイル。 ├── etc/…………………「どこに入れよっかなー?って迷った感じのファイル」 ├── lib/……………………「lib/MyApp/Web/Controller」 ├── log/………………… ├── psgi/………………… ├── public/………………静的コンテンツ(Mojolicious標準で使われているディレクトリ構造)。 ├── sandbox/…………実験スクリプト(レポジトリには入れない)。 ├── script/……………? ├── t/……………………テストファイル。 └── templates/…………Mojolicious標準テンプレートファイル。
Makefile.PLの代わりにcpanfile+Carton?
$ mojo generate app MyApp ではなく、 $ mojo generate app MyApp::Web # Web層だけではないから。 ├─ cpanfile ├─ cli/ ├─ config/ ├─ deploy/ ├─ etc/ ├─ lib/ │ └─ MyApp/ │ ├─ Web.pm │ ├─ DB.pm │ ├─ DB │ │ └─ Schema.pm │ ├─ Model │ │ └─ ModelA.pm │ └─ Web │ ├─ User │ │ └─ Xxx.pm │ ├─ Admin │ │ └─ Xxx.pm │ └─ Develop │ └─ Xxx.pm ├─ log/ ├─ psgi/ ├─ public/ │ ├─ css/ │ ├─ favicon.ico │ ├─ images/ │ └─ js/ ├─ sandbox/…………実験スクリプト(レポジトリには入れない)。 ├─ script/ ├─ t/ └─ templates/ ├─ layouts/ │ └─ default.html.eq └─ root/ └─ index.html.eq
デプロイ
定番のCapistarano(Ruby)。軽量なCinnamon(Perl)。
- 開発メモ#1:Cinnamon によるデプロイ - naoyaのはてなダイアリー
- デプロイツール「Cinnamon」を使ってみた - Kansai.pmで活動しているPerlプログラマのブログ(sudoとかの…)
Perl/モジュール管理
plenvとcartonとcpanmはグローバルにインストール。
plenv
Perlbrewじゃない方。
# インストール可能なPerl一覧 $ plenv install -l # インストール $ plenv install 5.18.1 # インストール済みのPerl一覧 $ plenv versions # グローバル設定 $ plenv global 5.18.1 # グローバル設定の確認 $ plenv global # 現在有効になっているPerl $ plenv version $ which perl # カレントディレクトリに'.perl-version'というファイルを作成し、バージョンを記述する # ※カレントディレクトリ以下に採用される $ plenv local 5.5.8 # 無効にする('.perl-version'を削除) $ plenv local --unset # .perl-version記載のバージョンのPerlで実行 $ plenv exec XXXX # 特定Perlのアンインストール $ plenv uninstall 5.18.1 # cpnamのインストール $ plenv install-cpanm # インストール済みのモジュール一覧 $ plenv list-modules
cpanm
- cpanm -l … 足りないモジュールだけ指定パスにインストール。
- cpanm -L … コアモジュール以外を指定パスにインストール。
Carton
cpanfile(というファイル)を元にPerlモジュールを管理。
requires 'Module::Name'; requires 'Module::Name', '1.0037'; # 1.0037以上 requires 'Module::Name', '>= 1.0037, < 2.00'; 1.0037以上でメジャーバージョンアップ前 requires 'Module::Name', '== 1.0037'; # 固定
# /path/toディレクトリに用意したcpanfileを元にモジュールインストール # → /path/to/localにインストールされる $ cd /path/to/myapp $ carton install # /path/to/localを使って起動(「 -- 」に続けてコマンド) $ carton exec -- XXXXX # DBD::mysqlは外部ライブラリに依存しているので、以下をしてから。 $ export PATH=/path/to/mysql/bin:$PATH
(gitからはlocal/を除外しておいた方がいいよね)
echo local/ >> .gitignore
- 実際にインストールされたモジュールのバージョンはcarton.snapshotに記述される。
- carton installだとcpanfileを読みにいく。
- carton install --deploymentだとcarton.snapshotを優先して読みにいく。
/20131127a/app.psgiが動いてて、/20131128a/app.psgiなディレクトリに新しい環境作って、切り替えて、だめだったら戻す、みたいなこと。
その他
プロセス監視
Jenkines(設定ファイルとかテストとか)?
fluentd(ログ集積)?
キャッシュ
Supervisord?
Carton(Perl)? Bundler(Ruby)?(モジュール管理?)
Chef / chef-solo?
Keep-alive
ハートビート信号を送って生存を伝えるキープアライブ機能。
HTTP/1.1でHTTP Keep Aliveがサポートされた。
1回のTCP接続で複数のHTTPリクエストを処理可能。
1ページにたくさんの画像がある等の場合に便利(効果あり)。
コネクションを張り直す必要がない。
- MaxKeepAliveRequests: 接続してから切断するまでに受け付けるリクエストの数
- KeepAliveTimeout: 接続しているセッションからのリクエストが来なくなってから切断するまでの待ち時間
さくらVPS
- [まとめ] さくらのVPSを借りたらまず最初にすべき6のこと - ワタブログ
http://wata-jp.ldblog.jp/archives/1606112.html - Apache、mod_perl さようなら!さくらVPSで Nginx + Starman - ワタブログ
http://wata-jp.ldblog.jp/archives/1674163.html
- さくらVPSのWordPressをチューニングして30倍高速化した方法
http://hara19.jp/archives/5817
Mojolicious
nginx + Starman + Mojolicious
- jVideosのWebアプリケーション部分技術解説 - ゆーすけべー日記
http://yusukebe.com/archives/20120115/095835.html
MacでApacheとnginxと切り替え
Apache2は、MacPortsでインストールしたもの。
# Mac起動時に apache を自動起動させる場合 sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist # 起動を一時停止する時のコマンド sudo launchctl unload /Library/LaunchDaemons/org.macports.apache2.plist # Mac起動時に apache を自動起動させさない場合 sudo launchctl unload -w /Library/LaunchDaemons/org.macports.apache2.plist # 手動で起動させる時のコマンド sudo launchctl load -F /Library/LaunchDaemons/org.macports.apache2.plist # Mac起動時に nginx を自動起動させる場合 sudo launchctl load -w /Library/LaunchDaemons/org.macports.nginx.plist # 起動を一時停止する時のコマンド sudo launchctl unload /Library/LaunchDaemons/org.macports.nginx.plist # Mac起動時に nginx を自動起動させさない場合 sudo launchctl unload -w /Library/LaunchDaemons/org.macports.nginx.plist # 手動で起動させる時のコマンド sudo launchctl load -F /Library/LaunchDaemons/org.macports.nginx.plist # 普通の起動 sodo nginx # 普通の停止 sudo nginx -s stop
gzip設定
AutoPatchWorkのサーバー周りのこと - 0xFFより。
gzファイルを生成して、.htaccessで以下を指定。
RewriteEngine on # Accept-Encodingにgzipが含まれていて、 RewriteCond %{HTTP:Accept-Encoding} gzip # リクエストされたファイル名+.gzなファイルが存在したら、 RewriteCond %{REQUEST_FILENAME}\.gz -s # URLを.gzつきに書き換え、 RewriteRule ^(.+)$ $1.gz # ファイルタイプをjsonとして強制する AddEncoding x-gzip .gz
パスワード
現在パスワードの保存方法のベストプラクティスはソルト付きハッシュ + ストレッチングということになっいるので、それに従うのが無難かと思います。
メール運用
さくらVPSの標準CentOSは最初からpostfixサーバが動いており、試用期間が過ぎれば特別な設定をしなくてもPHP等からメール送信できます。
もろもろ
- Nginx + Starman + Catalyst(PSGI) で最初のページを表示するまで。| thinking now…
→daemontoolsのrunファイルでローカルPerlのパスを指定しつつ、フルパスでstarmanを指定して起動。
- Apache、mod_perl さようなら!さくらVPSで Nginx + Starman - ワタブログ
http://wata-jp.ldblog.jp/archives/1674163.html - StarmanへReverseProxyした時のabベンチ取ってみた|perl|@OMAKASE
http://www.omakase.org/perl/starmanreverseproxyab.html - さくらVPSとnginxリバースプロクシで最速WordPressブログを作る方法(ベンチマーク付き) | さくらたんどっとびーず
http://sakuratan.biz/archives/4582
- オシャレエロサイト「h300」をリリースして、10万PV/日を捌くためにやったこと - 彼女からは、おいちゃんと呼ばれています
http://d.hatena.ne.jp/inouetakuya/20120410/1334058296
- フロントエンドWeb戦略室: 第1回 外部サイトに貼り付けるJavaScriptの作法―ポリシー,速度,セキュリティ,プライバシー(1)|gihyo.jp … 技術評論社
http://gihyo.jp/dev/serial/01/front-end_web/000101
- WEBサイト負荷テストツール7選 | さぶみっと!JAPAN
http://www.submit.ne.jp/714
Devel::KYTProf
ワールドワイド
URL
アップル
- http://www.apple.com/
- http://www.apple.com/jp/
- http://www.apple.com/ca/
- http://www.apple.com/ca/fr/
- http://www.apple.com/cn/
- http://www.apple.com/tw/
マイクロソフト
- http://www.microsoft.com/en-us/
- http://www.microsoft.com/ja-jp/
- http://www.microsoft.com/en-ca/
- http://www.microsoft.com/fr-ca/
- 中国: http://www.microsoft.com/zh-cn/
- 台湾: http://www.microsoft.com/zh-tw/
オラクル
- http://www.oracle.com/ (http://www.oracle.com/us/)
- http://www.oracle.com/jp/
- http://www.oracle.com/ca-en/
- http://www.oracle.com/ca-fr/
- http://www.oracle.com/cn/
- http://www.oracle.com/tw/
- https://www.facebook.com/
- https://ja-jp.facebook.com/
- https://fr-ca.facebook.com/
- https://fr-ca.facebook.com/ ---> https://www.facebook.com/
ちょっと関係ないけど
- schema.org 日本語訳 - 始めましょう!
http://schema-ja.appspot.com/docs/gs.html - Bingによるmicrodataとかのバリデータ
Bing Webmaster Tools Markup Validation Tool - Webmaster Center blog - Site Blogs - Bing Community
Amazon
- 月額10円〜 - Amazon S3でウェブサイトをホスティングする方法 - Amazon Web Services ブログ
http://aws.typepad.com/aws_japan/2012/08/hosting-website-on-s3.html - 月額10円〜でレンタルサーバーをはじめる方法 | アマゾン ウェブ サービス(AWS)
http://www.awsmicrosite.jp/s3-hosting/
Geo
- HTML5 な今だからこその位置情報ハンドリング♡ - Geo::Coordinates::Converter - JPerl Advent Calendar 2010 Hacker Track
http://perl-users.jp/articles/advent-calendar/2010/hacker/9
データベース ORM
「TengはDBIx::Skinnyの後継バージョンと捉えていただいて結構です」
- DBIx::Skinny
http://nekokak.org/presen/yapcasia2009-dbix-skinny/ - Perl Advent Calendar Japan 2011 Teng Trac
http://perl-users.jp/articles/advent-calendar/2011/teng/
- Schemaクラス(Schema.pm)を作成。
基本
# 通常のINSERT my $row = $teng->insert('user', +{id => 1, name => 'nekokak'}); # last insert idだけを受け取るFAST INSERT my $id = $teng->fast_insert('user', +{id => 2, name => 'xaicron'}); # 一気にINSERT $teng->bulk_insert('user', [ +{ id => 3, name => 'zigorou'}, +{ id => 4, name => 'hidek48'}, ]); # idから取得 my $row = $teng->single('user', +{id => 1}); $row->id; # 1 $row->name; # nekokak # 複数カラムなら、 my $row = $teng->single('user', +{id => 1, name => 'nekokak'}); # 特定のカラムだけ取得 my $row = $teng->single('user', +{id => 1}, +{columns => [qw/id/]}); # inflateを行わないナマのデータを取得 my $row = $teng->single('user', +{id => 1}); $row->get_column('name'); # 複数カラムなら、 $row->get_columns; # Rowオブジェクトから直接update $row->update(+{name => 'inukaku'}); # 実際にどういう値でデータベースに登録されたかを確認したいなら、refetch my $new_row = $row->refetch(); # 更新カラムを先に作ってから $row->set_column(name => 'inukaku'); $row->set_column(id => 10); $row->update(); # あるいは、 $row->set_column( +{ id => 10, name => 'inukaku', }); $row->update(); # Rowオブジェクトからdelete $row->delete();
SQL文で
# 自身でSQLを my $itr = $teng->search_by_sql('select * from user where id = ?', [qw/1/]); # イテレータから取得されるRowオブジェクトをどのtableに紐付けるかがむずかしくなる場合、 # 第三引数にRowオブジェクトに紐付けしたいtable名を指定 my $itr = $teng->search_by_sql('SELECT * FROM user WHERE id = ?', [qw/1/], 'user'); # プレースホルダを「?」ではなく名前付けするならsearch_named my $itr = $teng->search_named('SELECT * FROM user WHERE id = :user_id', +{user_id => 1});
イテレータ
# next while (my $row = $itr->next) { $row->id; } # all my @rows = $itr->all; # Rowオブジェクトを作りたくない(コストカット)なら、 $itr->suppress_object_creation(1); while (my $row = $itr->next) { $row->{id}; # ただのhashrefでありRowオブジェクトのメソッドはcallできない } # (Teng自体に…) my $teng = Teng->new(suppress_object_creation => 1, ....); # (もしくは) $teng->suppress_object_creation(1);
search
※TengのsearchメソッドはSQL::Makerのselectメソッドのラッパー
my $itr = $teng->search('user', +{name => 'nekokak'}, +{order_by => 'id'}); my $itr = $teng->search('user', +{name => 'nekokak'}, +{limit => 1, offset => 1,}); # 以下のように受け取ることも可能 my @rows = $teng->search('user', +{name => 'nekokak'}, +{order_by => 'id'});
update / delete
返り値は、実際に更新/削除したレコード数。
$teng->update('user', +{name => 'inukaku'}, +{id => 1}); # 以下なら全レコード対象 my $update_count = $teng->update('user', +{name => 'inukaku'}); my $delete_count = $teng->delete('user', +{name => 'inukaku'});
Rowクラスの拡張
TengではProj::DB::Row::Userを定義する必要はない。
メソッドを追加したい場合に定義。
package Proj::DB::Row::User; use strict; use warnings; use parent 'Teng::Row'; sub special_method { q{I'm special!} } 1;
namespaceを変更したいなら、Schemaで指定。
table { name 'user'; pk 'id'; columns qw/id name/; row_class 'Proj::Api::User'; # ココにRowクラスを指定する };
inflate / deflate
データベースへ登録する時、取り出す時にルールを適用する。
table { name 'user'; pk 'id'; columns qw/id name created_on updated_on/; # inflate / deflateの定義は正規表現でcolumnを指定できるので # .+_atにマッチするカラムに以下のinflate / deflateが適用される # dbから取得したunixtimeをDateTimeオブジェクトにinflateする inflate qr/.+_at/ => sub { my ($col_value) = @_; DateTime->from_epoch($col_value); }; # プログラムから渡されたDateTimeオブジェクトをunixtimeにdeflateする deflate qr/.+_at/ => sub { my ($col_value) = @_; $col_value->epoch; }; };
# 全てのテーブルに共通に追加 for my $table_name (keys %{$teng->schema->tables}) { my $table = $teng->schema->get_table($table_name); $table->add_inflator('name' => sub { warn Dumper \@_; }); $table->add_deflator('name' => sub { warn Dumper \@_; }); }
その他もろもろ
# スキーマクラスファイルを作るために… #! perl use strict; use warnings; use DBI; use Teng::Schema::Dumper; my $dbh = DBI->connect('dbi:SQLite:./sample.db','',''); print Teng::Schema::Dumper->dump( dbh => $dbh, namespace => 'Proj::DB', ), "\n"; # トランザクション $teng->txn_begin; my $row = $teng->insert('user', +{id => 1, name => 'nekokak'}); $teng->txn_commit;
プラグインで
# Count my $count = $teng->count('user', '*', {type => 2}) # あれば取ってきて、なければINSERT my $row = $teng->find_or_create('user',{name => 'lestrrat'}); # あれば更新して、なければINSERT(REPLACE INTO) my $row = $teng->replace('user',{name => 'lestrrat'});
- tokuhirom/teng-handbook(Tengハンドブック)
メモ
NOW()とかの場合は、スカラリファレンスで渡す。
※実際には、NOWでやらずに、自分で生成した現在時刻を渡した方がいい場合は多そうだけど。
$teng->insert('my_table', { my_name => 'NAME', created_at => \'NOW' }); # timestampになってるupdated_atをなんらかの理由で更新しない場合。 $teng->update('my_table', { my_name => 'NAME', updated_at => \'updated_at' });
- Teng でトランザクション処理 & はまった点 - amari3のはてなダイアリー
http://d.hatena.ne.jp/amari3/20111124/1322146448
以外
ぼくのさいきょうツール :: [ FLAT ] Develop | ONO TAKEHIKO from aguije inc.
http://flat.is/develop/2014/02/ultimate/
Solarized - Ethan Schoonover(開発環境カラーリング)
- smtp gmail
PostfixのGmailリレー設定(自宅サーバーのOP25B) | jiiko
- ネーミング
モダンPerlなら、(DateTimeじゃなくて)Time::Piece。
- FormValidator::Lite
- HTML::FillInForm::Lite
- Data::Validator
- Mouse
- SQL::Maker
- Devel::NYTProf / Devel::KYTProf
- Test::mysqld
- Harriet
- Test::More / Test::Mojo
テスト
- Perlモジュール Test-Simple-0.99 の翻訳 - perldoc.jp
- perl でテストを始めよう!! - Perl Advent Calendar Japan 2011 Test Track
Jenkins
- ユカイ、ツーカイ、カイハツ環境!(21):「Hudson」改め「Jenkins」で始めるCI(継続的インテグレーション)入門 (1/4) - @IT
- Jenkins入門 ― Rubyプログラマー向け連載 - Build Insider
もろもろ
- 実践Teng - Teng-Doc 0.01 documentation(Tengドキュメント)
- CartonとcpanmでCPANモジュールをローカルインストールして使う - ももいろテクノロジー(plenv / CartonでMakefile.PLにオプション指定してインストール)
- 株式会社シャノン技術ブログ:15分で始めるmonitによるサーバ監視
- daemontoolsに代わる新定番monit。
- 12-cyberagent.pdf(PDF)
- OWASP Zed Attack Proxy Project - OWASP(脆弱性診断ツール)
- SyntaxHighlighter(シンタックス/ソースコード/カラーリング)
- 第24回 PSGI/Plack実践入門―Starman,Starlet,Twiggy,Plack::Middleware,Server::Starter(1):Perl Hackers Hub|gihyo.jp … 技術評論社
- 第24回 PSGI/Plack実践入門―Starman,Starlet,Twiggy,Plack::Middleware,Server::Starter(2):Perl Hackers Hub|gihyo.jp … 技術評論社
- 第24回 PSGI/Plack実践入門―Starman,Starlet,Twiggy,Plack::Middleware,Server::Starter(3):Perl Hackers Hub|gihyo.jp … 技術評論社
- Web Starter Kit(Google製の…)
- 固有表現抽出API:文字列中の人名・地名などを抽出する技術 - gooラボ
https://labs.goo.ne.jp/api/2014/336/
- Perl - Carton時代の必須インストールモジュール(Webアプリ編) - Qiita
http://qiita.com/karupanerura/items/e765b23bd3bff806cc27(入れておくだけで自動的に選択されるXSモジュール)
- Web初心者でもGoogle Mapsをカスタマイズできるgmaps.jsでAPIを使い倒そう! | 株式会社LIG
http://liginc.co.jp/web/programming/server/132459
- いまどきのカジュアルなデータベース関連開発
http://songmu.github.io/slides/yapc-asia2013/
- 新・OS X ハッキング! (131) 軽いPNGをもっと「軽く」する | マイナビニュース
http://news.mynavi.jp/column/osxhack/131/
- Perl::Criticでコーディングスタイルを統一 - ヒルズで働く@robarioの技ログ
http://d.hatena.ne.jp/holidays-l/20070515/p1
- Perl - morboとhypnotoadの違いとハマりどころ - Qiita
http://qiita.com/xtetsuji/items/1227e40bea05b09684e0
- Hayato Imai / Mojolicious-Plugin-Web-Auth - search.cpan.org(Dropbox, Facebook, Github, Google, Instagram, Twitter.)
http://search.cpan.org/dist/Mojolicious-Plugin-Web-Auth/
- 人気上昇中のJavaScriptライブラリを調べてみた【2015年版】 - Build Insider
http://www.buildinsider.net/web/popularjslib/2015
- AngularJSでMVCプログラミングをはじめよう (1/3):CodeZine
http://codezine.jp/article/detail/8207
- Mojolicious 6に向けて、互換性が崩れる部分をピックアップしておきます。 - サンプルコードによるPerl入門 〜 安定と信頼のPerlを学ぼう 〜
http://d.hatena.ne.jp/perlcodesample/20150128/1422411806
- MySQLをmaster:slave=1:1構成にして参照をslaveに向けるのがなぜ良くないか - 酒日記 はてな支店
http://sfujiwara.hatenablog.com/entry/20110620/1308531677
- iframe 組み込みの YouTube Player API リファレンス - YouTube — Google Developers
https://developers.google.com/youtube/iframe_api_reference