ときどきの雑記帖 めぐりあい電脳空間編

最新ページへのリンク
目次ページへのリンク

一つ前へ 2010年12月(下旬)
一つ後へ 2011年1月(中旬)

ホームへ

2011年01月10日

■_

Togetter - 「新春座談会 このコンピュータ書がすごい! 2011年版(ジュンク堂書店池袋本店 トークセッション 2011年1月8日)」 何か書いておこうと思ったらメモが行方不明だ。 当ランキングのレギュレーションについて - 『このコンピュータ書がすごい! 2011年版』最新情報 - compbookグループ えーと、前年までと比較すると言語そのものの入門書がほとんどなかった ような印象があったのですが、これはあってるのかな? 少なくとも2009年版では、4月5月辺りに C や Java の入門書がランク入りしてたような 覚えがあるのですが(あんま自信ない)。

■_ おやくそく

期待してる人がいるみたいなのでw

C言語なら俺に聞け(入門編)Part 76

139 デフォルトの名無しさん [sage] 2011/01/10(月) 00:31:54 ID: Be: 
 配列だけは例外で、C言語は値渡ししか出来ない思った。ポインタも値渡しになってしまう。 
 なんとか回避するためにポインタのポインタという技が開発される。

「配列だけは例外で」とあるから、配列は値渡しされない==参照渡しされる と言いたいのだろうけど、C じゃ配列も call by value で渡されるのねん (配列の先頭アドレスが、って付け加えたほうがいいのかな?)。

■_ おやくそく その2

Ruby 初心者スレッド Part 40 

529 デフォルトの名無しさん [sage] 2011/01/10(月) 09:50:44 ID: Be: 
 Rubyでは関数に引数を渡すと、参照渡しになるのでしょうか。 
 たとえば関数の引数に配列を渡し、関数内でその配列を操作すると、もとの配列が変更されてしまいます。 
 
 def f(arg) 
  arg << "x" 
 end 
 arr = ["a", "b"] 
 f(arr) 
 p arr #=> ["a", "b", "x"] 
 
 これがPHPなら、argを変更してもarrは変更されないのですが、Rubyは違うようです。 
 つまり、Rubyは参照渡しだということなんだと思いますが、あってますでしょうか。 
 
530 デフォルトの名無しさん [sage] 2011/01/10(月) 10:08:38 ID: Be: 
 >>528 
 require "rubygems" 
 require "babosa" 
 p " ".to_slug.approximate_ascii.to_s #=> "aeiou" 
 
 でよくね? 
 
531 デフォルトの名無しさん [sage] 2011/01/10(月) 10:10:49 ID: Be: 
 >>529 
 あってる 
 
532 デフォルトの名無しさん [] 2011/01/10(月) 10:13:29 ID: Be: 
 >>530 
 
 babosaってなんじゃらほい、と思ってググったが、URLのslugを作るライブラリか。 
 
533 デフォルトの名無しさん [sage] 2011/01/10(月) 10:40:05 ID: Be: 
 すらぐってなんすかね 
 
 …はあ、ページが提案する(またはページタイトル等から生成される)、 
 動的または投稿で作られたページの固定URLを表現する際に使ってもよい文字列 
 このスレをミラーするページのURLがttp://example.com/2chview/Ruby-Part-40になるみたいなもんか 
 
 アスキー文字っぽいものはURLとして読みやすいアスキー文字に揃えてしまうという機能がついてるのね 
 
534 デフォルトの名無しさん [sage] 2011/01/10(月) 10:47:27 ID: Be: 
 >>529 
 実のところ「参照渡し」ではない 
 参照渡しだとして理解すると本当は危険 
 というか参照渡しとはなんぞやという面倒な話に 
 
535 デフォルトの名無しさん [sage] 2011/01/10(月) 10:49:50 ID: Be: 
 「オブジェクトそのものを渡しているわけではありません」という慎重な表現が 
 
536 デフォルトの名無しさん [sage] 2011/01/10(月) 10:53:52 ID: Be: 
 >>529 
 Rubyに関数は(ry 
 
 
 irb(main):001:0> def f(arg) 
 irb(main):002:1> arg = [0, 1, 2, 3] 
 irb(main):003:1> end 
 => nil 
 irb(main):004:0> ary = [4, 5, 6, 7] 
 => [4, 5, 6, 7] 
 irb(main):005:0> f(ary) 
 => [0, 1, 2, 3] 
 irb(main):006:0> ary 
 => [4, 5, 6, 7] 
 
 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1534 
 >rubyには値渡ししかなく引き数として与えられた変 
 >数の値を変えても元の式の値は変わりません.ただし,オブジェク 
 >トの参照が渡るので値に対して破壊的な操作は可能です. 
 
 Rubyの変数は「ラベル」として考えるもので、メソッドの引数は「ラベルの値渡し」をしている。
 「オブジェクトの値渡し」ではなく。 
 とりあえずググればいろいろ出てくるよ。

549 デフォルトの名無しさん [sage] 2011/01/11(火) 00:00:25 ID: Be:
    Rubyの引数は値渡しだという話題これで何度目だよw

    >>529
    参照渡しにはならないよ。値渡しだよ。あえていうなら「参照の」値渡しだよ。

    そもそもPHPもデフォルトはメソッドの引数も値渡しのようだが
    PHP: 関数の引数 - Manual - http://php.net/ http://php.net/manual/ja/functions.arguments.php

    代入の話かと思ったが代入演算子もオブジェクトの場合は参照がコピーされるようだぞ
    PHP: 代入演算子 - Manual - http://www.php.net/ http://www.php.net/manual/ja/language.operators.assignment.php

    >>531
    まーたデタラメを広めるなw 

550 デフォルトの名無しさん [sage] 2011/01/11(火) 00:01:23 ID: Be:
    URLコピペミスした。気にしないで。 

551 デフォルトの名無しさん [sage] 2011/01/11(火) 00:31:00 ID: Be:
    >>549
    初心者スレだからしょうがない面はあるだろ

    >>531はなにゆえ断言したのか… 

とりあえず最近はム板でのこの種の議論には参加してません :)

■_ Perl 6

演算子たくさんあるね。と。

Perl 6 Operator Tablet / Perl 6
 
joined comparison 
 
 3 < $a == $a < 7 
 
 
is not the same as 
 
 3 < $a < 7 
 
 
because latter is evaled at once and the first in 2 steps (left to right) 
flipflop 
 
 ff fff 
 
 
Combinators 
 
 X 
 
 
Triangle 
 
 [\ ] 
 
 

