bar_1

contents_map

2014年5月13日火曜日

Ruby OptionParser クラスのリファレンス

ruby 2.0.0-p247 環境で、ri OptionParser | col -bx したものの日本語訳です。
以前 (2008年3月16日)、Ruby: OptionParser (optparse.rb) の使い方 にて、OptionParser の記事を書きましたが、もっと完全なドキュメントが身近にありました。OptionParser のすべての機能について網羅した、こちらの説明のほうがよいでしょう。

OptionParser < Object

(from ruby core)

OptionParser

イントロダクション Introduction

OptionParser はコマンドラインオプション分析のためのクラスです。GetoptLong より、ずっと先進的で、にも関わらず使うのがより簡単、またいっそう Ruby 指向のソリューションです。

仕様 Features

  1. 引数指定とそれを処理するコードは、同じ場所に書かれます。
  2. オプションの要約を出力することができます; この要約文を別々にメンテする必要は、ありません。
  3. 選択的や必須の引数を、非常に優雅に指定されます。
  4. 引数たちを、自動で、指定のクラスに変換することができます。
  5. 引数たちを、適切なセットに制限することができます。
これらの仕様すべて、下記の例にデモしてあります。完全なドキュメントは、#make_switch を見よ。

必要最小限の例 Minimal example

  require 'optparse'
options = {}
OptionParser.new do |opts|
opts.banner = "Usage: example.rb [options]"
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
options[:verbose] = v
end
end.parse!
p options
p ARGV

完全な記述例 Complete example

下記の例は、完全な Ruby のプログラムです。あなたは実行できますし、さまざまなオプションを指定してみることで、影響をみれます。おそらくこれは optparse の仕様を学ぶのにベストな方法でしょう。
  require 'optparse'
require 'optparse/time'
require 'ostruct'
require 'pp'
class OptparseExample
CODES = %w[iso-2022-jp shift_jis euc-jp utf8 binary]
CODE_ALIASES = { "jis" => "iso-2022-jp", "sjis" => "shift_jis" }
#
# オプションたちの構造記述を返す。
# Return a structure describing the options.
#
def self.parse(args)
# コマンドラインで指定されたオプションたちは、*options* の中に集められる
# われわれはここではデフォルトの値をセットする。
# The options specified on the command line will be collected in *options*.
# We set default values here.
options = OpenStruct.new
options.library = []
options.inplace = false
options.encoding = "utf8"
options.transfer_type = :auto
options.verbose = false
opt_parser = OptionParser.new do |opts|
opts.banner = "Usage: example.rb [options]"
opts.separator ""
opts.separator "Specific options:"
# 必須の引数。
# Mandatory argument.
opts.on("-r", "--require LIBRARY",
"Require the LIBRARY before executing your script") do |lib|
options.library << lib
end
# 選択的な引数; 複数行による記述。
# Optional argument; multi-line description.
opts.on("-i", "--inplace [EXTENSION]",
"Edit ARGV files in place",
"  (make backup if EXTENSION supplied)") do |ext|
options.inplace = true
options.extension = ext || ''
options.extension.sub!(/\A\.?(?=.)/, ".")  # Ensure extension begins with dot.
end
# 引数 'delay' を Float 型に制約する。
# Cast 'delay' argument to a Float.
opts.on("--delay N", Float, "Delay N seconds before executing") do |n|
options.delay = n
end
# 引数 'time' を Time オブジェクトに制限する。
# Cast 'time' argument to a Time object.
opts.on("-t", "--time [TIME]", Time, "Begin execution at given time") do |time|
options.time = time
end
# 8 進数の整数に制限する。
# Cast to octal integer.
opts.on("-F", "--irs [OCTAL]", OptionParser::OctalInteger,
"Specify record separator (default \\0)") do |rs|
options.record_separator = rs
end
# 列挙 (リスト) の引数。
# List of arguments.
opts.on("--list x,y,z", Array, "Example 'list' of arguments") do |list|
options.list = list
end
# キーワード補完。われわれは、特定の引数セットを指定している (CODES
# と CODE_ALIASES - 文字はハッシュであることに注目), そしてユーザは
# もっとも短いあいまいなテキストを使うかもしれない。
# Keyword completion.  We are specifying a specific set of arguments (CODES
# and CODE_ALIASES - notice the latter is a Hash), and the user may provide
# the shortest unambiguous text.
code_list = (CODE_ALIASES.keys + CODES).join(',')
opts.on("--code CODE", CODES, CODE_ALIASES, "Select encoding",
"  (#{code_list})") do |encoding|
options.encoding = encoding
end
# キーワード補完を使った選択的な引数。
# Optional argument with keyword completion.
opts.on("--type [TYPE]", [:text, :binary, :auto],
"Select transfer type (text, binary, auto)") do |t|
options.transfer_type = t
end
# ブーリアン・スイッチ。
# Boolean switch.
opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
options.verbose = v
end
opts.separator ""
opts.separator "Common options:"
# 引数なしで、tail での表示。これはオプションたちのサマリーをプリントする。
# やってみて!
# No argument, shows at tail.  This will print an options summary.
# Try it and see!
opts.on_tail("-h", "--help", "Show this message") do
puts opts
exit
end
# もうひとつの典型的なスイッチ (バージョンを表示)。
# Another typical switch to print the version.
opts.on_tail("--version", "Show version") do
puts OptionParser::Version.join('.')
exit
end
end
opt_parser.parse!(args)
options
end  # parse()
end  # class OptparseExample
options = OptparseExample.parse(ARGV)
pp options
pp ARGV

