Results tagged “hack”

ActionStreams + AnyEvent

  • Posted on
  • by

ActionStreamsで更新チェックする時に、AnyEvent::HTTPを使って並列ダウンロードするようにしてみました。sixapart / mt-plugin-ActionStreamsからforkして、anyeventブランチを切ってゴニョゴニョしてます。

AnyEventが見つかれば自動的に利用するようにしてありますので、特別な設定は不要です。

10程度のストリームの処理で、ベンチマーク(ストップウォッチで目視)では約三倍ほど速くなってます。ストリームの数が増えれば、もっと差が出るかもしれません。

「$pkg = '$Core::MT::CMS::'」と宣言されているから、 「${pkg}Dashboard::dashboard」というのは「$Core::MT::CMS::Dashboard::dashboard」 のことだと思う。

で、この「$Core」というのが何なのかわからない。

カレントのComponentをFooにセットしてから、Bar::buzを実行してくれ、という意味になります。
上の例で言えば、カレントのComponentとして'Core'を設定した上で、MT::CMS::Dashboardパッケージのdashboardメソッドを実行しろ、ということです。

息を吐くようにMTMLを書く。

  • Posted on
  • by

最近、友人との遊び目的で、プライベートなサイトをMTで作っています。
テンプレートには、Mid-Centuryを適用してみました。なかなか使い勝手が良いです。

そのサイトでは、大量のオーディオファイルや、特定のエントリーなんかをまとめたページを手軽に作りたくて、こんなカスタマイズをしています。


[mt.js]mt:tabを使ってみる

MT4の管理画面では、かなりしっかりした独自のJavaScriptライブラリ(mt.js)が用意されています。Transformerやalt-tmplでの管理画面のカスタマイズに応用できると良いのですが、残念ながら、今のところまとまったドキュメントも無く、応用するのが難しい状況です。

でもやっぱり、そんな使えるライブラリを放置するともったいないお化けが出るぞ、ということで、mt.jsの機能の中で一番簡単そうな、タブ機能の使い方を調べてみました。

アイコンの設置とcssでのli要素への表示が上手くいかずごり押しした。追加サービスの配布を考えるとこれから、て感じかしら。

あと、タグの取得もまだです。
ちょっとお出かけするのでパッケージングともども、あとで考えます。

config.yamlは大体こんな感じ。
あちこち変なので、もう少し手を入れる予定。

name: Hatena Bookmark
id: hatenabookmark
key: Hatebu
author_link: http://blog.aklaswad.com/
author_name: aklaswad
description: Adds profile service and activity stream for Hatena Bookmark.
version: 1.0
plugin_link: http://blog.aklaswad.com/
profile_services:
    hatenabookmark:
        name: Hatena Bookmark
        url: http://b.hatena.ne.jp/%s
        icon: images/b.png
action_streams:
    hatenabookmark:
        bookmarks:
            name: Bookmarks
            description: Hatena Bookmark
            fields:
                - note
            html_form: '[_1] bookmarked <a href="[_2]">[_3]</a> [_4]'
            html_params:
                - url
                - title
                - note
            url: 'http://b.hatena.ne.jp/{{ident}}/atomfeed'
            identifier: url
            atom:
                note: summary/child::text()
                created_on: issued/child::text()

hack-a-thonに行って来ました。

  • Posted on
  • by

SixApartさんにお邪魔して、MTハッカソンに参加させていただきました。
前回も参加したので、なんとなくわかっていたのですが、まあ、本当にひたすらハックする集まり。
誰もが(普段以上に)黙々とハックしておりました。

勿論、名だたるMTハッカーが集まっているのでちょっとした質問議論から大いに盛り上がることもあり。(o)さんがホワイトボードにメモしながら説明している風景などは、見ていて胸に来るものがありました!

MT4.1ではopモディファイアが導入されて、かなりプログラムチックなことが出来るようになっています。
そこで、なにかMTでやる意味のまったくない作業をテンプレートで作ってみたくなり、とりあえず素数判定を行うテンプレートを書いてみました。

