トップ 最新 追記

日々の破片

著作一覧

2011-09-04

_ 能楽堂1.1

能楽堂1.1

-Rails 3.1.0にしてみた。(どうせ、3.0.9を3.0.10に(脆弱性理由の更新だから)上げるなら、一気に3.1にしてみようかなと思ったが、早くも後悔している(このへん)から、すぐに引っ込めるかも)

- Ennou 1.1.0 仮想ホストをサポートした。rackup -s Ennou(mu) -o virtual.host.name で、起動する。この場合、SCRIPT_NAMEは空文字列となり、Railsの普通の動作となる。(ルートがアプリケーションとなるため、config/application.rbでasset_pathを変えた場合は削除が必要です)

- Windows Server (Emacsを入れていない)で使えるエディターがNotepadだけなので、頭に来て editable.batというのを仕込んだ。「editable ディレクトリ名」で拡張子がないか、ymlか、rbか、ruかそのあたりの改行を正しく(WindowsというかCP/Mというかみんなが大好きなRFCのネットワーク端末仕様に対して)直すようにした。


2011-09-05

_ RubyとC#

以下は最後に0が表示される。されなければバグ。
threads = []
counter = 0
threads << Thread.new do
  1.upto(100) do
    counter += 1
    Thread.pass if rand(3) == 1
  end
end
threads << Thread.new do
  1.upto(100) do 
    counter -= 1
    Thread.pass if rand(3) == 1
  end
end
threads.each(&:join)
p counter

しかし次のは0が表示されるとは限らない。バグはコードにある。

using System;
using System.Linq;
using System.Threading;
public class Th
{
    static void Main()
    {
        var counter = 0;
        var threads = new Action[] {
            () => { 
                var pause = new Random();
                for (var i = 0; i < 100; i++)
                {
                    ++counter; 
                    if (pause.Next(3) == 1) Thread.Sleep(0);
                }
            },
            () => { 
                var pause = new Random();
                for (var i = 0; i < 100; i++)
                {
                    --counter; 
                    if (pause.Next(3) == 1) Thread.Sleep(0);
                }
            },
        };
        foreach (var r in threads.Select((a) => { return a.BeginInvoke((result) => { a.EndInvoke(result); }, null); }).Reverse())
        {
            r.AsyncWaitHandle.WaitOne();
        }
        Console.WriteLine(counter.ToString());
    }
}

で、それは良いのだが、多分、Reverseがあると無いとで結果が変わるだろうなぁというのは正しい?


2011-09-06

_ Ruby 1.9.3

[ruby-list:48344]を読んでいて、ほおそうか、と試してみたら普通に動く。
irb(main):001:0> a = '日本語'
=> "日本語"
irb(main):002:0> a.encoding
=> #<Encoding:Windows-31J>
irb(main):003:0> RUBY_VERSION
=> "1.9.3"
これって1.9.3だからかな? それともファイルを読み込んだとき(でも、それなら'r:windows-31j'とか指定できるから違うか)とかのことなのかな。
本日のツッコミ(全1件) [ツッコミを入れる]

_ ムムリク [1.9.2でもいけました。]


2011-09-11

_ Inspiron 13zその後

普通に使い始めると、キーボードはそれなりに打ちやすいし、SSDのおかげでVS2010とか瞬時に起動するし、相当満足しているんだけど、ふと気づいたことがある。

プレゼンに使おうとすると、アナログ出力がないってことだ。

あるのは、HDMIだけ。

これ、相当にきつい感じがする。

というわけで、HDMIからVGAに変換するアダプタを探すが、そもそもDAコンバータが必要だという時点で、なんかえらい価格になるし、どうも、デジタル出力をアナログ変換する=コピー10の無制限利用みたいな用途扱いになるのか、製品そのものが見つからない。

で、いろいろ探すと、USBからVGAを引っ張り出すアダプタが売られていることに気付く。これなら、使えそうな気がしないでもない。気がしないでもないが、どうもいまいちわからない。

I-O DATA マルチ画面 USBグラフィック アナログRGB対応 WXGA+/SXGA対応 USB2.0接続 USB-RGB2(-)

やりたいことは、パワポの表示だから、多分問題なく使えるとは思うけど(そのために5000円超えは痛い気もするけど)、さてどんなもんなのだろうか?


2011-09-12

_ 能楽堂1.1.1

前回、リリースに近いことした能楽堂1.1.0に、マルチプロセスサーバとして実行すると、いきなりSEGVするとんでもないバグがあったので修正しました。