シェル補完 Shell Completion

For modern shells (e.g. bash, zsh, etc.), you can use shell completion for command line options.
モダンなシェル (e.g. bash, zsh, など) では、コマンドライン・オプションの ためにシェルの補完が使えます。

さらなるドキュメント Further documentation

上述した例はこのクラスをどのように使うかについて学ぶに十分でしょう。もしなんらかの疑問があれば、http://bugs.ruby-lang.org にチケットを切ってください。

定数 Constants:

  • DecimalInteger 10進数整数形式、Integer 型にコンバートするためのもの。
  • DecimalNumeric
    10進数の整数/浮動小数形式、整数を Integer に, 浮動小数を Float に 変換するためのもの。
  • OctalInteger Ruby/C ライクな 8進数/16進数/2進数 整数形式、Integer 型に変換する ためのもの。
  • SPLAT_PROC [not documented]

クラスメソッド Class methods:

  accept
each_const
getopts
inc
new
reject
search_const
show_version
terminate
top
with

インスタンスメソッド Instance methods:

  abort
accept
banner
base
candidate
complete
def_head_option
def_option
def_tail_option
default_argv
define
define_head
define_tail
environment
getopts
help
inc
load
make_switch
new
notwice
on
on_head
on_tail
order
order!
parse
parse!
permute
permute!
program_name
reject
release
remove
search
separator
set_banner
set_program_name
set_summary_indent
set_summary_width
summarize
summary_indent
summary_width
terminate
to_a
to_s
top
ver
version
visit
warn

属性 Attributes:

  attr_accessor default_argv
attr_accessor set_summary_indent
attr_accessor set_summary_width
attr_accessor summary_indent
attr_accessor summary_width
attr_writer banner
attr_writer program_name
attr_writer release
attr_writer set_banner
attr_writer set_program_name
attr_writer version

2014年5月11日日曜日

Mac の Gimp 2.8.10 でヘルプを使えるようにするには

概要

前回、「Mac OSX 10.9 (Mavericks) で 日本語入力可能な日本語化された Gimp 最新版 (2.8.10) を使うには」 にて、 Mac OS X 10.9.x (Mavericks) にインストールした GIMP 2.8.10 は、エラーによりヘルプドキュメントが見れない状態であることがわかった。そこで本記事では、GIMP の使用している GTK に MimeType の設定を行うことにより、(日本語) ヘルプドキュメントを使用できるようにする。これにより、パッチあてやコンパイルなしに、Mac 用の GIMP 2.8.10 で、以下のようなヘルプメニューを使えるようになる: GIMP のヘルプメニューの ヘルプ (Help)F1 をおした時の状況適応ヘルプ (Context Help)今日の技 (Tip of the day)。付録として解析したときのログも掲載した。
この手法は日本語以外の外国語においても有効なはずである。(This solution must be available in any foreign languages other than japanese.)

