Bye Bye Moore

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

2013-12-01から1ヶ月間の記事一覧

emacs lispで日常業務自動化ヤッター

今年最後のポストがコレってのもどうかと思いましたが 今回はemacs lispを扱います。 短いスクリプトなら --batch --eval $ emacs --batch --eval '(print (+ 2 (* 6 3)))' 20計算機代わりに使えますね。 外部スクリプトを読むときには --script (emacs 23以…

IO.popenでCLIツールを楽々操作

IO.popenでCLIツールを楽々操作できます。 わざわざパイプで繋がなくとも、対象を引数として与えればサブプロセスとしてやってくれます。 サンプル:gnuplot ソースコード popen_gnuplot.rb #popen_gnuplot.rb require "gnuplot" IO.popen("gnuplot","r+") d…

既存クラスへエイリアスを貼ったり、新規メソッドを追加する

既存のクラスにエイリアスを貼ったり、メソッドを追加したりする方法です。 今回の例では ary = (1..10).to_a #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] という配列を用意し、carとcdrというメソッドを作って操作してみます。 エイリアスを貼る carはfirstメソッ…

某「rubyでcdrっぽい事したい? drop使えば良いんじゃないですか?(鼻ホジ」 ぼく「……あっ」

以前の記事で盛大にドヤリングしたsliceを用いたcdrモドキ。 ところがドッコイ、もっとマトモな方法がありました。 carはtake(1)あるいいはfirst、cdrはdrop(1)で代用できてしまします。 > ary = (1..10).to_a #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] > ary #=…

新しいscratchバッファをつくる

新規に保存して*scratch*が綺麗に無くなってしまった場合 C-x b *scratch* RETで新造できます。 流石にTAB補完はしてくれませんでしたが、ちゃんと動きます。 フォルダの中にファイルが作られる事もないです バッファ内で C-jやっても、ちゃんとEmacs-Lisp式…

ファイルのリロードが面倒なら、「tail -f」や「auto-revert-tail-mode」を使う

逐次更新されるファイルの追っかけは中々大変です。 それを助けてくれるのが、今回紹介する二つの機能です。 cliならtail -f $ tail -f ./stdin.log実際に試してみると、ファイルが更新される度に勝手に呼び出してくれます。 基本的にログファイルの監視に使…

benchmarkを使ってみる

前回の記事でbenchmark使えって話だと自己ツッコミしたので、今回の記事ではbenchmarkを試してみる事とします。 対象コードとベンチマーク require 'date' require 'benchmark' def funcA (Date.new(2013)..Date.new(9999)).lazy.select {|d| d.day == 13 &&…

Enumerator::Lazyを使えばmapメソッド等々で遅延評価ができる。

RubyistといえばEnumerator。 mapやselectでデータをブン回すのは爽快です。 ただ、巨大化するのが目に見えているファイルやデータを素で扱うのは抵抗があります。 メモリが溢れてアバババになるのが自明ですし。 そこで活躍するのが、遅延評価さんです。 ma…

guardでファイル監視を行う

guardというgemがあります。 これはテストやビルドの自動化をしてくれるスグレモノです。 目的 ローカルにあるtxtファイルが変更されたらタイムスタンプをログファイルに記録。 準備 Gemfile記述 source 'http://rubygems.org' gem 'guard' gem 'guard-shell…

正規表現で使える組込み変数

今日は冬至です。 Wikipedia英語版によると > winter_solstice = "Winter solstice is an astronomical phenomenon which for the Northern Hemisphere occurs in December and which for the Southern Hemisphere occurs in June." #=> "Winter solstice is…

ディレクトリ群をYAML用に出力したいなら素直にfindを使う

前回の記事に takuya (id:takuya_1st) find -type d -exec echo - {} \; じゃだめなの? とのコメントを頂きました。色々文字列加工する気満々だったのですが、 冷静に考えればそれすらもprintfとsedでイケてしまいます。 既存YAMLファイルへの挿入も調べて…

treeで入手したディレクトリ構造をyamlファイル用に転換するワンライナー

結論 $ tree -dfi os | ruby -ryaml -e 'puts YAML::dump(ARGF.map{|e|"src/"+e.chomp}.slice(0..-3))' 参考:一つ前のバージョン $ tree -dfi os | ruby -ryaml -ne '(data ||= []) << %Q(src/%s) % [$_.chomp]; END{ data.slice!(-3..-1); puts YAML::dump…

WITHINでブレる値も扱う(Unity系TDDツール)

TDD C

組込み機器といえば、センサーですね。 温度センサーで水温測ったり、加速度で転倒検知したり。 ところが、こういうモノは値ブレブレで一意に定まりません。 ここで活躍するのがWITHIN構文です。 TEST_ASSERT_INT_WITHIN(delta, expected, actual); これは、…

SKK系でカタカナを打つ時は「q」

SKKでカタカナを入力したいときは「q」でおkです。 DDSKKの場合 DDSKKで「エイラ イルマタル ユーティライネン」と入力したい場合、 末尾にq 入力前にモード変更 の選択肢があります。 Shiftで指定して末尾でq 漢字入力時と同様に、Shiftで範囲指定して、末…

VirtualBoxが「Failed to get the "MAC" value ~~」などと言い始めたらgetextradataしてみませう

修士論文用開発環境で絶賛活躍中だったVirtualBoxさん。 一寸まえからネット接続やsshログインが出来なくなっていたのですが、開発優先で放置してました。 ところが、今日空いた時間でアップデートをかけたところ Configuration error: Failed to get the "M…

日付の差分を取りたいならDateライブラリを使おう

何もよみこまなくても、Timeクラスを使えば日付を扱う事ができます。 ところが……これで差分を取ろうとすると > (Time.local(2014,3,31) - Time.local(2013,12,1) ).class #=> Float ……そう、Floatになってしまうのです。こういう用途では標準添付ライブラリ…

CLIツールrenameで拡張子を一括変換

ファイルの一括変換は中々手間ですね。 検索はワイルドカードでできても、置換はそうは行きません。 sed使うのも手ですが……Linuxにはrenameという便利なCLIツールがあります。 環境導入 Linux系 デフォで入っているみたいです。 MacOSXのとき MaxOSXの場合は…

Enumurableなメソッドでyieldを扱う

enumrableモジュールのメソッド内でもyieldを使う事ができたのですね…… 以前の記事の時点では気付いていませんでした。 class NewAry < Array def foo map {|e| yield(e)}.join("\n") end end #=> nil > a = NewAry.new(16){|e| "0x%04x" % [e ** 2]} #=> ["…

===でも、正規表現のオプションを使う事ができる

===でも、正規表現のオプションを使う事ができます。 > /abC/ === "abc" #=> false > /abC/i === "abc" #=> true ということは、case文でもイケるという事ですね。 > str = 'UEC' > case str > when /uec/i then puts 0 > when /tat/i then puts 1 > else pu…

「&:」とは結局何なのか調べてみた(その2)

to_proc -> Proc self に対応する Proc オブジェクトを返します。生成される Proc オブジェクトを呼びだす(Proc#call)と、 その第一引数の self という名前のメソッドを 残りの引数を渡して呼びだされます。 サンプルではこんな事になってます。 :to_i.to_pr…

「&:」とは結局何なのか調べてみた(その1)

mapやeachのような、複数の要素に対しアクションを起こしてくれるのはEnumerableモジュールです。 実際にmapメソッドで確認をとると > (65..70).map #=> #<Enumerator: 65..70:map> と出て来ます。 EnumeratorはEnumerable の機能を提供するためのラッパークラスです。さて、このブロ</enumerator:>…

規則性のある配列を生成するときはブロックをつけると綺麗

今まで、配列の内容を生成するときは 空配列作成 泥臭くeachぶん回し といった手順で作ってました。 が……規則性がある場合、newする時にブロック渡すとスッキリです。 具体例 「0〜15の二乗の値を16進数化した文字列」を放り込みたい場合 > Array.new(16) { …

instance_evalはインスタンスにメソッドをくっ付ける

Objectクラス……つまり、Rubyにおける基本クラスのメソッドにinstance_evalがあります。 前回は文字列生成に使いましたが、この子は本来インスタンスにメソッドをくっ付けるメソッドです。 用法 > str = "test" > str.instance_eval {def aaa ; self[2].upcas…

instance_eval()を使うとブロック内でメソッドを呼び出せる

> str = "test" という文字列があるとします。 これにinstance_evalメソッドをブロック付きで実行すると、追加の文字列を作れます。 > str.instance_eval {|e| "hogehoge %s" % [e]} => "hogehoge test" この程度だと旨味がありませんね。 では、これならど…

GetoptLongを使ってCLIのRubyアプリに引数を加える

CLIで使う場合、オプションがついてると何かと便利なケースがあります。 ARGVで必死になるのも良いですが、GetoptLongを使うと綺麗に書けます。 標準ライブラリなので、Ruby環境があればスグ使えるのも利点です。 require 'getoptlong' opts = GetoptLong.ne…

rspecでは行数を指定できる

数が増えてくると時間が掛かります。 ファイル名を指定すると数が減ります。このとき、-lオプションをつけると実行する行数を設定できます $ rspec test1_spec.rb -l 35この例では、35行目が含まれるブロックを実行します。 itのブロック内であればそのitの…

標準ライブラリstrscanで文字列の複雑な切り分けも楽々

xbee = "7E001210010013A200409821A5FFFE0000544553545E" てなXBeeの16進数で記述されたパケットがあったとします。*1 二文字毎に切り出すのであれば、Stringクラスのscanを使えば簡単です。 > xbee.scan(/\h\h/) #=> ["7E", "00", "12", "10", "01", "00", …

手段と目的の法則が乱れる 「第一回タカハソレノイドコンテスト」

何だか不思議なコンテストが開催されます。その名も「第一回タカハソレノイドコンテスト(ソレコン)」 ソレノイドの知名度向上を目的としたコンテストです。部品のためのコンテストとは……見事に手段と目的が逆転しています。 その上、審査委員に明和電機社…

nilにもメソッドがある

> nil.to_s #=> "" > nil.to_a #=> [] > nil.to_f #=> 0.0 > nil.to_i #=> 0 というわけで、次のように空の変数にto_hogeメソッドをツッコでもちゃんと値に変換されるわけです。 親切設計ですね。 > a = nil #=> nil > a.to_a #=> [] 参考もと http://docs.r…

deleteメソッドでnilを消す時は注意

配列のdeleteメソッドは、返り値として引数と一致した場合selfを返します。 よって、nilを削除しようとすると、返り値にnilを返してきます。 これでは結果がわかりません。 更に厄介な事には、破壊的メソッドなので後々にも影響が出ます。 > ary = [1,2,3,ni…