2007年3月アーカイブ

以前公開したものはテンプレートを正規表現で置換するというものだったのだが、

<$MTBlogName$>, <$MTBlogDescription$>, <$MTBlogURL$>, <$MTEntryTitle$>, <$MTEntryBody$>, <$MTEntryMore$>, <$MTEntryKeywords$>, <$MTEntryExcerpt$> の各テンプレートタグをそれぞれの内容に置き換えて表示確認をする。それだけ。それ以外のテンプレートタグは無視(削除)される。フィルター系のプラグインは効かない。

MTらしくないしちゃんと「Build」させたいということでlib:MT:App:CMS.pmを眺めていたら「ああ...なるほどなぁ」という感じ。やっぱりもう少しドキュメントを充実させて欲しい。こんどProNetミーティングというものに参加してみようと思っているのでそのあたりも伝えられれば。

テンプレート指定→build部分の処理は以下のような感じ。今回のはきちんとフィルター系のプラグインも動作する。

my $tmap = MT::TemplateMap->load(
						{	blog_id => $blog_id,
							archive_type => 'Individual',
							is_preferred => 1
						},);

# 優先度の高いエントリーアーカイブのテンプレートをロードする
my $template = MT::Template->load({id => $tmap->template_id});
my $preview_tmpl = $template->text;
my $entry = MT::Entry->new;
$entry->blog_id($blog_id);

# 要するに, 保存しない状態でMT::EntryオブジェクトをつくってBuildする

my $ctx = MT::Template::Context->new;
$ctx->stash('entry', $entry);
$ctx->stash('blog', $blog);
$ctx->stash('blog_id', $blog->id);
my $build = MT::Builder->new;
my $tokens = $build->compile($ctx, $preview_tmpl)
	or return $app->error($app->translate(
		"Parse error: [_1]", $build->errstr));
defined(my $html = $build->build($ctx, $tokens))
	or return $app->error($app->translate(
		"Build error: [_1]", $build->errstr));

エントリー編集画面から「確認」をクリックすると完全な状態でプレビュー画面が表示される。

確認画面のキャプチャ

* MT4対応についてはBeta4の時点での動作しか確認できていません。MT4正規版対応については現在作成中です。

Ubuntu。

| コメント(0) | トラックバック(0)

Ubuntsuに例えばnkfを入れるとして。

# apt-cache search nkf

junkfilter - A junk-email filtering program for procmail
libnkf-perl - Network Kanji code conversion Filter for Perl
libruby1.6 - Libraries necessary to run Ruby 1.6.x
namazu2 - Full text search engine (namazu binary and cgi)
namazu2-common - Full text search engine (Document files)
namazu2-index-tools - Full text search engine (Tools for index handling)
nkf - Network Kanji code conversion Filter
pkf - Perl Kanji code conversion Filter

# apt-cache show nkf
(詳細確認)
# sudo apt-get install nkf
(インストール)

以上。

なる程簡単。Apacheの設定でも [a2ensite] とか、あ、このあたりはDebianの流れなのか。

findコマンド。

| コメント(0) | トラックバック(0)

お、タイムリーな話題だったので。

404 Blog Not Found:勝手に添削 - find(1)

ログ解析のためのタグを挿入するのに、CMS側では挿入位置にコメントを吐き、挿入部分はPerlスクリプトで置換する、で、処理の「漏れ」を探すのには...

find . -name "*.html"|xargs grep '<!--AnalyzeTag-->'

という感じですがこれで良いですかね?

メモ。4月のタスクリスト。
サイト構築ツールとしてのMTを極める。

  • StylePreviewでテンプレートの選択・判断が不十分なので見直す。
  • Background Rebuilderでトラックバックの件とすべてのブログ再構築で一部ブラウザでエラーになる件。また再構築の結果をメールで受け取れるように。
  • エントリーのフィールド数を増やすプラグイン。
  • ブログエディタの選定・組み込み。
  • ファイル管理ツールの組み込み。
  • スケジュール管理機能の組み込み。
  • 承認フローと修正指示を付箋のように付加できるしくみ。
  • カテゴリやエントリーの表示順をGUIで変更できるしくみとabs2relプラグインの完成。
  • Hyper Estraierまたはその他の全文検索システムとの連携。

