2014年8月6日水曜日

わかりにくいのpack,unpack関数を実際に試してみた

Perlにはpack関数、unpack関数というのがあって、プログラムの基本書にも載っていたりはするのだが、あの解説を読んでもさっぱりわからないのでちょっと試してみることにした。

pack関数、unpack関数の意味不明な解説の例
http://www.tohoho-web.com/wwwperl2.htm#pack
別にこのサイトが悪いわけではなく、 どれ読んでもこんな意味不明の解説しか書かれていない。

今回必要な項目をちょっと抜粋してみる。

pack(template, list)
バイナリデータを生成する。templateでlistがどんな形式のデータなのか指定する。
後ろに数値を付けるとその個数分、アスタリスクを付けるとlistの最後までバイナリデータに変換する。

unpack(template, expr)
バイナリデータを解釈する

templateの例
c  符号付き1バイト数値(-128 ~ 127)
C  符号無し1バイト数値(0~255)
H  hex string(high nybble first)

全く何言ってるのかわかんねーな。バイナリデータって何だよ!って感じ。

今回試してみるプログラムで必要なのでASCIIコード表のURLも貼っておく。
http://e-words.jp/p/r-ascii.html

必要な部分を抜粋すると、アスキー文字コード一覧は下記の通り。
文字 10進数 16進数
%    37    25
&    38    26

さて、まずはunpack関数からPerlのワンライナーとその結果をいくつか打ってみよう。
$ perl -e '
my $val = unpack("H2","%");
print $val."\n";
'
25

$ perl -e '
my $val = unpack("H2","&");
print $val."\n";
'
26

$ perl -e '
my $val = unpack("H","&");
print $val."\n";
'
2

$ perl -e '
my $val = unpack("H2","&%");
print $val."\n";
'
26

$ perl -e '
my $val = unpack("H4","&%");
print $val."\n";
'
2625

$ perl -e '
my $val = unpack("H5","&%");
print $val."\n";
'
2625

つまりunpack("H2", 文字列)
は文字列をASCII文字コードの16進数表記に直して、それを2桁出力するという関数になる。


今度はpack関数に関してワンライナーを試してみる。

$ perl -e '
my $val = pack("c",hex(25));
print $val."\n";
'
%

$ perl -e '
my $val = pack("c",hex(26));
print $val."\n";
'
&

pack("c",10進数数値)は逆に数値からASCIIコードを生成している関数ということになる。

結論としては、数値をASCIIコードに変換するのがpack関数で、ASCIIコードを数値に変換しているのがunpack関数ということのようだ。今回の使い方だとね。



2014年6月19日木曜日

ブラウザのリクエストを受けてから表示までの仕組みがわかりやすい「ブラウザにやさいいHTML/CSS」

メモ。ブラウザがリクエストを受けてからコンテンツを表示するまでに何をやっているのか、
わかりやすく解説をしている。




2014年3月21日金曜日

2014年3月13日木曜日

些末なコードレビュー - naoyaのはてなダイアリー

些末なコードレビュー - naoyaのはてなダイアリー
これは確かに難しい問題だと思う。スキルの問題ではあると思うが、レビューの際には致命的な設計上の欠陥よりも、些細な書き方の悪さのほうが気づきやすいということもあって、こういう感じのレビューになりがちなのは反省しなければならないところだ。

ただ、とは言えさすがにかんべんして欲しいレベルのひどい書き方もあるからな~。
例えば、

  1. キャメルケース(getHogeなど)とスネークケース(get_hogeなど)が同じモジュールに混在している
  2. unless句の中が複雑すぎてベン図を書かないとわからないレベル(unless(!$hoge && (!$bar || $foo))など)
  3. 何でもかんでも変数をぶち込んだ巨大ハッシュリファレンスをテンプレートに渡している
  4. 一つの関数が巨大化しすぎてもう読むのが嫌なレベル

とかもうかんべんして欲しい感じ。あんまり細かく指摘し過ぎると宗教みたいになるのでさじ加減が難しいところ。



2014年3月4日火曜日

ビットコイン取引所Mt. Goxのソースコード

