2014年11月12日水曜日

zgrepやzcat | grepでBinary file (standard input) matchesが出た場合の対処法

hoge_log.yyyymmdd.tar.gzみたいなログファイルを「zgrep 検索文字列 hoge_log.yyyymmdd.tar.gz」やら
「zcat hoge_log.yyyymmdd.tar.gz | grep 検索文字列」なんかで検索しようとしたら、結果が
「Binary file (standard input) matches」と出て困った。なんか解決法がないのか検索してみたら、
このページを見て解決。
http://nobuneko.com/blog/archives/2013/04/linux_grep_binary_files_text.html

つまりはgrepが対象をバイナリファイルとみなしているがためにこの現象が起きるみたい。

解決法としては、-aオプションを付ければよいようだ。これでテキストファイルとみなされ、
検索結果が表示されるようになる。つまりは、
zgrep -a 検索文字列 hoge_log.yyyymmdd.tar.gz

zcat hoge_log.yyyymmdd.tar.gz | grep -a 検索文字列
とやって検索すればOK。

2014年10月31日金曜日

【Perl】Mooseの使い方

Mooseとは簡単にクラスを作ることができるモジュールのようだ。newとかは実装不要。

package Foo;
use Moose;
extends 'FooParent'; #これで親モジュールを継承できる

has name => { #アクセサを定義する関数
  is =>   'rw', #rwは読み書きができ、roは読み取りだけ($Foo->name,$Foo->name("hoge"))
  isa => 'Str', #型の指定を行う
  default => "Bob", #デフォルト値を指定できる。sub {Hoge->config}のようにサブルーチンも可
  required => 1, #必須パラメータの場合は1を指定する
}

sub hoge { #メソッドの定義は普通に行う
  print "My name is".shift->name."\n";
}

参考:
http://perldoc.jp/docs/modules/Moose/Manual.pod

【Perl】AUTOLOADの使用例

定義されていない関数を呼び出すとこのAUTOLOADというのが呼び出される便利な関数。
cpanのモジュールを拡張して独自モジュールを作るような使い方ができる。

Foo.pm
#########################################################
package Foo;$

use strict;
use warnings;


sub AUTOLOAD {
>   our $AUTOLOAD;
>   my (@args) = @_;
>   print "autoload start..function_name:$AUTOLOAD\n";
>   print "argument is (".join(',',@args).")\n";
}

1;
#########################################################

$ perl -MFoo -e 'Foo::test("a","b","c")';
autoload start..function_name:Foo::test
argument is (a,b,c)

参考:
サンプルコードによるPerl入門 サブルーチンのオートロード AUTOLOAD
http://perldoc.jp/docs/perl/5.8.0/AutoLoader.pod

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


2014年1月31日金曜日

Setting locale failedの対処法

サーバーでPerlのコマンドを打つたびにこのような表示が出て困っている。

$perl -e 'print "hoge"'
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = (unset),
        LANG = "*******"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

どうやら以下の手順で直すことができるようだ。

$vim ~/.bashrc
でファイルに下記を記載する。
export PERL_BADLANG=0

$source ~/.bashrc

これで直った。



2014年1月6日月曜日

スクリプトの終了コード11のエラー

最初ググり方がわからなくて当惑したのでメモ。
このエラーはSignal 11、segmentation faultとして知られているエラー。
つまり割り当てられていないメモリを参照しようとしたときに起きるもの。下記参照。
http://linuxjf.sourceforge.jp/JFdocs/GCC-SIG11-FAQ/sig11faq.html
http://sonic64.com/2005-04-19.html
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1288299487