おおいわのこめんと


2016-09-06

[Comp] xtermの日本語文字幅

Linuxを1999年ごろからずーっと使っていて、 未だにデスクトップ環境を使わずに 素の fvwm を使っているような化石だったりするのですが、 何だかんだいって必要が出てきたので、 少し前に EUC-JP から UTF-8 にごそっと移行しました。 コンソールも kterm から xterm に。

でも、Unicode の日本語 (CJKV全般) の文字幅の扱いには いろいろ問題があって、en-US.UTF-8 だけでなく ja_JP.UTF-8 ロカールでも ★ とか £ とかいろいろな文字が 半角幅になってしまうなど、なかなか困っていました。 最近になって、silenvxさんの記事 辺りを 参考に xterm の周辺をいじっていたのですが、 今度は aptitude など curses の罫線が崩れるなど、 それはそれで問題が生じるので、 ぼぎ〜てっくさんの xterm のバグっぽい仕様辺りも参考に、とりあえず 自分なりに解消してみました。

具体的には、「日本語の罫線って使わないよね?」ということで、 「CJK環境向けの全角優先の文字幅」「ただし罫線だけ半角」というロカールを作りました。 本当は xterm が、『DEC 罫線のエスケープシーケンス [ESC ( 0]*1 で出した罫線』を強制で半角扱いしてくれれば小細工要らないんですが、 プログラムにパッチ当てるのは後のメンテナンスが面倒そうなので、小手先で。

Debianでの使い方 (wheezy-lts で確認):

  • まず、こちらにある UTF-8-CJK-LD.gz を、 /usr/share/i18n/charmaps/ に置きます。
  • /etc/locale.gen の、ja_JP.UTF-8 の行を、
    ja_JP.UTF-8 UTF-8
    から、
    ja_JP.UTF-8 UTF-8-CJK-LD
    に置き換えます。 ファイルに「自動生成が云々」と英語で書いてある場合は、 上書きされないようにその指示に従ってください。*2
  • /usr/sbin/locale-gen を実行します。

root なしで解決したいとか、他のディストリビューションの場合は、 ぼぎ〜てっくさんの記事やその周辺を参考に、各自工夫してください。

とりあえずこれで、xterm はそこそこ「希望通り」に動いてくれるように。 思いっきり「Unicode の標準に準拠しない解決」なので、正式採用される見込みは0ですが、個人的には満足。

screen とか putty は世話しきれないので、silenvx さんのサイトで見つけた terminfo の改変でごっそり罫線機能を削除して、 罫線を ASCII で表示するようにしてしまいました。

*1 これ、DEC 罫線って正式なコードじゃなくて、思いっきり user-defined の外字扱いなんですね。

*2 手元の2つの環境で食い違っていて、どちらがより「クリーン」なのかがわからないんです...。


2016-06-20

[Security] Webとセキュリティとソフトウェア工学

超久しぶりに、かつ真面目な内容で更新です。

徳丸浩さんのTwitterでの

何度でも言うが、自力でトラブルシューティングできない人や組織は、自前でWordPres立ててはいけない / “一般ブロガーがAmazon Web Service(AWS)で独自ドメインのWordpressサイトを10分で作る方法…”
に対して、 山田さんの(恐らく)達観したコメント
「こうやってセキュリティが素人プログラマーや、見習いプログラマーを殺すんだろうなぁ。想像していたとはいえ、現実になってくると絶望しかない。」
を、 奥くんのコメント経由で見たわけです。

正直なところ、徳丸さんの元のコメントには100%同意で、山田さんもわかった上での達観なんだと思うのです(少なくとも「批判」ではないと思う)が、 ソフトウェア科学→セキュリティ→ソフトウェア工学 と仕事がどんどん移ってきた人間として、色々と思うところはあります。

90年台に日本で民用 Internet の黎明期を見てきた人間は、自分自身も含めてアリアハンで「ひのきのぼう」でスライムを倒しながら経験積んできてるんですよね。 そういう思いからすると、「危ないから銅の剣で外を素人が歩くな」というのは心情的には悲しいのですが、 そうは言ったって、外をドラゴンとかが跋扈している状況じゃ、仕方がないってものです。RPGと違って人に迷惑かかりますし。 で、本当の問題は「銅の剣」の部分だと思うのです。

個人的には、今のWebや組込みシステムや制御システムのセキュリティ問題の根幹に、 「システム全体の複雑度の増加に対して、ソフトウェアの作り方の工学の発展が全くフォローしていない」 ことがあると思っています。 外部との界面や外部からの攻撃も多様化し、ソフトウェア自身の機能も大幅に増えて複雑化していて、「正しいソフト」を作るのすら大変になってきているのに、 それを支えるソフトウェアセキュリティの機構はというと、せいぜいCからJavaやPythonやRubyに変わったことで、バッファオーバーランを防げるようになったくらい。 規模の問題の方はOOPなりフレームワークなりアジャイル+テストファーストなり、それなりに頑張ってきたと思うのですが、セキュリティに関しては正直、「銅の剣」か「たけやり」レベルと思っています。*1 WAFとか「被せる」「監視する」タイプの防衛策は進展していますが、振る舞いベースの「攻撃らしい」「攻撃らしくない」判別タイプの検知は、有効性はすごくあっても本質的な「バグに対する解決」ではないわけです。

以前から情報漏えい事故とかでも気になっているのですが、Unixローカルシステムの頃はアカウントの概念がシステムにあって、アプリの動作と関係なくシステム側でファイルの所有権は管理していたのに対して、 Webになって認証もアプリ動作も複雑になったのに、データは DB のシステムアカウントに全部フラットに格納して*2、アプリケーションのロジックだけでアクセス制御をするようになった辺りから、 なんか「退化しているんじゃないか」という気はしているのです。 もちろんUnixの機構をそのまま使えって意味ではなく、同じレベルのアクセス制御をちゃんとWebシステムの根底に設計して入れるべきではないか、という意味です。

自分自身が趣味ベースでのソフトウェアを昔ほど書かなくなったのも、敵をよく知っているからこそ、趣味ベースで銅の剣では戦う気にならなくなってしまったわけで。 商業ソフトを書いている人たちは素直にすごいと思いますが、Lv99の人たちが銅の剣で「戦えてしまっている」が故に、それでよし、となってしまっている面もある気がしています。

今本当に必要なのは、ちゃんと初級者(20年前の自分のレベル)でも当時と同じくらいには安全なシステムを作れるような、ソフトウェア工学的に本質的に「高性能な武器」を、ちゃんと考えて開発することなんじゃないかと思います。 「Lv1の勇者がいきなりドラゴン倒せる武器ってどんなもんだ」って感じですけど、どちらかというと必要なのは「よろい」の方かな。 これはLv1の入門者だけじゃなくて、Lv99の熟練者にとっても、本質的なプログラムをいかに安く快適に正しく作れるか、という意味で重要だと思うのです。 もちろん「何となくシステムがセキュリティを守ってくれるもの」というのではなく、「自然とセキュアな正しいプログラムが書ける」もの、という方向性であるべきです。 こういう事を言うことは、セキュリティ兼ソフトウェア科学兼ソフトウェア工学 というラベルになってしまった自分の仕事を増やすだけなんですけど、 プログラミングが好きでこの世界に入った人間として、プログラミングが楽しくない状況は素直に悲しいので、職業としてというよりも、一探求者としての研究者として、「何とかしたい」という思いはあります。

*1 セキュアプログラミングとかの best practice 系はそれなりに蓄積がありますが、RPGの例えで言えばどちらかといえば「訓練でLvを上げて、竹槍でドラゴン倒しましょう」の方向だと思うのです。

*2 DB暗号化はありますが、アプリ作成者側の認証と結びつくものはあっても、アプリ利用者側のアカウント等と紐ついたりするものは、なかなか「欲しいもの」が見つかっていません。


2014-04-14

[Misc] Radix Economy の話

仕事でなんとなく3値論理を調べていて、 「そういえば3進法(非整数でも良ければ e 進法)が数学的には最も効率がいいって言うんだよなぁ」 と思いだしてしまったのが事の発端。

Radix economy といって、端的に言うと

b 進法で、各桁の表現に b のリソースを要求されるとき、大きな数字を表現するのに漸近的に最もリソース利用効率がいいのは何進法か。

という問題で、上のページを見てもらうとわかりますが比例係数が \[b / \log b\] になるので、この最小値が \[b = \mathrm{e}\] のとき、整数では \[b = 3\] になります。4進法で1桁当たり信号線4本を使うのと、2進法で1桁当たり信号線2本を使うのが同じ効率になるのも、理解できます。

でも、上のページでは色々と初期の計算機の話が書いてあったりするのですが、 現代の普通のコンピュータでは2進法のほうがどう考えても効率がいいよな、と思ってしまったわけです。 それで、なんでこんな結果が出ているのかなと考えたら、 結局は「(少なくとも現代のコンピュータでは)2進法の使うリソースは1ビット当たり2本ではなく1本」で、「信号がない」ということに情報を割り当てているから差が出るわけです。

さて、それではどう直すかなのですが、現代的な情報量の概念を入れて1桁あたり \[\log b\] のリソース消費とかしたら、全く計算の意味がないわけです。元の定義の気持ちを生かしつつ、2進法について辻褄が合うことを考えると、とりあえず元の定義に一番近い修正としては、 「『0 = 信号なし』で表現できるので、\[n - 1\] 本の信号線で十分」 と直せそうです。例えば3進法の場合、「1」「2」の2本の信号線があって、何もなければ0という意味。あきらかに2進法に都合の良い設定ですが、とりあえずの変更としては妥当じゃないかなぁ。

さて、これで計算やり直してみますか、と思いついたのが運の尽き。計算の誘惑にズブズブとはまっていきます。久々にやると楽しいね(笑)

先ほどの Radix economy の計算式は、

\[E(b,N) = b \lfloor \log_b(N) + 1\rfloor \sim b \log_b N = \frac b{\log b} \log N\qquad(N \to \infty)\]

だったのですが、これを

\[E^-(b,N) = (b - 1) \lfloor \log_b(N) + 1\rfloor \sim (b - 1) \log_b N = \frac {(b - 1)}{\log b} \log N\qquad(N \to \infty)\]
と書き換えて、\[\log N\] を取り去って定義域を実数化した \[f(x) := \frac{x-1}{\log x} \quad (x > 0)\] の増減を考えます。Gnuplot にかければ一発じゃん……とか言わずに。 (計算の続きを読む) ...

……ふぅ。間違えてないよなぁ(こっそり Gnuplot にグラフ書かせてそれらしいことは確かめている)。久々の計算なので、ドキドキしながら増減表。

\[\begin{array}{c|cccc}
x & +0 & & 1 & \\\hline
g'(x) & -\infty & - & 0 & + \\\hline
g(x) & +\infty & ^+\searrow & 0 & \nearrow^+ \\\hline
f'(x) & +\infty & + & (1/2) & + \\\hline
f(x) & (0) & \nearrow & (1) & \nearrow
\end{array}\]

はい、結局のところ、単調増加です。この設定では1進法は「無限桁必要で各リソース0」という意味のないケース(そもそも極限はあるけど値は未定義)なので、2進法が最適効率になります。

グラフ

グラフ書いてみました。まぁあまりに2進法に有利すぎる設定ですが、 その上もずーっと単調増加なのはわかったかなと。

逆に考えると、非同期式計算機の実現方法の中には、2進法での0信号線と1信号線が別々に用意されている(「計算中で未確定」という状態を、両方0で表す)ものがあるので、そういう場合はやっぱり3進法が若干効率が良い、ということにもなるのですね。


2013-10-12

[Misc] 関西転勤

あー、わざと意味ありげに書いた前のエントリからもう半年経ってる……。 日記もTwitterもすっかりご無沙汰になっていて、もう皆さん存在を忘れられているのではという気になっていますが。申し訳ありません。

実は5月1日から関西・尼崎に転勤になっています。産総研関西センターにある、セキュアシステム研究部門のシステム検証関係グループのマネージメントのため、一時的に大阪に移りました。グループのメンバーは知っている人も多いので、そこはあまり困らず。1年超えたあたりで、一応つくばに戻る「予定」です(「予定とは未定の意味」とはよく言ったものですが)。

いろいろな手続きから賃貸契約・解約から引越しから、どたどたと4月頭から準備して、ゴールデンウィークを使って移動しました。引越し屋さんによると、5月頭は、4月にとりあえず単身転勤した人が家族を呼ぶ時期だったりして、なかなかのハイシーズンだったそうです。引越し代むちゃくちゃ高かった……。

で、大阪ぐらしですが、正直あまり遊んでません(苦笑)。初めての関東圏離脱ですが、まぁ街は住めば都で、長期間根を下ろすとまた印象が変わるかもしれませんが、居候としては意外と何とかなる印象。

で、もうそろそろ半年ですが、もう出張で17回も東京に戻ってるんですよねぇ。新幹線に乗っている時間の合計を計算するのが怖いです。来週は2回東京に行きます。間には大阪の予定がすでに入っているので、2往復、新幹線だけで10時間(総移動時間は14〜16時間ほど)ですよ(笑)。


2013-04-21

[Misc] つくば暮らし

日記の更新が止まってもう2年くらい放置していて申し訳ないのですが、 2012年3月から、つくばに引っ越しています。

2012年4月に、これまでの情報セキュリティ研究センターがセキュアシステム研究部門に改組され、高信頼ソフトウェアグループのリーダーを引き受けることになったので、片道2時間の通勤時間が厳しくなってきた、というのが最大の理由です。 初めての一人暮らしなので右も左もわからず、手探りでやってきた感じですね。 職場から徒歩15分の場所に家を借りたので、だいぶ時間の節約にはなりました。 とはいえ、平均週1回、多いと週4回くらいは東京に出かけるので、なんか行ったり来たりになっちゃってます。 お客さんにつくばに来ていただくのは遠いですからねぇ。

車を中古で買ったりして、それなりに一人暮らしを満喫してみたり。車を運転するようになると、ちょっとだけ一人前になったような変な気持ちがします。

と、今更更新しなきゃいけない理由があったからこんな記事を書いているのですが、つくばぐらしの続きはまたそのうち追記という事で。


大岩 寛 (おおいわ ゆたか) <yutaka@oiwa.jp.nospam ... remove .nospam> .

Copyright © 2005-2014 Yutaka OIWA. All rights reserved.
Posted comments and trackbacks are copyrighted by their respective posters.

記事の内容について (Disclaimer / Terms and Conditions)