« 2008年02月 | メイン | 2008年04月 »

2008年03月 アーカイブ

2008年03月01日

Haskell Hackathon 2008参加中 - kmyaccのinstallメモ

Haskell Hackathon 2008に遅れて参加してます。
実装系の知識が全くないので、どこから手をつけていいのやら。
とりあえず、kmyaccというのをinstallしないといけないらしい。
で、kmyaccのinstallでつまった部分があったのでメモ。
普通にmakeすると以下のようにエラーとなってしまう。
% make
cd src; make all
cc -Wall -O2 '-DPARSERBASE="/usr/local/lib/kmyacc"'   -c -o misc.o misc.c
misc.c: In function ‘sortlist’:
misc.c:127: error: ‘uint’ undeclared (first use in this function)
misc.c:127: error: (Each undeclared identifier is reported only once
misc.c:127: error: for each function it appears in.)
misc.c:127: error: syntax error before ‘n’
misc.c:144: error: ‘n’ undeclared (first use in this function)
misc.c:150: error: ‘xn’ undeclared (first use in this function)
misc.c:150: error: ‘yn’ undeclared (first use in this function)
make[1]: *** [misc.o] Error 1
make: *** [all] Error 2
Mr. hakobeによると、uintをunsigned intに書き換えるといいらしい。
src/misc.c(127行目)
  unsigned int n, xn, yn;
kmyacc-4.1.4の場合
出来た。
さて、続き続き。
2008/03/01追記
btoさんによると、common.hに
common.hに追記
typedef unsigned int uint;
と追記してもいけるらしい。

2008年03月02日

Haskell Hackathon 2008に参加してきました

まず、どこまで実装できたか。
結論から言うと、0%でした。
正直、実装系の知識が皆無の状態で参加したため非常に難易度が高く、「開始記号?終端記号?何ですかそれは?」「parser?それはわかる」「lexer?え?」と言うような状態。
しかし、処理系実装の方法を実感として得る事ができたし、かなり有意義でした。
BNF記法は知っていたけど、はじめて有効的に使っているのを見た。
そもそもこうゆう時に使うものなんだろうけど。
参加者の皆様、お疲れさまでした。

グッデイ

Haskell Hackathon 2008の大阪会場となったのは株式会社グッデイです。
去年末に行われたLiveCoding#5もグッテイで行われました。
今回のようなイベントや勉強会は、毎回のように会場確保に苦労します。
ネットワークやプロジェクタのある貸会議室等は、料金が高くなってしまい、Kanasan.JSでも苦労しています。
どこかの会社で開催できれば良いのですが、会場を提供している会社から見れば、どこの誰だか知らない人が社内をうろつくわけですから、簡単には許容できないのはある意味同然でしょう。
特に関西圏ではそのような会社が少ないように感じます。
このような状況下でも快く会場を提供して下さった、グッテイの皆様、本当にありがとうございました。

アンテナ

最近、アンテナの感度が低い人が多い気がしている。
アンテナが折れてしまったのか、そもそもアンテナがないのかはわからないが、どちらにしても多すぎる。
そう考えるようになったのは、インターネットの普及によって感度が良い人を多く知るようになったせいかもしれない。
そして、アンテナの感度だけでなくもうひとつ思うようになったのは、そもそも自分がいる場所の電波強度はどうなっているのかということ。
どれだけ感度が良くても、圏外ではどうしようもない。
逆に、感度が悪くても、電波強度の高い場所にいればなんとかなるのではないか。
こう考えた時に思い出したのは「ウェブ時代をゆく」という本。なるほど、梅田望夫の言う「見通しの良い場所」というのはこうゆう事か。
自分のアンテナは何本立ってるんだろうか。

勉強会やイベント用にブラウザのレイアウト変更を試みる

