7月 122012
 

RSAの話。

modulusをpublicKey.getModulus().toByteArray()で取得した際くっついてくる符号ビットが曲者。。
※BigInteger#toByteArrayは符号ビット付き2の補数表現となる
符号ビット1bit + モジュラス本体1024bit(鍵長1024bitの場合) → 129ByteのByte配列
となるため、C#のRSAParameters.Modulusに突っ込むには先頭の符号ビットに相当する1バイトを削って渡す必要がある。
ヘルプに何にも書いてないので謎だが、符号なしにしないとだめなようで。。
as3cryptoはそのまま突っ込んでも大丈夫なのに・・・

PrivateExponentはJavaでしか処理しないためそのままでも問題なく、PublicExponentについては17bit(65537固定)のデータのため、符号ビット”0″が付加されても無害。
(modulusは1024bit(8bitの倍数)なため符号ビットを付加するとあふれて129Byteになってしまうのが今回の場合問題となる)

キーペア作成@Java
[java]
//鍵作る
KeyPairGenerator generator = KeyPairGenerator.getInstance(“RSA”);
generator.initialize(2048);
KeyPair keyPair = generator.generateKeyPair();
RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate(); //Javaでとっとく
RSAPublicKey publicKey = (RSAPublicKey)keyPair.getPublic();

//modulusの先頭符号ビットを除去
byte[] modulusBytes = stripLeadingZeros(publicKey.getModulus().toByteArray());

//Bse64エンコードしてC#へわたす
BASE64Encoder encoder = new BASE64Encoder();
String modulus = encoder.encode(modulusBytes); //→C#に渡す
String publicExponent = encoder.encode(publicKey.getPublicExponent().toByteArray()); //→C#に渡す
[/java]

暗号化@C#
[csharp]
//鍵の取り込み
RSAParameters rsaParams = new RSAParameters();
rsaParams.Modulus = Convert.FromBase64String(modulus); //Javaから受け取る
rsaParams.Exponent = Convert.FromBase64String(exponent); //Javaから受け取る

RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider();
rsaProvider.ImportParameters(rsaParams);

//暗号化してJavaに渡す
byte[] targetBytes = new UTF8Encoding().GetBytes(target); //target:暗号化対象文字列。UTF-8でバイト配列化
//とりあえずPKCS#1パディング。第二引数をtrueにすればOAEPパディングも使える。
byte[] resultBytes = rsaProvider.Encrypt(targetBytes, false);
string result = Convert.ToBase64String(resultBytes); //Javaに返す
[/csharp]

復号化@Java
[java]
BASE64Decoder decoder = new BASE64Decoder();
byte[] src = decoder.decodeBuffer(cryptedData); //cryptedData:C#から受け取る

//ここでパディングや暗号化サービスプロバイダを指定できる。
//”RSA”は”RSA/ECB/PKCS1Padding”と同じ。
Cipher cipher = Cipher.getInstance(“RSA”);
cipher.init(Cipher.DECRYPT_MODE, privateKey); //とっておいた秘密鍵で初期化
byte[] resultBytes = cipher.doFinal(src);
String result = new String(resultBytes, “UTF-8”); //復号結果。UTF-8で復元
[/java]

7月 122012
 
  • Windows XP Professional SP2および3にて確認。
  • 右クリックメニュー>送る>圧縮(zip形式)フォルダを使用してzipファイルを作成する際、”.”から始まる名前のフォルダ(.settings等)が格納されない場合がある。
  • “.”から始まる名前のフォルダがサブディレクトリとして存在する場合のみ発生する。
例1
  • folder1
    • .folder2
      • file1.txt
      • file2.txt
    • folder3
      • file3.txt
  1. “folder1″を右クリック>送る>圧縮(zip形式)フォルダ で圧縮
  2. 作成されたfolder1.zipを展開すると、folder3しか解凍されない。
例2
  • .folder2
    • file1.txt
    • file2.txt
  1. “.folder2″を右クリック>送る>圧縮(zip形式)フォルダ で圧縮
  2. 作成された.zipを展開すると、.folder2フォルダが解凍される。
7月 122012
 
  • expした際、元のDBのキャラクタセット情報はdmpファイルに保持される。
  • NLS_LANGは基本的には無関係。
  • impする際、元のDBのキャラクタセットからインポート先のDBのキャラクタセットに変換される。

