kyo: 2008年2月アーカイブ

.toString(16)はsafari動かず?

| | コメント(0) | トラックバック(0)
気のせいかな?
こんな感じで逃げる。

    RGB2HTML : function ( r, g, b ) {
        r = '00' + this.dec2hex( r );
        g = '00' + this.dec2hex( g );
        b = '00' + this.dec2hex( b );
        r = r.substr( r.length - 2 );
        g = g.substr( g.length - 2 );
        b = b.substr( b.length - 2 );
        return r + g + b;
    },
    dec2hex : function ( dec ) {
        var hex = "";
        while( dec ) {
            var last = dec & 15;
            hex = String.fromCharCode( ( ( last > 9 ) ? 55 : 48 ) + last ) + hex;
            dec >>= 4;
        }
        return hex;
    },

call back functionによって動作を変える

| | コメント(0) | トラックバック(1)
var each = function (fun) {
if ( fun.toString().split(/\n/)[0].match(/,/) ) var apply = 'apply';
return fun[apply || "call"](fun,arguments[1])
};
each( function (a,b,c) { alert(a+' '+b+' '+c) }, [1,2,3] );
#-> alert( '1 2 3' );
each( function (a) { alert(a[0]+' '+a[1]+' '+a[2]) }, [1,2,3] );
#-> alert( '1 2 3' );

うーん。きもいか。
とりあえず、IE,FF,Opera,Safariで結構動く感じがする。
ネタとしては面白。使いどころによっては結構いい?

社内では受けなかったけどorz

jQuery sortable

| | コメント(0) | トラックバック(0)
sortableのstopで内部element取ってきて、その値で内部変数を再処理しようとした。
        $( '#sortable_target' ).sortable( { 'stop' : function () {
            //一番下に存在しないelementが追加されているので無視
            $( '#sortable_target' ).find( '.sortable_target_item:not(:last)' ).each( rebuild );
        } } );
なんか「:not(:last)」を使いしないと変なの入る。
(drag対象のelementが一番最後に追加されてるっぽい)

あと、sortable対象の内容を再構築した場合、「'refresh'」を呼ぶ。
        $( '#sortable_target' ).sortable( 'refresh' );
 

widget.preferenceForKeyにthis

| | コメント(0) | トラックバック(0)
Dashboard Widgetにこんなコード書いたら動かなかった。
        $( [ 'element_id1', 'element_id2' ] ).each( function () {
            var val = widget.preferenceForKey( this );
            if ( !val ) return;
            $( '#' + this ).val( val ).change();
        } );
「var val = widget.preferenceForKey( this );」を「var val = widget.preferenceForKey( this + '' );」にしたら動く。
ほんとーに、primitiveなstringしかだめなんだね。

js版clear.css見たいなのほしい

| | コメント(0) | トラックバック(0)
一時的に各種オブジェクトのprototypeを標準的な動作に戻すjsほしい。
最初に呼び出すと普通の状態になって、最後に元に戻せるような。

prototype.jsとかricoとか同時に読んでても問題にならない方法がほしい。。。

debug code

| | コメント(0) | トラックバック(0)
if ( !console ) {
    var console = {};
    console.log = function () {
        alert( arguments[0] );
    };
};

// for debug
var p = console.log;

これでちょと楽になる。ついでにCtrl-無変換で「var = function () {}」を入力できるようにした。

keyseq $FUNC_DEF = &SetImeStatus(off) v a r Space Space S-Hyphen Space f u n c t i o n Space S-_8 S-_9 Space S-OpenBracket S-CloseBracket &Variable( 17, 0 ) &Repeat( ( Left ), 17 )
key C-*NonConvert = $FUNC_DEF

よし。

http://mayu.sourceforge.net/mayu/doc/CUSTOMIZE-ja.html

jQueryでcheckboxのcheckedの値が.html()に反映されない

| | コメント(0) | トラックバック(0)
バグかなー?

結局.html()で別elementにappendした後、find( 'input[type="checkbox"]:last' ).attr( 'checked', true )したけど、結構悩んだ。

「$('<div><input type="checkbox"></div>').find('input').attr('checked',true)」をどっかにappendすればちゃんとcheckedされてるんだけど、
「$('<div><input type="checkbox"></div>').find('input').attr('checked',true).end().html()」をalert()すると「checked="checked"」がついてない。

jsのobject名ってどうやって取るんだろう?

| | コメント(0) | トラックバック(0)
var foo = function () {};
foo.prototype = {};
var bar new foo();

したときにbarからfooの名前(?)を取るほうほうってないのかな?
デバッグするときに「このObjectって何?」って時があるんだけど、
せめてconstractorの定義行だけでも取れないかなー

jsの仕様上無理なきがするけど、これができればデバッグだいぶ楽だな。
classとか作ってそこで一緒に持たせるようにでもしないとだめかな。

