複数ファイルをまたがって検索する事を何というか?

一般的には「全文検索」になると思うのですが、会社内では違っていた話。

会社で使用しているエディタはいくつかあるのですが、よく使われているエディタの一つが「MIFES」。 このエディタにグローバル検索という機能があり、複数ファイルを同時に検索できるので重宝しています。 最新のバージョンでは「グローバル検索(grep)」となっているようですが、会社で使っているバージョンでは「グローバル検索」とだけなっています。

ということで(?)会社内では複数ファイルをまたがって検索する事を「グローバル検索」や、他のエディタでの名称の「grep」と呼んでいます。 人によってはグローバル検索=grep検索と理解していました。

ふとした事から、grepってなんでそんな名前か知っているかみたいな話に。

grep(グレップ)は、UNIXおよびUnixオペレーティングシステムにおけるコマンド。テキストファイル中から、正規表現に一致する行を検索して出力する。

grepの名の由来は、ラインエディタedのコマンド g/re/p であり、その意味するところは「ファイル全体から (global) 正規表現 (regular expression) に一致する行を表示(print)する」である。

grep - Wikipedia より引用

みたいな話をしたら、何でそんな事知ってるの?的な反応でした。まあ、意志疎通ができれば良いので、グローバル検索でも、grep検索でも良いのですけど。こういう事をどや顔で話すのは格好悪いと思っていたので、控えていたのですがついつい。

grepの由来を知っていること自体は良いことだと信じていて、大学時代にUNIXプログラミング環境とか、古典に属する本とか、当時も直接使う事はない技術を学んでみたりしていたのがあるのだろうなと思います。今だと、なかなか過去に遡ったり、体系的に勉強したりしないので、学生時代の時間があるときに、やっといて良かったなと思います。( 言い訳して、勉強しないのもどうかと思うので、やりたい事、やるべき事はしていく! )

UNIXプログラミング環境 (海外ブックス)

UNIXプログラミング環境 (海外ブックス)

NGK2015B(名古屋合同懇親会 2015 忘年会)に参加した

NGK2015B(名古屋合同懇親会 2015 忘年会)に参加してきました。

昼の部は、他領域に渡るLTが良い刺激になりました。 ラジオ体操をして、良い得点だったのでTシャツをいただいたり。Kurusugawa | Kurusugawa Computer Inc.さんありがとうございます。

夜の部は、美味しい料理を食べながら近くの人達を中心に歓談できて楽しかったです。 昨年の忘年会以来に会った方々もいて、それだけでも参加した価値があったなーといった感じでした。

(夜の部の会場)

TensorFlow試してみた

TensorFlowを試してみました。まだ、上手く動かせていません。

Mac OSなので、pipを使ってインストール。

$ pip install https://storage.googleapis.com/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl

問題なくインストールできました。動かしてみる。

$ python
Python 2.7.10 (default, Jul 13 2015, 12:05:58)
…
>>> import tensorflow as tf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
…
TypeError: __init__() got an unexpected keyword argument 'syntax'

importしようとしたらエラーがでる。

調べてみたところ先人がいた。 tensorFlowのimportでTypeErrorが出る場合 - Qiita

TensorFlowはprotobufのVer3の構文を使用するが、インストールしてあるのが、Ver2.6なのでダメらしい。Ver2.6をアンインストールして、Ver3.0.0a4を手動で入れる。ここから入手。

$ sudo pip uninstall protobuf
$ tar zxvf protobuf-python-3.0.0-alpha-4.tar.gz
$ cd protobuf-3.0.0-alpha-4/
$ ./configure --prefix=/usr/local
$ make
$ make install

configure、久しぶりに使ったなあ。 protobufを入れてもまだ上手くいかない。パスの指定が不足している訳でもなさそうだが。

