« 2007年10月 | メイン | 2007年12月 »

2007年11月 アーカイブ

2007年11月03日

Kanasan.JS無事終了しました

参加した皆様お疲れさまです。初回としては成功したと思います。参加後に実施したアンケートの内容からも、その様子が伺えます。
アンケートには「あなたのJavaScriptの熟練度は?(自己申告で構いません)」という項目があったのですが、中級者・初級者がほとんど、初心者が少しという結果でした(時間があれば、アンケート結果についてまとめたいと思います)。その割には、非常に高度な内容で、中身の濃いイベントになったと思います。以前、Blogに井の中の蛙について書いたのですが、再度実感した次第です。
名称について
私自身のハンドルネームがついている事、内容と一致しない事、今後の展開への影響を考えると、この名称では必ず問題が発生します。この為、名称変更の提案をしましたが、変更に賛成されたのは数名でした。多数の方が名称の変更は望んでいなかったようです。この為、「Prototype.JSのCodeReadigをしているうちはKanasan.JS、その後に名称変更を考える」と再提案を行ない、この方針で決定しました。
参加者のレベルの開きについて
どの勉強会でも問題になると思いますが、アンケート結果にも参加者のレベルの開きについての意見がありました。今回は前半は全員でCodeReadingを、後半は前半の内容を復習するグループ、先に読み進めるグループにわけました(私は復習グループに加わりました)。グループ分けした事については良かったようですが、初心者が置いてきぼりになるのを問題視する意見があり、私も同感です。ただ、Prototype.jsの内容は高度なため、初心者に合わせると全く進まないことになってしまいます。また、私自身初心者にちゃんと教えきれるだけの力量がありません。かといって、誰か説明できる人に頼もうとしてもCodeReadingに参加したいでしょうから、お願いする事ができません。
なんとかならないかと帰りながら考えて、ひとつ案を思いつきました。「Prototype.JSのCodeReadingはグループ分けせずにこのままのレベルを保つ。初心者・初級者には『オライリー・ジャパンJavaScript第5版』の読書会を行う。」というのはどうでしょうか。イベントを二分する事になってしまいますが、参加者全員が納得するのではないかと思います。あくまで提案ですので、ご意見を頂戴したい次第です。(コメント欄はSpamが多すぎるためTBでお願いします。)。
資料について
ネットワーク環境が準備できないとの事だったので、参考資料を配布しましたが、参加者の協力があり細いながらも回線を確保する事ができました。また、参考資料がほとんど活用されていなかったようなので、次回からは配布資料はなしにしようと思います。プレゼン資料は後日アップします。
お菓子とジュースについて
参加者が少ないうちは、飲み物とお菓子はあった方が良いと思いますが、参加者24名ではどうなのでしょうか。片付けのせいで撤収にも時間がかかってしまったと思います。次回からは各自持参にしようと思います(この点についてもご意見お待ちしております。)。
名札について
一緒に配ったクリップは名札をとめるためのものなのだったのですが、あまり気付いておられなかったようです。私自身、終了後に「資料止めてました。」と聞きはじめて知りました。名札そのものも文字が小さく使い物になるような代物ではありませんでした。次回以降必要かご意見お願いします。必要であれば安い名札入れを準備することも考えます。
会計処理について
会計報告は後日おこなう予定です。
コメントとトラックバックについて
Spamが非常に多いため、許可したもののみ反映するようになっています。一週間経っても反映されていない場合、私が間違って削除してしまった可能性があるため、大変申し訳ありませんが再度実行をお願いします。管理しやすいのでトラックバックでお願いしたいのですが、Blogを運営されていない方はコメントでも構いません。

2007年11月05日

Kanasan.JSの資料

プレゼンテーション資料
Kanasan.JSで使用したプレゼンテーション資料を公開します。
どこかで基調講演と書かれていましたが、そんなたいそうなものではないです。緊張し、わけが分からないまま喋ってたので、ちゃんと伝わったかどうかが心配です。
内容なのですが、発表した時のまま公開します。何か誤りがありましたら、トラックバックやコメントで指摘して下さい。

2007年11月07日

Kanasan.JS 会計

Kanasan.JSの会計処理が終了しました。
参加費は参加人数によって変動するとしていましたが、当日は500円としました。結果、非常に多く徴収してしまった感があり、後悔しています。
もともと考えていたのは、「毎回精算し残金は残さない」か「講演者を招聘するために少しずつプールする」方法だったのですが...。
今後、運営方法を考えたいと思います。

2007年11月08日

選択範囲をTwitter検索するBookmarklet

