sudo #2
普通の作業は一般ユーザ、管理の作業はrootと使い分けます。 気持ちを切り替えるためにsuコマンドを使って、 rootのパスワードを入力するようにします。 管理作業でも定型的なもの、 例えばDebianなら apt-get update; apt-get upgrade だとか、 Fedora Core なら yum check-update; yum update だとかは sudoでできるように設定します。 sudoで全てのコマンドが実行できるようにはしません。 全て「root権限を使うときは気持ちを切り替える」ためです。
一般ユーザのパスワードではなく、root のパスワードを入力するようにしたいのであれば、rootpw か runaspw か targetpw を設定すれば済む話でないかな。こんなの。
Defaults rootpw
文字列ソーティング #3
今度は単語単位のソートにしてベンチマーク。元データは同じく新聞記事約 30MBytes (単語数 5,727,663)。
ついでに MSD Radix Sort も加えてみた。
で、きむらさんのところを見て、そういや、プロファイルとってないなと思ったので、g++ -O2 -pg でコンパイルして gprof で結果を見てみた。suffix_compare が strcmp の代わりの functor なんだけど普通にやるとインライン展開されちゃうから無理矢理別ファイルに分けてリンクしてある。
algorithm | time[sec] |
---|---|
quicksort | 32.56 |
multikey quicksort | 9.45 |
merge sort | 20.46 |
MSD radix sort | 15.74 |
std::sort | 29.61 |
std::stable_sort | 21.17 |
==> mergesort <== time seconds seconds calls s/call s/call name 83.27 17.75 17.75 122506116 0.00 0.00 suffix_compare<unsigned char, int>::operator()(int, int) const 10.73 20.03 2.29 1009070 0.00 0.00 int* std::merge<int*, int*, int*, suffix_compare<unsigned char, int> >(int*, int*, int*, int*, int*, suffix_compare<unsigned char, int>) 2.35 20.53 0.50 main ==> msd_radix_sort <== time seconds seconds calls s/call s/call name 71.39 18.63 18.63 1 18.63 25.32 void _msd_radix_sort<unsigned char, int>(unsigned char const*, int*, int, int, int) 22.43 24.48 5.85 62083188 0.00 0.00 suffix_compare<unsigned char, int>::operator()(int, int) const 3.18 25.31 0.83 346637 0.00 0.00 void insertion_sort<int, suffix_compare<unsigned char, int> >(int*, unsigned int, suffix_compare<unsigned char, int>) ==> multikey_quicksort <== time seconds seconds calls s/call s/call name 81.37 16.93 16.93 1 16.93 20.27 void multikey_quicksort<unsigned char, int>(unsigned char const*, int*, int, int) 14.93 20.03 3.11 9933763 0.00 0.00 suffix_compare<unsigned char, int>::operator()(int, int) const 2.50 20.55 0.52 main ==> quicksort <== time seconds seconds calls s/call s/call name 87.77 28.60 28.60 178720117 0.00 0.00 suffix_compare<unsigned char, int>::operator()(int, int) const 9.04 31.55 2.95 1 2.95 31.58 void quicksort<unsigned char, int>(unsigned char const*, int*, int) 1.57 32.06 0.51 f() ==> stl_sort <== time seconds seconds calls s/call s/call name 90.18 28.31 28.31 163298909 0.00 0.00 suffix_compare<unsigned char, int>::operator()(int, int) const 5.74 30.11 1.80 598058 0.00 0.00 int* std::__unguarded_partition<int*, int, suffix_compare<unsigned char, int> >(int*, int*, int, suffix_compare<unsigned char, int>) 1.56 30.60 0.49 main ==> stl_stable_sort <== time seconds seconds calls s/call s/call name 84.90 18.58 18.58 125713536 0.00 0.00 suffix_compare<unsigned char, int>::operator()(int, int) const 9.85 20.73 2.16 818254 0.00 0.00 int* std::merge<int*, int*, int*, suffix_compare<unsigned char, int> >(int*, int*, int*, int*, int*, suffix_compare<unsigned char, int>) 2.33 21.24 0.51 main
MSD Radix Sort と Multikey Quicksort 以外について、比較関数の呼び出し回数と実行時間について並べてみる。
algorithm | 呼び出し回数 | 合計実行時間[sec] | 平均実行時間[nsec] |
---|---|---|---|
Quicksort | 178,720,117 | 28.60 | 160 |
Merge sort | 122,506,116 | 17.75 | 144 |
std::sort | 163,298,909 | 28.31 | 173 |
std::stable_sort | 125,713,536 | 18.58 | 148 |
要するにマージソートの方が、比較コスト、比較回数の両方で優れているということだな。
一応ソースを各種アルゴリズムの実装コードも書いておく。なんか変なところがあれば、指摘頼みます。
続きを読む和訳 or カタカナ
array → 配列は鉄板として、suffixは拡張子とか接尾辞になるでしょうから、 まあ何も考えなければ「接尾辞配列」になっちゃうんですかねえ。
まぁ、和訳しなきゃならないとすれば、接尾辞配列は妥当なところだと思います。
というより、「中央演算処理装置」とか「電子計算機」とかあまり言わないよなぁと。別にカタカナで「サフィックスアレイ」かそのまま「Suffix Array」でいいじゃんと。
そういや、国立国語研究所の発表した「ユビキタス」の言い換えに「時空自在」なんてのがありましたね。あれもどうかと思いましたけど。
モラルハザード
なんか国立国語研究所のページを見ていたらモラルハザードの用例が
少年たちによる殺人事件の多発,モラルハザード〔倫理崩壊〕が叫ばれる大人社会,自己中心性の肥大化など社会病理現象があらわになっている。
に。意味が
倫理観や道徳的節度がなくなり,社会的な責任を果たさないこと
になっている。あれー。
本来は保険用語で,保険をかけてあるからと故意や不注意で事故を起こしてしまう危険性をいった。経済全般での倫理の欠如による行為に広がり,さらに経済以外の領域にも拡大して,使われている。
それはちがうんじゃないかな。モラルハザードって保険などによって、リスク回避のインセンティブが薄れてしまうことで、全体で見たときのリスクが増加することであって、倫理は関係ないと思う。経済以外の領域にも拡大したというより、勝手に意味を推測して使う人が多くてそっちが定着してしまったつう話では。
転置インデックス
そういや、以前誰かが、輪講で inverted index を「逆インデックス」って訳していて、それはないわ、と思ったけど。
転置インデックスには大きく分けて2通りの手法がある。転置ファイルインデックス(inverted file index)は単語と、その単語を含む全ての文書をリストとして備えている。完全な転置インデックス(full inverted index) は、単語を含む全ての文書の他に、その単語が文書中のどこに現れるかという位置情報まで含んでいる。
転置インデックスの実装手法にも幾通りかある。最も単純なものは全ての文書IDとその保存位置情報をペアで格納したものである。ディスク容量の節約にはなるが、その分、機能性も乏しいものとなってしまう。(普通検索エンジンで行うような)単語検索は可能だが、(検索クエリで引用符でくくるような)フレーズ検索は不可能だろう。
ちょ、最後の文がおかしい。単語出現位置の情報もあるならフレーズ検索できるよ。
多分、元になっている英文はコレだな。
There are two main variants of inverted indexes: An inverted file index contains for each word a list of references to all the documents in which it occurs. A full inverted index additionally contains information about where in the documents the words appear. This could be implemented in several ways. The simplest is perhaps a list of all pairs of document IDs and local positions. An inverted file index needs less space, but also has less functionality. You can do term search (what you usually do in a search engine), but not phrase search (what you usually get when you put quotes around your search query).
あー、後半から日本語訳の主語が変になっているねぇ。「This could be implemented」の This は full inverted index のことでそのあと、inverted file index の話になっているのに、訳で主語を省くから変なことになっている。
結論。超訳勘弁。つか、主語省くな。代名詞が何を指しているかぐらい理解してくれ。
クラスメソッドの抽出 #2
okuji さん曰く
素直にinspect.classify_class_attrsを使ってはどうでしょうか。
あー、標準にそんなモジュールが。というわけでコレを使えばこうなりますね。
import inspect def get_class_methods(klass): return [attr[0] for attr in inspect.classify_class_attrs(klass) if attr[1] == 'class method']
あと、こういう他にこういう方法も
def get_class_methods(klass): return [name for name in dir(klass) if is_class_method(klass, name)] def is_class_method(klass, name): if name in klass.__dict__: attr = klass.__dict__[name] else: attr = getattr(klass, name) return isinstance(attr, classmethod)
あれ、そういや、クラスをあらわす変数名は cls と klass のどっちが多いんだろ。klass だと思っていたら inspect.py では cls だったからちょっと面食らった。まぁ、どうでもいいといえばどうでもいいけど。
Ruby では klass が標準的だよね。確か。
root のパスワード潰し
謎略語
某氏が使う謎略語+謎読み
- rootのパスワード = su pass
- str = スター
su pass は分からなくもないけどな。password なのか passphrase なのかはたまた path なのか。すでに su = Super User でもないしな。
スターの方は完全に意味不明だったな。
略語とか専門用語ってのはうまく使えば便利だとは思うんだけど、ある程度自明でよく使われる単語でないとかえってコミュニケーションに支障をきたすことになるってことを自覚すべきだよな。つうか変な略語を作らないでくれ、とか思うわけだが。
excuse me
例の「悪いことをしたときは日本人のふりをするんだ」ってやつ、なんか英語字幕付きバージョンが出たみたいなんだけど、なんで「足を踏んだときは『すみません』って言うんだ」ってところの「すみません」に「Excuse me」をあてているんだろう。普通に考えておかしいと思うのだが。