2013年11月27日水曜日

rsyslogdで秒よりも細粒度の時間を記録する

rsyslogdは、最近のLinuxディストリビューションだと標準でインストールされているsyslogデーモンです。syslogdを拡張したものとしては、rsyslogdやsyslog-ngがありますが、syslog-ngは、ポリシがsyslogdと互換性がないなど、やや運用には手間がかかります。まあ、syslogdのポリシをsyslog-ngのポリシに変換するツールは確かsyslog-ngの中の人が提供してくれていたような気もしますが、私は標準でインストールされているrsyslogdを使っています。

rsyslogdになって何が拡張されているかというと、TCPを用いてリモートマシン上のrsyslogdにログを転送できます。syslogdでは、ログの転送にはUDP/514を用いますが、rsyslogdからはTCP/514を用いてログを転送できます。UDPの方が少しレイテンシは良いですが、高負荷な環境でないのならTCPを用いるのがベターでしょう。

で、rsyslogdによるログの転送速度を測定したかったのですが、rsyslogdで標準で記録できるタイムスタンプは、最も細かくても秒単位です。1,000回ログを転送したとしても1秒かからないので、このままでは、測定になりません。rsyslogdのソースコードをもってきて、ログの送信時間を秒よりも細粒度の単位でログメッセージに含めたり、複数回のログの受信時間を測定して、その時間を受信したログの数で割ったりしようとしましたが、ソースコードを書き換えるのは少し抵抗があります。性能を測定したいのに、ソースコードに手を加えるのはどうなの?という点です。

そこで、色々調べたところ、rsyslogdは、ログメッセージの形式をポリシで設定できるようです。そこで、より細粒度にタイムスタンプを記録できないかと調べたところ、%timegenerated%なるパラメータがありました。さすがですね。ただ、%timegenerated%と書いただけでは、標準のタイムスタンプと形式が変わりません。より細粒度な時間を記録するには、%timegenerated:::date-rfc3339%と書きます。rfc3339はインターネットにおける時間の取り扱いに関するRFCです。時間に関するパラメータとしては%timereported%もありますが、これは、受信したログに含まれる情報をもとにしてタイムスタンプを記録します。一方、%timegenerated%は、送信側がログを生成した時間を推測するようで、こちらの方が高精度です。ちなみに、timegeneratedとdate-rfc3339の間にあるコロンは、rsyslogにおけるフィルタに関係します。rsyslogでは、ログメッセージにフィルタを適用して指定した箇所だけをログに記録できます。コロンはログの開始位置と終了位置を指定するたのもので、%msg:1:2%と書いた場合は、%msg%のうち、1文字目から開始して2文字目までの範囲だけをログに記録します。このフォーマットではコロンは省略できないので、文字列を全部記録したいけどオプションも指定したい場合には、コロンが三つ並ぶ形になります。

高精度にタイムスタンプを記録するにはオプションを指定すれば良いことが分かりました。ここで気になるのは、どういったオプションがあるのかです。オプションの種類については、rsyslogのソースコードのdoc/property_replacer.htmlに書いてあります。タイムスタンプに関係するオプションとしては、date-mysql, date-rfc3164, date-rfc3164-buggyday, date-rfc3339, date-subsecondsが用意されています(2013/11/27現在)。それぞれ、以下のような形式で出力されます。

  • date-mysql: 20131127211715
  • date-rfc3164: Nov 27 21:17:15
  • date-rfc3164-buggyday: Nov 27 21:17:15
  • date-rfc3339: 2013-11-27T21:17:15.425969+09:00
  • date-subseconds: 425969

それぞれの詳細はドキュメントを参照していただきたいですが、秒未満を見たいだけならdate-subsecondsだけでも良いのですが、すべての時間を含む表示が得られるdate-rfc3339がもっとも詳細に多くの情報を取得できます。

しかし、ただログを受信して保存するだけのデーモンなrsyslogdですが、実は多機能でドキュメントもかなり充実しています。以外に便利なので、少し勉強してみてはどうでしょうか。ソースに同梱されているドキュメントが詳細でお勧めです。


2013年11月13日水曜日

勉強できる人と研究できる人の違い

話をしていて何とはなく感じたことを。

よく言われることだけど、勉強ができる人と研究ができる人は特徴がかなり違う。自分の感じた差異の中で重要だと何となく思っているのは、「主観的か客観的か」の違いだと思う。経験上(といっても数年だけど)、先輩、同期、後輩と学生を眺めてきて思ったのだけど、成績が良くて研究がいまいち進捗しない学生の特徴は、主観的だということ。まあ、主観的でも研究できる人については、たまたま彼等の主観が客観的に要求されていることとマッチしているだけなのかもしれないけど。