手法と手順

本記事の手法は、RPM で提供されている GIMP の日本語ヘルプドキュメントを GIMP.app に組み込み、GIMP 内部の GTK の設定に MimeType の追加をすることで、インストール版のヘルプドキュメントを利用可能にするというものです。
以下の手順でおこないます:
  1. 日本語のローカル版ヘルプドキュメントを GIMP.app に追加する
  2. GIMP.app のヘルプの設定
  3. MimeType の設定を GIMP.app が使用している GTK の設定に追加
詳細は、下記のようになります。

1. 日本語のローカル版ヘルプドキュメントを GIMP.app に追加する

前回用意した状態だと、GIMP.app は、一切のヘルプドキュメントを持っていない状態です。なので所定の場所に、ヘルプのデータ (html, 画像) を、ぶち込みます。
GIMP のヘルプドキュメントは別パッケージで提供されていたりします。しかしながら、これをコンパイルするのは結構な手間です。
だから、Linux のディストリビューションで提供されているコンパイル済みパッケージである RPM から、中身を吸い出して流用します。この手順は以下のように行います:
  1. RPM Rawhide gimp-help-ja 2.8.1 noarch rpm などを、適当なディレクトリにダウンロードする
  2. rpm2cpio.pl コマンドをインストールする
    ターミナルから、brew install rpm2cpio (brew の場合) を実行する
  3. RPM をファイルに展開する
    ターミナルから、
    rpm2cpio.pl gimp-help-ja-2.8.1-1.fc21.noarch.rpm | cpio -id
  4. 展開されたデータの help/ 以下を、GIMP.app にコピーする
    前の手順で、カレント・ディレクトリに usr/ 以下に展開されたデータができる。この中にある help ディレクトリを丸ごとコピーする。コピー先は、
    /Applications/GIMP.app/Contents/Resources/share/gimp/2.0/
    で、ここに brushes, dynamics, fonts, …などとおなじように help が配置されるようにする。
※ GIMP.app の中身の開き方は、Finder から /Applications/GIMP.app を選んで、右クリック > パッケージの内容を表示 です。

2. GIMP.app のヘルプの設定

GIMP.app のヘルプ表示の仕方を、ローカルを参照し、また通常の Web ブラウザを使用するように設定します。手順は以下のとおりです:
  1. メニューのGIMP > 設定 (Preferences)… を選ぶ
  2. GIMP の設定 ウィンドウが出てくる
  3. 左ペインのアイコンのリストから、上から 4 番目の ヘルプ を選択
  4. 右ペインの 全般 にある 使用するユーザーマニュアル から、インストール版 を選択
  5. 同じく、ヘルプブラウザー使用するヘルプブラウザー から、ウェブブラウザ を選択
  6. OK ボタンを押して GIMP の設定 ウィンドウを閉じる
  7. GIMP を終了する

確認方法

GIMP を起動して、メニューから GIMP > 設定 > ヘルプ を見てください。
ここまでの手順がうまくできていれば、「電球ユーザーマニュアルはインストール済みです。」という表示が出ます (でも、次の手順が済むまではまだ使えません)。

3. Mime タイプの設定を GIMP.app が使用している GTK の設定に追加

