順道制勝

Always a fresh start.

September 2026
S M T W T F S
 12345
6789101112
13141516171819
20212223242526
27282930  
  • このエントリーでは、Webページのコンテンツ量がブラウザの表示領域の大きさを超えた時に表示されるスクロールバーを、Webページのコンテンツとして生成する方法を、特に一般的なWidgetプラットフォーム上での実装に主眼をおき、簡単なサンプルをまじえながら紹介する。

    Widgetというと、HTML+JavaScript+XMLといった、敷居が比較的低いプログラミング言語(?)で実装されており、少しWebページを作成したことのある人ならば簡単に開発可能な、今もっとも手軽に作れるアプリーケーションであると言える。
    しかし、いくら「Webページを作るのと同じ感覚」と言っても、実際PC上で動作しているWebブラウザとWidgetのプラットフォームを比較すると、やはりまだ機能的に追いつけていない点や、携帯電話ネイティブがゆえに、「あえて追いかけていない」点がある。

    その具体例として、スクロールバーがある。
    PC上のブラウザだと、Webページのコンテンツの内容がブラウザの表示領域の縦幅を超えると、自動的にスクロールバーを生成するが、
    多くのWidgetプラットフォームが、モバイル端末の多様性(タッチパネル、方向キーの有無など)もよって、スクロールバーを一元的にサポートしていない。
    したがって、コンテンツ量が多くなる場合にはWidgetコンテンツ側でスクロールバーを用意する必要があり、実際に多くの既存のWidgetが独自の方法でスクロールバーの実装を行っている。

    以下は、ACCESSのNetFrontBrouserWidgetプラットフォーム上で動作する楽天市場Widgetである。スクロールバーがコンテンツとして実装されている。

    null

    これらのWidgetは、スクロールバーが動作する領域と、それによって移動させられるコンテンツを、divタグにonClick属性やonMouse属性を持たせることによって実現している。
    以下に、サンプルを示す。

    上記のように、Widgetの縦幅を超えるコンテンツ量が存在する場合、スクロールバーウを実装しなければならない。
    そこで、

    上記のように、Widgetの表示領域を閲覧コンテンツ用スペースと制御用のスペースに分けて、制御用のスペースでは、スクロールバー(scrollbarface)やスクロールバーが稼働する範囲(scrollbarbackground)、スクロールバーを上下させるボタンなどを表示する部分を設ける。

    このスクロールバーの画像にonClick属性を仕込み、Clickすることで、
    document.body.scrollTopの値を足しこむ、もしくは引き込むことによって、上記の図にて赤い部分である、閲覧するコンテンツ(body部分)のスクロールが可能である。
    また、コンテンツ量全体に対するdocument.body.scrollTopの値を調べ、scrollbarfaceの位置に反映させることで、スクロールバーが上下する様子も再現可能である。
    以下は、上記のサンプルのNetFrontBrowserWidgetプラットフォーム上で動作するWidgetのソースコードと、それに含まれるJavaScript(scroll.js)の例である。

    function vscrollbar(scrollface, scrollbackground, scrolltop) {
        var scrollLimit = scrollbackground.offsetHeight - scrollface.offsetHeight;
        var dragFlag = false;
        var pointerPos = 0;
        var scrollFacePos = 0;
        var delta = 0;
    
        this.scrollUp = function() {
            document.body.scrollTop -= 20;
            scrollFacePos = document.body.scrollTop * scrollLimit / (document.body.scrollHeight - window.innerHeight);
            scrollface.style.top = scrolltop + scrollFacePos;
        };
    
        this.scrollDown = function() {
            document.body.scrollTop += 20;
            scrollFacePos = document.body.scrollTop * scrollLimit / (document.body.scrollHeight - window.innerHeight);
            scrollface.style.top = scrolltop + scrollFacePos;
        };
    
        this.mouseDown = function(e) {
            if (document.body.scrollHeight - window.innerHeight > 0) {
                dragFlag = true;
                pointerPos = e.screenY;
            }
        };
    
        this.mouseUp = function(e) {
            dragFlag = false;
        };
    
        this.mouseOut = function(e) {
            dragFlag = false;
        };
    
        this.mouseMove = function(e) {
            if (dragFlag == true) {
                delta = e.screenY/*e.pageY*/ - pointerPos;
                //alert(e.pageY + "," + pointerPos);
                pointerPos = e.screenY; //pageY;
    
                scrollFacePos += delta;
                if (scrollFacePos  scrollLimit) {
                    scrollFacePos = scrollLimit;
                }
                scrollface.style.top = scrolltop + scrollFacePos;
    
                //alert(scrollface.style.top);
    
                document.body.scrollTop += Math.floor(delta * (document.body.scrollHeight - window.innerHeight) / scrollLimit);
            }
        };
    
        this.setPosition = function() {
            scrollFacePos = document.body.scrollTop * scrollLimit / (document.body.scrollHeight - window.innerHeight);
            scrollface.style.top = scrolltop + scrollFacePos;
        };
    
        this.alt = function() {
            alert('--');
        };
    }
    
    function onMaximize() {
        var windowWidth = window.innerWidth;
        var windowHeight = window.innerHeight;
    
        document.getElementById("scrollbackground").style.height = window.innerHeight - 120;
    
        if (document.body.scrollHeight - window.innerHeight > 0) {
            scrollbar = new vscrollbar(document.getElementById("scrollface"), document.getElementById("scrollbackground"), 80);
            document.getElementById("scrollup").onclick = scrollbar.scrollUp;
            document.getElementById("scrolldown").onclick = scrollbar.scrollDown;
            document.getElementById("scrollface").onmousedown = scrollbar.mouseDown;
            document.getElementById("scrollface").onmouseup = scrollbar.mouseUp;
            document.getElementById("scrollface").onmouseout = scrollbar.mouseOut;
            document.getElementById("scrollface").onmousemove = scrollbar.mouseMove;
        } else {
            document.getElementById("scrollface").style.display = "none";
        }
    
        setPosition();
    }
    

    このようにWidget上でもコンテンツ量にあわせてスクロールバーを実装することによって、プラットフォーム側の実装に依存せずに、コンテンツ量に対してスクロールバーを表示させるWidgetを作成することが可能である。

    2 responses to “Widgetプラットフォームでのスクロールバー実装”
    1. さとっ Avatar
      さとっ

      スクロールバーって、最悪のUIだと思わん??
      僕は、そう思うw

      Like

      1. Naoharu Avatar
        Naoharu

        うはww最悪ってほど比較対象が思いつきもしない俺ww

        Like

    Leave a comment

    • 土曜日

    24日土曜日、新宿歌舞伎町@夜23時から開始された石見会に召集された。
    タカミチさん(←活字にするだけで怖いわな)、タカシさん、ウーコさん、俺の4人でオール飲み。

    ウーコさんも結構よっぱらってたな。。
    とりあえず今年の年末、3世代合同同窓会を行いたいという運びに。。
    地元民の方々、追って連絡いたします。。。

    あと今日は広島のやつらから、
    「東京に○日に行きます~!」
    とか連絡がきたり。就活も本格化ですなぁ。

    2 responses to “石見会”
    1. tomo Avatar
      tomo

      オール飲み出来るってまだまだカラダ元気だね!!
      私はもう酒が入ると徹夜は無理だなぁ…。

      Like

    2. Naoharu Avatar
      Naoharu

      いや~でも飲み続けでオールってのは相当ひさしぶりでした。
      たぶん東京来てからは初めてだと思います。。
      この日は地元の超怖い先輩方との飲みでしたので、ウトウトなどは許されない状況で、
      非常に気疲れしました。
      ところで、なぜ一人称が「私」?!

      Like

    Leave a comment

  • 普段、

    • ノートPC
    • 研究室のデスクトップPC
    • 自宅のPC

    の3つでプログラミングをしているんだけど、PC間の同期がやっぱり面倒だったり。たとえば家にいて、

    「こうすればいいじゃん!」

    ってアイデアが浮かんで、家のPCでがーっと書いて、うまくいって、喜んで寝て、んで結局そのまま学校に来たり。。

    まぁそれはマヌケな例としても・・・。
    皆、レポートとかしてたのに、他のPC用にどっかネットワーク上(Webメールサービスとか)に上げとくのを忘れたり、あとUSBメモリに入れたはいういけどUSBメモリ自体を家に忘れたりとかってない??
    そういうときメチャクチャいらっと(自分のせいなのに)するし、「いや俺は絶対に忘れないぞ」って人でも、そもそもWebメールとかUSBメモリに移す作業が面倒くさいっすよね。絶対。

    なので、Microsoft Live meshというものを最近使い始めました。
    これは自分のPCの指定したフォルダを他のPCと同期してくれるサービスで、たとえば、あるPCのマイドキュメントの内容を他のPCでも共有できるというような感じ。
    これ、前から名前は聞いてたけど、今回使ってみて結構感動!

    感覚的には、「異なる複数のPCが、同じフォルダを覗いてる。」みたいな!どっちから新しくファイルを作ったりしたら、もう一方のPC内のフォルダを見ても、勝手にファイルできてるし!すげー!
    ってことで、オススメです。

    そんなこんなで、今週は結構開発が進んだ週だった!
    あと、無事ACCESSのバイトも継続できる(そのまま就職できないかな。。)ということも決まったし!
    というわけで、金曜の夜はIIJM先輩、YNOと3人で飲み。
    東方見聞録→HeartBeatとハシゴ。
    テキーラ戦争(みんなでオゴり合い)が勃発して死亡。


    Leave a comment

  • 「.net by au (ドットネット バイ エーユー)」の提供開始について〈別紙〉

    Microsoftの.NET Frameworkを互換性をもつプラットフォームがau端末上で
    提供されるとのことです。
    互換性っていうのがどのくらいのものなのかってのも気になりますが、
    Tim Oreillyの言葉に耳を傾けたんですかね。

    A platform strategy beats an application strategy everytime.
    (プラットフォーム戦略は常にアプリケーション戦略を打ち負かす)

    Leave a comment

  • 英語の学習が可能なWebサービスとしてはiKnow!とかVOA Newsが有名だけど、
    最近新しいものが登場したみたいで、yapprというやつらしいです。
    まだ本格的に試してない(新大統領の演説をみたくらい)ので、なんともいえないですが、
    あれだけ網羅性のあるiKnow!とかに対して、どれだけ差別化できてるんでしょうか。。
    動画に字幕が付与されているっていうことなので、
    てっきり、自動生成とかやってて、
    「ベンチャーがgoogleやNHKを出し抜いたのかよ・・・。」
    と思ったんだけど、ユーザーによる入力みたいですね。
    (英語圏のユーザーは、何をモチベーションにして字幕書いてくれているんだろう・・・?)
    っていうかNHKは生放送でやろうとしているのか。

    5 responses to “動画を使った英語学習サイト”
    1. tomo Avatar
      tomo

      動画像編集は処理量が半端無いから、特に自動生成はキツいかもね。
      メタデータ付加して映像検索とかがくるのかねぇ。MPEG-7系はあまり流行ってる気はしないけどなぁ。

      ニコニコ動画で歌詞書く人の根気って凄いよね。芸術性高めたような字幕の流し方みたら感心してしまう!

      Like

    2. bajjo Avatar
      bajjo

      大統領の就任式典の演説をCNNで見たよ~!
      ホワイトハウスに半端ない人だかり・・・ お祭り状態だったね

      Like

    3. Naoharu Avatar
      Naoharu

      >tomoさん
      MPEG-7って、もう標準化されてるんですか?
      動画とかの特徴量(動きベクトル量とか)の記述の仕方をまとめたものと理解してるんですが、
      そうすると、単なるメタデータ検索ではなくて、「「メタ」データの記述の仕方をまとめたもの」なので、
      立ち位置的には、メタメタということになるのでしょうか。
      類似画像検索や類似検索など面白いサービスが出てきそうですね。
      現在、人の手で入力したタグなどを用いたり、アクセス履歴を用いて行っている

      「この画像が好きな人は、こんな画像も見ています。」

      みたいなレコメンドも、画像のDCT係数をメタデータとして付与したものだけをキーに引っ掛けるようなことができたり。
      データ構造がサービスに近づいてきているというか、なんか、良いですね。はやく普及しないかな!

      >ばっじょ
      CNNで見れたのか!俺生で見てないんよなぁ。ってか録画したものもちゃんと見てない。
      ストリーミング配信してけど人が多すぎて繋がらなかったとかあったらしいねぇ。
      逆お祭り状態の円高です!!

      Like

    4. MI Avatar
      MI

      ↑家にテレビないからね。ササキ氏。

      Like

    5. Naoharu Avatar
      Naoharu

      う~ん、どなたでしょうか。
      俺の部屋にテレビが無い事は知っている人はほんの数人なはずなんだけど・・・。
      ってか、CNNで見たっていうのはストリーミングのことだと思ってた!
      http://www.cnn.co.jp/science/CNN200901220027.html
      最近テレビで何かを見るという考えが無くなってるなぁ。

      Like

    Leave a comment

  • というわけで、ACCESSのOB訪問へ。
    やっぱスゲーなこの会社。超イカついわ。
    あーーーこういうところで働くのがデベロッパー冥利に尽きるといった感じでしょうか。
    ま、俺より優秀な人はゴマン(と言わずジューマン)といるでしょうが。。
    良い会社だなぁ。ご飯も奢ってもらえたし。。
    とまぁ、就職活動も本格化してきており、ここ最近で一番苦しんだESを提出完了。
    合計2200字って1枚のESにしては過去最長です。。
    タイピング練習しといてよかったぜ。
    (ちなみに122位@425打。。。)

    っていうか、話は変わるんだけど、
    こだまブログに書いてある「オバマ風画像メーカー」がYB~!超かっこいい。
    っていうか、こだまブログ、記事単体で見るとcss読み込んでないんだけど。。。いいんかな。

    Leave a comment

  • Leave a comment

  • 精神状態がやばい。
    食生活がよくなくて、栄養が偏ってるのか、
    それとも睡眠のリズムが悪いのか、かなりまいっている状況。
    身近な人に対する態度には、表れているだろうな。最悪だ。
    精神的にばかり疲れて、肉体的には疲れてないから睡眠の質がわるいのかと思い、
    夜走ったりしてるんだけど、あまり効果なし。
    とりあえず来週はリンク、IBM、ACCESSなどの就活イベントが目白押しなので、そこだけ乗り切らねば!

    MSクルーかっこいい!!(坊主率の高さが彼らのハーコーさを物語ってますね。)
    上の映像だと、イントロの後にプライマルが

    無言 現実感無い想像バーチャル程
    無頓着になってく大事な事や人

    の部分をフライングしてて、
    そのあとKANが、

    これいつもやるんだよ

    って怒ってる。KANこえぇ。

    4 responses to “無言の蓄積”
    1. koutalou Avatar
      koutalou

      少ない時間でも休むときはしっかり休みんちゃい!
      就活頑張ろうぜ!!

      Like

    2. Naoharu Avatar
      Naoharu

      メリハリだな!
      シュウカツの調子はどう??

      Like

    3. koutalou Avatar
      koutalou

      シュウカツやばいよ!
      やっぱ関東にいないから情報が少ないのか行けるチャンスが少ないからか、遅れをとってる気がする。
      気がするだけならいいんだけどねー(汗)

      Like

    4. Naoharu Avatar
      Naoharu

      関東はとりあえずイベントがたくさんあるからねぇ。
      とりあえずアクティブに動き回ろう!

      Like

    Leave a comment

    • 金曜の日記

    ここには書いてなかったんだけど、
    一身上の都合により、FTでのバイトを続けていくことが難しくなって、
    昨年末で、急遽指導教官から引き上げの命が下りました途中棄権ということに。
    というわけで、僕のかわりに仕事を続けてくれる人募集。

    場所: 新宿南口徒歩5分
    時間: 週1日5時間~
    内容: アプリケーション開発(Windows MobileもしくはiPhone向け)
    報酬: メール下さい


    詳しくは、こちらまで。
    英語もしくはフランス語が話せると、なお良いです。是非。。

    バイトの募集もそこそこに、金曜の夜はマイミクhidetoさんが出演されるイベントがあるということで
    調布のレゲエバー HEART BEATSに行った。
    いやー非常に暖かい雰囲気で、初めて行ったとは思えないお店だった。
    こんな場所が徒歩10分のところにあると、ちょっとヤバいですね。。
    毎週金曜何かやってるし、、ノーチャージだし。
    音も、ハイデフではないですが、暖かくて丸っこい、手作りの「サウンドシステム」って感じの音で
    なんかすごい懐かしい感じがしました。
    かかった曲では、hidetoさんがかけてくれたhuman natureがヤバかったぁ。。
    この曲、本当に大好きなんすよねぇ。

    あと、hidetoさんの次に回してた方(お名前を失念してしまいました・・・)のかけた、
    松任谷由実のA Happy New Yearで、ちょっと泣きかけてしまった。。
    なんなんだこの曲・・・!良すぎ!ばかっ!

    One response to “バイト募集のお知らせ(と、調布のレゲエバー)”
    1. icejobjob Avatar

      大変ですよね、就職活動

      就職氷河期、それも超就職氷河期と言われる時代に突入しようとしています。

      この、就職氷河期は並大抵の努力では乗り切ることが困難と言われています。

      世界同時不況とも言われている今回の不況、それこそ数年間にわたって、世界経済に影響を与えます。

      この時期の、今のあなたが直面している就職活動というイベントは、あなたの人生、就職人生の大きなウエイトを占めることとなります。

      就職活動は、技術と知識で乗り切ることが出来ます。就職氷河期、絶対に後悔しないように全力で戦いましょう。

      Like

    Leave a comment

  • 別に時間が無いわけじゃない(俺より忙しい人はゴマンといる)し、
    超重要な仕事を任されているわけじゃない(俺よりミッションクリティカルな人もゴマンといる)んだけど、
    それでも、

    「いついつまでにコレを絶対に完成させなければならない」

    というものが4つ、5つと溜まってくると、
    どうしても精神的に負けてしまいそうになってしまうことがある。
    (最近思うんだけど、これは「仕事の重大さ」とは関係ないのかもしれない。。その話はまた今度・・・。)

    んで、その圧力を跳ね返すにはどうすべきかを考えてるんだけど、
    やっぱりメリハリというか、「私生活モード」と「バリバリモード」をうまく切り替える必要があるな、と。
    とにかく、バリバリやるには自分(時には人にも)に厳しく当たっていかないといけない。

    「やるって言ったよね?(>自分or人)」
    「なんで出来てないの?(>自分or人)」
    「何時までにできる?どのくらいスケジュールとズレてる?(>自分or人)」
    「そんなんじゃ人から信頼されないよ。(>自分or人)」
    「言われたことだけをやるんなら、誰でもできるよね。(>自分or人)」
    「他でもない、あなたがやることの付加価値は何??(>自分or人)」
    「etc…」

    まぁ、代表的な感情はこんくらいか。

    こういう問答をするときに、
    「素の自分の感情」が混ざっていると、やっぱり心が荒む。
    結局、プレッシャーに負ける時は、いつも自分の心(もしくは体)の弱い部分から崩れていくので、
    とにかく、

    素の自分「いやぁ、そんなに追い込んでやらんでも・・・。」

    みたいな小さなヒビから浸水が始まるし、一度水が入ってきたら最後で、
    どんどん柱を腐らせていき、耐性が無くなっていく。
    なので、バリバリモードのときは、不純物を混ぜないように、完全に別人格を作る勢いで物事をやって、
    それ以外の、家に帰ったあととかは、

    「仕事命の人生とかマジで終わってるだろwww」

    くらいの反動を逆につけてやらないといけない。
    もしくは、趣味とかで別の目標を作って、そっちはそっちで頑張るようなことをして、
    相対的に「(プレッシャーと戦わないといけない)バリバリモード時」を
    浮き彫りにさせるようなことをしないとなぁ、と。

    研究室やバイトの事を家に帰ってまでやってると、本当に調子狂う。。
    たぶん、中途半端な心の状態でやるから、上記の

    素の自分「いやぁ、そんなに追い込んでやらんでも・・・。」

    みたいなヒビが入りやすくなってるんだと思うんだけども。。
    やっぱメリハリは大切だなぁ。と、みんな知ってるであろうことに、最近俺も気づいた・・・。

    それでもどうしても時間が足りなくなって、持ち帰らないといけない時ってのは、
    そもそも当初の「できると思った」ことが間違っているということなので、
    家ではやらずに、マックでやるとか、サンマルクでやるとか、なんかそういう形にしないといけない。
    とにかく、
    「『バリバリモード時の自分』の尻拭いを、『ゆるゆるモード時の自分』にさせる。」
    という事態だけは避けないといけない。
    だって、「ゆるゆるモード時の自分」には罪はないんだから。。。

    もちろん、逆に、「ゆるゆるモード時の自分」のキャラや世間的な評価から
    「バリバリモード時の自分」を独立させることも重要。
    普段はナヨナヨしてても、やるべきことはキチっとやらないといけないんだから。
    そのリミッターを解除させるには、
    「お互いがお互いに対して無責任でいる。」
    ということが重要なんだ、と。

    高校で陸上競技やってた時、顧問の先生が
    「本当に強い選手っていうのは、『怪我』をしない選手。」
    って言ってたんだけど、うーん。。深い。と思う。
    結局、仕事を高い品質でコンスタントにやってる人って、
    高プレッシャー時にも鬱病とかになったりしない人なんよねぇ。
    そうなるためには、メンタル弱い俺とかは特に、心の管理に気をつけないといけないなぁー。

    (本文とは全く関係ないけど、高校のときの英語の先生の赤ちゃん。)

    Leave a comment