Ruby Reference Manul を Kindleファイルにしてみた
ruby-list メーリングリストに投稿 [ruby-list:50379] Ruby 2.3.0 Reference Manual for Kindle したが、Ruby Reference Manual を Kindle 化してみた。
以前
Amazon CAPTCHAを読んだ際、『次はリファレンスマニュアルを読むこと』といった記述があったのを記憶していてずっと気になっていた。
が、実際のプログラミングの際には、chm ファイル版か、検索で事足りるため、なかなか通読する気になれなかたので、例によって例の如く html ファイルから変換した次第。
変換では
- spine (本文)ファイルをどうするか
- ナビゲーションをどう構成するか
- httpで始まるリンクをどうするか
などの問題もあり、特にナビゲーションについては、リンクの設定の仕方によって kindlegen がエラーを吐くのが原因不明で、結局問題になる下の階層の項目を削除して回避。
マニュアル自体は独特の形式(rd 形式?)で記述されていて、それをBitclust というツールで
に変換できるらしい。
ただし、html 以外はうまく行かないかもしくは期待している内容と異なるファイル群となるので、もう少し調べが必要もある。
リファレンスマニュアルのメーリングリストも活動停止状態のようで、さてどうしたものか。
公開されている C++11の文法と機能 をKindleファイルへ変換してみた
ここ何年もC++は使ったことがなかったが、偶然 本の虫: C++11参考書の公開:C++11の文法と機能 を発見。
https://github.com/EzoeRyou/cpp-bookで内容が公開されているとのことであるので、kindle.rb の使い方を思い出すのも兼ね、Kindle形式(mobiファイル)へ変換してみた。
結果はこちら https://github.com/dogatana/cpp-book/tree/kindle
今日 GFDL を確認したところ、改変した際に改変者の表記が要求されるのが分かり、表紙画像他を修正。
TODO には書いたものの Paperwhite 向け修正までは手が回らない。。
2016/8/23 追記
ライセンスに関する表記の修正と、表紙画像の高解像度化実施
たのしいRuby 第5版
図書館にあった たのしいRuby 第5版 を読む。
手元の本は第2版で1.8が対象だったのだが、1.9以降のStringの仕様変更の理解がずっと浅いように感じているので、第3部を中心に落ち穂拾い的にあちこち読んで見る。
以下気になった点のメモ。1.8でもあったものかどうかは調べていないが、知らないことが多い。
第12章 数値(Numeric) クラス
これまで有理数、複素数を使う機会はなく、スルーしていた部分。
有理数、複素数
r = Rational(2, 3) p r.to_f p [r.numerator, r.denominator] r2 = 1.3r p r2 c1 = Complex(1, 2) c2 = 3i c = c1 + c2 p c p [c.real, c.imaginary]
数値の型変換 Numeric#round
四捨五入する位置を指定する引数がある
p 12.34.round(1) p 12.34.round(-1) p 12.34.round
第13章 配列(Array) クラス
Array.new あれこれ。
Array.new # => [] Array.new(3) # => [nil, nil, nil] Array.new(3, 0) # => [0, 0, 0] Array.new(3, [0, 0, 0]) # => 各要素は同じオブジェクトを指す Array.new(3) { [0, 0, 0] } # => 各要素は別のオブジェクト Array.new(3) { |i| i * 2 } # => [0, 2, 4]
Array#values_at
a = %w(a b c d e) a.values_at(0, 2, 4) # => ["a", "c", "e"]
第14章 文字列(String) クラス
ヒアドキュメント
def hear_test s1 = <<EOS string EOS s2 = <<-EOS string EOS s3 = <<~EOS string EOS p s1, s2, s3 end hear_test
<<~ は 2.3.0から追加とのこと
全角英数を半角へ、かつ半角カナを全角カナへ
仕事でよく出てくるパターン。NKFでうまくいく。
s = "これがコレガコレガABC123 abc123" p s # => "これがコレガコレガABC123 abc123" p NKF.nkf('-wZ1X', s) # => "これがコレガコレガABC123 abc123"
第15章 ハッシュ(Hash) クラス
Hash#store, Hash#fetch
h = Hash.new('') h[:p] # => '' h.fetch(:p) # => KeyError h.fetch(:p, '(undef)') # => '(undef)'
デフォルト値
- Hash.new(value)
- Hash.new { |hash, key| }
- Hash#fetch(key, value)
Hash.new にブロックを渡す例
h1 = Hash.new('') h2 = Hash.new do |hash, key| hash[key] = key.upcase end
第17章 IOクラス
Fileオブジェクトを作成せずに読み書きする方法
File.read('in.txt', { encoding: 'utf-8' }) # option のハッシュも使えるようだ File.write('out.txt', '漢字まじり', { encoding: 'utf-8' }) File.binread('in.bin') # バイナリファイルの場合 File.binwrite('out.bin', '漢字混じり')
他のコマンドとのやり取り
第18章 FileクラスとDirクラス
実際に使うときにヘルプを見れば良し。
第20章 TimeクラスとDateクラス
実際に使うときにヘルプを見れば良し。
第21章 Procクラス
Proc, ラムダ式について メタプログラミングRuby 第2版 を読むほうが良い。
pdf ファイルからイメージファイルを取り出す(ruby, poppler)
ruby で pdfファイル内のテキスト、図の情報を取り出すのをどうするか。
簡単なのは poppler みたいなので、試して見る。
poppler 自体は他の gem のインストール時に勝手に入っているので問題なし。
ただし日本語を含むものはエラーが出るので poppler-data が必要のようだ。
Windows上のRubyで日本語PDFを読むためにpoppler-dataをインストールする方法 - アイデアの甕 を参考にさせてもらった。
Poppler の下の方にある、poppler-data のリンク
(本日現在で https://poppler.freedesktop.org/poppler-data-0.4.7.tar.gz )を解答したフォルダを
poppler にリネームして、poppler-gem の下に置けば良い。
こちらの環境では次のフォルダの下ということにになる。
C:\Programs\ruby\lib\ruby\gems\2.3.0\gems\poppler-3.0.8-x86-mingw32\vendor\local\share
テキストの取り出しは至って簡単。
イメージの取り出しは、pdf に格納されているままということではなく、write_to_png で png ファイルとして書き出すことになる。
image_mapping メソッドがページ内のイメージ数の取得に使えそうだが、[]を返すので、nil になるまでループを回すしかなさそう。
require 'poppler' if ARGV.empty? puts 'usage: rb get_image.rb file [files...]' exit end ARGV.each_with_index do |file, file_num| file = file.encode 'utf-8' doc = Poppler::Document.new file doc.pages.each_with_index do |page, page_num| puts "file: #{file}, page: #{page_num}" image_num = 0 loop do img = page.get_image image_num break unless img filename = "#{File.basename(file, '.*')}_#{page_num}_#{image_num}.png" img.write_to_png filename image_num += 1 end end end
Rubyの組み込みクラスの一覧を表示してみる
組み込みクラスの一覧を表示してみたいと思い立った。
考えたのは
- Objectの定数一覧取得
- それぞれの定数からクラスを得る
- そのクラスがClassであれば、組み込みクラス
[8] pry(main)> puts Object.constants.select { |x| Kernel.const_get(x).class == Class } Object Module Class BasicObject NilClass Data TrueClass FalseClass Encoding String Symbol Exception SystemExit SignalException Interrupt StandardError TypeError ArgumentError IndexError KeyError RangeError ScriptError SyntaxError LoadError NotImplementedError NameError NoMethodError RuntimeError SecurityError NoMemoryError EncodingError SystemCallError UncaughtThrowError ZeroDivisionError FloatDomainError Numeric Integer Fixnum Float Bignum Array Hash Struct RegexpError Regexp MatchData Range IOError EOFError IO File Dir Time Random Proc LocalJumpError SystemStackError Method UnboundMethod Binding Enumerator StopIteration RubyVM Thread ThreadGroup ThreadError ClosedQueueError Mutex Queue SizedQueue ConditionVariable Fiber FiberError Rational Complex TracePoint StringIO Monitor Delegator SimpleDelegator PrettyPrint PP Pry Slop Tempfile Pathname Insertion SymbolHash OpenStruct OptionParser OptParse Logger StringScanner ScanError => nil
うまくいっている模様。*Errorは例外クラスと
Errorは例外クラス。
普段見慣れないものもかなりある。
Windows版Rubyでp メソッドが文字化けする件の回避(-Uオプション)
いわゆるprintfデバッグに相当する pメソッドなのだが、漢字が正しく表示されない。
例えば
class Tel def initialize(number, name) @number = number @name = name end end kyoto = Tel.new('075', '京都市') p kyoto
を実行すると、ruby 1.9からだったと思うが、
> ruby tel.rb #<Tel:0x2dcb764 @number="075", @name="\u4EAC\u90FD\u5E02">
のように悲しい結果になる。
試行錯誤の結果、どうやらEncoding.default_internal の問題の模様。
実際に
def show_enc %i(default_external default_internal).each do |enc| puts "Encoding.#{enc} => #{Encoding.send(enc).inspect}" end end class Tel def initialize(number, name) @number = number @name = name end end kyoto = Tel.new('075', '京都市') p kyoto show_enc
とすると
> ruby tel.rb #<Tel:0x2dbb79c @number="075", @name="\u4EAC\u90FD\u5E02"> Encoding.default_external => #<Encoding:Windows-31J> Encoding.default_internal => nil
となっている。
そこで、-U オプションを付けてやると
> ruby -U tel.rb #<Tel:0x2f1ab10 @number="075", @name="京都市"> Encoding.default_external => #<Encoding:Windows-31J> Encoding.default_internal => #<Encoding:UTF-8>
と幸せになれるという次第。
環境変数RUBYOPTに-Uを設定しておくと手間もかからない。
ただし、Rubyinstallerのruby.exeだと何故かエラーになることがある。
環境にもよるようだが、ASRだと今のところ問題なし。