2013年2月17日日曜日

ローマ字を日本語の五十音順にソート

日本語でソートするのは面倒(?)でローマ字でソートしたいけど標準のsortだとアルファベティカルに並べてしまう.ということで,ローマ字をスコア化するスクリプトを書いた.既に誰かやってるのかな?てきとーに探しても見つからなかったので作った.

特徴

  • 短い?
  • 遅い
  • 改良しやすい
  • ローマ字にしか使えない
ということで,誰かもっと良いのがあったら教えてください.もしくは,改良しましたとかあったら報告ください.

コード

スコア算出用のテーブルの用意

母音をあ~おで1~5,子音をあ行から順に+5ずつ増加.これで1~50までのスコアを作る.

ローマ字による文字列をスコア化

正規表現でマッチさせます.つまり,遅い.解説も何もないので,下記コードを見てください.
CalculateScoreは1音節分のスコアの計算,ConvertNameToDigitsは1音節ずつマッチさせた結果を連結します.ConvertNameToDigitsで得た結果をリストに格納してsortに渡せば,ローマ字でソートしてくれます.ConvertNameToDigitsの結果をキーにした連想配列を作って,keysでkeyだけ取ってきてソートした順に連想配列のvalueを取るのが普通の使い方かな?
正規表現で音節を取ってくるところが気に入ってる.

使い方

  • ConvertNameToDigits("sato"); みたいに使います.結果は,文字列で1120 (=(10+1)+(15+5))です.

2013年2月3日日曜日

sysenter命令実行時にEIPに格納されるアドレス


  • 32bit
    • ia32_sysenter_eip msr
  • 64bit
    • ia32_lstar msr
ia32_lstar msrには、カノニカルアドレスが格納されている必要がある。msrの書き込みと読み込みは、特権レベル0またはリアルモードで実行する。以下の場合は、一般保護例外が発生する。

  • 特権レベルが0でない
  • ecxが予約された値または無効な値
  • If the value in EDX:EAX sets bits that are reserved in the MSR specified by ECX.(どう翻訳すれば良いのか。)
  • msrへの代入元レジスタのアドレスがカノニカルでなく、かつ、ecxが以下を示す値を格納している場合
    • ia32_ds_area
    • ia32_fs_base
    • ia32_gs_base
    • ia32_kernel_gs_base
    • ia32_lstar
    • ia32_sysenter_eip
    • ia32_sysenter_esp
Linuxだと、wrmsrやrdmsr命令に関しては、マクロが定義されている(LXR)。wrmsr_safeなども参考になる。

2013年1月31日木曜日

latex2rtfおすすめ

TeXで書いてたのに,Wordで出せとか言われること,よくあると思います.ありますよね.イライラします.

latex2rtf を使いましょう.大体解決します.

latex2rtf

素晴しい.Linux, FreeBSD, Windows, Mac に対応しているようです.大勝利ですね.細かいTeXのコマンドは使えないようですが,問題ないでしょう.一旦 rtf に変換して,Word なり何なりで細かい修正をすれば良いのです.

注:TeXで書いた原稿に,Wordの提供する英語の修正機能を使いたかっただけです.Wordは出来る子です.

2013年1月26日土曜日

makeのログをsyslogに渡す

make したときにエラーが出ても、メッセージが上方に流れてしまって、エラーの原因が分からなくなることがあります。私だけかも知れませんが。

そこで、対処として、make > ./make.log 2>&1 のようにすれば、カレントディレクトリのmake.logというファイルにメッセージがリダイレクトされます。後からmake.logを見れば、makeの結果が分かるわけです。

ただ、せっかくログ出力用のツールがあるので、これを使います。syslogです。

syslog へのログの転送

syslogへのログの転送にはloggerを使います。また、makeに関するログだけ別のファイルに出力した場合は、syslog.confを修正する必要があります。以下のコマンドで、syslogに向けてログを転送できます。

make 2>&1 | logger -p local3.info -s -t make

2>&1: stderrをstdoutに渡します。パイプへstderrを渡すには、これが一番スマートなやり方だと思います。
-p: ファシリティとプライオリティを指定します。
-s: stderrに出力します。
-t: タグを指定します。

syslog.confの修正

