とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

basic_regexの概要を訳してみた

Twitter@kikairoyaさんに助けてもらいつつ。

N3337

28.8 Class template basic_regex [re.regex]

basic_regex クラステンプレート

1 For a char-like type charT, specializations of class template basic_regex represent regular expressions constructed from character sequences of charT characters. In the rest of 28.8, charT denotes a given charlike type. Storage for a regular expression is allocated and freed as necessary by the member functions of class basic_regex.

basic_regexクラステンプレートのcharT特殊化はcharT文字シーケンスから構築された正規表現を表す。 charTはcharのような型を示す。 正規表現のための記憶域はbasic_regexクラスのメンバ関数によって必要に応じて確保されたり解放される。

2 Objects of type specialization of basic_regex are responsible for converting the sequence of charT objects to an internal representation. It is not specified what form this representation takes, nor how it is accessed by algorithms that operate on regular expressions. [ Note: Implementations will typically declare some function templates as friends of basic_regex to achieve this —end note ]

特殊化したbasic_regexのオブジェクトはcharTシーケンスオブジェクトから内部表現に変換する責任がある。 それがどのような表現になるか、またどのように正規表現で動作するアルゴリズムによってアクセスされるかは未規定である。 (注:一般的な実装ではいくつかの関数テンプレートはbasic_regexのfriendとして宣言されるだろう。)

3 The functions described in this Clause report errors by throwing exceptions of type regex_error.

それら関数はregex_error型の例外を投げることによってエラーを報告する。

これでツッコミがないか、ツッコミがあり修正したならばcpprefjp - C++ Library Referenceの方に反映させたいと考えてます。

今夜わかるTCP/IPを読んだ

地元の図書館で今夜わかるTCP/IP (Network)を借りて読みました。

先日読んだ今夜わかるHTTP (Network)」の姉妹本にあたります。

今夜わかるTCP/IP (Network)

今夜わかるTCP/IP (Network)

これまた2004年発行の古い本ですが、TCPとIPそのものは変わってないので十分学べました。

TCP/IPとは、TCPとIPの事(だけ)だと思っていたのですが、それだけではなくTCPとIPを用いた様々なプロトコルの総称だそうです。 そういうわけで、時代の流れで使われなくなった、あるいはあまり聞かれなくなったTCP/IPプロトコルもありますが、読んでいて「ああ、そういうのもあったなぁ…」と微妙に回顧できました。

本を読むだけだと、どうしてもセンモンヨウゴ*1だらけであまり楽しくないですね。学内ネットとか社内ネットとかで、機器やケーブルの現物を見て触ったり、いろいろ設定を試すことができればもっと楽しく学べると思うのですけれど。

ただ、付録1に「使える!TCP/IP関連コマンド」というのがあるので、これを参考にすると家でも小規模に遊べると思います。

次は、Amazonから買ったマスタリングTCP/IP 入門編 第5版を読む予定です。

*1:専門用語・横文字・略称など

GCC 4.9.1がリリースされました

GCC 4.9.1がリリースされました!

変更点は4.9.0からのバグ修正と、FortranOpenMP 4.0がサポートされたことです。

括弧初期化リスト(braced-init-list)内では順番に評価される

通常の引数の評価順序

C言語でもC++言語でも関数呼出しのために渡される引数の評価順序は未規定となっています。

#include<stdio.h>

void print_sum(int a, int b, int c, int d){
    printf("\n%d\n", a + b + c + d);
}

int main(){
    print_sum(printf("%s", "hello"), printf("%c", ','), printf("%s", "world"), printf("%c", '!'));
}

この例では文字数である"12"がprint_sumによって出力される前に、どのような順番で文字列が出力されるのか予想できません。 "hello,world!"と表示されるかもしれませんし、"!world,hello"と表示されるかもしれませんし、",!worldhello"と表示されるかもしれないわけです。

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

引数の評価順序の例外

しかし、C++には評価順序が保証される例外があります。

Working Draft, Standard for Programming Language C++ (N3936)より引用。

構文

expression-list:
initializer-list
initializer-clause:
assignment-expression
braced-init-list
initializer-list:
initializer-clause ...opt
initializer-list , initializer-clause ...opt
braced-init-list:
{ initializer-list ,opt }
{ }

N3936 8.5.4/4

引用と訳。

Within the initializer-list of a braced-init-list, the initializer-clauses, including any that result from pack expansions (14.5.3), are evaluated in the order in which they appear. That is, every value computation and side effect associated with a given initializer-clause is sequenced before every value computation and side effect associated with any initializer-clause that follows it in the comma-separated list of the initializer-list.