上記までの設定で、GIMP はヘルプファイルを認識します。ユーザが、メニューからヘルプを表示しようとすると、GIMP は、plug-ins/web-browser でドキュメントを開こうとします。ところが、GIMP が使用している GTK がこれを弾いてしまい、下記のようなエラーとなります:
GIMP エラーメッセージ
プロシージャー 'plug-in-web-browser' の呼出し時にエラーが発生しました。
No application is registered as handling this file
Script-Fu から、(plug-in-web-browser "file://localhost/Applications/GIMP.app/Contents/Resources/share/gimp/2.0/help/ja/index.html") として同じエラーを再現できることから、URI のスキーム指定 file: を扱えないことが、原因であることが予想されます。
そこで、GTK がエラーを吐かないように、mimeinfo.cacheopen.desktop の 2 つのファイルに MimeType の追加をする修正を行います。これらのファイルたちが格納されている場所は、/Applications/GIMP.app/Contents/Resources/share/applications です。
まずはターミナルを開いて、カレントディレクトリをこの場所にしてください。
作業の手順は以下のとおりです:
  1. 元のファイルをバックアップします
    cp -p mimeinfo.cache mimeinfo.cache.orig
    cp -p open.desktop open.desktop.orig
  2. mimeinfo.cache の修正
    エディタ (vim, emacs, nano など) で、 mimeinfo.cache の最後に一行x-scheme-handler/file=open.desktop; を追加します
  3. mimeinfo.cache の修正の確認
    $ diff mimeinfo.cache.orig mimeinfo.cache
    32a33
    > x-scheme-handler/file=open.desktop;
  4. open.desktop の修正
    MimeType の設定に、x-scheme-handler/file; を追加します
  5. open.desktop の修正の確認
    $ diff open.desktop.orig open.desktop 7c7 < MimeType=x-scheme-handler/http;x-scheme-handler/https --- > MimeType=x-scheme-handler/file;x-scheme-handler/http;x-scheme-handler/https
これで、GIMP で日本語のヘルプが使えるようになりました!Yay!
GIMP を起動して、メニューから ヘルプ > ヘルプ などを試してみてください。Web ブラウザが立ち上がって、ヘルプのHTMLファイルが表示されます。今日の技 で表示されるウィンドウで 詳しくはこちら を押すと、ブラウザでおなじようにリンクが表示されます。

まとめ

  • GIMP.app に日本語のヘルプドキュメントを組み込む方法を述べた
  • GIMP.app にローカルにインストールしたインストール版ヘルプドキュメントを見るための設定方法を述べた
  • GIMP の使用している GTK に MimeType の設定を追加する方法を述べた
以上です。
以降は、トラブルシューティングしたい場合のなんかの参考に。

PS. Mac OS X での GIMP の設定ファイルの場所

システム側

GIMP.app の中の
  • Resources/etc
  • Resources/share/applications
  • Resources/share/gimp/2.0
などなどにある。

ユーザ側

  • ~/Library/Application\ Support/GIMP/2.8/
の中に、いろいろな rc ファイルが有る。

Mac の GIMP 2.8.10 でヘルプを見れるようにするには (付録)

追記が長すぎるとSeesaaブログにおこられてしまうので、別記事にしました。
本文は、Mac の GIMP 2.8.10 でヘルプを見れるようにするには を参照してください。

2014年5月8日木曜日

プログラミング言語関連ドキュメントまとめ

プログラミング言語というか、ソフトウェア工学の範疇の歴史的ドキュメントを、このエントリにまとめていこうと思います。
書籍も入れようかなぁ……
これは入れるべき!というのがあったら、コメントしていただけたら幸です。

Csh Programming Considered Harmful

Open Standards http://www.open-std.org/

公開されている規格のドキュメントを集めたもの。POSIX, LISP, C++ などのドラフト版があったりする。

R5RS (Revised^5 Report on Algorithmic Language Scheme)

SICP (Structure and Interpretation of Computer Programs)

履歴

  • 2014-05-16 “Csh Programming Considered Harmful” を追加。
  • 2014-05-22 “Open Standards” を追加。

2014年5月6日火曜日

Seesaaブログで管理人のコメントをつけるとき


そうそう、Seesaa ブログで、管理人としてコメントを返したいときの話。

以前、管理者でログインできているときは、管理者マークが出てた気がしてどうしたのかな、と思っていたのだけど、今は、コメントは承認後に表示にしていたのだった。

承認後に表示なら、管理者を偽った時は承認しなければいいわけで、管理者マークが出ないのはそのせいだよね。きっと。

ちょっと気になったのでした。



2014年4月24日木曜日

Mac のターミナルの Bash に単語単位カーソル移動のキーバインド設定をする