from google.protobuf import descriptor as _descriptor
…
DESCRIPTOR = _descriptor.FileDescriptor(
   name='tensorflow/core/framework/tensor.proto',
   package='tensorflow',
   syntax='proto3',
   serialized_pb=_b('\n&tensorflow/core/framework/tensor.proto\x12\nt    ensorflow\x1a,tensorflow/core/framework/tensor_shape.proto\x1a%tenso    rflow/core/framework/types.proto\"\xb5\x02\n\x0bTensorProto\x12#\n\x    05\x64type\x18\x01 \x01(\x0e\x32\x14.tensorflow.DataType\x12\x32\n\x    0ctensor_shape\x18\x02 \x01(\x0b\x32\x1c.tensorflow.TensorShapeProto    \x12\x16\n\x0eversion_number\x18\x03 \x01(\x05\x12\x16\n\x0etensor_c    ontent\x18\x04 \x01(\x0c\x12\x15\n\tfloat_val\x18\x05 \x03(\x02\x42\    x02\x10\x01\x12\x16\n\ndouble_val\x18\x06 \x03(\x01\x42\x02\x10\x01\    x12\x13\n\x07int_val\x18\x07 \x03(\x05\x42\x02\x10\x01\x12\x12\n\nst    ring_val\x18\x08 \x03(\x0c\x12\x18\n\x0cscomplex_val\x18\t \x03(\x02    \x42\x02\x10\x01\x12\x15\n\tint64_val\x18\n \x03(\x03\x42\x02\x10\x0    1\x12\x14\n\x08\x62ool_val\x18\x0b \x03(\x08\x42\x02\x10\x01\x62\x06    proto3')
…

どこで躓いているのかは分かるのに、対応方法が見えない。今日はあきらめて、また挑戦しよう。

標準出力をcloseするとどうなるのか?

標準出力を閉じると、出力されなくなるのか試してみた。 当たり前だけど、出力されなくなった。( Mac OS X で確認 )

gist8b6f99ad7d38734b76c1

$ gcc stdout_close.c
$ ./a.out
stdout:10
stderr:10
fclose(stdout)
stderr:10
$  gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include/c++/4.2.1
Apple LLVM version 7.0.0 (clang-700.1.76)
Target: x86_64-apple-darwin15.0.0
Thread model: posix

お試しコード

昔作ったお試しコードを見つけたので、アップする。 関数ポインタをmallocで確保するって事をやってる。 C言語オブジェクト指向的なプログラミングをやってみようとして作ったコードだったと思う。

gist65664512fc7c5f930760

codebreak;からBitbucketへ引越

codebreak;がサービス終了ということで、Bitbucketへプライベートリポジトリを引っ越しました。

Bitbucketに既存リポジトリをインポートする仕組みができあがっていて、思ったより簡単に引越できました。 ローカルの.git/configもurlの部分を直したのみで、上手くいっているようです。

codebreak;さんありがとうございました。Bitbucketさん、よろしくお願いします。

変数の有効範囲をどう伝えるか

仕事で変数の有効範囲を他者に説明する時に混乱したので整理してみる。

変数の有効範囲は、下記2つの要素で決まる。

  • 宣言箇所( 関数内, 関数外 )
  • 記憶クラス指定子( extern, static, auto, register )の指定

ソースで表すと

gist0473e607c28d6b6d97ff

仕事をするようになって、「関数内」の「記憶クラス指定子無し」の変数を「ローカル変数」から「オート変数」と呼ぶようになったのが大きそうです。

あと、オート変数はauto変数と記憶クラス指定子と関連していて、ローカル変数およびグローバル変数は宣言箇所と関連している*1のが混乱の元になっている。本来、組み合わせで変数の有効範囲を説明するべきなのに、片方だけを取り上げて有効範囲を説明している。

混乱の要因は整理できたと思うので、後は仕事先の言葉から外れないように有効範囲の説明をしていこう。

*1:関数内で宣言する変数は局所(ローカル)変数、関数外で宣言する変数は広域(グローバル)変数と説明している資料を見かける