見覚えがないというか使い方の良くわからないのがあるなあ(^^; flipflop はたぶん (Perl 5での) .. とか ... なんだろうけど、 コンビネーター演算子とかトライアングル演算子ってなんだろう。 んで、 3 < $a == $a < 7 こういう連結もできたのね。

■_

MS-DOS (Windows) でZドライブの次のドライブレターは?なんて話題が昔あったような記憶が。

How are Linux drives named beyond drive 26 (/dev/sdz, ..)? | Richard WM Jones

How are Linux drives named beyond drive 26 (/dev/sdz, ..)? 
 
It's surprisingly hard to find a definitive answer to the question of what happens 
with Linux block device names when you get past drive 26 (ie. counting from one, the 
first disk is /dev/sda and the 26th disk is /dev/sdz, what comes next?) I need to find 
out because libguestfs is currently limited to 25 disks, and this really needs to be 
fixed. 
 
Anyhow, looking at the code we can see that it depends on which driver is in use. 
 
For virtio-blk (/dev/vd*) the answer is: 
Drive # — Name 
1 vda 
26 vdz 
27 vdaa 
28 vdab 
52 vdaz 
53 vdba 
54 vdbb 
702 vdzz 
703 vdaaa 
704 vdaab 
18304 vdzzz 
 
Beyond 18304 drives the virtio-blk code would fail, but that's not currently an issue. 

18304個を超えるドライブの virtio-blk コードは失敗しますが
それはここでは重要ではありません。

For SATA and SCSI drives under a modern Linux kernel, the same as above applies except 
that the code to derive names works properly beyond sdzzz up to (in theory) sd followed
by 29 z's! [Edit: or maybe not?] 

modern Linux カーネルの下でのSATAおよびSCSIドライブは上記の規則が適用されますが、
sdzzz を超えても適切に命名するコードである点が異なっています
(理論的にはsdのあとにzが29個続くまで!)。

As you can see virtio and SCSI/SATA don't use common code to name disks. In fact 
there are also many other block devices in the kernel, all using their own naming 
scheme. Most of these use numbers instead of letters: eg: /dev/loop0, /dev/ram0, 
/dev/mmcblk0 and so on. 

見ての通り、virtio と SCSI/SATA はディスクの命名に common code を使っていません。
カーネルにはほかにも多くのブロックデバイスがあって、それぞれが固有の命名規則
(naming scheme) を使っています。ブロックデバイスの多くは文字の代わりに数字を
使って /dev/loop0, /dev/ram0, /dev/mmcblk0 のような名前を使用します。


If disks are partitioned, then the partitions are named by adding the partition number 
on the end (counting from 1). But if the drive name already ends with a number then a 
letter p is added between the drive name and the partition number, thus: 
/dev/mmcblk0p1. 

ディスクが分割されていた場合、そのパーティションは末尾に1から数え始める
パーティション番号を付加して命名されます。
ただし、ドライブ名の末尾にすでに数字がついていた場合には
そのドライブ名とパーティション番号の間にp を挿入して
/dev/mmcblk0p1 のようにします。


z→aa→zz→aaa→zzz とかどこのExcel ですかいw (たしか 2010 でもzzz までは使えないはずだけど)

■_ 痛点

InfoQ から。

InfoQ: JavascriptVMに多数の言語: CoffeeScript 1.0, StratifiedJS, EmscriptenによるC/C++, Python

Javascript VMは、今やどこにでもあり、増々速くなっている-この二つの特質は、言語設計者
と実装者が好きなものである。JVMや.NETをターゲットにした言語には、非常に面白いものがあ
ったが、最近は、多くの新しい言語やランタイムがJavascriptをターゲットにしている。 
 
Javascriptの痛点は、言語そのものであるため、開発者は、Javascriptにコンパイルする新しい
言語を作っている。

Javascriptの痛点って言い回しがなんか変だなあと思ったので原文に当たると

InfoQ: Languages Come to Javascript VMs: CoffeeScript 1.0, StratifiedJS, C/C++ with Emscripten, Python

Javascript VMs are now ubiquitous and increasingly fast - two attributes language 
designers and implementers like. Languages that target the JVM or.NET have seen a lot 
of interest, but recently a lot of new languages and language runtimes target 
Javascript. 
 
A pain point of Javascript is the language itself, so developers are creating new 
languages that compile to Javascript.

pain point → 痛点。なるほど。 とはいえやっぱり Javascript の痛点で何を言いたいのか良くわからない。

カンマのあとに続く文章を考えると、JavaScirptの言語仕様やらが××××なので JavaScirpt そのまま使うのを避けてもっとできのいい言語を JavaScript に 変換して云々ということを指しているのだろうか。

■_ APLは

Arcane Sentiment: What's so cool about APL?

What's so cool about APL? 
 
Why does APL have such a devoted following, despite its strange appearance? What have 
its users, since the 1960s, seen in it that made them embrace such an unpopular 
language? 

なぜ APL には、その奇妙な見かけにもかかわらず熱心な愛好者たちがいるのでしょうか?
1960年代以来、このポピュラーとは言えない言語をそういった愛好者たちに使わせているものとは
なんなのでしょうか?


I'm not one of those fanatical APLers, but I think I understand why. Imagine the year 
is 1965. All computing is on mainframes, and the only high-level languages you've ever 
seen are Fortran and Algol-60. And then one day you meet APL, and discover: 

わたしは fanatical な APL ユーザーではありませんが、なぜ熱狂的なファンがついているのかは
理解していると確信しています。1965年という時期を考えてみましょう。
すべてのコンピューターはメインフレームであり、あなたがそれまでに見た高水準言語と言えば
Fortran と Algol-60 だけです。そしてあなたは APL と出会い、発見します:


 * It has a read-eval-print loop: you can type expressions in and see the results 
   immediately, without running a compiler. It's a remarkably powerful calculator, in the 
   days before calculators were common. (This may account for its popularity in finance.)

   read-eval-print ループがある: 式を入力し、コンパイラーを走らせることなしに
   すぐにその結果を確認できる。これは電卓が一般的になる以前には remarkably で
   強力な計算機でした(これは金融部門で APL がポピュラーである原因かも知れません)。

 * It's mostly functional: most operations return a result rather than requiring you 
   to specify a destination to modify, so you can easily combine many operations in one 
   expression.

   大部分が関数的である:
   ほぼすべての操作が変更すべき destination の指定を要求せずに結果を返します。
   そのため、多くの操作を一つの式に容易に結合できるのです。

 * It has built-in collections — specifically multidimensional arrays, but any decent 
   collection support would do as well. We take collections for granted nowadays, at 
   least in languages higher-level than C, but this wasn't always so. There's a reason 
   many early languages (not just APL and Lisp) were built around a collection type.

   組み込みのコレクションがある:
   特に多次元配列ですが、any decent collection も同様にサポートしています。
   今日、少なくとも C よりも高水準の言語においてはわたしたちはコレクションを享受していますが、
   しかしこれはいつでもそうであったというわけではありません。
   初期の多くの(APL や Lisp ではない)言語が built around a collection type であった理由があります。

 * It has high-order operations: map is (often) implicit, and reduce, scan, and 
   Cartesian product are single characters.

   高階操作がある:
   map は (頻繁に) 暗黙に行われ、reduce、scan、Cartesian product は一文字です。

 * It's terse, and not just because of its one-character names. You really can say in 
   a line of APL what would take a page of Fortran.

   簡潔である。これはただ単にその名前が一文字であることではありません。
   Fortranでは1ページになることをAPLでは一行で記述できます。

Under these circumstances, wouldn't you be amazed by the powerful new language? 
Wouldn't you become a faithful user, and for decades wonder why all other languages 
were so uselessly primitive?

■_

Lisp の真実

The Truth About Lisp

The Truth About Lisp 
(Lisp についての真実)

In which the truth about lisp is revealed, and some alternatives are enumerated. 
 
Learning lisp will alter your life.
lisp を学ぶと人生が変わる
 
Your brain will grow bigger than you ever thought possible. 
 
You will rewrite all of your applications in just a handful of lines 
 
Society will shun you. You will shun society. 
社会はあなたを避けるようになり、あなたは社会を避けるようになる
#でいいのかな

You will become disatisfied with everything and everyone around you. 
あなたの周りのもの、人、すべてが不快になる

Lisp is so simple to learn that you can learn lisp in just a few minutes. I just 
learnt it now while I was waiting for a bus. 

ほんの数分で学べるくらい Lisp は単純である。
わたしはバスを待っている間に学んだ。

Lisp is so simple that you can implement it in any language in just a few pages of 
code. This might never happen though, because once you've learnt lisp you'd never want 
to write anything in any language other than lisp, so you wouldn't bother implementing 
lisp in any language other than lisp. 

どんな言語を使ってもほんの数ページ分のコードで実装できるくらい Lisp は単純である。
Lisp を学んでしまえば Lisp 以外の言語で書こうとは決して望まないだろうから、
Lisp 以外の言語で Lisp を実装するなどということはしないだろう。


Lisp can be fully implemented in lisp in just a handful of lines. I just implemented 
lisp in lisp, fully, while i was hopping onto a bus and paying for my bus ticket all 
at the same time. 

Lisp は just a handful of lines の lisp でフルに実装できる。
わたしはバスに飛び乗ってバスのチケットを買うのと同時に lisp で lisp を完全に実装した

When you become a lisper, you will laugh at jokes that no one else thinks are funny. 
You will know things that cannot be expressed in ordinary imperative language. 

あなたが lisper となったとき、あなたは他の誰もがおかしいとは思わないようなジョークで
笑うようになります。ふつうの命令型言語 (ordinary imperative langauge) では表現できない
ようなことをあなたは知るのです。


You will think people are idiots when they state things like "Hi, how are you?"
because a lisper simply doesn't need to use such verbose constructs. Lisp abstract
away those patterns of interaction and makes them completely irrelevant. The proper way
to greet a fellow lisper is just a tiny nod of the chin, and about a tenth of a wink
from your left eye, then point at your tin foil hat. They will know what you mean. if
they don't know what you mean then they are not a true lisp programmer and they don't
matter anyway. 

You will think people are idiots
あなたは他人が愚か者 (idiots) であると考えるようになるでしょう
when they state things like "Hi, how are you?"


なぜなら lisper は単純にそういった冗長な constructs を必要としないからです。
Lisp はそのような interaction のパターンを抽象化してそれらを完全に irrevant にします。
The proper way to greet a fellow lisper is just a tiny nod of the chin,
and about a tenth of a wink from your left eye,
then point at your tin foil hat.
彼らはあなたの意図を知ることになるでしょう。
if they don't know what you mean
彼らがあなたの意図をわからないのであれば
then they are not a true lisp programmer
彼らは真のLispプログラマーではなく、
and they don't matter anyway.
その結果として彼らはなんにせよ重要ではないのです。


Lisp was invented a long time ago, before java, before C, before fortran, before 
computers, before people, before the earth was built. the universe itself is a lisp 
program so trivial that no true lisper would even both implementing it. 

Lisp ははるかな昔、java よりも C よりも fortran よりもコンピューターよりも
人間よりも地球が作られる前よりも昔に発明されました。宇宙それ自身が一つの
lisp プログラムであるので
so trivial that no true lisper would even both implementing it. 


Lisp is so elegant that the very fact that you know even the first thing about it will 
qualify you for a season as principal dancer of the royal ballet. You will go out on 
stage in your little tutu and just scribble a few round brackets in the air with your 
toe. People will gasp in wonder. Unless they don't know any lisp. If they don't know 
any lisp then they are idiots and they don't matter. 

Lisp はとても elegant なので
Lisp is so elegant that the very fact that you know even the first thing
about it will qualify you for a season as principal dancer of the royal ballet.

You will go out on stage in your little tutu
and just scribble a few round brackets in the air with your toe.
People will gasp in wonder.
Unless they don't know any lisp.
彼らがなんら lisp を知らない限り。
If they don't know any lisp then they are idiots and they don't matter. 
もし彼らが一切lispのことを知らないのであれば
彼らは愚か者であり、

Only lispers have a true definition of fun. Maybe ML programmers too. All of today's 
languages are based on fortran and lisp. The bad bits fortran, the good: lisp. 

lisper だけが fun の真の定義を持っています。ML プログラマーもそうかもしれません。
今日のプログラミング言語はすべて、fortran と lisp に基礎があります。
悪い部分は fortran から、良い部分は…lispから。


If you're good enough to use lisp, you'll soon be frustrated with lisp. Lisp is not an 
adequate lisp. By the time my bus had made it two blocks I'd written some simple lisp 
macros that were so powerful they made lisp completely obsolete and replaced it with a 
new language. Fortunately, that new language was also called lisp. And i was able to 
prove, mathematically, that the new lisp i'd created was both far superior to lisp in 
every conceivable way, but also exactly equivalent to lisp in every possible way. I 
was very excited by this. But also found it very boring. 

あなたがもし lisp を使うのに good enough であったなら、あなたはすぐ lisp に
不満を感じることでしょう。lisp は adequate lisp ではありません。
By the time my bus had made it two blocks I'd written some simple lisp 
macros that were so powerful they made lisp completely obsolete and replaced it with a new language.

幸運にもその新しい言語もまたlispと呼ばれました。
And i was able to prove, mathematically,
that the new lisp i'd created
was both far superior to lisp in every conceivable way,
そしてhわたしの作ったその新しい Lisp を
数学的に prove できたことは


but also exactly equivalent to lisp in every possible way.

わたしはそれにとても興奮しました。
けれども同時に、それがとても退屈であることにも気がついてしまったのです。


Reddit is proof that lisp is really powerful. Paul Graham originally wrote reddit, in 
lisp, on the back of a napkin while he was waiting for a coffee. it was so powerful 
that it had to be rewritten in python just so that ordinary computers could understand 
it. Because it was written in lisp it was almost no effort to rewrite the entire thing, 
and the rewrite was completed in-between two processor cycles. Paul Graham himself was 
completely written in lisp, by an earlier version of himself, also written in lisp, by 
an earlier version of lisp. It's lisp, paul graham, lisp, paul graham, all the way 
down. 
 
Because we've reached the limits of moore's law, the computers of the future will have 
many-core processors and all our programs will need to be written in a combination of 
haskell and lisp, that will itself be so powerful that the computers of the future 
will not be able to implement any of our ideas without creating time-travelling 
algorithms that borrow processing power from other computers that are further into the 
future. This sounds difficult, but in lisp it isn't difficult at all. in haskell this 
is a built-in feature and the way you implement it is just a no-brainer to any one who 
knows lisp or haskell. 
 
After that, the computer of the future will be called The Lisputer. It's speed will be 
measured using the Lispunit, which is a measure of how many simultaneous arguments 
about the inadequacy of lisp can be proposed and defeated by an infinite number of 
lisp pundits without any actual decisions being made. Today's computers run at just 
under one lispunit. The Lisputer will run at lisp Lispunits, where lisp is a 
fundamental maximum constant of the universe that can't be expressed using ordinary 
imperative numerals. Suffice to say that it ends with an infinite number of closing 
parentheses. 

結局のところ、将来コンピューターはそのスピードが Lispunit を使って測られる
Lisputer と呼ばれるようになるでしょう。

which is a measure of how many simultaneous arguments 
about the inadequacy of lisp can be proposed
and defeated by an infinite number of lisp pundits
without any actual decisions being made.

Today's computers run at just under one lispunit.
今日のコンピューターはただ一つのlispunit の下で実行されます


The Lisputer will run at lisp Lispunits,
where lisp is a fundamental maximum constant of the universe
that can't be expressed using ordinary imperative numerals.

Suffice to say that it ends with an infinite number of closing parentheses. 


Anyway. i read an article about lisp on the bus today. Top article. All the articles 
on lisp are really full on ― my brain starts to explode out my ear. This one, lisp is 
sin, was by Sriram Krishnan, in which he talked about doing C# for work, but Lisp for 
fun. And he touched on some of the ways in which C# is moving toward lisp. 

Anyway.
いずれにしても
i read an article about lisp on the bus today.

Top article.
All the articles on lisp are really full on
Lisp についてのすべての articles は
―
my brain starts to explode out my ear.
This one,
lisp is sin, was by Sriram Krishnan,
in which he talked about doing C# for work,
but Lisp for fun.
And he touched on some of the ways in which C# is moving toward lisp. 


Here's some of the technologies that the commentors at that article suggested as 
possible substitutes for a lisp addict: 

lisp addict に対して置き換え可能なものとして 
例の atricle で commentors が提案していたものを以下に列挙します:

  1. newLisp 
  2. ML 
  3. Perl6 
  4. nermerle 
  5. smalltalk 
  6. biobike 
  7. chez scheme 
  8. Common Larceny 
  9. XSLT 
 10. OCaml 
 11. LSharp 
 12. Lua 
 13. C Omega 
 14. F# 
 15. C# with Linq 
 
Also, one person suggested porting the python libraries to lisp. 

また、ある人がpythonのライブラリをlispに移植することを提案しました。

Curious for its absense: Ruby (see article Why Ruby is an acceptable lisp, and steve 
yegge's response: 'lisp is not an acceptable lisp') 
 
(p.s. first person to write a comment that says "Paul Graham did not write reddit"
deserves a lollipop.)

■_

2011年01月09日

■_

TAPL読書会でこういうものの存在を知った → TeX---Beamer

ラミー PICO 欲しい(使ってみたい)が、何だこのお値段 ○| ̄|_ Amazon.co.jp: LAMY ピコ マットクローム ボールペン L287: 文房具・オフィス用品

■_

■_ Playing with a new language: Clay

んーむペースがあがらん。

David R. MacIver

Playing with a new language: Clay

There's been a distinct lack of interesting language related posts around here 
recently.

Why? Well because I've been mostly writing Ruby and C. Neither of which languages 
fills me with an urge to post HEY GUYS, I FOUND THIS COOL THING. Ruby because I 
vaguely dislike it, so I resent even the kindof cool things I find as I use it, C 
because my use of C tends towards the extremely straightforward so C posts tend to be 
about the result rather than the method (arguably that's what programming posts should 
be like anyway, but that's a separate issue).

But anyway, I've been window shopping around for a new language to learn. My list of 
features I wanted in said language were:

 1. Good performance
    良好な性能
 2. Higher level than C
    C よりも高水準
 3. Preferably statically typed
    
 4. Generic collections
    ジェネリックなコレクション

 5. Didn't run on the JVM
    JVM上で動作していない

The closest to this on the list of languages I already knew was Haskell, and I've been 
using it a little bit, but it and I don't really get on for a variety of reasons that 
are beyond the scope of this blog post.

わたしが知っている言語リストの中でこれに一番違いものは Haskell でした。
わたしは Haskell をちょっとだけ使っていましたが、
I don't really get on for a variety of reasons that 
are beyond the scope of this blog post.

I was pretty much thinking it was going to be O'Caml (which is another language in the 
“vaguely dislike” category. I want to like it, I really do, but somehow I can never 
manage) and C++ (oh dear god no).

わたしは O'Caml と C++ がそうなるのではないかと考えました。


So, anyway, my ears perked up when clay came up on reddit the other day. I had already 
been vaguely aware of it, but somehow it dropped off my radar before I did anything 
about it.

そうこうして、ある日 reedit で clay という言語のことを耳にしました。
わたしはすでにそれについて注目してはいたのですが、何かしようとする前に
はしごが落とされてしまったのでした。

So I've been spending today playing with it, and the results are two little projects: 
An interval tree implementation and a very rudimentary start on some client bindings 
to PostgreSQL. Neither are written with any particular purpose in mind, ‘though both 
are something I might want to use at some point, it's really just a way to get a feel 
for the language.

そして今日一日 clay を使ってみた結果が、二つの小さなプロジェクト
interval tree の実装と、PostgreSQL にバインドされたクライアント上での
very rudimentary start です。
いずれも何かと区別の目的があって書いたものではありませんが、
どちらもわたしがどこかで使ってみたいと考えるであろうもので、
言語の感触をつかむのにはちょうど良いものでした。


I'm pleasantly impressed. Is it going to be the Next Big Language? Who knows. 
Certainly not me. But despite a lot of stupid questions on my part it was a pleasant 
experience, and I'm definitely going to continue playing with it.

わたしはとてもいい印象を受けました。この言語は次なる Big Language となるのでしょうか?
誰がそれを知っているでしょう。少なくともわたしにはわかりません。
けれども、a lot of stupid questions on my part にも関わらず
それは pleassant な経験でしたし、この言語で遊ぶのを続けようと決心したのです。

What follows are some initial impressions. Bear in mind it's the result of only a day 
of playing with it, so they may be incomplete or outright wrong:

以下に第一印象を挙げました。
一日試しただけでの率直な感想なので、不完全であろうし
間違ったものもあるでしょう。

The Good
良い点

Here are some of the things I liked:

Good support for generic programming
ジェネリックプログラミングに対する good support

Like it says on the label really. This is one of the things the language bills itself 
as being good at, so if it weren't it would be dead on launch.

I've had a reasonable play around with it, and it works well. The entire system is 
basically a giant (mostly) statically resolved multimethod system. Given my fondness 
for multimethods, that's a plus as far as I'm concerned. Runtime polymorphism comes in 
through an extensible variant system: You can declare variants in one module and add 
new ones in another.

Anyway, the result is that there are generic collections and they Just Work, 
exceptions make use of the extensible variant system and seem well behaved.

There's no object orientation support and no subtyping. As far as I'm concerned, 
that's a good thing.

Decent FP primitives
適切な FP プリミティブ

So I haven't actually had much of a play with these yet believe it or not, but they're 
there and seem to work. lambdas don't implement non-local return (‘though I suppose 
you could do this with an exception), but do capture their environment. The main place 
I've used this is in the test system.

clay bind-gen

clay bind-gen takes a C header file and gives you a clay library. It's a bit finicky, 
and obviously the code is far from idiomatic, but it does work and works well. It took 
me about 10 minutes to get this working on the libpq header and port a C example of 
using it to clay. Hopefully this means that it's rather easy to build on the available 
C ecosystem.

Decentish standard library
適正な標準ライブラリ

All quite basic at the moment, but it already annoys me less than Scala's used to when 
it was at a much later stage in the game than this. Granted that's because Scala could 
get away with it by falling back on the JVM ecosystem and clay can't, but it's a good 
start. It's pleasantly reminiscent of the sort you'd expect with a high level language, 
but seems well tuned for clay's suitability as a systems language.

Valgrind works flawlessly

As per title. Clay is an unsafe language – it has manual memory management (which, 
thanks to things like stack allocation and deterministic destructors, is much less of 
a pain than in C, but is still definitely not hard to get wrong), pointer arithmetic, 
no bounds checking on array access.

The only reason I trust myself to write C is because valgrind exists. I would have had 
a very hard time trusting myself to write clay if it didn't work on it. Fortunately, 
no problems.

Friendly and intelligent IRC channel
親しみやすく知性的な IRC チャンネル

I'm a big fan of IRC as a learning environment. I've been on IRC on a fairly regular 
basis in various channels for 10-15 years (‘though rarely any given one for more than 
4 or 5. I have community attention span issues), and so the first thing I do when 
checking out a new tech or language is long onto their IRC channel. Clay's does not 
disappoint. It's small, but there are a bunch of smart people in there, and they were 
very patient and helpful with my stupid questions.

The bad
悪い点

Confusing semantics
混乱したセマンティクス

Generally there's a good reason for it, and things are still in flux so I think many 
of these will improve, but there have been a bunch of cases where I've gone “Wait, 
what?”. Some of these are just the result of my never having used a language with 
non-trivial value semantics before (tree = tree.child generates an invalid read), some 
of them are gotchas which you'll probably only be caught by once but are still pretty 
ugly (it's very easy to think you've redefined a constructor when you haven't because 
the type arguments are part of the constructor's name), and a few others that slip my 
mind at the moment. The semantics of how copying, moving and assignment work are not 
so much confusing as very easy to get wrong. I'm still not 100% sure I understand how 
variants interact with their members.

I think I'm largely on top of it now, and I expect it will become clearer as I write 
more of it, but I definitely spent a good chunk of today quite bewildered.

Basically zero documentation
基本的にドキュメントがない

Well, what do you expect? The language is young and still massively in flux. I'm not 
surprised there's no documentation and, as mentioned, the community is very helpful in 
making up for its lack, but it definitely makes the learning process much harder.

The language is young and still massively in flux
言語が若く、

As mentioned above. This is definitely an experimental language – the compiler seems 
to currently be undergoing a rewrite which will, amongst other things, be changing the 
backend target away from LLVM and to C. The syntax is expected to change. The semantics
are expected to change. The language designers will, and should, feel free to break
backwards compatibility.

先に述べたように、この言語はまったくもって実験的な言語です。
コンパイラーは現状で、バックエンドのターゲットを LLVM から C へと変更するための
書き換えの真っ最中のように思われます。
構文が変更されるのを期待します。
セマンティクスが変更されるのを期待します。
この言語の設計者たちは、後方互換性を壊すことを躊躇しないでしょうし
躊躇すべきではありません。


Error messages
エラーメッセージ

As well as the usual problems with new languages and quality of error messages, clay's 
error messages, both at runtime and compile time, are very short on line numbers. This 
can make it very hard to track down what's going wrong. It wasn't drastically difficult
with what I was doing today, but they were both rather small projects. I don't know how
hard it will be on larger projects, but I'm hoping that some of this (particularly
compile time error messages) will be fixed by the time I have to worry about that.

新しい言語とエラーメッセージの質に良く見られるように、clay のエラーメッセージは
実行時とコンパイル時の両方ともで行番号上の非常に短いものでしかありません。
これは何が間違っているのかを track down するのを非常に難しくしている可能性があります。


Late discovery of errors
エラーの late discovery

It's not quite as bad as C++ template errors are reputed to be, but generally you 
don't discover an error in a function until you try to use that function. This is 
somewhat deliberate, as it ties in with how the genericity works, but when combined 
with the line numbers problem can be quite frustrating. Additionally the support for 
giving the compiler hints to get better error messages is a bit rudimentary: You can 
define compile time functions which constrain arguments, but that's about it.

The ugly
ひどい点

Keywords vs operators
キーワードと演算子

Clay doesn't have much C compatibility in terms of its operators: the bitwise operators
(in particular <<, >>, |, & and ^) are replaced by functions. The
shortcutting boolean operators are replaces with keywords and and or. It's not a major
problem, but it annoyed me vaguely when porting from C.

Clay はその演算子において、C との互換性はそれほどありません。
ビット演算子(特に<<, >>, |, & and ^) は関数に置き換えられています。
短絡評価するブール演算子は and と or というキーワードに置き換えられています。
これは大きな問題ではありませんが、C から移植するときにわたしをかなりげんなりさせました。

Keywords
キーワード

Clay has a fair few keywords: ref, forward, lvalue, rvalue, lambda, and, or, overload, 
procedure, variant, record, callbyname… probably more.

It's not a massive problem, but I tend to regard keyword surplus as a sign of 
insufficiently well factored features. I've yet to form an opinion on whether or not 
this is the case here.

Everything is by reference
すべてが参照による

I don't yet know if I like this or not, but Clay's calling convention passes everything as
a mutable reference. So assigning to a function argument assigns in the calling context.
Really. This can be quite useful, particularly given that copying a clay value can be a
very expensive operation, but I find it deeply disconcerting. I feel like it may grow on
me. We'll see.

A few minor syntax weirdnesses
いくつかの些細な構文上の weirdnesses

e.g. one that bugged me earlier is the syntax for return type declaration on a
function: foo(a : Blargh) ReturnType. No colon on the return type, but colon on the arguments.

Conclusion
結論

Overall, definitely more good than bad. I intend to keep playing with it and see how I 
feel after a while doing so.

結局のところ、良い点のほうが悪い点よりも圧倒的にあります。
わたしはこの言語を使い続けて、しばらく使ってみたあとどのように感じるのかを
確かめてみたいと思います。

■_

Michael Feathers: The Bad Code Kata

Is it easy to intentionally write bad code? When you look at a lot of the software out 
in the industry is seems that the answer has to be 'yes.' We're surrounded by bad code, 
but that isn't the same thing as writing it intentionally. 

悪いコード (bad code) を意図的に書くことは容易でしょうか?
industry の外側にあるものの多くに注目したとき、その答えは 'yes' となるはずです。
わたしたちは悪いコードに囲まれていますが、それは意図的にそういった悪いコードを
書いたこととは違います。

In trainings and workshops over the past couple of months, I've asked people to sit 
down and intentionally write the worst code that they can imagine. A lot of it ends up 
being obtuse, with redundant and obscure calculations, but somehow it always seems to 
miss the mark - it's not like the "bad code" that we typically encounter, 
and it's worth wondering why. 

過去二、三ヶ月にわたるトレーニングと waorkshops において、わたしは人々に
着席して意図的に自分が想像できる最悪のコードを書いて欲しいとお願いしました。
そこで書かれたものの多くは
being obtuse, with redundant and obscure calculations,
but somehow it always seems to miss the mark
- わたしたちが典型的に遭遇するような“悪いコード”のようなものではなく
なぜなのかを考える価値のあるものでした。

Anyway, I offer this as a challenge to you. Try to intentionally write the worst code 
that you can and see how you feel about it. Notice how that code is different from bad 
code that you tend to see. 

いずれにしても、わたしはあなたにこの challenge を提案します。
あなたに可能な最悪のコードを意図的に書くことを試みて、
そしてそれについてどのように感じるのかを確認してください。
あなたがよく目にする悪いコードとの相違点に注意してください。


There's a psychologist named Fritz Perls who coined something he called the 'Law of 
Paradoxical Intention.' If you are blocked on something, try to do the exact opposite 
of what you are trying to do. It turns out that there's a lot you can learn about good 
design by intentionally trying to write bad code. Just, please, don't ever check it in. 
 
If you do this kata, please post your results and reflections online. I'll be blogging 
reflections about what I've learned so far soon. 
 
Edit: I may have gotten this idea transitively from Jason Gorman. I heard that he ran 
a 'bad code kata' at a QCON conference last year.

■_ ネタ

C言語なら俺に聞け(入門編)Part 76 
135 デフォルトの名無しさん [sage] 2011/01/10(月) 00:10:00 ID: Be: 
 これは配列だが。初心者はこのようにメモリ確保すべき。new、mallocはよほどのことで無い限り使うこと無い。 
 
 int main() 
 { 
 vector<int> p(100); 
 }

ノーヒントw

■_

2011年01月08日

■_

fx復旧できず。 まあ、「被害」は自分で無理矢理パッチ当てながら使ってたアドオンが使えなくなったって話だしなあ。 諦めるか。 にしても本体のバージョンアップじゃなくて他のアドオンの更新で殺されるなんて…

行ってきました。 『このコンピュータ書がすごい! 2011年版』最新情報 - compbookグループ あとで。

■_

Perl 6 module ecosystem – news and ideas
by ttjjss on 08/01/2011

あとで。

■_

Positional factoring

Samuel Tardieu, 2011-01-06

あとで。

■_ 呼称

Pythonのお勉強 Part40
488 デフォルトの名無しさん [sage] 2011/01/08(土) 01:51:08 ID: Be:
 Perl使いはPerler、Ruby使いはRubyist、
 ではPython使いは? Pythologist?

489 デフォルトの名無しさん [sage] 2011/01/08(土) 01:55:30 ID: Be:
 PHPer(笑)

490 デフォルトの名無しさん [sage] 2011/01/08(土) 02:35:19 ID: Be:
 pythonist

491 デフォルトの名無しさん [sage] 2011/01/08(土) 02:55:11 ID: Be:
 pythonista

492 デフォルトの名無しさん [sage] 2011/01/08(土) 03:03:03 ID: Be:
 むしろ pythonomist

493 デフォルトの名無しさん [sage] 2011/01/08(土) 03:16:02 ID: Be:
 >>486
 ActivePythonならpypmだろ

494 デフォルトの名無しさん [sage] 2011/01/08(土) 03:23:54 ID: Be:
 Pythonese

495 デフォルトの名無しさん [sage] 2011/01/08(土) 03:24:01 ID: Be:
 >>488 >>492
 「ニシキヘビ学」ってなんだよw
 どんな研究分野なんだ

496 デフォルトの名無しさん [sage] 2011/01/08(土) 09:11:49 ID: Be:
 pythologist

497 デフォルトの名無しさん [sage] 2011/01/08(土) 09:36:25 ID: Be:
 pythoneer

498 デフォルトの名無しさん [sage] 2011/01/08(土) 09:38:21 ID: Be:
 python tamer

 経験上漏れがこういうのを書き込んだ途端に
 いい加減にしろって怒られる確率が大

499 デフォルトの名無しさん [sage] 2011/01/08(土) 10:25:55 ID: Be:
 A Python ****

 英語は正しく使うのがPythonic

500 デフォルトの名無しさん [sage] 2011/01/08(土) 11:07:21 ID: Be:
 こういうときは冠詞なくてもいいんだぜよ。

501 デフォルトの名無しさん [sage] 2011/01/08(土) 11:54:07 ID: Be:
 上級python使いはpythoness(魔女)で

「ニシキヘビ学」Python の実装だとか内部構造を研究する人とか…ないかw

■_ 誤差

これは事情を知らないと勘違いしやすいかなあ 台形公式を用いたプログラムで分割数nを大きくしていけば精度は上がると思ってるんだけど n=100とn=1000とでは値が何故か全然違うんだ

くだすれFORTRAN(超初心者用)その5 

443 デフォルトの名無しさん [] 2011/01/06(木) 17:48:39 ID: Be:
 三重積分の数値計算プログラムについて相談
 台形公式を用いたプログラムで分割数nを大きくしていけば精度は上がると思ってるんだけど
 n=100とn=1000とでは値が何故か全然違うんだ
 被積分関数f(x,y,z)=x^2+y^2+z^2で積分区間をx,y,z共通で[0,1]としたとき値Sは1.0になるわけだけど
 n=100のときS=1.000005054で、n=1000のときS=6.25e-2になってしまう
 数学板とで迷ったけどアルゴリズム的なことだったらこっちかなと思って聞いてみる
 誰か分かる人いたら教えてください

444 443 [sage] 2011/01/06(木) 17:54:37 ID: Be:
 メインプログラムはこんな感じ

 n=1000(あるいは=100)

 xs=0.0
 xe=1.0
 ys=0.0
 ye=1.0
 zs=0.0
 ze=1.0
 dx=(xe-xs)/float(n)
 dy=(ye-ys)/float(n)
 dz=(ze-zs)/float(n)
 s=0.0

 do iz=1,n
 z1=zs+dz*float(iz-1)
 z2=zs+dz*float(iz)
 do iy=1,n
 y1=ys+dy*float(iy-1)
 y2=ys+dy*float(iy)
 do ix=1,n
 x1=xs+dx*float(ix-1)
 x2=xs+dx*float(ix)

 h1=f(x1,y1,z1)
 h2=f(x2,y1,z1)
 h3=f(x1,y2,z1)
 h4=f(x2,y2,z1)

445 444の続き [sage] 2011/01/06(木) 17:56:07 ID: Be:
 h5=f(x1,y1,z2)
 h6=f(x2,y1,z2)
 h7=f(x1,y2,z2)
 h8=f(x2,y2,z2)

 h=(h1+h2+h3+h4+h5+h6+h7+h8)/8.0
 s=s+dx*dy*dz*h

 end do
 end do
 end do

 とまあこんな感じ
 今はf(x,y,z)=x^2+y^2+z^2で計算してるけど最終的にはもうちょっと複雑な関数になる

446 デフォルトの名無しさん [sage] 2011/01/06(木) 22:33:32 ID: Be:
 「情報落ち」だな

447 デフォルトの名無しさん [] 2011/01/07(金) 00:34:52 ID: Be:
 >>446
 ?

448 デフォルトの名無しさん [sage] 2011/01/07(金) 00:57:29 ID: Be:
 ググれ
 このごろじゃ計算誤差について何も教えてないのか

 最後に合計を見るだけじゃなく
 実際に何を足してるのか出力してみろ
 何が起きてるのか分かる

449 デフォルトの名無しさん [sage] 2011/01/07(金) 01:52:41 ID: Be:
 >>448
 把握した
 今このプログラムは実数が単精度になってるから倍精度にして
 h1~h8まで出力してみて確認してみる

452 デフォルトの名無しさん [sage] 2011/01/07(金) 23:34:10 ID: Be:
 >>443だけど単精度から倍精度に変えて情報落ちしてるであろうSの計算方法を変えたら問題解決できますた

453 デフォルトの名無しさん [sage] 2011/01/07(金) 23:38:34 ID: Be:
 >>448
 昔のほうがしっかりしたカリキュラムだったって話を聞くが本当なのか
 ゆとり教育ってやつか

カリキュラムの内容が変わって、この手の数値演算に割かれる時間が少なくなった って話じゃないかなあなどととなんとなく想像。

■_

もういっこ浮動小数点数演算ネタ。

【超初心者】プログラミング質問スレ【基礎】part3 

311 デフォルトの名無しさん [sage] 2011/01/04(火) 14:03:29 ID: Be:
 浮動小数点ってなんのためにあるの?

 計算するたびに誤差が出て、あれこれよけいな知識が必要になるし、

 CPUにも負荷がかかる 昔のCPUなら、これで部品増えて
 コストも高かったりするだろう

 誰が思いついたんだこんなもの
 まったくいいことない

312 デフォルトの名無しさん [sage] 2011/01/04(火) 14:07:08 ID: Be:
 大きな数値を表現するためにあるの

313 デフォルトの名無しさん [sage] 2011/01/04(火) 15:31:13 ID: Be:
 原理的に実数が扱えないパソコンで、何とかして実数を扱おうとした結果

314 デフォルトの名無しさん [sage] 2011/01/04(火) 18:36:26 ID: Be:
 >>311
 他に実数を扱ういい方法を思いつくなら提案してみたまえ

315 デフォルトの名無しさん [sage] 2011/01/04(火) 19:13:42 ID: Be:
 >>311 にとっては、円周率は 3 なんだろうさ

316 デフォルトの名無しさん [] 2011/01/04(火) 22:24:08 ID: Be:
 >311
 浮動小数点を==で比較しちゃったんですね

317 デフォルトの名無しさん [sage] 2011/01/05(水) 02:23:15 ID: Be:
 >>311
 これつかえや
 http://hibari.2ch.net/test/read.cgi/tech/1248060999/

318 デフォルトの名無しさん [sage] 2011/01/05(水) 10:51:53 ID: Be:
 >>314
 わかりました。ご返答ありがとうございます。
 大量の小数点以下の数字を使って処理したいことも、私の想像の範囲外ではありますが、
 この世の中あることはあるのでしょう。

 まあしかし、じっさいには、かなーり用途が限られてると私はあると思います。

319 デフォルトの名無しさん [sage] 2011/01/05(水) 11:01:51 ID: Be:
 もっと用途が限られてるであろう複素数も標準に入ってるくらいだからな
 大量の複素数を使ってしたい処理なんて俺の想像の範囲外だが、たぶん誰かの要望があって入れたんだろうし
 自分がいらないなら使わなきゃいいだけのことだ

320 デフォルトの名無しさん [sage] 2011/01/05(水) 11:44:28 ID: Be:
 自分が理解できない機能が出るたびにストレスを発散しに来るのはやめて
 数値計算の教科書を読むんだ

321 デフォルトの名無しさん [sage] 2011/01/05(水) 12:46:39 ID: Be:
 これって、固定小数点数や多倍長演算のことを
 絡めて述べないと答えになってないのでは。

322 デフォルトの名無しさん [sage] 2011/01/05(水) 12:49:35 ID: Be:
 馬鹿は相手にしないのが一番

323 デフォルトの名無しさん [sage] 2011/01/05(水) 12:55:05 ID: Be:
 つまり浮動しない小数点が必要って事だな。

324 デフォルトの名無しさん [sage] 2011/01/05(水) 13:03:50 ID: Be:
 >>323
 いや、多倍長演算と固定小数点の組み合わせではなぜ
 具合が悪いのかを述べないと。ただ「大きい桁を扱うため」
 だけでは不十分なのではないかと思う。

325 デフォルトの名無しさん [sage] 2011/01/05(水) 13:04:27 ID: Be:
 浮動小数点が気に入らない奴はCOBOLを使うべき

326 デフォルトの名無しさん [sage] 2011/01/05(水) 13:13:53 ID: Be:
 おもちゃじゃないんだから自分でわけもわからないものを使うなよ

327 デフォルトの名無しさん [sage] 2011/01/05(水) 13:14:08 ID: Be:
 >>311みたいな奴は、浮動じゃなかったら誤差でなくなると思ってるのか?

328 デフォルトの名無しさん [sage] 2011/01/05(水) 22:30:17 ID: Be:
 無限精度のライブラリとかあるじゃん。
 それ使えば?

329 デフォルトの名無しさん [sage] 2011/01/05(水) 23:22:00 ID: Be:
 >>328 それ、どこにあるの?

330 デフォルトの名無しさん [sage] 2011/01/05(水) 23:25:21 ID: Be:
 言語次第

331 デフォルトの名無しさん [sage] 2011/01/05(水) 23:48:32 ID: Be:
 >>329
 スレ立ってるよ。

332 デフォルトの名無しさん [sage] 2011/01/06(木) 07:25:16 ID: Be:
 計算の有効桁数ってのがあって
 全桁の値が必要ない場合は
 浮動小数点数で計算する方が効率が良い
 もちろん誤差や桁落ち情報落ちが出るのは当然
 そんなのは理解して使うもの

333 デフォルトの名無しさん [sage] 2011/01/06(木) 08:56:18 ID: Be:
 手書きで計算したって誤差はでる

334 デフォルトの名無しさん [sage] 2011/01/06(木) 09:07:39 ID: Be:
 浮動小数点の特性を理解していれば、そんなに神経質に

 「どのくらい、どういうふうに、誤差が出るかわかんないから、使わない!」

 と決めてかかる必要もないってことですか。

335 デフォルトの名無しさん [sage] 2011/01/06(木) 10:23:45 ID: Be:
 実験レポートも書いたことがないなんて!

336 デフォルトの名無しさん [sage] 2011/01/06(木) 10:40:59 ID: Be:
 計算尺ほどの精度があれば東京タワーが立てられる

337 デフォルトの名無しさん [sage] 2011/01/06(木) 11:19:02 ID: Be:
 >>334
 どのくらい、どういうふうに、誤差が出るかわかれば、使う?

338 デフォルトの名無しさん [sage] 2011/01/06(木) 11:35:55 ID: Be:
 一回限りの計算で出る誤差なんてたいしたことない
 実際そんな精度まで再現出来る機械や構造物作れないから
 怖いのは誤差の蓄積

■_

2011年01月07日

■_

アドオンをアップデートしたらコンテキストメニューがおかしくなった (項目数が大量に減ってしまった)。 なぜに。 おかげでいつも使っている某アドオンが使えなくて往生してしまった。

■_

■_

さぎょうがすすまねー

2011年01月06日

■_

買った
OVA BLACK LAGOON Roberta's Blood Trail Blu-ray 003 [Blu-ray]
二ヶ月近く延期されたからなあ。といいつつまだBD再生環境を持っていないのだった ○| ̄|_

・歴史群像
歴史群像 2011年 02月号 [雑誌]
今回も面白かった。特に関が原の記事とか(まあ「松尾山城」云々は以前にもあったと思うけど)。

■_

■_ ぷれーすほるだー


Perl 6 Variable Tablet / Perl 6
Array Methods

Some of the more important things you can do with lists. All the methods can also used like ops in "elems @rray;"

? @rray;             # boolean context, Bool::True if array has any value in it, even if its a 0
+ @rray;             # numeric context, number of elements (like in Perl 5 scalar @a)
@rray.elems;         # does the same
@rray.end;           # number of the last element, equal to @rray.elems-1
~ @rray;             # string context, you get content of all cells, stringified and joined, same as "@primes[]"
@rray.cat;           # does the same
@rray.join('');      # also same result, you can put another string as parameter that gets between all values
@rray.unshift;       # prepend one value to the array
@rray.shift;         # remove the first value and return it
@rray.push;          # add one value on the end
@rray.pop;           # remove one value from the end and return it
@rray.splice($pos,$n)# remove on $pos $n values and replace them with values that follow that two parameter
@rray.delete(@ind);  # delete all cell with indecies of @ind
@rray.exists(@ind);  # Bool::True if all indecies of @ind have a value (can be 0 or '')
@rray.pick([$n]);    # return $n (default is 1) randomly selected values, without duplication
@rray.roll([$n]);    # return $n (default is 1) randomly selected values, duplication possible (like roll dice)
@rray.reverse;       # all elements in reversed order
@rray.rotate($n);    # returns a list where $n times first item is taken to last position if $n is positive, if negative the other way around
@rray.sort($coderef);# returns a sorted list by a userdefined criteria, default is alphanumerical sorting
@rray.min;           # numerical smallest value of that array
@rray.max;           # numerical largest value of that array
$a,$b= @rray.minmax; # both at once, like in .sort . min or .max a sorting algorith can be provided
@rray.map($coderef); # high oder map function, runs $coderef with every value as $_ and returns the list or results
@rray.classify($cr); # kind of map, but creates a hash, where keys are the results of $cr and values are from @rray
@rray.grep({$_>1});  # high order grep, returns only these elements that pass a condition ($cr returns something positive)
@rray.first($coder); # kind of grep, return just the first matching value
@rray.zip;           # join arrays by picking first element left successively from here and then there

array → @rray が面白いなあ。となんとなく。

で、ハッシュで使っている“dev”というのはなんだろう?


Perl 6 Variable Tablet / Perl 6
Hash

is in Perl 6 an unordered list of Pairs. A Pair is a single key => value association and appears in many places of the language syntax.

%dev =  'pugs'=>'audreyt', 'pct'=>'pm', "STD"=>'larry';
%dev = :rakudo('jnthn'), :testsuite('moritz');            # adverb (pair) syntax works as well
%dev = ('audreyt', 'pugs', 'pm', 'pct', 'larry', "STD");  # lists get autoconverted in hash context
%compiler = Parrot => {Rakudo => 'jnthn'}, SMOP => {Mildew => 'ruoso'};       # hash of hashes (HoH)


Hash Slices

$value = %dev{'key'};      # just give me the value related to that key, like in P5
$value = %dev<pm>;         # <> autoquotes like qw() in P5
$value = %dev<<$name>>;    # same thing, just with eval
@values = %dev{'key1', 'key2'};
@values = %dev<key1 key2>;
@values = %dev<<key1 key2 $key3>>;
%compiler<Parrot><Rakudo>; # value in a HoH, returns 'jnthn'
%compiler<SMOP>;           # returns the Pair: Mildew => 'ruoso'

%dev   {'audrey'};         # error, spaces between varname and braces (postcircumfix operator) are no longer allowed
%dev\  {'allison'};        # works, quote the space
%dev   .<dukeleto>;        # error
%dev\ .{'patrick'};        # works too, "long dot style", because its its an object in truth


Hash Methods

 ? %dev                    # bool context, true if hash has any pairs
 + %dev                    # numeric context, returns number of pairs(keys)
 ~ %dev                    # string context, nicely formatted 2 column table using \t and \n

$table = %dev;             # same as ~ %dev
%dev.say;                  # stringified, but only $key and $value are separated by \t
@pairs = %dev;             # list of all containing pairs
%dev.pairs                 # same thing in all context
%dev.elems                 # same as + %dev or + %dev.pairs
%dev.keys                  # returns the list with all keys
%dev.values                # list of all values
%dev.kv                    # flat list with key1, value1, key 2 ...
%dev.invert                # reverse all key => value relations
%dev.push (@pairs)         # inserts a list of pairs, if a key is already present in %dev, both values gets added to an array


developper?

■_ あとで

面白そうだと思ってページを開いたら予想以上に長かったw


An Open Letter to the Erlang Beginner (or Onlooker)
An Open Letter to the Erlang Beginner (or Onlooker)

One of the #erlang regulars, Jesper Louis Andersen (jlouis) recently posted a reply to
an old post about whether Erlang is overhyped or not.

I definitely have to agree with jlouis on this one and his blog post is pretty good.
His reply stirred a lot of arguments up on social websites such as reddit or Hacker
News, but really none of these arguments were new or unknown to the Erlang community.
I've decided to write this blog post addressing a few points about it.

(略)

2011年01月05日

■_

○天からのメールで、サブジェクトに「号外」って二文字が含まれているものは 問答無用で削除するようにフィルターを設定した。

■_ 逆順

似たような状況で悩んだ覚えが。


python - Extended slice that goes to beginning of sequence with negative stride - Stack Overflow

Bear with me while I explain my question. Skip down to the bold heading if you already
understand extended slice list indexing.

In python, you can index lists using slice notation. Here's an example:

>>> A = list(range(10))
>>> A[0:5]
[0, 1, 2, 3, 4]

You can also include a stride, which acts like a "step":

>>> A[0:5:2]
[0, 2, 4]

The stride is also allowed to be negative, meaning the elements are retrieved in
reverse order:

>>> A[5:0:-1]
[5, 4, 3, 2, 1]

But wait! I wanted to see [4, 3, 2, 1, 0]. Oh, I see, I need to decrement the start
and end indices:

>>> A[4:-1:-1]
[]

What happened? It's interpreting -1 as being at the end of the array, not the
beginning. I know you can achieve this as follows:

>>> A[4::-1]
[4, 3, 2, 1, 0]

But you can't use this in all cases. For example, in a method that's been passed indices.

My question is:

Is there any good pythonic way of using extended slices with negative strides and
explicit start and end indices that include the first element of a sequence?

This is what I've come up with so far, but it seems unsatisfying.

>>> A[0:5][::-1]
[4, 3, 2, 1, 0]


I believe that the following doesn't satisfy you:

def getReversedList(aList, end, start, step):
    if step < 0 and start == 0:
         return aList[end::step]
    return aList[end:start:step]

or does it? :-)
a[4::-1]