Oracle Technology Network (OTN) Japan – 掲示板 : Linux版Oracle10g …

  • Exp時は、常にデータベースのキャラクターセットで行われる。
  • Imp時は、dmpファイル内に記録されてたキャラクターセットからImp先のデータベースのキャラクターセットに自動的に変換される。

XMLType表のエクスポートおよびインポート

XMLデータは、他のデータベース・オブジェクトの場合と同様に、エクスポート側サーバーのキャラクタ・セットでエクスポートされます。インポート中、このデータはインポート側サーバーのキャラクタ・セットに変換されます。

XMLDB関係あるのかな?

コンテンツのエクスポートとインポート

Oracleエクスポートおよびインポートとキャラクタ・セット。Oracle Database expユーティリティは、常に、エクスポート・サーバーのキャラクタ・セットでユーザー・データ(Unicodeデータを含む)をエクスポートします。キャラクタ・セットはデータベースの作成時に指定します。

Oracle Database impユーティリティは、インポート・サーバーのキャラクタ・セットにデータを自動的に変換します。

8ビット・キャラクタ・セットのエクスポート・ファイルをインポートすると、一部の8ビット・キャラクタが失われる(つまり7ビットの対応するキャラクタに変換される)場合があります。この現象は、クライアント・システムに固有の7ビット・キャラクタ・セットがある場合、またはオペレーティング・システムの環境変数NLS_LANGが7ビット・キャラクタ・セットに設定されている場合に発生します。アクセント記号のある文字は、ほとんどの場合、アクセント記号が失われます。

Oracle Databaseのexpユーティリティとimpユーティリティでは、データをエクスポートまたはインポートする前に必要なキャラクタ・セットの変換が示されます。

注意:
エクスポート・クライアントとエクスポート・サーバーの間でキャラクタ・セットの幅が異なる場合は、変換によってデータが拡張されるとデータが切り捨てられることがあります。切捨てが発生する場合は、警告メッセージが表示されます。

7月 122012
 

FTPタスクが使用しているcommons-netライブラリが日本語環境のFTPに対応していない事が原因。
Antのドキュメントにも記載されている。

FTP Task

Warning: there have been problems reported concerning the ftp get with the newer attribute. Problems might be due to format of ls -l differing from what is expected by commons-net, for instance due to specificities of language used by the ftp server in the directory listing. If you encounter such a problem, please send an email including a sample directory listing coming from your ftp server (ls -l on the ftp prompt).

ファイル一覧を取得する際、日付が日本語で返されるとうまく解析できない模様。
また、Ant1.5以前はcommons-netではなくNetComponentsを使用するが、こちらでも同様の問題が発生する。

恐らく大抵のFTPクライアントは日本語環境のFTPサーバーに対応していない気がする…

対策
  • 方法1.ftp.exeを使う
    BATを書く要領で使える。多分。

  • 方法2.サーバー環境を変更する
    日付が英語で返されるようにすれば良い。

  • 方法3.commons-netを改造する
    面倒。

7月 122012
 
  • WSHのWScript.CreateObject(“WScript.Shell”).LogEventではソースは常に”WSH”。
  • ShellのEventCreateコマンドだとソースの指定は自由。
  • イベントID:0はLogEventだと作れるが、EventCreateだと作れない。ただしLogEventのイベントIDは決まっているのでいじれない。
  • 同じソースのイベントをシステムイベントとアプリケーションイベントの両方には作成できない。

参考:

7月 122012
 

環境:Apache2.2.6@WindowsXP SP2

  1. substコマンドで仮想ドライブを作る
  2. httpd.confでDirectoryディレクティブで仮想ドライブ内のパスを指定
  3. エラーで起動できない

SVN+WebDAVの場合も、LocationディレクティブでSVNPathあるいはSVNParentPathに仮想ドライブを指定すると、Apacheの起動はできるがリポジトリの参照ができない。

7月 122012
 

rotatelogsにパイプすればローテーションできる。

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    #24時間でローテート
    CustomLog "|bin/rotatelogs logs/access_log 86400" common
</IfModule>

ただし、logrotateのような世代管理は出来ない。

7月 122012
 

使えるは使えるんだけど、放っておくと知らない間に落ちてる。
レンタルサーバーの性質を考えると、ポート占有してサービスをホスティングするのは正直邪魔だろうから、殺されている可能性は高い。