主観的な人だと、自分が理解して自分の中で納得したいので、割と教科書を読み込んで、突き詰めていく。だから、当然、試験では高得点を取れる。しかし、研究は、客観的な観察が必要だと思う。だって、今どんな問題があって、それを解決するために何が要求されてるかなんて、客観的に考えないと分からない。主観的に考えて分かる人は、その問題に実際に直面した人。でも、研究目的となる事例に実際に自らひっかかってそれを解決できるかというと、必ずしもそうではない。だから、主観的に過ぎる人は、何が問題なのかは何となく分かるんだけど、じゃあ、どういったアプローチでどう解決に持っていけば良いのかが分からない。

客観的な人だと、ある問題の周辺を調査し、その中から類似点を捜す。そして、適していると考えられるものから順に試していく。そして、試していく中で、さらに客観的な観察を重ねて、徐々に正解に近づいていく。主観的だと、試していく中で、俯瞰して周辺を見れないので、類似点や関連性について見落としがちだ。

結局は、言い古されているかもしれないけど、研究をしたいのなら、客観的に物事を観察できるようになろうということ。 別に研究に限らず、客観的に考えるということは、接客業や営業でも大事で、要は、相手の立場や色々な視点で考えるということ。これができないと、顧客の要求を満たせないので、お金は稼げないのではないかと思う。主観的な人で稼げるのは、本当にその分野の要求と主観的な要求がマッチした人で、そういった人は、どんどん深く掘り下げていって、大きな成果を残す。でも、そういった人は稀で、基本的には、客観的な分析と試行があってこそ、研究が地道な進歩を得ると思う。

駄文でした。

2013年11月11日月曜日

golang て if や for の次の行からはブロックを開始できない?

こういうのって構文として許されていない。多分、if や for の condition を括弧で囲んでいないせいだ。

ifを書きたい場合は、condition と同じ行からブロックを始めないといけない。
Xenのソースの書き方に習って今まで書いてたので、言語が違うとはいえ、括弧の位置の制約って結構慣れないな。


Installing CuteMarkEd on Linux Mint 15

CuteMarkEd is a markdown editor with GUI for Linux and Windows. Here is a page on GitHub. Installation instructions are described in here. (Be careful: I have already installed some packages like libc6, so, following procedure may not contain necessary packages. Read the documentation from developers of CuteMarkEd carefully.)
  • git clone https://github.com/loose/CuteMarkEd.git
  • cd CuteMarkEd
  • less README.md
  • git submodule update
  • sudo apt-get install ubuntu-sdk libqt5webkit5-dev qtquick1-5-dev qtlocation5-dev qtsensors5-dev qtdeclarative5-dev libgstreamer-plugins-base0.10 libgstreamer-plugins-base0.10-dev libhunspell-dev libxslt1-dev libsqlite3-dev
  • cd discount
  • ./configure.sh
  • make
  • sudo make install
  • cd ..
  • qmake CuteMarkEd.pro
  • make
  • sudo make install
 With these procedures, CuteMarkEd is successfully installed in my environment. However, it is installed to /usr/lib/x86_64-linux-gnu/qt5/bin/. $PATH does not contain that place. So, if you want to boot the editor with command easily just type 'cutemarked', change a location to install or make symbolic links to a place where $PATH contains. I created symbolic link to /usr/local/bin/ by a following command:
  •  sudo ln -s /usr/lib/x86_64-linux-gnu/qt5/bin/cutemarked /usr/local/bin/
It works well :-)

2013年11月10日日曜日

PerlでMeCab

Linux Mint 15でPerlを使ってMeCabを呼び出してみた。ドキュメントの通りにやったらできた。MeCabのPerlバインディングの使い方についてはここを参照。

  1. パッケージの導入
    1. % sudo apt-get install perl mecab libmecab-perl
  2. MeCab単体が使えるか確認
  3. Perlでソース書き
以下、テストのソース。動作としては、MeCabを単体で動作させたときと同じ。while文で標準入力を受けつけて、MeCab::Tagger の parse を呼び出してるだけ。

Linuxで画面の動画キャプチャからYouTubeへのアップロードまで

Linuxで画面キャプチャってどうやるのか調べた。Linux Mint 15 で試した。

  • キャプチャ:recordmydesktop
  • 編集:OpenShot