Twitter検索で会話を追うときに便利です。4タイプあるのでお好みでどうぞ。
/*
================================================================================
    Name        :   選択範囲をTwitter検索するBookmarklet Ver1.0.0
    In          :   [none]      
    Out         :   [none]      
    Note        :   選択範囲の文字列をTwitter検索します。
--------------------------------------------------------------------------------
    Version     :   Ver1.0.0    |   2007/11/07  |   新規作成
--------------------------------------------------------------------------------
    License     :   MIT license
    URL         :   www.kanasansoft.com
================================================================================
*/

(
    function(){
        var
             w=window
            ,d=w.document
            ,s=""
            ;

        if(d.selection){
            s   =   d.selection.createRange().text
        }else if(d.getSelection){
            s   =   d.getSelection()
        }else if(w.getSelection){
            s   =   w.getSelection()
        }

        window.open("http://twitter.1x1.jp/search/?source=&keyword="+encodeURIComponent(s)+"&lang=","_self")
    }
)
()
/*
================================================================================
    Name        :   選択範囲をTwitter検索するBookmarklet(本文のみ) Ver1.0.0
    In          :   [none]      
    Out         :   [none]      
    Note        :   選択範囲の文字列をTwitter検索します。
--------------------------------------------------------------------------------
    Version     :   Ver1.0.0    |   2007/11/07  |   新規作成
--------------------------------------------------------------------------------
    License     :   MIT license
    URL         :   www.kanasansoft.com
================================================================================
*/

(
    function(){
        var
             w=window
            ,d=w.document
            ,s=""
            ;

        if(d.selection){
            s   =   d.selection.createRange().text
        }else if(d.getSelection){
            s   =   d.getSelection()
        }else if(w.getSelection){
            s   =   w.getSelection()
        }

        window.open("http://twitter.1x1.jp/search/?source=&keyword="+encodeURIComponent(s)+"&lang=&text=1","_self")
    }
)
()
/*
================================================================================
    Name        :   選択範囲をTwitter検索するBookmarklet(別窓) Ver1.0.0
    In          :   [none]      
    Out         :   [none]      
    Note        :   選択範囲の文字列をTwitter検索します。
--------------------------------------------------------------------------------
    Version     :   Ver1.0.0    |   2007/11/07  |   新規作成
--------------------------------------------------------------------------------
    License     :   MIT license
    URL         :   www.kanasansoft.com
================================================================================
*/

(
    function(){
        var
             w=window
            ,d=w.document
            ,s=""
            ;

        if(d.selection){
            s   =   d.selection.createRange().text
        }else if(d.getSelection){
            s   =   d.getSelection()
        }else if(w.getSelection){
            s   =   w.getSelection()
        }

        window.open("http://twitter.1x1.jp/search/?source=&keyword="+encodeURIComponent(s)+"&lang=","_blank")
    }
)
()
/*
================================================================================
    Name        :   選択範囲をTwitter検索するBookmarklet(本文のみ・別窓) Ver1.0.0
    In          :   [none]      
    Out         :   [none]      
    Note        :   選択範囲の文字列をTwitter検索します。
--------------------------------------------------------------------------------
    Version     :   Ver1.0.0    |   2007/11/07  |   新規作成
--------------------------------------------------------------------------------
    License     :   MIT license
    URL         :   www.kanasansoft.com
================================================================================
*/

(
    function(){
        var
             w=window
            ,d=w.document
            ,s=""
            ;

        if(d.selection){
            s   =   d.selection.createRange().text
        }else if(d.getSelection){
            s   =   d.getSelection()
        }else if(w.getSelection){
            s   =   w.getSelection()
        }

        window.open("http://twitter.1x1.jp/search/?source=&keyword="+encodeURIComponent(s)+"&lang=&text=1","_blank")
    }
)
()

2007年11月09日

kanasan主催勉強会の基本方針

