Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

2015-04-01から1ヶ月間の記事一覧

TeraTerm等、設定データをファイルで設定してるWIndowsツールはVirtualStore機能との兼ね合いに注意

Windowsの神ツールTeraTermをはじめ、設定データをファイルで設定しているWindowsアプリは Win7から導入された新概念VirtualStoreがうまく連携できない可能性があるって話です。 BIG VirtualStore is watching Files! shuzo-kino.hateblo.jp この記事には定…

nlコマンドを使うと、ファイルに行数がついてくる

ちゃんと設定されたエディタだと、行番号が左側についてたりしますよね。 ただ、デフォのcatやlessではないのが実際。 そんなときは、nlコマンドを使うと楽できます。 パイプを通すので、他のツールとの連携も楽々。 使い方 なにも指定しなければ、左側に行…

Enumerable#drop_whileで、条件に一致したもの以降を捨てる

こんな配列があったとします。 buff = [2,6,7,1,2] これを、ある特定条件以降で切り捨てたい場合……drop_whileが使えます。 使い方 なんらかの都合で順番通りに処理したい場合も使えますが*1 buff.drop_while{|i| i < 5} #>> [ 6, 7, 1, 2 ] 順当な使い方から…

Mathライブラリとcase文をつかって、桁の接尾辞(kとかMとか)を出す

Math#log10について Math#log10は、その名の通り与えられた数値にlog10を適用した結果を出すメソッドです。 Math.log10(12_345_678) #>> 7.091514945509202 元の数値を3(=log10(1000))で割った結果を与えると…… (Math.log10(12_345_678) / 3) #>> 2.3638383…

Benchmark-IPSでRubyベンチマークを便利に使う

Benchmark-IPSはRuby標準添付のBenchmarkライブラリを便利に拡張してくれるGemです。 使い方 導入 $ gem install benchmark-ips 用例 普通のBenchmarkならbmメソッドを呼び出すところ、 ipsメソッドを呼び出すあたりが違います。 また、IPSならcompare!とい…

名前付きパイプをつかう

名前付きパイプはファイルシステムを活用し仮想敵なパイプ処理を実現する機構です。 使い方 mkfifoコマンドで作成します。 $ mkfifo /path/to/pipe $ ls -la pipe prw-r--r-- 1 shuzo_kino staff 0 4 25 11:43 pipe $ file pipe pipe: fifo (named pipe)ファ…

zcatやzlessを使ってgz系で圧縮されたファイルの中身をみる

zcatやzlessを使うと、gz系で圧縮されたテキストファイルの中身をみる事ができます。前回の記事で扱ったような、Wikipediaのベトナムに関するページの圧縮ファイルがあったとします。 $ tee >(wc -l >&2) < vietnam.html | gzip > vietnam.gz 3638実は、テキ…

プロセス置換の出力先はデフォで標準出力

Wikipediaのベトナムに関するページを圧縮する仕事があったとします。 その上、どういうわけか、ファイルの行数を知りたいそうです。個別にコマンドを叩いてもいいですが、ここはプロセス置換で楽をしましょう。 やり方 プロセス置換の枠内で、wcの出力先を…

tar.gzの正体と、その作り方

UNIX系を弄っていると、よく遭遇するのがtar.gzだのtar.bz2だのといった圧縮ファイルです。 なんで拡張子が二個並んでるんだ? と思ってましたが……tarは梱包しかやらないそうで*1、圧縮したい場合更にgzipなりで固める必要があります。 とはいえ……まとめて、…

Process Substitution(プロセス置換?)を使って、地獄の名前付きパイプや一時ファイルからサヨナラバイバイ

Process Substitution(プロセス置換?)は、ぱっと見リダイレクトっぽい構文の素敵テクです。 これを使えば地獄の名前付きパイプや一時ファイルからサヨナラバイバイ。 使い方 $ diff <(command1) <(command2) とやれば、コマンド間出力の比較ができます。 …

selectでBashでも対話型っぽいコマンドを実装可能

selectを使うと、Bashでも対話型っぽいコマンドを実装可能です。 実際のところ #! /bin/bash select type in "hoge" "fuga" do echo "You choose $type." done exitこれを実行すると $ bash sample.shell 1) hoge 2) fuga #?とでます。 試しに1を選ぶと #? …

プロセス間で文字列の受け渡しをしたい場合、/proc/$(PID)/fd/$(NUM)が使える……かも?

/proc/$(PID)/fd/$(NUM)とは…… PIDに繋がってるI/Oに対し文字列を流し込む超絶技です。 0は標準入力、1は標準出力、2は標準エラー。3以降は設定していれば別途使えます。 実際のところ 標準入力から文字を受け取って処理、終了するsort.rbというスクリプト…

pidofで、コマンド名から稼働中のプロセス番号がわかる

pidofは、コマンド名から稼働中のプロセス番号を調べることができるコマンドです。 $ pidof catとやれば、 7143てな感じでプロセス番号がわかります。複数のコマンドについて実行も可能です $ pidof ruby cat 21528 21465 21527 21464 インラインで実行もで…

「BinData」で長さが不明の文字列を使いたい場合、count_bytes_remainingを使う

文字列の長さを指定してくれない不親切設計なパケット設計てありますよね。 そんな場合、count_bytes_remainingが使えます。 使い方 以下の例だと、末尾13文字を除いて途中の文字を:dataに放り込んでくれます # ... count_bytes_remaining :bytes_remainin…

軽い仕事のためにディレクトリ移動したくない場合、グループ化を起動させると楽