Example:

Python 2.6 (r26:66714, Dec  4 2008, 11:34:15)
[GCC 4.0.1 (Apple Inc. build 5488)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[4:0:-1]
[4, 3, 2, 1]
>>> a[4::-1]
[4, 3, 2, 1, 0]
>>>

The reason is that the second term is interpreted as "while not index ==".
Leaving it out is "while index in range".

    But you can't use that if you are storing your indices in variables for example.

Is this satisfactory?

>>> a = range(10)
>>> start = 0
>>> end = 4
>>> a[4:start-1 if start > 0 else None:-1]
[4, 3, 2, 1, 0]


As you say very few people fully understand everything that you can do with extended
slicing, so unless you really need the extra performance I'd do it the "obvious" way:

rev_subset = reversed(data[start:stop])

It is error-prone to change the semantics of start and stop. Use None or -(len(a) + 1)
instead of 0 or -1. The semantics is not arbitrary. See Edsger W. Dijkstra's article
"Why numbering should start at zero".

>>> a = range(10)
>>> start, stop, step = 4, None, -1

Or

>>> start, stop, step = 4, -(len(a) + 1), -1
>>> a[start:stop:step]
[4, 3, 2, 1, 0]

Or

>>> s = slice(start, stop, step)
>>> a[s]
[4, 3, 2, 1, 0]


You can use a slice(start, stop, step) object, which is such that

s=slice(start, stop, step)
print a[s]

is the same as

print a[start : stop : step]

and, moreover, you can set any of the arguments to None to indicate nothing in between
the colons. So in the case you give, you can use slice(4, None, -1).

なるほど切り出してからひっくり返すか。

■_

スレッドで書かれたことをまとめようと思ったが時間がが

[ruby-core:34033] The rights of ruby-core people and Myth of ruby-dev
NARUSE, Yui

Some of you may don't know your rights.
Some of you may believe the myth of ruby-dev.
I'll explain them to clear the ruby development process and make it better.

First, all ruby-core people have the right to ask everything you want to know.
# even if we answer "learn floating point number" ;-)
So fell free to ask about ruby; for example
* what's going on with ruby_1_8 branch
* what's going on with ruby 1.9.1
* when we release ruby 1.9.3
* how about ruby 2.0
* why this method works like this
etc.

Most of such question should be documented some where like Redmine's wiki or rdoc.
So to ask such question is also contribution.


Someone believe that many important decision of ruby is made over ruby-dev.
But we discussed important decisions in ruby-core like [ruby-core:32009],
[ruby-core:25285], [ruby-core:25272], [ruby-core:32156] and so on.
Some of them are discussed in both ruby-dev and ruby-core, but topics
are transferred between them.

Someone believe that the detailed behavior of methods are discussed in ruby-dev.
Of course on some cases it is true.
But on many cases I think there are no discussion; it is unspecified behavior
and it is not discussed in neither ruby-dev nor ruby-core nor IRC nor twitter.
For example branching policy, as far as I know, there is no conclusive document.
(Even if some people know Ruby's branching policy is derived from *BSD,
 and ours should follow *BSD's one. [ruby-dev:25635] [ruby-dev:27275])
So if you want to know or specify it, you must post a mail to ruby-core.

As I said above, all of you have rights to ask.
We welcome people who use the rights.
Feel free to ask any questions.

So any questions?

--
NARUSE, Yui 
  
Ryan Davis

On Jan 3, 2011, at 13:55 , NARUSE, Yui wrote:

HELPING!
- Show quoted text -

> * what's going on with ruby_1_8 branch
> * what's going on with ruby 1.9.1
> * when we release ruby 1.9.3
> * how about ruby 2.0
> * why this method works like this

:D
  
Ryan Davis
On Jan 3, 2011, at 13:55 , NARUSE, Yui wrote:

> Some of you may don't know your rights.
> Some of you may believe the myth of ruby-dev.
> I'll explain them to clear the ruby development process and make it better.

I should add further:

Thank you very much for posting this.

It really needed to be said because the "myth" is just more FUD.
  

以下略

派生したスレッドもあったりするんですが。

■_ もなど

とぅぎゃったーとか使うべきなんすかね。

http://twitter.com/#!/jay1905/status/22644582130909186

私みたいに,数学が専門じゃない人に,真正面からMonadの説明をされても,ほとんど理解でき
ないと思います.私も本質的なところは,理解できてない自信があります.が,とりあえず,
haskellを書くための簡単な考え方をつぶやいておきます.


http://twitter.com/#!/jay1905/status/22647544748179457

①haskellでは,計算の結果を一度変数に代入してしまうと,変更できない.②それでも,新し
い変数,新しい変数と代入していけば,計算は続けられる.③でも,それだとあまりにも面倒な
ので,Monadを使う.計算結果をMonadで包むと,普通の変数みたいに何度も代入ができる.


http://twitter.com/#!/jay1905/status/22649895370366976
ここで,returnは,Monadで包むという意味で,<-は,Monadをはがすという意味.だから,
a<-return 1で,aには1が代入される.おんなじ風に,bには2,cには3が代入される(前のdo
文は最後に結果をreturnしないのでエラーになる).


http://twitter.com/#!/jay1905/status/22648775298252800

例えば,整数のInt型だと,代入は1回だけだけど,Monadを使ってIO Int型にすれば,何度代入
してもOKになる.④do構文を使えば,計算を続けられる.例えば,
do {a<-return 1; b<- return 2; c <- return $ a+b}
とする.

http://twitter.com/#!/jay1905/status/22650727667081216

⑤C言語で言うvoidみたいに値を返さない時は,IO ()と書けばいい.例えば,Int型の引数をと
り,なにも返さない(副作用だけさせたい)場合には,
putMessage :: Int -> IO ()
と書いておく.
http://twitter.com/#!/jay1905/status/22651611801190400

⑥ここまでを覚えておけば,Monadが内部でどんな難しいことをしてようが関係なく,値を代入
して,計算して,値を保存しておくことができる.⑦あと,繰り返しとかは,仕方がないので,
再帰で書いたり,mapとかで書く.でも,それは Erlangとも一緒でしょうから,我慢我慢.

http://twitter.com/#!/jay1905/status/22653250570289152
⑧ここまでくれば,段々haskellを書くのが楽しくなって,しかも,haskellは型に厳密で矛盾し
たコードは翻訳系がはじいてくれるので,それを直しているうちに,デバグが完了しちゃう.
⑨プログラマは,その恩恵に浴することができる.そして,みんなが,haskellを使うようになる.


http://twitter.com/#!/jay1905/status/22656406628859904

P.S. なんで普通の代入(=)だと,後から値を変えられなくて,Monadの代入(<-)だと,問題な
いかって,僕も不思議に思うんだけど,きっと,Monadの方は,中に包んである値が変わっても,
いつもMonadだから問題ないってこと,と理解しています.

■_

2011年01月04日

■_

初詣でもと思って神田明神へ行ったのですが、半端でなく混んでて断念。 三が日でもないのになんであんなに…

asakusa.rb RubyKaigi

海軍反省会 の 2 が出てた。

■_ 濁らない

C言語なら俺に聞け(入門編)Part 75 
844 デフォルトの名無しさん [sage] 2011/01/03(月) 20:34:22 ID: Be:
    >>842
    >   /*ユーグリッド距離の計算*/

    正しくは「ユークリッド」(Euclid)ね。

    「マゼンタ」を「magenda」と綴ったりする間違いがあると、
    ああ日本人が書いたんだなって予想がつくw

マゼン「タ」って妙に言いにくかったりするんですよね(で、にごる)。 なんでだろ。

■_


  C言語なら俺に聞け(入門編)Part 75 
855 デフォルトの名無しさん [sage] 2011/01/04(火) 00:20:34 ID: Be:
    int* (***p[MNTS][STS])(int (***[MNTS][STS])());

    ってどう読むんですか?

    先輩に聞いたら、気にしなくてもいいよ
    なんていってたけど、気持ち悪いんで教えてください。

856 デフォルトの名無しさん [sage] 2011/01/04(火) 00:24:00 ID: Be:
    >>855
    K&R嫁

864 デフォルトの名無しさん [sage] 2011/01/04(火) 07:15:07 ID: Be:
    >>855
    関数ポインタテーブルを受け取って処理し、
    関数ポインタテーブルを返す関数、だな
    状態遷移関数を実行するための関数とかか?

865 デフォルトの名無しさん [sage] 2011/01/04(火) 07:34:51 ID: Be:
    >>864
    それを証明してください。

867 デフォルトの名無しさん [] 2011/01/04(火) 10:40:47 ID: Be:
    int型を返す関数へのポインタへのポインタへのポインタの要素数STS個の配列の要素数MNTS個の配列を引数に取りint型へのポインタを返す関数へのポインタへのポインタへのポインタの要素数STS個の配列の要素数MNTS個の配列

877 デフォルトの名無しさん [sage] 2011/01/04(火) 12:32:08 ID: Be:
    >>855
    こんなコードって多用されるの?
    読める人は凄いな

878 デフォルトの名無しさん [sage] 2011/01/04(火) 12:36:29 ID: Be:
    多用はされないだろ。こんなの出てくるなら設計見直す。
    出てくるとしてもtypedefする。

880 デフォルトの名無しさん [sage] 2011/01/04(火) 13:31:21 ID: Be:
    typedef でなんとかなるレベルじゃねーし関数ポインタの引数が出てくるまで煮詰めたコードを汚いからと作り直すバカは居ねえと思うがね

882 デフォルトの名無しさん [sage] 2011/01/04(火) 15:11:36 ID: Be:
    >>880
    >typedef でなんとかなるレベルじゃねーし
    関数ポインタをtypedefしたことがないんですね。

    >関数ポインタの引数が出てくるまで煮詰めたコードを汚いからと作り直すバカ
    妄言過ぎて言葉も出ない

883 デフォルトの名無しさん [sage] 2011/01/04(火) 15:13:48 ID: Be:
    >>882
    関数ポインタはtypedefできねーよ馬鹿

884 デフォルトの名無しさん [sage] 2011/01/04(火) 15:17:56 ID: Be:
    >>883
    できるぞ?

885 デフォルトの名無しさん [sage] 2011/01/04(火) 15:33:37 ID: Be:
    >>883
    嘘つくな

907 デフォルトの名無しさん [sage] 2011/01/05(水) 00:05:28 ID: Be:
    関数ポインタをqsortでしか使ったことないんだけど
    例えばどういった便利な利用方法があーる?

908 デフォルトの名無しさん [sage] 2011/01/05(水) 00:07:18 ID: Be:
    >>907
    qsort

909 デフォルトの名無しさん [] 2011/01/05(水) 00:10:54 ID: Be:
    >>907
    OOP

910 デフォルトの名無しさん [] 2011/01/05(水) 00:15:04 ID: Be:
    >>907
    COM

911 デフォルトの名無しさん [sage] 2011/01/05(水) 00:17:47 ID: Be:
    >>907
    GetProcAddress

912 デフォルトの名無しさん [sage] 2011/01/05(水) 00:29:00 ID: Be:

    追っかけにくいから、関数ポインタが嫌いな人もいる。
    場合分けがはっきりしてる時は、便利かも

913 [―{}@{}@{}-] デフォルトの名無しさん [sage] 2011/01/05(水) 00:53:04 ID: Be:
    g_state = TITLE;

    if(g_state == TITLE){
      title_func();
    }
    else if(g_state == PLAY){
      play_func();
    }

    が

    func_tbl[g_state]();

    になって嬉しく感じられる人がいる

確かにデバッガーでステップ実行して追いかけてるときに関数ポインター(の配列)を 使った dispatch を通ったりすると自分がどこにいるのか見失うことがあるなw

■_

■_

んーむ中途半端なやつばっかだな。

2011年01月03日

■_

F#本、肝心なのを一冊忘れていたっぽいw

「デザインのためのデザイン」を読んでいるのですが、ちょっと気になる記述が。

カードとカラム依存 Fortran では、IBM 704 (1956) の 36 ビットワードを処理しなければなら
ないという理由から、1行は72文字まで使え、行を継続することができた。1行のうち 72文字目
以降の文字は無視される (カードの 73~80カラムは、元々はカードを落としても簡単に元通り
に並べることができるように、プログラムカードに通し番号をつけるのに使われていたのだ!)。
  

36ビットワードのマシンだったということと、一行が72文字まで使えた ということに関係を見出せないのですがどういうことなんでしょうか? 確かに 36 * 2 → 72 ですけど、だから何? てな感じで。 一文字が6ビット(大文字のみだから)で、36ビットレジスターにちょうど6文字分 収まるので識別子の長さが最大6文字になったとかいう話は聞いたことがありますが、 それはここでは関係ないでしょうし。

おしえてえらいひと。

■_ ポイントフリースタイル

ポイントフリースタイルがわからんと事あるごとにぶーたれてますが、


Point-Free style: What is it good for? | OJ's rants

We can see that the above function is written in such a way that the arguments passed
into the function are actually referenced in the body of the code. This is how a
standard imperative programmer would write this function if he/she was new to Haskell.
If we instead used a fold, we could define it like so:

  sum xs = foldr (+) 0 xs

This does exactly the same thing as the previous definition, but as you can see the
grunt work is done by the fold function. Now that we have this definition, we can
easily move to Point-Free style:

  sum = foldr (+) 0

Here we can see that no reference is made to the arguments of the function. Since we
haven't referenced any "points", we have a Point-Free implementation.

Awesome. Cool. Sweet. Nifty.

But what does it give me? Why is it better?

ふたつの例を見ているとなんか閃いたような気がしたんですが、 一晩寝たらまたわからなくなってしまった ○| ̄|_

■_


初心者プログラマにありがちなこと 
16 仕様書無しさん [sage] 2011/01/02(日) 22:46:58 ID: Be:
    上司『キミのルーチンにバグがあようなので見直してくれ』
    新人『コンパイルはエラーがありませんでしたから他の人だと思います』

17 仕様書無しさん [sage] 2011/01/03(月) 02:22:54 ID: Be:
    さすがにそれは無いと思いたい……

仕事ではともかく、質問掲示板なんかではコンパイルに成功したけど動きません なんてのは割りと見ますね。

■_ おとしあな


Pitfalls in R for Python programmers - Stack Overflow

I have mostly programmed in Python, but I am now learning the statistical programming
language R. I have noticed some difference between the languages that tend to trip me.

わたしは主に Python でプログラムを作っていたのですが、今統計プログラミング言語の
R を勉強しています。これら二つの言語の間にはわたしを混乱させたいくつかの違いがあ
ることに気がつきました。

Suppose v is a vector/array with the integers from 1 to 5 inclusive.

1 から 5 までの整数を保持する vector/array の v を仮定します

v[3]  # in R: gives me the 3rd element of the vector: 3
      # in Python: is zero-based, gives me the integer 4
v[-1] # in R: removes the element with that index
      # in Python: gives me the last element in the array

Are there any other pitfalls I have to watch out for?

v[3] in python gives you fourth element of a sequence. in the given case that would be
4. – SilentGhost

@SilentGhost: off course, fixed the mistake. – BioGeek

The title does not accuractely represent the question here - these are not
"pitfalls in R", they are just basic differences between two different
languages. And anyway, v[-1] does not "remove the element" with index 1, it
returns a new vector with every element but the first one. – mdsumner

This isn't specifically addressing the Python vs. R background, but the R inferno is a
great resource for programmers coming to R.


Having written tens of thousands of lines of code in both languages, R is just a lot
more idiosyncratic and less consistent than Python. It's really nice for doing quick
plots and investigation on a small to medium size dataset, mainly because its built-in
dataframe object is nicer than the numpy/scipy equivalent, but you'll find all kinds
of weirdness as you do things more complicated than one liners. My advice is to use
rpy2 (which unfortunately has a much worse UI than its predecessor, rpy) and just do
as little as possible in R with the rest in Python.

For example, consider the following matrix code:

> u = matrix(1:9,nrow=3,ncol=3)
> v = u[,1:2]
> v[1,1]
[2] 1
> w = u[,1]
> w[1,1]
Error in w[1, 1] : incorrect number of dimensions

How did that fail? The reason is that if you select a submatrix from a matrix which
has only one column along any given axis, R "helpfully" drops that column
and changes the type of the variable. So w is a vector of integers rather than a
matrix:

> class(v)
[1] "matrix"
> class(u)
[1] "matrix"
> class(w)
[1] "integer"

To avoid this, you need to actually pass an obscure keyword parameter:

> w2 = u[,1,drop=FALSE]
> w2[1,1]
[3] 1
> class(w2)
[1] "matrix"

There's a lot of nooks and crannies like that. Your best friend at the beginning will
be introspection and online help tools like str,class,example, and of course help.
Also, make sure to look at the example code on the R Graph Gallery and in Ripley's
Modern Applied Statistics with S-Plus book.

コメントで紹介されている R Infelno を見てみたけど、100ページ以上ある代物でふいた。 頭の数ページをちょっと見ただけ。

■_

例のロシア製? 正規表現ライブラリ。


jkff/ire - GitHub

What's this

ire is a library for incremental regular expression matching, based on further
development of the ideas from Dan Piponi's famous blogpost Fast Incremental Regular
Expression Matching with Monoids.

    * ire is for "incremental", "regular", "expressions"

    * incremental means "fast recomputation of results according to changes of input
       string" (not pattern)

    * regular means "regular" - t.i. no backrefs or other Perl magic.

How to use it?
どのように使うのか

Add the target/ire-VERSION.jar to your classpath.

import org.jkff.ire.*;
import org.jkff.regex.RegexCompiler;

// Compile the regexes 正規表現をコンパイル
String[] regexes = {...};
PatternSet pat = RegexCompiler.compile(regexes);

// Index a string (slow)
IndexedString is = pat.match(someString); // or match(someString, blockSize)

// Get matches (fast)
for(Match m : is.getMatches()) {
    int startPos = m.startPos();
    int length = m.length();
    int whichPattern = m.whichPattern();
}

// Here's the "incremental" part. Assume 'a' and 'b' are IndexedString's.
// You can cut and recombine string pieces, it will be fast, and getMatches()
// of the resulting strings will be fast.
IndexedString c = a.append(b);
IndexedString sub = is.subSequence(start, end);
Pair<IndexedString,IndexedString> p = is.splitBefore(i);

(略)

How does it work?

Read Dan Piponi's aforementioned blogpost; here are the differences:

    * Instead of fingertrees, we use a "rope" datastructure with caching sums
      of values in an arbitrary monoid. The rope datastructure is in org.jkff.ire.rope
      package. It uses a constant-height 2-3 tree of N..2N-1 array chunks. Append and
      split operations are quite trivial.

      fingertree ではなく任意のモノイド中の sums of values を catch するデータ構造である
      rope を使っています。rope データ構造は org.jkff.ire.rope パッケージにあります。
      これは constant-height 2-3 tree of N..2N-1 array chunks を使います。
      追加操作と分割操作は非常に trivial です。
      # constant-height 2-3 tree ってなんだろう

    * We not only test for a match, but also find match positions. This is done by 1
      split to find the end of the match and another to find the beginning, with some
      intricacies for overlapping matches. See org.jkff.ire.DFAMatcher class.

       マッチするかどうかのテストだけではなく、マッチの位置も見つけ出します。

    * We use NFA instead of DFA, because we care mostly about number of states (we have
      to compose transition tables) and state blow-up of DFAs is unacceptable. FAs are
      in org.jkff.ire.fa package.

    * We do some optimization of the NFA to further reduce states, see org.jkff.ire.regex.RegexCompiler.
      状態数の数を減らすために NFA の最適化をいくつか行っています。

    * We use a compact representation of NFA as a boolean matrix represented as a bitset,
      with fast multiplication, see org.jkff.ire.fa.PowerIntTable

      NFA のコンパクトな表現のために boolean matrix を表現する bitset を使用しています。

■_

■_

コメント伸びてるなあ。 フォロー記事も書くとかいってる。 Lucas Nussbaum's Blog » Blog Archive » Giving up on Ruby packaging

2011年01月02日

■_

いーもばとアドエスを何かと入れ替えたりするべきなんだろうなあ。 何がいいだろうか。

■_ The most important thing in the programming language

えーとどこで引っかかった情報だっけか。


Nimrod Programming Language

    The most important thing in the programming language is the name. A language will not
    succeed without a good name. I have recently invented a very good name and now I am
    looking for a suitable language. -- D. E. Knuth

    プログラミング言語において最も重要なことがらはその名前である。良い名前なくして
    言語の成功はありえない。最近わたしは非常に良い名前を発明したのだが、現在
    それにふさわしい言語を探しているところである。

This page is about the Nimrod programming language, which combines Lisp's power with
Python's readability and C's performance.

このページは、Lisp のパワーと Python の読みやすさ、C のパフォーマンスを併せ持った
プログラミング言語 Nimrod についてのものです。

Welcome to Nimrod
Nimrod へようこそ

Nimrod looks like this:

# Filter key=value pairs
import re

for x in lines("myfile.txt"):
  if x =~ re"(\w+)=(.*)":
    echo "Key: ", matches[0],
         " Value: ", matches[1]

Nimrod is a new statically typed, imperative programming language, that supports
procedural, object oriented, functional and generic programming styles while remaining
simple and efficient. A special feature that Nimrod inherited from Lisp is that
Nimrod's abstract syntax tree (AST) is part of the specification - this allows a
powerful macro system which allows domain specific languages.

Nimrod is a compiled, garbage-collected systems programming language which has an
excellent productivity/performance ratio. Nimrod's design focuses on the 3E:
efficiency, expressiveness, elegance (in the order of priority).

略

copyright © 2010 Andreas Rumpf | Last update: 2010-10-20

■_ お題拝借

stackoverflow から。


php - Getting $n number of maximum values - Stack Overflow
Hello all,

Straight to the question -

If $n = 3,

and input is -

Array
(
    [04] => 3
    [07] => 4
    [01] => 5
    [06] => 5
    [05] => 5
    [03] => 6
    [08] => 6
    [02] => 7
    [09] => 8
    [12] => 9
    [10] => 10
    [15] => 10
    [19] => 11
    [20] => 11
    [13] => 12
    [21] => 12
    [16] => 13
    [14] => 14
    [22] => 14
    [23] => 15
    [11] => 15
    [00] => 15
    [17] => 17
    [18] => 17
)

Output should be -

Array
(   [14] => 14
    [22] => 14
    [23] => 15
    [11] => 15
    [00] => 15
    [17] => 17
    [18] => 17
)

Thank you, all, for help.

これに対する回答は以下の通り。


Would've been nice if you explained the output a bit. I guess what you want is to have an
array that only contains items with the n different biggest values (14,15,17 for this input).
– schnaader

Yes, that's exactly what I want. – KPL

@KPL: Can you look at my answer once more – Shakti Singh

arsort($array);
function output($array,$n)
{
  $c=0;
  $newArray=array();
  foreach ($array as $key => $value)
  {
    if ($c == $n)
    {
      $newArray[$key]=$value;
      return $newArray;
    }
    if (!in_array($value, $newArray))
    {
        $c++;
    }
    $newArray[$key]=$value;


  }
}

+1 for good logic , want to develope better logics – Rahul Mehta

For the above input, the function outputs Array ( [17] => 17 [18] => 17 [23] => 15 [00] => 15 [11] => 15 [14] => 14 )
The [22] => 14 is missing. – KPL 37

No change at all. :| – KPL

@KPL:- Now, This is what you are looking for – Shakti Singh

A quick hack into Shakti's function. But, is this reliable?

function getMaxValues( $array, $total ) {
    arsort( $array );
    $count = 0;
    $return = array();  
    $total++;
    foreach ($array as $key => $value)  {
        if ( !in_array( $value, $return ) )
            $count++;       
        $return[ $key ] = $value;
        if ( $count == $total ) {
            array_pop($return);
            return $return;
        }
    }       
}

Something like:

function biggest_n(array $a, $n)
{
  $u = array_unique($a);
  if (count($u) <= $n) return $a;
  rsort($u);
  $val = $u[$n - 1];

  return array_filter($a, function($e) use($val) { return $e >= $val; });
}

Ruby でやってみました。 効率とかスピードは一切考えてません :)

irb(main):063:0> x = {
irb(main):064:1*     "[04]" => 3,
irb(main):065:1*     "[07]" => 4,
irb(main):066:1*     "[01]" => 5,
irb(main):067:1*     "[06]" => 5,
irb(main):068:1*     "[05]" => 5,
irb(main):069:1*     "[03]" => 6,
irb(main):070:1*     "[08]" => 6,
irb(main):071:1*     "[02]" => 7,
irb(main):072:1*     "[09]" => 8,
irb(main):073:1*     "[12]" => 9,
irb(main):074:1*     "[10]" => 10,
irb(main):075:1*     "[15]" => 10,
irb(main):076:1*     "[19]" => 11,
irb(main):077:1*     "[20]" => 11,
irb(main):078:1*     "[13]" => 12,
irb(main):079:1*     "[21]" => 12,
irb(main):080:1*     "[16]" => 13,
irb(main):081:1*     "[14]" => 14,
irb(main):082:1*     "[22]" => 14,
irb(main):083:1*     "[23]" => 15,
irb(main):084:1*     "[11]" => 15,
irb(main):085:1*     "[00]" => 15,
irb(main):086:1*     "[17]" => 17,
irb(main):087:1*     "[18]" => 17
irb(main):088:1> }
=> {"[04]"=>3, "[07]"=>4, "[01]"=>5, "[06]"=>5, "[05]"=>5, "[03]"=>6, "[08]"=>6,
 "[02]"=>7, "[09]"=>8, "[12]"=>9, "[10]"=>10, "[15]"=>10, "[19]"=>11, "[20]"=>11,
"[13]"=>12, "[21]"=>12, "[16]"=>13, "[14]"=>14, "[22]"=>14, "[23]"=>15, "[11]"=>15,
"[00]"=>15, "[17]"=>17, "[18]"=>17}
irb(main):095:0> x.group_by{|e| e[1]}
=> {3=>[["[04]", 3]], 4=>[["[07]", 4]], 5=>[["[01]", 5], ["[06]", 5], ["[05]", 5]],
6=>[["[03]", 6], ["[08]", 6]], 7=>[["[02]", 7]], 8=>[["[09]", 8]], 9=>[["[12]", 9]],
10=>[["[10]", 10], ["[15]", 10]], 11=>[["[19]", 11], ["[20]", 11]], 12=>[["[13]", 12],
["[21]", 12]], 13=>[["[16]", 13]], 14=>[["[14]", 14], ["[22]", 14]], 15=>[["[23]", 15],
["[11]", 15], ["[00]", 15]], 17=>[["[17]", 17], ["[18]", 17]]}
irb(main):103:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}
=> [[3, [["[04]", 3]]], [4, [["[07]", 4]]], [5, [["[01]", 5], ["[06]", 5], ["[05]", 5]]],
[6, [["[03]", 6], ["[08]", 6]]], [7, [["[02]", 7]]], [8, [["[09]", 8]]], [9, [["[12]", 9]]],
[10, [["[10]", 10], ["[15]", 10]]], [11, [["[19]", 11], ["[20]", 11]]], [12, [["[13]", 12],
["[21]", 12]]], [13, [["[16]", 13]]], [14, [["[14]", 14], ["[22]", 14]]], [15, [["[23]", 15],
["[11]", 15], ["[00]", 15]]], [17, [["[17]", 17], ["[18]", 17]]]]
irb(main):104:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}[0..2]
=> [[3, [["[04]", 3]]], [4, [["[07]", 4]]], [5, [["[01]", 5], ["[06]", 5], ["[05]", 5]]]]
irb(main):105:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}[0..2].map{|e| e[1]}
=> [[["[04]", 3]], [["[07]", 4]], [["[01]", 5], ["[06]", 5], ["[05]", 5]]]
irb(main):109:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}.reverse[0..2]
=> [[17, [["[17]", 17], ["[18]", 17]]], [15, [["[23]", 15], ["[11]", 15], ["[00]", 15]]],
[14, [["[14]", 14], ["[22]", 14]]]]
irb(main):110:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}.reverse[0..2].map{|e| e[1]}
=> [[["[17]", 17], ["[18]", 17]], [["[23]", 15], ["[11]", 15], ["[00]", 15]], [["[14]", 14], ["[22]", 14]]]
irb(main):111:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}.reverse[0..2].map{|e| e[1]}.reverse
=> [[["[14]", 14], ["[22]", 14]], [["[23]", 15], ["[11]", 15], ["[00]", 15]], [["[17]", 17], ["[18]", 17]]]
irb(main):112:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}.reverse[0..2].map{|e| e[1]}.reverse.flatten
=> ["[14]", 14, "[22]", 14, "[23]", 15, "[11]", 15, "[00]", 15, "[17]", 17, "[18]", 17]
irb(main):113:0> x.group_by{|e| e[1]}.sort_by{|e| e[0]}.reverse[0..2].map{|e| e[1]}.reverse.flatten(1)
=> [["[14]", 14], ["[22]", 14], ["[23]", 15], ["[11]", 15], ["[00]", 15], ["[17]", 17], ["[18]", 17]]