Kanasan.JSではプロジェクタにUstreamやLingrを表示している。
この時に困るのは、気になったcodeがあっても試しに実行するのをためらってしまう事だ。
もし実行するには、他のタブを開くかFirebugやJashを使うことになる。
しかし、新しいタブだとLingrが隠れてしまうし、FirebugやJashだとglobal環境を汚染してしまう。
新規ウィンドウでの対応や、globalを汚染しない記述する対応も考えられるが意外と面倒である。
自分が使うマシンとプロジェクタ用のマシンをわけられれば一番良いが、結局code実行の環境は必要だと思う。
致し方ないと諦めていたが、「分割ブラウザ」というアドオンを見つけた。
もしかすると、これまでの不満点を補ってくれる可能性があると感じたので試用してみた。
尚、ここでは「分割ブラウザ」の詳細な使い方は説明しない。
以下、もともとの表示領域をメイン領域、分割ブラウザを使って表示している部分をサブ領域と呼ぶ事にする。
「分割ブラウザ」で表示領域を分割
まず、「分割ブラウザ」を使って、サブ領域にLingrとUstreamを表示してみた。
サブ領域にLingrとUstreamを表示
画面は前回のKanasan.JSのもの
一応表示されて入るが、Ustreamは調整が面倒だし、Lingrに至っては表示領域が小さい為にレイアウトが崩れてしまっている。
それぞれの対応策がないか調査してみた。
Ustreamの表示を綺麗にする
これは意外と簡単で、配信動画の下部にある「Open in popup window」リンクを使う。
リンクをクリックすると別ウィンドウで開いてしまうので、右クリック等でurlをコピーする。
「Open in popup window」リンク
クリックせずにurlをコピー
そのurlをサブ領域のアドレスバーにペーストし直接開くと、Flashが全画面で表示される。
サブ領域の表示サイズを変更すると動的にリサイズされるため、かなり融通が利く。
Lingrのレイアウトをなんとかする
レイアウトの変更はJavaScriptで行う。
Lingrのmessageを全画面で表示するJavaScript
(function(){
    var
     gEBI               =   function(eid){
        return document.getElementById(eid);
    }
    ,map                =   function(fnc,ary){
        for(var i=0;i<ary.length;i++){
            fnc(ary[i]);
        }
    }
    ,displayNone        =   function(eid){
        gEBI(eid).style.display =   "none";
    }
    ,displayMax         =   function(eid){
        gEBI(eid).style.width   =   "100%";
        gEBI(eid).style.height  =   "100%";
        gEBI(eid).style.margin  =   "0px";
        gEBI(eid).style.padding =   "0px";
    }
    ;
    map(    displayNone                 ,
            [   "globalHeader"      ,
                "columnB"           ,
                "chatFooterWrapper" ,
                "chatFooter"        ]   );
    map(    displayMax                  ,
            [   "enter"             ,
                "everything"        ,
                "ieWrapper"         ,
                "columnA"           ,
                "messages"          ]   );
}
)();
Bookmarkletはメイン領域で実行されるし、Greasemonkeyでは常に実行されてしまうため、one liner化したJavaScriptを準備。
Lingrのmessageを全画面で表示するJavaScript(one liner)
javascript:(function(){var gEBI=function(eid){return document.getElementById(eid);},map=function(fnc,ary){for(var i=0;i<ary.length;i++){fnc(ary[i]);}},displayNone=function(eid){gEBI(eid).style.display="none";},displayMax=function(eid){gEBI(eid).style.width="100%";gEBI(eid).style.height="100%";gEBI(eid).style.margin="0px";gEBI(eid).style.padding="0px";};map(displayNone,["globalHeader","columnB","chatFooterWrapper","chatFooter"]);map(displayMax,["enter","everything","ieWrapper","columnA","messages"]);})();
「javascript:」追加済
このJavaScriptをサブ領域のアドレスバーにペーストし実行する。
結果
ここまでの作業を行った結果が以下。
作業完了時の画面
これで、参加者に見られている事を気にしなければメイン領域で好き勝手できる。
なお、スクリーンショットには録画済のUstreamを表示しているが、Liveでも同じ事が可能だった。
2008/03/02追記
特定のUrlParameterが渡された時だけ、Greasemonkeyのuser.scriptを実行するようにすればいい事に気がついた。
2008/03/13追記
Lingr用のUser Scriptを作成しました。

