2009年 01月 13日

jAutoPagerize が一部ページでクソ重い現象の解消

fotolife の編集ページを jAutoPagerize させるとクソ重くてどうしようもないので、野生の勘で体感速度を向上させるハックを入れた。

http://coderepos.org/share/changeset/28350

L245 に追加した行をコメントアウトしたりインしたりして http://f.hatena.ne.jp/*/edit みたいなページをロードすると劇的に差を体感できる……

なんでこうなるかっていうのはいまいちよくわからないけど

  • 画像が読みこまれると周りの要素がつらつらと再フローされる (width/height がかいてないから?)
    • あとこのサムネイルに設定されてるセンタリングのための onload ハンドラが重い?
  • 画像が多いのでこれがめっちゃ走りまくる

なのかなぁと思ったので、それを解消できそうな感じのことをしてる。思惑通りにいってるかは微妙なんだけど、少なくとも早くなったことは確かなのでとりあえずよかった

Fx のスクロールはブラウザのパフォーマンスおちに敏感すぎる。flickr も早くなるかと思ったけどよくわからなかった

gerry++

ごはん食べたあとは危険

2009年 01月 09日

JS のコードを短かくする Tips

可読性を犠牲にしてコードサイズを減らす簡単な方法のメモ。ゴルファーな人はもっとちゃんと知ってそうだなぁ

var を消す

そもそもグローバルを汚染していいならいりませんが、そうでなくても関数の仮引数に書くことで普通に消せます

(function(a){
    var b;
    alert(a)
})()
(function(a,b){
    alert(a)
})()

本当に使いたい仮引数のあとにツラツラかけばOK

var を消す (その2)

function 式を代入するときは function 宣言に変えることで短かくなります。

(function(a){
    a=function(){}
})()
(function(){
    function a(){}
})()

代入を消す

定数を前もって代入するようなケースでは var → 仮引数 と併用して代入を消せます。

(function(){
    var R=Math.random,p='px'
})()
(function(R,p){
})(Math.random,'px')

長いプロパティ名のくくりだし

何度も同じプロパティアクセスをする場合 [str] にして定数をまとめることで短かくなることがあります。

(function(d,e){
   d[e]; d[e]
})(document,'documentElement')

if/else → 三項演算子

だいたいは頭使わずに変換できます。

if(a<b){
    a
}else{
    b; c; d
}
a<b?a:(b,c,d)

式一つしか書けなくなるので、複数の式を書きたいときはセミコロンをカンマに変えて括弧でくくるようにします。文が含まれているとどうしよもないので諦めましょう。代入とかは式なのであんまり困らないです

セミコロンを消す

閉じブレース前のセミコロンは普通消せます

function を再利用する

条件が厳しいですが1つの function を複数の用途に使いまわすことで短くなることがあります。

(function C(a){
    a?(prepare...,setTimeout(C,100)):alert('loaded')
})("foobar")

定数代入がくるかどうかで分岐しています。あとで呼びだされるほうでは外からうけとる定数を使えないので、前もって準備が全て完了するようなものじゃないとだめです。

arguments.callee

上の例でやっていますが、関数式の関数名は単純に arguments.callee の速記になります。関数宣言のように外のスコープの変数になったりはしません。

(function C(){
alert(C===arguments.callee)
})()
C() //=>  C is not defined
2009年 01月 03日

gerry++

itai

2008年 12月 30日

gerry++

ハライタ状態!! ↓ AA

2008年 12月 28日

マウススピードを起動するたびにスワップする AutoHotKey すくりぷと

マウスの右ボタンをこれ起動するように割り当てた。10以下じゃないとポインタを1pxずつ動かせない。

2008年 12月 24日

うごメモのサムネイルをデフォルトでアニメーションさせる GM

// ==UserScript==
// @name        Animate All Thumbnails
// @namespace   http://lowreal.net/
// @include     http://ugomemo.hatena.ne.jp/*
// ==/UserScript==
//
location.href = "javascript:"+encodeURIComponent(uneval(function () {
	Ten.Selector.getElementsBySelector('img.thumb').forEach(function (thumbnail) {
		console.log(thumbnail);
		thumbnail.onmouseover = function () {};
		thumbnail.onmouseout = function () {};
		thumbnail.src = thumbnail.src.replace(/_m.gif$/, '_as.gif');
	});
}))+"()";

設定であるような気がしたけど見付からなかった

イベント解除がうまく動いてない

2008年 12月 05日

gerry++

二段階……

2008年 12月 02日

汎用ダウンローダっぽいのが欲しい

http://github.com/cho45/middown/tree/master

git clone git://github.com/cho45/middown.git
git submodule init
git submodule update
./middown-daemon.rb &
./middown-http.rb &
./middown.rb add http://....
./middown.rb add http://www.nicovideo.../sm1 nicovideo
(ダウンロード先はいまのところハードコードで /tmp になってます)


ブラウザから進捗がみれたりタスクが追加できるダウンローダが欲しいなぁと思いました。ブラウザの拡張として実装されているいろいろとか、普通のダウンローダとかはいっぱいあるのですが、アプリケーション間連携がしにくいのです。

あと、ダウンロードしたあとに特定のスクリプトを実行させたいとか、具体的にはエロ動画サイトとかなんで zip 圧縮されてんだよファイル名を動画間で一緒にすんなよとか、ニコ動の動画落としたら ffmpeg で mp3 抽出して ID3 のアルバム名に動画IDつっこみたいとか、いろいろ思うところがあるのですがうまいことできるのが見つけられなかったり……

remedie のダウンローダはどうなるかなぁと思いつつ、よくわからなかったのですぐできそうな範囲で Ruby で軽く書いてみました。


全然いろいろ足りてないのですが若干やる気なくなってきたという…… ダウンローダはやること少ないけど拡張性考えると考慮することが足りていない気して結構めんどうくさい感じ……

  • ダウンロードスクリプトを言語依存にしない

というところだけを考えて、標準入出力でステータスを管理する、みたいな感じにしてみました。

middown-daemon.rb がダウンロードプロセスの管理、middown-http.rb middown.rb は daemon に問いあわせてタスクを追加したり表示したりする。(http のほうはタスクの追加をまだ実装してない。)

ダウンロードスクリプトは plugins/ 以下にあり、タスクを追加するときにどのスクリプトを使うか指定するようになっています。これらはタスクが追加されると `script uri dir` という形で呼びだされ、指定したディレクトリに任意の名前で保存するようになっています。その際、進捗を標準出力にひたすら吐いていて、それが daemon 側で管理されています。


問題点

  • ファイル名を今はダウンロードスクリプト側に決めさせているけど、あんまりよくない気がする。
    • でもニコ動なんかはファイル名をよしなにしてほしい
  • theruck (ザラキ) がキモい
  • スロットルの実装が欲しい
    • URI ベースで daemon 側でプロセスを制御するしかない


とりあえず作ってみた感が激しいので、設計も含めてなんかもっといい方法ないかなぁと思う次第です。