雑記帳 2006年 7月第4週

2006/07/16 Sun - 07/17 Mon.

二日連続して体調不良につき休暇中。すまんな、「gadult」よ。またその内にでもあざみ野行くわ。

2006/07/18 Tue.

後輩二人が夏期休暇だか何かで休んでて、えらく静かな作業環境だった。こういう環境下でのコーディングは進む。
だが、現在の作業は相変わらず仕様書ばっかり。検査仕様書もそろそろ完成してきたから、簡単に試験でも始めるか。

さて、気胸の手術をしてから1年が既に経過していた。どんな手術をしたかっていうと、「こんな感じ」の手術です。
暑かったり寒かったりと、季候が極端な場合には肺が痛んだりするけど、今のところは無事な経過って感じかな。
去年の雑記を見直してみたけど、まだ打ち込みが終わってない部分があるし。さっさと手元のノートの内容をコピるか。

2006/07/19 Wed.

import java.io.*;
public class test {
    public static void main(String[] args) {
        try {
            if (testA() || testB() || testC()) {
                System.out.println("This is Test.");
            }
        } catch (Exception e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            System.out.println(sw.toString().trim());
        }
    }
    public static boolean testA() {
        System.out.println("Call testA");
        return true;
    }
    public static boolean testB() {
        System.out.println("Call testB");
        return true;
    }
    public static boolean testC() {
        System.out.println("Call testC");
        return false;
    }
}
C:\>javac test.java -sourcepath C:\

C:\>java test
Call testA
This is Test.

OR演算って、一つでもtrueが返ってきたらその場で判定処理を終了する、こんな事すら今まで知らなかった。平気か自分?
コーディングしてる部分で条件判定がややこしいモノがあって、そこの書き方を何とか綺麗にできないかと悩んでたりする。
とりあえず、OR演算のif文の中にbooleanを返すメソッドを呼んでるものがあったら、処理が重いものを後ろに回すべきなのか。

さて、ようやく外部仕様書が完全に終了。昨日になって突然画面に変更が入った部分の画面イメージを張り替え忘れてた。
詳細設計仕様書の方も9割以上できてるし、さっさとDRしたいんだが。向こう側も時間無さそうだし、いつになるんだか。

2006/07/20 Thu.

mixi」の「日記」にもメモってことで書いたんだけど、排他的論理和を用いて簡易暗号化を行ってみる。激しく役に立たん。

import java.io.*;
public class encryptByExclusiveOr {
    public static void main(String[] args) {
        try {
            int n1, k, c, n2;
            n1 = 16;
            System.out.println("n1 = " + n1);
            k = 8;
            System.out.println("k = " + k);
            c = n1 ^ k;
            System.out.println("c = " + c + "(n1 ^ k)");
            n2 = c ^ k;
            System.out.println("n2 = " + n2 + "(c ^ k)");
        } catch (Exception e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            System.out.println(sw.toString().trim());
        }
    }
}
use strict;
my ($n1, $k, $c, $n2);
$n1 = 16;
print "\$n1 = " . $n1 . "\n";
$k = 8;
print "\$k = " . $k . "\n";
$c = $n1 ^ $k;
print "\$c = " . sprintf ("%d %s\n", $c, "(\$n1 ^ \$k)");
$n2 = $c ^ $k;
print "\$n2 = " . sprintf ("%d %s\n", $n2, "(\$c ^ \$k)");

Java版とPerl版を書いてみた。判定条件部の最適化を考えていたら、斜め上の発想が出てきて、こんなソースが出てきた。
何かしらに使えないものかと考えてみたけど、こんなん何に使えというのだ。Perlの方なら日本語も何とか暗号化できるか?

use strict;
my $str = "暗号化試験";
print "元の文字列 :" . "\n" . " " x 4 . $str . "\n";
print "\n" . "- - - - - - - - - - 暗号化開始 - - - - - - - - - -" . "\n\n";
#    バイナリ文字列を2進数の文字列に変換
my $str_unpack = unpack ("B*", $str);
print "元の文字列をunpack (\"B*\", \$str)したもの :" . "\n" . " " x 4 . $str_unpack . "\n";
#    バイナリ文字列を2進数の文字列に変換した文字列長を取得
my $str_unpack_length = length ($str_unpack) / 8;
#    暗号化キーは大きすぎない数値で設定
my $key = 256;
print "暗号化キー :" . "\n" . " " x 4 . "$key" . "\n";
my @crypt_line;
#    元の文字列のバイト数ループ
for (my $count = 0; $count < $str_unpack_length; $count++) {
    #    バイナリ文字列を2進数の文字列に変換したものを8文字ずつ取得
    my $temp_str_unpack = substr ($str_unpack, $count * 8, 8);
    #    2進数の文字列をバイナリ文字列に変換し、そのバイナリ文字列を10進数に変換、
    #    さらにその10進数の数値を暗号化キーで排他的論理和による暗号化を行い、配列に追加する
    push (@crypt_line, unpack ("C*", pack ("B*", $temp_str_unpack)) ^ $key);
}
print "暗号化した文字列 :" . "\n" . " " x 4 . join ("", @crypt_line) . "\n";
print "\n" . "- - - - - - - - - - 復号化開始 - - - - - - - - - -" . "\n\n";
my $str_new;
#    配列の数ループ(元の文字列のバイト数ループ)
foreach (@crypt_line) {
    #    10進数の数値を暗号化キーで復号化を行い、その数値をバイナリ文字列に変換、
    #    さらにそのバイナリ文字列を2進数の文字列に変換し、変数に追加する
    $str_new .= unpack ("B*", pack ("C*", $_ ^ $key));
}
#    2進数の文字列をバイナリ文字列に変換する
$str_new = pack ("B*", $str_new);
print "復号化した文字列 :" . "\n" . " " x 4 . $str_new . "\n";
C:\>perl test.pl
元の文字列 :
    暗号化試験