■_

「昨年の一月に」一年で12の言語を勉強すると宣言した方がいらっしゃいまして、 その内訳は以下の通り。


12 New Programming Languages in 12 Months | Coderholic

12 New Programming Languages in 12 Months

January 12, 2010

I've decided to set myself the challenge of learning a new programming language every
month in 2010. That's 12 languages in total. With only a month on each new language
I'm not going to be able to go into much depth, but I'm hoping to at least pick up
some interesting techniques and new ways of thinking that I might be able to apply to
my every day programming with my usual languages (which happen to be Java, Python, PHP
and JavaScript). Who knows, I might even become a convert of one of these languages
and wonder how I've been able to use anything else all these years! Here are the
languages I'm hoping to tackle:

わたしは2010年に、毎月一つずつ新しい言語を学ぶという挑戦を自身に課しました。
合計すると言語は12個になります。
新言語にはそれぞれ一月だけしか時間がないので、
深く知ることはできないでしょう。しかし少なくともいくつかの、
わたしがいつも使っている言語 (Java であったりPython、PHP、JavaScript です)での
日々のプログラミングに応用できるような興味深い手法や新しい思考法を取り上げることが
できるのではないかと希望を持っています。
これらの言語のどれかを入れ替えて、これまでの数年で得られなかったことを
得られるようなものを誰か知りませんか?
#ちがうなー
以下にわたしが取り組もうとしている言語を挙げます。