NougakuDo.msi

MD5チェックサム:0e159b18dd269e08056bf8a00db86fce

試された方、済みませんでした。


2011-09-15

_ 動的、静的

ただ、勘違いする人がいるわけだが、
for (int i = 0; i < 9999999999999999999; i++) {
と書くとコンパイルエラーになるから、
for (long i = 0; i < 9999999999999999999; i++) {
と書いてみたのは良いが、ある日を境に、<の右項が10の30乗になって、しょうがないから、BigDecimalにしたら++が使えなくなって、というようなしょうもない制約は、まったくもってよろしくない。
というのは、彼らの好きなお題目、コンパイラによってチェックがなされるからというやつが、コンパイラによって書き方を制限される/制約されるというネガティブな方向にしか働いていないからだ。
そんなどうでも良いところに制約があることはむしろ恥ずべきことだということを意識すべきだろう。
本日のツッコミ(全2件) [ツッコミを入れる]

_ きしだ [BigDecimalで+が使えないとか、Listで[]が使えないとか、どうにかしてほしいですねぇ。]

_ arton [Listの[]は欲しいですね。というか、List<a> list = new List<a>();とか、さっさとC#..]


2011-09-16

_ JavaScriptが難しいのではなくIEが難しくしてくれている

IE9で開発していて、次のように書いた。

var keywords = ['ab', 'cd', 'ef', ];
for (var i = 0; i < keywords.length; i++) {
  obj[keywords[i]] = getValue(keywords[i]);
}

で、動いたもので実環境へ持っていく。そこではIE8が動いていた。

ら、死ぬ。

不思議に思っていろいろ動かしてみたら、IE8では、[1,2,3,]は4要素(length == 4)、IE9では3要素(length == 3)ちなみにChromeも3要素ということがわかった。

はて、どちらが正しいのか。順当にはバージョンが新しいIE9が正しそうだ。かつ、そちらのほうが直観に近い。直観というよりも、JavaやCの印象からだけど。

int[] array = {
  1,
  2,   // 後で末尾に要素を追加したときに楽ちん
};

そこで、ECMAの仕様を読むと、難しい。

the missing array element contributes to the length of the Array and increases the index of subsequent elements.

IE8が正しい?

If an element is elided at the end of an array, that element does not contribute to the length of the Array.

いや、IE8がバグだ。

追記:@matarilloさんがツッコミを入れているけど、古い仕様書探すのってめんどうだからいやなんだけどな。Arrayなんて基本的なオブジェクトの仕様が変わるってことも考えられないし。

が、しょうがないので、第3版を見てみる。

, the missing array element contributes to the length of the Array and increases the index of subsequent elements. Elided array elements are not defined.

OK。わかったよ。最後の要素については何も書いてない。であれば、省略した要素は要素数に数えられるわけだからIE8が正しい。

試しにVirtual PCに確保しているXPの古いマシンを動かして、javascript:alert([1,2,3,].length);をIE6のアドレスバーに入れてみる。確かに4って表示されるじゃん。そうだったのか。これは、ECMAScript5の仕様策定が難航するはずだよ。過去の互換性を切り捨てる羽目になったのが過去の互換性を保つことで成功してきた企業なんだからなぁ。

さらに追記:でも待てよ。

Array elements may be elided at the beginning, middle or end of the element list. Whenever a comma in the element list is not preceded by an AssignmentExpression (i.e., a comma at the beginning or after another comma), the missing array element contributes to the length of the Array and increases the index of subsequent elements. Elided array elements are not defined.

最初からちゃんと読むと、「配列要素は要素リストの最初、中間、最後で省略できる。要素リスト内のコンマが値設定式に先行されない場合、省略された配列要素は要素数に組み込まれ、後続の要素のインデックスは増加する。省略した要素は未定義とする。」となる。

最後で省略できるとあるから、[1,]という書き方はOKだ。だが、the missing array elementの要件であるnot preceded by an AssignementExpressionを満たしていない。したがって、[1,]というのは、後半のthe missing array element contributes to the ... が有効にならない(というのはnot preceded by an AssignmentExpressionを満たしていない)ので、結果、要素数は1が正しいのではなかろうか。というか、正しいとおれには読める。第5版はわかりやすく最終カンマの解釈にぶれがないように明記したというだけだ。

[,]であれば、要素数は1。[1,]も要素数は1。[,2]は要素数は2。

というわけで、少なくともおれの読解では1999年以来、IEのJavaScript実装はバグだということになる。で、IE9でやっとインターネット標準に軌道修正したということだ。

というような面倒なことがあると、おれが持っているのはえらく古い(多分初版か2版)から、買い直しとこうかなとか思わなくもない。

JavaScript 第5版(David Flanagan)

2011-09-18

_ これは良いプログラミング入門

20歳を過ぎてからプログラミングを学ぼうと決めた人達へ

三つ子の魂百までというから、最初に覚えたものは強くその人の価値判断に影響するのだろう。ことわざレベルの知見はほぼ正しいはずだ(でなければことわざとして生き延びるはずがない)。

nowokay曰く処理はifとforですべて書けるが、もちろん再帰とifでもすべて書ける。

でも、実はそんなところに問題はないんだよなぁと気付いてしまった。

リアルワールドの話だ。

要件を語る人、それを仕様に落とす人が、手続的に書くからだろ(自然言語で記述すると手続きのほうが遥かに書きやすい、あるいはそういう読み書きの訓練を受けているので理解しやすい)。

で、その仕様書を実装にマップするには手続型プログラミングモデルのほうが向いているわけじゃん。

というわけで、これはジャンルが違うからだというのが結論となるか、または、リアルワールド側が一段以上メタな階段を上がるか、どっちかだろうなぁと思う。(が、最初のところの知らないやつは知らないままというのはいい話だ)


2011-09-19

_ 能楽堂 1.1.2

MD5: 900de54414e9df2491df492dc27539df

NougakuDo.msi

・ローンチャで仮想ホスト名を設定/保存できるように修正。

・仮想ホスト名が正しくワーカサーバ群に渡っていなかったのを修正。

・editable.batで、すべてのファイルはutf-8でエンコードされているものとみなすように修正。

・オフライン開発ができるように、bundleが最初に取ってくるらしきgemもすべてインストールしておいた。というか、開発PCがなんでもインターネットにつながっているという発想自体がエンタープライズを考えていない証拠だよなぁ。

editableは、Windowsなんだからconfig.ruとかはメモ帳で直せるのが当然だろうという思想を反映したツールで、テキストはなんでもCRLFに修正してやるという便利なバッチファイル。


2011-09-23

_ ジャックロジェって誰?

アマゾンへ行くと、ジャックロジェの作品集を買えと勧められる。

ジャック・ロジエ DVD-BOX(ベルナール・メネズ)

誰だ、それ? と思う。作品の名前を見ても見当がつかない。

検索すると、日本のウィキペディアが引っ掛かるのでそこを読む。ジャックロジェ

アディーフィリッピーヌはそれは素敵な映画だったが、作家の名前はまったく忘れていた。

しかも驚くことに、われらの時代のシネアストたちで、あの素晴らしいジャンヴィゴの回を撮ったのか。それはまったく知らなかった。知らなかったが、冒頭、二人で船へ歩いていくシーンの長い引用は忘れられない。

アタラント号 [DVD](ミシェル・シモン)

しかも、ブニュエルの回も撮っていた。羊。サドゥール。

もしかしたら、捏造記憶かも知れないが、サドゥールがブニュエル映画の深淵について語る。切り替えてブニュエルが語る。金がないからああなった。切り替えてサドゥールが深遠な読みを語る。切り替えてブニュエルが語る。なんとなくおもしろそうだからああ撮ったんだ。切り替えてサドゥールが懊悩しながらブニュエルの哲学性を語る。切り替えてブニュエルが下品なバカ話を始める。

そんな感じだったような。


2011-09-24

_ TDD、リファクタリング、フレームワーク

ちょっとした案件があって8本ほど、アプリケーションを作ったのだが、仕様は単純、内容は明白だったので(あと、ユーザインタラクション系だというのもあるけど)、ついTDDせずに1本作った(別に強力なテストチームがいるからお任せモードというのもあるが、もちろんTDDのテストとは異なるから言い訳っぽい)。で、また一本、そして一本。

3本作って、それらすべてに共通する構造があれば、フレームワークが作れる

というわけで、簡単なフレームワーク――というよりもテンプレートメソッドパターン(ファクトリメソッドパターンを含む)を実装クラス(十分に小さなやつなのでファクトリクラスを兼ねる)と、そいつを回すストラテジパターン――を実装し、4本目からそれを使うようにした。当然のようにあっというまに8本できる。

そこでしまったと気付く。

最初の3本が浮いている。が、既に動き出しているので変える気がまったく起きない。

結局、3本目と4本目の間に(本来の実装を伴わないという意味で)仮想的なリファクタリングを行ったことになるが、ある意味無駄なことをした。

本来であれば、ユニットテストがあって、それを適用しながら3本をリファクタリングすることでフレームワークを得て、それに残りを適用すべきだったのだ。

というわけで、つくづくユニットテストを作りながら実装すべきであるなぁと思った。

本日のツッコミ(全1件) [ツッコミを入れる]

_ tkaot [なんという超同感。]


2011-09-25

_ Ruby-1.9.3-rc1

9/24に、Yuguiさんからruby-dev:44540でruby 1.9.3ブランチが固定されたことが告知されました。関係各位のご尽力に感謝します。

というわけで、Win32(x86版)ruby-1.9.3-RC1インストールパッケージをリリースします。

Ruby-1.9.3.msi

MD5: ded2b00a34f326c32e547b4ff3a20fab

・DXRuby、algebra、VRuby、Rjbなどをvendor_rubyに配置してあります。

・失敗していなければ、Ruby-1.9.2やRuby-1.8.7のパッケージと共存できます。使い分けは、スタートメニューの各バージョンのフォルダによります。Rubyを動かすには、Ruby consoleを選択してください。なお、Gemを直接インストールする(program filesへの書き込みを伴う)場合は、Ruby console (Administrator)を選択してください。


2011-09-26

_ tiny_tds(というかrake db:create)にはまる

能楽堂の環境整備をしていて rake db:create がデータベースを作らないことに気づいた。

確かに、SQL Serverに対してtiny_tds経由のsqlserver_adapterを使うと rake db:create でデータベースができないことは気づいていたのだが、SQL Expressについては作れるつもりになっていた。

が、作れない。

何が起きているのか、調べようとすると、これが厄介だった。

まず、logディレクトリに何も吐かれない。

どうもRakeが食ってしまうみたいだ。

rake -d .. と打ち込むと、-dなんて知らないと文句をたれてアボートする。頼むから、それをRubyに与えてやってくれと思うが(rake.batを修正するという手はあるけど)、rakeにそういうことを望むのは高望みというやつだろう。

で、rake --help すると山ほどオプションは出てくるのだが、どれも役に立たない。-X は警告のサプレスをやめると書いてあるが、付けようが付けまいが変化しない。-vはverboseだというがどこがverboseなんだ? というわけで役に立たない。結局、アンドキュメンテッドな -w で例外のメッセージ(btはなし)が出力されることはわかった。

で、エラーになっているのが、active_recordのdatabases.rake だというのはつかめた。早速、printf(Rubyだからpだけど)入れまくるが、出てこないのだが、これが。

どうも、ある時点から標準入出力とエラーを置き換えているみたいだ。それもNUL:へ。

が、irbで実行するとちゃんと出力されることを見つけた。

irb
ARGV[0] = 'db:create'
require 'rake'
Rake.application.run

とすると、すべてのprintfが出力される。

で、結局、sqlserver_adapterが、connectする時点で、database.ymlに書いてあるdatabaseをuseさせようとしてtiny_tdsでエラーになっているとわかった。そりゃ、これから作ろうとしているのだから、存在するはずがない。

で、しょうがないので、とりあえずtiny_tdsからデータベースに関するエラーが来たら、masterをuseするようなパッチを作った。で、テストしたらパッチを投げる。

が、テストすると、今度はデータベースの重複エラーとなる。はて?

で、さらに追っかけると、今度はdatabases.rakeの中で、mysqlとsqliteとpostgresqlだけを特別扱いにしていて、それ以外については単にestablish_cconnectionとconnectionを呼んでいるだけとわかる。存在しないデータベースを接続パラメータとして与えるということから、特殊ロジックが必要だということなのだろう。で、その場合はなんでもかんでも「既に存在している」というリテラルを出力しているのだ。なんといい加減な。(あと、Rakeのdbタスクが非常に気に食わないのが、adapterのloggerアトリビュートを設定しないことだ。何気なくログを書いていたらナルポになって驚いた(ということはなくて、irbを使わないとエラーが表面に出てこないから何が起きているのかわからなくて閉口した。でirbを使うことになるのだが)。

ならば、しょうがないので手作りrakeすることにした。

で作っていて、以前も作ったことがあることに気づく。

かんたんRuby on RailsでWebアプリケーション開発(arton)

これだ。で、本棚から取り出して読み返したりして。これ書いたときは、db:createなんて存在しなかったから、mysql用にrakeタスクの書き方の説明を兼ねて示したのだった。このときはほとんど何も無かったので、アダプタに対して構成情報を自力で与えたりしていた。

で、今は回りが充実しているのでもう少しシンプルに書ける。

namespace :db do
  task :create_db => :load_config do
    exec_from_master :create_database
  end
  task :drop_db => :load_config do
    exec_from_master :drop_database
  end
  def exec_from_master(cmd)
    ActiveRecord::Base.configurations.each_value do |config|
      target = config['database']
      config['database'] = 'master'
      ActiveRecord::Base.establish_connection(config)
      ActiveRecord::Base.connection.__send__(cmd, target)
    end
  end
end

これをlib/tasks に入れれば良い。


2011-09-28

_ 紙の本はどこへ行くのかな

喫茶店でモーニング読んでたら古本屋のマンガがあって、何気なく読んでいたらうかつにも死にそうになった。そりゃおれは読書人だから本は好きだ。良い点をついてくるマンガだな。

が、紙の本にこだわるのはあまり意味がない。

以前、100ドルPCを途上国で配布するという話があったときにも考えたが、そもそも紙の本が流通できるというのは奇跡的な話だ。

紙は火にも水にも弱い。しかも重い。

日本の場合は、江戸時代あたりから出版が成立していたけれど、火に弱くて水に弱い(日本は湿気が多いし)はともかく、重いに関しては水運が発達していたからどうにかなった側面はあるだろう。

が、想像してみるアフリカ。キンシャサとかの都会はともかくとして、数10キロ単位からへたすれば数100キロ単位でサバンナやら砂漠やらをまたがって点在している部族の集落にどうすれば、紙の本を配布できるのだろうか? どう考えたって、学校と教科書という組み合わせ自体に無理がある。トラック? 本よりまず生活資材の運搬で精いっぱいなんじゃないか? であれば、100ドルPCに対して衛星から教科書をダウンロードさせるほうが遥かに合理的だ(発電は手回しとか自転車とか+バッテリという前提なわけだし)。同じ入れ物に年毎とか学期毎に異なるコンテンツをロードして繰り返し使う。なんと合理的なことだろう。

つまるところ、紙の本というのは非常に贅沢な代物で、

・炎に対して安全なかつ湿気に対してそれなりに安全な保管場所が確保でき、

・文化を輸送できる程度に輸送機関が発達していて、

・その場で配布することで収益を得られるだけの人口が存在し(本屋があり得る最低条件)

とかが必要なのだ。おまけに40代越えて老眼になると途端に読めなくなるとか、肉体的に致命的な悪条件まである(紙に印刷したら拡大とか自由にできないしね)。

竹簡から巻物になり冊子になる。

重要なのは文章で伝えるべき何かであって、つまり、リソースが重要なのであって、リプレゼンテーションが洞窟の壁なのか竹なのか巻紙なのか冊子なのかはどうでも良いことだ。

---追記

このマンガらしい(terazzoさん多謝)

草子ブックガイド(1) (モーニング KC)(玉川 重機)

(最新刊をきちんと置く喫茶店じゃないので、僕が読んだのは古い可能性が高い。ちなみに老人と海のやつ)

老人と海 (新潮文庫)(ヘミングウェイ)

(待てよ、連載ってことは、このマンガは読書感想文マンガなのか?)

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

_ arton [まあそうも言えるな、と途中まで読んでたけど、残念、電気(明かりの意味で)は要るよね。多分、コンピュータは上の物理メデ..]

_ arton [というわけで、どこまで薄くできるか丸められるかにかかってくるけど(腕に巻いて持ち運ぶのが理想)、とりあえずiPadが..]

_ ishisaka [まぁアラン・ケイのDynabookははじめからシャワーの中でも使えることが前提ですしね。]


2011-09-30

_ 能楽堂1.1.4

1.1にしてから、仮想ホストはうまく動くがディレクトリ付きでは動かなくなっていて、これはRailsを3.0から3.1に変えたからだろうと信じ込んでいた。が、時間が取れてよくよく見てみると、何かおかしい。Rackインターフェイスの環境変数のSCRIPT_NAMEの設定にバグがある(演能側に)としか見えない。というか、バグでした。お騒がせして済みませんでした。

能楽堂1.1.4

あと、Ruby-1.9.3がpreview1のままだったのをRC1に更新、sass-rails(gem)を3.1.2から3.1.3へ更新しています。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|

ジェズイットを見習え