2013-01-01から1年間の記事一覧
今年最後のポストがコレってのもどうかと思いましたが 今回はemacs lispを扱います。 短いスクリプトなら --batch --eval $ emacs --batch --eval '(print (+ 2 (* 6 3)))' 20計算機代わりに使えますね。 外部スクリプトを読むときには --script (emacs 23以…
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メソッ…
以前の記事で盛大にドヤリングした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*が綺麗に無くなってしまった場合 C-x b *scratch* RETで新造できます。 流石にTAB補完はしてくれませんでしたが、ちゃんと動きます。 フォルダの中にファイルが作られる事もないです バッファ内で C-jやっても、ちゃんとEmacs-Lisp式…
逐次更新されるファイルの追っかけは中々大変です。 それを助けてくれるのが、今回紹介する二つの機能です。 cliならtail -f $ tail -f ./stdin.log実際に試してみると、ファイルが更新される度に勝手に呼び出してくれます。 基本的にログファイルの監視に使…
前回の記事でbenchmark使えって話だと自己ツッコミしたので、今回の記事ではbenchmarkを試してみる事とします。 対象コードとベンチマーク require 'date' require 'benchmark' def funcA (Date.new(2013)..Date.new(9999)).lazy.select {|d| d.day == 13 &&…
RubyistといえばEnumerator。 mapやselectでデータをブン回すのは爽快です。 ただ、巨大化するのが目に見えているファイルやデータを素で扱うのは抵抗があります。 メモリが溢れてアバババになるのが自明ですし。 そこで活躍するのが、遅延評価さんです。 ma…
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…
前回の記事に takuya (id:takuya_1st) find -type d -exec echo - {} \; じゃだめなの? とのコメントを頂きました。色々文字列加工する気満々だったのですが、 冷静に考えればそれすらもprintfとsedでイケてしまいます。 既存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構文です。 TEST_ASSERT_INT_WITHIN(delta, expected, actual); これは、…
SKKでカタカナを入力したいときは「q」でおkです。 DDSKKの場合 DDSKKで「エイラ イルマタル ユーティライネン」と入力したい場合、 末尾にq 入力前にモード変更 の選択肢があります。 Shiftで指定して末尾でq 漢字入力時と同様に、Shiftで範囲指定して、末…
修士論文用開発環境で絶賛活躍中だったVirtualBoxさん。 一寸まえからネット接続やsshログインが出来なくなっていたのですが、開発優先で放置してました。 ところが、今日空いた時間でアップデートをかけたところ Configuration error: Failed to get the "M…
何もよみこまなくても、Timeクラスを使えば日付を扱う事ができます。 ところが……これで差分を取ろうとすると > (Time.local(2014,3,31) - Time.local(2013,12,1) ).class #=> Float ……そう、Floatになってしまうのです。こういう用途では標準添付ライブラリ…
ファイルの一括変換は中々手間ですね。 検索はワイルドカードでできても、置換はそうは行きません。 sed使うのも手ですが……Linuxにはrenameという便利なCLIツールがあります。 環境導入 Linux系 デフォで入っているみたいです。 MacOSXのとき MaxOSXの場合は…
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…
to_proc -> Proc self に対応する Proc オブジェクトを返します。生成される Proc オブジェクトを呼びだす(Proc#call)と、 その第一引数の self という名前のメソッドを 残りの引数を渡して呼びだされます。 サンプルではこんな事になってます。 :to_i.to_pr…
mapやeachのような、複数の要素に対しアクションを起こしてくれるのはEnumerableモジュールです。 実際にmapメソッドで確認をとると > (65..70).map #=> #<Enumerator: 65..70:map> と出て来ます。 EnumeratorはEnumerable の機能を提供するためのラッパークラスです。さて、このブロ</enumerator:>…
今まで、配列の内容を生成するときは 空配列作成 泥臭くeachぶん回し といった手順で作ってました。 が……規則性がある場合、newする時にブロック渡すとスッキリです。 具体例 「0〜15の二乗の値を16進数化した文字列」を放り込みたい場合 > Array.new(16) { …
Objectクラス……つまり、Rubyにおける基本クラスのメソッドにinstance_evalがあります。 前回は文字列生成に使いましたが、この子は本来インスタンスにメソッドをくっ付けるメソッドです。 用法 > str = "test" > str.instance_eval {def aaa ; self[2].upcas…
> str = "test" という文字列があるとします。 これにinstance_evalメソッドをブロック付きで実行すると、追加の文字列を作れます。 > str.instance_eval {|e| "hogehoge %s" % [e]} => "hogehoge test" この程度だと旨味がありませんね。 では、これならど…
CLIで使う場合、オプションがついてると何かと便利なケースがあります。 ARGVで必死になるのも良いですが、GetoptLongを使うと綺麗に書けます。 標準ライブラリなので、Ruby環境があればスグ使えるのも利点です。 require 'getoptlong' opts = GetoptLong.ne…
数が増えてくると時間が掛かります。 ファイル名を指定すると数が減ります。このとき、-lオプションをつけると実行する行数を設定できます $ rspec test1_spec.rb -l 35この例では、35行目が含まれるブロックを実行します。 itのブロック内であればそのitの…
xbee = "7E001210010013A200409821A5FFFE0000544553545E" てなXBeeの16進数で記述されたパケットがあったとします。*1 二文字毎に切り出すのであれば、Stringクラスのscanを使えば簡単です。 > xbee.scan(/\h\h/) #=> ["7E", "00", "12", "10", "01", "00", …
何だか不思議なコンテストが開催されます。その名も「第一回タカハソレノイドコンテスト(ソレコン)」 ソレノイドの知名度向上を目的としたコンテストです。部品のためのコンテストとは……見事に手段と目的が逆転しています。 その上、審査委員に明和電機社…
> 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メソッドは、返り値として引数と一致した場合selfを返します。 よって、nilを削除しようとすると、返り値にnilを返してきます。 これでは結果がわかりません。 更に厄介な事には、破壊的メソッドなので後々にも影響が出ます。 > ary = [1,2,3,ni…