LANについて
出来るだけインターネット接続のできる会場を準備します。
電源について
電源確保は各自の責任で行なって下さい。基本的に延長コードを持参された方優先としますが、バッテリが残り少なくなった人に対しては、人道的配慮をお願いします。
インターネット配信について
東京で行なわれているイベントを羨ましく思います。せめて、講演等はインターネットで配信して欲しいと願っています。それでも関西は、他の地域に比べてまだ恵まれている方です。勉強会が比較的盛んに行なわれているのですから。少しでも情報が欲しい人は、小さな勉強会でさえも配信して欲しいと望んでいるはずです。自分達が東京のイベントの配信を望み、そしてそれを見るのであれば、自分たちも関西の勉強会の配信を行い、そしてそれを見てもらいましょう。
参加者のプライバシーとハンドルネーム
インターネット配信を行うため、参加者はハンドルネームでの参加をお願いします。もちろん、本名を隠す必要がない方はそのままでかまいません。カメラの方向は出来るだけ固定しますので、映像に映りたくないという方はカメラの向いていない場所へ着席下さい。ただし、なんらかのアクシデントが発生し、撮影されてしまう可能性があることをご了承下さい。
主催者も参加者
勉強会と聞くと、講師がいてそれを参加者が聞くセミナー型の物を想像するのではないでしょうか。確かに、セミナー型は理想かもしれません。セミナー型の勉強会を開くためには、その分野に精通した人が講師をしなくてはなりません。しかし、精通した人が教えるためだけに勉強会を開いてくれるでしょうか。ないとは言い切るのは乱暴ですが、得る物がなければ可能性は比較的低いでしょう。有料のセミナーであれば可能性はありますが。低い可能性を待っていては、いつまでたっても勉強会を開く事ができません。
では、どうすれば良いのでしょうか。その方法は意外と簡単なのかもしれません。その分野に自分が精通してなくても、勉強会を開いてしまえば良いのではないでしょうか。自分が知っている部分については教えて、知らない部分については他の参加者に聞く。参加者の誰も知らないのであれば、皆で考え、インターネットで調べる。インターネットで配信するのですから、ネットの向こう側の人が教えてくれるかもしれません。皆同じ立場、つまり主催者も参加者なのです。主催者はただ、勉強会の場を準備したに過ぎません。まさに勉強会です。
おやつは重要
試験前や受験の時に、勉強しながらお菓子を食べていませんでしたか。甘い物が欲しくなったりはしませんでしたか。高度な思考を行っている時には、脳が糖分を消費します。糖分を供給する事で、集中力が持続するのです。せっかく参加したのですから、得られる物はできるだけ得て帰りたい物です。そのためには、集中力を持続させなければなりません。勉強会にも甘い物は必要です。
学生には優しく
社会人と学生と同じ参加費でも、負担感は全く違います。負担感をできるだけ近づけるために、可能な限り学生の参加費を少なくしたい、できれば無料にしたいと考えています。参加者数と会場代等により、この思想を貫けないこともあると思いますが、このように考えています。ただし、現状では始まったばかりの勉強会です。社会人と学生の参加比率もわかりません。このため、この構想はしばらくお預けになるでしょう。その時が来た時に忘れないためにここに書いておく事にします。

2007年11月11日

勉強会のインターネット配信

勉強会でインターネット配信を行うために各サービスの設定を行いました。Kanasan.JS名で設定しています。
また、基本方針を策定しましたのであわせてご覧下さい。

JavaScriptの読書会開催のお知らせ

Kanasan.JSの活動の一貫として「JavaScript第5版読書会」を行います。詳細は以下のリンク先をご覧下さい。

2007年11月23日

JavaScript第5版読書会#1無事終了しました

