自堕落な技術者の日記

基本は喰ってるか飲んでるかですが、よく趣味でカラオケ・PKI・署名・認証・プログラミング・情報セキュリティをやっています。旅好き。テレビ好きで芸能通

フリーウェア

W3C Web Cryptography APIとの果てしなき戦い(第2回 RSA署名生成と検証)

前回は、 W3C Web Cryptography APIについて、一番簡単そうなハッシュの生成を紹介しながら、 幾つかの課題について紹介しました。

今回は、W3C Web Cryptography APIによる、 RSA公開鍵暗号によるデジタル署名の生成と検証を紹介していこうと思います。

署名と検証の例題って、よく一人の人というかプログラムが、 鍵ペアを生成して、署名して、検証するサンプルを出しますよね。( sjclの楕円暗号のテストコードとか・・・) 一人の人が同時に署名と検証を行うってユースケースとしてありえないと思うんですよね。 実際、私が見た当時、sjclでは鍵オブジェクトの秘密鍵と公開鍵を 分けてエクスポートができないようで、実際問題使えないことがありました。

そんなわけで、今回はまず、ちゃんとOpenSSLで生成した秘密鍵と公開鍵をインポートして、 署名の生成と検証をできるようにしたいと思います。 その後で、RSAの鍵ペアの生成をします。

データの準備

W3C Web Cryptoで鍵生成してもよいのですが、今回はOpenSSLで作ったRSA 2048bitの 秘密鍵で署名することにしたいと思います。PKCS#5 PEM形式の2048bit RSA秘密鍵を生成し、 それを平文のPKCS#8 DER形式に変換し、 bin2hexスクリプト で16進数文字列表現に変換します。

% openssl genrsa 2048 > k2048.p5p.pem % openssl pkcs8 -topk8 -nocrypt -in k2048.p5p.pem -outform DER -out k2048.p8p.der % bin2hex < k2048.p8p.der > k2048.p8p.hex #16進数形式のRSA秘密鍵
鍵ペアとなる公開鍵について、同様に16進数文字列形式のものを取得します。
% openssl rsa -in k2048.p5p.pem -pubout -out k2048.pub.pem # PEM形式の公開鍵 % openssl rsa -in k2048.p5p.pem -pubout -outform DER -out k2048.pub.der #DER形式の公開鍵 % bin2hex < k2048.pub.der > k2048.pub.hex # 16進数形式のRSA公開鍵
次に"aaa"という文字列に対して署名するとして、この文字列が含まれる署名対象 データファイルを作っておきます。
% echo -n aaa > aaa.txt
OpenSSLで前述の秘密鍵と署名対象データを使ってSHA1で署名すると結果のデータは以下のように 作られます。同様に16進数データを作っておきます。
% openssl dgst -sha -sign k2048.p5p.pem aaa.txt > k2048oaaa.sig.bin % bin2hex < k2048oaaa.sig.bin > k2048oaaa.sig.hex
OpenSSLで前述の公開鍵と署名対象データと生成された署名値データを使って検証するには 以下のように行います。
% openssl dgst -sha1 -verify k2048.pub.pem -signature k2048oaaa.sig.bin aaa.txt Verified OK
署名値は正しいことがわかります。

秘密鍵のインポートと署名の生成

秘密鍵の16進数値を使って文字列"aaa"に対してSHA1withRSAで署名する場合の、 W3C Web Cryptoのコードは以下のようになります。