- - - - - - - - - - 暗号化開始 - - - - - - - - - -

元の文字列をunpack ("B*", $str)したもの :
    10110000110001011011100111100110101100101011110110111011111011101011100010110011
暗号化キー :
    256
暗号化した文字列 :
    392451397390393443398398396433

- - - - - - - - - - 復号化開始 - - - - - - - - - -

復号化した文字列 :
    暗号化試験

何だか無理やりすぎるし、そもそも暗号化キーは最大でどの値まで設定できるんだろうか。9桁くらいまでは使えそう。
例えで使っている「256」という数値でも2進数にすると「100000000」となるし、10進数で10桁とか計算したくもない。
10進数で5桁の「65536」でも2進数だと「10000000000000000」になる。ダメだ、思考を停止しておいた方が身のためだ。

おまけ。Javaの変数名が内部でUnicode扱いされていたのは知っていたけど、こういうものも動くってのは知らなかった。

import java.io.*;
public class test {
    public static void main(String[] args) {
        try {
            String 文字列 = "文字列";
            int 数値 = 10;
            System.out.println(文字列);
            System.out.println(数値);
        } catch (Exception e) {
            StringWriter sw = new StringWriter();
            PrintWriter pw = new PrintWriter(sw);
            e.printStackTrace(pw);
            System.out.println(sw.toString().trim());
        }
    }
}
C:\>javac test.java -sourcepath C:\

C:\>java test
文字列
10

もしかして常識だったりする?変数名がこんなんじゃ、可読性が上がるんだか下がるんだかわからんな。見てて不安になる。

2006/07/21 Fri.

昨日の日本語の暗号化のPerlソースにコメント追加。自分でも完全に理解できているかは怪しい。pack()とか詳しくないし。
参考にしたのが「Perl の数値変換」というトコ。故mikeneko氏のサイトですが、相変わらずここの情報のお役立ち度は高い。
例えば掲示板系のCGIを作る際にはpack()やらはフォームのデータをデコードする際に必須だけど、コピペで作ってたし。
そもそもバイナリ文字列にしたり、2進数の文字列にしたりとかは、普通に遊びでCGI作るくらいじゃ覚えないしな。

最近は「mixi」の新着日記で「Java」「Perl」やらで検索して色々と見てるんだけど、毎度のことながら気になることがある。
「Javaが云々」とかいうタイトルの日記の中身を見ていると、結構な確率でJavascriptの話が載っていたりする。
タイトルが「Javascriptが云々」という日記で、Javaの内容が書いてあるのはさすがに見たことは無いけどね。
学校の課題やらで無理矢理やらされる人たちにとっては、この辺の違いなんてどうでもいいんだろう。指摘するだけ野暮。
ってか、日記やらコミュニティやらの検索でキーワードを入れて検索ボタンを押下するけど、ここの制御が適当すぎる。
カーソルでボタンを押下すると二重検索防止でボタンがdisabledになるけど、入力フォームからEnterキーは二重検索できる。
確かにこの類のボタン制御って地味にメンドい。ボタン押しても5秒以上反応無ければ再検索可能にしたりしないといかんし。

2006/07/22 Sat.

過去の雑記の文字の変換ミスやら何やらを色々と一斉に修正。暇な時に読み直して、修正箇所だけをメモってたのよね。
「今」が「居間」になってたりするのが一番多かったか。口語も文語も上手い感じに扱ってくれる日本語変換は無いものか。
後は、ソースの一部書き直したり。Perlだと最初の行で「#!/usr/local/bin/perl」って書いたりするけど、これ要らないか。
そもそも、一部分だけを抜粋して載せていたりする部分もあるし、ぶっちゃけこの宣言無くても動かないこともないからな。
Javaの方のソースだと、流石にimport文を無視して載せるとコンパイルすら通らなくなるから、あっちは全部載せるけど。
そんな感じで色々と作業してただけの一日。すまんな、「gadult」よ。ちと日曜に遊ぶのは苦しいのものがあるのですよ。