BLOGTIMES
» ArchiveList (Tag for "ruby" )
«Prev || 1 · 2 · 3 · 4 · 5 · 6 ·... | | Next»
2016/03/01

Windows 向けの Ruby パッケージ「Rumix 2」

ruby 
Rumix 2 x64 - Windows 向けの Ruby パッケージ「Rumix 2」

Windows に Ruby をインストールするときはこれまで RubyInstaller for Windows を使っていましたが、Rumix 2 という別の選択肢を見つけたのでメモ。

インストーラーに mingw32 と書いてあるので、ベースは RubyInstaller と同じですが、イントーラーのオプションで DevKit や Bundler, SQLite などの便利ツールを一撃でインストールできるというのが大きな違いのようです。また、USB に入れて持ち歩けるポータブルな USB Rumix 2 もあるようです。

Rumix 2とは
Rumix 2とは、Windows上でRubyプログラミング環境を一気に整えたい方のための、詰め合わせパッケージです。
同梱のインストーラを利用することによって、ruby本体、リファレンスマニュアル、コマンドラインシェル、いくつかの関連ツールなどを、あなたのPCへまとめてインストールすることができます。
また、USBメモリなどに入れて使うことができる、インストール不要のパッケージ「USB Rumix 2」もあります。

    at 18:55 |
    2015/12/07

    ruby の break は case を抜けられない

    ruby 

    Ruby の break はループからの脱出専用なので、ループでない case を抜けられないことを知らなくてハマってしまったのでメモ。

    test.rb

    x = 1 case x when 1 break puts "1" else puts "else" end

    たとえばこんなプログラムを書いて実行してみるとわかりますが、break の部分で LocalJumpError になってしまいます。

    $ ruby test.rb test.rb:4: unexpected break (LocalJumpError)

    ドキュメントを改めて調べてみると、以下のような記載があり case を抜けられないと明記されています。

    制御構造 (Ruby 2.0.0)

    break はもっとも内側のループを脱出します。ループとは
    while
    until
    for
    イテレータ
    のいずれかを指します。C 言語と異なり、break はループを脱出する作 用だけを持ち、case を抜ける作用は持ちません。

    この部分の代替方法について記載がないので困りましたが、以前大域脱出の時に使った throw / catch を使ってひとまず実装することができました。


      at 22:02 |
      2015/08/01

      日本語の日付を Date に変換するには

      ruby  c 

      Ruby で文字列を Date に変換するには Date.parse() が使えますが、たまに上手くいかないことがあるので、任意のフォーマットを指定して Date に変換する方法がないかと思ってリファレンスを隅々まで読んでみたら Date.strptime() というちょうど良いモノが用意されていることが分かったのでメモ。

      singleton method DateTime.strptime (Ruby 2.1.0)

      strptime(str = '-4712-01-01', format = '%F', start = Date::ITALY) -> Date
      与えられた雛型で日付表現を解析し、 その情報に基づいて日付オブジェクトを生成します。
      Date._strptime も参照してください。 また strptime(3)、および Date#strftime も参照してください。

      ちょうど strftime() の逆をやるメソッドみたいですね。こんな感じで日本語の日付を parse できます。

      $ irb irb(main):001:0> require 'date' => true irb(main):002:0> d = Date.strptime('2015年 8月 1日','%Y年 %m月 %d日') => #<Date: 4914471/2,0,2299161> irb(main):003:0> d.to_s => "2015-08-01"

      実は C に srtptime() があった

      リファレンスに strptime(3) を参考にしろということが書いてあったので、実はこの機能は C のライブラリ由来なんですね。まったく使ったことがなかったので知りませんでした。man を調べてみると確かに strptime() という char* を struct tm に変換する関数があります。フォーマットの指定部分についても以下のように解説がありますね。

      Man page of STRPTIME

      format 引き数は、 scanf(3) で使われているような、 フィールドディスクリプターとテキスト文字で構成されている文字列である。 個々のフィールドディスクリプターは % とそれに続く文字からなり、 後者にフィールドディスクリプターを置き換える内容を指定する。 format 文字列中の他の全ての文字には、入力文字列にマッチする文字がなければならない。 フォーマット文字列中にある空白は例外であり、 入力文字列中の 0 個以上の空白とマッチする。 2 つのフィールドディスクリプターの間には、 空白・英字・数字がなければならない。

        at 23:33 |
        2015/06/05

        HTML をプレーンテキストに変換する (Ruby 編)

        ruby 

        先日、Python で HTML をテキストに変換しましたが、Ruby でももっとお手軽に HTML -> テキスト変換が出来るはずだと思って、改めて調べ直してみたら rgrove/sanitize を使うと簡単に実現できることが分かったので改めてメモ。

        gem sanitize を使う

        インストールは gem install sanitize を使えば一撃でできます。あとは Sanitize.clean () を呼ぶだけというシンプルさ。
        div タグや p タグがスペースになるのが気になりましたが、これは :whitespace_elements を使えば調整できることが分かりました。

        irb(main):001:0> require 'bundler' Bundler.require=> true irb(main):002:0> Bundler.require => [<Bundler::Dependency type=:runtime name="sanitize" requirements=">= 0">] irb(main):003:0> html = '<body><a href="http://example.com">linktext</a><div>divtext<br />div2gyoume</div><span>spantext</span></body>' => "<body><a href=\"http://example.com\">linktext</a><div>divtext<br />div2gyoume</div><span>spantext</span></body>" irb(main):004:0> Sanitize.clean(html, :whitespace_elements => [:p, :div] ) => "linktextdivtextdiv2gyoumespantext" irb(main):005:0> Sanitize.clean(html) => "linktext divtext div2gyoume spantext"

          at 20:17 |
          2015/06/05

          Bundler で gem を管理してみる

          ruby 

          最近、Ruby でアプリを開発するためのチュートリアルを読んだり、Redmine のインストール方法を調べたりすると Bundler という gem 管理ソフトが使われていることが多くなってきたので、ちょっと本腰をいれて仕組みを調べてみることにしました。

          Bundler は簡単に言えばアプリケーションごとに、必要な gem をインストールできるようになるソフトウェアです。通常の gem はシステム(というか、Ruby の環境)ごとに1つしかないので、自分が使いたいプロダクトが複数あったときに、それらが同じ gem だけれども違うバージョンを要求するような場合にプロダクトごとに gem の管理ができるようになります。逆に他のアプリを気にせずに、必要な gem をガンガンインストールできるようになるので管理が非常に楽になります。

          以下、導入メモ。

          [Bundler で gem を管理してみる の続きを読む]

            at 19:05 |
            2015/01/14

            RT810 の DHCP サーバを WPAD に対応させる

            networking  rtseries  ruby 

            企業等でプロキシサーバがネットワークに存在する場合、プロキシサーバを通常は自分で設定する必要があります。ノート PC 等を LAN に繋ぐたびに Proxy の設定をするのが面倒になってきたので、DHCP サーバの設定を変更して WPAD(Web Proxy Auto-Discovery Protocol) に対応させてやることにしました。これを使うと PC がプロキシの設定を自動的に拾いにいってくれるようになるので、面倒な設定をしないで済むようになります。設定ファイルのフォーマットは、以前プロキシの自動切り替えのときに使ったファイルと同じものです。

            DHCP サーバの設定変更方法については Yamaha のルータを DHCP サーバにしている場合には下記に解説があります。

            FAQ for YAMAHA RT Series / TCP/IP

            他、dhcp scope optionコマンドで設定した任意のオプション情報をクライアントに通知する方法があります。
            dhcp scope option スコープ番号 オプション番号=情報をASCIIコードに変換したものの羅列
               ASCIIコードにはLenフィールドは含める必要はありません。
               255のend optionや0のpad optionも指定の必要はありません。
            例:WPAD(Web Proxy Auto-Discovery Protocol)で必要なPACファイルの場所"http://192.168.0.1/proxy.pac"をオプション番号252番で通知する場合
              dhcp scope option 1 252=68,74,74,70,3a,2f,2f,31,39,32,2e,31,36,38,2e,30,2e,31,2f,70,72,6f,78,79,2e,70,61,63

            この ASCII コードの羅列を手動で生成するのが非常に面倒なので、これを行うためのワンライナーを書いてみました。

            ruby -e 'puts ARGV[0].unpack("C*").map{|n| "%02x" % n }.join(",")' 'http://path.to/file.pac'

              at 20:34 |
              2015/01/03

              Ruby で .xlsx ファイルの中身を読み取る

              ruby  excel 

              以前、Java で Apache POI を使って Excel ファイルを読み取るプログラムを書きましたが、今回は Ruby で .xlsx ファイルの読み取りに挑戦します。昔、MSMQ を呼び出した時のように WIN32OLE*1 を使う手もあるのですが、Windows 環境専用になってしまうので今回は適当な Gem を導入することにしました。

              .xlsx を読み込むことができる Gem としては roo-rb/rooweshatheleopard/rubyXL がよく使われているようですが、今回は読み込みのみの操作なので前者の Roo を使ってみます。

              以下、作業メモ。

              [Ruby で .xlsx ファイルの中身を読み取る の続きを読む]

              at 22:44 |
              2014/12/27

              Ruby 1.8 でも Thread#backtrace したい

              ruby 

              Ruby でマルチスレッドなプログラミングをしていると、自分が起こした Thread が今何をやっているか調べたくなることがあります。そんなときのために Ruby 2.0.x からは Thread#backtrace が導入されているのですが、今回は 1.8.x で動いているシステムで同じことがやりたかったので、何か良い方法がないか模索することに。

              ネットを探していると thread_backtrace という gem を見つけました。Experimental とあるのでちょっと心配でしたが、gem install thread_backtrace だけで普通にインストール&実用できました。ただ、この gem がサポートしているのは 1.8 だけで 1.9 はサポートされていないのでその部分は注意が必要なようです。

              例えば以下のようなプログラムがあった場合に、これを実行するとこんな感じの結果を得ることができます。

              test.rb

              require 'rubygems' require 'thread_backtrace' class A def m1 ; sleep 3 ; m2 ; end def m2 ; sleep 3 ; end end t = Thread.new { A.new.m1 } p t.backtrace sleep 5 p t.backtrace sleep 5 p t.backtrace

              実行結果

              ["test.rb:5:in `m1'", "test.rb:9", "test.rb:9:in `initialize'", "test.rb:9:in `new'", "test.rb:9"] ["test.rb:6:in `m2'", "test.rb:5:in `m1'", "test.rb:9", "test.rb:9:in `initialize'", "test.rb:9:in `new'", "test.rb:9"] test.rb:14:in `backtrace': killed thread (ThreadError) from test.rb:14

              スレッドが既に終了している場合には ThreadError が投げられるようですね。
              Ruby 2.0 の backtrace のリファレンスには「スレッドがすでに終了している場合は nil を返します。 」とあるので、このあたりの仕様の違いには注意する必要がありそうです。


                at 21:55 |
                2014/10/31

                Diff::LCS を使って自力で Diff を取る

                ruby 

                テキストやソースコードの差分を取るのに diff コマンド*1を使うと便利ですが、今回はこれをちょっとした処理に使いたかったので Ruby 上で Enumerable なオブジェクト同士を比較できる Diff::LCS を使ってみました。これを使うと、Array などの差分情報が取得できるようになります。

                halostatue/diff-lcs · GitHub

                Diff::LCS computes the difference between two Enumerable sequences using the McIlroy-Hunt longest common subsequence (LCS) algorithm. It includes utilities to create a simple HTML diff output format and a standard diff-like tool.

                例えば、[1,2,3] と [1,4,5,2,6,3] の差分を取るプログラムは下記のような感じになります。

                require 'rubygems' require 'diff/lcs' from = [1,2,3] to = [1,4,5,2,6,3] diffs = Diff::LCS.diff(from,to) p diffs patched = Diff::LCS.patch(from, diffs) p patched

                これを実行すると下記のような差分と、patch の適用結果が得られます。

                [[["+", 1, 4], ["+", 2, 5]], [["+", 4, 6]]] [1, 4, 5, 2, 6, 3]

                + の部分が追加を表していて、削除する部分があれば - になるようです。

                [Diff::LCS を使って自力で Diff を取る の続きを読む]

                at 16:49 |
                2014/10/30

                Ruby の大域脱出

                ruby 

                Ruby でネストしたループから脱出する(大域脱出)方法を忘れてしまっていたので、忘れないようにメモ。

                Java の大域脱出はラベル付き break*1 / continue *2で実現されていますが、Ruby は Kernel.#throw*3 / Kernel.#catch*4 で実現されています。
                ラベルを渡すこと以外は raise / rescure と同じような感じですね。

                例えばネストした配列があって、これを順に取り出して 100 が見つかったら終了という処理はこんな感じで書けます。

                arrs = [[1,2,3,4,5], [10,20,30,40,50], [100,200,300,400,500], [1000,2000,3000,4000,5000] ] catch(:break) do arrs.each do |arr| arr.each do |n| puts "n = #{n}" throw :break if n == 100 end end end

                実際に実行するとこんな感じ。うまく動きました。

                n = 1 n = 2 n = 3 n = 4 n = 5 n = 10 n = 20 n = 30 n = 40 n = 50 n = 100

                at 23:43 |
                «Prev || 1 · 2 · 3 · 4 · 5 · 6 ·... | | Next»
                » ArchiveList (Tag for "ruby" )