今回は、作成したキャプチャ動画をそのままYouTubeにアップロードした。YouTubeへのアップロード機能は、OpenShotが標準で備えている。 recordmydesktopはここを参照すれば分かる。OpenShotは雰囲気で使った。今回は長さを少し短くしただけなので、動画のプロパティをOpenShotから開いて長さを変更した。

これがキャプチャした動画。私の大好きなフリーセルです。



2013年11月7日木曜日

ファイルの拡張子の一括変換

ITProの記事を参考にしました。ITProの記事のスクリプトを少しだけ変更して、引数で渡した拡張子を持つファイルの拡張子を一括して特定の拡張子に変換するスクリプトを作成した。


これをch_ext_to_txt.shのような名前で保存して実行権限をchmod +xで付与してパスの通ったディレクトリに移動する。実行方法は、ch_ext_to_txt.sh tex とすると、拡張子がtexのファイルの拡張子をtxtに変換する。

で、これの最大の疑問は、${foo%word}です。大体想像はつくけど調べた。manpageを見ると、以下の説明(日本語)がある。
${parameter%%word}
パターンに後方一致した部分を取り除くword が展開され、パス名展開の場合と同じようなパターンを作ります。 このパターンが parameter を展開した値の末尾の部分とマッチする場合、展開結果は parameter を展開した値から最短一致パターン (``%'' の場合) または最長一致パターン (``%%'' の場合) を取り除いたものになります。 parameter@ または * である場合、 パターンを削除する操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter@ または * が添字になっている配列変数である場合、 パターンを削除する操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。
便利ですね。 つまり、parameter で渡した文字列からwordに後方一致した部分を取り除く、ということらしい。だから、${foobar#bar}としたらfooが返される。

シェルスクリプト便利ですね。

Linux Mint でキーボード配列をJISからASCIIに変更

なんのことは無いよくある話だけど、メニューが分かり難かったのでメモ。

メニュー → 設定 → 地域と言語

の順番で選択する。すると、Layouts タブがあるので、有効なリストの下にある+を選択すれば English (US) を選択できる。

因みに、ここでオプションを押すと、CapsLock を Ctrl として機能させられる。 これは、Ctrl key position で At left of 'A' を選んだ。

2013年11月1日金曜日

最近のWebアプリケーションの流行に関して思うこと

最近,Webアプリケーションが異様な勢いで普及している.少し前までは,Vectorなりフリーで配布されているソフトウェアを探して,どれが良さそうか探したものだ.でも,最近は,ブラウザからGoogleで検索すると,欲しいサービスがWebアプリケーションとして提供されていることが多い.Webアプリケーションの利点として以下があるように思う.
  • 試すのが簡単
  • 環境を選ばない
  • Google
試すのが簡単というのは,ブラウザでリンクをクリックすれば,その場で実行できているからだ.Windowsしか知らないけれど,昔は,ダウンロードして実行してみるかスクリーンショットや説明から機能を推測していた.しかし,最近は,ブラウザでページを開くだけで,すぐに実行できる.ダウンロードの必要もない.何をやるにしても,最初の手間というのは,厚い壁で,これが多くのユーザを敬遠させていたのではないかと推測する.

環境を選ばないというのは,つまり,標準的な機能を備えたブラウザさえあれば,どんな環境からでも利用できるということ.CPUのアーキテクチャなんてどうでも良いし,OSだって基本的には関係ない.さらに言うと,環境を選ばないということの他に,共通のインタフェースだという点が重要だと思う.UNIXから派生した各種OSが大量に亜種を生み出しながら発展していったのは,CUIという共通したインタフェースがあったからだ.シェルの違いは多少あっても,基本的にはコマンドを実行してその結果を閲覧するスタイルだ.これは非常に単純ながら効率的なのでとても使い易い.(これらの利点はGNUによるツールの貢献が大きいかもしれない)

Windowsには標準のパッケージ管理システムがない.Debian系列のLinuxディストリビューションならaptがある.これはすごい便利だ.キーワードで検索すればそれらしいアプリケーションやライブラリを提示してくれるし,バージョンアップだってやってくれる.最近は,Googleがこの役割を担ってくれている.

なんとなく思い付いたことをいくつか書いたけど,つまり,シェル=ブラウザになったことで,アプリケーションの基盤もブラウザになったということ.OSやアプリケーションもブラウザ主体で開発していくのが昨今の流れに沿ったスタイルなんじゃないかと思ったということ.そういう意味だとChromeOSが開発されたのは自然な流れだったのかもね.