Hatena::ブログ(Diary)

Higé au lait Twitter

 | 

2007年08月31日

今日買った本

ワープする宇宙 5次元時空の謎を解く

ワープする宇宙 5次元時空の謎を解く


さてどこまで読み進められるか。

2007年08月29日

中央そろえ

io の alignCenter を javascript で。 プラス拡張

String.prototype.repeat = function(n) {
    for(var i=0, str=""; i < n; i++) {
        str += this;
    }
    return str;
}

String.prototype.alignCenter = function(n, str, astr) {
    var r = (n - this.length) / 2
    return str.repeat(Math.floor(r)) + this + (astr || str).repeat(Math.ceil(r));
}

js> "hoge".alignCenter(10, "-")
---hoge---
js> "fuga".alignCenter(13, "$")
$$$$fuga$$$$$
js> "foo".alignCenter(9, ">", "<")
>>>foo<<<

追記

第2引数が2文字以上の場合おかしくなるので

String.prototype.repeat = function(n) {
    var str = ""; 
    while(1) {
        str += this;
        if(str.length >= n) {
            str = str.slice(0,n);
            break;
        }
    }   
    return str;
}

あぁこれだと repeat って名前まずいか。

追記

repeat() に関して

String.prototype.repeat = function(n) {
    return Array(n+1).join(this);
}

というすばらしいのをどこかで見かけたのを忘れてた。

変数展開

ruby とかの #{foo} を 変数でおきかえてくれるやつね。

String.prototype.interpolate = function() {
    return this.replace(/#\{(.*?)\}/g, function($0, $1) {
        return window[$1];
    })
};
var a = "hoge"
alert("foo#{a}bar".interpolate()); // foohogebar

とりあえずグローバル限定。 ローカルのも考える。


ローカル変数も考慮に入れて

String.prototype.interpolate = function() {
    var variables = {}
    if(arguments.callee.caller) {
        var o = arguments.callee.caller.toString();
        var regex = /var\s+([\w_]+)\s+=\s+"(.*?)"/g;
        o.replace(regex, function($0, $1, $2) {
            variables[$1] = $2;
        })
    }
    return this.replace(/#\{(.*?)\}/g, function($0, $1) {
        return variables[$1] || window[$1];
    })
};