参加した皆様、お疲れさまです。二日遅れの報告です。
全体的には成功したと思いますが、アンケートの回収率が少々芳しくありませんでした。一部の参加者の期待に応じることが出来なかったということでしょうか。気になります。まずかった点、悪かった点がありましたら、アンケートに書いて頂ければ次回開催時に反映させることも可能なのですが...。「参加して良かったですか?」への回答はほとんどが「非常に良かった」と「良かった」でした。しかし、Kanasan.JSよりも少し反応が悪かったようです。以下、分析してみます。(文中の[K][P][T]はKPT法のKeep、Problem、Tryのことです。)
ネットワーク環境とプロジェクタとその効果
やはり「[K]ネット環境」と「[K]プロジェクタ」は非常に重要なようです。プロジェクタで常に表示されていた「[K]Lingr」上では、参加者がテストした検証コードとその結果がPostされたり、Firebugを使った「[K]処理の実演」も行われました。但し、デモ・実演の表示をもっと多くして欲しい旨の意見もあがっていたため、次回は実演をもっと増やした方が良さそうです。Lingrは、遠隔地からのネット越しの参加や復習のために用意したのですが、意外な効果が出ました。「[T]もう少し質問であがったことをlingr等にあげる。」という意見、その通りだと思いますが主催者はいっぱいいっぱいだったため、次回からは参加者も積極的にお願いします。Lingr同様、「[K]Ustream」も復習等用に準備しましたが、会場ではあまり活用されていなかったような気がします。
読書スタイル
読書範囲(例:P15〜P47)を決め、皆で読むスタイルをとりました。読書範囲を読破した人はその続きを読み進めます。「[K]自由な発言」が可能だったので、わからない事があればいつでも質問できました。但し、「[K]読んだ範囲のみに限定した質問」、つまり質問は読書範囲に指定された部分に限定しました。そして全員が読破した段階で、次の読書範囲を決めこれを繰り返します。「[T]一節終わった後のまとめ」は確かに有効かもしれません。でも誰がまとめるのでしょう。やっぱり私ですか?
他言語の話題
「[P]JS以外の話はもう少し少な目が良いです。」や「[P]他言語へ話が移ること」という意見がありました。「PHPの会社」や「.NETの会社」等の表現がある通り、ソフトハウスにいると、どうしても習得言語に偏りが出てしまいます。これを解消するためにも他言語の話は必要だとは思いますが、それに多くの時間を費やしてしまうのは問題かと思います。他言語との比較は、様々なバックグラウンドをもつ方が多数参加する勉強会の醍醐味だとは思いますし、習得言語との比較により理解が深まる参加者も当然いるわけで、どこかで折り合いをつける必要があるのかもしれません。という事で、以下のルールを検討中です。「X分間ルール:他言語の話題は連続X分間以上は禁止する」「禁止ワード:X分間ルールを破ってしまった言語名や頻出しすぎる言語名、進行に支障をきたすような言葉や話題を使用禁止にする」「イニシャル言語名トーク禁止:禁止ワード回避の防護、初心者への配慮のために、イニシャルやわかりづらい隠語俗語による言語名の使用を禁止する」
進行について
中級者から「[T]初心者向けの解説をはさみながら進めてはどうでしょう?」という意見があり、初心者からは「[K]講義形式も少しは入れてほしい」との要望がありました。この初心者さんの熟練度は推定するしかありませんが、全くの初心者だったとすると難しすぎたかもしれません。今となっては遅いのですが、是非質問をして頂きたかったと思います。私やまわりの参加者で、フォローできたのではないかと思うと残念でなりません。
座席配置
「[P]局所的に質問が閉じてて、全体で共有できればよかったと思う(きこえにくい)」という意見がありました。「[P]スクールスタイルの席配置」という意見が示している通り、座席配置が悪かったのだと思います。そもそも定員が36名の部屋をとったにも関わらず参加者の定員を24名にしたのは、長机を円形に並べるスペースを確保するためでした。しかし、当日になってから机の移動の時間と片付けにかかる手間を惜しんでしまったため、机は初期状態のままで読書会を行ってしまいました。明らかに失敗でした。次回以降は気をつけます。
会場について
「[P]駅から遠い・・・(大阪駅)」、確かに。こればっかりはどうしようもないかもしれません。利用可能な日時・会場の広さ・ネットワーク環境・プロジェクタ等、勉強会に必要だと思われる要素がそろっている会場は滅多にないようです。良い会場を教えて頂ければ検討します。
お菓子
勉強会は頭を使うため「[K]お菓子」は重要です。

2007年11月24日

「配列の初期値を指定する方法」の「一文字の文字列しか指定できない制限」の打破を試みる

JavaScript第5版読書会#1で話題にあがった「配列の初期値を指定する方法」について、higeorangeさんのBlogにコメントしました。
処理の関係上、初期値には一文字の文字列しか指定できません。
また、空文字の場合正常に動作しないため、例外処理が必要になります。

function arrayFill(num,str){
if(str.constructor!=String||str.length!=1){
return new Array(num);
}else if(str==""){
return (new Array(num)).join("*").split("*");
}else{
return (new Array(num+1)).join(str).split("");
}
}
この、「一文字の文字列しか指定でき」ない制限を打破できないかと思い、実装を試みてみます。
function arrayFill(num,str){
    if(str.constructor!=String){
        return new Array(num);
    }else if(str==""){
        return (new Array(num)).join("*").split("*");
    }else{
        var dummy="";
        //初期値に部分一致しない文字列の作成
        while(str.indexOf(dummy)!=-1){
            dummy+=String.fromCharCode(Math.floor(Math.round()*26)+65);
        }
        return ((new Array(num)).join(str+dummy)+str).split(dummy);
    }
}
一見、うまく動作しそうですが、「strとdummyの接合部分でdummyと一致する文字列が生成」された場合、不具合が生じてします。例えば、「atr="AB";dummy="ABA";」となってしまった場合です。
他にも色々と試してみましたがうまくいきません。諦める事にします。

Firefoxのステッカーとふぉくすけのシール