ご利用上の注意の禁止事項には「daemonとしてサーバに常駐するプログラムの実行」とか書いてあるからこれかもしれない。
でも所詮解説ページだし、レンタルサーバサービス約款(134KB)にはどこにもそんな記述はない。。

一方、基本約款(193KB)には

前項各号のほか、当社は必要に応じ当社ホームページ(http://support.sakura.ad.jp/support/caution.html)において禁止事項および注意事項等を別途定めることがあるものとし、利用者はこれを遵守するものとします。

って書いてあるけど、レンタルサーバーの禁止事項とは別のページだし、誘導もない。
つまり約款上は何の問題もない…気がする…

まぁでもとりあえず運営の気持ちを汲んで使わない事にしておこう。。

7月 112012
 

した。
アップル – ノートパソコン – MacBook Pro Retinaディスプレイモデル – 技術仕様
2.3GHzモデルをメモリ16GBにカスタム。

本当はWindows機を買おうと思っていたのだけど、ことごとく微妙だったためMacに…
UltraBookはヘビーユーザーでは物足りないですね。特にメモリ。。
今時2~4GBが主流とか…
最低でも8GBはないと買う気が起きません。。。
LavieZ期待してたんだけどなー。
そうするとVAIOかLet’sNoteしかない感じだけど、Let’sNoteは高すぎ。
VAIOもなんかもう一歩感が…

まぁそもそもノートPC買ったところで使用率は結構低いと考えられるので、折角ならMacOSと高解像度ディスプレイという今手元にない環境を用意した方が良いかなと。
2kgは明らかに重すぎるし、15インチはどう考えてもでかいのだけど、秋冬まで待ってられない。。

どうやら届くのはWindows8が出る頃らしいので、BootcampでWinodws8入れてみるカナーとか。

7月 112012
 

※要参照:さくらのレンタルサーバーでのdaemon実行は禁止?

さくらのレンタルサーバーはJavaが入っていないが、自分で入れればJenkinsを動かす事が出来る。

1. Javaを入れる
  1. feebsdfoundationのJREをダウンロード(ちょっと古いので、OpenJDKとかを自分でビルドした方がいいかも?)
    FreeBSD Foundation Java Downloads
  2. 適当なディレクトリに解凍
[shell]
bzip2 -d diablo-latte-freebsd7-i386-1.6.0_07-b02.tar.bz2
tar xvf diablo-latte-freebsd7-i386-1.6.0_07-b02.tar
[/shell]
2. Jenkinsセットアップ
  1. war版Jenkinsをダウンロード
  2. 適当なディレクトリに配置
  3. 下記のような起動/終了スクリプト作成
  4. start-jenkins.shを実行して起動、stop-jenkins.shを実行して終了する事を確認
[shell title=”start-jenkins.sh”]
#!/usr/local/bin/bash
JENKINS_WAR=~/jenkins/jenkins.war
JENKINS_LOG=~/jenkins/jenkins.log
JAVA=~/java/diablo-jre1.6.0_07/bin/java
nohup $JAVA -jar $JENKINS_WAR > $JENKINS_LOG 2>&1 &
[/shell]
[shell title=”stop-jenkins.sh”]
#!/usr/local/bin/bash
kill `ps -ef | grep ‘[j]enkins.war’ | awk ‘{ print $1 }’`
[/shell]

※JENKINS_HOMEは~/.jenkinsとなる。

おまけ1. cron登録

マシンが再起動されても立ち上がるよう設定する。
効果があるかは試してないので不明…
[shell]
crontab -e
[/shell]

@reboot ~/jenkins/start-jenkins.sh >/dev/null 2>&1
おまけ2. Apacheからリダイレクトされるようにする

面倒だから試してないけど出来るかもしれない。
.htaccessでmod_rewiteが利用できるため、うまくルールを作ればリダイレクトできる可能性あり。

参考:
さくらレンタルサーバで java を利用する
configuring ProxyPass on .htaccess to show tomcat through apache http server – Stack Overflow
【さくら共用】RewriteRuleで静的URLにしようとしたら404エラー | Server Hosting Guide
システム起動時に特定のコマンドを実行するには - @IT
再起動時に一度だけ実行されるcron定義
Starting and Accessing Jenkins – 日本語 – Jenkins Wiki
webhtm.net日記: psをgrepした結果にgrep自身のプロセスを出力させない
プログラムを作ってます さくらのレンタルサーバでbashを使う