opera:hige このページをアンテナに追加

 | 

2008-05-23

Canvas で画像処理 19:04 Canvas で画像処理 - opera:hige を含むブックマーク はてなブックマーク - Canvas で画像処理 - opera:hige

Canvas で画像処理


この前と同じく getContext('opera-2dgame') を.

getPixel, setPixel あたりを使った.


トラックバック - http://orera.g.hatena.ne.jp/higeorange/20080523

2008-05-20

[] Canvas で色情報取得 16:29  Canvas で色情報取得 - opera:hige を含むブックマーク はてなブックマーク -  Canvas で色情報取得 - opera:hige

Canvas で画像の色取得 (URL 変わりました 5/23)


opera でしかうごかない getContext('opera-2dgame') を使って画像の色を取得してみるテスト.


外部ドメインの画像 で getPixel を使うと security violation がでるもよう.

参考

Web Applications - The ’Opera-2dgame’ Canvas Context

トラックバック - http://orera.g.hatena.ne.jp/higeorange/20080520

2008-05-18

[] Quick Find は ブックマークのタイトルを検索してくれない. 17:09  Quick Find は ブックマークのタイトルを検索してくれない. - opera:hige を含むブックマーク はてなブックマーク -  Quick Find は ブックマークのタイトルを検索してくれない. - opera:hige

これは不便だ.ニックネームだと検索してくれる.そこでブックマークを追加するときに タイトルをニックネームにコピーするアクションを考えた.

Add to bookmarks,1 & Delay, 100 & Copy & Focus next widget & Focus next widget & Focus next widget & Click button & Delay, 100 & Focus next widget & Focus next widget & paste

強引!!

最新の build: 1962 だと Delay がうごいてくれなかったので

Beta 1 で試した

トラックバック - http://orera.g.hatena.ne.jp/higeorange/20080518

2008-05-17

パネル位置を floating のすすめ 16:54  パネル位置を floating のすすめ - opera:hige を含むブックマーク はてなブックマーク -  パネル位置を floating のすすめ - opera:hige

デフォルトでは左に表示される(他のブラウザと同じ)パネル*1だけど.Opera では右に表示することもできる.*2. さらに floating といって普通のページと同じように扱うこともできる.


ここ最近その floating にしてパネルを使っている.


floating にすることの利点

floating にすることの欠点


利点が少ないように思うけど.パネルを位置固定から開放して自由にしてあげようということ.

最後にパネル位置を floating にする設定の仕方.

Tools > Appearance > Panels > Panel placement で floating

*1ホットリスト

*2Firefox もできるけど面倒だったような気がする

トラックバック - http://orera.g.hatena.ne.jp/higeorange/20080517

2008-05-14

del.icio.us のポスト画面でタグが表示されなくなる問題 13:45  del.icio.us のポスト画面でタグが表示されなくなる問題 - opera:hige を含むブックマーク はてなブックマーク -  del.icio.us のポスト画面でタグが表示されなくなる問題 - opera:hige

この前 Kuruman が悩んでた問題*1.私の方でもその現象に遭遇したので検証してみる.

Opera でのみ起こった現象. Firefox では問題なし.

原因はどうもなんか新しいことがあったらページ上部に表示される


f:id:higeorange:20080514123158p:image


これのようだ.

これを消したければ もちろん hide this をクリックすればいいわけだけど,クリックしたときにどういうことが行われているかというと

    function hideNotifyBar() {
        Cookies.set('notifications_seen', Cookies.get('notifications_seen') + ',17');
        (new fx.Height(
            $id('notifybar'), { 
                duration:20, 
                onComplete: function(){ remove($id('notifybar')) } 
            }
        )).toggle('height');
        return false;
    }
    addLoadEvent(function() {
        if ($id('notifyclose')) $id('notifyclose').onclick = hideNotifyBar;
    });

この スクリプトでわかるように hideNotifyBar() が呼ばれている.

一度 hide this が呼ばれるとクッキーに保存されて以降このコード自体がソースに含まれなくなる.

