二日連続して体調不良につき休暇中。すまんな、「gadult」よ。またその内にでもあざみ野行くわ。
後輩二人が夏期休暇だか何かで休んでて、えらく静かな作業環境だった。こういう環境下でのコーディングは進む。
だが、現在の作業は相変わらず仕様書ばっかり。検査仕様書もそろそろ完成してきたから、簡単に試験でも始めるか。
さて、気胸の手術をしてから1年が既に経過していた。どんな手術をしたかっていうと、「こんな感じ」の手術です。
暑かったり寒かったりと、季候が極端な場合には肺が痛んだりするけど、今のところは無事な経過って感じかな。
去年の雑記を見直してみたけど、まだ打ち込みが終わってない部分があるし。さっさと手元のノートの内容をコピるか。
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したいんだが。向こう側も時間無さそうだし、いつになるんだか。
「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
もしかして常識だったりする?変数名がこんなんじゃ、可読性が上がるんだか下がるんだかわからんな。見てて不安になる。
昨日の日本語の暗号化のPerlソースにコメント追加。自分でも完全に理解できているかは怪しい。pack()
とか詳しくないし。
参考にしたのが「Perl の数値変換」というトコ。故mikeneko氏のサイトですが、相変わらずここの情報のお役立ち度は高い。
例えば掲示板系のCGIを作る際にはpack()
やらはフォームのデータをデコードする際に必須だけど、コピペで作ってたし。
そもそもバイナリ文字列にしたり、2進数の文字列にしたりとかは、普通に遊びでCGI作るくらいじゃ覚えないしな。
最近は「mixi」の新着日記で「Java」「Perl」やらで検索して色々と見てるんだけど、毎度のことながら気になることがある。
「Javaが云々」とかいうタイトルの日記の中身を見ていると、結構な確率でJavascriptの話が載っていたりする。
タイトルが「Javascriptが云々」という日記で、Javaの内容が書いてあるのはさすがに見たことは無いけどね。
学校の課題やらで無理矢理やらされる人たちにとっては、この辺の違いなんてどうでもいいんだろう。指摘するだけ野暮。
ってか、日記やらコミュニティやらの検索でキーワードを入れて検索ボタンを押下するけど、ここの制御が適当すぎる。
カーソルでボタンを押下すると二重検索防止でボタンがdisabled
になるけど、入力フォームからEnterキーは二重検索できる。
確かにこの類のボタン制御って地味にメンドい。ボタン押しても5秒以上反応無ければ再検索可能にしたりしないといかんし。
過去の雑記の文字の変換ミスやら何やらを色々と一斉に修正。暇な時に読み直して、修正箇所だけをメモってたのよね。
「今」が「居間」になってたりするのが一番多かったか。口語も文語も上手い感じに扱ってくれる日本語変換は無いものか。
後は、ソースの一部書き直したり。Perlだと最初の行で「#!/usr/local/bin/perl
」って書いたりするけど、これ要らないか。
そもそも、一部分だけを抜粋して載せていたりする部分もあるし、ぶっちゃけこの宣言無くても動かないこともないからな。
Javaの方のソースだと、流石にimport
文を無視して載せるとコンパイルすら通らなくなるから、あっちは全部載せるけど。
そんな感じで色々と作業してただけの一日。すまんな、「gadult」よ。ちと日曜に遊ぶのは苦しいのものがあるのですよ。