syslog.confを以下のように修正すれば、local3ファシリティのinfoプライオリティのログだけを分けられます。(>>でアペンドすることで正しく動作するかは怪しい。追記する行より上に !ppp とあると、pppからのログに関するポリシと見なされます。行頭に!が付いている行がある場合、その行よりも上にポリシを追加すべきです。)

% sudo echo "local3.info    /var/log/make.log" >> /etc/syslog.conf

Debian Squeezeなど、最近のディストリビューションでは、セキュリティの観点から、暗号化して計算機外部へ転送できるので、rsyslogを使うことが多いです。この場合、/etc/rsyslog.confに上記のポリシを追記してください。

多分、他に良い方法があるんでしょうね。makeにそれらしいオプションがあるとか?

Google アカウントのパスワード入力失敗時に表示される情報の差異

Google アカウントでログインしようとしたときに、間違ったパスワードを入力してしまいました。このとき、こんな警告が出ます。

これは問題ない。あたりまえですね。しかし、下の場合はどうでしょうか?

実は、ひとつ目の画像は、適当なパスワードを入力した場合に表示されるメッセージです。ふたつ目の画像は、以前使っていたパスワードを入力した場合です。

この表示の違いは、パスワードを忘れた正規のユーザにとってはありがたいものです。しかし、不正にログインしようとしている人たちに有利な情報を与えていないでしょうか?パスワードの変更がかなり前だった場合には、そのアカウントは頻繁にパスワードを変更していないことになります。つまり、長期的に多くのパスワードを与え続けやすいということです。頻繁にパスワードが変わるなら、不正にログインする側もあきらめるかも知れません。しかし、パスワードが長期的に変更されないアカウントに対しては、より積極的に不正なログインに臨むかも知れません。

また、以前使っていたパスワードとマッチしたら表示を変更するということは、不正にログインを試みようとした人に対して、有効なパスワードの情報を与えることになります。つまり、Googleは、ひとつのアカウントにつき、複数のパスワードを保持しているといえます。

本当にこのままで良いのか疑問です。利便性の向上と安全性の確保はトレードオフの関係にあると思いますが、パスワードに関してここまでの利便性が必要なのか疑問があります。また、2段階認証に取り組んでいるサービスにしては、そもそものパスワードの扱いに問題があるのではないかなとも。

asmregparmとは

 Linux 2.6.32 のビルドに失敗した。そのときに気になったasmregparmを調べたので報告。

ソースコードの取得とビルド

% git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux
% cd linux
% git checkout v2.6.32
% make oldconfig
% make menuconfig
% make
ここで失敗。

エラーメッセージを見ると、syscall_trace_leave関数の定義が違うとある(エラーメッセージは残してないので、覚えてる範囲で書く)。googleさんに聞くと、asm/x86/include/asm/ptrace.h の中の syscall_trace_leaveの定義に、asmregparm 修飾子が足りないとのこと[1]

このパッチを参考にコードを修正したところ、この問題は解決した。



asmregparmとは

で、asmregparm とは何か?答えは[2]にあります。ソースを探すと、arch/x86/include/asm/linkage.h の中に以下の定義があった。

#define asmregparm __attribute__((regparm(3)))

これは、型宣言時にregparm属性を付与する。__attribute__については、Unixwiz.netの記事[3]を参照のこと。regparm は、関数の引数をスタックではなく、eax, edx, および ecx レジスタに格納して渡すことを意味する。引数の 3 はレジスタに格納する変数の数。3 なら、第3引数まではレジスタに格納。詳細は、GNU の GCC Document [2] を参照。

参考:
[1] Patchwork x86: fix ptrace.o compile error, https://patchwork.kernel.org/patch/1301031/
[2] 5.24 Declaring Attributes of Functions, http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Function-Attributes.html
[3] Unixwiz.net - Software Consulting Central, Using GNU C __attribute__, http://unixwiz.net/techtips/gnu-c-attributes.html

2013年1月24日木曜日

標準エラー出力をパイプに渡す

あたりまえだけど,以下の方法で可能
% command1 2>&1 | command2
まず,最初に2>&1で標準エラー出力を標準出力に渡す.これで標準出力に標準出力と標準エラー出力がまとまったので,まとまった標準出力をパイプへ渡す.
参考:how do I pipe STDERR?