別の仕事を実行中、割り込み仕事が入るケースありますよね。 しかもディレクトリ移動しないと出来ないようなもの。いままでは新規タブ開いてやってましたが、 コマンド群を()で括ることでサブプロセスを起動する手があります $ ( cd /cygdrive/c/Users/SHU…

Module#const_missingを使って、未定義な定数に対する動作を定義する

Module#const_missingは、未定義な定数を参照した際に呼び出されるメソッドです。 こんな感じで使います。 class Test1 def Test1.const_missing(name) mapping = { /^Func(\d+)$/ => :func } mapping.each_pair do |rgx, args| if rgx =~ name.to_s return …

「BinData」のArray型は連続する短いデータの取り扱い時に便利

「BinData」のArray型は連続する短いデータの取り扱い時に便利です。 使い方 16進数リテラルで渡す 16進数リテラルで渡します data = "\x03\x04\x05\x06\x07\x08\x09" これを読み込むと ary = BinData::Array.new(:type => :uint8, :read_until => :eof) ary…

Grepの「-o」オプションを活用し最後に一致した要素だけ出力する

先日の最後の要素を引っ張り出す事例をGrepの魔法を使って書き直すと $ echo http://s3.amazonaws.com/downloads.basho.com/stanchion/1.5/1.5.0/osx/10.8/stanchion-1.5.0-OSX-x86_64.tar.gz | grep -o '[^\/]*$'となります。oオプションは -o, --only-matc…

cutとrevの組み合わせでURLの最後の要素だけ引っ張り出す

revは*NIX標準添付の、文字列をひっくり返すコマンドです ~$ echo http://s3.amazonaws.com/downloads.basho.com/stanchion/1.5/1.5.0/osx/10.8/stanchion-1.5.0-OSX-x86_64.tar.gz | revが、 zg.rat.46_68x-XSO-0.5.1-noihcnats/8.01/xso/0.5.1/5.1/noihcna…

Zlib::GzipReader/WriterとStringIOをつかってファイルを作らずGzip圧縮なデータを扱う

ZlibはRubyに標準添付さえている圧縮系ライブラリです。 普段はFileクラスと一緒に使ったりします。 これとStringIOと組み合わせると、ネットワーク上でも利用可能です。 実際のところ。 str = ""; (0..1000).each { str += (0x61 + rand(0x10)).chr } 0..10…

Rubyのバックスラッシュ記法8進数で0-7以外を使うと、バックスラッシュ記法16進数風にパースされる

今回の記事はかなりマニアック……というか、誤爆したときくらいしか使い道が無いですが 使い方 "\022" は8進数記法です。 比較すれば、このとおり。 "\022" == "\x12" #=> true 並べて使うこともできますし、 "\022\064" #=> "\x124" "\022" + "\064" #=> "\…

「BinData」Choice構文で、条件毎に構造を変える

BinDataのchoice構文を使うと、部分的に一致してるスクリプトも一本化できます 使い方 class EData < BinData::Record string :val_a, :length => 8 string :val_b, :length => 4 end class DData < BinData::Record uint8 :val_c rest :rest end class Pack…

「BinData」で文字列型に関するアレコレ

BinDataの文字列型は自由度が高く、うまく使いこなせば楽ができます。 つかいかた 長さを指定する 長さを指定するなら、lenghtをもたせます。 obj = BinData::String.new(:length => 6) obj.read("abcdefghij") obj #=> "abcdef" 不足はヌルうめ 文字が不足…

「BinData」で余計なデータを放り込んでおく箱が必要な場合、restを使う

流れてくるデータに対し、とりあえず放り込む箱が欲しいなんて時は、restが使えます。 つかいかた class D < BinData::Record string :a, :read_length => 10 rest :rest end という風に実装した場合 obj = D.read(Array('a'..'z').join) #>> {:a=>"abcdefgh…

「BinData」で階層構造なデータを定義する

あまりに情報がゴチャゴチャして可視性が悪くなった場合、 階層構造にするとなんとかなるケースもあります。 使い方 一つのクラスに記述 class SampleBase < BinData::Record uint8 :val_a struct :nested do uint8 :val_b uint8 :val_c end end とやれば sb…

「BinData」で可変長なフィールドを定義する際はread_lengthが使える

「BinData」で可変長なフィールドを定義する際はread_lengthやlambda式が使えます。 lambda class Hoge < BinData::Record endian :big uint8 :len, :value => lambda { data.length } string :data, :read_length => :len end と定義した場合、「data」フィ…

「BinData」でエンディアンが変わらない場合はendianオプションを使ってやれば楽ができる

エンディアンがBigかLittleかで固定されている場合、endianを設定してあげれば以降「be」だの「le」だのと付けなくてすみます。 そのため、 前回の内容は require 'bindata' class Sample < BinData::Record endian :big uint8 :val_a uint8 :val_b uint16 :…

Rubyでバイナリデータを格好良く扱うgem「BinData」が素晴らしすぎて膝から崩れ落ちた

0x1234567890abcdef とてな感じのバイナリデータがあったとします。*1 これを適正に振り分ける場合、どうしてますか? これまでの私だと、文字列のまんま val_a = "1234567890abcdef"[10].chr とやるなり、unpackで配列化して val_a = "ab".unpack("CC")[0].…

TZInfoでカントリーコードを扱う

前述のTZInfoは各種タイムゾーン情報を格納しています。 なので、カントリーコードもメソッドで一気に出力させることができます。 ap TZInfo::Country.all_codes, limit:true とやれば、 [ [ 0] "AD", [ 1] "AE", [ 2] "AF", [ 3] .. [245], [246] "ZA", [24…

「TZInfo」でタイムゾーンを扱う

メールを送ろうにも、現地が深夜だとレスが遅くてガッカリする事ありますよね。*1 Googleなら、「国名 時間」とやってあげると現地時間がでてきますが微妙に面倒です。 そんなときはタイムゾーンを使うgem、TZInfoを使ってちょっとしたスクリプトを書いてみ…