会社とか個人とか。

| コメント(1) | トラックバック(0)

jkondoの日記 - 会社と個人

会社に搾取されずにいかに会社を搾取するかというノウハウに磨きをかけている時間は全く無意味だと思う

考えることも無駄じゃないし、話をすることも無駄じゃないが、「ノウハウに磨きをかけている時間」は無駄だってことではないかな。

MTで普通に運用してると、PermalinkとかArchiveLinkとかがフルパス(http://junnama.alfasado.net/online/〜)になるので、サイト制作にMTを使っている場合ローカル環境で動作確認できなかったりする。

/online〜にするプラグインとかはあるのだが、ファイルのパスを起点として相対パスにする方法が見当たらなかったので作ってみた。

ということで、相対パスになってます。テストが充分じゃないので今のところ公開できませんが、リンク切れとか一見なさそうな感じ。どんなもんでっしゃろ?

※2007年4月3日追記
フィードが変換されると読めない(読みにくい?)とのことで、除外する拡張子を設定するようにして、xmlを除外。

プラグイン設定画面

「エントリーの一覧」からエントリーにチェックボックスを入れて「再構築」した際にバックグラウンド処理が行われず通常の再構築処理になってしまう問題を修正しました。

ダウンロードページはこちら。

今回、MT3.34での動作を確認済み。

これもまぁ、同種のものもあるし今後はきっと標準で実装されるだろうから必要なケースがどれだけあるかわからないが、CSSの効いた状態で見栄えを確認するだけならこんなもんで必要充分ではないかということで公開

プレビュー画面

Six Apart社からのメールを読み、僕はMovableTypeファンの1人として、1年以上も待たせやがって…、バンザイ! と叫びそうになった。

今日のMT:Movable Typeでプレビュー機能が実現!?PreviewEntry: 世界中の1%の人々へ

そう、ウチも今年からProNETに登録していて時々メールが届くのだが、今回は「Movable Type Enterprise」向けというのを読み落としていて「あ、ついに」と思ってしまった。

StylePreview プラグイン

  • StylePreview.pl.zip(1.7KB)

→最新版はこちらから

機能はどうってことはなく、エントリーのテンプレートの中の <$MTBlogName$>, <$MTBlogDescription$>, <$MTBlogURL$>, <$MTEntryTitle$>, <$MTEntryBody$>, <$MTEntryMore$>, <$MTEntryKeywords$>, <$MTEntryExcerpt$> の各テンプレートタグをそれぞれの内容に置き換えて表示確認をする。それだけ。それ以外のテンプレートタグは無視(削除)される。フィルター系のプラグインは効かない。

他のプラグイン等と比較してメリットは? あまりないかもしれないが、設定は一切不要

元々統合的なCMSプラグインの機能のひとつとして既に書いていたものを切り出してアップしたのだが、理由は単に設定やテンプレートさわるのが億劫だったから。最近はこんなの書く方が圧倒的に楽な体(?) になってるな。まぁ書いたらアップということで。

使い方は、pluginsフォルダに入れるだけ。エントリー編集画面で「確認」をクリックしたときに、エントリーアーカイブのテンプレートにCSSが効いた状態でプレビュー出来るようになる。

Enjoy MovableType!

MTのエントリーから編集画面に簡単に移動するための方法について。

他にも『PHPでクッキーの有無を調べてクッキーが飛んできていたら「編集」リンクを表示する』ような手法をどこかで見たことがあるのだが見つけられなかった。

個人的なブログとかだとあまり細かなことを気にする必要はないが、企業サイト等でMTを使っている場合に「HTMLやJavaScriptを覗くと、編集画面のリンクが見えてしまう」のはあまり望ましくないと思う。

SSI等を利用すればログイン状態をチェックすることは可能だが負荷の面でお勧め出来る方法でもなく、このプラグイン+ブックマークレットを使うことでmtであることや編集画面へのリンクを一切見せること無く「エントリーのページからエントリー編集画面へ移動する」ことができるようになる。

ブックマークレット

  • 「Quickedit.pl」をmt/plugins以下にコピー
  •  同梱されている「Bookmarklet.html」の以下の部分を環境にあわせて変更※
  • 「Bookmarklet.html」をブラウザで開いてブックマークレットとして登録
<a href="javascript:window.document.location.href='http://example.com/mt/mt.cgi?quickedit=1&permalink='+document.location.href;">=&gt;Quick Edit</a>

※ http://example.com/mt/mt.cgi の部分を環境にあわせて書き換え。

編集したいエントリーをブラウザで表示している状態で、ブックマークレットをクリックすると該当エントリーの編集画面にジャンプする。
エントリー以外(例えばトップページ等)の場合は単に管理画面のトップへリダイレクトされる。


3月19日追記:
PHPが使えるなら、AdminLinks Plugin ってのがあるな。

MT3.34に変更。3.34の特徴であるFastCGI化を試す。

で、BackgroundRebuilderプラグインの動作確認とパフォーマンスを確認したくてやってみた。

再構築画面のキャプチャ

詳細はまた改めて書こうと思うが、自分でも驚いた(サーバーのメモリ等のスペックの違いはあるにしても / 500MB→1GBへ変更)。

変更前(MT3.33 / MySQL / FedraCore + BackgroundRebuilder)

90秒〜120秒。エントリー数130強のこのブログの再構築だが、FastCGI化前ではこのくらいかかる(すべての再構築をバックグラウンドで行った結果)。

変更後(MT3.34 / MySQL / Ubuntsu + BackgroundRebuilder)

11〜13秒
同じくすべての再構築をバックグラウンドで行った結果である。
何よりも驚いたのはエントリー投稿のレスポンス。ダイナミックパブリッシングってこんな感じなんだろうなぁというくらい一瞬で終わる...というより「保存されていないんではないか?」と思ったくらいだ。

※正確には「終わったように感じる」だけど。

通常は
エントリー投稿→再構築→保存しました

BackgroundRebuilderでは、
エントリー投稿→保存しました→再構築

だから、速く感じるのは「体感速度なのだが、このくらいの差があればサイト構築の作業時間などに大きく差が出るだろう。

さすがに管理画面をさわってもらうことは出来ないが、コメントやトラバの反応やサイト内検索のCGI版のスピードも上がっているので、そのあたりは感じていただけると思う。

参考:

僕のMacにはMovableTypeがインストールされていてpluginsフォルダにはとにかくたくさんのプラグインが放り込まれている。
そのほとんどが個別の案件用に書いたもの、ちょっとした思いつきで試しに書いたもの。
個別案件用に書いたものは公開するレベルにもないし他にニーズがあるかどうかもわからないけれど他の仕事の際にも「あ、あれ使おう」となったらそれはきっと他にもニーズがあるものなんだろう。

今回のネタ? はタイトル通り「MTのカテゴリーアーカイブを出力しないプラグイン」。

「ブログ」でなく「サイト制作」にMTを使っている場合、下手な設計をするとBlogがやたら増えてしまう。ナビゲーションのバリエーションとかカテゴリーアーカイブのデザインのパターン数だけBlogを用意するのだ。これってメンテナンス性も悪いしそもそも制作の時点で効率が悪い。

  • 「何でこんなにBlogの数が多いんだ?」
  • 「ここのカテゴリーだけ、インデックスのページをこんな風にしたいんですよ」
  • 「じゃぁそうすれば?」
  • 「このBlogのカテゴリーアーカイブのテンプレートとパターンが違うんで...」

あるいは

  • 「何でカテゴリーアーカイブを使わずにインデックスページまでいちいち『エントリー』として登録してるんだ? 何この『出力ファイル名』が『index』って」
  • 「カテゴリーごとにインデックスページの項目がバラバラなんですよ」
  • 「Blog使う意味ないじゃん!」

う〜ん、言葉で書くとニュアンス伝わりにくいような気がする。とにかくそんな会話の中で『こんな設計あり得んやろ!』ということで書いた。

管理画面上の表示

  • 管理画面のカテゴリーのところに、画像のようにチェックボックスが追加される
  • チェックを入れたカテゴリーは再構築されない
  • つまり、特定のカテゴリーのインデックスページだけエントリーで代用できる

これでどうでしょう? いやいやそれでも、

  • 「『パンくずリスト』がおかしくなります...(例:Junnama Online > MovebleType > MovebleType )」
  • 「ここのページ、エントリーのパターンとはちょっと違うんですよ...」

とか必ず言う奴がいるんだなぁ。はいはい、分かりました。

<MTEntryIfIndex>
# 出力ファイル名が「index」の場合のみ出力される
<MTElse>
# それ以外の場合出力される
</MTElse>
</MTEntryIfIndex>

こんな条件タグも作りましたから。これで宜しいか? そうか、そりゃ良かった。

実装上の都合で、「カテゴリーの説明(description)」にコメント(<!--DoNotRebuild-->)が入るので、このコメントを出力したくない時は

<$MTCategoryDescription CatIndexKiller="1"$>

としてください。

0120-00-0000 とかが日付に解釈されてしまう、って指摘があったので、日付の妥当性をチェックするように修正。

MovableTypeをデフォルトの状態で運用する時にパスが /mt/mt.cgi になるわけだが、/mtフォルダにBasic認証で制限をかけたいとか、もはやMTをブログツールでなくWebアプリの開発プラットフォームとして使いたい、といった場合に役立つノウハウ。

実際問題、ちょっとしたWebアプリやコミュニティサイトなんかすごく簡単にできる。

/mt/mt-config.cgi

CookiePath /

例えば/mtディレクトリ以外のディレクトリでもログインの有無を確認して処理を変えたい場合、mt-config.cgiにこのように書く。
但し、コメントなんかにスクリプト付きのリンクとか埋め込まれたとして踏んだときのリスクはあるので(今回はいわゆる「ビジネスブログ」ということで、そのあたりの機能はオフにする、あるいは考えない前提で)。

/myapp.cgi

#!/usr/bin/perl -w

use strict;
use lib qw (/home/site_path/htdocs/mt/lib/);
use lib qw (/home/site_path/htdocs/mt/extlib/);
use MT::Bootstrap App => 'Myapp';

これがCGIの本体。こいつに対して実行パーミッションを持たせる。

/mt/lib/Myapp.pm

こいつが今回の主役。ログインもログアウトも /mt/mt.cgi を経由せずに行えるし、もはや何でもできるというか、すごく楽に開発できる。MTって、僕にとってはもはやブログではなく「開発プラットフォーム」である。

MT::Objectのサブクラスを作成すれば、SQL要らずでデータベース連動のWebアプリが出来る。動作の重さもFastCGIを使うことで解消されるし、いざとなったら 「MovableType Background Rebuilder Plugin」ってのもある。

package Myapp;
use strict;

use MT::App;
@Myapp::ISA = qw(MT::App);

$ENV{MT_HOME}="/home/site_path/htdocs/mt";
$ENV{MT_CONFIG}="/home/site_path/htdocs/mt/mt-config.cgi";

sub init_request {
	my $app = shift;
	$app->SUPER::init_request(@_);
	$app->add_methods( Myapp => \&_Myapp );
	$app->{default_mode} = 'Unprotected';
	$app->add_methods( Unprotected => \&_Unprotected );
	$app->{requires_login} = 1 unless $app->mode eq 'Unprotected';
	$app;
}

sub _Unprotected {
	my $app = shift;
	my $query = $app->param;
	my $action = $query->param('action');
	my $redirect_pth = $query->param('redirect_pth');
	if ($action eq 'logout') {
		# /myapp.cgi?action=logout でログアウト
		$app->logout;
		# ログイン用フォームを表示
		return &_login_tmplate;
	}
	my $login = $app->login;
	if (defined $login) {
		if (($redirect_pth ne '') && ($redirect_pth ne '/myapp.cgi?action=logout')) {
			$app->redirect($redirect_pth);
		}
		# ログインしていたら_Myappを実行
		return &_Myapp($app);
	}
	if ($app->login) {
		# ユーザー名とパスワードが正しければログイン
		$app->run;
	}
	# ログイン用フォームを表示
	return &_login_tmplate;
}

sub _Myapp {
	my $app = shift;
	# 本来はログインユーザーが /myapp.cgi?__mode=Myapp&...という
	# アドレスでアクセスした時の処理。この場合は、ログインユーザー
	# だった場合の処理を書く。
}

sub _login_tmplate {
	return <<HTML;
# ログイン用フォームのHTML
HTML
}
1;

重要なことを書く。真実を書く。
某国の話じゃないぜ。日本の話だ。美しき国、だな。

技術や技術動向の「流行」を追いかけて、話題を作って上場したベンチャーがいる。

日本のネットベンチャーの特徴は...

「電話営業してくる」

ことかな。Web2.0って何やねんって気分になるわ。

まぁ、それはともかく。

収益モデルがはっきりしない世界だからこそ、分かりやすいパッケージやサービスを作って「営業」が売り歩く世界。

さて、その結果。

「営業」と「技術屋」の距離は遠く、営業はシステムやASPを「導入支援する」アウトソース先の企業に頼るようになる。

以下、実話。

  • 「ウチのシステムで、こんなことできますか?」<自社の開発陣に聞けば?
  • 「納品してもらったデータに不具合があるんですが...」<不具合はあなたの会社のシステムにある、あるいは不具合でなくて仕様?
  • 「クライアントがこういっているのですが、御社で何とかできませんかねぇ」<御社で何とかすれば?

技術開発陣の立場が強いのかもしれないが、これで製品がブラッシュアップされますか。されんでっしゃろ?
つまり、顧客接点での要望や実情が開発する側にフィードバックされないわけだ。これで「良いもの」が出来るんだろうか?

でさ、お願いだから

  • 「発注書の宛先に自分の会社の名前書くなよ」
  • 「請求書紛失したとか言って再発行お願いしますとか言ってくるなよ」

お願いだからさ、もう少しレベル上げろよ。

なるほど...ね。

Movable Type オブジェクト・リファレンス>MT::Object

例えばMySQLで

==
CREATE TABLE `mt_example` (
  `example_id` int(11) NOT NULL auto_increment,
  `example_name` varchar(255) default NULL,
  `example_email` varchar(255) default NULL,
  `example_fst_name` varchar(255) default NULL,
  `example_lst_name` varchar(255) default NULL,
  `example_fst_kana` varchar(255) default NULL,
  `example_lst_kana` varchar(255) default NULL,
  `example_token` varchar(255) default NULL,
  `example_created` int(11) default NULL,
  `example_password` varchar(44) default NULL,
  `example_hint` varchar(44) default NULL,
  `example_status` smallint(6) default NULL,
  PRIMARY KEY  (`example_id`),
  KEY `example_name` (`example_name`),
  KEY `example_email` (`example_email`),
  KEY `example_token` (`example_token`)
) TYPE=MyISAM AUTO_INCREMENT=1;

として、次に「Example .pm」をつくり、MT/libに置く。

==
package MT::Example;
use strict;

use MT::Object;
@MT::Example::ISA = qw( MT::Object );
__PACKAGE__->install_properties({
    columns => ['id', 'name', 'email', 'fst_name',
    				'lst_name', 'fst_kana', 'lst_kana',
    				'token', 'created', 'password',
    				'hint', 'status'],
    indexes => {
        id => 1,
        name => 1,
        email => 1,
        created => 1,
        token => 1,
    },
    datasource => 'example',
});
==

これで後はMT作法でアクセスできる。

「フォームから仮登録、メール送信、URLクリックで本登録」みたいな処理のためにやってみた。

「プログラマの生産性」とか良く話題になるけれど、生産性とは決してスキルの総量ではなく課題解決の効率であり「壁」を乗り越える能力にあるのだと思う。

8割の仕事はスムーズにできる。ところが「できない2割」が足を引っ張るのだ。できないところで止まってしまう、あるいは無駄な時間を過ごしてしまう。

では、上司として会社として出来ることは何か?

その2割を取り除いてやることだろう。

それでも本当に「できる」奴は、その2割をすぐに発見できる奴なのだ。解決できなくとも「自分にとってのできない2割」をすぐに発見して「上司だろうとどんなに忙しい同僚だろうと使いこなしてやっちまう」タイプの人間は強い。

いや、ほんま強いよ。

Facebook

Twitter

このアーカイブについて

このページには、2007年3月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2007年2月です。

次のアーカイブは2007年4月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 6.2.6