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

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

一つ前へ 2010年8月(下旬)
一つ後へ 2010年9月(中旬)

ホームへ

2010年09月10日

■_

・あとで書く
13歳からの反社会学
いや面白かった。

■_

◆Moritz Lenz (Perl 6): Protected Attributes Make No Sense
http://perlgeek.de/blog-en/perl-6/protected-attributes-make-no-sense.html

In C++, you can declare an attribute or a method as "protected". Which means that it 
is private, but subclasses can still access them.

C++ では、、ある属性やメソッドを“protected”と宣言することができます。
これは、宣言されたそれが private であるけれどもサブクラスからはそれらにアクセス可能
であるという意味です。

This makes just as much sense as saying you only get access to these attributes if you 
wear a funny yellow hat.

これはあなたが奇妙な黄色い帽子(ってなに?)を被っていればそれらの属性にアクセスする
と宣言するのと同じようなことです。
#びみょー

I'll try to explain why.
なぜなのかを説明します。

Encapsulation has the advantage that you can change the implementation of a class 
without changing the API. If you write a library, that means you don't break your 
user's code if you change some internals.

encapsulation には、APIを変更することなしにクラスの実装を変更できるという
利点があります。あなたがライブラリを書いているのなら、これはあなたがライブラリの内部を
多少変更したとしても、なたのライブラリのユーザーのコードを壊すことがないということです。


However your users can not only instantiate your classes, but they can also inherit 
from them. Which means they can put a funny yellow hat on. There is no restriction as 
to whom can inherit from your classes. Which makes protected attributes part of the 
public interface.

けれども、あなたのライブラリのユーザーはクラスをインスタンス化できるだけでなく、
それらを継承することもできます。
あなたのクラス群から継承できる人たちに対するのと同じように、そこには制限はありません。
Which makes protected attributes part of the public interface.


So, if you want to change the implementation of a class, you can't change how a 
protected attribute or method works, and what data it stores. If you do, you break all 
subclasses. Which not only exist in your own source tree, but in your user's source 
tree too. If you think that changing the implementation will also change protected 
attributes or methods, make them private.

ですから、もしあなたがあるクラスの実装を変更したいというのなら、あなたは protected な
属性やメソッドがどのように振舞っているのかや、それらが格納しているデータを変更できません。
仮にやってしまったなら、すべてのサブクラスを破壊することになります。
あなた自身のソースツリーに存在するものだけでなく、
あなたのユーザーのソースツリーにあるものも一緒なのです。
もしあなたが実装を変更するのと一緒に protected な属性やメソッドを考えているのなら、
それらは private にしてしまいましょう。

So if protected methods are essentially part of the public API anyway, why not declare 
them as public? Why require your user to wear a funny yellow hat (aka declare an 
inheritance relation) while using your class? There is no good reason.

では、protected なメソッドがなんらかの public な API の重要な部分 (essentially part)
であるのなら、なぜそのメソッドを public にしないのでしょうか? 
なぜあなたのユーザーはあなたのクラスを使っている間に奇妙な黄色い帽子
を被ることを要求しないのでしょうか?
きちんとした理由はありません。

When seasoned C++ programmers hear that, they often respond with "but if I declare my 
private data as private a subclass doesn't have access to it! How can it work 
properly?". The answer is simple: You must provide a sufficiently powerful public API. 
Your users will be grateful.

年季の入った C++ プログラマーたちがこれを聞いたとき、彼らはよく
"but if I declare my private data as private a subclass doesn't have access to it!
How can it work properly?".
(だってこの private データを private って宣言したらサブクラスでアクセスできなくなるじゃないか!
どうすれば適切に動作できるんだい?) 
という反応を返してきました。それに対する回答は単純なもので、
あなたは効率が良く強力で public な API を提供しなければならない。そうすれば
あなたのユーザーは grateful になるでしょう。というものです。


One more thing: people often come up with an analogy to the real world, and claim that 
your kids also have access to your house or flat. This analogy is broken, because in 
the real world the parents have to take actions to get children (or give somebody the 
same status as your children). In the programming world, every outsider can write a 
child class of your classes.

もうひとつ:
人はしばしば現実世界に対する analogy へと至り、
あなたの子供たちもまたあなたの家や flat (アパートのような住居) にアクセスしていではないかと主張します。
このアナロジーは broken です。それは、現実世界では親というのは子供たち
(あるいはあなたの子供のような status の誰か) に対してアクションを取らなければならないからです。
プログラミングの世界では、すべてのアウトサイダーはあなたのクラス群の子クラスを記述できるのです。


(The reason I posted this in the Perl 6 section of this blog is that Perl 6 has no 
protected attributes. Which has spawned many interesting discussions, which were the 
precursor to this blog post.
わたしがこれを、このblogの Perl 6 のセクションにポストした理由は、Perl 6には
protected 属性がないからです。)
  

眠い。あとでやる。

■_ 化

boxing → ボックス化という訳をみてそりゃあないだろうというのは以前に書いたことがありますが、 ~化 というとこいつもあったのを思い出しました。

カプセル化とは【encapsulation】 - 意味/解説/説明/定義 : IT用語辞典
カプセル化 【encapsulation】


オブジェクト指向プログラミングが持つ特徴の一つ。データとそれを操作する手続きを一体化し
て「オブジェクト」として定義し、オブジェクト内の細かい仕様や構造を外部から隠蔽すること。
外部からは公開された手続きを利用することでしかデータを操作できないようにすることで、個々
のオブジェクトの独立性が高まる。カプセル化を進めることによりオブジェクト内部の仕様変更
が外部に影響しなくなり、ソフトウェアの保守性や開発効率が高まり、プログラムの部分的な再
利用が容易になる。

というのがまあ一般的な定義だろうとは思うのですが、 「カプセルに封じ込める」という意味合いであって、 それを「~化」とするのは違うような気がするのですね。 手元にあった大辞林をみると

化(接尾)

主に漢語の名詞に付いて、そういう物、事、状態に変える、または変わるという意を表す。
「映画―」「自由―」「液―」など。
  

状態に変えるということなんでしょうか。 でも、本来(?)はカプセルにするいうのは手段であるし

encapsulation の意味 - 英和辞典 Weblio辞書
http://ejje.weblio.jp/content/encapsulation

encapsulate
1 〈…を〉カプセルに包む,さやに入れる.
2 〈事実・情報などを〉要約する.

  

というのから「カプセルにする」というのを導き出すのはちと無理があるのではなかろうかと。

encapsulation の意味 - 英和辞典 Weblio辞書
ライフサイエンス辞書プ

encapsulation

(解剖) 被包, 封入, カプセル封入
Encapsulation - Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/Encapsulation

Encapsulation

Encapsulation may refer to:

Chemistry

   * Molecular encapsulation, in chemistry, the confinement of an individual molecule 
     within a larger molecule

   * Capsule (pharmacy), in pharmacy, the enclosure of a medicine within a relatively 
     stable shell for administration

   * Micro-encapsulation, in material science, the coating of microscopic particles 
     with another material

Computing

   * Encapsulation (networking), the process of adding control information as it 
     passes through the layered model

   * Encapsulation (computer science), in computer science, to include behavior in the 
     same container as data
         o Encapsulation (object-oriented programming), as specifically used in
           object-oriented programming"

  

まあ「正規表現」なんかと一緒で、いまさらどうにもならんでしょうねえ。 「ボックス化」は阻止したいけど(笑)

■_

なんかルー語っぽいな。


Mechanism versus Policy - Modern Perl Books, a Modern Perl Blog

Mechanism versus Policy

By chromatic on August 23, 2010 2:32 PM

First, read Tyler Curtis's Age discrimination in Perl 6 using subsets and multiple dispatch.

http://blogs.perl.org/users/tyler_curtis/2010/08/age-discrimination-in-perl-6-using-subsets-and-multiple-dispatch.html


You can do everything in that post manually in Perl 5. (You're better off using a
module such as MooseX::MultiMethods to handle the plumbing for you, but the point
stands.) That's the fallacy of the Turing tarpit and the Blub programmer: everything
is possible, but language support makes certain constructs easy and obvious, and easy
and obvious code tends to exist.

彼のポストにあったすべては Perl 5 でも manually に行えます。
(You're better off using a module such as MooseX::MultiMethods
to handle the plumbing for you, but the point stands.)
それは the Turing tarpit and the Blub programmer の fallacy (誤った見方、考え)
なのです。なんでも可能であっても言語サポートが certain constructs を easy and obvious
(簡単かつ明瞭?) にし、そして easy and obvious なコードが残る傾向があるのです。

If you think about Tyler's post that way, you can squint and see a general language
design principle at work. Let me belabor the point somewhat more. Consider how to
declare a new class in Perl 5. You have multiple possibilities. A class is merely a
namespace, so:

もしあなたが Tyler のポストした方法について考えているのなら、
general language design principle at work を squint したり see できるでしょう。
更に詳細を述べます。Perl 5で新しいクラスをどのように宣言するかを考えてみましょう。
複数の可能性があります。クラスとは単なる名前空間です。ですから、

package My::Class { ... }

That's well and good, and it works. Now do it at runtime:

eval "package $classname { ... }";

Again, that works. Yet if you consider the Class::MOP approach, you can start to see
the flaw:

繰り返しますが、これは期待通り動作します。さらに Class::MOP アプローチについて考えてい
るのなら、次のやり方を調べることから始められます:

my $class = Class::MOP::Class->create( $classname );

I admit the flaw isn't staggeringly obvious until you need to add methods to the class.
Again, it's not awful in standard Perl 5:

このクラスにメソッドを追加する必要に迫られるまで、この欠点は staggeringly obvious (明
白?) ではないとわたしは admit します。念を押すようですが standard Perl 5 ではこれは 
awful ではありません。

sub My::Class::method { ... }

... or at runtime:

{
   no strict 'refs';
   *{ $classname . '::' . $methname } = $method_ref;}

... but how ugly when compared to:

$class->add_method( $methname, $method_ref );

The difference is the design principle at work: specify policy, not mechanism. In
other words, the problem with the standard Perl 5 approach is that the how of how you
store a subroutine in a package overshadows the intent of the approach. What's
important is not symbolic references to typeglob slots in packages which represent
classes. What's important is adding a method to a class.

この違いは the design principle at work です:
policy を specify するのであって、mechanisum を specify するのではありません。言い換え
ると、標準的な Perl 5 のアプローチについての問題点とはパッケージの中にサブルーチンを格
納するという方法がそのアプローチの意図を overshadows (わかりにくくする?) してしまうとい
う点にあります。重要なのはクラスを表現するパッケージの中に型グロブスロットへのシンボリ
ックリファレンスがあるということではなく、クラスにメソッドを追加するということです。

The same rule applies when specifying type constraints on function parameters or
multidispatch candidates or even declaring classes themselves:

関数のパラメーターに対する型制約やマルチディスパッチの候補を specify するときや
クラスそれ自身を宣言するときにも同じルールを適用します


class My::Class {
   method awesome_method { ... }}

... because even as much as I know how to implement a language on top of a virtual
machine (or how to compile a language to native code), at the point where I read this
code, much less write it, I don't care about the mechanism. I care about defining the
policy.

わたしがコードのこの部分を読んだとき、mechanism に関しては気になりませんでした。
わたしが気にしたのは policy の defining についてです。

■_ 食指


食指動く:原文・書き下し文・意味 - Web漢文大系
食指(しょくし)動(うご)く

    * 〔出典〕 『春秋左氏伝』宣公四年
    * 〔解釈〕 《鄭(てい)の子公が人さし指が動いたのを見て、ごちそうにありつける前兆であると
                言ったという、「春秋左伝」宣公四年の故事から》食欲が起こる。転じて、ある物事に
                対し欲望や興味が生じる。「条件を聞いて思わず―・いた」(Yahoo!辞書 大辞泉 【食指が動く】)

楚人獻黿於鄭靈公。公子宋與子家、將入見。子公之食指動。以示子家曰、他日、我如此、必嘗異
味。及入、宰夫將解黿。

ということなんですが、 フナハシ学習塾その他39 正しくは、 「食指を動かす」 である。 気持ち悪い言葉の誤用 食指は「動く」ものであって、「動かす」ものではありません。 「食指が動く」ご馳走にありつける前兆 ことば雑録(26) 2009/11/04(水) 14:00:06 [サーチナ] 「食指が動く」という故事は『春秋左氏伝』に出てくる。

