Entry: グリモンでjQueryのコンフリクトを避けるテンプレート
グリモンでjQueryのコンフリクトを避けるテンプレート
昨日のつづき。
グリモンスクリプトでjQueryを使うとき、他のスクリプトでロードされたjQueryの別バージョンとのコンフリクトを避けるためのテンプレート。
(function() { var $; var jversion = '1.3'; var jexist = (typeof unsafeWindow.jQuery != 'undefined'); var conflict = (jexist && unsafeWindow.jQuery.fn.jquery != jversion); // Add jQuery if not loaded if (! jexist || conflict) { var GM_JQ = document.createElement('script'); GM_JQ.src = 'http://ajax.googleapis.com/ajax/libs/jquery/' + jversion + '/jquery.js'; GM_JQ.type = 'text/javascript'; document.getElementsByTagName('body')[0].appendChild(GM_JQ); } GM_wait(); // Check if jQuery's loaded function GM_wait() { if (typeof unsafeWindow.jQuery == 'undefined' || unsafeWindow.jQuery.fn.jquery != jversion) { window.setTimeout(GM_wait,100); } else { if (conflict) { $ = unsafeWindow.jQuery.noConflict(true); } else { $ = unsafeWindow.jQuery; } letsJQuery(); } } // All your GM code must be inside this function function letsJQuery() { } })();
a
Entry: 履歴書テンプレート
履歴書テンプレート
OpenOfficeで履歴書テンプレート作ってみた。Microsoft Officeならネット上にテンプレートがたくさん見つかるけどOOoで開くと崩れるの。経験的にはMS OfficeよりOOoのほうがPDF出力は奇麗な気がするし、第一、MS Officeもってないの。
フォントは全てIPA。Mac OS Xで表示確認したけど、他の環境では未チェック。A4サイズ。OOoのWriter上では罫線が汚く見えるけど、PDF出力すれば無問題。印刷もOK。
これで転職もばっちりだぜ!って、大晦日に何やってんだろう。
[2009.1.3追記]
経線を0.1mmオーダーで調整してみた。これでWriter上でも見栄えはよくなったけど、やっぱり、はみ出すはずのない罫線がはみ出して見える。これはWriterの描画の問題ぽい。でも、PDF出力や印刷時には問題なく、コクヨの市販品に比べても遜色ないんじゃないかと思う。
Entry: このブログの今日までの要約
Entry: speedycgiすげかったんだ
speedycgiすげかったんだ
キャッシュするとアクセスログが記録できなかったのを改善。キャッシュにアクセスログ系のテンプレート関数を書きこんじゃって、中間コード的な仕様にする。そしたら、以前に書いたエントリー中のサンプルコードとデリミタがバッティング。しばらく悩む。
そして解決。いずれにしても、キャッシュ機能自体、今のところ全く効果なし。てか、効果測定する方法がわからない。倍返しで速くなると何故か確信してたのに・・。しかも、クローラーに舐められた後はキャッシュファイルだけで1000ページも生成されてディスクの無駄。なんて考えると、余裕で速度10倍とかはじき出すspeedycgiってスゴすぎるな。そろそろ自宅サーバーもやめてレンタルサーバーにしようと思ったりもするけど、speedycgiがないことだけが憂鬱。
Entry: なんかもう、オブジェクト指向2
なんかもう、オブジェクト指向2
テンプレート関数を呼び側からオブジェクトに食わせてみる。この方向でやってみようか。デバッグはあまりしていません。
=sample package main; print "Content-type: text/plain; charset=utf-8\n\n"; my $template = Template->new(); $template->set_delimiter(left => '<', right => '>'); $template->set_var(data => 'This is a sample data'); $template->set_func(length => \&tpl_func_sample1); $template->set_func(first_word => \&tpl_func_sample2); print $template->parse(str => q!data : <$data>;!. "\n"); print $template->parse(str => q!length : <&length($data)>!. "\n"); print $template->parse(str => q!first word : <&first_word($data)>!. "\n"); sub tpl_func_sample1 {return length($_[0]);} sub tpl_func_sample2 {return (split(/\b/, $_[0], 2))[0];} # --output-- # data : This is a sample data # length : 21 # first word : This =cut package Template; use strict; use warnings; use utf8; binmode(STDERR,":utf8"); use open IO => ":utf8"; ### ----------------------------------------- ### コンストラクタ ### ----------------------------------------- sub new { my $class = shift; my $self = {mother => undef, @_}; bless $self, $class; $self->{func} = {}; $self->{var} = {}; ### マザーインスタンスがあればデリミタ継承 if (defined $self->{mother}) { $self->set_delimiter(left => $self->{mother}->{left_delimiter}, right => $self->{mother}->{right_delimiter}); } else { $self->set_delimiter(); } return $self; } ### ----------------------------------------- ### テンプレート変数の定義 ### ----------------------------------------- sub set_var { my $self = shift; my %args = (@_); while ((my $key, my $value) = each %args) { $self->{var}->{$key} = $value; } } ### ----------------------------------------- ### テンプレート関数の定義 ### ----------------------------------------- sub set_func { my $self = shift; my %args = (@_); while ((my $key, my $value) = each %args) { $self->{func}->{$key} = $value; } } ### ----------------------------------------- ### テンプレート変数の問い合わせ ### ----------------------------------------- sub var { my $self = shift; my %args = (name => undef, @_); if (defined $args{name}) { return $self->{var}->{$args{name}} if (defined $self->{var}->{$args{name}}); return $self->{mother}->var(name => $args{name}) if (defined $self->{mother}); } return undef; } ### ----------------------------------------- ### テンプレート関数の問い合わせ ### ----------------------------------------- sub func { my $self = shift; my %args = (name => undef, @_); if (defined $args{name}) { return $self->{func}->{$args{name}} if (defined $self->{func}->{$args{name}}); return $self->{mother}->func(name => $args{name}) if (defined $self->{mother}); } return undef; } ### ----------------------------------------- ### テンプレートパース ### ----------------------------------------- sub parse { my $self = shift; my %args = (str => undef, file => undef, @_); my $tpl_str; ### テンプレートの選定 if (defined $args{str}) { $tpl_str = $args{str}; } elsif (defined $args{file}) { $tpl_str = $self->get_str_from_file(name => $args{file}); } else { die 'No template string found'; } my @scraps = split(/$self->{left_delimiter}(.+?)$self->{right_delimiter}/s, $tpl_str, 2); ### 手続き指定があったら if ((scalar @scraps) == 3) { my $output = $scraps[0]; my $parse_str = $scraps[1]; ### テンプレート変数を解釈 $parse_str =~ s/(?<!\\)\$([A-Za-z0-9:_]+)/\$self->var(name => '$1')/g; ### テンプレート関数を解釈 $parse_str =~ s/(?<!\\)\&([A-Za-z0-9:_]+)/\$self->func(name => '$1')->/g; ### エスケープを解釈 $parse_str =~ s/\\(\$|\&)(?=[A-Za-z0-9:_])/$1/g; ### テンプレート関数内で親テンプレートとして参照 local $Template::self = $self; ### パース結果を取得 my $result = eval $parse_str; $output .= $result if (defined $result); ### エラーがあればエラーを返す if ($@) { ($@ =~ /as a subroutine/) and die "Cannot parse a function in template line($scraps[1])"; die "$@ This error was in eval($scraps[1])"; } ### 残りの文字列を評価 $output .= $self->parse(str => $scraps[2]); return $output; } return $tpl_str; } ### ----------------------------------------- ### テンプレート文字列をファイルから取得 ### ----------------------------------------- sub get_str_from_file { my $self = shift; my %args = (name => '', @_); if (open(tpl_handle, $args{name})) { my $output = join('', <tpl_handle>); close(tpl_handle); return $output; } die 'template file not found'; } ### ----------------------------------------- ### テンプレート関数デリミタの初期化 ### ----------------------------------------- sub set_delimiter { my $self = shift; my %args = (left => '{%', right => '%}', @_); $self->{left_delimiter} = ($args{left} or '{%'); $self->{right_delimiter} = ($args{right} or '%}');; } return 1;
Entry: なんかもう、オブジェクト指向
なんかもう、オブジェクト指向
オブジェクト指向。
自動車クラスのコンストラクタで自動車オブジェクト(インスタンス?)をつくり、走行メソッドで100k走ると燃料データが10リッター減る、か。なるほど。分かる、分かるよ。よし、このブログシステムをオブジェクト指向で書いてみよう。
とりあえず、システムのコアとなっているテンプレートシステムをモジュール化し、ブログ機能はテンプレートシステムの単なるプラグインに格下げにする計画。今現在もほとんど同じ構造だけど、とりあえず、local変数が飛び交い、パッケージが3つドモエに再帰しまくっている状態を何とか分離し、見通しをよくしたいのだ。
今あるテンプレート解釈を担当しているサブルーチンをメソッド風に変えていく。そしてコンストラクタも作る。インターフェースはシンプルにこう!
$template = Template->new();
print $template->Analize($template_file);
と、ここまでやって、オブジェクト指向の何たるやがさっぱり分からん。コンストラクタで生成されたテンプレートクラスのオブジェクトはいったい何を意味するのか。自動車クラスが作る自動車にあたるものがいったい何なのか自分で作ってて分からんのです。ただオブジェクト指向風のインターフェースに変わっただけで、やってることは関数志向となんら変わらないし、若干重くなったし。クラスメソッドが内側にサブクラスを生成して再帰しまくる、なんて感じで見通しもより一層悪く。一応動いてるっぽいけど、このコードがメイクセンスしてるのかもさっぱり分かりません。うーん、初オブジェクト指向には大きすぎる課題だったか。しかもテンプレートのほうがブログのプラグインって設計のほうが正解だったか。
Entry: text-overflow:clip
text-overflow:clip
このページ、他のブログを十分に研究せずに作ったせいか、なんだか、インターフェースが洗練されてなさすぎでした。右のコメントリストの書式を変更しました。
ウェブページを設計するときって、必ずテキストの幅(折り返し)で悩みます。HTMLは優秀な言語ですが、CSSとその実装にまだまだ不満が絶えません。本当は、レイアウトはすべて相対値指定のリキッドデザインをこよなく愛しているのですが、右のナビゲータ部の横幅は固定値で妥協しました。その結果、長いタイトルははみ出すけど、仕方が無い。小手先で指定文字数以下を省略するようにしてみました。こういう省略表記などもCSSでやってくれてもいい気がします。text-overflow:clipみたいな。思い付きですけど。
省略にはテンプレート関数、名づけて「clip_str」を使用。
&clip_str(str => $summary, start => 0, count => 10)
僕のテンプレートシステムでは上記のようなPerl関数を特殊な引用符で括って、直接記述します。表記方法はPerl準拠。手抜きではない。僕以外の人間がテンプレート設計する場合でもPerl知ってれば取り合えず問題ないという。そんなありえない想定で、パーソナルなシステムを作るのは、幼少時代にガンダム戦わせる一人遊びをしていた名残ですね。ちなみに、最近、perlの関数を書くときは必ず引数名つきの仕様にすることにしています。命名が面倒なのを差し引いても、保守が圧倒的に楽。今回初めてこういう書き方を知りました。
Entry: DB重い
DB重い
連休中は音楽活動しようと思っていたけど、作業場の片付けから始めるのが億劫で何も手付かず。iTunesでネットラジオ聞きながら、適当にブログなど、いじっております。
ブログが重い。今回、ブログ作るにあたって、あっちこっちのブログを見て回ったのですが、大抵のどこのブログも重かったです。このブログでは、自作のテンプレートシステムを使ってるのですが、ウワ物の自由度を確保するために、不要な処理が至るところで動いているのです。帯状カレンダーと通常カレンダーは別の関数呼び出しで、データは持ち歩かないので、イチからのカレンダー生成処理が2回必要、という具合。
今日、少しシェイプアップしましたが、重さは変わらず。この致命的な重さはDBがボトルネックになっているようで、どうやら小手先では軽くできないようです。今日、Postgresqlのビューという機能を覚えたので負荷軽減に使ってみましたが、逆効果でした。ポスグレのチューニングの知識が必要です。
Entry: 眞鍋かをりにトラックバックをお見舞いしたい!
眞鍋かをりにトラックバックをお見舞いしたい!
昨日のベースネタを本物のベースで練習したら僅か30分で指にタコができ、あえなく終了。最初の1小節しか弾けなかった。
最近、ブログらしきものを作っています。所属するバンド内で、現行サイトをリニューアルしろ、とか、ブログもやりたい!とかいう要望が前々からあがっていたのと、それから「ついでにオレブログも作って眞鍋かをりにトラックバックをお見舞いしたい!」という不純な動機もあり、全部いっぺんにやってしまえ、ということでシステム構築。テンプレートシステムとか作ってみたり、やれロジックとコンテンツの分離だ!とかやってたら規模がデカくなりすぎ、今流行りのCMSみたくなってきちゃいました。今回はPostgresqlとCSSというのに初挑戦。ちょっと前から始めた自宅サーバのメンテナンスとかもあって覚えることが多い。どうせすぐ時代遅れになるのに。ブログやるならmovable typeとかがいいらしいのですが、僕は「車輪の再発明」が趣味で、どうも人の作ったものは信用できない。長い目で見れば無駄ではない、と信じて、formの処理からして一から作る。しかし、ロジックはほぼ上がったものの、デザインが問題だ。
僕の性癖、「手段が目的へと変わっていく」。眞鍋にトラックバックというのは冗談で、ブログの目的は、ちょっと前に始めたエフェクターの自作のレポートをしようというものでした。自作エフェクターなんてマニアックなこと、どうせやるならブログでその模様を実況するのも一興かと。ところが、そのブログ作りにハマってしまって、肝心のエフェクターは全くの下火です。考えてみれば、一つ前の目的であったところのエフェクター自作は、以前は別の何かの手段だったはず。今となっては思い出すこともできない。
Subscribe to my RSS feed