2008年03月11日

たとえ「Aクラスにはなれない」と言われようとも。

Aクラスの人って本当に「No」を言わないんです。

「これできる?」と聞いても、最悪でも「Yes, but.....」なんですよ。例えば、実際にはできなくても、「僕はやったこと無いけど、●を調べればできるはずだから明日までにやるよ(そして、本当にちゃんとやる)」とか「僕の友達がそれに詳しいから、すぐ聞いてみる」とか、そんな感じで進んで行きます。

(決して、ビッグマウスであるのがいいと言っているのではなく、それと実際の行動が伴っているのです。)

逆に、外部の人とMTGして、「これできますか?」と聞いた場合に、相手が「それは難しいと思います。社内の担当者に聞かないと分かりません。それをするには●日かかります。」みたいなネガティブなことを言うと、露骨に嫌な顔をします。

出来るAクラスの人は、Noを言わない、という傾向があるような気がしました。
Aクラス理論で「Aクラスの人はNOと言わない」とあるけど、これはお願いしている方も技術力を持っているからだと思う。
頼むことをちゃんと選択できているからだと思う。
技術的スキルのない人からの要望に対して全て「YES」と答えてたら、それはデスマーチの始まりじゃないですか。
だから私はNOと言う。
たとえ「Aクラスにはなれない」と言われようとも。

2008年03月12日

JavaScriptで作成したMinesweeperの新版が完成

以前にも作成したことがあるMinesweeperですが、再度制作してみました。
何故、同じものを二度も作成したかというと、旧版はcoding styleが古すぎるため、そしてFirebugで簡単にカンニングができてしまうためです。
あわせて、汎用Libraryを一切使わない制約も設けcodingしてみました。

はてなスター

今更ながら、当blogをはてなスターに対応させました。
まあ、それだけです。

2008年03月13日

TwitterのDM送信先をアルファベット順に並び替えるグリモン

Twitterで何百人とfollowしていると、Direct Messagesを送信するときプルダウンメニューの表示順がバラバラで唖然とする。
そのプルダウンメニューの表示順をアルファベット順に並び替えるGreasemonkeyのUser Scriptを作成した。
これでDM送信を躊躇しなくてもよくなった。

Lingrのメッセージ一覧をフルスクリーン表示するグリモン

LingrのRoomを表示する時に、urlの後ろに「?fullscreen=true」をつけておくと、ウィンドウ内がメッセージ一覧のみの表示となる。
Lingrを小さく表示したい時に便利。

2008年03月14日

TwitterのDM機能を拡張するGreasemonkey

TwitterのDirect Messages機能を拡張するGreasemonkeyを作成しました。
拡張される機能は以下の通り。
timelineにDirect Messages投稿用のリンクを追加
timelineにDirect Messagesを投稿するためのリンクが追加されます。
Twitの最後に[DM]と書かれた画像が追加されます。
[DM]をクリックすると、Twitした人が送信先の初期値として設定されたDirect Messages投稿画面に遷移します。
AutoPagerizeによって追加されるTwitにも対応しています。
Direct Messagesのプルダウンメニューをアルファベット順に並び替え
Followしている人が増えてくると、Direct Messagesの送信先を選択するのが非常に煩わしくなります。
これは送信先のプルダウンメニューの並び順がTwitterに追加された順番になっているからです。
この並びをアルファベット順に変更します。
Direct Messages送信先にインクリメンタルサーチ機能追加
Direct Messagesのプルダウンメニューの横にテキストボックスを追加します。
ここに文字を入力すると、プルダウンメニューの項目を絞り込んでいきます。

2008年03月19日

Kanasan.JSの募集はじまっています

Kanasan.JS prototype.js CodeReading#4の募集はじまっています。
今回の告知メールはどうもGmailでは迷惑メールとして処理されたらしく、気付いていない人もいるようです。
参加されたい方は下記URLへどうぞ。