以前 Linux を使っていたとき bash で Alt+f/Alt+b でカーソル移動できて便利でした。そこで「Mac のコンソール上でも、Bash で単語単位のカーソル移動のキーバインド設定をしたい」と思いました。調べた結果、ターミナルの設定により可能なことがわかりました。以下、この設定方法について説明します。対象とするターミナル・ソフトは、iTerm2 と Terminal です。

2014年4月1日火曜日

[TIPS] Markdown でセンタリングしたい


[TIPS] Markdown でセンタリングしたい


Markdown でふりがなを振りたい」に続いて、Markdown で右寄せ左寄せ中寄せ (センタリング) したいときは、どうすればいいか? (以下、レンダラは marked.js で動作確認した例です。)

2014年3月14日金曜日

PukiWiki からのデータ移行のシンプルな方法

PukiWiki から Markdown への変換


昨年 (2013年)、XP で運用していたマシンが壊れまして。それ以降、XP上のローカルサーバで長年運用してきた PukiWiki から、他のシステムにリプレイスすることを考えてました。

Wiki 以外の方法もなにかないかと、他の方法の模索をしてきたのだけど、やっぱり、Wiki はいいなと思います。

また一方で、ここ最近は Markdown も便利だと感じてました。Markdown そのものは、Wiki (CMS) ではなく、単なるドキュメントの書式でしかないのだけれども、最近は、JavaScript で書かれた Markdown レンダラーがある。こいつを使えば、Markdown でローカル Wiki みたいなことはできるんじゃないか・・ということを考えた。

で、とりあえず PukiWiki のデータを、なんとか他のシステムに移しやすい形にしたいなと。見てみたところ、


  • PukiWiki のデータはテキストファイル (xxxx.txt) で、ひとつのディレクトリにフラットに格納される (pukiwiki/wiki/)

  • ファイル名は、EUC コード (16進数) をそのまま文字列にしたもの。スラッシュなんかの記号を含んだものになる。

  • ファイルの中身は、EUC-JP で、PukiWiki形式で記述されている。(これは、設定にもよるのかも)

ということがわかった。

PukiWiki のデータを OSX 上の HFS+ に展開する


変換するに手っ取り早い方法は、テキストファイルで表現されているデータ構造とデータを、ファイルシステム上に展開してしまう、というものです。

今使っているのは Mac なので、以下のことを考えました:


  • 元のファイル名は見にくいので、デコードして、UTF-8形式で通常の文字列として表す

    • HFS+で使用できない特殊な記号が使用されていた場合は、必要に応じてなんらかのエスケープ処理をする

    • ただし、半角スラッシュの場合は、ディレクトリを掘る (HFS+ の仕様と上記仕様からくる制限)

  • ファイルの内容は、EUC-JP から UTF-8 に、漢字コードを変換する

  • PukiWiki 記法から、Markdown か MediaWiki の形式にする

  • 検索システムは、grep か mdfind を使えばいい

ということを、考えました。

ディレクトリを掘るのは、やっぱフラットに数千ファイルあると、みるのが辛いからです。。。

スクリプト


既存のスクリプトがないか、けっこう探してみたのですが、どうも見当たらない……ぜったい誰か作ってるはずなのに……。まぁ、PukiWiki 自体がもう10年近くリリース止まってますしね。

仕方ない。ということで、Ruby で以下のようなものを作りました:


  • pw2hfs.rb (変換スクリプト本体)

  • nf-pw2md.rb (PukiWiki形式→Markdown形式変換フィルタ)

はじめは MediaWiki 形式にしようかと思いましたが、めんどくさいのでやめました。PukiWiki->Markdown変換は、適当です (一行一行の正規表現マッチングと置換)。あと、スクリプト内で、OSX に入っている iconv コマンドを使ってます。

使い方は、2つのスクリプトを、pukiwiki のデータの格納してあるディレクトリの一つ上において、結果出力用のディレクトリ dst/ を作ってから、pw2hfs.rb を実行します。しばらく待つと、dst/ 以下に、変換したものができます。

この結果と、Invisible.js かなにかを、組み合わせようと思ってます。Wiki の記法 (特に、Markdown 中での、ページ名のリンク ―スクウェア・ブラケットで2重に囲むアレ) 対応は、JavaScript 側でやったほうがいいかな……。

それでは。