var prvHex = "308204bd02010030..."; // 前節の16進数秘密鍵 var prvUint8a = hextouint8a(prvHex); // 秘密鍵のUint8Array var aaaUint8a = asciitouint8a("aaa"); // 署名対象aaaのUint8Array // PKCS8形式の秘密鍵を署名用にインポート window.crypto.subtle.importKey( "pkcs8", prvUint8a, { name: "RSASSA-PKCS1-v1_5", hash: {name: "SHA-1"} }, true, ["sign"] ).then( // 秘密鍵インポートに成功したら署名する function(prvKey) { console.log("**importKey** 成功"); console.log("prvkey=" + prvKey); return window.crypto.subtle.sign("RSASSA-PKCS1-v1_5", prvKey, aaaUint8a); }, function(e) { console.log("**importKey** エラー: " + e); } ).then( // 署名に成功したら署名値(ArrayBuffer)を16進数表示 function(sigVal) { console.log("**sign** 成功"); console.log("sigVal=" + abtohex(sigVal)); }, function(e) { console.log("**sign** エラー: " + e); } );
実装で注意しなければいけないポイントは以下の通りです。
  • OpenSSLの(平文の)PKCS#8秘密鍵を使うにはimportKeyで"pkcs8"を指定する。
  • 鍵使用目的で["sign"]を指定する。
コンソールに"sigVal="で表示された16進数の署名値は、 k2048oaaa.sig.hexファイルの値と同じになっていると思います。 hex2binスクリプト で署名値をバイナリデータに変換して、以下のようにOpenSSLで検証することが できます。うまく検証できたでしょうか。
署名値16進数をk2048waaa.sig.hexとして保存 % hex2bin < k2048waaa.sig.hex > k2048waaa.sig.bin openssl dgst -sha1 -verify k2048.pub.pem -signature k2048waaa.sig.bin aaa.txt Verified OK
hextouint8aについてはこちらをご覧ください。

公開鍵のインポートと署名の検証

前々節のOpenSSLで作った署名値でもよいですし、前節で生成された署名値でも よいですが、これをインポートした公開鍵で検証してみましょう。 以下のようなコードで検証することができます。

var pubHex = "30820122300d0609..."; // 前々節の16進公開鍵 var sigHex = "afd36b6f3f2af788..."; // 前節or前々節の16進署名値 var pubUint8a = hextouint8a(pubHex); // var sigUint8a = hextouint8a(sigHex); var aaaUint8a = asciitouint8a("aaa"); window.crypto.subtle.importKey( "spki", pubUint8a, { name: "RSASSA-PKCS1-v1_5", hash: {name: "SHA-1"} }, true, ["verify"] ).then( function(pubKey) { console.log("**importKey** 成功"); console.log("pubKey=" + pubKey); return window.crypto.subtle.verify("RSASSA-PKCS1-v1_5", pubKey, sigUint8a, aaaUint8a); }, function(e) { console.log("**importKey** エラー: " + e); } ).then( function(isValid) { console.log("**verify** 処理成功"); if (isValid == true) { console.log("**verify** 署名検証成功(一致)"); } else { console.log("**verify** 署名検証失敗(不一致)"); } }, function(e) { console.log("**verify** エラー: " + e); } );
実装で注意するポイントは以下の通りです。
  • OpenSSLの公開鍵をインポートする際には"spki"を指定する。
  • インポートする際の鍵使用目的に"verify"を指定する。
  • 署名検証の結果はブール値(isValid)で返されるのでこれに従う。 関数が呼ばれただけで安心して終わりにしない。

RSA鍵ペアの生成

上の例ではインポートした秘密鍵、公開鍵を使っていますが、 鍵ペアの生成だってできます。(現状RSAだけのようですが・・・) RSA 2048bitの鍵ペアは以下のように生成します。

