ちょっと前に大学時代の同級生からメールが来て,ここを見たらしく,「鏡 がJavaScript使っててビックリ」とか言われた.まあ 1 年前の自分ですら びっくりかもしれない.
とか書いてて,そのメールで「年賀状出すから住所教えろ」みたいなこと言 われてたのを今思い出した.うわー放置してた,ごめん.でもまあ年賀状も らってもたぶん返事出さないので,50円浮いてツイテル! ってことにしとい て下さい.
個人情報保護法とやらのせいで,同窓会の名簿が発行されなくなったり,職 員録が発行されなくなったり (あと,学校とかで連絡網とかも廃れつつある のだとか) でなかなか不便なのだけど,でもまあこれを機に年賀状っていう 文化が死に絶えてくれるならそれはそれで不便さというコストを払う価値は あるかなとかひどいことをわりと本気で思っていたりするのは秘密.
うわ,台無しwwwww
しかしこれって面白い試みかも.見ていると,まるで他の人がリアルタイム で書き込んでいるかのような錯覚に陥る.1 本の動画という基準座標によっ て全ユーザの時間軸が見かけ上同期されているという,ありそうでなかった システムかも知れない.
(追記) 元動画が削除されたので入れ換えて,ついでに新しい貼り付け方法 に変更 (2007-02-12)
な,なに───────!?
左側に表示するのは普通 bbs2chreader だろう常識的に考えて…
必要な桁だけを用い、それ以下の桁を省略したいとき、不要な桁の先頭の数 が4以下であれば切り捨て、5以上であれば切り上げる、という端数処理の方 法。とても一般的なものだと認識されているけれど、そんなに万能ではない。
なにしろ、自然数だけで考えると、1, 2, 3, 4の4つは0になり、5, 6, 7, 8, 9の5つは10になるのだから、どう見たって不公平である。このままでは 平均などに偏りが生じる。
いやそのりくつはおかしい(AA略
0, 1, 2, 3, 4 vs 5, 6, 7, 8, 9 だから,個数の比較では別に不公平はな い.そういう問題ではなくて,「0.5000000...」そのものを 1.0 に丸める か 0.0 に丸めるかで偏りが生じるのだと思う.
* [通りすがり] なるほど。わかりやすい説明ありがとうございます。問いを勘違いしておりました。 (2007-01-06 20:25:35)
* [かがみ] うまく説明できるかわかりませんが,このような説明ではどうでしょうか?本来やりたい... (2007-01-02 23:33:16)
* [通りすがり] 0.0〜0.4999999…が0に丸められ、0.5〜0.9999999…が1に丸... (2007-01-02 02:25:20)
ttp記法の場合でもFirefoxのTextLink拡張機能でダブルクリックするとリファ漏れるよ
http://b.hatena.ne.jp/entry/http%3A//d.hatena.ne.jp/NOV1975/20061213/p1
つ「ステルスモード」
(追記)
オレはステルスモードはあえて使わずにttp記法していても構わずリファで通知してるよ
http://b.hatena.ne.jp/entry/http://www.kagami.org/diary/2006-12-14-1.html
あ,そうか,ステルスモードを使わない人が存在するから「リファ漏れる よ」って話なわけですね.納得.失礼しました.
しかしそれにしても "Considered Harmful" という言い回しはよほど印象的だったのか,以後この言い回しはコンピュータ・サイエンスの分野において何らかの批判を展開する際に用いられる常套句となっている。まずは件のエッセイに対する反論からして "'GOTO Considered Harmful' Considered Harmful" (Rubin, Frank) ――「『GOTO は有害である』とは有害である」と来ている。それに対する更に反論として "''GOTO Considered Harmful' Considered Harmful' Considered Harmful?" (Moore et al.) ――「『『GOTO は有害である』とは有害である』は有害か?」などと続く。
「オリビアを聴きながらを聴きながら」とか.
東芝さんのロボット研究について講演をお聞きする機会がありました.いろ いろ思うところあって,大変勉強になったのですが,ここでは途中で気になっ たどうでもいいネタを 2 つほど:
1. ビーチバレーロボットの顔がモララー に見える件.
2. ApriAlpha の声を聞いていると,いつ「特技はイオナズンです」と言い出 すかとハラハラする件.
portal askul が Firefox で開けなくなっ ていることに気づいた.
サイトが Firefox で有効になっていないセキュリティプロトコルを使用しているため、portal.askul.co.jp と安全に通信できません。
らしい.なんだこれ.
SSL 2.0 を使っているせいらしい.むーん.
むむーん.
PowerPointのアニメーション 機能を知ったばかりの人が作ったスライド
のように派手に動き回るグラフを生成するツール.
Gallery に サンプルがいっぱいあって楽しい.アニメーション自体はすぐ飽きて鬱陶し くなりそうだけど,まあそれも一興かと.
PukiWiki から手軽に使うためのプラグイン charts.inc.php ってのも作ら れている.
基本的には PukiWiki 1.4.7 用らしく,手もとの PukiWiki 1.4.5_1 だと, 「Undefined class name 'auth'」とか言われまくって動かない.作者の方 のページを見て回ったところ,PukiWiki-1.4.6 でも同じようなエラーが出 まくるとのことなので (別のプラグインだけど,たぶん同じ現象だと思う),しかたないのだろう.
とりあえず charts.inc.php-0.8 から「auth::なんとか」が呼ばれていると ころ 3 ヶ所を単純にコメントアウトしたら動いた.たぶん auth_check_off オプションを使わないのならこれでいいのだろう.
その他にはまった点: PukiWiki の記法で表組みの記述をする際に,各セル の数字の後ろに空白があるとダメっぽい.数字の前なら大丈夫.あと,行末 に空白があるのもダメらしい.これはなんだろう.
というわけで,研究室内 Wiki にコピー機の課金額グラフを載せて「無駄使 いするなよ」圧力をかけてみるテスト.圧力に感度があるかどうかわからな いけど.
純正 CF-AA1625AJS: 8000〜9000円?
奥行88mm×幅39mm×高さ27mm、質量:約190g
◎ FILCO POWERLINK slim PLS162P: 3500〜4000 円?
長さ110×幅50×厚み20(mm) 140g(本体のみ)
軽くて薄いけど,長さと幅はむしろ純正より大きい.PC 側のプラグがスト レートなので使いにくい場合もあるとか (amazon の評価コメントより).こ れが本命かな.
サンワサプライ ACA-P10: 7000〜8000円?
本体サイズ:W98×D42×H29mm 重量:260g
アーベル AGP107MPN: 6000 円くらい?
118×38×40mm (重さ不明?)
つうか Windows 95 の音は Brian Eno だったのか.まったく知らなかった.
しかし、フリップ先生も Vista チームを称えながらも、マイクロソフトか らのお金を何に使うか聞かれ、「新世代 iPod を買う」と答えるひねくれた ユーモアが健在で安心した。
python すごいな.この違いはどこから? ネイティブコードで動いてるから とかいうそれだけの話?
mhc-cvs を使うようにした [2006-10-15-1] のに引き続いて,日々のメモと いうか要するにこのページの抽出元になっているログを書く際にも emacs を X で飛ばさなくてもよいようにしたい,というわけで tramp を使いはじ めてみた.
結論から書くと,遅すぎてちょっと常用は無理かなという印象.
対象ファイルは 2006.txt みたいな名前で 1 年分が 1 個のファイルになっ ていて,サイズは 700 KB くらい.いろいろ試した結果,転送方法は (setq tramp-default-method "rsync") にするのが一番速いのだけど,それでも save するのに 3 〜 5 秒程度かかる.普段からわりとこまめに C-x C-s 叩 く方なのと,そうでなくても auto-save の度に数秒止まってしまうわけで, その度に思考が中断されてとても嫌な感じ.
正確には,save 中は完全に止まっているのではなくて,その間にタイプし た内容はちゃんと入力されていて,save 完了後に表示されます.しかし (特に日本語変換を含むような場合は) 視覚フィードバックがないとやっぱ りタイプしにくい.save はバックグラウンドで非同期に実行するような仕 組みにはできないものなのかなあとか思った.
何かいい方法はないものだろうか.
今までは自宅の emacs の窓を職場の PC の X サーバで開いて,作業メモの 読み書きなりスケジュールの読み書き (mhc) をしていたりしていたのだけ ど,自宅の回線は普通の ADSL なのでちょっと無理を感じていた.
というわけで自宅 PC が逝ったのを機に (あまり関係ないけど,単にきっか けということで),まずは mhc の方は mhc-cvs を使ってみることにする.
自宅に repository を掘る.
% mkdir /home/swk/mhc-cvsroot % cvs -d /home/swk/mhc-cvsroot init % cd ~/Mail/schedule % cvs -d /home/swk/mhc-cvsroot import -m 'Initial import' -I '.*' -I trash schedule name start % cd .. % mv -i schedule schedule.bak20061015/
で,.emacs に
(setq mhc-file-method 'mhc-cvs) (setq mhc-cvs-repository-path "/home/swk/mhc-cvsroot")
な風に書く.リモート側の PC は,
(setq mhc-file-method 'mhc-cvs) (setq mhc-cvs-repository-path ":ext:swk@host.example.com:/home/swk/mhc-cvsroot")
とする.もちろん CVS_RSH は ssh で,ssh-agent を使っている.
実は ssh のポートが標準の 22 ではないのだが,そこでちょっとはまった. 安直に CVS_RSH を "ssh -p 12345" とかにしてみたら cvs が
cannot exec ssh -p 12345: No such file or directory
とかいう素敵なエラーを吐いて失敗.結局
#!/bin/sh ssh -p 12345 "$@"
なシェルスクリプトを作るという微妙な方法で回避した.
mhc-cvs 自体は,ひとまず快適に動いているっぽい.スケジュールを書き込 むと即時 commit されるようだ.それはよいのだが update がどういうタイ ミングで行われているのかよくわからない….しばらく使ってみます.
今回紹介するフリーウェアはiris、プレースバー (ファイルを保存、開くダ イアログの左側) のカスタマイズソフトウェアだ。
irisを起動すると、プレースバーの表示項目(最近使ったファイル、デスク トップ、マイドキュメント、マイコンピュータ、マイネットワーク)が並ん でいる。そこから自由に選択して配置を変えられる。
しばらく試してみているけど,とても便利.しかし,iris による設定が反 映されるソフトウェアと反映されないソフトウェアがあったりしません?
と思ったけど,どうも MS Office だけが反映されないようだ.
で,よくよく調べると,Office の場合は「開く」「保存」ダイアログの右 上に「ツール」というメニューがあって,その中に「マイプレースに追加」 という項目がある.これを使って,適当なフォルダを選択して追加できるら しい.つまり Office の「開く」「保存」ダイアログは標準的な部品じゃな いってことなんだな.
既存のものを削除できないのがいまいちだけど,並ぶ順序は変えられるので, 下の方に追いやってやればまあ悪くないかも.
UNIX コマンドの使い方のクセを晒すのが最近の流行りのようですが(ほんと か),私の場合,
ls -trl
って打つのがほとんど手クセです (実際には alias l ls -l しているので l -tr が手クセなのですが).
-t と -r は,
-t Sort by time modified (most recently modified first) before sort-
ing the operands by lexicographical order.
-r Reverse the order of the sort to get reverse lexicographical
order or the oldest entries first.
なので,最近更新されたものが一番下に来ます.だから,だーーっとファイ ル名が流れて,最近いじったファイルが端末の画面に残ります.要するに超 整理法の一種かな.
私のホームディレクトリが雑多なファイルでごったがえしているのはこれの せいかも知れません.だって整理しなくてもあまり困らないんだもん.
* [Janus Benno] Ne nasovsem a navsegda (2007-04-10 18:47:00)
ソースコードなどを blog などに貼りつけるときにどうするのがよいか,と いう話がちょっと前に話題になっていたりして,その 論点の一つに「横に長すぎる場合」をどう扱うかが挙がっていたりするのだ けど,実は似たような問題はほかにもある.連続するASCII 文字列である.
典型的には,長ーい URL 文字列を表示した場合に,枠からはみ出したり, 枠自体がびろーんと伸びて見ずらくなったりする.といっても Firefox の 場合だけなのだけど.
対策法がこちらによくまとまっている:
ざっくり要約すると,まず Firefox ユーザ側の立場としては,
一方,Firefox を使っているかどうかに関らず,ウェブサイトの運営側の立 場としては,
ちょっとややこしいのは,url_breaker には「A要素のみを処理するもの」 と「全文を処理するもの」という 2 系統があり,さらに「xpi版 (つまり普 通の拡張機能)」と「Greasemonkey版」の 2 系統がある,のだが,それらが 直交していない.えーと,こんな感じ?
| A要素のみ処理 | 全文を処理 | |
| xpi | url_breakerの Ver.0.2.2以降 | 同左 (オプション設定) |
| Greasemonkey | url_breakerの Ver.0.2.1 | url_breaker_plus |
というわけで,実はしばらく前からウェブページ側に仕込んでみている. url_breaker_plus の方です.各 HTML ファイルの body 要素の一番最後辺りに,
<script src="/js/url_breaker_plus.user.js" type="text/javascript"> </script>
と入れる. url_breaker_plus.user.js はこちら. オリジナルのままだと開き括弧 {, {, [ の直後でも改行しちゃって(個人的 に)気持ち悪いので,正規表現を以下のようにちょっと修正して使っている.
// var regexp = new RegExp("([!-%'-/:=\\?@\\[-`\\{-~]|&)");
var regexp = new RegExp("([!-%'\\)-/:=\\?@\\\\-`\\|-~]|&)");
さて,実は長い文字列が横に伸びちゃうのが一番うっとうしいと個人的に思っ ているのは bloglines なのけど,url_breaker の効果は有ったり無かった りでどうも挙動が謎である.bloglines の記事表示が table レイアウトな のが問題なのかも.
* [xuxkbgaayp] NEW DELHI: Investigators believe an e ma... (2007-11-26 08:48:20)
* [ldobiofzlo] 1 quarterback before suffering a knee in... (2007-11-25 12:50:35)
* [xyktjpawdx] Dick\'s Sporting Goods said Tuesday that... (2007-11-24 12:00:43)
* [ebpngyrvzl] Henning Solberg (Ford) retired from sixt... (2007-11-22 15:18:50)
* [mtijoofvrl] Citroen\'s Sebastien Loeb concluded the ... (2007-11-22 15:16:36)
* ...
遥か昔,若気の至りでこんなシグネチャを使ってたことがあるのを思い出し た.
main(c,d/* 鏡 慎吾 (Shingo W. Kagami) */){c=!printf(&01[
"csh"]);/* 東京大学工学部計数工学科 */while(putchar(c[
"in/out"/* kagami@post.co.jp */]-'+'+c["++c++"]
)!=111)c/* t60685@hongo.ecc.u-tokyo.ac.jp */++;puts("1"+1);}
(注: 上のメールアドレスはどちらも消滅してます)
メールアドレスから判断するに学部 3 年くらいの頃か.C を覚えたての頃 ですね.インスパイヤ元は明らかに Korn の作品と思われる.
スケジュール管理は相変わらず MHC でやっ てます.
いったん Mew のバッファに移ってから C-c.. するのが煩わしく感じて来た ので,.emacs で
(global-set-key "\C-c.." 'mhc-goto-this-month)
してみた.微妙に便利になった気がする.
最近再燃している感のある無断リンク談義 [2006-06-29-1]ですが(もう下火 か?),関連してふと思ったこと.
いわゆるアダルトサイトって,トップページとかに「18歳以上ですか?」み たいな選択リンクがあるじゃないですか.No を選ぶと Yahoo! に飛んだり するやつ.あれって何なんでしょう? 「無断リンク禁止」がナンセンスなの と同等にナンセンス極まりないと思うんですけど.
と思ってちょっと調べてみると,風俗営業等の規制及び業務の適正化等に関 する法律の第31条の2あたりが根拠っぽい?
どうも解釈がいろいろ面倒くさそう.まともに読むと少なくとも有料サイト であればリンクを選ばせるだけじゃダメっぽいし,無料サイトにはそもそも 適用されるのだろうか.
というわけでさっぱりわかりません.教えて エロい人 エラい人.
(← これが書きたかっただけちゃうんかと小1時間)
ふと Flash Player 9 を入れてみたら, Firefox からクリップボードへのコピー ができなくなった.が るる.常用している bookmarklet [2006-07-08-1] が動かなくて困るので, Flash Player 8 に戻すことにする.
この辺を参考にした.
まず 9 をアンインストールした方がよさそうだ.以下のページにある 「Flash Player 8 uninstallers」がそのまま使えた.IE とか Firefox を 起動したまま走らせるとちょっと厄介だったので,止めてからの方がよさげ.
過去のバージョンの Flash Player は以下のページにある.Flash Player 8 をダウンロード,展開して,インストール.
というわけで無事戻った.
pya! が大好きだ.でも全部見て回る体力はない.
というわけで,ざっと一覧を眺めて評価の高いものだけ拾い読みしていたり していたのだけど,いまいち幸せでない.評価の高いものだけ選んでフィー ドできればいいのになあ.
と思ったので作ってみました.
pya! の過去ログを 15 ページほど蓄えておいて,リクエストが来ると条件 に合致する記事一覧を RSS として吐く.デフォルトの条件は「プラス評価 が300以上」.
未読管理のできる RSS リーダで読めば,条件を満たした時点で新着として 現れることになります.
pya! のページ構成が変わったらきっと動かなくなるに違いないのは仕様で す.というかつまり無断でやってますので,怒られたらさっさと引き上げま す.
あとこれ plagger でできると思うので誰かよろしく.
フィルタ条件は,cond パラメータとして渡してやる.空白で区切られた(よっ てエンコードされた URL 上では + で区切られた) 文字列のリストで,スタッ クマシンよろしく条件を記述する.たとえば
で「プラス評価が300以上の記事を抽出」となる.これがデフォルト.他に は
で「プラス評価がマイナス評価に比べて相対500以上で,かつ(18+)でないも のを抽出」となる.たぶん.
リストの要素は以下の 3 種類:
これらを順にすべて評価して,最後にスタックのトップに残った値が真だっ たらその記事はフィードに含める.偽だったら含めない.
変数はとりあえず以下の通り:
| $good | 「イイ」の数 |
| $ero | 「エロいな」の数 |
| $bad | 「ハゥ」の数 |
| $positive | $good + $ero |
| $negative | $bad |
| $hit | ヒット数 |
| $pu | PU 同意数 |
| $over18 | (18+) だったら 1,さもなくば 0 |
演算子には 2 項演算と 1 項演算がある.2 項演算 op は,pop した値を順 に x2, x1 として,x1 op x2 を計算する.op の種類はとりあえず:
| ge | >= |
| gt | > |
| le | <= |
| lt | < |
| eq | == |
| ne | != |
| plus | + |
| minus | - |
| and | && |
| or | || |
1 項演算 op は,pop した値 x に対して op x を計算する.op の種類はと りあえず:
| not | ! |
出力される RSS の description の部分には「(・∀・)イイ」とかの評価数 が表示されます.なので,記事内容に更新があったときに新着記事として扱 う RSS リーダを使っている場合は,一度読んだ記事が何度も何度も現れる ことになります.
例えば bloglines の場合は subscription の設定で Updated Items を ignore するように設定することができて,そうすればこの点は問題にはな りません.そのようなオプション設定のない RSS リーダを使っている場合 は,CGI に渡す hide_scores というパラメータを真にすることで, description が空の RSS を吐くようにすることができます:
過去ログを取って来る方のソース:
#!/usr/bin/env perl
use strict;
use LWP::UserAgent;
use Storable;
my $regexp1 = '<tr><td width.+?>(.+?)</td><td .+?><a href=\'pyaimg/pimg.php\?imgid=(\d+)\'.+?>(.+?)</a></td></tr><tr><td .+?>No\.(\d+)</td><td width.+?><SPAN CLASS.+?>(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}) :: .+?=(\d+).+?</td>(.+?)</tr>';
my $regexp2 = '<td .+?><Img Src=\'(.+?)\.gif\'.*?> : (\d+)</td>';
my $store_file = "/home/swk/pya_db/pya.stor";
&main;
sub main
{
my $html_code = &get_pya();
my @posts = ();
while ($html_code =~ /$regexp1/g) {
my %h = ();
$h{type} = $1;
$h{imgid} = $2;
$h{title} = $3;
$h{no} = $4;
$h{date} = $5;
$h{time} = $6;
$h{hit} = $7;
$h{counters} = $8;
push(@posts, \%h);
}
foreach my $p (@posts) {
$p->{title} =~ s/<b>//g;
$p->{title} =~ s/<\/b>//g;
while ($p->{counters} =~ /$regexp2/g) {
my $ctype = $1;
my $cval = $2;
$p->{$ctype} = $cval;
}
undef($p->{counters});
$p->{good} = $p->{ii1} + $p->{ii10}
+ $p->{ii5} + $p->{ii6} + $p->{ii7};
$p->{ero} = $p->{ero1} + $p->{ero2} + $p->{ero3} + $p->{ero4};
$p->{bad} = $p->{ii2} + $p->{ii12};
$p->{positive} = $p->{good} + $p->{ero};
$p->{negative} = $p->{bad};
$p->{pu} = $p->{p1} + $p->{p2} + $p->{p3} + $p->{p4} + $p->{p5};
$p->{over18} = ($p->{title} =~ /^\(18\+\)/)? 1: 0;
$p->{dcdate} = $p->{date} . 'T' . $p->{time} . ':00+09:00';
$p->{permlink} = 'http://pya.cc/pyaimg/pimg.php?imgid=' . $p->{imgid};
$p->{score} = join(', ',
("hit: $p->{hit}",
"(・∀・)イイ: $p->{positive}",
"(;´Д`)ハゥ: $p->{negative}",
"PU: $p->{pu}"));
if ($p->{title} =~ /^(.+) \((情報:.+)\)\s*$/) {
$p->{itemheader} = &html2xmlstr($1);
$p->{itemauthor} = &html2xmlstr($2);
} else {
$p->{itemheader} = &html2xmlstr($p->{title});
$p->{itemauthor} = 'pya';
}
}
Storable::store(\@posts, $store_file . '.new');
rename($store_file . '.new', $store_file);
}
sub get_pya
{
my $page_max = 15;
my $pya_str = "";
my $pya_url = 'http://pya.cc/kako.php?genre=1&kakopage=';
my $ua = LWP::UserAgent->new;
for (my $i = 1; $i <= $page_max; $i++) {
my $http_response = $ua->get($pya_url . $i);
$pya_str .= $http_response->content;
sleep(3);
}
return $pya_str;
}
sub html2xmlstr { # from chalow-1.0rc4
local ($_) = @_;
s/ / /g;
s|<img.+?alt="(.*?)".*?>|[$1]|gosm;
s/[\t\n]//g;
s/[\x00-\x1f]+/ /g;
s/\s\s+/ /g;
s|<[^<>]+?>||gosm;
s/</</go;
s/&/&/go; s/>/>/go; s/</</go; s/\"/"/go; # "いつもの4つ
return $_;
}
CGI のソース:
#!/usr/bin/perl -T
use strict;
use POSIX qw(strftime);
use Template;
use Storable;
use CGI;
use Encode;
my $store_file = "/home/swk/pya_db/pya.stor";
my $rss_tt2 = << "RSS"
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:admin="http://webns.net/mvcb/"
xml:lang="ja">
<channel rdf:about="[% self_url %]">
<title>filtered pya</title>
<link>http://pya.cc/</link>
<description>filtered pya!</description>
<dc:language>ja</dc:language>
<dc:date>[% rss_dcdate %]</dc:date>
<admin:generatorAgent rdf:resource="http://www.kagami.org/pya_filter/"/>
<items>
<rdf:Seq>
[% FOREACH i = items -%]
<rdf:li rdf:resource="[% i.permlink %]"/>
[% END -%]
</rdf:Seq>
</items>
</channel>
[% FOREACH i = items -%]
<item rdf:about="[% i.permlink %]">
<title>[% i.itemheader %]</title>
<link>[% i.permlink %]</link>
<description>
([% i.type %])[% UNLESS hide_scores %] [% i.score %] [% END %]
</description>
<dc:creator>[% i.itemauthor %]</dc:creator>
<dc:date>[% i.dcdate %]</dc:date>
</item>
[% END -%]
</rdf:RDF>
RSS
;
&main;
sub main
{
my $time1 = (times)[0];
my $q = new CGI;
print $q->header(-type => 'application/xml',
-charset => 'UTF-8');
my $postsref = Storable::retrieve($store_file);
my $cond = $q->param('cond') || '$positive 300 ge';
my $filter = &mkfilter($cond);
my @items = map &$filter($_), @$postsref;
my $tt2 = Template->new();
my $rss_out;
$tt2->process(\$rss_tt2, {
self_url => $q->url(-full => 1, -query => 1),
hide_scores => $q->param('hide_scores')? 1: 0,
items => \@items,
rss_dcdate => strftime("%Y-%m-%dT%H:%M:%S+09:00", localtime),
}, \$rss_out);
Encode::from_to($rss_out, 'euc-jp', 'utf8');
print $rss_out;
my $time2 = (times)[0];
printf("<!-- time elapsed: %f (s) -->\n", $time2 - $time1);
}
sub mkfilter
{
my @cs = split(/\s+/, shift);
my @fn = ();
foreach my $c (@cs) {
if ($c =~ /^(-?\d+)$/) {
my $arg = $1;
push(@fn, sub { push(@{$_[0]}, $arg); });
} elsif ($c =~ /^\$([a-zA-Z_][a-zA-Z01-9_]*)$/) {
my $arg = $1;
push(@fn, sub { push(@{$_[0]}, ($_[1]->{$arg}) + 0); });
} elsif ($c =~ /^([a-zA-Z_][a-zA-Z01-9_]*)$/) {
my $arg = $1;
push(@fn, sub { &op($_[0], $arg); });
} else {
return sub { return (); };
}
}
return sub {
my ($p) = @_;
my @stk = ();
foreach my $f (@fn) {
&$f(\@stk, $p);
}
return pop(@stk)? $p: ();
}
}
sub op
{
my ($s, $o) = @_;
my %biop = ('ge' => sub { $_[0] >= $_[1]; },
'gt' => sub { $_[0] > $_[1]; },
'le' => sub { $_[0] <= $_[1]; },
'lt' => sub { $_[0] < $_[1]; },
'eq' => sub { $_[0] == $_[1]; },
'ne' => sub { $_[0] != $_[1]; },
'plus' => sub { $_[0] + $_[1]; },
'minus' => sub { $_[0] - $_[1]; },
'and' => sub { $_[0] && $_[1]; },
'or' => sub { $_[0] || $_[1]; },
);
my %uop = ('not' => sub { !$_[0]; }
);
if (defined($biop{$o})) {
my $b = pop(@$s);
my $a = pop(@$s);
push(@$s, &{$biop{$o}}($a, $b));
} elsif (defined($uop{$o})) {
my $a = pop(@$s);
push(@$s, &{$uop{$o}}($a));
}
}
作ってて思ったこと.ちゃんと評価したわけじゃないけど,上のプログラム で試した範囲では,
(追記) hide_scores まわりの説明がわかりにくかったようなので書き直し ました.
bloglines で keep new していた記事がいくつか行方不明になっている.左 側のフレームで keep new な記事数がかっこ表示されているのに,右側には 何も出てこなかったりする.出てこないから keep new の解除もできなくて かっこ表示残りまくり.気持ち悪い.というか,普段から keep new を酷使 しまくる人なので [2006-07-08-1],とても困る.
該当しそうなアナウンスが一応出ている.
これによると一時的なもので,データのロスはないという.メンテナンス前 のデータが新しいデータベースに移行されていないってことか? …と思って いたら,ついさっき keep new した記事がまた消えている.なんだこれ?
そろそろ livedoor reader 辺りに乗り換えろということだろうか.
って常識ですかそうですか.私はついさっき知りました.偶然 T を押した らタブ出現! すげー驚いた.
C-t リンクが指す先の文書を新しいタブで開きます (TAB_LINK)
T 新しいタブを開きます (NEW_TAB)
C-q 現在のタブを閉じます (CLOSE_TAB)
} 次のタブに移動します (NEXT_TAB)
{ 前のタブに移動します (PREV_TAB)
ESC-t タブ選択メニューを立ち上げます (TAB_MENU)
<NOT ASSIGNED> 現在のタブを右に移動します (TAB_RIGHT)
<NOT ASSIGNED> 現在のタブを左に移動します (TAB_LEFT)
前回の素数列挙 OpenGL 版 [2006-06-27-1] に引続き,「Collatz 予想の h(n) を求めるピタゴラ機械もどき」という色物ネタを考えていたのだが, 時間がないのと,いざ実装しようと思うとあまり面白くなさそうだったので やめた.そのうち気が向いたら書くかも.
最終更新時間: 2008-04-23 08:48