ちなみに オブジェクト fx は定義されている javascript ファイルがロードされていないのでエラーとなる.これは今回とはまた別の問題.


今回問題なのは hideNotifyBar をイベント追加している addLoadEvent 関数.

これを定義しているのが http://del.icio.us/ui/static/delicious.old.js?v=61E-123 のスクリプト

どういう風に定義しているかというと

function addLoadEvent(f) { var old = window.onload
	if (typeof old != 'function') window.onload = f
	else { window.onload = function() { old(); f() }}
}

となっている.

つまり addLoadEvent で追加された関数は window.onload に追加していくという関数である.


ロードされたときに実行されるべきのは

  • init()*2 ( <body onload="init()"> )
  • rmPostAddEvent() ( addLoadEvent で追加 )
  • hide this にイベントを付加する関数 ( addLoadEvent で追加 )

となる.


どういう風に実行されるかをわかりやすくするためにテストページを用意した.

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

注意: alert が出る.

このページのソースは

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
    "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
        <title></title>
        <script type="text/javascript">
            addLoadEvent(function() {
                log("first is loaded");
            });
            function init() {
                log("init is loaded");
            }
            function addLoadEvent(f) {
                var old = window.onload;
                if (typeof old != 'function') {
                    log("old is not function, " + 'add: ' +f);
                    window.onload = f;
                } else {
                    log('old: ' + old + ', add: ' + f);
                    window.onload = function() {
                        old();
                        f();
                    }
                }
            }
            function log(s) {
                alert(s);
            }
        </script>
    </head>
    <body onload="init()">
        <script type="text/javascript">
            addLoadEvent(function() {
                log("second is loaded");
            });
        </script>
    </body>
</html>

となっており,

del.icio.us と同じように

body onload で init,

head 内の script で addLoadEvent で追加 (rmPostAddEvent にあたる) 実際には外部ファイルで呼び出しているけど同じはず 以下 first,

body 内の script で addLoadEvent で追加 (hide this にイベントを付加する関数にあたる) 以下 second,

としている.


でこれを OperaFirefox 実行してみると違いが出た.

以下 alert の内容を列挙.

Opera

old is not function, add: function() {
                log("first is loaded");
            }
old: function() {
                log("first is loaded");
            }, add: function() {
                log("second is loaded");
            }
first is loaded
second is loaded

Firefox

old is not function, add: function () {
    log("first is loaded");
}
old: function onload(event) {
    init();
}, add: function () {
    log("second is loaded");
}
init is loaded
second is loaded

これから分かることは

window.onload の内容は

Opera: なし -> first (head内) -> first & second (body 内) あれ init はどこで追加されたのよ?

Firefox: なし -> first -> init -> init & second

と変化している.


実際に実行されるのが

Opera: first & second

Firefox: init & second

となる.


この結果から Opera では タグが表示されないのである ( init が呼ばれないため ).

また Firefox でも意図通り動いていない気がする.


このバグを直すためにスクリプトを書いた.

// ==UserScript==
// @include http://del.icio.us/*?*url=*
// ==/UserScript==
//

(function() {
    opera.defineMagicFunction(
        'addLoadEvent',
        function(func, w, f) {
            var old = window.onload;
            if (typeof old != 'function') {
                window.addEventListener('load', f, false);;
            } else {
                window.onload = function() {
                    old();
                    f();
                }
            }
        }
    );
})();

最初に追加される rmPostAddEvent を window.addEventListener で追加. window.onload が undefined であるとき

これで不思議なのが 2回目に addLoadEvent が呼ばれたときには window.onload に init が入っている.入っていないとこのスクリプトは動かないわけだが.

だったら直す前でもこの時点で init が入っててもおかしくないのになぁ.

ということで追加の順番に関してもう少し検証が必要.


とりあえず 上のスクリプトでタグが表示されないバグは直る.

お知らせが出たら hide this を押したらいいんだけども.


追記

Konqueror は Firefox と同じ挙動.

お願い

IE & Safari での動作を知りたいので

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

において誰かテストお願いします.


再追記

Thx. os0x.


