LaunchyからTwitterに投稿する
Twitterに投稿するかどうかって、いかに気軽に投稿できるかってのにかかってると思います。思ったときに、最短コースで投稿できないとやるきがうせます。Twitterに書き込むのに、タスクトレイをクリックして、メッセージ入力ボックスをクリックして、書いて、なんてのはめんどくさすぎます。マウス->キーボード->マウスって超めんどい。TwitやTweenやIMになんでグローバルホットキーがついてないのか不思議だなー。
そんなわけで、世の中にはコマンドラインから入力できるクライアントが世の中にはあるわけです。
けどまぁ、簡単そうだったんで自分でも作ってみました。言語はC#。実行ファイルにしたかったんで。
HGのリポジトリはコレhttp://hg.jaro68.jp/twi。 zipで固まったのはコレhttp://hg.jaro68.jp/twi/archive/tip.zip。
使い方は、twi.exe.configにユーザー名とパスワードを書いておいて、twi HOGE!とかコマンドを打つとTwitterに書き込まれます。Launchyから使うときにはtwiまで打ってからTABキーを押して、で、What are you doing?を打ち込む。TABキー重要。
これをLaunchyとかbluewindみたいなキーボードと使うコマンドラインランチャーに登録しておくと、キーボードから手を離さずに打てて幸せ。実際コレ使い出してからTwitterへの投稿回数が増えた気がする。ちなみにtwitterはsett4でやってます。
実は、Take Launchy beyond application launchingっていうエントリにLaunchyからTwitterに投稿できるバッチファイルがあったんだけど、それだと日本語を打てなかったので作った。
URLはメソッドか関数か
今回はURLのつくりはメソッドみたいなヤツか関数みたいなヤツかあるけど、メソッドみたいなヤツが好きですっていう話。
URLのつくりを考えるときに毎回悩むんだけど・・・。 URLって、オブジェクトの持つメソッドみたいな設計にするのか、関数みたいな設計にするのか。いや、勝手に名前をつけただけなんで一般的にどういうのかはわかんないけど・・・。
メソッドみたいなヤツは・・・こんかなんじ。 http://hoge.com/username/profile/edit
ユーザusernameのプロフィールを編集しますよ、ってつくり。ユーザはプロフィールを持ってて、プロフィールには編集ってメソッドがありますって感じで非常にオブジェクトチックでわかりやすい。Zopeなんかはこんな感じだと思うし、TurboGearsのCherryPyもこんな感じだと思う。
関数みたいなヤツはたぶんこんなかんじ。 http://hoge.com/profile/edit/username
プロフィールを編集します、ユーザusernameの。っていう状態。何そこ倒置法なの。 RailsみたいなController/Actionのタイプだと、profileがコントローラでeditがアクションで、usernameの部分がeditに渡る引数になる。Rails, Pylons, Zend Frameworkとけっこうたくさんのフレームワークがこんな感じになってるともう。(標準ではね)
で、どっちが僕が好きかっていうと、、、メソッドみたいなやつのほうが好きかなぁ。しかし、世の中のフレームワークはけっこう関数みたいなURLを標準としてる。
前に同僚とこの話をしたことがあって、オブジェクトの持つメソッドとURLがわかりやすく連結されてるZopeとかCherryPyがわかりやすくていいなぁて言ったんだけど、Routesを使ってController/Actionにマッピングしたほうが柔軟かつ明示的でわかりやすいよ、と言われた。このへんになってくると趣味の世界だとおもうけど、マッピングでごちゃごちゃ関連付けされるんじゃなくて、オブジェクトとURLがそのまま対応付けされてるZopeの世界はシンプルできれいだなぁと今でも思う。
さっき倒置法って書いたけど、日本人にとっては同士が最後に来ない関数みたいなURLは倒置法だと思う。けど、英語圏の人にとっては動詞が先に来ているんで違和感がないのかな?
日本人の僕にとっては最後に動詞が来てくれた方がしっくりきておさまりが良く感じる。
で、何がいいたいかというと、僕はURLはメソッドみたいな奴が好きです、っていうただの告白でした。で、メソッドみたいなURLがいいから、TurboGears2.0でも使ってみようかな?っていうことか。
PyHyperEstraier のスニペット生成を修正
Emerge Technologyで公開されているPyHyperEstraierで、うまくスニペット作成ができなかったのでちょっと手を入れた。
具体的には、キーワード周辺の検索語が取得できない。HEから返ってくるスニペットが文章の頭のスニペットの間と検索語周辺スニペットの間に空行が入っているんだけど、それをスニペットの終了として処理しているのが原因かな?
対象はPyHyperEstraier 0.10.4、HyperEstraier 1.4.10の組み合わせ。
patch:
--- hyperestraier.py.orig 2008-02-08 19:20:31.000000000 +0900
+++ hyperestraier.py 2008-02-08 18:44:29.000000000 +0900
@@ -883,9 +883,13 @@
elems = rdline.split("=", 1)
if len(elems)==2:
rdattrs[elems[0]] = elems[1]
+ hsnippet = False
while len(lines):
rdline = lines.pop(0)
if not rdline:
+ if hsnippet == False :
+ hsnippet = True
+ else:
break
sb.append(rdline)
rduri = rdattrs.setdefault("@uri", None)
Tracにも書いた。
SmartyでDjangoみたいなテンプレート継承してみた
仕事で1年ぶりにPHPを使った。テンプレートエンジンはSmartyということだったのだけど、今見直すとテンプレート継承できないのがつらいので、できるようなプラグインを書いた。多段階の継承もできるよ。
はじめに
DjangoとかZopeのTALとかrhacoとか最近のテンプレートエンジンはみんなテンプレート継承ができる。で、Smartyでもできたらいいのになぁ、ということで作った。
テンプレート継承は、オブジェクト指向の継承だと、親クラスで定義されたメソッドを子供のクラスでオーバーライドしたり、abstractなやつを実装したりして、子供のほうで詳細な部分を指定していく。ソレと同じように、親テンプレートで定義してあるブロックを、子供テンプレートでオーバーライドしたりできたらいいなぁ、というもの。
なんでテンプレート継承がしたいかというと・・・。Smartyのテンプレートの作り方って言うと、hoge.tplの中で最初にinclude file=”header.tpl”つぎに内容を書いて、include file=”footer.tpl”ってやるかんじ。
で、それだとだるいよねって感じで、 SmartyでRailsライクなレイアウトテンプレートを使う という記事があったりする。しかし、この方法だとコンテンツに表示するテンプレートファイルを別途PHPのコード側で指定しないといけなくて、できればそれはテンプレートの側で完結していてほしいなぁ、と思った。
使い方
ソースコード
index.php:
<?php
require_once 'Pearified/Smarty/Smarty.class.php';
$smarty = new Smarty();
SmartyBlocks::registerTo(&$smarty);
$smarty->display('subtemplate1.html');
?>
base.html:
<html>
<head>
{include file="block:css"}
{include file="block:javascript"}
</head>
<body>
<div class="base">
base template
</div>
<div class="base">
{include file="block:sub"}
</div>
</body>
</html>
subtemplate1.html:
{block name="sub"}
<div class="subtemplate1">
subtemplate1
{include file="block:subsub"}
</div>
{/block}
{block name="css" mode="append"}
<link rel="stylesheet" href="subtemplate1.css" type="text/css" />
{/block}
{include file="base.html"}
結果
こんなかんじ:
<html>
<head>
<link rel="stylesheet" href="subtemplate1.css" type="text/css" />
</head>
<body>
<div class="base">
base template
</div>
<div class="base">
<div class="subtemplate1">
subtemplate1
</div>
</div>
</body>
</html>
構成要素
blockブロックプラグイン
{block name=”body”} 今日はいい天気だ。雪だけど。 {/block}
として使える。そうすると、後でblockスキーマを使ってインクルードできる。
- nameパラメータ
- 任意の文字列
- このタグで囲まれた内容を、なんと言うブロックに割り当てるか
- modeパラメータ
- [insert|replace|append]のいずれか
- タグの内容をnameに指定されたブロックの先頭に追加するのか、置き換えるのか、最後に追加するのか。多段継承するときに便利。
blockリソースプラグイン
{include file=”block:body”} でつかえる。
事前にblockブロックプラグインを用いて定義されたブロックを{include file=”block:body”}とかして読み込む。
制限
- 継承するテンプレートの指定は必ずテンプレートの最後で行う。先にblockブロックプラグインでブロックに入る内容を定義して、そのあとでblockスキーマでインクルードする。
- block:のリソースプラグインではキャッシュが効かない。常に現在の時刻を返すので。これはなんとかできそう。