現在のMTのテンプレートエンジンでは、MTForなどのループから任意のタイミングで抜け出すことが出来ないため、MTSetVarTemplateを再帰的に呼び出すことでループの代用をしています。
そのため、大きな数の判定を行うと馬鹿みたいにメモリを喰いまくります・・・
速度を度外視してアルゴリズムを簡潔にした事もあいまって、実用には耐えられない出来になってしまいました。
家のローカル環境では、大体1000くらいの数までなら耐えられますが、それ以上の素数を判定しようとすると戻ってこなくなります。
まあ、こんなことも出来る、というサンプルになればと思い公開してみます。

<mt:ignore> #setvartemplateを使って関数定義 </mt:ignore>
<mt:setvartemplate name="is_prime">
    <mt:if name="num" op="%" value="$check">
        <mt:ignore> #試し割りで余りが出た場合</mt:ignore>
        <mt:setvar name="check" op="++">
        <mt:if name="num" eq="$check">
            <mt:getvar name="num"> は素数だった!
        <mt:else>
            <mt:ignore> #再帰!!</mt:ignore>
            <mt:getvar name="is_prime">
        </mt:if>
    <mt:else>
        <mt:ignore> #試し割りで割り切れた場合</mt:ignore>
        <mt:getvar name="num"> は <mt:getvar name="check"> で割り切れたので素数じゃなかった!
    </mt:if>
</mt:setvartemplate>
 
<mt:ignore> #ここに判定したい数字を指定 </mt:ignore>
<mt:setvar name="num" value="71">
 
<mt:ignore> #チェック用変数の初期化。変更不可!</mt:ignore>
<mt:setvar name="check" value="2">
 
<mt:ignore>
    #setvartemplateで設定したテンプレートを呼び出す。
    #ついでに余分な空白を削除。 
</mt:ignore>
<mt:getvar name="is_prime" regex_replace="/(^\s*|\s*$)/mg":"">
 
<mt:ignore> #続けていくつか試してみる。 </mt:ignore>
 
<mt:setvar name="num" value="109">
<mt:setvar name="check" value="2">
<mt:getvar name="is_prime" regex_replace="/(^\s*|\s*$)/mg":"">
 
<mt:setvar name="num" value="111">
<mt:setvar name="check" value="2">
<mt:getvar name="is_prime" regex_replace="/(^\s*|\s*$)/mg":"">
 
<mt:setvar name="num" value="113">
<mt:setvar name="check" value="2">
<mt:getvar name="is_prime" regex_replace="/(^\s*|\s*$)/mg":"">

実行結果は以下のようになりました。

71 は素数だった!
109 は素数だった!
111 は 3 で割り切れたので素数じゃなかった!
113 は素数だった!

junnamaさんが面白いことやってたので脊髄反射で反応。MT4.01が前提で。

カウントをインクリメントするルーチンをSetVarTemplateを使って外に出してみました。
まっすぐにやると出来ないのでちょっとかっこ悪い書き方になってしまいました・・・
この辺はMT4.1 で追加される op モディファイアを使えばよりスマートに書けるようになるでしょう。

<mt:setvartemplate name="count_up">
    <mt:setvar name="count_3_original" value="$count_3">
    <mt:setvar name="count_5_original" value="$count_5">

    <mt:if name="count_3" eq="2"><mt:setvar name="count_3" value="0"></mt:if>
    <mt:if name="count_3" eq="1"><mt:setvar name="count_3" value="2"></mt:if>
    <mt:if name="count_3_original" eq="0"><mt:setvar name="count_3" value="1"></mt:if>

    <mt:if name="count_5" eq="4"><mt:setvar name="count_5" value="0"></mt:if>
    <mt:if name="count_5" eq="3"><mt:setvar name="count_5" value="4"></mt:if>
    <mt:if name="count_5" eq="2"><mt:setvar name="count_5" value="3"></mt:if>
    <mt:if name="count_5" eq="1"><mt:setvar name="count_5" value="2"></mt:if>
    <mt:if name="count_5_original" eq="0"><mt:setvar name="count_5" value="1"></mt:if>