DashboardでtoJSON

| | コメント(0) | トラックバック(0)
したくていくつかライブラリあたったけど、全部「Maximum call stack size exceeded」で落ちる。
と言っても検証したのは以下の二つだけだけど。

http://www.jdempster.com/wp-content/uploads/2007/08/jquery.json.js
http://www.json.org/json2.js

やむなく手解析。
データ形式簡単でよかった。。。

functionの即実行書式

| | コメント(0) | トラックバック(0)
http://d.hatena.ne.jp/amachang/20080208/1202448348

前に結構悩んでそのままほってたけど
(function() {})()

var hoge = function () {}()
が動いて
function () {}()
が動かない理由がようやくわかった。。。

やっぱりJSの言語仕様微妙

jQueryのthis

| | コメント(0) | トラックバック(0)
非常に紛らわしい。
var hoge = function () {};
hoge.prototype = {
add_click : function () {$( '#hoge' ).click( this.hoge_click );$( '#hoge' ).click()}
hoge_click : function () { alert( this ) }
}
var huga = new hoge();
とかやると「hoge.hoge_click()」内のthisはhtml elementになる。
(hoge objectじゃない)
こうなると「hoge.hoge_click()」内でthisを見たいときはhugaを直接見るしかない気がする。。。

こういうコードは書くなってことかな。。。
(「hoge.hoge_click()」内で「return function () {nnn}」しろってこと?)

やんなきゃ

| | コメント(0) | トラックバック(0)
>「やればいいや」が「やんなきゃ」になる

これは非常にうらやましい。
私は最悪コンビニのバイトでも暮らせるし、実家に帰ってニートもできる。
今の仕事に真剣になれない。
だから後先考えず無茶ができるのは利点だけど、そろそろ飽きてきた。

Dashboard開発時の基本コード

| | コメント(0) | トラックバック(0)
Dashboard開発時は以下を読み込んでおくと幸せになれるかも。
(要jQuery)
$( 'a' ).click( function () {
widget.openURL( this.href );
return false;
} );

widgetがない

| | コメント(0) | トラックバック(0)
Dashboard Widgetで「<from action="#">」をsubmitすると
widget objectが消える。
(再読み込み後、widget.preferenceForKeyとかで「widgetは存在しません」のエラーが出る)

gadgetでもやったな。エラーがわかりにくくていや。

流れるようなインターフェイス

| | コメント(0) | トラックバック(0)
なるほど。
jQueryのあれば「流れるようなインターフェイス」っていうのか。
(あとJava由来なんだ)

確かにjQueryのインターフェイスは非常に読みやすい。
これは元々の構造があって、それとコードのマッピングするときとかはかなり自然な記述になる気がする。
(DOMとかSQLとか)

ただ、「流れるようなインターフェイス」って名前は微妙。。。

firefox最適化

| | コメント(0) | トラックバック(0)
Firefoxを遅くさせる最大原因はアドオン - 300clp
http://d.hatena.ne.jp/independent007/20070612

を見て、firefoxの最適化を思い立つ。
ちなみに最適化前は普通にメモリ800MBくらい食ってた。

とりあえず開発系拡張と閲覧系拡張を分けてprofile作成。
開発系は野良ビルドを使用。
http://marilab.hp.infoseek.co.jp/buildfx/

閲覧系は純正で開発系の呼び出しはLaunchy経由。
profile以下のchrome内にlaunchy.xmlを作成し、以下の内容を記述。
<?xml version="1.0" encoding="UTF-8"?>
<configurations xmlns="http://launchy.mozdev.org/configurations">
<application>
<label>Firefox Developper Profile</label>
<type>1</type>
<command>C:\nora_build_dir\firefox.exe</command>
<arguments>-no-remote -profile C:\nora_build_profile_dir\
</arguments>
</application>
</configurations>

プロファイル、インストールディレクトリに日本語が含まれているとだめかも。
空白もまずいかもしれない。
起動にミスってもエラーとかでないし、xmlを再読み込みさせるにはfirefox rebootが必要なので面倒。
どっかにbatでも作ってそれ経由のほうがたぶん検証は楽。

これで双方メモリ使用量が100MBくらいになった。
よかった。

Dashboardサイズ変更

| | コメント(0) | トラックバック(0)
window.resizeTo(width, height);
数値の末尾に「px」つけると動かないので注意。

window.moveTo(width, height);
は効かないらしい。

表示時にサイズ広げると黒枠の確認画面もでかくなるので注意。

widget.setPreferenceForKey

| | コメント(0) | トラックバック(0)
widgetのデータ保存APIは「値,キー」の順でセットする。
普通と逆なので要注意。
widget.setPreferenceForKey( this.id, 'lastmode' );