Clojure

Clojure is a Lisp dialect for the JVM. I've done some reading on Clojure and had a
play with the REPL, so this year I'm finally going to get round to writing some code
with it. From what I've seen so far it looks quite powerful, and the integration with
the Java libraries seems to work nicely.

Clojure は JVM向けの Lisp 方言です。

Factor

Factor is a concatenative programming language, meaning it uses a stack instead of
named variables to pass data around. Seems like a strange concept to me. This will
definitely be an interesting one!

Factor は名前のついた変数の代わりにスタックを使ってデータの受け渡しを行う
concatenative programming language です。


Go

Google announed their Go language in late 2009, describing it as a cross between C++
and Python. It was co-created by by Ken Thompson, who also co-created Unix and worked
on the C programming language.

Haskell

Haskell is a purely functional strongly typed language. It also uses lazy evaluation.
It's got a bit of a reputation for being difficult, but I'm hoping I'll at least be
able to pick up some of the main concepts and put a few small programs together.

Haskell は純粋な関数型の強い型付けを行う言語です。この言語はまた、遅延評価を
行います。

Erlang

Erlang is a concurrent programming language designed for fault tolerant real time
applications. I'm looking forward to learning how Erlang deals with concurrency.

Eralng は fault tolerant なリアルタイムアプリケーション向けに設計された
並列プログラミング言語です。わたしは Erlang がどのように並列性を扱っているのか
知りたいと思っています。