</mt:setvartemplate>

<mt:setvar name="count_3" value="1">
<mt:setvar name="count_5" value="1">

<mt:entries lastn="100">
    <mt:setvar name="output_line" value="$__counter__">
    <mt:if name="count_3" eq="0"><mt:setvar name="output_line" value="fizz"></mt:if>
    <mt:if name="count_5" eq="0"><mt:setvar name="output_line" value="buzz"></mt:if>
    <mt:if name="count_3" eq="0">
        <mt:if name="count_5" eq="0">
            <mt:setvar name="output_line" value="fizzbuzz">
        </mt:if>
    </mt:if>
    <mt:getvar name="output_line">
    <mt:getvar name="count_up">
</mt:entries>

MT4のStyleCatcherでは、カラム数などのレイアウトを指定できるようになっています。テンプレートを編集せずにレイアウトを変更することが出来、非常に楽でよいです。

しかし、レイアウトが簡単に変更できる反面、メインページだけ3カラム、他は2カラム、といった使い分けが出来なくなっています。
そこで、StyleCatcherからレイアウトを変更でき、しかも必要なテンプレートでは別個にレイアウトを指定できるようなカスタマイズを行ってみました。

Movable Type のプラグイン作りはそれはそれは楽しいのです。
しかし、作り始める時には中々腰が上がらないもの。
ディレクトリ作ってL10Nの雛形をコピペして。svnにimportしたらテスト用にMTインストールしてプラグインディレクトリに突っ込んで。
そうです。自分のコードを書き始めるその前の準備が面倒くさいんです。

そんなところに現れた救世主こそ、われらがCheebowさん作、MTPlugin-Starterスクリプトです。

これは素晴らしいです。雛形があっという間に出来るので、いきなりコードを書き始められます。This is good!

さて、残る大きな手間は、テスト用のMovable Type環境の用意と、作成したプラグインのテスト環境へのインストールです。ココの作業を簡略化できれば、もう怖いもの無しではないでしょうか。そこで、ちょっと工夫してみました。

Movable Typeでのブログの再構築時にコメントやトラックバックのCGIに対して張られるリンクでは、通常、mt-config.cgiで設定したCGIPathを基準としてURLが設定されます。
しかし、Movable Type の 3.3 以降のバージョンでは、CGIPathのホスト名を省略することで、各ブログのブログURLのホスト名部分をもとにしたリンクをCGIPathとして出力させることが可能となっています。
この機能を利用して、作成したブログをあたらしい独自ドメインで公開する際に、トラックバックURLなどをその独自ドメイン以下のURLとして公開することが出来ます。

ただし一つ条件があって、独自ドメインで公開する際のCGIのURLと、本来のCGIのURLが、ホスト名以下の部分で一致している必要があります。これをクリアするためにはいくつかの方法があるかと思いますが、自分が使っているXREAさんで、シンボリックリンクを使った設定が上手く行ったので紹介します。

mt-view.cgiを使ってみる

Movable Type には、本家提供のPerl版ダイナミックパブリッシング「mt-view.cgi」が、ひっそりと同梱されている。
とりあえず中身見たりしながらテスト環境で動かしてみたのでそのまとめをメモしておきます。

色々弄った

  • Posted on
  • by

久しぶりに色々やってました。

mt3.33にアップグレード(今更)

dbのアップグレードも無いので、特に苦労なし。

個人的な備忘録用にmtをインストール

自宅鯖にインスコ。サクサク書ける様に、Text::HatenaでMTプラグイン。 (ささやかなる実験場の開発室):を参考にはてな記法に対応してみる。
my $entry = $ctx->stash('entry');
ココが上手く動かない。どうやら$ctxが渡されていないみたい。なぜぇ。 とりあえず、$ctxが空のときはpermalinkを指定しないことで回避。 これで記事の書きやすさが200%にアップした。約2倍書く計算。 まあ、はてな記法を使ったことは無いわけだが。

