Scalaで可変長引数のところに配列を渡す
pythonで書くころのコレを:
In [6]: def hoge(*a):
print a
...:
...:
In [8]: hoge(*(1,2,3,4,5))
(1, 2, 3, 4, 5)
Scalaで書くとこうなるみたい:
scala> def hoge(a:int*):Unit = { println(a) }
hoge: (int*)Unit
scala> hoge(1::2::3::4::5::Nil: _*)
List(1, 2, 3, 4, 5)
正直言って、 :_って何ですか?状態。そこの部分、:intとか書いちゃあかんのかなーとか思って試したらエラー。どうやら _* でsequence argumentですよーって印らしい。
The Scala Language Specification Version 2.7:
4.6.2 Repeated Parameters
The only exception to this rule is if the last argument is marked to be a sequence argument via a _* type annotation.
なーんか、Scalaってこういう記号が多いよなー。すっきりした文法とか言われてるけど、Perl並みに記号が多い気がする。 特に _ アンダーバー使いすぎ。
Scalaやり始めてみた
なんとなくScalaをやり始めてみた。
参考にしたのは以下のサイト。
- 気になる開発プロダクツ 第7回 Scala 2.6.0-final http://gihyo.jp/dev/serial/01/awdp/0007
- Using eclipse hotdeploy http://liftweb.net/index.php/Usingeclipsehotdeploy
Scala Plugin for Eclipseをインストールした後に、Mavenでliftのプロジェクトを作る。ScalaとLiftってmvnのプラグインがあるのがいいなー。
こんな感じでプロジェクトを作れる。mvn風に言うとアーティファクトが作れる。
mvn archetype:generate -U -DarchetypeGroupId=net.liftweb -DarchetypeArtifactId=lift-archetype-blank -DarchetypeVersion=0.8 -DremoteRepositories=http://scala-tools.org/repo-releases -DgroupId=jaro68.jp -DartifactId=helloLift
mvnがインストールされてれば、Using eclipse hotdeployのページのとおりにやってmvnで作ったプロジェクトをEclipseに投入できる。さらに書いてあるとおりに進めて、EclipseでHot Deployできた。楽チンやのー。
とりあえず、Hello Lift world。
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:のリソースプラグインではキャッシュが効かない。常に現在の時刻を返すので。これはなんとかできそう。
参考
紆余曲折で複数言語触っててよかった
職場が変わったのもあって、使う言語がひさびさにPHPになった。
仕事で使ってる遍歴は PHP -> Perl+ActionScript3+R -> PHP -> C# -> Java -> C++ -> Python -> C# -> C++ -> PHP(イマココ!) って感じでどれも中途半端に使ってきてるのが悩みの種だったわけなんだけど、それもまぁいいかなぁとか思ったってのが今日の話。
PHPを使うのは今回で3回目で、前から1年以上の間が空いているんだけど、前になんとかしたかった部分をいくつか改善できてる気がする。
今回はまぁ、C#やJavaのアノテーションだったり、Perlで書かれたPlaggerのプラガブルな設計だったり、ZopeやDjangoのテンプレート継承だったりのアイデアを拝借できて、あっちこっちフラフラしてきたけど意外に無駄になってないなぁと思ったのです。
で、それからいうと関数型言語も使っておかないとなぁ~と思っている今日この頃です。関数型言語は手続き型言語とは系統が違うんで、新たな視点を持てるはず。
さらばwordpress
どうやら僕はWYSIWYGってやつがほんとに苦手らしい。
WordもOpenOffice.orgも、Google Docsも使う気がしない。まぁ、自分のPCがしょぼすぎて最新のアプリを動かすに耐えないというのは差し引いても、なんかのマークアップ記法で書いているほうがよっぽど楽に感じる。
HTMLエディタのついたWordpressになってから、一気にブログを書く量が減った。びびる。それくらい、かくのがめんどいってのは、困ったことなんだなぁ。
というわけで、暫定的にtypoにした。
マークアップの中では、TeXとreStructuredText、PukiWiki記法あたりが慣れてて好きなんだけど、、、いかんせんそれをサポートしてる、いけてるブログエンジンってのが見当たらなかった。
ので、次点でMarkdown。
PythonのにCOREBlog以外の定番ブログエンジンってないよなぁ。あれはすっごくいいものだと思うんだけど、Zope入れたくない。 21世紀なんだから、DjangoかTGがPylonsで定番が出てほしいところ。
さーば落ちてた
emerge -uDa worldとNTTへの料金未払いが重なって一週間ほどサーバが落ちてました。ごめんなさい。
もっかいキーワード抽出
いくつか変更した。
今までは単語抽出だったのが、それっぽくキーワードを出すようにした。詳しくはコッチ -> キーワード抽出