function hoge() {
    var a = "hoge";
    var b = "fuga";
    alert("foo#{a}bar#{b}".interpolate()); //foohogebarfuga ローカル
}
var name = "higeorange"
alert("Hello, #{name}!".interpolate() // Hello, higeorange! グローバル

Function.caller が使えないため Opera ではうごかず。

そもそも、 JavaScript クイックリファレンスによると

Function.caller は ECMAScript には含まれておらず、準拠した実装には必要ありません。 これは使うべきではありません。

とある。


ローカル変数の場合 function を文字列にして正規表現でごにょってるだけなのですべての変数に対応しているわけではない。

参考にした

2007年08月28日

岡山への旅

kuruma さんが電車で西の方に向かってきているので、岡山であえないかと思いつく*1

で、決定*2


昼前に家を出る。

青春18切符を買おうと高松駅付近でさまようが結局みつからず。

おにぎりとコーラを買う。

f:id:higeorange:20070827123401j:image


13:13発快速マリンライナーに乗り込む。高松ー岡山間 \1440 。

電車の中から瀬戸大橋の映像をとる。後ほど YouTube にアップする。

D



14:06 岡山到着。高松駅に比べ人が多いので戸惑う。駅前で岡山城の位置を確認。

f:id:higeorange:20070827141218j:image


路面電車に乗り *3 "城下" まで。 整理券をとるのかとどうかと挙動不審に。

f:id:higeorange:20070827141725j:image


降りた場所から岡山城の姿が全く見えず少し迷う。

無事に岡山城到着。

f:id:higeorange:20070827144044j:image


せっかくなので \300 払い城内へ。

復元だけにきれい。エレベーター完備。

最上階の狭さに萎える。

江戸時代の地図に興味をもち10分位眺める以外は特になにもせず出る。

ここで nanto_vi さんも京都から岡山に向かっていることを知る*4


1時間くらい余裕があったので近くの美術館でもいくかと思ったけどことごとく閉館。

しかたなく岡山駅付近に路面電車で戻る。

高島屋付近を道に迷いながら時間をつぶす。あとでこの時間で夕飯の場所を見つけておけばよかったと後悔。


17:00 過ぎ。岡山駅で無事 nanto_vi さんと合流。

kuruma さんが到着するまで時間があるので何をするか迷う。

路面電車で岡山城近くの商店街へ。

結局何もみつからず、コーヒーをのみながらまったり。


18:30 くらい。kuruma さんを迎えるために岡山駅へ。


18:40 くらい kuruma さんと合流。 karakara さんTシャツのおかげで遠くから発見できた。

飯屋を探すために駅前のタクシーの運転手に聞く。高島屋とそこ(どこ)の間の通りの道にあるという情報をつかむ。


が、思ってたより店が少ない。

ガセっぽい情報を掴まされたと気づく。


手っ取り早く 焼き鳥に入る。

Mozilla 24 の成功を祈って乾杯。

kuruma さんから Opera シールをいただく。

f:id:higeorange:20070828131556j:image


あーだこーだと話ながら焼き鳥をつつく。

\500 のフォアグラに興味を抱くが結局注文せず。


21:00前。 kuruma さんと nanto_vi さんのタイムリミットがちがずいているので店をでる。

写真をとってないことに気づき券売機のまえで写真をとる。写真をとってくれた人ありがとう。

今度は間をとって名古屋あたりでという約束をとって別れる。


21:13 快速マリンライナーで高松へ。


kuruma さん、nanto_vi さんありがとうございました。

感想

とにかく暑かった。

なんかネタを用意していくべきだった。

2007年08月25日

今日はまったこと

しょうもないことではまってしまった。

|| 演算子は 便利だ

var foo = typeof hoge != 'undefined' ? hoge : "hage"

var foo = hoge || "hage"

みたいにかける。つまり || の左側が偽*1なら右側を返すという具合だ。


で、はまったこと。

var foo = 0;
var bar = foo || 1;

foo が定義されていないと 1 を代入しろという風に書いたつもりだったんだけど

0 は 偽なので常に 1 が代入されてしまう。

もちろん、 0 じゃなくて false, null もおなじ挙動を示す。


以上誰もはまらないこと。

*1:この偽の意味が重要

2007年08月19日

Twitter のフォロワーのブログをまとめて LDR で購読する(結構手作業)

1. http://twitter.com/statuses/followers.json を取得。


2. 取得したファイルを follower.js と改名。


3. follwer.js を以下のように編集。

var followers = [{ ..... }] // 取得したJSON 部分。

String.prototype.println = function () {
    print(this);
}

"<html>".println()
"<head>".println()
"</head>".println()
"<body>".println()

for(var i=0;i<follwers.length;i++) {
    if(follwers[i]["url"] != null) {
        ("<p><a href=\"" + follwers[i]["url"] + "\">" + follwers[i]["url"] + "</a></p>").println()
    }
}
"</body></html>".println()

4. SpiderMonkey を使い

$ js follower.js > follower.html

で html を作成。


5. follower.html を適当なサーバにアップして

follwer.html をブラウザで開いて

javascript:location.href='http://reader.livedoor.com/subscribe/?url='+encodeURIComponent(location.href)+'&extract=on'

を実行。


6. あとは追加画面で適当に追加。


最後のページ内のリンクをたどり フィードのリンクをたどるってのが偉大なだけ。

すべて自動でやろうと思えばできるのかな。 とりあえず。 html 作成までは自動でできるわな。

onmousedown イベントが付加された アンカーは Opera ではドラッグできない

リンクをドラッグすれば、ブックマーク追加, デスクトップにショートカットをつくることができる*1

これらの動作を頻繁に使うものではないと思うのでこれからあげることがどれほど問題になるかはわからない。


http://higeorange.com/tmp/opera_mousedown.html


このページの各リンクをドラッグしてブックマークに追加してみるなど試みてほしい。

リンクは上から click, mousedown, mouseup イベントが付加されている。


mousedown イベントが付加されている2番目のリンクだけが Opera でドラッグできない。

他のブラウザ (IE, Firefox, Safari, Konqueror) は全てのリンクをドラッグできるようだ。 Thx, lomo.

なおマウスジェスチャーは問題なく動作する。(例: 右クリックして下: 新しいページで開く)


と、これ をごにょってるときに気づいた。

*1:Operaだとデスクトップにリンクはできないが

2007年08月17日

サイ本買ってきたよ

f:id:higeorange:20070817000314j:image

f:id:higeorange:20070817000213j:image


第3版汚れてるなぁ。表紙の染みはたぶんコーヒー。

お世話になった第3版ともお別れ?

io language を触ってみたよ 3

Image オブジェクト : 特定の幅より小さい画像*1を削除する

$ cat removeImage.io
dirPath := args at(1) // args at(0) にはスクリプト名が入ってる
width := args at(2) asNumber

dir := Directory clone setPath(dirPath)
image := Image clone
dir files foreach(f,
    if(f name endsWithSeq(".jpg"),
        if(image open(f path) width < width,
            "Deleting #{f name}" interpolate println // Sequence interpolate で #{} を変数展開
            f remove
        )
    )
)
$ io removeImage.io ./ 500

*1:jpg 限定になってるけど

2007年08月16日

みんな del.icio.us に自分のブログへのリンクをはればいいと思うよ

f:id:higeorange:20070816002838p:image


この by ほげほげ ってなってるところね。 このリンクを付けてる人少ないよね。

Network に追加するときに参考にするときのため。

タグの傾向みてもいいんだけど、どんなことをブログに書いているかをみるのが一番かと。


Settings -> Account -> edit profile で URL を追加できるからぜひ。

2007年08月14日

del.icio.us のコメント内にある URL をリンクにする

// ==UserScript==
// @name del.icio.us comments replace URL
// @namespace http://opera.higeorange.com/
// @include http://del.icio.us/*
// ==/UserScript==

(function() {
    var comments = document.evaluate(
        '//p[@class="notes"]',
        document,
        null,
        XPathResult.ORDERED_NODE_ITERATOR_TYPE,
        null
    );
    var notes;
    while(notes = comments.iterateNext()) {
        notes.innerHTML = notes.innerHTML.replace(
            /(https?|ftp)(:\/\/[-_.!~*\'a-zA-Z0-9;\/?:\@&=+\$,%#]+)/g,
            '<a href="$&">$&</a>'
        );
    }
})();

イテレータ使った方が短くかけるな < XPathResult


うゎーん。Firefox でエラーでるよー。調査中


上でエラーが出る場合はこちらを

(function() {
    var comments = document.evaluate(
        '//p[@class="notes"]',
        document,
        null,
        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
        null
    );
    for(var i=0,len=comments.snapshotLength;i<len;i++) {
        comments.snapshotItem(i).innerHTML = comments.snapshotItem(i).innerHTML.replace(
            /(https?|ftp)(:\/\/[-_.!~*\'a-zA-Z0-9;\/?:\@&=+\$,%#]+)/g,
            '<a href="$&">$&</a>'
        );
    }
})();

2007年08月13日

io language を触ってみたよ 2

HTTP GET

適当なページを拾ってきて標準出力

URL with("http://example.com") fetch print

Socket っていうアドオンをいれないといけない。


追記

Socket を記述しないでもいけるみたいだ。古いヴァージョンだと "Socket URL ... " としないといけなかった。


課題

Regex の使いかたを学ぶ。全然わからんぉ。


String のメソッドかかれてねーと思ったら String = Sequence と考えてよいのかな


正規表現

regex := Regex clone setPattern("\\d+") setString("1000yen")
regex match => 1000

使いにくいぉ。

2007年08月12日

io language を触ってみたよ

http://d.hatena.ne.jp/higeorange/20060911/1157955155 の約数を求めるメソッドを実装してみた

Number devidable := method(
    result := list()
    for(i, 1, self sqrt,
        if(self % i == 0,
            result append(i)
            if(i != self / i,
                result append(self / i)
            )
        )
    )   
    return result 
)

----
100 devidable => list(1, 100, 2, 50, 4, 25, 5, 20, 10)

組込みオブジェクトに対するメソッドが全くわからず手探りで作った。

普通にあるじゃないか 404 Not Found


javascript でいう Math が Number オブジェクトに組み込まれてる感じ

2 sqrt => 1.414214
2 pow(3) => 8
1.5 round => 2
1.5 floor => 1
....

cat.io

#!/usr/bin/io

f := File clone open(args at(1))
l := ""
while(l = f readLine,
    write(l, "\n")
)
f close

閉じ忘れ

2007年08月11日

Opera で float した要素の文字列選択がおかしい?

http://higeorange.com/tmp/test_float.html

Opera で各 li 要素に対して文字列選択を試みてほしい。


なお背景色が黄色になっているところが float した要素。


f:id:higeorange:20070811231624p:image

画像のようにおかしく文字列選択できる。

実際にこのように選択した状態で文字列をコピーすると、

"あんな人やこんな人と言葉を交わすこhoge" という文字列が得られる。


Firefox, Konqueror では 文字の順番どおり選択できる。 IE7 でも少し挙動がおかしいようだ。


で3番目の li 要素について Konqueror と Opera の比較

f:id:higeorange:20070811231735p:image

Twitter の "T" から ゆるい の "い" にかけてドラッグした結果.


float の挙動が 各ブラウザによって違うのも気になるところではある。

Opera & Konqueror は同一行で float。収まりきらないときは 改行して float。

IE & Firefox は 改行して float。


参照

2007年08月10日

Array 拡張

Array.prototype.fill = function(step) {
    if(this.length != 2 || typeof this[0] != 'number' || typeof this[1] != 'number') return this;
    var s = this[0];
    var e = this[1];
    var pl = (typeof step == 'number') ? step : 1;
    for(var res=[];s<=e;s+=pl) {
        res.push(s);
    }   
    return res;
}

仕様例

js> [1,10].fill()
1,2,3,4,5,6,7,8,9,10
js> [1,10].fill(2)
1,3,5,7,9
js> [1,10].fill(3)
1,4,7,10
js> [1,3,5].fill()
1,3,5
js> ["hoge","fuga"].fill()
hoge,fuga

要素が数字以外の場合の動作はこれでいいと思うけど、

長さが3以上のときの動作が微妙だな。

メソッド名も微妙

2007年08月06日

いまさら Twtter の感想

4月から初めてすでに4ヶ月たつわけだが、今更ながら感想を書いてみる。


ちなみに、lomo さんが Twitter に関するアンケートをとっている。

Nothing found for 2007 08 Twitter_survey


Twitter の使い道

1. 起きた。 寝る。 バイト。 帰った。 の基本行動パターン。

2. Twippera 開発状況。 これが多い。Twippera 作るために Twitter でつぶやいているような気がしてたまらない。順序おかしくなってる。

3. その他、独り言。

4. Friends へ語りかける。


のような感じで Twitter を使ってつぶやいてる。これで Twitter を楽しめてるかどうかは疑問が。

Twitter を始めて変わったこと

  • あんな人やこんな人と言葉を交わすことができた。 少しだけどね。
  • ブログの更新頻度が減った。 ブログの質があがったわけではない。
  • 他のコミュニケーション手段を使うことが少なくなった。 IRC とか。
  • 他人の発することが気になってしょうがない。 そうでもないか…。

なんで 4ヶ月も続けていられるのか -まとめ

Twitter を始めて大きなプラスがあったようには思えない。


ゆるいつながり

ゆるい共有

解放感


が 私を引き寄せているに違いない。

がしっと固まったコミュニティは苦手。


関連?

私がソーシャルブックマークを使い続ける唯一の理由 - Higé au lait

2007年08月02日

出るのかよ

O’Reilly Japan - JavaScript 第5版


出るとわかってたらリファレンス本なんて買わなかったのにーー。

これも買うよ。

2007年08月01日

jQuery のはまりどころ

最近になってようやく JavaScript ライブラリをいろいろ触っている。

どれがいいのかなぁと悩んだり。prototype.js? jQuery ?


で本題。

各ライブラリにエレメントを取得する $() 関数がある。

prototype.js と jQuery ではこの $() 関数の挙動が違う。


prototype.js では 引数に id をとって エレメントをひとつ返す。 document.getElementById() とほぼ同じ挙動。

jQuery では 引数に CSS セレクタ or XPath をとって エレメントの配列を返す。


つまり, id="foo" のエレメントを取得しようとしたとき prototype.js では

$('foo')

とするところを, jQuery では

$('#foo')[0]

としなくてはならない。

 |