自分も気をつけようっと。 実は間違いだろうと指摘しようとして調べてみたら自分の方が間違っていたというのは 何回もあった(苦笑)

■_ 本日の巡回から

2010年09月09日

■_

台風一過でだいぶ涼しくなりましたね。

■_ VBA

今回知った事実(笑)

  Dim V  'バリアント型

  V = Range("A1:J10")

とかやると、シートの特定の範囲(上の例では A1 から J10 までの10×10)を変数に配列として代入します。 これはまあ以前から知っていたのですが、この逆が良くわからなかったのですね。 配列に対してごちゃごちゃやった後でそれをシート(セル範囲)に書き戻すにはどうすればよいのかという。

  Range("A1:J10") = V

が期待通りに動くのは当然として、 この配列の大きさが実行時に決まるようなものだったらどうすればよいのか? Range の引数を動的に組み立てるしかないのかなあと思っていたのですが (文字列でもいいし、Range(Cells(m, n), Cells(o, p)) みたいにしても OK)、

Excel(エクセル)VBA入門:セル範囲の指定方法
Resizeプロパティ

    * 【構文】expression.Resize(RowSize, ColumnSize)
          o RowSize:新しい範囲の行数
          o ColumnSize:新しい範囲の列数 
    * セル範囲の行数×列数を変更します。
    * セル範囲B2から2行×3列に変更します。
          o
            Sub rei830()
              Worksheets("Sheet1").Activate
              Range("B2").Resize(2, 3).Select
            End Sub

これを使って、

  Range("A1").Resize(Ubound(V, 1), Ubound(V, 2)).Value = V

でいけたという (V はここで、二次元配列だとします)。 こうやって染まっていくのね…(笑)

実際のところ、配列で計算をごにょごにょのところは R を使いたいところなんですけどね。 あと、シートのようなデータ型(というかオブジェクト?)があって、それに対する操作を サポートするマクロ言語を備えたアプリケーションってのはどんなものがいいのかなあと ちょっと考えたり。

■_ これはひどい

まあ5年前のページではあるんだけど php 入力チェック 正規表現 - Yahoo!知恵袋 経由で。


JavaScript – 書式をチェックするには | TK Factory

数値チェック(マイナス符号あり)

/**
 * マイナス符号チェックを行います。
 * ・パターンマッチ 0~9、"-"
 * ・マイナス符号の数 0 or 1
 *
 * 例)
 * -123 --> OK
 * 123 --> OK
 * - --> NG
 * 123- --> NG
 * --123 --> NG
 *
 * @param argValue チェック対象文字列
 * @return チェックOKの場合はtrue、
 * チェックNGの場合はfalse
 */
function isMinus(argValue)
{
    if (argValue.match(/[^0-9|^\-]/g))
    {
        // パターンマッチ 0~9,"-"以外はNG
        return false;
    }
(略)
}

数値チェック(小数点あり)

 * 小数点チェックを行います。
 * ・パターンマッチ 0~9、"."
 * ・小数点の数 0 or 1
 * ・整数部の桁数チェック
 * ・小数部の桁数チェック
 *
 * 例)整数部 3, 小数部 2の場合
 * 123 --> OK
 * 123.45 --> OK
 * 1.2 --> OK
 * 1234.56 --> NG
 * 123.456 --> NG
 * . --> NG
 * .123 --> NG
 * 123. --> NG
 *
 * @param argValue チェック対象文字列
 * @param argIntKetasu 整数部の入力可能桁数
 * @param argDecimalKetasu 小数部の入力可能桁数
 * @return チェックOKの場合はtrue、
 * チェックNGの場合はfalse
 */
function isDecimal(argValue, argIntKetasu, argDecimalKetasu)
{
    if (argValue.match(/[^0-9|^.]/g))
    {
        // パターンマッチ 0~9,"."以外はNG
        return false;
    }

(略)
}

数値チェック(マイナス符号あり・小数点あり)

/**
 * マイナス符号付小数点チェックを行います。
 * ・パターンマッチ 0~9、"-"、"."
 * ・パターンマッチ "-","."のみはNG
 * ・マイナス符号の数 0 or 1
 * ・小数点の数 0 or 1
 * ・整数部の桁数チェック
 * ・小数部の桁数チェック
 *
 * 例)整数部 3, 小数部 2の場合
 * -123 --> OK
 * 123 --> OK
 * 123.45 --> OK
 * -123.45 --> OK
 * 1.2 --> OK
 * - --> NG
 * 123- --> NG
 * --123 --> NG
 * 1234.56 --> NG
 * 123.456 --> NG
 * . --> NG
 * .123 --> NG
 * 123. --> NG
 * -. --> NG
 *
 * @param argValue チェック対象文字列
 * @param argIntKetasu 整数部の入力可能桁数
 * @param argDecimalKetasu 小数部の入力可能桁数
 * @return チェックOKの場合はtrue、
 * チェックNGの場合はfalse
 */
function isMinusDecimal(argValue, argIntKetasu, argDecimalKetasu)
{
    var minusFlg = false;
    var decFlg = false;
    if (argValue.match(/[^0-9|^\-|^.]/g))
    {
        // パターンマッチ 0~9,"-","."以外はNG
        return false;
    }
    if (argValue.match(/[^\-|^.]/g))
    {
    }
    else
    {
        // パターンマッチ "-","."のみはNG
        return false;
    }
(略)
}

こういうページを探し当ててしまう方もどうかと思うけど(運がいいんだか悪いんだか)、 /[^0-9|^\-|^.]/ とか頭が痛くなってきた。

■_ Essential Philosophy for Perl 5 Novices


Essential Philosophy for Perl 5 Novices - Modern Perl Books, a Modern Perl Blog

Essential Philosophy for Perl 5 Novices

By chromatic on September 6, 2010 12:49 PM | 2 Comments | No TrackBacks

(略)

We're experimenting this month with a combination of novice-friendly primers and 
deeper subjects. We'd love to attract more people interested in Perl but not 
necessarily experts as well as people who've never written much Perl at all. Tell your 
friends.

... and for a preview of my talk, I'll explain:

    * The two types of context in Perl 5
      Perl 5 には二つのコンテキストの型があること

    * What context really means, and why you already understand it
      コンテキストが本当に意味しているもの、そしてなぜすでにあなたはそれを理解しているのか

    * What implicit variables really mean and why you already understand them
      暗黙の変数(?) が本当に意味しているものと、なぜすでにそれを理解しているのか

    * What concision means and why it's not as scary as you think
      簡潔さの意味するものと、それがなぜあなたの考えるほどには怖いものでないのか

    * How to chunk Perl expressions into parts you already understand

    * How to navigate the Perl 5 documentation

If you can't make the meeting, I'm sure a podcast will eventually appear. You could 
also read the draft of Modern Perl chapter 1 for an overview.

■_

あとで訳…している余裕があるといいなあ。


Syntactic flexibility and programming language survival | morungos.com
Syntactic flexibility and programming language survival
Fri, 09/03/2010 - 21:58 — stuart

I'm thinking about Perl, and how people can possibly believe the community is anything 
less than vibrant. As some may know, I used to be a Common Lisp developer, and Common 
Lisp has a lot in common with Perl. I haven't done too much with Lisp for the past ten 
years, but when I did work in it (between 1985 and 2000, more or less) all the time 
there were questions over its survival. Sorry, everyone, Common Lisp is still here.

There is a reason why Perl has survived so well, and why it will continue to do so. 
The reason is subtle, and one of the less apparent aspects of Perl, and one that is 
sometimes criticized, its very malleable syntax.

以下略

■_ ひざぽん

なんか判った気になった!


SchemeとHaskellで部分適用と関数合成のシンプルなサンプルのチャンプルー。 - このブログは証明できない。


手を動かさないと。部分適用と関数合成を言語仕様でサポートしているHaskellで。Haskellっぽ
いコードではないかもしれませんが、Schemeの例にならって書いてみました。まずは、ふつうに。

main = print $ foldr (\e acc ->
  (case e of
    e | (e `mod` 15) == 0 -> "fizzbuzz"
      | (e `mod` 5) == 0 -> "buzz"
      | (e `mod` 3) == 0 -> "fizz"
      | otherwise -> show e):acc)
    [] $ [1..100]

部分適用と関数合成を使って。

main = print $ foldr (\e acc ->
  let p = (== 0) . (mod e)
  in (case e of
        e | p 15 -> "fizzbuzz"
          | p 5 -> "buzz"
          | p 3 -> "fizz"
          | otherwise -> show e):acc)
  [] $ [1..100]




かんたんに、書き換えの流れをかいてみますね。

まず、ふつうに。

let f x = mod 15 x == 0
f 5 --=> True

(==)と括弧で囲むと、前に置けます。ふつうの関数の感覚です。

let f x = (==) 0 $ mod 15 x

引数0を与えて、部分適用。

let f x = (== 0) $ mod 15 x

modのほうも、部分適用。

let f x = (== 0) $ (mod 15) x

関数合成。

let f x = ((== 0) . (mod 15)) x

両辺から、xを取り除けます。

let f = (== 0) . (mod 15)
f 5 --=> True

できたー。


ちなみに、割られる数をxにすることもできます。flip関数を使うと、引数の順序が逆になります。

let f = (== 0) . ((flip mod) 5)
f 15 --=> True



このように、コードを高度に抽象化できるのが関数プログラミングのメリットである気がします。
でも、気がするだけかもしれないので、もっと勉強したいですね。9LISPはそういうテーマを扱
ってもいいのではないでしょうか。それだけに限定するわけではなく。よりよいプログラミングを!


ポイントフリーのところをもう一回やってみよう。 たぶん上の手順の逆が頭の中で再生できてないんだよな。

■_

2010年09月08日

■_

このところ0時をまわると急激に眠気が…

・その名前はないだろう
Xbox 360を組み込んだゲーム用PC「Big O」- 米国で7,669ドルから | パソコン | マイコミジャーナル 米Origin PCは7日(現地時間)、ケース内にXbox 360 Slimを組み込んだゲーム用PC「Big O」を発表した。 It's Show Time!
EMOTION the Best THEビッグオー DVD-BOX 超合金魂 ビッグオー

■_

いまでこそ欠点も目につくようになったけど、このXS を使った拡張の作成をサポート したってのは、Perl 5での大きな飛躍の一つだろうと思っています (それ以前にはそういう「拡張」ができるこの種の言語ってなかったですよね)。


Less XS/More Ctypes - Modern Perl Books, a Modern Perl Blog
Less XS/More Ctypes

By chromatic on September 3, 2010 1:55 PM 

Perl is in better shape now than ever, but there's much left to improve. (I wrote Five 
Features Perl 5 Needs Now almost two years ago, and four of five are available in 
whole or in sufficient substitute, so that's great progress.)

Rather than criticize Perl for what's going wrong (as if I were any position to do so), 
I prefer to suggest new areas of improvement.

One of the biggest possible improvements to the world of Perl 5 is a replacement for 
many cases of XS. Ryan Jdoubi's Ctypes for Perl was on my original list, and it's 
still on my list.

Why is this important?

XS can be inscrutable. Try reading the documentation, spread out between perlxstut and 
perlapi, with liberal use of the Cozens and Jenness book Extending and Embedding Perl 
and, ultimately, trawling through-even copying and pasting-chunks of the Perl 5 core 
which seems to do what you want.

Now debug typemap problems, problems with contexts in threaded versus unthreaded 
builds, and the vagaries of Makefile syntax across various platforms, not to mention 
the joy of detecting whether you have the right version of a shared library and its 
development headers on a version of an operating system you've never seen, let alone 
used, and (oh yes) Windows.

It's no wonder people want pure-Perl modules when possible.

略

■_ あとで

200個近く回答が寄せられています。


Are you programming for fun? : programming

Most programs are born because there is a problem to solve, however given the recent 
submissions (the lolcode compiler for example) it's clear that sometimes the problem 
is: i'm bored, let's do something fun.

What's that little side project you are working on just for the geek factor without 
paychecks in sight?

楽しんでプログラミングしていますか?

■_ 不思議不思議

とはいうもののそうでもないような(事情を知っている人には)。


Two Surpising Things about R « Radford Neal's blog

Two Surpising Things about R
R に関する二つの驚くべきこと

August 15, 2010


略

Here's the even more surprising thing.  It occurred to me that before rushing out and 
using this feature, I should check that it doesn't introduce some horrible 
inefficiency, as might be the case if curly brackets were optimized for their more 
common use in grouping statements.  So I did a little test, as follows:

