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なども参考になる。