Scheme

I did some Scheme, a Lisp dialect, while at university. I haven't really touched it
since though, so I'm planning to revisit it and maybe dig a little deeper. I'm
thinking about trying The Little Schemer book, or perhaps the online fixnum days
tutorial.

Fantom

Previously called Fan, Fantom claims to be portable across the JVM, .NET CLR, and
JavaScript in the browser! It's on object oriented language with C like syntax, so
there shouldn't be a huge learning curve here. It seems to have some very interesting
features though, so I'm looking forward to trying it out.

この Fantom は以前は Fan と呼ばれていたもので、JVM、.NET CLR、ブラウザ上の JavaScirpt
をまたいだ移植性があると主張しています。この言語は
C に似た構文を持ったオブジェクト指向言語なので、学習曲線はそれほど急激なもの
とはならないでしょう。いくつかの非常に興味深い機能をもっているようなので、
わたしはそれを試してみたいと考えています。

Scala

Another JVM language, Scala is a strongly typed language that “smoothly integrates
features of object-oriented and functional languages”.

Scala はもう一つの JVM 言語で、
“smoothly integrates features of object-oriented and functional languages”
な強い型付けを行う言語です。

OCaml

Objective Caml is a statically typed, object-oriented and functional. I'm sure I'll
pick up some new techniques and ideas from this language.