2008年03月29日

Emacs移行経過(2008/03/29)

現状
Emacsに移行を考えてもう半年近くなるが、未だに作業できるまでには至っていない。
EmacsのTypingGameだけではとてもじゃないけど追いつかない。
無理矢理にでも移行する為に、これまでの成果を晒す。
完全に覚えた完結キー
C-f forward-char
C-b backward-char
C-n next-line
C-p previous-line
C-a move-biginning-on-line
C-e move-end-of-line
C-d delete-char
C-i indent-for-tab-command
C-g keyboard-quit
C-SPC   set-mark-command
C-x o   other-window
C-x C-c save-buffers-kill-emacs

覚えかけている完結キー
C-o open-line
C-m newline
C-k kill-line
C-x C-f find-file
C-x k   kill-buffer
C-x C-s save-buffer
C-h k   describe-key
C-h f   describe-function
C-h v   describe-variable

覚えたい完結キー
プレフィックスキー(完結していないキー列)を中断
コピー

よく間違える完結キー
C-h MacOSXではDELと同様の為

保留中の完結キー
C-j newline-and-indent
C-x =   what-cursor-position

完全に覚えたコマンド
なし

覚えかけているコマンド
set-variable

覚えたいコマンド
なし

保留中のコマンド
なし

完全に覚えた変数
なし

覚えかけている変数
column-number-mode
tab-width

覚えたい変数
なし

保留中の変数
なし
目標
とりあえず、普通にcopy&pasteができるようにする。
範囲選択はわかったけど、markからcursorまでのcopy方法がいまいちわからないので、[C-o]=>[移動]=>[C-k]=>[C-d]=>[移動]=>[C-y]というかなり無茶な事をやっている。
さすがにこれは早めになんとかしないといけない。

2008年03月30日

PrototypeTester

prototype.jsを動的に読み込んで実行を確認するためのPrototypeTesterを作成した。
Kanasan.JSの時にprototype.jsの実行環境がなく、試す事ができなくてやきもきしたのと、ujihisa氏とnanki氏に「prototype.jsが読み込まれていないと自動的に読み込むlibraryがあれば便利」みたいな事を言われたのが作成理由。
後者は冗談レベルだったけど、面白そうだったので作ってみた。
あわせてJashを使うと更に便利だと思う。

prototype.jsを動的に読み込むLibrary

prototype.jsを動的に読み込む「AutoLoadPrototype」というLibraryを作った。
ひとつ前のentryのPrototypeTesterで使用している。
使い方は至って簡単。
まず、AutoLoadPrototypeをincludeする。
AutoLoadPrototypeを読み込む
<script type="text/javascript" src="AutoLoadPrototype.js"></script>
とりあえずはこれでOK。
実行すると、読み込むprototype.jsのバージョンを聞かれるので、入力すると指定されたバージョンを読み込んでくれる。
どのバージョンも読み込みたくない場合は、キャンセルすればいい。
また、includeする側で読み込むバージョンを指定する事もできる。
global変数「AUTO_LOAD_PROTOTYPE」を次のようにすれば良い。
読み込むprototype.jsのバージョンを指定
var AUTO_LOAD_PROTOTYPE=undefined;  //バージョンを実行時に指定(未指定時と同様)
var AUTO_LOAD_PROTOTYPE=true;       //最新バージョンを読み込む
var AUTO_LOAD_PROTOTYPE=false;      //読み込みは行わない
var AUTO_LOAD_PROTOTYPE="1.6.0.2";  //バージョンを指定して読み込む
読み込みの有無とバージョン指定が同じ変数で制御されるのは少々行儀が悪いが、global領域をあまり汚染したくなかったため。
objectに入れるという方法もあったが、使い勝手を犠牲にしたくなかったのでこんな形に。
そもそも、prototype.jsを入れかえれば良いだけの話ではある。
しかし、実行時にバージョンを指定できたり、変数で制御できるのでアイディア次第では面白い事になりそう。
Google

タグ クラウド