たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。
以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
js-ctypesはFirefox 3.6から利用できるMozillaの独自の機能で、平たく言うとC言語の実装の中で定義された関数をJavaScriptから呼べるようにするという物。Pythonにctypesという機能があって、それのJavaScript版がjs-ctypes。
Firefox 3.6(Gecko 1.9.2)ではできる事の制限が厳しかったので使えるケースがあんまり無かったようなんだけど、Firefox 4(Gecko 2.0)では構造体がサポートされたので一気に使える場面が増えた。らしい。
システムモニターをFirefox 4に対応させなきゃねと思ってたんだけど、Compartmentがどうとか色々変更があったのを全部調べてたら絶対自分の手に負えん!!と思ったので、いっそのことjs-ctypesで実装すりゃいいんじゃね? と思って、試行錯誤しながらやってみてる。試行錯誤の様子はリポジトリを見るとバレバレです。
js-ctypesのいい所:
困った所:
parseInt()
する、みたいな癖を付けとくとハマらなくていいと思う。JavaScriptでFirefoxをクラッシュさせたかったらjs-ctypesでメモリ破壊とかやると手っ取り早いですよ! と、数え切れないほどFirefoxをクラッシュさせて思いました。
しばらくぶりに帰宅して、さあ外出先で行った開発の結果を取ってきましょうと思ってgit pullしようとしたら、bashが起動しなくなってた。
背景を説明すると、僕は自宅ではWindowsを使ってて、Gitを使った開発にはTortoiseGitとmsysGitの組み合わせを使用しているのですが、普段は全然普通に使えてるのに今日になって急にそれが動かなくなってたという状況でした。どうもTortoiseGitが内部的に呼び出してるCygwinのbashが動いてないようで、bash単体で起動しようとしてもこんな風なエラーが出てしまってすぐにプロセスが落ちてしまいます。
0 [main] us 0 init_cheap: VirtualAlloc pointer is null, Win32 error 487 AllocationBase 0x0, BaseAddress 0x68540000, RegionSize 0x70000, State 0x10000 C:\Program Files\Git\bin\bash.exe: *** Couldn't reserve space for cygwin's heap, Win32 error 0
で、エラーメッセージを頼りに何か情報が無いかとGoogle先生に聞いてみた所、同じようなエラーが起こって困ってる人が結構いるみたいだったんですが、そこで紹介されてた以下の2つの対処法は僕の環境では効果がありませんでした。
諦めずにさらに探してたら、MSYSの謎のエラー - メモ@wantoraというエントリで紹介されてた方法でうまくいきました。
>cd "c:\program files\git\bin" >rebase -b 0x30000000 msys-1.0.dll
rebaseというのはひょっとしたら普通は入ってないかもしれません。自分はFirefoxのビルドのためにWindows SDKというのを入れてましたが、それに付いてきてたのかもしれません。リンク先のエントリによるとWindows SDK for Windows Server 2008 and .NET Framework 3.5を入れると付いてくるようです。
rebaseってなんやねん、git rebaseとは違うのか、と思って検索してみたら以下のような記事が出てきましたが、読んでもよくわかりませんでした。
14日くらいから、Rewind/Fastforward Buttonsを入れてるとFirefoxが頻繁にクラッシュするという現象が発生するようになっているようです。wedataのAutoPagerize用データベースに新しく追加された項目がトリガーになって、長すぎる正規表現か何かの制限に引っかかるようになってクラッシュしているものと考えられます。問題としては認識しているのですが、現在修正のための時間を取れない状態なので、アドオンを無効化するか、about:configで以下の設定を変更して回避して下さい。
ちょっと本題から外れた所で思う所があったので書く。
知識はとても特殊な資源です。他の資源と違って、知識は複製可能です。他の資源は人にあげると自分の手持ちが減りますが、知識だけは減りません。つまり与えれば与えるほど価値の総和が増えるのです。
エントリ全体として「知識を共有しよう! 知識はギブしても価値は減らないよ! ギブすると価値が増えるよ!」という方向で話が進んでいるのだけれども、しかし、ギブすると知識の価値が減るという面は確かにあるのですよね。
それは、希少性という価値。「情報を持ってる人が、情報を持っていなくて欲している人に対して、対価を取って情報を渡す」という、非対称性を利用して情報格差から金を生む方法が、希少性のない情報に対しては使えなくなってしまう。
わかりやすい例を挙げると、いまどき「いんたーねっとのつかいかた」とか「いーめーるのつかいかた」とか「うぇっぶさーふぃんのやりかた」とかを教えるセミナーを開いた所で儲かりゃせんやろ、って話です。そういう情報がどんどん広まって「当たり前」「知ってて当然」の事になっていく事によって、それを教える事で生計を立てていた人は職を失う訳です。
そういう話があるから、情報をシェアするという事に対して拒否反応を示す人がいるってのは変な話ではないわけですよ。やっぱり。
ただ、情報っていう商材は「いくらでもコピーできる。広まる時はすぐに広まる。生産調整とかそういう事はできない。」という性質があって、希少性だけから金を生もうと思っても、大抵の場合はすぐに儲からなくなっちゃうわけですね。
だから、そんな「情報」という物をそれ自体商材にする事はとっとと諦めて、コピーが効かない別の商材を作るための材料にしちゃいましょうよ、って話だと思うのです。西尾さんのエントリの要点は。
で、そういう材料として使う事を考えた時、情報を集めるだけってのは大抵の場合ほんとそれだけに終わっちゃう事が多い気がする。技術系の話を片っ端からブクマして「後で読む」タグを付けてそれで満足しちゃって、一体何が身についたというのさ?って話ですよ。そんな事やってるより、作ってアウトプットしてを繰り返す中で、コピーの効かない「体験」「経験」を増やしていった方がなんぼかマシなんじゃないの、と僕は思うわけです。
JSDeferredは非同期処理の制御に特化しててサイズも小さくて素敵な軽量ライブラリだ!と僕は思ってるんだけど、世の中を見回してみると「軽量ライブラリ」って言われてる物は3KB未満とかそういうのが結構あるようだし、jQueryも1.5.1のminified版は28KBって書いてあるし、そうなるとjsdeferred.jsのコメント付き版が0.3.4で19KBというのは「軽量」と呼ぶにはひょっとしてちょっとでかいのかな……という気がしてきた。
なので、JS MinifierとかPackerとかそういう風なやつでどれくらい小さくなるのか実験してみた。
/packer/はそのままだと構文エラーで動かなくなってしまった。}Deferred.
って部分が7箇所あってこれがエラーになってるので、全部 };Deferred.
に置換(Base62圧縮後だと }4.
を };4.
に置換)したら一応エラーは出なくなった。/packer/の構文解析が貧弱なせいっぽいので、JSDeferredの側で問題になる所にあらかじめセミコロンを入れておけば、この問題は無くなるっぽい気がする。……と書いたからか、ちょよんごさんが対応してくれた。ありがとうございます!
あと、closure-compiler を通すと 2668bytes でした (jsdeferred のレポジトリで rake すると URL が出るようになってます)
というアドバイスも頂いたので早速Closure Compilerにかけてみた所確かに小さくなったのですが、シンボル類まで全部失われちゃってこれ単体だと他のスクリプトと組み合わせられないのが残念ですね。(Closure Compilerは他のスクリプトも全部合わせて一緒にコンパイルして使うのが前提ってことなんだろう)
家計簿の目的は「お金の出入りを記録して、自分が知りたい情報をちゃんと把握できるようにしておく事」ですが、そのためには「全てのお金の出入りをもれなく記録する事」、もっと言うと「ちゃんと記録し続ける事」が大前提になります。どんなに素晴らしい情報を引き出せる家計簿のフォーマットであったとしても、毎回の記入が煩わしいと記入が億劫になって、ちゃんと記録し続けるという事ができなくなってしまう。ちゃんと記録し続ける事を重視するなら、自分が使い続ける上で苦にならない記入フォーマットになってないといけないと思うのです。
かといって、知りたかった情報を引き出せないようでも困ります。僕の場合は「食費」「光熱費」くらいは抜き出して集計できておいて欲しい。でも入力はなるべく簡単にしたい、そうでないと長続きしない。
という事で、だいぶ前にそういうわがままなニーズを満たすための自分用家計簿スプレッドシートをODF形式で作ってみたのですが、この度Googleドキュメントに移行する事にしましたので、Googleドキュメント版のSpreadsheetのテンプレも公開しておきます。
どうすれば記入が長続きするだろうか? いっぱいレシートを溜め込んでしまった時でも続けて大量に記入しやすいだろうか? という事を考えて自分はこのスタイルに落ち着きました。分類がドロップダウンメニューではなく自由入力になってるのは、「交際費且つ食費」とかそういうケースに対応したかったのと、キーボードからの連続入力で省入力候補とかのIMEによる入力支援がある状況ならこっちの方が便利なんじゃなかろうか?と思ったのが理由です。
ポイントはG列から右の部分で、「分類」の所にざっくり入力した内容をG列から右の所でIFやら何やらの関数を使って集計して、その上で月ごとの食費等を出すようにしています。「食費」と書いても「食事」と書いても大丈夫なように、分類は文字列の部分一致でマッチするようにしてあって、G列から右の部分をコピペで増やしたり7行目のマッチング対象文字列を書き換えたりすれば、他の分類にも対応できるようになってます。
ATOKはATOK2011からWindows XP以降の多言語入力のフレームワークにきちんと則った設計になったとか何とかで、独自のフローティングウィンドウ(ATOKパレット)の代わりに、Windows標準の「言語バー」で全ての操作を行えるようになった。それはいいんだけど、使い勝手がちょっと今までのATOKパレットと違って違和感がある。目下のところ困ってたのは、IMEがOFFの時に言語バーが消えないという事。
というのも、ATOKパレットでは「IMEがONになってる時だけ表示して、IMEを介さない直接入力になってる時は非表示にする」という設定ができたんだけど、フローティング表示にしたWindowsの言語バーにはそういう機能が無いようで、直接入力の時でも常に言語バーが出っぱなしになってしまうのです。
普段の利用とか開発の時とかはそれでも別にいいんだけど、全画面表示でDVDとかBDとかを鑑賞したり、Adobe IllustratorやSAIとかの画面をなるべく広く使いたいアプリケーションを使う時なんかには、これが邪魔になる。
じゃあタスクバーに入れとけばいいじゃんって話なんだけど、タスクバーを縦置きして且つ自動で隠すようにしてる僕の環境では、ぱっとデスクトップの右下に目をやった時にIMEがONなのかそうでないのか(何も出てなければIMEがOFFになってて、ATOKパレットがあればIMEがONになってるってことですね)を判別できないので、そっちの方が不便が大きい。
JustSystem的にはこういう場合は言語バーを非表示にするかタスクバーにドッキングさせた上で従来通りのATOKパレットを使うようにしてくれって事らしい。でもそれも何だか芸がないですよね。できれば新しい物を使いたいし、古いオプションがいつまで残るかなんてわかんないし。乗り換えられるようになったらさっさと乗り換えておいた方がいいという事は、自作アドオンのせいでFirefox 1.5にロックインされてFirefox 2にいつまでも移行できなかった時にも痛感したし。だいたい、従来のATOKパレットではアプリケーションを切り替えたタイミングとかで、切り替え後のウィンドウの方でIMEが無効になってる時でもたまにATOKパレットが出っぱなしになることがあったから、以前のやり方に戻しても万全じゃないのです。
それでもうちょっと検索してみたら、そういう事をはてなで訊いてる人がいて、その回答の中でXLangBarというユーティリティが紹介されてた。昔なつかしVzエディタの作者の方の手による物だそうだ。最終リリースが2006年だったりWindows XP+MS-IME2002専用と書いてあったりで、Windows Vista+ATOK2011な僕の環境では動かないんじゃなかろうかとも思ったんだけど、試してみたらばっちり動いた。多分、Windows標準の言語バーを使ってる物だったら何でも使えるんだと思う。Windowsの多言語入力の仕組みが変わらない限りはしばらくは安心して使い続けられる……かな……?
追記。64bit版のWindows 7で試してみたら、XLangBarは起動するものの、機能しないという結果だった。Windows 7だからアウトなのか64bitだからアウトなのかは不明です。
うっわーこれほんと他人事と思えないんですけど!!! 僕が2期生として入り卒業した後で学科自体がなくなってしまった大阪電気通信大学メディア情報文化学科の出身としては、こう、なんというか、胸に詰まる物がある。
ただ、僕自身そこまで大学に期待はしてなかったというか、それまでWeb標準がらみのやりとりで、高校生の自分よりその技術の事を知らない大人というのが世の中にいるのか!という事にある意味でショックを受けて、大人に訊けば何でも分かるとか、大学に行きさえすれば何でも教えてもらえるとか、そういう期待はもうできなくなっていたと思うのですよね。
とはいうものの、まだ何を自分が生きていく上での道に選べばいいのかは漠然としていたので、文字通りの人生勉強というか、何かしらの雑学知識が身に着けばいいなというか、自分の知らない世界に触れるきっかけだけでも得られたらいいなというか、そういう事には期待して大学に行ってはいたと思う。会社で毎日PCに向かって仕事してる今では、自分からどんどん動いていかないと新しい物なんて全然目に入ってこないなあ、いざ興味を持って知ろうとしてもどこから取りかかればいいのかさっぱり分からないなあ、という事を時々感じる。それを思えば、いろんなトピックが取り揃えられてて、選んで履修すれば最初の方から順番に教えてもらえる(どこから取りかかればいいのか教えてもらえる)という環境はとても恵まれていたのだなあと、改めて思う。
何度か同じ事を語ってる気がするけど、大学って「めちゃめちゃレベルの高い所に行ってそこでしか教われない事を学ぶ」か「そんなにレベル高くない所に行ってサクッと卒業に必要な単位を取ってあとは無駄に教養を深めたり学外で実践して経験を積んだりする」かのどっちかのスタイルで接するのがいいんじゃないかと思うのですよ。どちらにせよ自分からアグレッシブに動く必要があって、ただイスにボーッと座って話聞いて試験受けてっていうサイクルに乗っかってるだけでは、その時間は果てしなく無駄だろう、と。そんなにレベルの高くない大学で、学内で教われる範囲だけで閉じてるっていうのが、一番駄目なパターンだと思う。
竹熊健太郎氏はこうおっしゃっている。 <style type='text/css'>.bbpBox38837663356289020 {background:url(http://a2.twimg.com/a/1297446951/images/themes/theme8/bg.gif) #8B542B;padding:20px;} p.bbpTweet{background:#fff;padding:10px 12px 10px 12px;margin:0;min-height:48px;color:#000;font-size:18px !important;line-height:22px;-moz-border-radius:5px;-webkit-border-radius:5px} p.bbpTweet span.metadata{display:block;width:100%;clear:both;margin-top:8px;padding-top:12px;height:40px;border-top:1px solid #fff;border-top:1px solid #e6e6e6} p.bbpTweet span.metadata span.author{line-height:19px} p.bbpTweet span.metadata span.author img{float:left;margin:0 7px 0 0px;width:38px;height:38px} p.bbpTweet a:hover{text-decoration:underline}p.bbpTweet span.timestamp{font-size:12px;display:block}</style>
美大系大学に教える立場でいると痛感するのだが、教育者として作家 志願者に教えられるものは「知識」と「技術(方法論)」の2つしかないということだ。それ以前に「どんな作品を創るか」までは教えようがない。最初に創りたい作品のビジョンがない人は、そういう学校に行くべきではない。
美大でなくてもどこの大学だってそうなんじゃないかと僕は思うんだけど、ビジョンまで持った状態で大学に入ってこれるのが(というかそういう目的意識を持ったから大学に入ろうと思って入るというシナリオが)理想なんだろう。でも僕も含めてほとんどの人は、18歳時点でそんなはっきり人生の目標なんて持ててないんじゃないのかなーって思う。漠然と「高卒じゃ仕事なんてないんじゃないの……?」みたいな不安を持ってて、それでとりあえず大卒っていう資格を取っておきたくて大学に行くんじゃないのかなあ。
ビジョンなんて後から見つければいいじゃん、やってるうちに「これ面白いなあ、これを突き詰めたいなあ」って思ったらそれがその人の道になるんじゃないのかな。というのが僕の考えなので、別にビジョン持ってないからって大学に行ったらあかんとか会社に入ったらあかんとかまでは思わないんですよね。まあ美大だと「おまえそんなヌルい事言っとんちゃうぞコラ!!! 才能ない奴は死んでまえ!!!」くらいのノリになっちゃうのが当たり前なのかもなんですけど。美大の入学式で「この中の99%の人は芽が出ずに消えていきます。ここは、その残り1%の人を見つけて磨き上げるための場所です。」という感じの、お前らのほとんどは捨て駒だ的な演説があったとか無かったとかいう話も、どっかで聞いたか読んだかした気がします。
ともかく、危険なのは「大学に行けば何でもある」って思っちゃう事なんだと思う。大学には何があるのか、っていう事だけじゃなくて、大学には何が無いのか、っていう事も、これから大学に進学しようかという年の子には教えてあげて欲しいものです。……まあ、本当にその事を理解しなければいけない、視野が狭い状態になってる人(過去の僕のような人)ほど、言われてもその言葉の意味などきっと理解できないのでしょうけれどもね。
自宅ではWindows Vistaで秀丸エディタを使っている僕は会社では主にUbuntuを使用していますが、viでもemacsでもなくgeditがメインのテキストエディタだったりします。という事を言うとワリと失笑されがちですが、geditそんなにわるくないよ!! むしろメモ帳(notepad)よりはずっといいよ!! タブの挙動とかはキモイけど!! シンタックスハイライトもあんまり賢くないけど!! あとShift_JISで「\」(半角バックスラッシュ)を含んだファイルを開くと勝手にUnicodeの円マークに変換しちゃうせいでそのまま保存するとJavaScriptの正規表現とかがぶっ壊れがちだけど!!
そんなgeditに対する不満の1つに、検索で正規表現を使えない、特に、正規表現による一括置換ができないという点が挙げられます。改行やタブをコピペして検索したり置換したりしようとした時には勝手に「\n」とか「\t」とかエスケープされて表示されますが、こういうのを自分で入力しても期待通りには認識されません。
んでまあずっと諦めていたのですが、改めて探してみたら、geditで正規表現検索できるようにするプラグインというのが世の中にはあったのですね。
以下、Ubuntu 10.10での導入手順。
置換先の入力欄の上で何か操作しないと、「Replace All」などのボタンが有効化されません。置換先の文字列を空にしたまま置換しようとすると(=マッチ箇所を削除する操作をしようとすると)「すべて置換」ボタンが有効にならないという風な事が起こるので、何か入力してそれをまた消す、という操作を必要に応じてやらなくてはなりません。という風に若干作りが甘いと思われる部分はあるものの、これでやっとgeditだけでもそれなりの事ができるようになったという事の方が嬉しくて、もうこれだけで満足してしまいがちな僕がいます。
あと「grepもできたらいいなあ」「でもってgrepでヒットしたファイルを一括置換したいなあ」とかも思って検索してみたら、grepだけならプラグインですぐにできる事も分かりました。
こちらで紹介されているGedit File Search PluginをRegex Search and Replaceと同じようにしてインストールして「編集」→「設定」→「プラグイン」で「File Search」にチェックを入れてgeditを再起動すると、「検索」メニューの「Find in files...」でgrepできるようになります。ヒット箇所をクリックするとその位置までスクロールした状態でファイルを開いてくれるので良いですね。さすがに「grepで置換」まではできませんが……
96桁目のセルに所定の値が入ったCSVを作る、みたいな事をやらなきゃいけなくなったんだけど、GnumericにしろExcelにしろカラム名が数字じゃなくてA, B, C, ... Z, AA, AB, ... ZZ, AAA, ...というヘンテコ表記になってるからどこのセルに値を入れればいいかわかんないよウワァァァァン!!!! となったのでJavaScriptで解決した。
var input = prompt('input number or column name');
if (!input) return;
var symbols = 'abcdefghijklmnopqrstuvwxyz';
var result;
if (/^[0-9]+$/.test(input)) {
input = parseInt(input);
result = [];
while (input > 0) {
result.unshift(symbols.charAt((input - 1) % symbols.length));
input = Math.floor((input - 1) / symbols.length);
}
result = result.join('').toUpperCase();
}
else {
result = 0;
input = input.toLowerCase().split('').reverse();
for (var i = 0, maxi = input.length; i < maxi; i++) {
result += (symbols.indexOf(input[i]) + 1) * Math.pow(symbols.length, i);
}
}
alert(result);
カラム名→カラム番号の計算方法は分かったけど、頭が悪い僕にはカラム番号→カラム名の計算式が分からなかったので、検索して出てきたエクセルの1000列目は ALL - つまみ食うのアルゴリズムを丸パクリした。阿呆ですんません……
なんでそこで詰まったかっていうと、単純な26進数の変換ではうまくいかなかったからなんですよね。A==0、B==1という感じで26進数として扱うと、26==Zで27==BAになるんだけど、実際は繰り上がった後はBAじゃなくてAAにならなきゃいけない。そこの所を考慮した計算を多分簡単なループで実現できるとは思ったんだけど、頭が働かなくて無理だった。