> a <- 5; b <- 1; c <- 4
> f <- function (n) for (i in 1:n) d <- 1/{a*{b+c}}
> g <- function (n) for (i in 1:n) d <- 1/(a*(b+c))
> system.time(f(1000000))
 user  system elapsed
 3.92    0.00    3.94
> system.time(g(1000000))
 user  system elapsed
 4.17    0.00    4.17

Using curly brackets speeds the program up by about 6%!

That's with R version 2.9.2 on a Windows XP machine. Of course I ran it several times 
to be sure that results were consistent. And I ran it on two other versions of R, on 
Intel Solaris and Sun SPARC machines, with similar results.

I'm having difficulty imagining how curly brackets can be more efficient than 
parentheses. Could there be a dispatch operation somewhere in which a curly bracket 
operator gets recognized faster than a parenthesis operator? But surely any such 
search wouldn't be done by linearly, or by any other method where this could happen. I 
could imaginge some strange accidental effect of caching, except that it's consistent 
over different versions of R and different machine architectures.

The second surprising thing is how long it takes R to square all the numbers in a 
vector.  Consider the following:

> a <- 1:10000
> f <- function (n) for (i in 1:n) b <- a^2
> g <- function (n) for (i in 1:n) b <- a*a
> system.time(f(1000))
 user  system elapsed
 0.58    0.00    0.58
> system.time(g(1000))
 user  system elapsed
 0.16    0.00    0.16

So multiplying the vector by itself is about 3.6 times faster than squaring it the 
obvious way with ^2. This is again R version 2.9.2, released 2009-08-24.

My first thought was that R treats ^2 as a general exponentiation operation, requiring 
taking a log, multiplying by two, and then exponentiating. But no, as seen below, a 
general exponentiation takes even longer

> h <- function (n) for (i in 1:n) b <- a^2.1
> system.time(h(1000))
 user  system elapsed
 2.15    0.00    2.15

So my guess is that R does check for an exponent being exactly two, and treats that 
specially, but that it does this check again and again, for every element of the 
vector.

The speed gain from replacing a^2 with a*a is enough to justify this replacement in 
time-critical code, even though it makes the program less readable. But perhaps 
squaring will be (has already been?) made faster in a later version.

丸カッコでなくブレースで囲った方が(微妙に)速いというのはちょっと理由が分からないけど (R特有の事情がありそうな)、後者の二乗するのに ^2 とするか、自分自身を掛けるのかというのは まあ当たり前の話のような気もするので、surprising とかいわれましてもw

■_ 本日の巡回から

2010年09月07日

■_

・引退
ベイスターズにいたこともある福盛投手が引退だとか。 佐々木がFAでマリナーズにいったあとにいろいろあったなあ。

■_ あとで

見出しが目についたのであとで読んでみよ。

Steve Jobs “never had any designs. He has not designed a single project” | The Reinvigorated Programmer
Steve Jobs “never had any designs. He has not designed a single project”
Posted on September 6, 2010 by Mike Taylor

Back when I reviewed Peter Siebel's fascinating book of programmer interviews, Coders at Work,
Erik Anderson suggested in a comment that I might also enjoy its precursor Programmers at Work
 [amazon.com, amazon.co.uk].  I bought and read it, and it's excellent.  I'll review it
properly some time soon ? but today I just wanted to draw attention to one segment that
caught me completely off guard.

(略)

The Gates interview was particularly fascinating, but the one that caught my eye was 
with Jef Raskin, the creator of Apple's Macintosh project.  Raskin does not have a 
lot of good things to say about Steve Jobs!

In recent years, quite a mythology seems to have grown up around Jobs: the standard 
wisdom is that Apple's resurgence has come about because of his unique design 
aesthetic — if you like, almost that Apple is Jobs's plaything and that whatever nice 
products come out of it for the rest of us are just a bonus.  It's generally thought 
that Jobs's vision of “a computer for the rest of us” was the driving idea behind 
the Mac.

http://www.reddit.com/r/programming/comments/daabf/steve_jobs_never_had_any_designs_he_has_not/

■_

こっちも。

What is the purpose of the parentheses in Perl's `foreach` statement? - Stack Overflow
I always wonder why I must write

foreach my $x (@arr)

instead of

foreach my $x @arr

What is the purpose of the parentheses here?

■_

== や != も繋げられたのか。気がつかなかった。

