Railsの開発ではgemを使わないと何もできないが、ふとgemってどう作るんだろうという疑問がいまさらわいてきた。
ということで自分でgemパッケージを作ってみた。
gemを作るためのnewgemという便利なものがあったのでそれを利用してみた。

1 newgemのインストール
まずはnewgemをインストールする。

$ gem install rubyforge
$ gem install newgem

2 ひな形の作成と編集
newgemコマンドを発行して作成するgem(mygemtest)のひな形ファイルを生成する。

$ newgem mygemtest -T rspec
      create  lib/mygemtest
      create  script
      create  History.txt
      create  Rakefile
      create  README.rdoc
      create  PostInstall.txt
      create  lib/mygemtest.rb
  dependency  install_rspec
      create    spec
      create    tasks
      create    spec/mygemtest_spec.rb
      create    spec/spec.opts
      create    spec/spec_helper.rb
      create    tasks/rspec.rake
  dependency  install_rubigen_scripts
      exists    script
      create    script/generate
      create    script/destroy
      create  script/console
      create  Manifest.txt
      readme  readme

“-T rspec”でテストフレームワークとしてRSpecを指定している。

Rakefileのself.developerの”FIXME”の部分を変更する。

$hoe = Hoe.spec 'mygemtest' do
  self.developer 'anthony', 'anthony@abc.com'   self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required

README.rdocの”FIX”の部分を変更する。

= mygemtest

* http://github.com/#{github_username}/#{project_name}

== DESCRIPTION:

FIX (describe your package)

== FEATURES/PROBLEMS:

* FIX (list of features or problems)

== SYNOPSIS:

  FIX (code sample of usage)

== REQUIREMENTS:

* FIX (list of requirements)

== INSTALL:

* FIX (sudo gem install, anything else)

== LICENSE:

(The MIT License)

3 ライブラリコードの追加
lib/mygemtestにライブラリコードとしてmyclass.rbを以下の内容で作成する。

module MyGemTest
  class MyClass
    def initialize
        puts "Initialized Done !!"
    end
   end
end

4 パッケージ作成
gemパッケージを作成する。
Manifest.txtに作成したmyclass.rbのパスを追加しておく。
これをしておかないとgemファイルに作成したライブラリコードが含まれない。
(これで1時間くらい悩んだ orz)

History.txt
Manifest.txt
PostInstall.txt
README.rdoc
Rakefile
lib/mygemtest.rb
lib/mygemtest/myclass.rb <- 追加
script/console
script/destroy
script/generate
spec/mygemtest_spec.rb
spec/spec.opts
spec/spec_helper.rb
tasks/rspec.rake

gemファイル生成を以下のファイルで行う。

 $ rake package 

pkgディレクトリにmygemtest-0.0.1.gemというファイルができているので、ちゃんと動作するかgemファイルをインストールしてみる。

 $ sudo gem install -l mygemtest-0.0.1.gem 
 PostInstall.txt 
 Successfully installed mygemtest-0.0.1 1 gem installed 
 Installing ri documentation for mygemtest-0.0.1... Building YARD (yri) index for mygemtest-0.0.1... 
 Installing RDoc documentation for mygemtest-0.0.1... 

irbで動作確認をする。

 $ irb 
irb(main):001:0> require "mygemtest/myclass"
irb(main):003:0> a = MyGemTest::MyClass.new
Initialized done !!
=> #

初期化メソッドが呼ばれていれば正しくインストールされている。

5 コマンドをgemに追加
gemパッケージにはライブラリコードだけでなくコマンドも追加できる。
以下のコマンドでコマンド用の雛形を生成する。

 $ ./script/generate executable mygemtest
    create  bin
      exists  lib/mygemtest
      create  bin/mygemtest
      create  lib/mygemtest/cli.rb
      exists  spec
      create  spec/mygemtest_cli_spec.rb

lib/mygemtest/cli.rbというファイルが生成されているので下のソースの39行目以降にコマンドのコードを書く。

require 'optparse'

