備忘録Ruby

# etc

* Ruby プログラムをエラーメッセージ付きで終了
    * [module function Kernel.#abort](http://docs.ruby-lang.org/ja/1.8.7/method/Kernel/m/abort.html)
    * いわゆるprint文デバッグと併用するのに便利
* エンコードした文字列を返す
    * [encode, encode! (String)](http://ref.xaio.jp/ruby/classes/string/encode)
    * Windows 上で Shift-JIS を取り扱う際は Winodws-31J を指定すること

# 例外処理
[例外処理の書き方](http://www.minituku.net/courses/566428009/lessons/760432481/texts/302758961?locale=ja)

# Windowsで起動させる方法いろいろ
Ocraでexe化してあるのを前提として…

* バッチファイル
    * スクリプトに渡す引数は、バッチファイルの先頭に変数で書いておけばいい
    * 配列が無いので、不特定数の引数が設定しにくい
    * 慣れている人にはこれで十分だが、初心者にはハードルが高い
* WSH(VBScript,JScaript)
    * GUIで引数が書き込める
        * ウィンドウのレイアウトは設定できない
        * 複数の引数を指定しようとしたら、引数ごとにウィンドウを出すので、引数入力がわかりにくい
    * [WSHで誰でも簡単プログラミング（WSH入門）](http://homepage2.nifty.com/pasocon/nyumon/main.html])
* Powerscript
    * バッチファイルよりもできることが多い
    * Powerscriptを起動するのに実行許可を求められるのが手間
* Ruby/Tk
    * Ruby/TkでGUIを作るのが、CUIに慣れていない人には適している
    * RubyGnomeでもいいが、わかりやすい日本語資料が少ない…
* 参考リンク
    * [Windowsのスクリプトを書けるようになりたい人がよむべきサイトのまとめ](http://matome.naver.jp/odai/2133467885280090701?&page=1)


## map
* 要素ひとつひとつにブロックを実行する
    * リファレンス→ [map, map! (Array)](http://ref.xaio.jp/ruby/classes/array/map)
* 配列の中の要素すべてを文字列→数値にしたり、数値を演算したりするのに便利
    * `mojiretsu.map!{|m| m.to_i}` で、文字列→数値に換えられる
        * もっと短く書くと `mojiretsu.map!(&:to_i)`
            * `(&:to_i)` がよくわからん。参考↓
                * http://d.hatena.ne.jp/tadakado/20120518/1337372360
                * http://blog.livedoor.jp/sasata299/archives/51541958.html

## 文字コード
* [Rubyでの日本語対応スクリプトの基本スタイル](http://www.trail4you.com/TechNote/Ruby/basic.html)
    * Ruby1.8系とRUby1.9系以降では、コード冒頭の文字コード指定部分の書き方が異なる
    * Windows で使用している Shift-JIS は、一般的な Shift-JIS とは微妙に異なる
        * Windows で Shift-JIS : Windows-31J
        * 一般的な Shift-JIS : shift_jis
    * [Rubyでの日本語対応スクリプトの基本スタイル](http://www.trail4you.com/TechNote/Ruby/basic.html)
        * スクリプトファイルの頭に書いておくべき文字コード指定の役割を説明

## delete
* 配列から指定したものと同じ要素をすべて削除
* `"flag"` という要素をすべて消したい時は `mojiretsu.delete("flag")` のように書く
* リファレンス→ [delete (Array)](http://ref.xaio.jp/ruby/classes/array/delete)


# RubyGem

Ruby用のパッケージ管理システム。
色んなものがアップロードされていて、実に便利。
車輪の再発明を防止する意味でも、積極的に使いたい。

* [初心者は覚えておきたいRubygemsのコマンドまとめ](http://qiita.com/muran001/items/14f34b735e0a6b4af98c)
    * 使い方はここを読んでおけば困らない
* [RubyGems.org](https://rubygems.org/)
    * ここで欲しい機能を英単語で検索すると、色々出てくる
    * xlsx や csv や twitter など、自分が欲しいと思っているものは、何かしらの形で既に作られている
* インストールできない？
    * 職場の環境によっては、プロキシを通す必要がある
        * gemコマンドを使う前に、「set http_proxy=プロキシのURL」「set https_proxy=プロキシのURL」を実行しておく
        * 環境変数で設定しておいてもいい
        * [Ruby Gem のプロキシを設定する (Windows)](http://weblabo.oscasierra.net/ruby-gem-proxy-1/)


# 標準搭載デバッガ

Windows 上だと文字コードの関係なのか、デバッガがまともに動かなかった。
Cygwin 上だと問題なく動いた。謎。

* [使用例](http://asaasa.tk/wiki/?Ruby%2FDebug)
* [library debug](http://docs.ruby-lang.org/ja/1.8.7/library/debug.html)


# 多次元配列の初期化方法

参考→[Ruby 配列の初期化と多重配列](http://blog.cototoco.net/work/201405/ruby-%E9%85%8D%E5%88%97/)

`[[0,0,0],[0,0,0]]`
のような多次元配列を作る時は、
`arr = Array.new(2){ Array.new(3,0) }` 
のように、ブロックを使って書くこと。

`arr = Array.new( 2, Array.new(3,0) )`
のように書くと、
要素への変更が、本来変更する予定でない要素にも影響してしまう。
詳しくは→[Rubyで二次元配列の初期化](http://simanman.hatenablog.com/entry/2013/06/24/200306)


# コマンドプロンプト上でちょっと試す

1. `ruby` でrubyを起動
2. rubyスクリプトを書いていく
3. 書き終わったら `Ctrl-z`
4. 結果が出て終わり

参考→[[Ruby]コマンドプロンプトを使う](http://d.hatena.ne.jp/mailishmaid/20061021)


# rcairo

2次元画像描画ライブラリの cairo を Ruby で使う為のライブラリ。

* [cairo: 2 次元画像描画ライブラリ](http://magazine.rubyist.net/?0019-cairo)
* [cairoによる図形の描画](http://www.iim.cs.tut.ac.jp/~sugaya/books/GUI-ApplicationProgramming/files/GTK-book-chapter6.pdf)


# GUI

## Ruby/GNOME

* [Ruby-GNOME2 Project](http://ruby-gnome2.osdn.jp/ja/)
    * ↑ここのチュートリアルをひと通りやると、大体わかる
* [ドラッグ＆ドロップの例](http://ichi-note.sblo.jp/article/54823992.html)
* [複数行テキスト表示ウィジェットの概要](http://lldev.jp/ruby/gtk_gnome/textview_overview/index.html)
    * 複数行のテキストバッファ(ビュー)にスクロールバーを付ける例
* [『入門GTK+』のPDF](http://www.iim.cs.tut.ac.jp/~sugaya/books/GUI-ApplicationProgramming/files/GTK-book-all.pdf)
    * Rubyではないので、書き方に注意
* Ruby/GNOMEをocraでexe化
    * `ocra hogehoge.rb` で問題なし
    * 簡単なスクリプトでも、ビルドはかなり時間が掛かる
    * GNOMEの基本的な機能一式を含んでいるからか、exeのサイズは結構大きめ
* [Gemのgtk3ライブラリ紹介ページ](https://rubygems.org/gems/gtk3)
    * 最新バージョンの履歴が見られる
* [GTK+ 3 Reference Manual](https://developer.gnome.org/gtk3/stable/)
    * 全編英語でRubyの書き方ではない
    * GTK2とAPIの書き方が結構異なるので、参考にならないかも
        * いっそのこと、GTK3を使ってみるべき？
* [Ruby-GNOME2 の開発メーリングリスト](http://sourceforge.net/p/ruby-gnome2/mailman/)
    * 過去ログを読むと、GTK+ 3の機能をすべて使えるようになっているらしい
    * もうGTK+3でいいか…

## Ruby/Tk

* [Ruby de GUI](http://magazine.rubyist.net/?0001-RubyGUI)
* [Ruby/Tk入門](http://ronor.web.fc2.com/rubytk/#02)
* [RubyでGUIを作る (Tcl/Tk)](http://www.trail4you.com/TechNote/Ruby/tk.html)
* [逆引き Ruby/Tk](http://pub.cozmixng.org/~the-rwiki/rw-cgi.rb?cmd=view;name=%B5%D5%B0%FA%A4%ADRuby%2FTk)
* 永井氏の[Ruby/Tk](http://www.dumbo.ai.kyutech.ac.jp/nagai/RubyTk/)
* [Ruby/Tk の動向](http://magazine.rubyist.net/?0003-RubyTkMovement)
* [Ruby/TkでTk拡張を使っているRubyスクリプトをexe化](http://5zalt.hatenablog.com/entry/2015/02/17/093428)
    * `ocra hoge.rb C:\Ruby193\lib\tcltk\ --windows --no-autoload` のように書く
    * ↑の書き方は Windows の Ruby Installer をインストールする時に、一緒に Ruby/Tk をインストールした場合の書き方かも
* Ruby/Tk でドラッグ&ドロップをするには、標準の Ruby/Tk だけでは実現できない？
    * Ruby/GNOMEを使うべきか…

# Rabbit

* http://rabbit-shocker.org/ja/
* >gem install rabbit
* Markdown形式でテキスト書く
    * # がスライド1枚のタイトル名
    * * がスライド内のリスト
    * 文頭に何も置かない場合は本文になる
* >rabbit hoge.md
    * いきなりウィンドウが表示されて、プレゼンができる
* >rabbit -p -o hoge.pdf hoge.md
    * pdfを出力
    * これだとpdfをConfluenceに貼り付けた時、文字化けする
    * おそらくPDFに文字コードをそのまま格納しているから
    * 全ページ画像化して、pdf_asでPDFにまとめる(煩雑)
        * うさぎが歩くのをやめさせたい
            * rabbit-slideで変えるのか？
* 16:9にする
    * サイズの -w と -h を変える
    * `rabbit -w 1280 -h 720 hoge.md` などのようにすると 16:9 になる
    * フルHDだとプレビューが大きすぎるので`-w 640 -h 360`などでプレビューするといい

* rabbit のコマンドを使うたびに `DL is deprecated, please use Fiddle`と表示される
    * 表示されてていても、今のところは実害無し
        * Ruby2.0 から dll や so などのライブラリを使うのが非推奨(desprected)になり、Fiddle を使うよう Ruby 側から勧められている
            * Windows の Ruby 環境で Rabbit を使うから？
    * 参考→ https://teratail.com/questions/1411


# ReVIEW

テキストマークアップ型の原稿フォーマット。

ReVIEW 記法でテキストファイルを作成し、
それらを ePUB だけでなく
PDF(LaTeX)、XHTML、XML といったマルチフォーマットに出力可能。

Emacs 用の支援モードがあるらしい。

* [書籍制作フローを変える。「ReVIEW」という解。](http://kmuto.jp/events/page2012/page2012.pdf)
* [【書籍制作ワークフロー】ReVIEW 入門 #01 – ReVIEW をインストール](http://dev.classmethod.jp/tool/try-review-01/)


# MS-Excel

xlsx や xlsm といったファイルの中身を取り扱うのに用いる。
使うライブラリは roo が評判良いが、
xlsx/m のデータの中身だけを使いたいのであれば、
一旦 csv に変換してから、後述の CSV ライブラリを使った方が楽。

というのも roo でセル内容を直接読もうとすると、
セルの内容が浮動小数点型、文字列型、日付型、日時、関数型、などの型によって
実際に Excel 上で見る時と異なる値を取得してしまう。

例えば、数値は実数型なのに浮動小数点型ですべて取り扱ってしまうので、
「.0」を付けてほしくないのに付けてしまう。

roo の csv 出力はここら辺を慮って作られているのか、
Excel で表示されるままで出力してくれることが多い。
但し Ruby が 0.0001 より小さい数値を 1.0e-04 のように表記してしまうので、
それが嫌な人は csv に出力してから、別途加工する。

* [roo-rb](https://github.com/roo-rb/roo)
    * roo の本家ページ
    * README.md に、インストール方法と使い方のほとんどが簡潔に書かれている。英語が苦手でも、そんなに難しい内容ではないので、目を通しておくのがオススメ
* [roo-1.2.3 Documentation](http://roo.rubyforge.org/rdoc/)
    * roo のリファレンス
    * コマンドに迷ったらここを参照
* 英語だとよくわからない場合の日本語参考ページ
    * [WindowsのRubyでxlsxファイルにアクセスする～roo](http://blog.scimpr.com/2015/03/15/windows%E3%81%AEruby%E3%81%A7xlsx%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%EF%BD%9Eroo/)
    * [roo：スプレッドシートを操るRubyライブラリ](http://labs.torques.jp/2012/02/21/2517/)


# CSV

読み込み、書き出し、共に楽で便利。
使わない手は無い。

* Windows で使う場合は Shift-JIS で
    * Windows だと、読み込む CSV ファイルを一旦 Shift-JIS に変換する必要がある
    * もし Shift-JiS に変換しないと、読み込めない
    * nkf で変換してから読み込むのが、確実で楽
    * [CSV を文字コード変換しつつロード](http://qiita.com/labocho/items/8559576b71642b79df67)
    * [Rubyで日本語の入ったcsv(utf-8)を使おうと思ったらinvalid byte sequence in Windows-31Jエラーが出たのでメモ](http://t4traw.github.io/20140324/csv-file-better-encode-is-shift-jis.html)
* [TSVやCSVファイルの読み込み方法の例](https://www.qoosky.net/references/110/)
* [CSV.table を使うとヘッダが取得できて便利](http://melborne.github.io/2013/01/24/csv-table-method-is-awesome/)
* [Hash から文字列でもシンボルでも値を取り出す](http://qiita.com/QUANON/items/169c73425a6bc50dee51)
    * 一緒に使うと便利
* [class CSV](http://docs.ruby-lang.org/ja/2.0.0/class/CSV.html)


# JSON

読み込んでハッシュにするのが、とても楽。
書き出しはまだ使ったこと無し。

* [Ruby 1.9 以降で JSON を扱う](http://tohka383.hatenablog.jp/entry/20111205/1323071336)
* [RubyでJSONファイルを読み込んで更新して保存するサンプルスクリプト](http://qiita.com/knt45/items/0f781a6e381c18572532)
* [module JSON](http://docs.ruby-lang.org/ja/2.1.0/class/JSON.html)


# XML

XML を読み書きする標準ライブラリ rexml が便利。

* [RubyでXML読み込むのってすごく簡単だった](http://opamp.hatenablog.jp/entry/2013/04/06/203653)
* [library rexml](http://docs.ruby-lang.org/ja/2.2.0/library/rexml.html)


# Windowsでのexe化

パソコンに Ruby をインストールしていない人にも使ってもらえるように、
実行ファイル(exe)化するのに ocra を用いる。

* [larsch/ocra](https://github.com/larsch/ocra)
    * ocra の本家ページ
    * インストールや使い方は README.md を参照
* Ruby2.1.1 にて ocra でexe化が正常に行えなかった
    * 別のインストーラパッケージで 2.0.0 をインストールしたら、ocra でexe化は問題なく行えた
    * Ruby のバージョンが問題なのではなく、インストーラに問題があるような気がする
    * http://qiita.com/t_oginogin/items/9f989f9b5dc5b3e08994