Mojolicious::Liteに挑戦してみた
スポンサードリンク
Perlでの動的なウェブサイトを作るのに今までは全面的にCGI::Applicationを使っていたのですが、いまさらCGI::Applicationをというのものなーとか思い、また、CGI::Applicationで構築するとプラグインをたくさん使うということもあり、可搬性に乏しいということも経験しているので、ここはいっそのこと、新しめのフレームワークを使ってみようかと思い、Mojolicious::Liteにチャレンジしてみました。
今回は課題として、僕が過去にCGI::Applicationで作ったサイト「HWNDBasedPanerView.com」のトップページの表示と同じものを作る、というのを設定しました。参考までに、HWNDBasedPanelView.comのスクリーンショットはこちら。
これを、以下のようなプログラムで表示できます。実際のサイトではデータベースに接続しているところは割愛して、配列にpushすることで表現しています。
Filename: index.cgi
#!/usr/bin/perl
use Mojolicious::Lite;
use utf8;
get '/' => sub {
my $self = shift;
my @images;
push @images, { href => 'zcg80', date => '2011-08-09 12:04:04', image => '1312859044.png', };
push @images, { href => 'wVt5u', date => '2011-06-22 15:38:28', image => '1308724708.jpg', };
push @images, { href => 'eL8Lm', date => '2011-06-02 13:09:39', image => '1306987779.gif', };
push @images, { href => 'nQiVq', date => '2011-04-13 13:34:54', image => '1302669294.jpg', };
push @images, { href => '5FYBi', date => '2011-04-13 13:26:49', image => '1302668809.jpg', };
push @images, { href => 'snT0s', date => '2011-02-10 16:27:56', image => '1297322876.JPG', };
push @images, { href => '2gN2w', date => '2011-01-06 13:30:05', image => '1294288205.jpg', };
push @images, { href => '95aa4', date => '2010-12-25 08:56:17', image => '1293234977.jpg', };
push @images, { href => 'iakk8', date => '2010-12-25 01:20:31', image => '1293207631.jpg', };
$self->render( images => \@images, );
} => 'index';
app->defaults({ site_name => 'HWNDBasedPanelView.com', });
app->start;
__DATA__
@@ index.html.ep
% title $site_name;;
% layout 'index';
<% my $thumbnail = begin %>
<% my ($href, $date, $image) = @_; %>
<li>
<a href="href" title="<%= $date %>">
<img src="thumb.cgi?file=<%= $image %>"
style="width: 75px; height: 75px;"
alt="<%= $date %>"
/>
</a>
</li>
<% end %>
<% content_for sidebar => begin %>
<p><strong style="font-weight: bold;">HWNDBasedPanelView</strong>とは、Windows版InDesignにおいて、まれに発生するバグです。</p>
<p>この画像共有サービスでは、HWNDBasedPanelViewが発生したスクリーンショットを共有します。</p>
<h2>主な機能:</h2>
<ul>
<li>アップロードされた画像を表示できるPermalinkを発行します(http://hwndbasedpanelview.com/iakk8 のような形式)</li>
<li>FacebookページにPermalinkを投稿します(ユーザー様のウォールには投稿しません)</li>
<li>Twitterの投稿したユーザー様のタイムラインに、Permalink付きで投稿できます(クライアント名がHWNDBasedPanelViewとなります)</li>
<li>ソフトウェア販売元のアドビシステムズ様が運営しているTwitterアカウント【<a href="http://twitter.com/adobestore_jp/" target="_blank">@adobestore_jp</a>】に知らせることができます</li>
<li>ソフトウェア開発元のアドビシステムズ様の<a href="https://www.adobe.com/cfusion/mmform/index.cfm?name=wishform&lang=Japanese" target="_blank">不具合報告フォーム</a>に投稿できます(投稿者はサイト管理者が代理で行います)</li>
</ul>
<p>HWNDBasedPanelView以外の画像を投稿した場合は、予告なしで消しますので、あしからず。(サイト管理者:<a href="http://blog.dtpwiki.jp/dtp/" target="_blank">CL</a>)</p>
<div class="notice">
<h2>このバグについての公式情報は</h2>
<ul><li><a href="http://go.adobe.com/kb/ts_236511_ja-jp" target="_blank">起動するとタスクバーに HWNDBasedPanelView UID:... がある(Windows 版 InDesign CS4/CS5)</a></li></ul>
<h2>アドビシステムズ様への製品改善要望は</h2>
<ul><li><a href="https://www.adobe.com/cfusion/mmform/index.cfm?name=wishform&lang=Japanese" target="_blank">Adobe - 製品への要望 / 不具合報告 フォーム</a></li></ul>
</div>
<% end %>
<% content_for meta_description => begin %>アドビシステム社のソフトウェアAdobe InDesignで発生するHWNDBasedPanelViewウィンドウが表示される不具合の画像を投稿します。Twitterのアカウントと連動して投稿します。<% end %>
<article>
<ul class="thumbnails">
<% foreach my $item (@$images) { %>
<%== $thumbnail->($item->{href}, $item->{date}, $item->{image}) %>
<% } %>
</ul>
</article>
@@ layouts/index.html.ep
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title><%= title %></title>
<meta name="author" content="CL" />
<meta name="generator" content="Mojolicious::Lite" />
<meta property="og:site_name" content="<%= $site_name; %>" />
<meta property="og:type" content="product" />
<link rel="alternate" type="application/rss+xml" title="RSS" href="<%= url_for '/rss' %>" />
<meta name="description" content="<%= content_for 'meta_description' %>" />
<meta property="og:description" content="<%= content_for 'meta_description' %>" />
<meta name="keywords" content="<%= $site_name; %>,Adobe InDesign,Twitter,画像投稿" />
<!-- <%= stylesheet '/css/styles.css' %> こう書きたいがCGIだと自分自身へのリクエスト発生して重くなるので次行のように-->
<%= stylesheet begin %>
<%= include 'css/styles', format => 'css' %>
<% end %>
</head>
<body>
<div id="doc4" class="yui-t6">
<div id="hd" role="banner">
<div id="login">
<p id="logintext">
<a href="<%= url_for '/auth' %>">ログイン(Twitter OAuth)</a>
</p>
<header>
<h1>
<a href="<%= url_for '/' %>">
<%= $site_name; %></a
>
</h1>
</header>
<p id="uploadtext">
<a href="<%= url_for '/upload' %>">
アップロード</a
>
</p>
</div>
</div>
<div id="bd" role="main">
<div id="yui-main">
<div class="yui-b"><div class="yui-g">
<!-- YOUR DATA GOES HERE -->
<%= content %>
</div></div>
</div>
<div class="yui-b"><!-- YOUR NAVIGATION GOES HERE -->
<div class="sidebar">
<%= content_for 'sidebar' %>
</div>
</div>
</div>
<div id="ft" role="contentinfo">
<p>
<%= $site_name; %> /
Copyright © 2010-2011 CL All Rights Reserved.</p
>
</div>
</div>
</body>
</html>
@@ css/styles.css.ep
@import url('//yui-s.yahooapis.com/2.8.2r1/build/reset-fonts-grids/reset-fonts-grids.css');
html { background-color: #aa5566; }
body { background-color: #aa5566; }
#hd {
background-color: #aa5566;
color: white;
padding-bottom: 3px;
}
#hd a { color: white; }
#bd {
padding: 20px;
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
behavior: url(/js/PIE.htc);
background-color: white;
position: relative;
}
#hd h1 {
font-size: 48px;
font-family: Times, 'Times New Roman', Serif;
font-weight: bold;
}
#hd h1 a {
text-decoration: none;
color: white;
}
.thumbnails {
padding: 5px;
background-color: #ddd;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
behavior: url(/js/PIE.htc);
position: relative;
}
.thumbnails:after {
content: ".";
display: block;
visibility: hidden;
height: 0.1px;
font-size: 0.1em;
line-height: 0;
clear: both;
}
.thumbnails li {
width: 75px;
height: 75px;
float: left;
padding: 5px;
background-color: #ddd;
}
.thumbnails a {
display: block;
width: 75px;
height: 75px;
overflow: hidden;
background-color: white;
}
#ft {
color: white;
padding: 10px;
padding-left: 0px;
}
/* .yui-b: sidebar */
.sidebar {
background-color: #fefefe;
}
.sidebar h2 {
font-size: 116%;
font-weight: bold;
line-height: 1.7;
}
.sidebar p {
line-height: 1.5;
margin: 0px 0px 7px 0px;
}
.sidebar li {
list-style-type: disc;
margin-left: 16px;
margin-top: 4px;
margin-bottom: 7px;
line-height: 1.4;
}
.sidebar strong {
font-weight: bold;
}
.sidebar a {
color: #a10;
}
.sidebar a:hover {
background-color: #a56;
color: white;
}
.sidebar div.notice {
padding: 5px;
background-color: #a56;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
behavior: url(/js/PIE.htc);
position: relative;
color: white;
}
.sidebar div.notice a {
color: white;
}
.sidebar div.notice a:hover {
background-color: white;
color: #a56;
}
#login {
position: relative;
}
p#logintext {
position: absolute;
z-index: 3;
right: 0;
margin: 4px 0px;
font-weight: bold;
line-height: 1.8;
}
p#uploadtext {
margin-bottom: 8px;
}
トップページだけの再現で、ほかのルート(CGI::Applicationで言うところのランモード)は作っていませんので、ログインとかしても無駄です。
Mojolicious::Liteを使えば、割合簡単にCGI::Applicationからの移植ができそうです。あとは、CGI::Applicaitonのプラグインで実現していたセッションや認証などをMojolicious::Liteの作法に合わせればいいのかな。
参考にした:
- Mojoliciousドキュメント 日本語訳プロジェクト(旧) - livedoor Wiki(ウィキ) [wiki.livedoor.jp]
- Mojolicious::Lite - GitHub [github.com]
- 画像掲示板 (Mojolicious::Lite) - サンプルコードによるPerl入門 [d.hatena.ne.jp]
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/3685







![: Amazon.co.jp: プラスティック・メモリーズ 1【完全生産限定版】(イベントチケット優先販売申込券付) [Blu-ray]](/lists/_9/B00VWX66E8.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 2【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66K2.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 3【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6MV0.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 4【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66IO.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 5【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6Y0E.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 6【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX69D6.jpg)


コメントする