それにしてもsetは「setPreferenceForKey」なのに
getは「preferenceForKey」ってmethod名なのはなぞ。
なんで「getPreferenceForKey」にしなかったんだろう?

Sidebar GadgetのUA

| | コメント(0) | トラックバック(0)
読み込み完了時のUAがおかしい。
ちゃんと検証してないけど、DomReady時はnavigator.userAgent.match( /Media\s*Center/i );が正しく一致しない。
setTimeout( function () {}, 1000 )後は正常に一致した。

Dashboard Widget

| | コメント(0) | トラックバック(0)
MacのDashboard Widgetを作る。
Yahoo! Widgetで動いているものの移植。

う~ん。Yahoo! Widgetが異常すぎて結構面倒かも。
Dashboard Widget自体はかなりまとも。
Vista Sidebar Gadgetよりまともだな。

設定ファイルでlocaol systemへのアクセス範囲とか、
ネットワークへの接続可否が設定できるので
「elem.innerHTML = '悪意あるサーバデータ'」とかされても
Sidebar Gadgetよりましな可能性が高い。
(悪意あるWidgetを入れたらおしまいなのは一緒だけど)

基本常に右端に出てるSidebar Gadgetの方が見せ方はうまいけど、
1Gadget = 1Windowで作られてるDashboard Widgetの方が自由度が高いし、
作りやすいな。

ただ、HTMLInputElementが微妙におかしい。
Macインターフェイスと合わないから純正使えよってことだと思うけど、
この辺はかなりめんどくさい。
(スクロールとか独自品使わないといけないので)

install Build::CPAN

| | コメント(0) | トラックバック(0)
結局makeがなかったのが原因でしたorz

installしながら気がついたので入れてたけど、
Config.pmに反映させるの忘れてた。

o config initで再修正。手動じゃないと必須項目なくてもわからん。

cpan

| | コメント(0) | トラックバック(0)
まともにinstallできたためしがないんだが。。。
debian標準の$CPAN::VERSION = 1.7602から
install Bundle::CPANしてもNOT OKの嵐。

別にコンパイルしなくていいよ。バイナリくれよ。

keys

| | コメント(0) | トラックバック(0)
オブジェクトからすべてのkeyを取得する。
(from サイ本)

var keys = function ( obj ) {
    var result = new Array();
    var i = 0;
    for ( result[ i++ ] in obj );
    return result;
}

差を知る

| | コメント(0) | トラックバック(0)
すごい人が自分に近ければ近いほどすごく感じる。
特に、興味がかぶるとその人の上すら見えないほど。

壁は近すぎると高さがわからない。
せり出していると上も見えない。

なんかエラー

| | コメント(0) | トラックバック(0)
uncaught exception: Permission denied to get property HTMLDocument.implementation
ってエラーが出る。
たぶんJSが原因だけど、理由不明。
なんかやばいもの触ってるのかなー

延々読み込み

| | コメント(0) | トラックバック(0)
FFでscript scr="hogehoge.js"して、
その中で自分の上にscript scr="hugahuga.js"をinsertBeforeした中で
document.writeするとページを延々読み込んだまま帰ってこない。

まあ、そんなことするなって話だね。

>writeの後にdocument.close();すればいいのか。
(その後はwriteできなくなるらしいけど)

Javascriptのnew

| | コメント(0) | トラックバック(0)
jsでnewすると、指定されたfunction objectのconstructorが{}付で呼ばれる。
つまりこんな感じ。

//hoge_classのconstructor
var hoge_class = function () {
    this.a=1;
};
var hoge_instance = {};
//hoge_instanceをthisとして、hoge_classを呼び出す。
hoge_class.call( hoge_instance );
hoge_instance.a // -> 1

引越し費用

| | コメント(0) | トラックバック(0)
不用品の廃棄が一番金かかった。(全部で2万)
9000円で買ったベッドを捨てるのに8000円かかったし。。。

荷物の移送費はすべて宅配便つかったので5000円くらい。
(でかいものはほぼ処分したので)

部屋を死ぬ気で掃除したのに敷金が3万近く引かれたのはショック。
原状回復費用ってことわかってるんだろうか?
次の人が入るための掃除費を引かれてるとしか思えない。
ってか、それならもっと適当に掃除したのに。。。

自転車購入

| | コメント(0) | トラックバック(0)
「とりあえずのものを自分に与えるな」という本を読みつつ、6500円のママチャリ購入。
でも、結構新しいし、26インチなので結構でかい。
行動範囲広がりそう。

FFの「戻る」時の動作

| | コメント(0) | トラックバック(0)
FFで「戻る」を押した場合にJSが実行されない。
(globalのコードも、onloadも走らない)

flashは初期化されてるっぽいので、
flashからcallbackしてもらえればいいのかな?

MT簡単コメントスパム対策