var paramKeyGen = { name: "RSASSA-PKCS1-v1_5", // 現状ではRSA-PSS, RSA-OAEPは指定できなそう modulusLength: 2048, // 鍵長 publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // 公開指数 65537 hash: { name: "SHA-256" } // 署名のハッシュアルゴリズム?別に利用外のを指定しても良い? }; window.crypto.subtle.generateKey( paramKeyGen, // 生成する鍵ペアのための鍵長等の各種パラメータ true, // エクスポート可能にするかどうかのフラグ ["sign", "verify"] // 鍵使用目的 ).then( function(key) { console.log("**generateKey** 成功"); console.log("秘密鍵:" + key.privateKey); console.log("公開鍵:" + key.publicKey); }, function(e) { console.log("**generateKey** エラー: " + e); } );

Web Crypto APIの困った所5:importKeyの融通の利かなさ

こうしてこのブログをすんなり見ていただくと、「W3C Web Cryptoって簡単じゃん」と 思われるかもしれませんが、このような動く例を見つけるまで、かなりの紆余曲折があり 時間がかかっています。importKeyの正しく動く例というのが、仕様に記載されておらず、 他の方のサンプルも動くものあり、動かないものあり、何が正しいのかよくわかりません。 importKeyの引数には、

  • format - 鍵データの形式 (pkcs8, spki, jwk, raw)
  • keyData - 鍵データ (ArrayBufferView(Uint8Array)かJSONデータ)
  • algorithm - アルゴリズムのJSONデータ
  • exportable - エクスポート可能かのブール値
  • keyUsage - 鍵使用目的の配列 ["sign", "verify"] 等
を指定しますが、仕様がイケてないと思うのは
  • 鍵のデータ形式など指定させる必要があるのか。公開鍵か秘密鍵のバイナリかはASN.1構造を見ればわかる話。JWKだって区別はできる。
  • アルゴリズムの指定も必要性がよくわからない。pkcs8、spkiであれば、鍵アルゴリズムが何であるかわかるし、鍵のインポートの際に署名アルゴリズムやハッシュアルゴリズムを指定させる 意味がわからない。"RSASSA-PKCS1-v1_5"にするか"RSA-PSS"にするかは、鍵インポート時に決める必要がない。署名のハッシュアルゴリズムについても同様に決める必要がないのに、"MD-5"などサポート外のアルゴリズムを指定するとエラーとなる。JWKデータも同様に鍵アルゴリズムの指定の必要がない。
  • keyUsageの指定の必要性もよくわからない。例えば、RSASSA-PKCS1-v1_5で秘密鍵をインポートしたらkeyUsageはsignに決まっており、省略できることの方が多い。
  • JSON等指定の自由度が非常に高い割に、値の指定を間違えるとすぐにエラーとなり融通が利かない。省略可能やデフォルト値を持つ引数、パラメータがあっても良さそうだが、そのようにはなっていない。
  • algorithmのhashのパラメータ値でMozillaのテストコードでは"SHA-1"となっているが、仕様上は{name: "SHA-1"}となるのが正しいようでこれならChromeでもFirefoxでも動作する。前述のように必要の無いパラメータの指定方法が原因で実装により動作するもの、しないものがあり、相互運用性の問題が生じている。
そのような意味では、jsrsasignのKEYUTIL.getKey()メソッドでは入力は極力自動解析し最小のパラメータで動作するようになっていて、秘密鍵であろうが、公開鍵であろうが、JSON形式であろうが、鍵が暗号化されていようが、鍵アルゴリズムが何であろうが、許容範囲の広い実装となっています。

Web Crypto APIの困った所6:アルゴリズムサポート状況の不明瞭

前回紹介したCan I Use CryptographyのページでChrome等いろんなブラウザが フルサポートかのような記述になっていますが、W3Cの勧告候補でも特にどのアルゴリズムは 実装必須となっているわけではないようで、ECDSA、RSA-PSSなど サポートしていないアルゴリズムはかなり多いです。(IE11+ではSHA-1未サポートのよう) この辺りについてスペックがどうなっているのかブラウザベンダーから正式な開示が 無いようですし、仕様上も何をサポートしているかを知る術が特になく、 動かしてみて動かなかったら未サポートのような状況になっています。 そもそも、Java JCEやOpenSSLなどに比べたら、 アルゴリズムの数が圧倒的に少ないのですから、全アルゴリズムを実装必須(MUST) としても良いぐらいではないかと思います。 また、Java JCEではどのようなアルゴリズムをサポートしているかを知るためのAPIがあります。 ブラウザ毎のアルゴリズムや機能のサポート状況の比較は、 そのうち表などで比較できればと思っています。

Web Crypto APIの困った所7:サポートアルゴリズムの狭さと変なバランス感

W3C Web Crypto APIでは、 MD5、RSA暗号(RSAES-PKCS1-v1_5)など現時点で脆弱とされているアルゴリズムは除外されており、 サポートされているアルゴリズムはかなり限定的で狭いものです。 後方互換性や相互運用性のために使いたいというケースもあるでしょうから、暗号ライブラリとしては、 サポートしても良いのかなと思ったりもします。 その割には、例えばFirefoxではRSA鍵の鍵長が256bit〜7168bitをサポートしており、むしろそちらの方を制限すべきなのでは?とも思ってしまいます。 また、FirefoxではECDSAをサポートしていないのに、ECDHはサポートしているなど、同じECCの鍵生成なのに、このあたりのバランス感や優先順位も奇妙に思います。

Web Crypto APIの困った所8:鍵生成のパラメータ

例えばRSA鍵生成のパラメータですが、RSA署名やRSA暗号化のアルゴリズムを 指定しなければならないのかわからず、公開指数の指定の仕方も面倒で、 何故ハッシュを指定しなければならないのかわかりません。 また、これらのパラメータは省略は一切許されていません。 間違えるとエラーとなり、どこが間違っているのかに関するエラーメッセージは どの実装も非常に不親切です。

var paramKeyGen = { name: "RSASSA-PKCS1-v1_5", // RSA-PSS, RSA-OAEPなど指定する必要なくRSAで十分では? modulusLength: 2048, publicExponent: new Uint8Array([0x01, 0x00, 0x01]), // 整数65537でいいのでは?Uint8Array面倒 hash: { name: "SHA-256" } // hashが必須な意味がわからない };

高い相互運用性のために

一連のシリーズでは、最も汎用性が高くなるように、 window.crypto、window.crypto.subtleを使っており、 FirefoxやChromeでそのまま動く動作コードになっています。 これらに加え、IEやSafariなどいろんなブラウザで動かそうとする場合には、 以下のようなコード先頭に入れ、

var WC = null; var WCS = null; if (window.msCrypto) WC = window.msCrypto; // IE11+ if (window.crypto) WC = window.crypto; // FF34+,CH37+ and others if (WC.subtle) WCS = WC.subtle; // IE11+,FF34+,CH37+ and others if (WC.webkitSubtle) WCS = WC.webkitSubtle; // Safari 7.1+
window.cryptoの代わりにWCを、 window.crypto.subtleの代わりにWCSを使えば、 どこでも動く可能性が高くなるかと思います。

おわりに

今回は、RSA鍵ペアの生成、署名生成、署名検証についてみてみました。 今日はこんなとこで。

関連記事

(祝) Nexus 7 購入記念:Emacsな人に向く外部キーボードとスタンドとテキストエディタを求めて三千里

先日、台風で足止めを食った勢いで Nexus 7 (2013) を買ってしまい、最近遊び倒しています。前の中華パッド Cube U20GT ではBluetoothがついていなかったので外部キーボードが使えずに悲しい思いをしていたんですが、 Nexus 7はこれが使えるので嬉しいところです。外部キーボードとスタンドで、EmacsやEmacs風キーバインディングのエディタなど使ってなんとか我慢できるようなキー入力環境ができつつあるのでブログにで紹介しておこうと思います。 (この記事は頑張ってポケモンキーボードで書いています。)

試したBluetoothキーボードは手持ちだったり購入した次の3つです。他にも会社のiMacのBluetoothキーボードがあったはずなんだけど、取り上げられちゃったなぁ。返してほしいなぁ。

  • Nexus 7のアルミカバー兼キーボード
  • ポケモンタイピングDSに付属のポケモンキーボード★
  • サーバー感あふれるレーザー投射タイプのキーボード
スタンドはとりあえず買ってみた2つです。 EmacsチックなAndroidのエディタで比較したのはこの3つ
  • カスタムBusyboxで動作する本家Emacs
  • キーバインディングカスタマイズできるJota+
  • 斬新なUIながらもまだベータ版のKyoro Text

Nexus 7のカバーつきキーボード

お店によっては結構高いんですが、ちゃんと選ぶと2980円で買えちゃうし、ネットで見てたらレビューの評価も良さそうだったので買ってみました。スタンドにもなるしキーボードにもなるし、カバーにもなるしで一石三丁みたいな感じでよさげだったんですが、かなりイマイチ。 (今日見たらその店は2850円になってた。1980円から9000円ぐらいと同じ商品なのに値段の開きが随分あるので注意して購入してみてください。)

a1 (Custom)
Nexus 7にぴったりのカバーで質感もNexus 7の背面とそっくり。
a2 (Custom)
外すとこんな感じ。
a3 (Custom)
キーボードの上に溝があってタブレットスタンドにすることもできます。一見決まってるように見えます。
a4
キートップはこんな感じ。

  • ESCが無く、Altが右側だけでEmacsを使うには辛い
  • 入力方法がよくわからないキーがある。"+", "-", "|" とか。
  • 記号入力が結構ないかも
  • 逆にボリュームコントロールとかAndroidのソフトボタン相当はありこれは余計
  • キーピッチはかなり狭いのだが、キーストロークが意外に深くてとても打ちにくい
  • カバーを兼ねているのでキートップがアルミの外の縁よりも窪んだところにあり縁に手が当たって不快
  • アルミだし、Bluetoothのためのバッテリーもあって重め
というわけで、かなりイマイチ。プログラムを書いたりする人には向かないかもしれません。

ポケモンキーボード

中華パッドで使えるかと思って購入し繋がらず、iPhoneにも不要だったので、ずっと眠ってたポケモンキーボードでしたが、使ってみるとホント快適。キーピッチもキーストロークも悪くない。 1年半ぐらい前に1900円ぐらいで購入した記憶がありますが、アマゾンのタイムセールだと1400円で売っていたこともあったそうです。
b1(Custom)
キーボードの方がタブレットより若干大きいのは仕方ない。でも、とても打ちやすい。
b3
キートップはこんな感じ。必要なキーはちゃんとあると思います。無くて欲しいのはHome KeyとかPage Up/Downぐらいでしょうか。

  • 一般の人にもプログラマにも必要なキーはほとんどすべてある
  • 日本語、英語入力の切り替えも「半角・全角」でワンキーですむ。カーソルキーも助かる。
  • Emacsな人は「日本語106,109キーボード 」アプリをいれればCtrl, CapsLockを入れ換えられる
  • ポケモンキーボードの問題ではないが、iWnn IMEだとキー"「","」","\"の入力がおかしいようだ。Google日本語入力ではうまくいく
というわけで、いやー、プログラムでもテキストでもサクサク入力できてとても快適です。

レーザー投影型キーボード Magic Cube

2年前買ったっきりほっぽらかしになっていたレーザー投影型キーボード Magic Cube です。当時ブログに記事書いてました。(「サイバーなレーザー投影タイプのBlutoothキーボード「MagicCube」ユーザーレビュー」)

キーボードとしてのレビューは前と変わらないですが、レーザー投影なのでタブレットとMagic Cubeを角度つけたり離して置かなきゃならないのでイラっときますね。 本当はタブレットを置いた位置にMagic Cubeを置きたい。 いや、待てよ。Magic Cubeの上にタブレットが乗るようなタブレットスタンドを作ればいいんじゃないか?とも思いました。(いやいや、それほど手間をかけたくなるほど、入力しやすくないかw)
c1 (Custom)
キーボードがタブレット画面の正面に来ないので気持ち悪い。
c2
キートップはこんな感じ。カンマなど記号の並びがとても気持ち悪い。

アマゾンで買った777円のタブレットスタンド

とにかくデカすぎてかさばる。こりゃ、デカイiPadとか10インチクラスのタブレット向けでNexus 7にはToo Muchだよな。


d1 (Custom)
ほら、やっぱりかなり大きい。太いし。
d2 (Custom)
上からはみだしちゃってます。安定感はありますけど、こりゃ10インチタブレット用だ。

ドンキホーテで買った398円のタブレットスタンド

う〜ん、こりゃよい。コンパクト。おススメ。
e1 (Custom)
畳めば薄い。
e2 (Custom)
こんな感じで開いて
e3 (Custom)
うむ、完璧だ。安いし。

Emacs (for Android by zielmicha)

zielmichaさんのEmacsはカスタムのBusyBox上で動かしている本家GNU Emacsみたいだ。 ただ、外付けキーボードだ記号などうまく入力できず、日本語の入力もできないみたいだ。 頑張るには道のりが遠すぎて心が折れてしまった。

Jota+(イオタプラス)

Jota+(イオタプラス)は標準的な機能はきちんと網羅したテキストエディタだが、キーバインディングがカスタマイズできるのでEmacs風な編集ができる。CapsLockとCtrlを入れ替えればEmacsな人は快適にタイピングできると思う。

Kyoro Text

Kyoro Text (Mega Byte)は、UI表示が凝った標準的でないEmacs風キーバインディングのテキストエディタ&ビューアなんですが、完全にアルファ版の域を出てない感じでとても使いにくいです。

日本語キーボード106/109キーボードレイアウト

日本語106/109キーボードレイアウトは外付けの日本語キーボードのレイアウトを追加するアドオンだそうだ。 CtrlとCapsLockを入れ替えたバージョンも利用できるのでEmacsな方には重宝すると思う。

おわりに

e3 (Custom)
とりあえずは、ストレスあまりなくキーボード入力できる環境がととのってよかったです。 若干かさばるのさえ気にしなければ、それほど重くないしいいかなと思います。

今晩はこの辺で

(小ネタ)Mac Book AirのWiresharkでフォントをいじったぞ

Mac Book AirにCocoa Packet Analyzerを入れてみたが、あまり使い勝手が良くなく、やっと暇になったので慣れているWiresharkを入れることにした。

この解説などを見ると、そのままではWiresharkは動かず、やれ、コピーしろだのChmodBPFをStartupItemsに入れろだの解説があったのでビビったが、 最新の「OS X 10.6 (Snow Leopard) Intel 64-bit .dmg」で、何もせずに動作した。Intel 64-bitというのも特に問題ではなかった。GTkアプリなのでX Window上で動くのには感動した。

さて、Mac Book Airで使うにはフォントがデカすぎて一画面での情報量が少なくなっちゃうので、いくつかフォントをいじることにした。

まずはキャプチャ画面のフォントだが、これは普通にメニューの「Edit>>Preferences>Font」から設定すればよいがMacの固定幅フォントで「Menlo Regular 7pt」にしてみた。

GTkのフォントだがデフォルトの「Lucida Grande 13pt」ではどうもデカすぎるし、しっくりこない。この解説を見ると変えられるそうなのでやってみた。

具体的にはターミナルで

% cd /Applications/Wireshark.app/Contents/Resources/themes/(続く)
Clearlooks-Quicksilver-OSX/gtk-2.0
# sudoでviやemacsなどでgtkrc, pre_gtkrcを変更する
% sudo emacs gtkrc
# 最後から4行目あたり
gtk-font-name="これを好きなフォントに変更"
すればよいが、ぼくの場合には「Arial 8」にしたらイイ感じで、オッケーな感じになった。
wiresharkmac
Mac OS X 10.6 Snow LeopardのSafari 5.1.5のOCSP要求はHTTP POSTと オーソドックスなことがわかったんだけども、 https://www.verisign.com/ のサイトを開いたら なんでocsp.godaddy.comにも聞きにいくんだろ?後で見てみる。

追記

2015.02.11
Wireshark 1.12.1 (on OSX) では、キャプチャ画面のフォントの設定は
Edit>Preferences>User Interface>Font and Colors
になっちょります。MenloじゃなくてMS Gothicでいい気がしてきた。

svchostって何やってんだ

svchost viewer - Home
A program to see what all those svchost.exe are running.

Ever wondered what all those svchost.exe files are running ?? well here is an app
to tell you, gives you some basic infomation like the Name, Description and the
program path.

- No installstation required.
- Only requirement is that you have .net installed (ver 2.0 or newer).
- Work in Windows XP (sp2) and Vista and Windows 7(Beta).
- Coded in C#


Windowsのタスクマネージャでプロセス見てみるとsvchost.exeっていうプロセスが8つも動いていて、たまにそのうちの一つが異常に重かったりすることがあり、一体何やってるんだろうと思ったりしてました。

svchostview02



このフリーウェアを使えば、svchostが何やってるのかよくわかります。インストールも不要です、、、すばらしい、、、オススメ

svchostview01


Ng(Nihongo Micro GNU Emacs)

ちょっと前までcygwin環境では超軽量でEmacsライクなテキストエディタNg(Nihongo Micro GNU Emacs)を使っていたんですが、起動してもすぐスコンと落ちるようになっちゃって暫く放置してしました。ようやく時間も取れたのでビルドし直しました。

Ng 1.5beta1 のソースをNgサポートページから頂きましてビルドします。

% tar xvfz ng-1.5beta1.tar.gz
% cd ng-1.5beta1
% ./configure
% make
% strip ng.exe
% mv ng.exe ~/bin


前はコンフィグとかヘッダとかいじっていた記憶もありますが、面倒なのでデフォルトコンフィギュレーションで、、、、

前はコンフィグでやってたんですが、個人設定ファイルを作り漢字コードだけ設定しておきます。

ファイル:~/.ng
(set-kanji-input-code 'shift-jis)
(set-kanji-display-code 'shift-jis)


ng01



よかった、動いて、、、、

大昔のBSDのviは軽くて小さくて好きだったんですが、マルチリンガルのvimが主流になってからデカクテなんか嫌です。

1405952 Oct  9 22:53 /usr/bin/vim
173056 Apr 3 03:33 ng


にょほほ、、、やはり小さい、、、、

Emacs Lisp

恐ろしく久しぶりにEmacs Lispを書いてみました。

というのもXAdES署名をスキーマ検証してエラーは「何行何カラム目」のように出てくるんですが、Emacsには行だけや先頭からの文字数を指定してカーソルを移動するものはあっても、行とカラムを指定してカーソル移動させるコマンドはありません。

そこで仕方なく作ってみたのがこれ(大したものではありません)

(defun goto-line-column (line-number column-number)
 "goto line with column"
 (interactive "nline: \nncolumn: ")
 (goto-line line-number)
 (let ((point-goto (+ (point) column-number)))
  (goto-char point-goto)))


すっかり作法なんかも忘れていたんですが、"C:\Mule\lisp\*.el" などのソースをちょっと眺めた後、関数interactiveの書式を忘れたので M-x info でEmacs Lispのオンラインマニュアル見て書きました。(すっかりinfo のナビゲーションも忘れていたし、、、、、)

人工知能はあまり役に立たなかったけど、強力なテキストエディタEmacsと、Javaが生まれてきたのと、綺麗な(これが大事)オブジェクト指向設計だけは役に立ったかなと、、、、

JavaやRubyなどオブジェクト指向の言語を使えるからといって、オブジェクト指向ぽくない実装をされる方はいるようで、C++、JavaやRubyなどコード見てると結構mainに数百行の長ぁ〜〜〜いコードを超手続き的に書いてみたり、ループの入れ子を何段も作っちゃったりとかありますよね(^^;
最新記事
Categories
Archives
Twitter
記事Google検索

本ブログ内をGoogle検索
Yahoo!アクセス解析
Travel Advisor
記事検索
QRコード
QRコード
  • ライブドアブログ