module Mygemtest
  class CLI
    def self.execute(stdout, arguments=[])

      # NOTE: the option -p/--path= is given as an example, and should be replaced in your application.

      options = {
        :path     => '~'
      }
      mandatory_options = %w(  )

      parser = OptionParser.new do |opts|
        opts.banner = <<-BANNER.gsub(/^          /,'')
          This application is wonderful because...

          Usage: #{File.basename($0)} [options]

          Options are:
        BANNER
        opts.separator ""
        opts.on("-p", "--path PATH", String,
                "This is a sample message.",
                "For multiple lines, add more strings.",
                "Default: ~") { |arg| options[:path] = arg }
        opts.on("-h", "--help",
                "Show this help message.") { stdout.puts opts; exit }
        opts.parse!(arguments)

        if mandatory_options && mandatory_options.find { |option| options[option.to_sym].nil? }
          stdout.puts opts; exit
        end
      end

      path = options[:path]

      # do stuff ここにコードを追加
      stdout.puts "コマンド動いたよ!"
    end
  end
end

Manifest.txtにcli.rbのパスを追加。

History.txt
Manifest.txt
PostInstall.txt
README.rdoc
Rakefile
lib/mygemtest.rb
lib/mygemtest/cli.rb  <- 追加
lib/mygemtest/myclass.rb
script/console
script/destroy
script/generate
spec/mygemtest_spec.rb
spec/spec.opts
spec/spec_helper.rb
tasks/rspec.rake

再度、rake packageでgemパッケージを作りなおして再インストールすればコマンドが使えるようになる。
newgemの解説がいまいちちゃんとしたものがなかったので結構試行錯誤してしまったが、これだけおさえておけば普通に使う分には十分でしょう。
後、テストコードの書き方とか気が向いたら書くかも。

参考URL: gemパッケージの作り方

 

Rails3,Ruby1.9.2でGoogle Data APIを利用する場合はGemfileに以下の行を追加する。

 

Ubuntu 11.04になってUnityが導入されて、Macのようなメニュー形式になったためにAptina Studio3のメニューがWindow以外表示されない状況になってしまう。

回避方法として以下のようなシェルスクリプト経由でAptanaStudioを起動するようにする。

AptanaStudio3.shといったファイル名で保存してこのシェルスクリプトを起動すると以下のようにメニューが全て出てくるようになる。

PadrinoでHamlを使っているが以下のようなエラーが発生する。

Encoding::UndefinedConversionError – “\xE4″ from ASCII-8BIT to UTF-8”

対処方法としては-# Encoding:utf-8をファイルの最初の行に追加する。
Ruby1.9になって明示的に文字コードを指定しないとASCII-8BITと認識するみたいだ。

Rails3のアプリケーションをクラウドサービスのHerokuを使ってみた。
登録方法はこちらを参照した。

HerokuでRuby1.9とRails3を使う

git push heroku masterコマンド発行時、fatal errorが発生。
以下のコマンドでgitリポジトリの設定を行う。

git remote add heroku git@heroku.com:プロジェクト名.git

これでgit push heroku masterコマンドが成功。
http://プロジェクト名.heroku.comでちゃんとRailsが動作していることが確認できた。

VirtualBox 3.2.6は、シームレスモードやカーソルがキャプチャーされないなど使い勝手がかなりよくなった。
しかし、Ubuntu 10.04をゲストOSで使う場合はアドオンモジュールを入れないと画面解像度が800×600に固定されて変更ができない。

Ubuntuで画面解像度を変更できるようにするには以下の手順で行う。

1 VirtualBox上でUbuntuを立ち上げる

2 Virtualboxメニューのデバイス- CD/DVDデバイスでVBoxGuestAddisions.isoを選択する。

3  UbuntuのターミナルでCDROMデバイスをマウントする
# mount /dev/cdrom /mnt

4 /mnt下のautorun.shをルート権限で実行する。

6 別ウィンドウにビルドの経過が表示される。終了したらリターンキーをたたく。

5 インストール終了後再起動する。

6  VirtualBoxメニュー 仮想マシン-フルスクリーンモードにする でフルスクリーンになるか確認する。

データベース設計でER図を描くのにWindows上でDia(0.96.1)を使っているのだが思いっきりはまってしまった。

1時間ほどかけて作ったER図が保存したにもかかわらずファイルにちゃんと書かれていなかった。
セーブしたファイルを見るとサイズが0になっている。
色々試してみた結果ファイルパスに日本語が含まれているとだめみたいだ。
ちなみに図に日本語を入れるのは問題ない。

DiaはもともとGnomeのアプリケーションだから日本語ファイル名を想定して作られていないのだろう。
まだちゃんと日本語対応していないのもあると思うが。
しかし、これからのGUIアプリケーションは Linuxといえどマルチバイトのファイル名は必須ではないだろうか。
せっかく作ったER図をまた一から作らなければ。