| | コメント(0) | トラックバック(0)
mtのdirectory内にある「mt-comments.cgi」を
「mt-comments_hoge.cgi」に変名。
で、「モジュールテンプレート」の「コメント入力フォーム」にある、
form tagの下に以下を記述。

<script type="text/javascript">
<!--
( function () {
var elem = document.getElementById( 'comments-form' );
elem.action = elem.action.replace( /\.cgi$/, '_hoge.cgi' );
} )();
//-->
</script>
<noscript>コメントを投稿するにはJavaScriptを有効にしてください</noscript>


もし、「JS無効でも書き込みたい」とか、JSを理解するspam botが
出現した場合、いうことであれば以下の方法を検討。

http://wizardbible.org/32/kanatoko.txt

jQuery変わりすぎ

| | コメント(0) | トラックバック(0)
jQueryでいろいろやってて「なんか動き変だな?」と思ってたけど、
バージョンが古くて公式サイトのdocumentで公開されてる
APIがないだけでした。

でも、これ2007-02-28って書いてあるんだけどなぁ。。。
(一年たってないよー)
最新版は動かないpluginあるし。。。

document.createRange();

| | コメント(0) | トラックバック(0)
spam bot回避にMTの投稿フォームをJS化してみる。

そこで、下らへんを見てから気になっていた「document.createRange();」の仕
様を検討。

「DOM Rangeについて色々」
http://members.jcom.home.ne.jp/jintrick/Personal/DOM_Range.html

でも、よく読むとちょっと面倒。
そこで、念のためサポートブラウザを確認してみる。

「Introduction to Range」->「Browser compatibility - overview」
http://www.quirksmode.org/dom/range_intro.html

だめじゃんw
普通にいじるか。。。

jQuery.noConflict();

| | コメント(0) | トラックバック(1)
何で「jQuery.noConflict();」のサンプルは
「jQuery.noConflict();」と「var $j = jQuery;」を分けて書くんだろう?

「var $j = jQuery.noConflict();」と一行で書けるのに。

下位互換?最初の紹介記事が分けて書かれてたから?

ricoとjQueryは混ぜるな危険

| | コメント(0) | トラックバック(0)
rico.js(1.1.2)を先に読むとjQuery(1.1.2)が読めない。
jQuery.noConflict()以前に読み込んだときにエラーになる。

ricoがprototypeいじってるから?

ざっくりソース見た感じでは
そんなにやばいことやってるようには
見えなかったんだけど。。。

静岡の天気

| | コメント(0) | トラックバック(0)

igoogleのweatherでは「横浜」から「名古屋」の間の選択肢がない。

静岡はほぼ中間なんですが。。。

「エントリー・アーカイブ」がねぇー

| | コメント(0) | トラックバック(0)

MT4移行にあたって以下のページを参考にしているが、
どうしても「4.エントリー・アーカイブのパス・ファイル名を変更する」の
「エントリー・アーカイブ」の設定が見つからなかった。

「Movable Type を始める前に設定しておきたい 10 の項目」
http://www.koikikukan.com/archives/2007/01/22-003030.php

結局MT4のドキュメントを参照して解決。
http://www.movabletype.jp/documentation/designer/archive_mapping.html

これはMT4.0とMT4.1でも場所が変わってる気がする。
(リンク名が変わってるだけかも)

IEで「引数が無効です」エラー

| | コメント(0) | トラックバック(0)

IEは以下のコードでとまる。
var div = document.createElement( 'div' );
div.style.top = NaN;

ただ、普通にJSのエラーは出なくて、
try{}catch(e){alert(e.message)}すると、
「引数が無効です」といわれる。

JSの継承サンプル

| | コメント(0) | トラックバック(0)

非常にわかりやすい。

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1617352

document.createElement( 'script' );時のdocument.getElementsByTagName( 'script' );

| | コメント(0) | トラックバック(0)

した中で

var scr = document.createElement( 'script' );
scr.type = 'text/javascript';
scr.charset = 'UTF-8';
scr.src = 'js/huga.js';
var scp = document.getElementsByTagName( 'script' );
var cur = scp[ scp.length - 1 ];
cur.parentNode.insertBefore( scr, cur );

して、さらにその中で

var scp = document.getElementsByTagName( 'script' );
scp[ scp.length - 1 ];

すると、一つ次のscript tagまでついてくる。
(htmlに直接書いた場合は大丈夫)
動的に読んだ場合はファイル名とかで見るしかないか。。。

IEのみエラー

| | コメント(0) | トラックバック(0)

「インターネット サイト http://example.com を開けません。
 操作は中断されました。」

なんとなくだけど、dom展開中にbodyにappendChildとか、
ちょっと無茶したときにおこるっぽい。
ちゃんとwindow.onloadでやれば大丈夫だった。