Objective Caml は静的な型付けを行い、オブジェクト指向であると同時に関数型です。
わたしはこの言語から新しい手法や考え方を得られるだろうと確信しています。

Ruby

Ruby is a scripting language similar in many ways to Python. I've never looked at it
in any detail before because I always thought it was too similar to Python. I'd like
to learn it mainly to give the Rails web framework a try and to see how it compares to
Django.

Ruby は多くの点において Python に似ているスクリプティング言語です。
Python  によく似ていると考えていたので、これまでその詳細を知りませんでした。
わたしがこの言語を学ぼうと思った大きな理由は、web フレームワークの Rails を
試してみて、Django と比較してみたいと考えたからです。

Lua

A small and portable scripting language, Lua is very popular in the game programming
world where it is often used for the scripting of complex 3D engines.

小規模で、移植性のあるスクリプティング言語です。Lua はゲームプログラミングの
分野において非常にポピュラーなもので、しばしば複雑な 3D エンジン向けのスクリプティング
に使われています。

Prolog

I did a little bit of Prolog at University and I remember being blown away by it. It's
a declarative logic programming language, often used in the field of AI.


It's going to be a tough challenge, learning 12 new languages in 12 months. But
hopefully this time next year I'll have picked up some interesting techniques, and
have a few extra tools in my programmer's toolbox. I'll be blogging about my progress
throughout the year, posting my thoughts on these languages along with any code that I
come up with. If you're interested in the updates then you can subscribe to get them
automatically. If you've got any comments about any of the languages or about the
challenge in general then I'd love to hear them!