括弧初期化リスト(braced-init-list)の初期化リスト(initializer-list)とパック展開(pack expansions)を含む初期化節(initializer-clauses)は、現れる順番に評価されます。 つまり、与えられた初期化節と関連するすべての値の計算と副作用は、次のコンマ区切りのリストのすべての値の計算と副作用の前におこります。

[ Note: This evaluation ordering holds regardless of the semantics of the initialization; for example, it applies when the elements of the initializer-list are interpreted as arguments of a constructor call, even though ordinarily there are no sequencing constraints on the arguments of a call. —end note ]

[注:この評価順序は初期化の意味論に関係なく決まります。 例えば、通常はコンストラクタ呼出しの引数は順番に評価されないですが、初期化リストの要素をコンストラクタ呼出しの引数として評価する時がそれに当てはまります。]

まとめ

通常は関数呼出しのために渡される引数の評価順序は未規定で予想できない。 順序を保証する必要がある時は括弧初期化リストを使う。

コンストラクタ呼出しの仕方で結果が変わ(りう)る例:

#include<stdio.h>

struct print_sum{
    print_sum(int a, int b, int c, int d){
        printf("\n%d\n", a + b + c + d);
    }
};

int main(){
    // 出力は予想できない
    print_sum(printf("%s", "hello"), printf("%c", ','), printf("%s", "world"), printf("%c", '!'));
    putchar('\n');
    // 期待通りの出力
    print_sum{printf("%s", "hello"), printf("%c", ','), printf("%s", "world"), printf("%c", '!')};
}

実行結果(例)

!world,hello
12

hello,world!
12

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

最近読んだ本

今夜わかるHTTP (Network)

ネットワーク寄りの本が読みたいと思って地元の図書館へ行った時に見つけたので、借りて読みました。

今夜わかるHTTP (Network)

今夜わかるHTTP (Network)

古い本という事もあり誤植に関するメモを取らず、もう本を返してしまったのですが、もっと誤植があったと思います。 たとえば「"」であるべきところで「”」になってたり、余計なスペースが入っているなど。

さて、HTTPに関する話題を広く扱っているので、すでに知っている知識と読んでる内容を結び付けやすく思いました。 さらに深く学ぶためのポインタ*1も示されていたのもよかったです。

大雑把にHTTP周りを知ることができたと思います。

なお、同じ著者が「HTTPの教科書」という本を2013年に出しているようなので、より新しい情報はこちらに書かれてるかもしれません。

HTTPの教科書

HTTPの教科書

(kindleHTTPの教科書)

*1:RFCなど

最近読んだ本

いずれも読んだのは二回目なのですが、ほぼ内容を忘れてました。

誰も書かなかった SEサバイバルガイド ~やりたいことしかやらない「悪魔の流儀(デーモン・スタイル)」

誰も書かなかった SEサバイバルガイド ~やりたいことしかやらない「悪魔の流儀(デーモン・スタイル)」~ (WEB+DB PRESS plus)

誰も書かなかった SEサバイバルガイド ~やりたいことしかやらない「悪魔の流儀(デーモン・スタイル)」~ (WEB+DB PRESS plus)

目標を定め、それに最短距離で到達するためにはどうするか?それが悪魔の流儀(デーモン・スタイル、demon style)。

書かれている具体例は、いくらか規模の大きな会社で勤めているならば、そのままあてはめられるのかなーと思う。実際にこういう事をすれば非常に効率がいいし楽しいだろうなー。

そういう会社ではないとしても、基本原則は何も変わらないし、私にも当てはめることはできる。

レバレッジ勉強法

レバレッジ勉強法

レバレッジ勉強法

何を勉強するか。どのように勉強をするか。「何を」にもレバレッジをかける。「どのように」にもレバレッジをかける。

スティーブ・ジョブズの流儀

スティーブ・ジョブズの流儀

スティーブ・ジョブズの流儀

スティーブ・ジョブズが何を成し遂げてきたか。

スティーブ・ジョブズについての本だけど、他の人や企業についてもかなり公平な感じで書かれていた。

メモ

  • ビジョンを持つ
  • 選択と集中
  • 情熱そして忍耐
  • シンプルに (フォーカスする。ノーと言う)
  • 問題の解決に最短距離で
  • デザインとはいかに機能するか
  • マーケティングは演劇

上の二冊は、問題あるいは人生を楽に楽しく最速で解決するかに焦点があてられてる。読んでてかなり楽しかった。

どの本も「問題の解決」に焦点があてられてた。

特に、「させられてる」感はつらいので、そうではなく能動的に行動したいと気づかされた。 私はとりあえず数百件あったRSSフィードの登録をほぼ削除した。読みたくて登録したはずなのに、いつしか「読まされてる」感が強くなっていたし、フィードの消化にバカみたいな時間がとられていたことにも気づいたので。詰め込むフェーズはとっくに終わってた。

時間と心の余裕ができてかなりいい感じ。