os0x さんのコメントどおりの挙動だとさらに疑問が.

second がなかった場合を考える.


window.onload の内容.

Opera 以外のブラウザ: first -> init

Opera : first -> init は追加されず.


実行結果

Opera 以外のブラウザ: init() 予想通り

Opera : init() あれ? first が実行されるのでは?


テストページ

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


再々追記

どうも混乱してきたのでこれで打ち切り.

<body onload="init()"> ってしてるのがまずいだろうな.

てことで del.icio.us に報告しておきました.

再々々追記

再追記で書いた second がなかった場合の挙動について多分分かった.

【javascript】body.onload=””とwindow.onloadについて|WEB制作のメモ

window.onload と document.body.onload が両方あった場合あとから追加されたほうが実行されるということ.

*1:なんか別の問題っぽい

*2:タグ表示などの全般

os0xos0x2008/05/14 14:09IE7とSafari3(Win/Mac共に)はFirefoxと同じ挙動でした。
で、Operaさんは document.body.onload だけにinitが入っているみたいです。
この挙動から推察するには、bodyタグにonloadがあったらとりあえずdocument.body.onloadに入れて、window.onloadがnullだったらそっちにも入れる。けど、window.onloadがnullでなかったら上書きはしないようになってるぽいですね。

トラックバック - http://orera.g.hatena.ne.jp/higeorange/20080514

2008-05-11

ページバー (タブバー) なしで操作してみるよ 13:52  ページバー (タブバー) なしで操作してみるよ - opera:hige を含むブックマーク はてなブックマーク -  ページバー (タブバー) なしで操作してみるよ - opera:hige

あこがれのページバーなしブラウジングに挑戦してみるよ.

普段マウスを手放せない私だけどキーボードだけの操作でなんとかページ管理をしてみる.


まずページバーを非表示.


f:id:higeorange:20080511132031p:image


アドレスバーだけになってすっきり.*1


どう操作するか.

ページの切り替え

"1" or "2" キー: 一覧がでない.

"Ctrl + tab" or "Ctrl + Shift + tab": 一覧が出る.右クリック+マウスホイールと同じ挙動.


"Ctrl + tab" .. がよさそうなんだけど問題が 2 つ.

  • 私のキーボードだと "Ctrl + tab" が押しにくい.
  • 一覧が見れるのはいいんだけどタブの並び順に巡るのでスパっと目的のページが開けない.

代替案

ウィンドウパネルを使おうじゃないか.

デフォルトだと "Ctrl + Shift + 0" という押しにくいキーバインドなので これを押しやすいのに設定しなおす.

私は "Ctrl + k" にした.


さらに矢印キーなんて使ってらんねーよってことで


f:id:higeorange:20080511133452p:image


として "j" or "k" で移動出きるようにした.


操作方法

まず,ウィンドウパネルを開く.


f:id:higeorange:20080511133707p:image


すると,Quick search にフォーカスが当たっているので絞り込む


f:id:higeorange:20080511133834p:image


で "Tab" を押してページ一覧へ負ぉかす.

"j" or "k" でめぐって目的のページを選択して Enter.


f:id:higeorange:20080511134112p:image


ページ一覧にフォーカスが当たっている状態から "Quick Search" にフォーカスするには, "Shift + Tab".


ページを切り替えるときに毎回こんなことをしてたら面倒なので普通?のときは "1" or "2" または "Ctrl + tab" or "Ctrl + Shift + tab" で操作する.


なお,ウィンドウパネルでは選択した状態で

"Ctrl + R": 更新

"Ctrl + W" ページを閉じる

の操作ができる.


予告

マウス派な私はページバーだけじゃなくパーソナルバーも手放せないでいる.

そこで ”パーソナルバーなしで操作してみるよ."というエントリを書く予定.

とおもったけど, Operaでブックマークに登録してあるページへ素早く移動する方法 - opera:hige - チーム俺等 と内容がおおかぶりしそうなので止めた.

*1:ほんとはページバーだけじゃなくパーソナルバーもあった