© Coderholic 2011

一年で12言語と宣言したものの、色々あって


Thoughts on Objective-C | Coderholic

Back in January I set myself the challenge of learning 12 new programming languages in
12 months. It's been a busy year so far though. I got married, had a baby daughter,
and quit my job to work full time on my startup . As a result I've only written about
one new language so far, clojure. I've not given up on the challenge though! Here's
the second new language I've learnt this year: Objective-C.

ほとんど達成できなかったようです。 んで、Objective-Cをやってたり。

■_ フィボナッチ数列

Perl 6 と Haskell とを比較。


Perl 6 Fibonacci versus Haskell « Just Rakudo It

Perl 6 Fibonacci versus Haskell

By colomon

There's been some discussion on reddit today about whether

my @fib := 1, 1, *+* ...^ * >= 100;

is unreadable gibberish or not, with the following Haskell suggested as an
easier-to-understand version.

fib = 1 : 1 : zipWith (+) fib (tail fib)

(I've “corrected” both versions so they start the sequence with 1, 1.)

The first thing to observe here is that this are not the same at all! The Perl 6
version is the Fibonacci numbers less than 100, while the Haskell version lazily
generates the entire infinite sequence. If we simplify the Perl 6 to also be the (lazy)
infinite Fibonacci sequence, we get the noticeably simpler

ここで最初に述べるべきことは、これら二つが等しいものではないということです!
Perl 6 版は100 未満のフィボナッチ数を得るものですが、Haskell バージョンでは
無限シーケンスを遅延評価してフィボナッチ数を生成しています。仮に Perl 6 を単純に
(遅延評価をして) 無限フィボナッチ数列を得るようにすると、次のように
よりシンプルに記述できます

my @fib := 1, 1, *+* ... *;

To my (admittedly used to Perl 6) eye, this sequence is about as clean and
straightforward as it is possible to get. We have the first two elements of the
sequence:

わたしの目には、このシーケンスはこれ以上ないくらい明確で直接的なものである
ように見えます。シーケンスの最初の二つの要素がまずあります:

1, 1

We have the operation to apply repeatedly to get the further elements of the sequence:

この数列の皇族の要素を得るために繰り返し操作を適用します:

*+*

And we are told the sequence will go on forever:

そして、無限シーケンスを次のように指定します:

... *

The *+* construct may be unfamiliar to people who aren't Perl 6 programmers, but I
hardly think it is more conceptually difficult than referring to two recursive copies
of the sequence you are building, as the Haskell version does. Instead, it directly
represents the simple understanding of how to get the next element in the Fibonacci
sequence in source code.

*+* という構造は Perl 6プログラマーでない人には馴染みのないものかもしれませんが、
Haskell 版でやっているような、再帰的なコピーを行って構築しているシーケンスを
参照するよりもコンセプト的に難しいとはとても思えません。

Of course, this being Perl, there is more than one way to do it. Here's a direct
translation of the Haskell version into idiomatic Perl 6:

my @fib := 1, 1, (@fib Z+ @fib[1..*]);

Well, allowing the use of operators and metaoperators, that is, as zipWith (+) becomes
Z+ and tail fib becomes @fib[1..*]. To the best of my knowledge no current Perl 6
implementation actually supports this. I'd be surprised if any Perl 6 programmer would
prefer this version, but it is out there.

If you're insistent on writing function calls instead of operators, you could also say it

my @fib := 1, 1, zipwith(&[+], @fib, tail(@fib));

presuming you write a tail function, but that's an easy one-liner.

Possibly related posts: (automatically generated)


■_

2011年01月01日

■_

あけましておめでとうございます。 今年もよろしくお願いします。 一応今年の抱負(のようなもの)をつらつらと考えてたりするのですが、 別に元日でなくてもよろしかろうと。

一年一言語というのは自分には合わないなあとは以前にも書きましたが、 今年は何か一つ腰を据えて取りかかりたいですね。 候補は選択に困るほどありますが。

なんのかんので一部には名前(と顔)が売れているようで、 2010年は二度ほど献本をいただいたりもしました。 今年はもう少し「自分の」文章を増やしたいとは思うのですが厳しいかなあ。

i, j, k の謎などは今年もゆるゆる追いかけていきます。

■_ Obvious Software Trends for 2011


Obvious Software Trends for 2011

Obvious Software Trends for 2011

December 31st 2010

At this time of year the usual suspects wheel out the prognostications and predictions
for the coming year in software trends. It takes a special blend of arrogance and
painful vainglorious lack of self-awareness to predict the future in public; you'd
have to be a complete fool to do so:


Here's my predictions for software trends in 2011 – The Easy Ones But It's New Year's
Eve And I'm Going Out Edition!

ここに書いたのは、2011年におけるソフトウェアトレンドについてのわたしの predictions
(予測) です。


Lots and Lots and Lots of JavaScript.
Javascript used to be thought in a similar way to pornography, in that the majority of
it is terrible but good enough for purpose, no-one admits to using it that much and,
most of all, it powers most advancements on the web. At long last we're seeing competition
in browsers again, and the combination of performance improvements and local client
resources being used, these things are pushing JavaScript into a credible programming
environment not necessarily tied to just shuffling around DOM elements on a page.

なんのかんのいわれつつも JavaScript は広く使われるようになっています。
#ちょー訳
ブラウザー間の競争だとか性能の改善、使用されるローカルクライアントのリソース
などが、JavaScript をあるページ上のDOM周りに結びつける必要のない、
信頼に足る (credible) プログラミング環境としました。


My prediction is that we'll see credible advances in more Server-side JavaScript
frameworks, in that there has always been this tension between changing language
between the HTTP hop and it seems logical that the tide might turn in the unexpected
direction. JavaScript is a under-appreciated language and people are seeing more and
more elegance in how it can be written.

わたしの予測とは、サーバーサイドの JavaScript フレームワークでより一層の
creible な進歩を目の当たりにするだろうということです。


It also seems likely to me that as well as faster browsers, better client resources usage
and Server-side frameworks we'd likely see better IDE / programming environments appear
for JavaScript – perhaps even proficient on-line editors that bring together DVCS teamwork
(a la github) combined with ‘immediate feedback' UI programming. The VB IDE created a
noisy whirlpool of new corporate applications and it would be interesting to think what a
HTML5/JavaScript/DVCS could do the same to democratize web apps too.

同様に、ブラウザーが速くなればなるほど、クライアントのリソースが潤沢になるほど、
サーバーサイドのフレームワークはより優れた (JavaScirpt向けの) IDE やプログラミング環境の
ようになっていくでしょう。おそらくそれは proficient ですらある
(github などの) DVCS チームワークを ‘immediate feedback' UI programming と
組み合わせたオンラインエディターでしょう。
VB IDE は noisy whirlpool of new corporate applications を作り出し



Things to watch in JavaScript land include various model frameworks, parallel network
frameworks and various pre-processor like frameworks. There's lots happening and if you've
dismissed JavaScript as a ‘secondary environment' or just something where your callstack
disappears then it's worth another look in 2011.

JavaScript界で注目すべきことには、様々なモデルフレームワーク、パラレルネットワークフレームワーク、
プリプロセッサーライクなフレームワークが含まれます。
多くのことが起こり、そしてもしあなたが JavaScript を ‘secondary environment' だと
dismissed していたり、あなたのコールスタックから見失うようなものだと見ていたら、
it's worth another look in 2011.


Mobile, Of Course. In some ways the Mobile years we've got coming up seem to smell of
a do-over of what we've already gone through with desktop software. A fragmented
market, different and always changing hardware bases and something where you try to
predict the future off the back of how good the developer story sounds to you.
Location, cameras and push events, coupled with a device that is intrinsically
networked means that some crazy things are going to be tried and it's an exciting
sector to be in. Exciting can also be dangerous too, in that specialization in one
platform or another is something that would be hard to bet the farm on. Porting apps
is development hell where people who break builds end up.

もちろんモバイルも。



I've had a really enjoyable month back blogging, but due to unfeasibly large amounts
of work and a mild obsession about writing, I now plan to take a short break and start
up again in February. Thanks for reading and Happy New Year – have a great 2011.

blog comments powered by Disqus twitter - feed - about - colophon toto & heroku -
Creative Commons License

Loading

意味するところはわかるつもりなんだけどうまく日本語化できない○| ̄|_ まあ、JavaScirpt重要。ということで。

Obvious Software Trends for 2011 : programming Web 限定の話じゃないのとかケチつけられてますね。

■_

■_

シンタックスエラーも残ってるってどういうことよ ○| ̄|_ > gawk 3.1.76 for mingw


一つ前へ 2010年12月(下旬)
一つ後へ 2011年1月(中旬)

ホームへ


リンクはご自由にどうぞ

メールの宛先はこちらkbk AT kt DOT rim DOT or DOT jp