Python 2.7 (r27:82525, Jul  4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 1 < 2 < 3
True
>>> 1==1
True
>>> 1==1==1
True
>>> 2==2==2
True
>>> 2==2<3
True
>>> 2==2<1
False
>>> 2!=3==3
True
>>> 3==3!=-1
True
>>>

■_ 激論

Python ネタ二つめ。Python スレで。


Pythonのお勉強 Part39 
234 デフォルトの名無しさん [sage] 2010/09/06(月) 23:47:52 ID: Be:
    あるクラス X のオブジェクトを生成するには、Python では X() とします。
    このとき X.__call__() が呼ばれると思ってたんですけど、違うんでしょうか。
    自分で X.__call__() をクラスメソッドとして上書きしたのに、X() の挙動はかわりませんでした。

    >>> class X(object):
    ...  @classmethod
    ...  def __call__(cls): # X() のとき呼ばれるはず
    ...   print 'hello'
    ...   print 'cls=%r' % cls
    ...
    >>> x = X() # 挙動はかわらない
    >>> x()
    hello
    cls=<class '__main__.X'>

    なぜでしょうか。

235 デフォルトの名無しさん [] 2010/09/07(火) 00:29:50 ID: Be:
    クラスのインスタンスが生成されるときはコンストラクタ __init__ が呼ばれる
    インスタンスを関数みたいに使うとき(?)に呼ばれるのが __call__

236 デフォルトの名無しさん [sage] 2010/09/07(火) 00:34:44 ID: Be:
    >>235
    __init__() は __call__() 内部で呼ばれているだけだから、今回の話にはあまり関係ないですよね。
    X.__call__() をクラスメソッドで定義したのに上書きされないのはなぜ?という話なので。 

237 デフォルトの名無しさん [sage] 2010/09/07(火) 00:42:34 ID: Be:
    >>> help(classmethod)
    It can be called either on the class (e.g. C.f()) or on an instance.......

    らしい。だからクラスでもインスタンスでも呼べるメソッドという扱いになるからちゃんと __call__(cls) はクラスメソッドになってる。
    インスタンスから呼べないようなものは staticmethod を使う。 

238 デフォルトの名無しさん [] 2010/09/07(火) 00:47:53 ID: Be:
    __init__ ではなく __call__ で処理しなければならない理由とは? 

239 デフォルトの名無しさん [sage] 2010/09/07(火) 01:24:03 ID: Be:
    >>237
    クラスメソッドの定義方法を質問したんじゃありません。
    あとstaticmethodはインスタンスからも呼べます。

    >>238
    挙動を質問しているだけなのに、理由が必要ですか?
    理由をあえていえば、Pythonでは X() を実行すると実際には X.__call__() が
    実行されるというふうに聞いたのですが、
    実際に上書きして試してみたけど上書きされなかった、のが理由です。

240 デフォルトの名無しさん [sage] 2010/09/07(火) 01:57:42 ID: Be:
    X.__call__() と X().__call__() は違う

    X.__call__() はクラスオブジェクトの __call__ で X().__call__() はインスタンスの __call__ が呼ばれることになる
    だからインスタンスの関数呼び出しをエミュレートする __call__ をクラス定義内で上書きしても無駄なんじゃない
    よく解らないけど 

241 デフォルトの名無しさん [sage] 2010/09/07(火) 05:02:40 ID: Be:
    メタクラスでググれ 

242 デフォルトの名無しさん [sage] 2010/09/07(火) 09:20:27 ID: Be:
    >>240
    >X.__call__() と X().__call__() は違う

    それはわかってます。だから class X のクラスメソッドとして __call__ を定義したんじゃないですか。
    234のコードをもう一度見てみてください。

    >>241
    メタクラスもあまり関係なくないですか?
    X() を呼び出したとき、実際には X.__call__() が呼び出されるはずだけど、
    実際に上書き定義してみたけど挙動が変わんないよという話です。
    メタクラス、関係ありますか? 

243 デフォルトの名無しさん [sage] 2010/09/07(火) 09:25:07 ID: Be:
    >>242
    http://d.hatena.ne.jp/hope-echoes/20080409/1207732499
    >この理解は後にメタクラスを学習する際に役立つ。 

244 デフォルトの名無しさん [sage] 2010/09/07(火) 09:34:44 ID: Be:
    >>> X() # 1
    hello
    cls=<class '__main__.X'>

    >>> X().__call__() # 2
    hello
    cls=<class '__main__.X'>

    >>> X.__call__() # 3
    hello
    cls=<class '__main__.X'>

    >>> X() # 4
    <__main__.X object at 0x02850C30>


    xにX()を代入しxを呼び出せば、1ではなく2
    X()あるいはx = X()とすれば4となる
    3は本来のclassmethodの呼ばれ方。 

245 デフォルトの名無しさん [sage] 2010/09/07(火) 09:42:33 ID: Be:
    >>244
    #1 と #4 って何が違うの? 

246 デフォルトの名無しさん [sage] 2010/09/07(火) 09:45:38 ID: Be:
    >>245
    すまんtypo

    >>> X()() # 1
    hello
    cls=<class '__main__.X'> 

247 デフォルトの名無しさん [sage] 2010/09/07(火) 10:01:42 ID: Be:
    >>243
    そこのページにも
    > ようするに、
    > obj = Class()
    > obj = Class.__call__()
    > は同じ意味である。
    と書かれてありますよね。
    しかし X.__call__() を上書きしてみたのに、X() を実行しても
    上書きされてないので、質問してるのですが、わかってもらえてますか?

    >>244
    だから、X() を実行した時に、X.__call__() が呼ばれるはずなのに
    呼ばれてないのはなぜですか、という質問なんですけど。

248 デフォルトの名無しさん [sage] 2010/09/07(火) 10:16:59 ID: Be:
    X()を実行したときにX.__call__()が呼ばれるってのは間違い
    X()を実行するとまず__init__が処理される、__call__は関係なし。
    x = X()で、x()を呼べば__call__が呼ばれる。
    つまり>>246にあるX()()のことで、__init__を無視し__call__を呼ぶには以下
    X()() # 1
    X().__call__() # 2
    X.__call__() # 3 (classmethod)
    __call__をclassmethodとして定義しても#3が使えるようになるだけで、X()は関係なし 

249 デフォルトの名無しさん [sage] 2010/09/07(火) 10:32:24 ID: Be:
    >>234-236の時点で間違い
    >>235は大体合ってるし
    __call__が__init__を呼び出してるなんて初めて聞いたが
    http://www.daniweb.com/forums/thread39004.html 

250 デフォルトの名無しさん [sage] 2010/09/07(火) 10:41:21 ID: Be:
    >>248
    >X()を実行したときにX.__call__()が呼ばれるってのは間違い

    これは何を根拠に言ってますか?
    できれば公式のドキュメントでそう書いてある箇所を教えてください。

    なおPythonのドキュメントでは、
    http://www.python.jp/doc/2.5/ref/callable-types.html
    > x(arg1, arg2, ...) は x.__call__(arg1, arg2, ...) を短く書いたものに なります。
    と書いてあります。


    > X()を実行するとまず__init__が処理される、__call__は関係なし。

    __init__ はインスタンスメソッドなので、まずインスタンスオブジェクトを作成する操作があるはずです。
    __init__ が呼ばれるのはそのあと。
    そして、インスタンスオブジェクトを作成する操作を、__call__() の中で行ってると思ったのですが、違いますか。 

251 デフォルトの名無しさん [sage] 2010/09/07(火) 10:46:20 ID: Be:
    >>250
    ドキュメントにもxって書いてあるじゃん
    このxはどう考えても、x = X()の時のx 

252 デフォルトの名無しさん [sage] 2010/09/07(火) 11:29:04 ID: Be:
    >>251
    x() では __call__() が呼ばれるけど、X() では呼ばれないということですか。
    なんか一貫性に欠けた仕様ですね。

    じゃあ>>243のページに書かれている
    > ようするに、
    > obj = Class()
    > obj = Class.__call__()
    > は同じ意味である。
    というのは間違いということですか?
    #間違ってるなら紹介しないでほしい

253 デフォルトの名無しさん [sage] 2010/09/07(火) 11:31:07 ID: Be:
    x()でユーザ定義のx.__call__()が呼ばれるのはインスタンスのみだと思うけどどうなんだろ 

254 デフォルトの名無しさん [sage] 2010/09/07(火) 12:09:01 ID: Be:
    >>> class Meta(type):
    ...  def __call__(self, *args):
    ...    print "hello"
    ...
    >>> class X(object):
    ...  __metaclass__ = Meta
    ...
    >>> X()
    hello 

255 デフォルトの名無しさん [sage] 2010/09/07(火) 12:19:24 ID: Be:
    結局、>>243のページの説明は間違っている、ということでいいんでしょうか。 

256 デフォルトの名無しさん [sage] 2010/09/07(火) 12:27:53 ID: Be:
    別に間違っちゃいないが
    __init__と__call__の違いがわからなければ
    理解できなくて当然のハイレベルな機能なので特に気にしなくて良い 

257 デフォルトの名無しさん [sage] 2010/09/07(火) 12:39:57 ID: Be:
    って、よく読み返したら全然違うじゃん……
    多分obj = Class.__init__()の間違いだと思うよ 

258 デフォルトの名無しさん [sage] 2010/09/07(火) 12:41:36 ID: Be:
    正確に言うと、
    X: 当該クラス
    instance: Xのインスタンス
    metaX: Xのメタクラス
    Xに定義された__init__ -> X(): コンストラクタ
    Xに定義された__call__ -> instance(): C++でいう関数オブジェクトみたいなものを作る時に使う。
    Xに定義されたクラスメソッドの__call__ -> X.__call__(): X()では呼び出せない。
    というかclassmethodの効果はドット「.」でメンバアクセスする場合のみ

    メタクラスとかはマニアックな仕様なので無視の方向で。 

259 デフォルトの名無しさん [sage] 2010/09/07(火) 12:43:14 ID: Be:
    読み返したらmetaXいらないな……なんか疲れてるな 

260 デフォルトの名無しさん [sage] 2010/09/07(火) 12:48:59 ID: Be:
    >>257
    >多分obj = Class.__init__()の間違いだと思うよ

    それはないでしょう。
    だって __init__() はインスタンスメソッドであり、インスタンスがないのに呼び出せないでしょ?

    obj = Class()
    obj = Class.__init__() # TypeError

    そっちこそ __init__ と __call__ の違いが分かってるの?w 

261 デフォルトの名無しさん [sage] 2010/09/07(火) 12:49:43 ID: Be:
    あー、いきなりメタクラスの話がどうのとか言い出したのは
    metaX.__call__がX.__init__に相当する(同じタイミングで呼ばれる)って話か。
    そりゃあ関係ないわな。X.__call__の話なんだもの。 

262 デフォルトの名無しさん [sage] 2010/09/07(火) 12:53:50 ID: Be:
    >>258
    >Xに定義された__call__ -> instance(): C++でいう関数オブジェクトみたいなものを作る時に使う。

    「Xに定義された__call__」って何ですか?

263 デフォルトの名無しさん [sage] 2010/09/07(火) 12:54:04 ID: Be:
    ん、じゃあtype.__call__(X)か。
    なんかわかんなくなってきたぞ 

264 デフォルトの名無しさん [sage] 2010/09/07(火) 13:03:31 ID: Be:
    そもそも__call__メソッドをクラスメソッドにするのが意味不明 

265 デフォルトの名無しさん [sage] 2010/09/07(火) 13:14:53 ID: Be:
    もう、なにがなんやら。256みたいなのがいるから混乱するけど、
    結局、>>243のページは大間違いということでいいんだよね?


266 デフォルトの名無しさん [sage] 2010/09/07(火) 13:15:18 ID: Be:
    3.4.5. Emulating callable objects¶
    object.__call__(self[, args...])
    Called when the **instance** is “called” as a function;
    if this method is defined, x(arg1, arg2, ...) is a shorthand for x.__call__(arg1, arg2, ...). 

267 デフォルトの名無しさん [sage] 2010/09/07(火) 13:16:58 ID: Be:
    なんで極端に合ってる間違ってるって決めたがるの?
    適応性なさすぎ、仕様がスマートじゃないPythonには向いてないよ。 

269 デフォルトの名無しさん [sage] 2010/09/07(火) 13:36:25 ID: Be:
    >>239の
    >理由をあえていえば、Pythonでは X() を実行すると実際には X.__call__() が
    >実行されるというふうに聞いたのですが、

    誰に「聞いた」のか知らんが、それが嘘でした、で終了でしょ
    呼ばれるというのは嘘なんだから、いくら頑張ってそこ弄っても挙動変わらないのは
    当たり前
    何が疑問なのかさっぱり分からん

    x = X() とするときに呼ばれるのは
    メタクラスの__call__()
    -> Xの__new__()(性的メソッド)
    -> xの__init__()(インスタンスメソッド)
    が正解のはずだよ 

270 デフォルトの名無しさん [sage] 2010/09/07(火) 13:39:15 ID: Be:

    なんで >>243 が正しいと思っちゃった人は
    どこの馬の骨かわからんサイトに書いてることを信用するんだろう

271 デフォルトの名無しさん [sage] 2010/09/07(火) 13:57:02 ID: Be:
    >>270
    正しくない根拠は?
    君こそどこの馬の骨かわからないよね・・ 

272 デフォルトの名無しさん [] 2010/09/07(火) 14:28:43 ID: Be:
    >>250
    そのページにまんま書いてあるのだが
    >__call__( self[, args...])
    > インスタンスが関数として ``呼ばれた'' 際に呼び出されます;
    よってクラスオブジェクトが関数として呼ばれた際には呼び出されない 

275 デフォルトの名無しさん [sage] 2010/09/07(火) 17:16:56 ID: Be:
    話題に乗り遅れたから__call()__/__init()__ 論議の結末をだれかまとめくれ 

276 デフォルトの名無しさん [sage] 2010/09/07(火) 17:27:59 ID: Be:
    実務でプログラミングしたことないキチガイが自演を交えて暴れただけ 

280 デフォルトの名無しさん [sage] 2010/09/07(火) 19:08:38 ID: Be:
    X() では type(X).__call__(X) が実行される。
    Xがインスタンスオブジェクトの場合、これは X.__call__() と同じである。 

282 デフォルトの名無しさん [sage] 2010/09/07(火) 19:19:06 ID: Be:
    In [16]: class Foo: pass
    ....:
    In [17]: classobj = type(Foo)
    In [18]: classobj
    Out[18]: <type 'classobj'>
    In [19]: Foo()
    Out[19]: <__main__.Foo instance at 0x853124c>
    In [20]: classobj.__call__(Foo)
    Out[20]: <__main__.Foo instance at 0x85316ac>
    In [21]: Bar = classobj('Bar', (), {})
    In [22]: Bar
    Out[22]: <class __main__.Bar at 0x859295c>
    In [23]: type(classobj)
    Out[23]: <type 'type'>
    In [24]: Baz = type(classobj).__call__(classobj, 'Baz', (), {})
    In [25]: Baz
    Out[25]: <class __main__.Baz at 0x859298c>

    ふむ。 

省略するところがほとんどなかった…

■_

「参照渡し」が目に止まったので。


【Perl,PHP】LLバトルロワイヤル11【Ruby,Python】 
809 デフォルトの名無しさん [sage] 2010/09/07(火) 03:20:32 ID: Be:
    PythonでもRubyでもなんでもいいからとにかくPerlだけはなんとしても消えてほしい。 

810 デフォルトの名無しさん [sage] 2010/09/07(火) 10:08:12 ID: Be:
    >>809
    理由を聞こうか。 

811 デフォルトの名無しさん [sage] 2010/09/07(火) 13:56:36 ID: Be:
    perlは変な記号とか多くて初心者には覚えにくいと思うのだが
    初心者に持ち上げられてるイメージ 

812 デフォルトの名無しさん [sage] 2010/09/07(火) 14:23:11 ID: Be:
    何も考えずにコピペすればCGIが作れるコード集、がウェブに溢れてるからでしょ 

813 デフォルトの名無しさん [sage] 2010/09/07(火) 15:55:28 ID: Be:
    PHPでもRubyでも同じじゃね 

814 デフォルトの名無しさん [sage] 2010/09/07(火) 16:03:20 ID: Be:
    参照渡しのあるPerl > 参照渡しのないPythonやRuby

815 デフォルトの名無しさん [sage] 2010/09/07(火) 16:13:55 ID: Be:
    Pythonは参照渡ししかないわけだが…… 

816 デフォルトの名無しさん [sage] 2010/09/07(火) 16:17:56 ID: Be:
    pythonに参照渡しはない
    ttp://effbot.org/zone/call-by-object.htm 

817 デフォルトの名無しさん [sage] 2010/09/07(火) 16:41:24 ID: Be:
    それはC言語における「値」の概念がないから「参照」というのがナンセンスなだけだろう 

■_ 本日の巡回から

2010年09月06日

■_

・歴史群像
買った。

・センゴク
雨が

ffice TANAKA - Excel VBA高速化テクニック[セルを配列に入れる]
http://officetanaka.net/excel/vba/speed/s11.htm

EXCEL VBAによるEXCELファイル作成時の高速化案がありますで... - Office系ソフト - 教えて!goo
http://oshiete.goo.ne.jp/qa/4557028.html

超高速に大量の Excel のグラフを描画する方法の検討 :: Drk7jp
http://www.drk7.jp/MT/archives/001281.html

■_ Pugs

リポジトリが移動するとか


Announce: Pugs repository move - nntp.perl.org

After years of neglected maintenance, we had to shut down the
pugs svn repository. It caused undue strain on the server that
hosted it, and made it nearly unusable.

Therefore we needed an alternative; since many active Perl 6
developers prefer git to svn anyway, we[1] decided to go with github.

Since the repository doesn't contain the Pugs compiler anymore,
it was renamed to 'mu', a pun on the type 'Mu', which in Perl 6
is the root of the type hierarchy.

Significant parts of the old pugs repo have been split up

    /                    http://github.com/perl6/mu
    /docs/Perl6/Spec     http://github.com/perl6/specs
    /t/spec              http://github.com/perl6/spectests

Other parts will slowly be split off, and moved to separate
repositories in the 'perl6' organization account. To keep maintenance
easier, all these repositories will have the same access control list.

略

■_

無限リストから一部だけとってくるときには注意が必要という話?


Series, Memoization, and Limits « Just Rakudo It

The Series Operator and Memoization
By colomon

Out on Reddit, my last post got some interesting comments. In particular, one 
commenter creates a finite series of squares, and then asks “That's all well and 
good, but what would I have to do to say ‘up to 900′ instead of saying ‘up to 30^2′?”
That's a great question, and I'd like to explore the answer to it, though I'm 
going to stick with the Fibonacci series for my examples.

First, there's a very quick and dirty answer to this. If you modify the original 
series, it is easy to add a limit term:

まずはこれに回答する非常に quick and dirty なものを。元の series を変更してもよいのなら
limit term を付け加えるのは簡単です:

> my @Fibonacci := (0, 1, -> $a, $b { $a + $b } ... 900);
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610

That gives you all the Fibonacci numbers less than or equal to 900. But the list is no 
longer expandable; with this one, if you say @Fibonacci[100], rather than calculating 
the 100th value of the series, it will just act like it's a normal out-of-bounds 
array access.

これで 900 以下のフィボナッチ数がすべて得られます。しかしこのリストはもはや
expandable なものではありません。このことにより、@Fibonacci[100] にアクセスしようとすると
数列の100番目の値を計算するのではなくて、配列に関しての通常の範囲外アクセスとなります。

In an ideal world, we'd have an easy way of looking at just part of an infinite 
series. What tools do we have in our toolbox? Well, there's grep:

>  my @Fibonacci := (0, 1, -> $a, $b { $a + $b } ... *); 1;
1
> my @F-low := @Fibonacci.grep(* < 900); 1;
1
> say @F-low[10]
55
> say @F-low[20]

…and that last one is where the trouble starts, because it never comes back. By 20, 
we're already well over 900. But grep's been fed an infinite list, and it doesn't 
know anything about it, so it just keeps on looking forever. So that won't do.

そしてこの最後のものがトラブルの始まりです。
なぜなら返ってこないのです。
20 で呼び出しを行った場合それはすでに900を超えています。
けれどもgrepは無限リストの最後

The next tool we have is the first method.

わたしたちが使った次なるツールは first メソッドです。

> my @Fibonacci := (0, 1, -> $a, $b { $a + $b } ... *); 1;
1
> say @Fibonacci.first(* <= 900)
0
> say @Fibonacci.first(* > 900)
987

As you can see, first is great at finding the first Fibonacci number greater than 900. 
It's pretty useless for finding all the numbers less then 900, though.

見ての通り、first は900よりも大きい最初のFibonacci 数を見つけ出すのにgreatです。
ただし、900未満のすべての数字を見つけ出すのには pretty uselessなのです。

So, the bad news here is that, as I write this, Perl 6 does not have a method which 
can give us a finite portion of an infinite list based on some test, other than
“give us the first N elements”. The good news is that the function we want is dead
simple to write:

ですからここでの bad news というのは、わたしが書いたように Perl 6 は
“give us the first N elements”(最初のN要素をよこせ)以外の、
なんらかのテストに基づいて無限リストの finite portion を取り出すことのできるようなメソッドを
持っていないということなのです。good news はそういったわたしたちが要望する関数が
とんでもなく簡単に書けるということです:

sub take-while(@a, Mu $test) {
    gather {
        for @a.list {
            last unless $_ ~~ $test;
            take $_;
        }
    }
}

This is actually a straightforward modification of the normal grep code. $test is 
defined as Mu so it can be anything that can be smartmatched against, including 
junctions. Then we scan the list, exiting if a smartmatch against the current element 
fails, and otherwise returning the element in our output list.

実際にはこれは通常の grepのコードの  straightforward modification です。
$test は Mu として定義されているので、ジャンクションを含めた
スマートマッチの対象にできるものなんにでもなれます。
そしてリストのスキャンを行って、
カレントの要素に対するスマートマッチが失敗したところで抜け出します。
そうでなかったら、出力リストにある要素を返します。

This is just the trick for the problem in question:

> my @Fibonacci := (0, 1, -> $a, $b { $a + $b } ... *); 1;
1
> take-while(@Fibonacci, * < 900)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610
> take-while(@Fibonacci, * < 400000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811
> take-while(@Fibonacci.grep(* %% 2), * < 400000)
0 2 8 34 144 610 2584 10946 46368 196418
> take-while(@Fibonacci, Int)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903


So here we have it: we've still got the efficiency of the de facto memoized solution, 
but we can also carve off portions of the list based on some criteria. I threw in the 
last one there just to show it didn't have to be a Code block passed in; in this case, 
it shows us how far we get down the series with Int values before our current limited 
integer math throws in the towel and gives you back a Num instead. (Note that once we 
get arbitrarily large Ints in Rakudo, that line will no longer work, because 
take-while(@Fibonacci, Int) will return an infinite list!)

And now for the even slightly better news: as of today, take-while is available in the 
List::Utils module.

そしてもうひとつさらに slightly better なニュースを: take-while は List::Utils モジュールで
使えるようになっています。

略

■_


The Series Operator and Memoization « Just Rakudo It

The Series Operator and Memoization
series 演算子とメモ化

By colomon

Masak recently posted on the series operator solution to Pascal's Triangle. I'd like 
to focus on an important property of his final solution that hasn't been much 
discussed yet.

But first, let me back up and consider another well-known problem with similar 
properties: the Fibonacci series. A straightforward recursive solution looks like this 
in Perl 6:


sub Fibonacci($n) {
    return $n if $n == 0 | 1;
    Fibonacci($n - 1) + Fibonacci($n - 2);
}

This nicely implements the definition, but it has one critical problem — it is 
incredibly inefficient. (And not just in Rakudo — in any language!) The reason is that 
calculating Fibonacci(N) requires all the work of calculating Fibonacci(N-1) and 
Fibonacci(N-2). The number of subroutine calls involved grows as fast as the series 
does.
これは定義に対する nicely implements ですが、
ひとつ致命的な問題を抱えています。
信じられないほど効率が悪いのです
(これはRakudoに限ったことではなく、どんな言語であっても同じです!)。
その理由はFibonacci(N)を計算するために
Fibbonacci(N-1)を計算する手間とFibonacci(N-2)を計算する手間すべてを
要求するからです。
そのサブルーチン呼び出しの回数は
フィボナッチ数列が増加するのに匹敵する速度で増加するのです。


The standard recursive technique for dealing with this problem is called memoization. 
Basically, you cache the values which have already been computed somewhere, so you 
only need to compute them once. That's a bit awkward to implement by hand — it roughly 
doubles the complexity of the routine, I'd say. Luckily, lots of languages have 
automatic ways to apply memoization. Perl 6 is supposed to, with the “is cached” 
modifier to a subroutine definition, but Rakudo doesn't have it implemented yet.

この問題を取り扱うための標準的な再帰技法 (standard recursive technique) はメモ化
(memoization) と呼ばれるものです。
Basically,
基本的には、
you cache the values which have already been computed somewhere,
既にどこかで計算済みの値をキャッシュし
so you only need to compute them once.
That's a bit awkward to implement by hand ?
it roughly doubles the complexity of the routine, I'd say.
幸運なことに、多くの言語がメモ化を適用するための自動的な手法を持っています。
Perl 6はこれを “is cached”modifier をサブルーチン定義につけることでもってサポートしています。
しかしRakudo はまだこれを実装していません。


That's okay, because there is more than one way to do it, and there is a great way 
which is available already in Rakudo.

これでよいのです。なぜならやり方は一通りではないのですから。
そして、Rakudo を使ったときに可能な great なやり方というのがあって、

> my @Fibonacci := (0, 1, -> $a, $b { $a + $b } ... *); 1;
1
> say @Fibonacci[5]
5
> say @Fibonacci[10]
55
> say @Fibonacci[30]
832040

(I've used parentheses instead of do because that's how I roll, but otherwise this is 
exactly the same idea as Masak's solution. The additional 1; is needed only because I 
typed this into the REPL, and without it the REPL will try to evaluate the entire 
infinite series so it can print it out.)


■_ ウォーター××

マ板から。


スレッドを立てるまでもない質問雑談スレ41 
644 仕様書無しさん [] 2010/09/04(土) 01:00:37 ID: Be:
    マ板の先生達に聞きたいんだけど、ウォーターフォール以外にビジネスで使える現実的な開発プロセスってあるんですか?
    大規模な案件でウォーターフォール以外でうまくいったという例があれば教えてほしい。 

645 仕様書無しさん [sage] 2010/09/04(土) 06:06:58 ID: Be:
    ウォーターフォールでもうまくいった例がないのでムリです。 

646 仕様書無しさん [sage] 2010/09/04(土) 15:24:18 ID: Be:
    日本のウォーターフォールって隠れて修正してるだけだよな。 

647 仕様書無しさん [sage] 2010/09/05(日) 03:10:19 ID: Be:
    ウォーターリークモデルと呼んでもいいくらいだ 

■_

■_

訳がすすまねーーっ

2010年09月05日

■_

おかしいなあいつの間にこんな時間に。

・あとで書く
プログラマー”まだまだ”現役続行 (技評SE選書)
基本的には以前のものの再録らしいので、追加分目当て。という気もする。

■_

組み込みプログラマー雑談スレッド その15 
853 仕様書無しさん [sage] 2010/09/05(日) 00:28:30 ID: Be:
    専門以外の優れた芸術等に触れることも大事だって、教官が言ってた 

854 仕様書無しさん [sage] 2010/09/05(日) 01:18:03 ID: Be:
    自己投資って何かやってる?
    投資っていうか投機っていうか投棄にしかなってない。
    お金をドブに捨てたような人生。 

855 仕様書無しさん [sage] 2010/09/05(日) 01:29:06 ID: Be:
    でも色々やってみないと芸の幅が広がらないからね。 

856 仕様書無しさん [sage] 2010/09/05(日) 03:04:43 ID: Be:
    >>854
    英会話と料理やってる。お金はかけてないけど。
    どっちも彼女に教わってる。 

857 仕様書無しさん [sage] 2010/09/05(日) 05:22:55 ID: Be:
    結果的に金かかってんな 

858 仕様書無しさん [sage] 2010/09/05(日) 08:18:58 ID: Be:
    愛があるだろ、いわせんな恥ずかしい 

859 仕様書無しさん [sage] 2010/09/05(日) 10:06:53 ID: Be:
    愛なんて幻想、しょせんお互いの思い込みに過ぎない 

860 仕様書無しさん [sage] 2010/09/05(日) 10:12:22 ID: Be:
    >>856
    お前なんかお前なんか
    いいなぁ・・・ 

やだなあ自己投棄 ○| ̄|_

■_ ネタ

FreeBSDのgrepのソースを見ていて発見。 [base] View of /head/usr.bin/grep/grep.c


[base] View of /head/usr.bin/grep/grep.c
        /* Find out the correct return value according to the results and the command line option. */
        exit(c ? (notfound ? (qflag ? 0 : 2) : 0) : (notfound ? 2 : 1));
} 

まあ、条件演算子使用禁止といいたくなる人がいるのもわからないでもない(笑)

■_ grep

んで、その BSDの grepで。 高速化云々でこれはまあごっそりなくなりそうな気もするんだけど、


[base] View of /head/lib/libc/regex/engine.c
/*-
 * Copyright (c) 1992, 1993, 1994 Henry Spencer.
 * Copyright (c) 1992, 1993, 1994
 *	The Regents of the University of California.  All rights reserved.
 *
 * This code is derived from software contributed to Berkeley by
 * Henry Spencer.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 4. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	@(#)engine.c	8.5 (Berkeley) 3/20/94
 */

(略)
/*
 - dissect - figure out what matched what, no back references
 == static const char *dissect(struct match *m, const char *start, \
 ==	const char *stop, sopno startst, sopno stopst);
 */
static const char *		/* == stop (success) always */
dissect(struct match *m,
	const char *start,
	const char *stop,
	sopno startst,
	sopno stopst)
{
	int i;
	sopno ss;		/* start sop of current subRE */
	sopno es;		/* end sop of current subRE */
	const char *sp;		/* start of string matched by it */
	const char *stp;	/* string matched by it cannot pass here */
	const char *rest;	/* start of rest of string */
	const char *tail;	/* string unmatched by rest of RE */
	sopno ssub;		/* start sop of subsubRE */
	sopno esub;		/* end sop of subsubRE */
	const char *ssp;	/* start of string matched by subsubRE */
	const char *sep;	/* end of string matched by subsubRE */
	const char *oldssp;	/* previous ssp */
	const char *dp;

	AT("diss", start, stop, startst, stopst);
	sp = start;
	for (ss = startst; ss < stopst; ss = es) {
		/* identify end of subRE */
		es = ss;
		switch (OP(m->g->strip[es])) {
		case OPLUS_:
		case OQUEST_:
			es += OPND(m->g->strip[es]);
			break;
		case OCH_:
			while (OP(m->g->strip[es]) != O_CH)
				es += OPND(m->g->strip[es]);
			break;
		}
		es++;

		/* figure out what it matched */
		switch (OP(m->g->strip[ss])) {
		case OEND:
			assert(nope);
			break;
		case OCHAR:
			sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0);
			break;
		case OBOL:
		case OEOL:
		case OBOW:
		case OEOW:
			break;
		case OANY:
		case OANYOF:
			sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0);
			break;
		case OBACK_:
		case O_BACK:
			assert(nope);
			break;
		/* cases where length of match is hard to find */
		case OQUEST_:

(略)
	assert(sp == stop);
	return(sp);
}

Henry Spencer すげー。というのはおいといて。 sp += XMBRTOWC(NULL, sp, stop - start, &m->mbs, 0); みたいな感じでマルチバイト文字→ワイド文字変換を呼び出しているのだけど、 これってGNU grep や sed で locale を C 以外にすると速度がた落ちになる という例のあれの主原因のような。 どうにかしてこいつの呼び出し回数を減らす努力をしないと速度は上がらないんじゃないかなあ。 最初にワイド文字にまとめて変換しておいて…てのはお手軽そうだけど 逆方向の変換とかでトラぶりそうだし。

■_

2010年09月04日

■_

東横線中目黒駅の信号故障で以下略

■_ 蔵出し

というほどのもんじゃありませんが。


Matching quote contents - Stack Overflow
I am trying to remove quotes from a string. Example:

"hello", how 'are "you" today'

returns

hello, how are "you" today

I am using php preg_replace.

I've got a couple of solutions at the moment:

(\'|")(.*)\1

Problem with this is it matches all characters (including quotes) in the middle, so 
the result ($2) is

hello", how 'are "you today'

Backreferences cannot be used in character classes, so I can't use something like

(\'|")([^\1\r\n]*)\1

to not match the first backreference in the middle.

Second solution:

(\'[^\']*\'|"[^"]*")

Problem is, this includes the quotes in the back reference so doesn't actually do 
anything at all. The result ($1):

"hello", how 'are "you" today'

Instead of:

(\'[^\']*\'|"[^"]*")

Simply write:

\'([^\']*)\'|"([^"]*)"
  \______/    \_____/
     1           2

Now one of the groups will match the quoted content.

In most flavor, when a group that failed to match is referred to in a replacement 
string, the empty string gets substituted in, so you can simply replace with $1$2 and 
one will be the successful capture (depending on the alternate) and the other will 
substitute in the empty string.

Here's a PHP implementation (as seen on ideone.com):

$text = <<<EOT
"hello", how 'are "you" today'
EOT;

print preg_replace(
  '/\'([^\']*)\'|"([^"]*)"/',
  '$1$2',
  $text
);
# hello, how are "you" today 

A closer look

Let's use 1 and 2 for the quotes (for clarity). Whitespaces will also be added (for clarity).

Before, you have, as your second solution, this pattern:

(  1[^1]*1  |  2[^2]*2  )
\_______________________/
   capture whole thing
   content and quotes

As you correctly pointed out, this match a pair of quotes correctly (assuming that you 
can't escape quotes), but it doesn't capture the content part.

This may not be a problem depending on context (e.g. you can simply trim one character 
from the beginning and end to get the content), but at the same time, it's also not 
that hard to fix the problem: simply capture the content from the two possibilities 
separately.

1([^1]*)1  |  2([^2]*)2
 \_____/       \_____/
 capture contents from
each alternate separately

Now either group 1 or group 2 will capture the content, depending on which alternate 
was matched. As a "bonus", you can check which quote was used, i.e. if group 
1 succeeded, then 1 was used.

Appendix

The […] is a character class. Something like [aeiou] matches one of any of the 
lowercase vowels. [^…] is a negated character class. [^aeiou] matches one of anything 
but the lowercase vowels.

(…) is used for grouping. (pattern) is a capturing group and creates a backreference. 
(?:pattern) is non-capturing.

References

    * regular-expressions.info/Brackets for capturing, Alternation, Character class, Repetition

気持ちはわかるけど、[^\1] とかねえ。 lazy マッチを使えばなんとか?

■_ 読みやすいけど理解しづらい?

なんか名古屋の方で Scala 関連のイベントがあったらしく。


Scala: Easier to read (and write), harder to understand? « Schneide Blog
 
Scala: Easier to read (and write), harder to understand?

There is a vivid discussion about Scala's complexity going on for some weeks now on 
the web even with a response from Martin Odersky. I want to throw my 2¢ together with 
some hopefully new aspects into the discussion.

Scala's liberal syntax rules and compiler magic like type inference and implicit 
conversions allow nicely written APIs and DSLs almost looking like prose texts. Take a 
look at APIs like scalatest and imagine the Java/Junit equivalent:

Scala のリベラルな構文規則と type inference や implicit conversions のような
compiler magic は、良く書かれた API やほとんど prose textsのように見える DSL を可能とします。
scalatest のような APIをとりあげ、それと等価な Java/Junit を想像してみましょう。


@Test def demonstrateScalaTest() {
  val sb = new StringBuilder("Scala")
  sb.append(" is cool!")
  sb.toString should be ("Scala is cool!")
  evaluating { "concise".charAt(-1) } should produce [StringIndexOutOfBoundsException]
}

There are really nice features that reduce day-to-day programming tasks to keywords or 
one-liners. Here are some examples:

// singletons have their own keyword (object), static does not exist!
object MySingleton {
  def printMessage {
    println("I am the only one")
 }
}

略


Final Thoughts

In my opinion Scala is a very nice language that successfully combines clean object 
oriented programming with functional features. You can migrate from a pure OO-style to 
a nice hybrid “Scala-style” like many programmers did when they first used Java 
mostly with procedural style using classes only as namespaces for their static methods. 
I am quite sure that a Scala code style and best practices still have to develop. 
Programmers will need their time diving into the language and using it for their 
benefit. I hope Scala prospers and gains attention in the industry because I 
personally think it is a nice step forward compared to Java (which turns more and more 
into a mess where you need profound knowledge to fight your problems).

わたしの意見では、Scala はオブジェクト指向プログラミングと関数的機能をきれいにまとめる
ことに成功した非常に nice な言語です。
あなたは純粋にオブジェクト指向スタイルのものからnice hybrid “Scala スタイル”


Regarding the complexity, which certainly exists in Scala, I only want to raise some 
questions which may be answered sometime in the future:


    * Maybe the tooling is just not there (yet)?
    * Maybe you sometimes just don't have to understand everything what's happening underneath?
    * Maybe Scala makes debugging much more seldom but harder, when something does not work out?
    * Maybe the features and power of Scala are worth learning?
    * Maybe certain features will just be banned by the teams like sometimes in Java teams
      (think of switch-case, the ?-operator, Autoboxing e.g.)?

■_

なんか無用に難しくやろうとしているようで何をやりたいのかよくわからない。


この9月にITエンジニアとしてスタートしたばかりの、初心者で恐縮なので | OKWave

この9月にITエンジニアとしてスタートしたばかりの、初心者で恐縮なのですが、
linux 5の環境下で下記のような事をしようとしています。

■test.csvの内容を読み込んで結果を出力し、その出力結果を使う。

test.csvの内容
001.txt,100,200
002.txt,300,400

このtest.csvから各行の1フィールド目を順に読み込んで
cp -p 001.txt 001_200.txt
cp -p 002.txt 002_300.txt
という感じで新しくファイルをコピーして作成しようと考えています。

awkで順に出力してコピーしようとしたのですが、
組込変数のNRがawk内で外部変数(?すみません、ここがよく理解できていません)を使えないように
思えて前に進めない状態です。

NR==i (NR==${i}と記述するのはNG??)として
for i `seq 1 N`
do
a=`awk BEGIN{FS=","}(NR==i){print $2}`
done
のように書きたいのですが、これはawkの文法から不可能なのでしょうか?

大変申し訳ございませんが、追記・追加情報必要であれば補足します。
雲をつかむようですみません。全部のコード(?)を載せるのは仕事上まずいかなと思いまして
こんな書き方になってしまいました。

つい先日も書いたんだけど
http://oshiete.goo.ne.jp/qa/6150647.html

awkとシェルとはまったく別と言ってよい処理系なので、シェルの変数の内容をawkに渡すには
・シェルの置換機能を使って、awkスクリプト文字列に埋め込む
・awk の -v オプションでawkの変数に代入する
という方法を使います。


ただね.....
多分、他の言語(CとかBasicとか)の考え方なのかもしれませんが、NR==で行番号指定して処理するのって、
(数行だけならともかく)全行にわたって行うのはすごい無駄です。
特に、この例では行番号は関係ないですから。
先のURLにあるような方法で1行ずつ行う方が効率はいいです。

さらに言えば、処理がそのコピーだけなら、シェル変数に代入する必要すらなく、1行でできます
awk 'BEGIN{FS=","} {prinf "cp %s %s_%s.txt" $1,$2,$3}' < test.csv | sh
shを使わず、awkのsystem関数を使う方法もあります
awk 'BEGIN{FS=","} {system( sprinf("cp %s %s_%s.txt" $1,$2,$3))}' < test.csv
以下略

-F オプションの存在を知らんのか? > BEGIN { FS = "," } あと、 awkとシェルとはまったく別と言ってよい処理系なので 言ってよいというか別物ではなかろうか。

■_ ネタ

C++は難しすぎ 難易度:4 
358 デフォルトの名無しさん [sage] 2010/09/01(水) 18:06:47 ID: Be:
    C++の話(本当にあった怖い話)
    http://gihyo.jp/dev/clip/01/orangenews/vol58/0007

    C++は経験あるベテランでも理解できないほど難しすぎ 

359 デフォルトの名無しさん [sage] 2010/09/01(水) 19:26:37 ID: Be:
    >関数の頭にプログラマの名前が付く

    これはないが 自分の名前.so は作ってしまったことがある 

着々と拡散しているなあw

■_

■_

あづい。

2010年09月03日

■_

最近買ったのとか読んだのとか。 あとで書く。たぶん。

プログラマーの心得―プログラマーを目指す人・活躍したい人へ (I・O biz) 勝つために戦え!〈監督ゼッキョー篇〉 ゼロ 73 THE MAN OF THE CREATION (ジャンプコミックスデラックス) 迷い猫オーバーラン! 2 (ジャンプコミックス) スイッチ! 発明のコモンズ (創成社新書44) マイクロソフトを変革した知財戦略

赤間さんの本は二度とかわねーと言ってましたが、今回の本は言語の解説書などではなかったのと 興味深そうなタイトルだったのであえて手を出してみました。 が、しかし(省略されました)

■_

今月の Rakudo Start


Journal of pmichaud (6013)


This release of Rakudo Star adds the following features over the previous Star release:
以前のリリースのあと追加された機能など

* Nil is now undefined
  Nil が undefined になりました

* Many regex modifiers are now recognized on the outside of regexes
  多くの正規表現修飾子が正規表現の外でも認識されるようになりました(?)

* Mathematic and range operations are now faster (they're still slow, but they're
  significantly faster than they were in the previous release)
  数学的演算子や範囲演算子の高速化 (まだまだ遅いものではありますが、以前に比べれば
  格段に高速化されています)。

* Initial implementations of .pack and .unpack
  .pack および .unpack の初期実装
* MAIN can parse short arguments
  
* Removed a significant memory leak for loops and other repeated blocks
  for ループやそのほかの関連したブロックでの深刻なメモリリークの排除

This release (temporarily?) omits the Config::INI module that was included in the 
2010.07 release, as it no longer builds with the shipped version of Rakudo. We hope to 
see Config::INI return soon.

There are some key features of Perl 6 that Rakudo Star does not yet handle 
appropriately, although they will appear in upcoming releases. Thus, we do not 
consider Rakudo Star to be a "Perl 6.0.0" or "1.0" release. Some 
of the not-quite-there features include:

* nested package definitions
* binary objects, native types, pack and unpack
* typed arrays
* macros
* state variables
* threads and concurrency
* Unicode strings at levels other than codepoints
* pre and post constraints, and some other phasers
* interactive readline that understands Unicode
* backslash escapes in regex character classes
* non-blocking I/O
* most of Synopsis 9
* perl6doc or pod manipulation tools

(略)

■_ 本日の巡回から

■_

あとで(ry

Hi! Does anyone want to share their philosophy on naming variables? : Python
I'd probably have a better idea of what to do if I read more code, but I thought I'd ask anyway.

How do you deal with giving variables descriptive names? I'm ending up with stuff like 
optionDictCustomerDictCouponList and I just don't see other people with stuff like 
that.

What would you do?

■_ 今日の投げっぱなしジャーマン

飽きた(笑)


Erik Engbrecht's Blog: Scala is for VB programmers

Thursday, August 26, 2010

Scala is for VB programmers

Normally I don't go for flame bait titles. But I haven't finished my morning coffee
yet so I can't help myself. There's once again a debate raging across the internet
about whether Scala is more or less complex than Java, along with the more nuanced
argument that yes, it is more complex but only framework and library developers have
to contend with this complexity. This argument usually happens when someone posts a
little bit of code like this:

def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That

And then someone responds like this:
そして誰かが次のような反応を返しました:

   Why do not people realize that Java is too difficult for the average programmer?
   That is the true purpose of Scala, to escape the complexity of Java code! Framework
   code in Scala, with heavy use of implicit keywords and all kinds of type abstractions,
   is very difficult. This is correct, but this code is not meant for innocent eyes. You
   do not use that sort of code when you write an application.

   なぜ皆は Java がふつーのプログラマー (average programmer) には難しすぎるものだということ
   を認識しないのでしょうか? それこそが Scala の、Java コードの複雑さから逃れるためという真
   の目的なのです! Scala におけるフレームワークのコードは implicit キーワードや型抽象
   (type abstractions) を多用した非常に難しいものです。このコードは正しいもの (correct)
   ですが、not meant for innocent eyes です。あなたはアプリケーションを書くときに
   こういった類のコード (that sort of code) を使ったりはしないでしょう。

I've seen this type of thinking before. A few years ago I had a bout of insanity and
lead an ASP.NET project using ASP.NET 2.0. I had no .NET experience prior to this
project. The project failed, although the reasons for that failure are legion and
unimportant here. But I noticed something about ASP.NET developers: they have no clue
how the technology works. It's a black box. Do you why? Because it is a black box. I
searched and searched and couldn't even find a good illustration of the lifecycle for
an ASP.NET page that's using events. This type of information is put front and center
in the Java world. It's absolutely buried in the Microsoft world. Or at least the
parts of it that target the hoards of VB programmers that are undyingly loyal to MS.
The framework is magic dust created by the great wizards in Redmond so that you can
build solutions for your customers. Do not question the dust. Think about VB. Or, no
don't, it might damage your brain. My coffee hasn't quite kicked in, so I should have
some immunity, so I'll do it for you. VB is a black box (well, at old school VB6). It
was designed to allow people who do not know how to really program, and who will
probably never know how to program, to create applications. It's completely flat,
opaque abstraction. The dichotomy between the application developer and the framework
developer is as high and as thick as the gates of Mordor.

わたしは以前この種の thinking を見たことがあります。そのプロジェクト以前にはわたしには 
.NET の経験はありませんでした。
The project failed, although the reasons for that failure are legion and unimportant here.
しかしわたしは ASP.NET 開発者たちに関して気がついたことがありました:彼らはその技術がど
のように動作しているのかの手掛かりを持っていなかったのです。つまりブラックボックスです。
Do you why? Because it is a black box.
わたしは散々探したのですが、イベントを使った ASP.NET のページのための good 
illustration of the lifecycle を見つけ出すことができませんでした
This type of information is put front and center in the Java world.
It's absolutely buried in the Microsoft world.
Or at least the parts of it that target the hoards of VB programmers that are undyingly loyal to MS.
The framework is magic dust created by the great wizards in Redmond so
that you can build solutions for your customers.
Do not question the dust.
Think about VB. Or, no don't, it might damage your brain.
My coffee hasn't quite kicked in, so I should have some immunity, so I'll do it for you.
VBはブラックボックスです(そう。at old shcool VB6です)。
それは完全にフラットで、abstraction を覆い隠す (opaque) もので、
アプリケーション開発者とフレームワーク開発者との間の dichotomy は
getes of Mordor のごとく as high ahd as thick だったのです。

There are many people in the Scala community that claim Scala's complexity can be
hidden from the application program. I don't believe them, but there's a chance that
they are right. It's technically feasible, and I can see how it could happen if Scala
started attracting lots of VB programmers. I can't see how it's going to attract lots
of VB programmers, but apparently many people in the Scala community think Scala is
for VB programmers. So we'll just have to wait and see...

Scala のコミュニティには Scala の complexity はアプリケーションプログラムから隠す
(hidden) ことができると主張するたくさんの人たちがいます。わたしは彼らの言うことを信用
していませんが、彼らの主張が正しいこともあるかもしれません。技術的には feasible (可能、
もっともらしい、ありそうな) なものであり、Scala が VBプログラマーの多くを惹きつけ始め
れば
I can see how it could happen 。
わたしは see how it's going to attract lots of VB programmers できませんでしたが、
Scala コミュニティに属する多くの人が Scala は VBプログラマー向けのものであると
考えているように見受けられます。
So we'll just have to wait and see...


Posted by Erik Engbrecht at 7:44 AM

あー。ひでー。

■_

twilight は素直に「黄昏」でいいんじゃないかなあ。

2010年09月02日

■_

渋谷に開店したジュンク堂いってきました。 駅からちょっとあるのが気になりますが(といっても池袋もそうか)、 さらに遠くに足を伸ばさなくてもすむような品揃えの気が。

■_

正規表現のデバッグはタイヘンですよねえ(ってまあPerl 6のそれはちょっと違いますが)。


article | How To Debug a Perl 6 Grammar
How To Debug a Perl 6 Grammar
Perl 6 Grammarのデバッグの仕方

When a programmer starts to learn his craft, he spends a lot of time making small, 
stupid mistakes that prevent his programs from running. With a bit of practice, he 
learns how to make fewer errors, and write more runnable code at once.

With grammars, it's the same all over again. In the author's experience, even expert 
programmers start with silly mistakes when they begin to write grammars. It's just 
vastly different from writing ordinary code, and requires a similar learning 
experience.

Here are some instructions that help you to write and debug grammars.
grammarsを書いてデバッグするときにあなたを助けるであろうちょっとした手順

Start with small steps
小さなステップから始める

Start with small steps, and test along the way.
小さなステップから始めてテストをその都度行う。

Start with a simple, single parsing rule, and test cases for it. Keep expanding the 
test cases and the grammar simultaneously. Only add more features when all tests that 
you expect to pass actually do.

単純で一つの parsing rule から始めて、そのためのテストを行う。
テストケースを esxpand し続け、grammar を simultaneously に保つ。
すべてのテストで期待通りに動作しているときにだけ機能の追加を行う。

Test rules individually
個々に rules をテストする

If you can't understand certain behavior, test rules individually. That way you can 
figure out if a rule is wrong, wrongly (or never) called, or interacts badly with 
other rules.

なにか理解できない動作をするようなら、個々の rulesをテストしましょう。
ある rule が間違っているとき、間違って ruleを呼び出していたりあるいは逆に呼び出していない
とき、はたまた他のルールと badly に interacts しているときにそれを見つけ出せる方法です。

grammar MyGrammar {
    token TOP {
        ^ [ <comment> | <chunk> ]* $
    }

    token comment {
        '#' \N* $
    }
    token chunk {
        ^^(\S+) \= (\S+) $
    }
}

# try to parse the whole thing
say ?MyGrammar.parse("#a comment\nfoo = bar");          # 0
# and now one by one
say ?MyGrammar.parse("#a comment\n", :rule<comment>);   # 1
say ?MyGrammar.parse("foo = bar", :rule<chunk>);        # 0

The example above shows a simple grammar that doesn't match a test string, due to a 
stupid thinko. The last two lines test the rules individually, identifying token chunk 
as the faulty one.

上記の例は、stupid thinko のためにテスト文字列にマッチしない単純な grammar です。
最後の二つのテストは独立したrulesで、faulty one として token chunk を
identifying するものです。

Debug with print or say
print や say を使ってのデバッグ

Just like ordinary code, you can sprinkle your grammar rules with calls to say(). You 
just need to embed them in curly braces, so that they get executed as ordinary code.

ふつうのコードのように、grammar rules で say() を呼び出して sprinkle できます。
あなたはカーリーブレースの内側にそれを単に埋め込むだけで、ふつうのコードのように
実行されます。

grammar MyGrammar {
    token chunk {
        { say "chunk: called" }
        ^^
        { say "chunk: found start of line" }
        (\S+) 
        { say "chunk: found first identifier: $0" }
        \= 
        { say "chunk: found =" }
        (\S+) $
    }
}

say ?MyGrammar.parse("foo = bar", :rule<chunk>);

# output:
#
# chunk: called
# chunk: found start of line
# chunk: found fist identifer: foo
# 0

You can see that the rule matched the start of the line, and foo, but not the equals 
sign. What's between the two? A space. For which there is no rule to match it. Making 
chunk a rule instead of a token fixes this problem.

このルールが行の先頭にマッチし、そしてfooにマッチしたけれども等号にマッチしなかったのを
見て取れます。この二つの間で起こったこととはなんでしょうか?
それにマッチする rule がなかったということです。
この問題を解決するトークンの代わりに rule の chunk をつくりましょう。


Remember that backtracking can cause a single block to be executed multiple times, 
even if not part of a quantified construct.

バックトラックは quantified construct の一部でなかった場合でも
単一のブロックを複数回実行する可能性があることを忘れないでください。

$ perl6 -e '"aabcd" ~~ /^ (.*) { say $0 } b /'
aabcd
aabc
aab
aa

Be careful with backtracking control
バックトラックの制御は注意深く

以下略

■_

よく使われるであろう名前を持った関数があるというのは 他でも指摘されてますね。

71 の意見はなるほどという気も。


くだすれPython(超初心者用) その8 
61 デフォルトの名無しさん [] 2010/09/02(木) 04:46:16 ID: Be:
    組み込み関数名を上書きしてしまいハマってしまいました。
    関数名の上書きでエラーが出ないってちょっとおかしくないですか?
    前もってすべての関数名を知っておかないといけないってことですよね
    こういうハマり方をしないための知恵などあえば教えてください。 

62 デフォルトの名無しさん [sage] 2010/09/02(木) 04:48:32 ID: Be:
    組み込み関数くらい全部把握しとけや… 

63 デフォルトの名無しさん [sage] 2010/09/02(木) 04:49:07 ID: Be:
    ちなみに上書きしたのはstrです。
    文字列型のテンポラリな変数でよく使っていた変数名なので・・。 

64 デフォルトの名無しさん [sage] 2010/09/02(木) 04:49:57 ID: Be:
    >>62
    そうするしかないのでしょうか
    鬼のような言語ですね 

65 デフォルトの名無しさん [sage] 2010/09/02(木) 05:35:38 ID: Be:
    len もうっかりやってしまう 

66 デフォルトの名無しさん [sage] 2010/09/02(木) 05:40:07 ID: Be:
    >>61
    いいこと思いついた。お前、関数の中で上書きしろ 

67 デフォルトの名無しさん [] 2010/09/02(木) 05:47:11 ID: Be:
    将来新しい名前が組み込まれて、既存のコードとぶつかったらどうなるんです? 

68 デフォルトの名無しさん [sage] 2010/09/02(木) 05:50:45 ID: Be:
    新しいコードを書かなきゃいいんじゃね 

69 デフォルトの名無しさん [sage] 2010/09/02(木) 05:59:59 ID: Be:
    組み込み関数のリスト見たらidとかsumとかmaxとか・・地雷原ですやん
    恐ろしい言語だなあ 

70 デフォルトの名無しさん [sage] 2010/09/02(木) 06:07:42 ID: Be:
    >>66
    ああ分かった
    そのためにわざわざ
    def main():
     定義しておいて
    if __name__ = '__main__':
      main()
    ってやるのか 

71 デフォルトの名無しさん [] 2010/09/02(木) 06:12:28 ID: Be:
    もともとsum関数を使うようなコードなら変数名にsumは使わないだろうし
    sum関数が定義されていても変数名として使いたいなら使えたほうがいい

    sum関数は使わないけど定義されている.ゆえにsumという変数が作れない
    sum関数は使わないけど定義されている.でもsumという変数は作れる
    これを自由度が高いとみるか安全じゃないとみるかは人によるだけだ 

72 デフォルトの名無しさん [sage] 2010/09/02(木) 06:24:21 ID: Be:
    >>70
    なるほど 

73 デフォルトの名無しさん [sage] 2010/09/02(木) 06:35:02 ID: Be:
    main関数を必ず定義しろってことですか
    あれが言語の危険さを防ぐ知恵だなんて誰も教えてくれなかったな
    油断すると名前衝突起こすノーブレーキ言語ってことがバレるからかな?
    でもありがとうございました 

74 デフォルトの名無しさん [sage] 2010/09/02(木) 06:37:03 ID: Be:
    自分の失敗の腹いせなのか、別の言語の工作員なのかよく分からんな 

75 デフォルトの名無しさん [sage] 2010/09/02(木) 06:40:34 ID: Be:
    >73
    ついでに後方参照の問題も解決するんだよ
    Rubyでも同じことはよくやる 

76 デフォルトの名無しさん [sage] 2010/09/02(木) 07:11:43 ID: Be:
    むしろ後方参照の解決がメインだと思う。
    呼ばれる順番を気にしながら関数を書くなんてやってられない。 

77 デフォルトの名無しさん [sage] 2010/09/02(木) 10:11:49 ID: Be:
    >>61
    組み込み関数に色つけてくれるPython対応エディタ使え 

78 デフォルトの名無しさん [sage] 2010/09/02(木) 12:37:29 ID: Be:
    組み込み関数全部に__buildin__くっつければ万事解決 

79 デフォルトの名無しさん [sage] 2010/09/02(木) 15:19:29 ID: Be:
    >>63
    おれは、エディタで色づけしてる。 

80 デフォルトの名無しさん [sage] 2010/09/02(木) 16:02:42 ID: Be:
    >>> a = 'abc'
    >>> b = 'defgh'
    >>> len = len(a)
    >>> len2 = len(b)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'int' object is not callable

    やべー
    ネタだと思ってたらマジな話だったの加代 

81 デフォルトの名無しさん [sage] 2010/09/02(木) 17:56:31 ID: Be:
    なんでネタだと思うんだよw 

82 デフォルトの名無しさん [sage] 2010/09/02(木) 18:07:16 ID: Be:
    いままで自分の書いてたコードが
    奇跡的に動いていただけだったことを悟ったとき 

83 デフォルトの名無しさん [sage] 2010/09/02(木) 18:09:01 ID: Be:
    いや、自分が定義した変数や関数を組み込み関数として使ったりしないだろ 

85 デフォルトの名無しさん [sage] 2010/09/02(木) 18:47:29 ID: Be:
    後方参照の問題の解決というのは
    いわゆるメインルーチンをサブルーチンより前に書いてもOKになる
    ってことですか? 

86 デフォルトの名無しさん [sage] 2010/09/02(木) 21:52:08 ID: Be:
    それは前方参照 

87 デフォルトの名無しさん [sage] 2010/09/02(木) 21:53:15 ID: Be:
    えっ 

88 デフォルトの名無しさん [sage] 2010/09/02(木) 21:55:38 ID: Be:
    いや間違ってないけど 

89 デフォルトの名無しさん [sage] 2010/09/02(木) 21:56:17 ID: Be:
    後方参照ってRuby用語だろ 

90 デフォルトの名無しさん [sage] 2010/09/02(木) 22:06:28 ID: Be:
    詳説正規表現の二版の脚注だったか
    前方参照と後方参照どっちにしたらいいか迷ったってのがあったなあ 

92 デフォルトの名無しさん [sage] 2010/09/02(木) 22:15:44 ID: Be:
    へー勉強になった
    豚楠

    C/C++では後方参照ができないので宣言が必要
    とか書いてあるサイトもあるけど
    これも正しくは
    C/C++では前方参照ができないので宣言が必要
    ってことかな 

93 デフォルトの名無しさん [sage] 2010/09/02(木) 22:35:56 ID: Be:
    呼び出す地点より後ろで定義された関数は参照できないんだから
    後方参照じゃないの?
    何が前方なの? 

94 デフォルトの名無しさん [sage] 2010/09/02(木) 22:36:23 ID: Be:
    相対的に 

95 デフォルトの名無しさん [sage] 2010/09/02(木) 22:50:59 ID: Be:
    いわゆるスルーパスだから前方なんだろうな 

96 デフォルトの名無しさん [sage] 2010/09/02(木) 22:52:25 ID: Be:
    >>93
    たとえば >>930 って書くと
    前方参照?後方参照? 

97 デフォルトの名無しさん [sage] 2010/09/02(木) 23:01:23 ID: Be:
    ソースの後ろの方なのか、
    ソースの進行方向の後ろ側なのか。 

98 デフォルトの名無しさん [sage] 2010/09/02(木) 23:11:22 ID: Be:
    ああ、やっと分かった
    読んでいくCPUの立場に立つと、コードの下の方が「前」ですな。
    エディタでも、前と後はそういう概念だな。
    でも本の場合、「もっと前の方」というと、若いページを指す。
    はじめて感覚の違いに気づきました。 

99 デフォルトの名無しさん [sage] 2010/09/02(木) 23:20:54 ID: Be:
    前方参照というのは、forward referenceの定番的な訳語。
    forward referenceは、言語規格書などでよく使われる言葉。
    まだ定義していない用語を使ったときに、
    「定義はこの先のxxページにあります」ということを示す際に用いる。

100 デフォルトの名無しさん [sage] 2010/09/02(木) 23:23:45 ID: Be:
    人間でも、「前を向いて生きる」の前は未来だし、
    「この前」の前は過去だな。
    「見ている人がどっちを向いているか」で前は変わるってことだね。 

101 デフォルトの名無しさん [sage] 2010/09/02(木) 23:26:46 ID: Be:
    うまいこといったつもりだろうけどおれはみとめないぞ! 

正規表現の「後方参照」は backward reference ですね。 どこかで「後方」はおかしいという主張を見た気が。

■_

2010年09月01日

■_

9月になりました。

なんつーかやる気がナッシング。夏バテ?

国会図書館でわかった情報で借りたもの。 国会図書館の本は借りて図書館の外へ持ち出したりできませんからね~

この辺の話もいずれ。

■_ いろんな言語で

適当に抜き出しました。 このほかにもいろいろあります。


File I/O in Every Programming Language - Stack Overflow

This has to be a common question that all programmers have from time to time. How do I 
read a line from a text file? Then the next question is always how do i write it back.

Of course most of you use a high level framework in day to day programming (which are 
fine to use in answers) but sometimes it's nice to know how to do it at a low level 
too.

I myself know how to do it in C, C++ and Objective-C, but it sure would be handy to 
see how it's done in all of the popular languages, if only to help us make a better 
decision about what language to do our file io in. In particular I think it would be 
interesting to see how its done in the string manipulation languages, like: python, 
ruby and of course perl.

So I figure here we can create a community resource that we can all star to our 
profiles and refer to when we need to do file I/O in some new language. Not to mention 
the exposure we will all get to languages that we don't deal with on a day to day 
basis.

This is how you need to answer:

   1. Create a new text file called "fileio.txt"
   2. Write the first line "hello" to the text file.
   3. Append the second line "world" to the text file.
   4. Read the second line "world" into an input string.
   5. Print the input string to the console.

Clarification:

    * You should show how to do this in one programming language per answer only.
    * Assume that the text file doesn't exist beforehand
    * You don't need to reopen the text file after writing the first line

No particular limit on the language. C, C++, C#, Java, Objective-C are all great.

If you know how to do it in Prolog, Haskell, Fortran, Lisp, or Basic then please go 
right ahead =)

LOLCODE

The specs are sketchy to say the least, but I did the best I could. Let the downvoting 
begin! :) I still find it a fun exercise.

HAI
CAN HAS STDIO?
PLZ OPEN FILE "FILEIO.TXT" ITZ "TehFilez"?
    AWSUM THX
        BTW #There is no standard way to output to files yet...
        VISIBLE "Hello" ON TehFilez
        BTW #There isn't a standard way to append to files either...
        MOAR VISIBLE "World" ON TehFilez
        GIMMEH LINES TehLinez OUTTA TehFilez
        I HAS A SecondLine ITZ 1 IN MAH TehLinez
        VISIBLE SecondLine
    O NOES
        VISIBLE "OH NOES!!!"
KTHXBYE

Haskell

main :: IO ()
main = let filePath = "fileio.txt" in
       do writeFile filePath "hello"
          appendFile filePath "\nworld"
          fileLines <- readFile filePath
          let secondLine = (lines fileLines) !! 1
          putStrLn secondLine

If you just want to read/write a file:

main :: IO ()
main = readFile "somefile.txt" >>= writeFile "someotherfile.txt" 

C#

string path = "fileio.txt";
File.WriteAllLines(path, new[] { "hello"}); //Will end it with Environment.NewLine
File.AppendAllText(path, "world");

string secondLine = File.ReadLines(path).ElementAt(1);
Console.WriteLine(secondLine);

File.ReadLines(path).ElementAt(1) is .Net 4.0 only, the alternative is File.ReadAllLines(path)[1]
which parses the whole file into an array.
ANSI C

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   FILE *file;
   char buf[128];

   file = fopen("fileio.txt", "w");
   if (!file)
   {
      fprintf(stderr, "Couldn't open file.\n");
      exit(1);
   }

   fprintf(file, "hello");
   fclose(file);

   file = fopen("fileio.txt", "a");
   if (!file)
   {
      fprintf(stderr, "Couldn't open file.\n");
      exit(1);
   }

   fprintf(file, "\nworld");
   fclose(file);

   file = fopen("fileio.txt", "r");
   if (!file)
   {
      fprintf(stderr, "Couldn't open file.\n");
      exit(1);
   }

   fgets(buf, sizeof(buf), file);
   fgets(buf, sizeof(buf), file);

   fclose(file);

   puts(buf);

   return 0;
}

Ruby

PATH = 'fileio.txt'
File.open(PATH, 'w') { |file| file.puts "hello" }
File.open(PATH, 'a') { |file| file.puts "world" }
puts line = File.readlines(PATH).last


x86 Assembler (NASM)

I haven't touched asm in 7 years, so I had to use google a bit to hack this together, 
but still, it works ;) I know it's not 100% correct, but hey :D

OK, it doesn't work. sorry bout this. while it does print world in the end, it doesn't 
print it from the file, but from the ecx which is set on line 27.

section .data
hello db 'hello',10
helloLen equ $-hello
world db 'world',10
worldLen equ $-world
helloFile db 'hello.txt'

section .text
global _start

_start:
mov eax,8
mov ebx,helloFile
mov ecx,00644Q
int 80h

mov ebx,eax

mov eax,4
mov ecx, hello
mov edx, helloLen
int 80h

mov eax,4
mov ecx, world
mov edx, worldLen
int 80h

mov eax,6
int 80h

mov eax,5
mov ebx,helloFile
int 80h

mov eax,3
int 80h

mov eax,4
mov ebx,1
int 80h

xor ebx,ebx
mov eax,1
int 80h

References used: http://www.cin.ufpe.br/~if817/arquivos/asmtut/quickstart.html

http://bluemaster.iu.hio.no/edu/dark/lin-asm/syscalls.html

http://www.digilife.be/quickreferences/QRC/LINUX%20System%20Call%20Quick%20Reference.pdf
COBOL

Since nobody else did......

IDENTIFICATION DIVISION.
PROGRAM-ID.  WriteDemo.
AUTHOR.  Mark Mullin.
* Hey, I don't even have a cobol compiler

ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
    SELECT StudentFile ASSIGN TO "STUDENTS.DAT"
        ORGANIZATION IS LINE SEQUENTIAL.

DATA DIVISION.
FILE SECTION.
FD TestFile.
01 TestData.
   02  LineNum        PIC X.
   02  LineText       PIC X(72).

PROCEDURE DIVISION.
Begin.
    OPEN OUTPUT TestFile
    DISPLAY "This language is still around."

    PERFORM GetFileDetails
    PERFORM UNTIL TestData = SPACES
       WRITE TestData 
       PERFORM GetStudentDetails
    END-PERFORM
    CLOSE TestFile
    STOP RUN.

GetFileDetails.
    DISPLAY "Enter - Line number, some text"
    DISPLAY "NXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    ACCEPT  TestData.

Erlang

Probably not the most idiomatic Erlang, but:

#!/usr/bin/env escript

main(_Args) ->
  Filename = "fileio.txt",
  ok = file:write_file(Filename, "hello\n", [write]),
  ok = file:write_file(Filename, "world\n", [append]),
  {ok, File} = file:open(Filename, [read]),
  {ok, _FirstLine} = file:read_line(File),
  {ok, SecondLine} = file:read_line(File),
  ok = file:close(File),
  io:format(SecondLine).

J

f =: 'fileio.txt'
('hello', LF) 1!:2 < f
('world', LF) 1!:3 < f
; 1 { < ;. _2 (1!:1  < f)

The last line reads the file (1!:1 < f), cuts it into lines (< ;. _2), gets the 
second element (1 {). Then the Monadic ; is used to unbox the element.

■_ 数式エディタ

へー。今度試してみよう。



melancholic afternoon
8月31日_

Ofice2010のPower Pointを使って資料を作り始めてみた. 数式エディタはかなり凄い. 使い方は
Wordの数式の基本が便利. 特に入力している最中にどんどん式ができあがっていくのは感動. こ
れはTeX使っててしょっちゅう夢見た環境そのもの. ただまだまだ不安定で, 流石に落ちること
は無かったけれども, どうにも編集できなくて削除しないといけなくなったことが何度か. あと, 
目茶苦茶重たい. 一文字ずつゆっくり入力しないと先行入力がまた悪さするのでストレスが溜ま
る. 

■_ 本日の巡回から


一つ前へ 2010年8月(下旬)
一つ後へ 2010年9月(中旬)

ホームへ


Copyright (C) 2010 KIMURA Koichi (木村浩一)
この文書の無断転載はご遠慮ください(リンクはご自由にどうぞ)。

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