Firefoxについて色々調べた

自宅ノートを2.0にあぷぐれど。 アドオンの仕様についてざっと調べる。

アドレスバーに「about:config」で設定編集が出来る。初めて知った。スゲー。
同様に「about:cache」なんてのも便利。

ブックマークを整理

普段あまり使わないブックマークって、実際問題必要ないよね。 ということで、日常的に使わないものはブックマークツールバーからすべて退避。 そして、Favicon Pickerを使って、日常的に使うものをアイコンのみの状態でツールバーに並べていく。ツールバーがすっきりしてかなり良い感じです。 FaviconPicker は気づいたらfirefox2.0に対応したようですが、こちらは未確認。

アイコンの画像はbookmarks.htmlに埋め込まれているので、そのまま他のクライアントに移植可能。
bookmarkはインポート・エキスポートで移動すると却って混乱するので、直接bookmarks.htmlを挿げ替える。firefoxが起動している状態だと上手く行かないので、終了させてからファイルを入れ替えること。

フィードを整理

Bloglinesのフィードをフォルダに整理。

Plaggerではまる

しげふみメモ:PlaggerでBloglinesのフォルダ別にGmailへ送る: を参考に、Gmailでタグ付けできるようにPlaggerを弄る。ついでに欲が出て、はてぶのカウントを表示させようと、Plagger::Plugin::Filter::HatenaBookmarkUsersCountをインスコ始めて嵌る。いくつかのモジュールがインスコできない。関係なさそうなので放置してみた。まだ新着が無いので確認できていないが、駄目かもしれないよ。

TagCloudPlus

mt3.3標準のプラグイン、WidgetManager用のWidgetを作ってみました。
といっても標準のタグクラウドに毛が生えたようなものですが。
sizeとcolorの「+」「-」をクリックすると、それぞれフォントサイズと色の濃淡を動的に変更できます。
もうちょっと使い勝手を良くしたいですね。
また、少しアニメーションを入れてみたら面白いかもしれません。

mod_proxy

ハッカーと画家 コンピュータ時代の創造者たち友達に借りた本に、「簡単な道と難しい道があったら、難しいほうを選べ。」とか書いてあった。
といっても、茫漠とした人生論では無い。単純に技術系ベンチャーでの製品開発の心構えとして、競合に対してアドバンテージを得るために、習得が困難でもより強力な方法を(文中では「プログラム言語を」)選択しろ、ということだ。

最初の2章程は、なんだか、何故学校でオタクがいじめられるのかをひたすら弁解していて、嫌になったが、後半のテクニカルな話になると俄然面白くなってくる。コンピューター言語の歴史みたいなことに興味があって、Lispはどのような経緯で実装されたか、なんて話で興奮できる奇特な人にはお奨め。

現在、我が家のデスクトップ上ではApacheが2つ起動している。
windows上のapache1.3と、debianで動作しているapache2だ。(ちなみにdebianはVMWareで動いてます。)
都合上、コンテンツをまとめることは出来ないが、ルータ越しにはどちらかにしかアクセスを振り分けることが出来ない。
コレを回避するために色々考えてみた。
考えられる方法はふたつ。

・片方のポートを変更する
利点 : 設定が簡単。
欠点 : アドレスがかっこ悪くなる。

・内部proxy + mod_rewriteを使う。
利点 ; アドレスがスマートになる。
欠点 : 設定が難しそう。

ということで、本にコロッと影響されて、apacheを弄ることにした。
apache2のパッケージに全て入っていたので、再コンパイルも必要なし。
ココなどを参考にして、さくっと設定できました。

#a2enmod proxy
#a2enmod rewrite

で、/etc/apache2/mods-enabled/proxy.confを修正して、RewriteRuleを[P]オプションつきで指定すれば完了。

いやー、apacheって本当に良いものですね。