読書会の参加者全員にFirefoxのステッカーとふぉくすけのシールをプレゼントしました。そして、じゃんけんに勝った3名にはFirefoxのストラップをプレゼントしました。
なぜ、私はFirefoxグッズをそんなに沢山持っていたのでしょう。「kanasanが火狐だから」。違います。
正解はKOF
実はKOFの懇親会で、Mozilla Japanの方と名刺交換をしました。「関西でJavaScriptの勉強会をはじめました。」というように。KOF終了後、Mozilla Japanの方から、「ステッカー等を送ります。参加者の皆様へどうぞ。」という連絡を頂きました。参加者はステッカーを貰える事よりも、Mozilla Japanの配慮と太っ腹さに驚いていたようです。実際、勉強会を立ち上げたばかりで不安を抱えていた私にとって、かなりの励みになりました。感謝の気持ちでいっぱいです。本当にありがとうございました。
(参加者には当日まで秘密にしておきたかったので、Blogに書くのが今日になってしまいました。)

2007年11月25日

JavaScript第5版読書会#1参加者の参加報告の一覧

2007年11月30日

配列の初期値を指定する方法の処理速度検証

JavaScript第5版読書会#1で披露した「配列の初期値を指定する方法」のその後の展開。『「配列の初期値を指定する方法」の「一文字の文字列しか指定できない制限」の打破を試みる』のエントリーを見たmurky-satyrさんが制限を突破した。murky-satyrさんの処理をもとに新規に作成した関数の処理速度がどれほどか検証してみる。検証はFirefox for Macで行った。尚、検証中に明らかに処理が遅くなることがあったが、GCの動作中と思われるのでこの場合はもう一度測定した。
まず、処理の処理速度の比較を、次の3つの処理に対して行った。
process1
//空の配列を生成=>メソッドにより拡張
function arrayFill(num,str){
    var rtn=[];
    var i;
    for(i=0;i<num;i++){
        rtn.push(str);
    }
    return rtn;
}
process2
//空の配列を生成=>範囲外の添字を指定し拡張
function arrayFill(num,str){
    var rtn=[];
    var i;
    for(i=0;i<num;i++){
        rtn[i]=str;
    }
    return rtn;
}
process3
//サイズ指定した配列を生成=>範囲内の添字を指定し拡張
function arrayFill(num,str){
    var rtn=new Array(num);
    var i;
    for(i=0;i<num;i++){
        rtn[i]=str;
    }
    return rtn;
}
検証方法は以下の通り。
test1
//10000回-10個-10文字
//処理回数が多い
var d=new Date();
for(var j=0;j<10000;j++){
   arrayFill(10,"1234567890");
}
(new Date())-d;
test2
//10回-10000個-10文字
//要素数が多い
var d=new Date();
for(var j=0;j<10;j++){
   arrayFill(10000,"1234567890");
}
(new Date())-d;
test3
//10回-10000個-10000文字
//要素数と文字数が多い
//(文字数のみ増やしても早すぎて測定できないため要素数を増やした)
var d=new Date();
for(var j=0;j<10;j++){
   arrayFill(10000,"12345678901234567890...");//実際には10000文字
}
(new Date())-d;
検証結果1
process1 test1 => 243ms
process1 test2 => 181ms
process1 test3 => 182ms

process2 test1 => 141ms
process2 test2 => 83ms
process2 test3 => 83ms

process3 test1 => 113ms
process3 test2 => 61ms
process3 test3 => 60ms
そして、次の2つの処理を検証する。
process4
//joinとsplitを使用し配列を作成
//(native codeで実行するので処理速度が速くなると期待)
function arrayFill(num,str){
    return (num = Number(num)) > 1
        ? Array(num + 1).join(str).split(RegExp('(?=(?:[\\s\\S]{'+str.length +'})+$)'))
        : [str];
}
process5
//再帰呼出し
function arrayFill(num,str){
    return num==0?[]:[str].concat(arguments.callee(num-1,str));
}
process5は再帰呼出しが多いと怒られた。process4にいたっては全てスクリプトタイムアウトしたので、計測可能になるまでそれぞれの値を減らして実施。
検証結果2
process4 test1'(1000回-10個-10) => 4639ms
process4 test2'(10回-500個-10)  => 7050ms
process4 test3'(10回-100個-100) => 1532ms

process5 test1 => 2455ms
process5 test2 => エラー(too much recursion)
process5 test3 => エラー(too much recursion)
遅過ぎる。話にならない。正規表現がまずかったのか。後で再度検討してみる。
(2007.12.02追記)
説明不足かもしれないから補足。正規表現の中身は悪いのではなくそもそも正規表現を使うのは処理コストが高いのではないかということ。
Google