ロシア人のハッカーがビットコイン取引所Mt. Goxのソースコードの取得に成功したようだ。
ロシアのハッカー、破綻したMt. Goxのソースコードと顧客データを入手したと主張

ソースコードはこれ。PHPで書かれているようだ。
http://pastebin.com/W8B3CGiN

function一覧はこんな感じ。業務がわからないと、内容さっぱりわからないな。
        public static function update() {
        public static function getRate() {
        public static function mergeSmallOutputs() {
        public static function splitBigOutputs() {
        public static function getTxInput($amount, $inputs = array()) {
        public static function getPaymentAddr($payment_id) {
        public static function getNullAddr($priv = false) {
        public static function getVerboseAddr($wallet, $description, $ipn = null, $user = null, $callback = null) {
        public static function getPermanentAddr($wallet, $user = null) {
        public static function getAddrWithOptions(\User\Wallet $wallet, array $options = [], \User $user = null) {
        public static function optionAddrEvent($addr, $hash_n, $block, $amount) {
        public static function optionAddrSellEmail($user, $oid, $type, $data = null) {
        public static function checkOrders() {
        public static function getAddressForOrder($order) {
        public static function sendAmount($address, $amount, $green = null, $inputs = array(), $fee = 0) {        public function getWalletHost() {
        public static function parseVersion($v) {
        public static function _Route_getStats($path) {
        public static function checkNodes($sched) {
        public static function importBlockClaim($hash, $n, $tx) {
        public static function parseScriptPubKey($pubkey) {
        public static function importBlock($id) {
        public static function importBlocks($scheduler) {
        public static function insertMisingAvailableOutputs($addr) {
        public static function runAddrTriggers() {
        public static function getAddressBalance($addr) {
        public static function getAddressOutputs($addr) {
        public static function claimPrivateSha256($wallet, $priv, $desc = null) {
        public static function claimWalletFile($wallet, $data, $desc = null) {        public static function claimPrivate($wallet, $priv, $desc = null) {
        public static function makeNormalTx($input, $amount, $final_output, $remainder, $fee = 0) {
        public static function publishTransaction($txs) {
        public static function broadcastPublished() {
        public static function _MQ_broadcastPublished($info) {
        public static function broadcastTransactions() {
        public static function getTotalCount() {
        public static function _Route_bitcoind($path) {
        public static function _Route_handleTx() {
        public static function getTablesStruct() {

ざっと見ていって適当にメモってみると、
balanceというのは残高のこと。
100000000などのマジックナンバーが何を意味しているのかよくわからない。1億ってなんだ?
$beanやらaddressというのは何を表しているのだろう?

頑張ってみれば、プログラムの穴も見つけられるかもしれないが、適当に覗いただけだと
よくわからんな。業務内容がよくわからないし。



2014年2月4日火曜日

FindBinモジュールの使い方

FindBinモジュールはスクリプトの実行ファイルやディレクトリを変数に格納するモジュール。
以下のコマンドを実行してみるとわかりやすいかと。

vim /hoge/test.pl
で以下のファイルを作成。
use FindBin;
print "Bin: $FindBin::Bin\n";
print "Script: $FindBin::Script\n";

コマンドを実行。
perl /hoge/test.pl

実行結果:
Bin: /hoge
Script: test.pl

cpanサイトはこれ。
http://search.cpan.org/~rjbs/perl-5.18.2/lib/FindBin.pm

Path::Classモジュールの使い方

Path::Classモジュールの使い方がよくわからなかったので調べていたら、CPANのSYNOPSISを見るのが一番わかりやすいという結論になった。
このモジュールはWindowsでもLinuxでもディレクトリやファイルのパス名をよしなに生成してくれるモジュールのようだ。
以下のワンライナーを実行してみればわかりやすいかと。

perl -MPath::Class -e '
my $dir  = dir('foo', 'bar');
my $file = file('bob', 'file.txt');
print "dir: $dir\n";
print "file: $file\n";
'
出力結果:
dir: foo/bar
file: bob/txt

これがwindows環境で実行すれば
dir: foo\bar
file: bob\txt
となるというのがこのモジュールを使うメリット。

cpanサイトはこれ。
http://search.cpan.org/~kwilliams/Path-Class-0.33/README.pod