2011/03/09

hash.merge

Hash の merge

2つのハッシュに同じkey が存在した場合...
merge 元の値は nil じゃない。
merge 対象の値は nil。
これらを merge すると nil ではない merge 元の値は保持されたままになるのだっけ?
なーんて一瞬でも思ったのは大間違いだった。

% irb
>> a = {:a=>'a', :b=>'b'}
=> {:b=>"b", :a=>"a"}
>> b = {:a=>nil, :b=>'c'}
=> {:b=>"c", :a=>nil}
>> a.merge(b)
=> {:a=>nil, :b=>"c"}


nil であろうときっちり上書きされて nil になる。
上書きされたくなければ同じ key を持たない。...というかマージしない...?

2011/03/07

about xblogger

xblogger について。

ターミナル(/Applications/Utilities/Terminal.app/) から
gdata-ruby-util
を使って Blogger に記事を ポスト| ゲット | 削除 | アップデート する為のものです。

Mac OS X 上で作りました。使用する Ruby は 10.6 に搭載されているRuby 1.8.7 (/usr/bin/ruby) です。
# Ruby 1.9.2 用は mblogger

『はじめに』

xblogger は utf-8 で保存されたテキストファイルで 特定の書式に則ったものだけを対象にしています。ものすごく端折って言うと
--control, --category, --title, --content
が明記されたファイルに記事内容を記入する必要があります。サンプルは xblogger/draft.txt です。

--------------------
0) 準備ー設定
--------------------

gdata-ruby-util からgdata-ruby-util をダウンロードし
xblogger/xblogger-config と xblogger/bin/run.rb を編集してください。

% cd /pathto/download/
% gem unpack gdata-1.1.1.gem
%
% cd xblogger
% vim xblogger-config
% vim bin/run.rb
% chmod +x bin/run.rb


gem を使用したい場合は
% gem install gdata
などして gdata に含まれている README を参照の上 bin/run.rb を書き換えてください。私はこの方法を試していません。

自分の BlogID が不明な場合は下記を試してください。
最初に自分の Blogger Profile Page をみにいきます。その URL に含まれている数字が仮に XXXXX だったとします。

% cd xblogger/bin
% ruby get-blogid.rb XXXXX

を実行。

# xblogger-config の xname は任意の文字列を記入してくださいです。アンダーバーやハイフンは含めない方がよいかもしれません。

--------------------
1) 確認ー投稿前
--------------------

# --doc
# 記事を投稿する前にリクエスト対象となる XML Document を確認します。

サンプル xblogger/draft.txt を test.txt にコピーし編集し保存します。

% cd xblogger
% cp draft.txt test.txt
% vim test.txt
% cat test.txt
--control
yes
--category
test,blogger
--title
TestTitle
--content
test post.
second line.


test.txt を指定。

% cd xblogger/bin
% ./run.rb  --doc ../test.txt
CONTROL: yes
TITLE: TestTitle
CATEGORY: test,blogger
# =====
<entry xmlns='http://www.w3.org/2005/Atom'><title type='text'>TestTitle</title><content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'><p>test post.<br/>second line.</p></div></content><app:control xmlns:app='http://www.w3.org/2007/app'><app:draft>yes</app:draft></app:control><category term='test' scheme='http://www.blogger.com/atom/ns#'/><category term='blogger' scheme='http://www.blogger.com/atom/ns#'/></entry>


問題があればエラーになりますがエラーとして認識されない場合もあります。

--------------------
2) 投稿(ポスト)
--------------------

# --post
# Blogger へ記事を投稿します。

さきほどのtest.txt を指定し投稿します。

% ./run.rb  --post ../test.txt
CONTROL: yes
TITLE: TestTitle
CATEGORY: test,blogger
# =====
Post Entry
OK? [y/n]

と尋ねられます。n を選択すると何事もなく終了します。y を選択すると記事を投稿します。投稿に成功すると success message が返ってきます。

この時 ファイル test.txt の --control 値が yes になっていたら下書きの記事として投稿します。記事は公開されません。

--control
yes


yes 以外の文字列になっている場合は公開記事として投稿します。記事は公開されます。

--control
ok


記事文章内にリンクを張りたい時は、

--content
あいうえお <a href='http://github.com'>github.com</a> かきくけこ。

のように記入しておくとハイパーリンクになります。html そのままです。
引用の場合は <blockquote>改行+引用文+改行</blockquote>
コードの場合は <pre>改行+コード+改行</pre> で囲むようにしてください。

詳細は % cat xblogger/draft.txt で確認してください。

--------------------
3) 確認ー投稿後
--------------------

# 記事投稿に成功した場合結果ファイルを自動生成します。
# 下書であろうとなかろうと。

xblogger/bin/run.rb は 記事を投稿した場合に限って 指定したディレクトリに一意のファイルを生成します。
指定したディレクトリ とは、xblogger/xblogger-config に自分で入力した任意のパス。
例えば、~/data ディレクトリを指定していた場合、2011/01/01 に投稿した記事は

~/data/2011-01/2011-01-01T00-00-00-xxxxxx.txt

に保存されます。xxxxxx はBlogger が与えた一意の番号です。

生成されたファイルには、Blogger から受け取った情報が保存されています。具体的には edit_id, published date, updated date, url です。
ただし --control によって"下書き"として投稿した場合は --url はありません。

% cat ~/data/2011-01/2011-01-01T00-00-00-xxxxxx.txt
--edit_id
xxxxxxxxxx
--published
2011-01-01T00:00:00.001+09:00
--updated
2011-01-01T00:00:00.001+09:00
--date
2011/01/01 Sat AM 00:00:00
--control
ok
--category
test
--title
test
--url
http://midorex.blogspot.com/2011/01/test.html
--content
...略


--------------------
4) 削除
--------------------

# --del, --delete
# Blogger へ投稿した記事を削除します。
# 下書きとして投稿した記事を指定することもできます。

自動生成されたファイルの path を指定したい場合

% run.rb --delete path

edit_id を指定したい場合

% run.rb --del xxxxxxx


--------------------
5) アップデート
--------------------

# --update
# 既に投稿した記事内容を修正します。

自動生成されたファイルの中から修正したい投稿ファイルを編集しファイルを保存します。
保存したファイルのパスを指定します。

% run.rb --update ~/data/2011-01/2011-01-01T00-00-00-xxxxxx.txt

[y/n] を尋ねられます。y を選択するとアップデートを実行します。完了すると success message を表示します。

run.rb --update は指定したファイル内容を読み込みます。この時ファイルに保存されているはずの --edit_id が 空欄だったり 間違った番号(Blogger が管理していないような番号)であった場合 アップデートは成功しません。また、--title --category --content の内容は修正できますが ひとたび付与された --url などは変更できません。

余談ですが...
Blogger 記事の URL は
記事タイトルに日本語の文字列が含まれていた場合、その月内で何番目の記事かが考慮された URL となり、日本語が含まれていない場合はスペース等を別の文字に置換した文字列が URLに反映されているようです。

--------------------
6) 記事取得
--------------------

# --get
# 月内に投稿された全ての記事の タイトル, 日付, URL, Category, edit_id などを返します。

--get の後になにもなければ現在の年月を指定したことになります。

% ./run.rb --get


2011年2月を指定したい場合。month は 2桁で指定する必要があります。

% ./run.rb --get 2011-02


--------------------
7) HELP
--------------------

% ./run.rb --h