次のレスまでスクロール

スペースキーに次のレスまでスクロールする機能を割り振って実験してみる。とりあえず、一番上に表示されているのレスを基準にスクロールさせているのだが、当然レスによってスクロールする量はまちまち。人間、スレッドを読むときはたいてい中央かそれより下に視線がいっているもので、そういう場合にスクロールさせると、今目を通しているレスがどこへ行くか見当が付かないので、思ったよりイライラする。普通に半ページ送りくらいの定量スクロールの方が使い勝手がいいかもしれない。

ヌルヌルっとスムーズスクロールの巻

smorgasbord は、F5キーを乗っ取って、独自の関数を呼ぶことで動的にレスを追加しています。せっかくなので、キーボードを活用したいところ。ということで、スペースキーが押下されたときは一番上に表示されているレスの次までスクロールする仕様にしました。同じように、右カーソルキーでも次のレスまでスクロール、左カーソルキーで逆に前のレスまでスクロールすることにしました。

ここで気づいたのは、普通に下カーソルキーでスクロールした場合、ズズッとスムーズスクロールされるのですが、単にscrollTo()を呼ぶだけだと、バチッとスクロールされてしまうので、どこからどこまでスクロールされたのかが視覚的に分かりづらい、ということ。せっかくなので、iPhone みたいにヌルヌルっと加速するスクロールをしてみたい。

が。どっから手をつけていいかわからない。あてもなく「加速度 スクロール」でググってみる。すると「等加速度運動」というキーワードを発見。なんだか一度高校で習った気がしないでもないが、文系なので全く覚えていない(致命的)。本棚から物理の参考書を探し出すと、さっそく公式を発見。

位置の公式: x = x0 + v0t + 1/2at2

うーん、この単元は高一の一番始めだったかもしれない。

とにかく、今回の用途では、現在のスクロール位置 (window.pageYOffset) から指定の場所までヌルヌルとスクロールさせたい。初速度は当然ゼロ。中点に来たところで、最高速度に達する。スクロールする距離に関わらず、一定の時間でスクロールさせないとユーザビリティに支障をきたすので、まずは適切な加速度を求めてあげなければならない。ここから先は、どうにかして中学生の数学の知識を必死に掘り返すしかない。とりあえず、上の公式を加速度 a についての方程式に式変形すると、

1/2at2 = x - x0 - v0t
a = 2(x - x0 - v0t) / t2

となる。初期位置 x0 と 初速度 v0 を無視すれば

a = 2x / t2

となる。位置 x に中点、時間 t に 中点に到達するまでの時間を代入してあげれば、加速度 a が求まる。あとは、最初の公式でその加速度を使い、スクロールする分割数を t として、ループを回してインクリメントしていけば位置が求まる。中点まで来たら、終点位置から (1/2)at2 を引いて、t をデクリメントしていきブレーキをかける。とりあえずコードを。

function smoothScrollTo(y) {
    var y1 = window.pageYOffset;
    var y2 = y
    if (y2 < 0) y2 = 0;
    if ((y2 + window.innerHeight) > document.body.offsetHeight)
        y2 = document.body.offsetHeight - window.innerHeight;
    var delta = y2 - y1;
    var steps = 16;
    var a = (delta / 2) * 2 / Math.pow(steps / 2, 2);
    var ha = a / 2;
    for (var x = 0; x < steps / 2; ++x) {
        window.scrollTo(0, y1 + (ha * Math.pow(x, 2)));
    }
    for (var x = steps / 2 - 1; x >= 0; --x) {
        window.scrollTo(0, y2 - (ha * Math.pow(x, 2)));
    }
    window.scrollTo(0, y2);
}

ふぅ。なんとか実装できたみたい。PageDown, PageUp, Home, End なんかにもこれを適用してあげるとヌルヌルになっていい感じだ。同じようなことをする Firefox拡張機能があったような気がしないでもないけど。

後期唯一の定期試験

西洋美術史。当方、ネタの引き出しが全くないので、かなり不安だったがいざ始めてみると思いのほかスラスラと解答用紙が埋まる。19-20世紀の西洋絵画史における変化と、ティツィアーノの『ウルビーノのヴィーナス』とマネの『オランピア』の比較の話だったかな。同学部/同系統の西洋音楽史のテストよりは難易度低いような希ガス。去年、あっちはタカをくくってたら前期ヒドイ目にあったから。

wtClavier 2007/01/29

http://wtclavier.drwatson.nobody.jp/

  • [Win]キーを修飾子にとるキーで、Swap()が上手く動作していなかったので修正
  • その副作用で、スタートメニューが誤って開いてしまうケースが直ったかも
  • デバッグモードの出力結果が見やすくなった

んー、だいたい直ってるといいんだけど。

七行プログラミング

音系をお題に一つ、という流れだったので初参戦してみた。自分の七行化スキルの低さに失望。もう寝る。

#include <windows.h>
int d[]={659,195,2,739,184,2,783,164,4,739,220,2,659,220,2,622,246,4,659,220,2
,739,220,2,493,195,4,554,184,2,622,184,2,659,164,4,587,184,2,523,184,2,493,195
,4,440,220,2,391,220,2,361,246,4,391,220,2,440,220,2,493,195,2,440,195,2,391,
246,2,361,246,2,329,164,2,329,184,2,659,195,2,739,184,2,783,164,4,739,220,2,6\
59,220,2,622,246,4,659,220,2,739,220,2,493,195,4,554,184,2,622,184,2,659,164,
4,587,184,2,523,184,2,493,195,4,440,220,2,391,220,2,369,293,6,391,293,2,391,1\
95,8};WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){for(int i=0;i<sizeof(d)/s\
izeof(int);i+=3)for(int j=0;j<d[i+2]*2;++j){Beep(d[i],25);Beep(d[i+1],25);}re\
turn 0;}

# 楽譜を探してデータに起こすのに一時間くらいかかったのは内緒

W-ZERO3 UtilityPlusクローン

W-ZERO3[es]でいわゆるベル打ちを実現するctrlswapminiと、W-ZERO3 UtilityPlusを、multikeyhookで同時に使用すると、コンフリクトして正常にテンキーが使えなくなるトラップが存在する。これを回避するには、どうにかしてキーボード使用時のみW-ZERO3 UtilityPlusを有効にしたい。・・・が、その方法がみつからない。ということで、それだけのためにゼロからW-ZERO3 UtilityPlusクローンを作ることに。わざわざVS2005を購入するのもお金のムダなので、eVC4 + Windows Mobile 2003 SDKで何とかする。W-ZERO3[es]のWM5.0でも問題なく動くし。
実は、正確には、もうプログラム自体はだいぶ前に完成していて、実働テストを兼ねて、フツーに毎日常用してます。あとは、ドキュメントを整備すれば、オンラインソフトとして公開できる状態です。
・・・いや、挙動に多少不安なところはあるけども、実際、実機である程度使えてるからね。