2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12
2002 : 01 02 03 04 05 06 07 08 09 10 11 12
2001 : 01 02 03 04 05 06 07 08 09 10 11 12
2000 : 01 02 03 04 05 06 07 08 09 10 11 12
1999 : 01 02 03 04 05 06 07 08 09 10 11 12
1998 : 01 02 03 04 05 06 07 08 09 10 11 12
1997 : 01 02 03 04 05 06 07 08 09 10 11 12
1996 : 01 02 03 04 05 06 07 08 09 10 11 12
ワルシャワ――ポーランド南部、ソスノビエツ市の警察は27日、路上を歩 いていた男性に、家屋の2階窓から投げ落とされた「大型犬のセントバーナー ド」が直撃、男性が打撲傷を負った、と述べた。1歳の犬の体重は約50キ ロ。
(中略)
警察は飼い主を動物虐待の容疑で調べている。
4 つの図形を組み合わせていろんな形を作る.宿泊先の部屋においてあっ て思わずしばらく格闘してしまった.
最初の 1 個を作るのに難儀した.いったん感覚が分かると,他のを作るの はわりとサクっと行ける感じ.凸じゃないところをどうするかを切り口とし て考えるのがコツかな.
Flash による実装:
cf. シルエットパズル - Wikipedia
土日かけて長野へ出張.いつも通り悪名高いえきねっと [2005-11-10-1] [2005-09-24-1] で新幹線と特急を予約していたのだけど,出発前日になっ て 土日きっぷなるものの存 在を教えてもらう.エリア内なら特急も新幹線も乗り放題で 18,000 円.お いおい普通に 仙台-東京 を新幹線で往復するより安いぞ.
予約してしまった特急券がどうなるか不安だったけど,普通に土日きっぷを 買っておいて (発売は前日まで),当日みどりの窓口に申し出るだけで問題 なかった.
というわけで,旅程を入れるとおトクなきっぷを検索してくれるサービス:
つうかえきねっとにこの機能が統合されていれば済む話だろうが.ぶつぶつ.
↓ amazon の曲目リストは曲名間違えてるな…
前回の素数列挙 OpenGL 版 [2006-06-27-1] に引続き,「Collatz 予想の h(n) を求めるピタゴラ機械もどき」という色物ネタを考えていたのだが, 時間がないのと,いざ実装しようと思うとあまり面白くなさそうだったので やめた.そのうち気が向いたら書くかも.
01年 ヒキガエルとエサ
02年 コオロギの求愛歌
03年 ダチョウとシジュウカラの集団
04年 ワモンゴキブリとペパーミントの香り
05年 ベニツチカメムシの帰宅
06年 チャバネゴキブリの交尾
まじですか.ガクブル
面白い.はてブのコメント にもあるけど,慣れてくると自由に反転できて楽しい.
!?
http://refrigerate.sear.biz/ から文字列置換したものらしい.インパク トは強烈なんだけど,もしこれが第三者がやってるんだとしたら,いろんな 意味で問題なんではなかろうか.Adsense とか貼ってるし.
どうでもいいけどふと JavaScript:document.body.innerHTMLのガイドラ イン を思い出した.
「画像で取得するAPI」ではてなブックマーク件数をお手軽に表示してみた 矢先なのだが [2006-07-15-3],やっぱりやめた.
はてなが重いときとか反応しないときに,自分のページの表示が影響を受け るのが嫌だってのがまずあるけど,そのときに,あー,俺いまはてなサーバ に無駄に負担かけてるーという罪悪感があって精神衛生上よろしくない. (いや,もちろんトラフィック全体からみると,うちから発生する分なんて 誤差に過ぎないわけですが,単に気持ちの問題なので)
つうわけで真面目にはてなブックマーク件数取得APIを叩いてみることにしたですよ.
やり方はいろいろあると思いますが,定期的に件数を取りに行っておいて, HTML から SSI で include することにしてみた.こんなのを cron で定期 的に走らせます:
#!/usr/bin/perl
use strict;
use XMLRPC::Lite;
my $html_clog_url = 'http://www.kagami.org/diary'; # don't add trailing slash
my $html_clog_dir = '/home/swk/www/diary';
my $hatebu_count_dir = '/home/swk/www/hatebu_count';
my $EndPoint = 'http://b.hatena.ne.jp/xmlrpc';
my @urls = ();
while (<$html_clog_dir/*.html>) {
next unless /\/(\d{4}-\d{2}-\d{2}-\d+)\.html$/;
my $ymdi = $1;
push(@urls, "$html_clog_url/$ymdi.html");
if (@urls == 50) {
&writecount(\@urls);
@urls = ();
sleep(3);
}
}
if (@urls > 0) {
&writecount(\@urls);
@urls = ();
}
sub writecount
{
my ($uref) = @_;
my $map = XMLRPC::Lite->proxy($EndPoint)
->call('bookmark.getCount', @{$uref})->result;
foreach (@{$uref}) {
my $url = $_;
my $count = $map->{$_};
my ($ymdi) = ($url =~ /\/(\d{4}-\d{2}-\d{2}-\d+)\.html$/);
if ($count > 0) {
my $str_count = $count . " user" . (($count > 1)? 's': '');
my $str = << "HTML";
<span class="hatebu_count">
<a href="http://b.hatena.ne.jp/entry/$html_clog_url/$ymdi.html">
$str_count</a></span>
HTML
;
&save_file("$hatebu_count_dir/$ymdi.htmlin", \$str);
} elsif (-e "$hatebu_count_dir/$ymdi.htmlin") {
unlink("$hatebu_count_dir/$ymdi.htmlin");
}
}
}
sub save_file { # from kuttukibbs-1.0rc3
my ($fn, $strp) = @_;
open(F, "> $fn") or die "can't open $fn : $!\n";
flock(F, 2);
print F $$strp;
close F;
}
chalow のテンプレートは,
... <h3 class="subtitle"><TMPL_VAR name=header> <TMPL_VAR name=cat> <!--#include virtual="../hatebu_count/<TMPL_VAR name=ymdi>.htmlin" --> </h3> ...
な感じにする.
* [uboeedmjnb] NEW DELHI: Investigators believe an e ma... (2007-11-26 08:48:20)
* [nwgtzxesqb] 1 quarterback before suffering a knee in... (2007-11-25 12:50:43)
* [fgoavlxizw] Dick\'s Sporting Goods said Tuesday that... (2007-11-24 12:01:02)
* [oyigsruuar] Citroen\'s Sebastien Loeb concluded the ... (2007-11-22 15:16:36)
* [trydkjdjud] "Combined with Chrysler\'s Multi di... (2007-11-19 13:44:55)
* ...
chalow のテンプレートの <h3> の辺りに入れてみた ($item_page_template と $item_template の両方).ちっともブックマークされていないのが火を 見るより明らかになった.
... <h3 class="subtitle"><TMPL_VAR name=header> <TMPL_VAR name=cat> <span class="hatebu"> <a href="http://b.hatena.ne.jp/entry/$clog_url<TMPL_VAR name=ymdi>.html"> <img src="http://b.hatena.ne.jp/entry/image/large/$clog_url<TMPL_VAR name=ymdi>.html" alt="See Hatena bookmark comments"></a></span> </h3> ...
1 件ずつリクエストが発生するのがちょっと微妙かも.はてなサーバ側の負 担も結構馬鹿にならないだろうなあ,などと余計なことを心配してしまうけ ど,こういう API を公開する時点で,その辺の目処は立ってるのだろう.
cf. はてなブックマーク件数取得API: http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%D6%A5%C3%A5%AF%A5%DE%A1%BC%A5%AF%B7%EF%BF%F4%BC%E8%C6%C0API
(追記) やっぱやめた → [2006-07-16-1]
* [ozuiawbrwa] NEW DELHI: Investigators believe an e ma... (2007-11-26 08:48:14)
* [kbfxzafkcq] 1 quarterback before suffering a knee in... (2007-11-25 12:50:35)
* [pxdvfwxyhq] Dick\'s Sporting Goods said Tuesday that... (2007-11-24 12:00:56)
* [wprbloodhj] Citroen\'s Sebastien Loeb concluded the ... (2007-11-22 15:16:18)
* [afhromkaut] Camry drivers have led a total of 165 la... (2007-11-19 13:03:16)
* ...
スーパーマリオの裏技的テクニックの解説.技術的根拠までちゃんと書いて あるのがすばらしい.以下,いくつか抜粋.
壁ジャンプ: スーパーマリオでは,壁にぶつかる際にめりこまないように水 平位置を調整するのだけど,その調整がなされる前に床判定をするので,あ る適切な水平速度で垂直な壁にぶつかり,かつその位置が正確に 16 ドット 境界ならば,足が引っかかるかのようにジャンプできる.
敵キャラを下から踏む: マリオが空中を下降中であれば,敵との当たり判定 があった際に「踏んだ」と判断される.
ハンマーをすり抜ける: ハンマーとの当たり判定は結構雑らしい.当たった ように見えて当たりと判定されなかったり,画面上では当たってないはずな のに当たりと判定されたりするそうだ.
せっかく B ボタンを押さずにクリアしたのに,ピーチ姫に「PUSH BUTTON B」 といわれちゃうのがせつない.(これって B ボタン以外で次の画面に進めたっけ?)
これは単に遠近法…だよなあ.…釣りビデオ?
↓たぶんこっちの方が例としては妥当.
cf. これ [2006-06-27-1] も遠近法です (← だからどうした)
cf. 錯視シリーズ: http://www.kagami.org/diary/clsearch.cgi?key=%BA%F8%BB%EB&mode=1
同サイトへアクセスして自分のアカウントにログインすると、ブラウザの画 面内にもうひとつのデスクトップが展開されます。左上端には「YOS Stuff」 というWindowsの「スタートボタン」に相当するものがあり、これをクリッ クすると、チャットやメール用ソフト、リッチテキストエディター、ファイ ルブラウザー、スティッキーズ、FlickrやYouTube専用のRSSリーダー、さら にウェブブラウザー(!)まで選べるようになっています。
YouOS につないでその中でウェブブラウザ開いて,それで YouOS につない でその中でウェブブラウザ開いて,それで YouOS につないでその中でウェ (ry
福澤諭吉が初めて使った説:
そうではない説:
改版しました [2006-10-08-2]
他人様のコードをいじっているうちに [2006-07-05-2] [2006-07-05-3] 何となく勘がつかめてきたような気が するので,調子に乗って懸案事項に手をつけてみる.
以前,bloglines で表示中の記事のタイトル名,URL をまとめてクリップボー ドにコピーする bookmarklet (Firefox 専用) を書いた [2006-02-11-1] [2006-04-22-1]. これ使うときは,
という流れが多くて,何とかならんかなと思ってたのだ.
というわけでこんな感じ.
onload を使っているので MSIE では動作しないはず.直すのは簡単だと思 うけど,とりあえず放置.
ソース:
javascript:(function(){
function phandler (paths) {
if (paths.length < 1) {
return;
} else if (paths.length == 1) {
top.treeframe.location = paths[0];
return;
}
var p = paths.shift();
var xhr = new XMLHttpRequest();
xhr.onload = function () { phandler(paths); };
xhr.open('GET', p, true);
xhr.send(null);
}
var paths = new Array;
var ipts = top.basefrm.document.getElementsByTagName("input");
for (var i = 0, k = 0; i < ipts.length; i++) {
if (ipts[i].type == "checkbox"
&& String(ipts[i].onclick).match(/markUnreadItem\(\s*(\d+)\s*,\s*(\d+)\s*\)/)
&& ipts[i].checked == true) {
var subid = RegExp.$1;
var itemid = RegExp.$2;
ipts[i].checked = false;
paths[k++] = '/myblogs_subs?ui=1&subid='+subid+'&itemid='+itemid;
}
}
phandler(paths);
})();
期せずして Ajax デビューしてしまった.(XML 使ってないから Aj デビュー か?)
やってることは単純で,keep new のチェックボックスについている onclick 属性から,その記事の subid と itemid を取り出して,それらか らパス名 '/myblogs_subs?ui=1&subid='+subid+'&itemid='+itemid を生成 して,GET しに行っている.
bloglines で実際に keep new のボタンを押した場合は, parent.treeframe.location にこのパス名を直接代入するコードが実行され るのだけど,複数の記事についてこれを単純に繰り返すと,前のやつの読み 込みが終わる前に次のやつを読みに行ってしまってうまく行かない.という わけで XMLHttpRequest を使ってみた.
(open の第3引数を false にすればもっと簡単に書けるかと思ったけど,そ うすると解除がすべて終わるまで操作を受け付けなくなってしまって,使い にくかった)
ついでなので,まとめてクリップボードにコピーする方もちょっとだけ書き 直しておく.以前のは正規表現で無理矢理抽出してたけど,真面目に DOM ツリーをたどるようにした.
ソース:
javascript:(function(){
function setClipboard(text){
/* 省略 (http://la.ma.la/misc/js/setclipboard.txt) */
}
function fmt(title, href) {
return '\r\n\t* ' + title + ':\r\n\t- ' + href + '\r\n';
}
var clog = '';
var h3s = top.basefrm.document.getElementsByTagName("h3");
for (var i = 0; i < h3s.length; i++) {
var a = h3s[i].getElementsByTagName("a")[0];
clog = clog + fmt(a.firstChild.nodeValue, a.href);
}
setClipboard(clog);
})();
ChangeLogメモ以外の形式に変換したい場合は,fmt() の中身を適当にいじっ てください.
コーヒーおむすび.おいしいらしい.
バナナの味噌汁.違和感ないらしい.
ブルーベリーカレー.いけているらしい.
cf. 違和感あるやつ → 喫茶マウンテン
神田なのかエチオピアなのかインドなのかよく分からないタイトルになって ますが,神田にあるエチオピアという店のインドカリーがローソンの弁当と して発売になったという話.
東京にいた頃はちょくちょく行っていた店なので,こうしてコンビニで買え るのはとても嬉しい.味も,あの独特の風味がよく出ているのではなかろう か.
本物は,タマネギをはじめとして色んなもの (何かはよく分かってない) が 溶け切らずに,ざらざらというかざくざくとした食べごたえが残っていて, それが特徴だったと思うのだけど,このローソン版は,完全にさらさらなイ ンド風ソースになっている.製造工程上の理由なのか,コンビニの客層に合 わせたものなのか.これはこれで悪くない.
7/18 にはトプカの「かつカリー」が出るのだとか.
「ぐぐる」が広辞苑に載る日は来るのだろうか.
xxxx yyy zzz wwwww
すげー
ソート [2006-07-05-2] に引続き,
行数の多い表の場合,ヘッダ部がスクロールアウトしてしまわないように固 定したくなる.
というようなニーズもやっぱり結構あって,実際いろんなところでそういう 機能を実現する JavaScript のコードが公開されている.いくつか当たって みた中で,一番気に入ったのはこれ:
気に入った理由は,
って要するに崩れないことが重要.他の方の実装も含めて,要するにヘッダ 部と本体とを分離して別の table 要素にして,本体だけにスクロールバー をつける,というのが動作原理なので,列幅の再現性をいかに高くするかが ポイントになる,のだと思う.ここで紹介されているコードは,(やっぱり ちょっとはズレる場合があるのだけど) かなりイケている,と思う.ありが たく使わせて頂いております.
テーブルの height は px 単位で指定するようになっている.画面全体に対 するパーセンテージで指定できると便利かな,と思って
newDiv2.style.height = tHeight+'px';
のところを 'px' じゃなくて '%' にしてみたのだけど,doctype スイッチ [2005-11-15-2] に引っかかるようになってしまった.doctype 宣言にシス テム識別子がある場合,'px' だとスクロールバーが出るけど '%' だと出 ない.システム識別子がなければ,どちらでもスクロールバーが出る.謎.
作者の Mars さんも書いておられますが,このままだと印刷するときちょっ と困る (全体が印刷できない).というわけで,かなりアドホックですが, こんな回避策をとってます.
(以下の実装は obsolete → メモその3 へ)
まずグローバルな変数を 2 個用意.
var newDiv2; var myHeight;
Tscroller() の中で newDiv2 をローカル変数として宣言するのをやめて, このグローバル変数を使うことにする.つまり単に
var newDiv2 = document.createElement('div');
を
newDiv2 = document.createElement('div');
にする.それから Tscroller() の中のどこかで
myHeight = tHeight;
してやる.最後に
function ToggleScroll()
{
if (newDiv2.style.height == '') {
newDiv2.style.height = myHeight + 'px';
} else {
newDiv2.style.height = '';
}
}
な関数を定義しておいて,適当な場所から href なり onclick なりで呼べ るようにしておく.これでスクロールバーをオン・オフできます.たぶん.
もっときれいに作れる気もするけど,最小の改造でやるならこんなところだ ろうか.
メモその2 がちょっとあまりにもアドホックすぎた気がする.テーブル 2 つ以上扱おうとしたらもうダメだし.もうちょっとだけ真面目に書きます.
メモその2 で書いた改造はすべて撤廃,改めて元の Tscroller() の最後あ たりに以下を入れて,
newDiv2.height_saved = tHeight;
以下のような関数を定義する.
function ToggleScroll(tid)
{
var newDiv2 = document.getElementById('D_' + tid + '_B');
var tHeight = newDiv2.height_saved;
if (newDiv2.style.height == '') {
newDiv2.style.height = tHeight + 'px';
} else {
newDiv2.style.height = '';
}
}
引数には Tscroller に与えたのと同じく,テーブルの id を渡します.
<a href="javascript:ToggleScroll('tb')">
Click here to toggle the scroller</a>.
div に height_saved なんていうプロパティを勝手に作っているところが非 常にうさんくさい.こういうことするのって規格上はダメなんですかね? 一 応 IE と Firefox では動いている模様.
HTML の表を,列名をクリックしてソートできるようにしたい.
というようなニーズは結構あって,実際いろんなところでそういう機能を実 現する JavaScript のコードが公開されている.いくつか当たってみた中で, 一番気に入ったのはこれ (の試作5):
気に入った理由は,
という辺り.ありがたく使わせて頂いております.
実際の表は,<td> の中にテキストが直接書かれているとは限らなく,たと えば <a> で囲まれたテキストが書かれてたりとかすることもあるわけで, 一般にはテキストに行き着くまで DOM ツリーを再帰的にたどってやる必要 がある.データ取得関数 getfn が分離されているので,こんなコードを書 いて getfn として渡してやることにした.
function byStrNoCase (cell) {
return extractText(cell).toLowerCase();
}
function byInt (cell) {
return parseInt(extractText(cell));
}
function extractText(node) {
var text = '';
if (node.nodeType == 3) { // TEXT_NODE
text = node.nodeValue;
} else if (node.hasChildNodes()) {
var n = node.childNodes.length;
for (var i = 0; i < n; i++) {
text = text + extractText(node.childNodes[i]);
}
}
return text;
}
JavaScript の Array の sort() は,安定であるとは保証されていないらし い.実際,IE は安定なソートをしてくれているっぽいが Firefox だと安定 でない.テーブルをかちかちクリックしてソートしたいときというのは,た とえば計算機一覧を,まずホスト名順にソートして,それから管理者順にソー トしてから,自分が管理者になってる子たちを見る,なんていう使い方をす ることが多いので,ソートは安定であって欲しい.
一番安直にやるには,ソート対象の要素にプロパティとして元の順番も持た せておいて,比較して引き分けだったら元の順番を保存するような比較関数 cmpfn を渡してやればよい.
のだが,元のコードだと,getfn が返した値を Object 型に変換してそれを ソートしているので,比較の結果として引き分けにならない.しかたないの で,getfn の返した値を Object 型に変換するのではなく,Object のプロ パティとして getfn の返した値を持たせてやるように書き換えて使ってい る.つまり
for(var i=0; i<N; i++)
x[i] = Object( getfn( rows[i].cells[index] ) ), x[i].row=rows[i];
の部分を
for(var i=0; i<N; i++) {
x[i] = new Object;
x[i].v = getfn(rows[i].cells[index]);
x[i].row = rows[i];
x[i].idx = i;
}
にしてやる.cmpfn は
function cmpAsc(a, b) {
if (a.v == b.v) {
if (a.idx == b.idx) {
return 0; // can't happen
} else if (a.idx > b.idx) {
return 1;
} else {
return -1;
}
} else if (a.v > b.v) {
return 1;
} else {
return -1;
}
}
function cmpDesc(a, b) {
return cmpAsc(b, a);
}
みたいな感じ.
同じものらしい.
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12
2002 : 01 02 03 04 05 06 07 08 09 10 11 12
2001 : 01 02 03 04 05 06 07 08 09 10 11 12
2000 : 01 02 03 04 05 06 07 08 09 10 11 12
1999 : 01 02 03 04 05 06 07 08 09 10 11 12
1998 : 01 02 03 04 05 06 07 08 09 10 11 12
1997 : 01 02 03 04 05 06 07 08 09 10 11 12
1996 : 01 02 03 04 05 06 07 08 09 10 11 12
最終更新時間: 2008-04-23 08:31