裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

Warning を無視するのもどうかなあ?

2012年03月25日 | ブログラミング

2012-03-23 時系列データを作ってみる」は,Warning がたくさん出る

無視して良い Warning と無視してはマズイ Warning があるのでは?

Warning が出るのは for ループ内の if 文の条件判定。

i >= 3 のときに問題が起こる

i = 3 のとき

> max(Vintervention[max(1,i-Vperiod-1):i-1]-Vt[max(1,i-Vperiod):i])>0
[1] FALSE
 警告メッセージ:
In Vintervention[max(1, i - Vperiod - 1):i - 1] - Vt[max(1, i -  :
   長いオブジェクトの長さが短いオブジェクトの長さの倍数になっていません

以下の長さが違うのが原因。長さが違うベクトルの差を取ろうとするのが原因。

> Vintervention[max(1,i-Vperiod-1):i-1]
[1] 0.2691888 0.0000000
> Vt[max(1,i-Vperiod):i]
[1] 43.65656 31.04691 40.19488

添え字が違う。

> max(1,i-Vperiod-1):i-1
[1] 0 1 2
> max(1,i-Vperiod):i
[1] 1 2 3

R の添え字は(C などと違い)1 からはじまるので,

> max(1,i-Vperiod-1):i-1
[1] 0 1 2

の有効な添え字は「2 つしかない」

プログラム作者は,それを認識しているのかなあ。

少なくとも,第三者がやってみたときに Warning が出たら,それでも正しい結果かも知れないが,不安に思うだろうなあ。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Sweave で sessionInfo

2012年03月21日 | ブログラミング

Rの文芸的プログラミングツールSweaveでsessionInfo()を出力するには」で
> そのまま出力したのでは文字化けしてしまうことがあるので、toLatex()を使ってサニタイズする。

として

<<>>=
toLatex(sessionInfo())
@

が挙げられている。どんなときに文字化けするのか思い浮かばないのだが,筆者のいうように toLatex を使ってしまうと,ちょっと困る(アンダースコアがなくなるとか,その他にもちょっとではあるが実際と違った情報が表示されてしまうので,困るなり)

下に示す例は,

<<>>=
sessionInfo()
<<results=tex>>=
toLatex(sessionInfo())
@

によるもの

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

literate programming

2012年03月06日 | ブログラミング

表題にある "literate programming" を「文芸的プログラミング」と訳した人がいる(それもたくさん。無批判に,雪崩的に?なんで?)。

私は,それには非常な違和感を感じる。

ランダムハウス英和大辞典では,literate
 1. 読み書きができる  これでないのはあきらか
 2. 文学の造詣が深い,文学に通じた  これでもない
 3. (著作・文体・話などが)巧みな,洗練された,明晰な
 4. (特定の分野について)知識[技能]がある,通じている  これでもない
 5. 学問がある   これでもない

literate にはそもそも「文芸的な」という意味はない。そもそも,日本語にだって「文芸」はあっても,「文芸的(な)」というのは辞書の見出しにはない(芥川龍之介の論文題名にはあるが)。文芸は英語で,literature; literary art; liberal arts; arts and literature のようだ。しいて文芸のという形容詞は literaryだから,文芸作品は a literary work。よって 文芸プログラムは a literary program か。でも,文芸プログラムと,文芸的プログラミングは違うのだろうなあ。文芸的プログラミングで作られるものが文芸プログラムか。

では,literate programming での literate はなにか? 上に上げた中では,「明晰な」のほうであろう。洗練されていれば明晰で,誰にも分かるプログラムは巧みに作られている。つまり,ここで語られるプログラミングはなにも(修辞に長けた)文芸的なプログラムではなく,読みやすく・わかりやすいプログラムのことだろう。プログラムに文芸的要素などはないし,不要である。

これに関する概念は,古くはクヌースの art of programming("The Art of Computer Programming" by Donald E. Knuth)の頃からいわれている,誰もが読みやすいプログラムのしかたのことだろう。ここの art も「芸術」そのものではなく,「芸術品ともいえる素晴らしいプログラム」という意味で使われている。

なお,中国語では,「文学编程」とか「文学化编程」表記されているようだ。文芸と文学もニュアンスがだいぶ違う。

literate programming の用例を見てみれば,「文芸的プログラミング」があまりよい訳語でないのは分かるだろう。

Sweave User Manual の中に出てくる例

noweb (Ramsey, 1998) is a simple literate-programming tool which allows combining program source code and the corresponding documentation into a single le.

Noweb (Ramsey, 1998) は簡単な文芸的プログラミング用ツールであり、プログラムのソースコードと、対応するドキュメントを結びつけて、一つのファイルにすることを可能にする。

その他(訳文は付けないが)

One idea of literate programming is to replace these tokens(to enhance readability.

 

最初に「文芸的プログラミング」という言葉に行き当たってからずいぶん経ち,それまでにも何度か意見をまとめようと思ったこともあるが,長いものには巻かれろと見過ごしてきた。今回これを書くに当たって検索してみたところ,やはり文芸的プログラミングに違和感を感じるという人もいるようだ。

http://tnomura9.exblog.jp/15066377/ 「読み書きのできるという意味の方ではないか思う。...暗号ではなくて普通に文章として読んでいけるプログラムのことだ。要するにコメントの分量が圧倒的にソースより多いプログラムである。」と書いている

http://d.hatena.ne.jp/yomoyomo/20060306/literate 「ワタシは岩谷宏は嫌いなのだけど、彼が書くように Literate Programming は文芸的プログラミングよりも文書型プログラミングのほうが適切な訳じゃないだろうか。今更だけど。」さらに「Wikipedia には文芸的プログラミングのページがあるが、Literate programming の日本語版の位置づけになってないみたいなのはなぜだろう。」とあり,含蓄がある。あの当時,コンピュータ関連の用語をやたらと「和風用語」に訳す(プログラムを算譜,プログラミングを作譜,アルゴリズムを算法など)コンピュータ科学者がたくさんいたなあ。

http://www.graco.c.u-tokyo.ac.jp/~tamai/pub/hitachi0501.pdf 「ここでいう literate は「人が読める」というほどの意味ではなかろうか. もちろんそれには,人が読んで楽しめる,鑑賞できる,というニュアンスが含まれているから,「文芸的」というのもあながちおかしくはないかも知れない.」と書いている

http://eto.com/works/8.html 「文芸的プログラミングは全然文芸的ではない。 Literate Programming is not literary at all.」と書いている

http://ronspace.cocolog-nifty.com/blog/2006/09/jmock_1a34.html 「Javaのユニットテストを書く際、jMock を使うと、より「文芸的」でコードが読みやすくなるよ("the code more literate")、という記事のようですが。
We can use constraints to construct more flexible assertions.
    assertThat(a, eq("3"));
is more readable and understandable than
    assertEquals("3", a); ということで,完全に literate == readable になっている

http://return0.dyndns.org/log/2009/07/ 「 "literate programming" が「文芸的プログラミング」になるのは違和感があるというか訳しすぎというか、これまた変といえる(これはときどきの雑記帖の中の人は前から問題意識を持っていた)。で、同じように "literate" を Oxford Practical English Dictionary で調べると

  1. able to read and write
  2. well-educated

とある。これが「文芸」になるのは literacy という言葉との整合性を考えてもおかしい。

なので俺はいっそのこと "literate programming" は「教養あるプログラミング」としてしまい、プログラミングやソフトウェア開発の文脈では "art" は学問としてしまった方が、今までのように「文芸」「芸術」などとするよりはナンボかマシだと思う。

追記:「art は技芸とする例もある」との意見をもらった。なんかそっちの方が良さそう。」そう思う人が多いよね。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

for ループが遅いなんて,誰が言った? その4 -- 結語

2012年03月03日 | ブログラミング

シミュレーションなどで,何百万回も使う関数なら,速くすべし。

一般に供する関数なら速くすべし(全世界でその関数が使われる回数を考えればよい)。

そうでないなら,適当に作ればよい。最近の計算環境は,プログラムのヘタさ加減は吸収してくれる。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村