ka-nachtka-nacht2008/05/11 14:10>一覧が見れるのはいいんだけどタブの並び順に巡るのでスパっと目的のページが開けない.
並び順はopera:config#UserPrefs|WindowCycleTypeで変えられますよ。

開いているタブの数がある程度までならWindowメニューから直接選ぶのもありです。例えばWindowsだとw alt, 3で左から3番目のタブを選べます。

higeorangehigeorange2008/05/11 14:12window メニューがない.

ka-nachtka-nacht2008/05/11 15:33>window メニューがない.
多分この辺かと。opera:config#UserPrefs|ShowWindowMenu

トラックバック - http://orera.g.hatena.ne.jp/higeorange/20080511

2008-05-09

[] del.icio.us ポスト時に今までつかったタグをすべて表示する 19:34  del.icio.us ポスト時に今までつかったタグをすべて表示する - opera:hige を含むブックマーク はてなブックマーク -  del.icio.us ポスト時に今までつかったタグをすべて表示する - opera:hige

デフォルトだと 多い順に 500 のタグしか表示されずなおかつ補完対象にならない.それを今まで使ったことのある(たとえ一回でも)タグも表示させて補完対象にする UserJS.こっちに書いているということは Opera でしか動きません.

注意

ファイル名を ***.user.js じゃなくて ***.js にしてね.


// ==UserScript==
// @include http://del.icio.us/*?*url=*
// ==/UserScript==

(function() {
    opera.addEventListener('BeforeExternalScript', function(e) {
        if(/\/feeds\/json\/tags/.test(e.element.src)) {
            e.element.src = e.element.src.replace(/count=\d+&/, '');
        }
    }, false);
})();

f:id:higeorange:20080509193747p:image

f:id:higeorange:20080509193807p:image

こうなる



"BeforeScript" でもいけるかなぁとおもったけど "BeforeExternalScript" でなければだめっぽい.


"BeforeExternalScript" だと src を伴う script 要素がみつかって"読み込む前"に実行される.

"BeforeScript" の場合,各 script 要素の"内容が実行される前"に実行される.

よって上のスクリプトのように BeforeScript だとすでに書き換える前の URL にアクセスして内容を取り込んでいるので, src 属性 を書き換えたとしても意味をなさない.

ということっぽい.あってるかな.


参考

Opera: User JavaScript available methods, events, and properties

トラックバック - http://orera.g.hatena.ne.jp/higeorange/20080509

2008-05-06

待ってらんないよ 15:36 待ってらんないよ - opera:hige を含むブックマーク はてなブックマーク - 待ってらんないよ - opera:hige

dragonfly.js

/ ==UserScript==
// @include http://www.opera.com/dragonfly/
// ==/UserScript==

(function() {
 opera.addEventListener('BeforeScript', function(e) {
     var clock = /setclock\(\d{4},\d{2},\d{2},\d{2},\d{2}\)/;
     if(e.element.text.match(clock)) {
         e.element.text = e.element.text.replace(clock, "setclock(2008,05,06,08,00)");
     }
}, false);
 })()


追記 17:05

やっぱり まだ公開はされていないようです.

再追記 5/7 16:24

無事に 昨夜の 1:00 すぎにリリースされました.

けど私の環境ではまともにうごいてくれません.まぁAlphaだし…

トラックバック - http://orera.g.hatena.ne.jp/higeorange/20080506

2008-05-03

[] Open with 21:27  Open with - opera:hige を含むブックマーク はてなブックマーク -  Open with - opera:hige

9.5 になって 他のブラウザで開くコマンドがデフォルトで実装されている.

ページ右クリックで "Open with" で他のブラウザで開くことができる.


がこれに問題が.

フレームになっているページ ( インラインフレームも ) で "Open with" するとフォーカスしているフレームが開いてしまう.

フォーカスしているとは右クリックした位置のフレーム.


従来通りの

Item, "Open with firefox"=Execute program, "firefox", "%u"

のような開きかただと問題ない.


最近フレームなページと触れ合わないからきづかなかった.

トラックバック - http://orera.g.hatena.ne.jp/higeorange/20080503
 |