Hatena::ブログ(Diary)

おおにしあきらの日記 このページをアンテナに追加 RSSフィード

 

2013年01月08日(火)

NokogiriでXMLに子要素を追加すると要素名が小文字になる

環境

問題

  • XMLノードに子要素を追加する際にNokogiri::XML::Node#add_childを使いつつ引数文字列で渡すと、要素名が小文字になる。要素名はdowncaseしないでほしい。

解決

  • Nokogiri::XML::DocumentFragment#newを使う。長ったらしくてめんどくさいし、もっといい方法がある気がするんだけど見つけられていない。

ソースコード

#!/usr/bin/env ruby
# coding: utf-8

require "nokogiri"

doc = Nokogiri::XML("<RootNode>")

doc.root.add_child "<AddChildByString>"
doc.root.add_child Nokogiri::XML::DocumentFragment.new(doc, '<AddChildByDocumentFragment>')

puts doc.to_xml
# =>
# <?xml version="1.0"?>
# <RootNode>
#   <addchildbystring/>
#   <AddChildByDocumentFragment/>
# </RootNode>

[追記 2013/03/07]Nokogiri::XML::Builderという便利なものがあった

Nokogiriのドキュメントを漁っていたら下記のような書き方で生成できることが分かった。こっちの方が便利そう。

#!/usr/bin/env ruby
# coding: utf-8 
 
require "nokogiri"
 
document = Nokogiri::XML::Builder.new do |doc|
  doc.RootNode {
    doc.AddChildByString
    doc.AddChildByDocumentFragment
  }
end
 
puts document.to_xml
参考

2012年03月07日(水)

メソッド内でメソッドの引数の一覧を取得する

def hoge(a, b, c)
  p self.method(__callee__).parameters
  #=> [[:req, :a], [:req, :b], [:req, :c]]
end

hoge(1, 2, 3)

Kernel.#__callee__Method#parametersを使う。

__callee__で今いるメソッドの名前がSymbolとして取れるので、それをself.methodの引数に渡して、Method#parametersで引数の一覧を取得する、という流れ。

2011年12月02日(金)

プロンプトに顔文字を出す

.bashrcとかにこんな感じで書く。

function check-shell-command {
  if [ $? -eq 0 ]; then
    face="\e[32m(^_^)"
  else
    face="\e[34m(+_+)"
  fi
  
  echo -e "${face}\e[m"
}

PS1='$(check-shell-command):\W \$'

コマンドが成功した時と失敗した時とで顔文字が変わるようにしてる。

http://gyazo.com/fad9bda8bf926ebc38db100a0694c236.png

便利!!!

2011年11月09日(水)

なんだか自分の好きな本を10冊挙げるのが流行ってるみたいなので流行に乗りました!!!

自分の好きな本を挙げるのがにわかに流行っているみたいなので。順番は思いついた順です。

安村研に入って初めてのサブゼミ(輪読)の題材がこれだった。スマートフォンが出始めた当初くらいの本だからデスクトップアプリケーションに関する記述が多くてスマートフォンに関してはほぼ載っていないんだけど、インタラクティブなものを作る際の基礎的な知識はこれ一冊あれば大体カバーできるんじゃないでしょうか。

Linuxカーネル2.6解読室

Linuxカーネル2.6解読室

昔は割とOS寄りの方面の勉強をしていて、その際によく参考にしていた。Linuxはついこの間メジャーバージョンが3になったけど、内容自体はまだまだ古びていないと思う。

プログラミング言語 Ruby

プログラミング言語 Ruby

最近はdoc.ruby-lang.orgを見ることの方が多いのだけど、Rubyプログラミングし始めた当初はよく参考にしていた。

Metaprogramming Ruby: Program Like the Ruby Pros (Facets of Ruby)

Metaprogramming Ruby: Program Like the Ruby Pros (Facets of Ruby)

こっちは上の本とは違い、Rubyの内部的な話が多い。合わせてRHGも参考にするといいですね。

ノンデザイナーズ・デザインブック [フルカラー新装増補版]

ノンデザイナーズ・デザインブック [フルカラー新装増補版]

僕はデザイナーではないしどちらかというとデザインは苦手なんだけど、とりあえずそれっぽい感じで作るときにどうやればそれっぽくなるかがすごく分かりやすく書いてるので割と参考にしてる。

使いにくいものというのはデジタルなものに限らず沢山あって、それを使いこなせないからといって諦めてはいけない、使いにくいものの方が悪いんだということを教えてくれた一冊。

ちょっと前にもはてブでこの本を紹介した記事が話題になっていたアレです。エンジニアの皆様は是非読んでおくべきですね。

Javascript: The Definitive Guide (Definitive Guides)

Javascript: The Definitive Guide (Definitive Guides)

JavaScriptの包括的なリファレンスがネット上には無いのでよく参考にしています。

情熱プログラマー ソフトウェア開発者の幸せな生き方

情熱プログラマー ソフトウェア開発者の幸せな生き方

エンジニアとしてどう生きるかみたいなことが書いてあった気がします。(うろ覚え)

上の『誰のためのデザイン?』と合わせて。

2011年09月20日(火)

コマンドの処理が一定時間以上かかった時だけGrowlで通知する

~/.bashrcに書いておけば多分動く。bash以外で動くかは試してない。

Mac用に書いてるのでLinuxとかは適宜コマンドを(notify-sendとかに)置き換えてください。

function notify-last-command {
  # 3秒以上かかったらGrowlで通知する
  if [ 3 -lt $MYDATETIME ]; then
    growlnotify -n notify-last-command -t command -m "$( history 1 | awk '{s="";for(i=2;i<=NF;i++){s=s" "$i}print s}' )"
  fi

  MYDATETIME=0
}

PROMPT_COMMAND='notify-last-command'

MYDATETIME=0

function time_spent () {
  MYDATETIME=$(expr $(date +%s) - $MYDATETIME)
}
trap 'time_spent' DEBUG

仕組み

BashのPROMPT_COMMANDとtrapを利用している。

PROMPT_COMMANDに値を指定すると、プロンプトが表示される直前に指定した値がコマンドとして実行される。*1

trapは、本来はシグナルをトラップして色々処理するためのものらしいんだけど、上記のようにDEBUGを指定するとコマンドを入力してエンターを押した直後とPROMPT_COMMANDの直前で実行されるようなので今回はそれを利用している。*2

動作の順番としては、以下のようになっている。

  1. コマンドを打ってエンターを押す
  2. 1回目のtrapが動き、MYDATETIMEに今の時間をUNIX timeに変換したものが入る
  3. コマンド本体の処理が行われる
  4. 2回目のtrapが動き、MYDATETIMEに今の時間をUNIX timeに変換したものから元のMYDATETIME分引いたもの(つまりコマンドの実行にかかった時間)が入る
  5. PROMPT_COMMANDが動き、MYDATETIMEの値が3以上であればgrowlnotifyが起動する

作った理由

MacPortsのアップデートのような時間がかかる処理を終わったかどうかいちいちチェックするの面倒だし終わったら通知してほしい、みたいな感じです。

思うこと

このままだと

  • vimでファイルを編集して閉じる時
  • 新規にタブやウィンドウ作った時
  • topやman等からプロンプトに戻った時
  • パイプを使った時
  • 単にエンターキーを押した時

等にGrowlされてしまうのでその辺うまく解決出来ないかな〜と思う。

*1: 詳細はman bash(1)

*2: 詳細はhelp trap