RubyKaigi 2013の感想など

生まれかわった RubyKaigi RubyKaigi 2013 に参加しました。

http://rubykaigi.org/2013/images/badgeOfficialSponsor.png

今回も私の会社 EY-Office は スポンサー (一番小さいのですが)になりました。 現在のEY-Officeの売り上げのほとんどが Ruby, Ruby on Railsの教育なので当然ですよね ^^)

RubyKaigi全体の感想など

Matz がいる RubyKaigi

今までのRubyKaigiは土日開催が多く、Rubyのパパ Matz(まつもとさん)は宗教上の理由から土曜夜の帰ってしまわれる事が多かったと思います。
しかし、今回は木金土開催だったので、いつもMatzが会場にいました。 にこにこと質問に応じてくれるMatz 、お弁当を配ってくれるHeroku社員のMatz、 ボッチのMatz 。。。 私も Rubyの質問をゆっくりと出来ました。
Matz がいる Rubykaigi は Matz is nice so we are nice. が感じられる良い空間になってたと思う。

みんなと語りあえる Bentou のありがたさ

今回は Heroku が Bentou スポンサーとして、毎日の昼ご飯を提供してくれました。おかげで、お店に行ったりする時間が要らず、いろいろな参加者と話す事が出来、有形無形の得るものがりました。
Herokuさんありがとうございます。Microsoftさんも飲み物ありがとうございます。

しかし、語り合えない

@a_matsuda さんが、なぜ(日本人)みんなは、いつも使ってるモジュールやツールの作者の(外人の)開発者が来てるのに、話さないのかな? と言われ・・・・

その晩、考えました。

  1. 便利に使ってるモジュール・ツールでも、使ってるだけで、そのコードを読んだりしてない。したがって作者も知らない
    • これは、日本人の作者でも同じで、使っていても、そのモジュール・ツールそのものに興味をもっていない事が多い
    • 何か自分のやりた事が出来そうで出来ない時などはコードを読むが、そうい機会はそんなに多くない
  2. 英語力の低さ(低いと思ってる意識)もあり「素晴らしいモジュール・ツールをありがとう」と声をかける事が出来ない
  3. 上の2つが関連し、そのモジュール・ツールに興味があれば、拙い英語でも質問をしたくなるし、技術的な話しなら出来そうだけど、一般的なお話が出来る英語力は無いよ・・・

しかし、技術は圧倒的に英語圏で生まれるいまの時代、このようなチェンスに話しが出来ないのは本当にもったいないよな。
英語がんばろう! コードもたくさん読もう!

Ruby on Railsの人がたくさん登壇

以前より Ruby on Railsの人(と思える人)のセッションが増えたと思います。しかも、彼らの多くも Rubyの事を語っていました。
昔からRubyを使っていた人たちと、Ruby on Railsを使ってる人の溝みたいな物が、凄く小さくなっているように思え嬉しかった。

角谷さんの RubyKaigi

角谷さんは世界で一番 RubyKaigi の事を考え、時間を使っている人だ。 1年の休みを取ってからの 2nd Season の RubyKaigiが現実になり、緊張したり、焦ったりしながらも、輝いてる Kaigi屋の 角谷さんを 久しぶりに見られたのも 嬉しかった。

技術的な収穫

オブジェクト指向の再来

オブジェクト指向が今ほど広まっていなかった昔、一部のエンジニアたちが熱く語っていたオブジェクト指向。時は流れ Ruby on Rails を始めオブジェクト指向は一般的になりたくさんの場所で使われ出してみると、あらたな問題が出てくる・・・ 今回のRubyKaigiでも DCI, Refactoring Fat Models with Patterns、Refinement .... オブジェクト指向の古典と、さらにRubyらしい新しい形の話しが聞けた。今後も楽しみ。

RubyMotion

登場したときに、これは面白い! と思った RubyMotion でしたが、購入後まったく触っていませんでした、今回 RubyMotion がどのような仕掛けになっているのかが判りました。
そしてその面白さに惹かれて、現在あるアイデアを実装出来るのか試しています。Objective-Cが抵抗なく書ける私ですが、案外 面白い事が出来そうだとワクワクしています。

PyPy

RubyKaigi終了後の Tokyu.rbの宴会であった Pythonista の方(すいません名前を忘れてしまいました!)から PyPy の話しを聞かせてもたっら。
PyPyは Python で書いた Pythonの処理系だと思っていたのですが、現在は 動的言語処理系を作るためのフレームワークなのだそうです。LLVMGCCにかわる新しいCコンパイラーではなく、コンパイラーを作るためのフレームワークだというのと同じだそうです。面白そうですね Topaz (PyPyで作られたRuby処理系) もそんなところから生まれて来たんですね、納得納得。

年を取った

Matzの髪の毛や髭に白いものが混じって来て・・・ という話しではなく。3日間の密度の高いRubyKaigiに参加するのは体力が無く3日目は疲れていて、ついつい居眠りをしてました ^^;

歳を取ったなぁ〜 と思い知らされました。 でも老体にむち打って来年も参加します!
来年もスポンサーになれるようにがんばって仕事しよう !!

今すぐ、Windows7で Ruby 2.0.0 + Rails 4.0RC1 を試したい人向けのメモ

以前書いた 今すぐ、Windows7で Ruby 2.0.0 + Rails 4.0beta1 を試したい人向けのメモ より、だいぶ楽になったので書きました。


警告
  • 一応EY-Office教育テキスト(Rails, RSpec)のコードが動くところを確認しましたが、Rails4.0RC1の動作を保証するものではありません
  • もしMacLinux環境が使えるなら、そちらを使う事を強くお勧めします
  • irb, rails consoleでワーニングが出ます → Stack Overflow
  • Windows7(64bit)で試しました、WindowsXP等で動くかどうかわかりません
  • RailsInstaller も Ruby2.0.0に対応したインストラーを準備しているようなので、そちらを待つのも良いかもしてません
インストールの概要
インストール手順
  • http://rubyinstaller.org から Ruby 2.0.0-p125 と DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe をダウンロードし、インストール
    • インストール先は C:\Ruby200 等にしましょう
    • PATH に C:\Ruby200\bin を追加しましょう(インストラーで設定)
    • DevKitのインストールは訳あって C:\Ruby200\DevKit にしました
> gem update --system -N
> gem install bundler -N
> gem install rails --version 4.0.0.rc1 -N
> rails new dummy
  • sqlite3 (sqlite3-1.3.7-x86-mingw32)は動かないのでアンインストール
gem uninstall sqlite3
> cd C:\temp
> C:\Ruby200\DevKit\mingw\bin\bsdtar.exe -xvf  sqlite-3.7.15.2-x86-windows.tar.lzma
> copy bin\sqlite3.exe C:\Ruby200\bin
  • sqlite3の再インストール
> gem install sqlite3 -N --platform=ruby -- --with-opt-dir=C:\temp
  • Ruby on Rails の動作が確認できたら C:\temp は削除してかまいません
プロジェクト作成時の注意

新規にRailsプロジェクトを作る際に bundle が動くと、また動作しないsqlite3-1.3.7-x86-mingw32がインストールされてしまうので以下のように、プロジェクトを作成すると良いでしょう

> rails new rails_app -B
> cd rails_app
> bundle install --local

まちがって、普通に rails new rails_app してしまった時は sqlite3-1.3.7-x86-mingw32 をアンインストールすれば OK

>gem uninstall sqlite3
Select gem to uninstall:
 1. sqlite3-1.3.7-x86-mingw32
 2. sqlite3-1.3.7
 3. All versions
> 1
Successfully uninstalled sqlite3-1.3.7-x86-mingw32
おまけ

この方法で作った C:\Ruby200 をコピーしPATHを設定するだけで、簡単に他のPCに Ruby on Rails環境をコピーできます ^^)

今すぐ、Windows7で Ruby 2.0.0 + Rails 4.0beta1 を試したい人向けのメモ

なんとか、Windows7Ruby 2.0.0 + Rails 4.0beta1 を動かせたので、そのときのメモです。


警告
  • 一応、scaffold で作ったアプリが動くところを確認しましたが、Rails4.0beta1の動作を保証するものではありません
  • もしMacLinux環境が使えるなら、そちらを使う事を強くお勧めします
  • インストール手順はやや複雑です
  • irb,rails consoleでワーニングが出ます
  • Windows7(64bit)で試しました、WindowsXP等で動くかどうかわかりません
インストールの概要
  • Rubyのインストールは RubyInstaller+DevKit を使用
  • Railsのインストル は普通に gem
  • 問題点は
    • OpenSSL 利用時に証明書エラーが発生
    • sqlite3 (sqlite3-1.3.7-x86-mingw32)がRuby2.0 に対応してない
インストール手順
gem install rails --version 4.0.0.beta1 --no-ri --no-rdoc
rails new dummy
  • sqlite3 (sqlite3-1.3.7-x86-mingw32)は動かないのでアンインストール
gem uninstall sqlite3
set PATH=%PATH%;C:\Ruby200\DevKit\bin;C:\Ruby200\DevKit\mingw\bin
bash
cd c:/sqlite-autoconf-3071502
./configure --prefix=c:/sqlite3
make
mkdir c:/sqlite3
make install
cp c:/sqlite3/bin/* c:/Ruby200/bin
  • sqlite3の再インストール
gem install sqlite3 --platform=ruby -- --with-sqlite3-include=c:/sqlite3/include --with-sqlite3-lib=c:/sqlite3/lib

以上です ^^;

謝辞

sqlite3 gem のインストールは sqlite3 gemコミッターの Lavena さんに助けてもらいました m(_ _)m

Ruby on Rails中級者コースを始めました。

私の会社EY-Officeでは、Ruby on Rails中級者コース を始めました → http://www.ey-office.com/blog_archive/2012/11/13/in-new-ruby-on-rails-education/

http://www.ey-office.com/images/ID-10064239new.png

このコースは、たんにRuby on Railsの知識を深めるのでは無く、Ruby on Railsを使って実際のアプリ・サービスを作る為に必要な技術・知識を学んでもコースです。

弊社のRuby on Rails入門コースを受講してない方でも、大歓迎です!

Ruby on Rails 3 の Ajax いろいろ

今さら感はありますが、Rails3 の Ajax 実装の方法を紹介します。
Rails3.1 から jQuery がデフォルトになり、AjaxもRails2の頃とは違うスタイルなりました。また、幾つかのパターンが選べるようになりました。

ここでは上の画像のように、 rails g scaffold todo due:date task:string で作ったアプリのshow がindex画面に表示される簡単な Ajax アプリで説明します。

1. Rails2 に近いやり方

Rails2 では、view にjavascriptを書かずに ajax アプリを書けるようになっていましたが、それに近い方法は、

  • index.html.erb の showへのリンクに :remote => trueを指定し、Ajax用の表示エリア div.show_area を置きます。
<% @todos.each do |todo| %>
   ....
    <td><%= link_to 'Show', todo, :remote => true %></td>
  ...
<% end %>
 ...
<div id="show_area"></div>
  • todos_controller.rb の show メソッドの表示に javascriptリクエストに対応する format.js を追加
  def show
    @todo = Todo.find(params[:id])
    respond_to do |format|
      format.html # show.html.erb
      format.js # show.js.erb
      format.json { render json: @todo }
    end
  end
$('#show_area').html("<%= raw(j(render :partial => 'show_body')) %>")

2. jquery_ujs のcallbackを使う方法

jquery_ujsではサーバー側とブラウザー側が明確に分かれていて、jQueryが分かる人には最適かと思います。

  • index.html.erb の showへのリンクには、もう少しおまじないが追加されます。これは、サーバーに javascriptではなく、htmlを戻してくれという指示です。
  ...
  <td><%= link_to 'Show', todo, :remote => true, "data-type" => "html", :class => 'show' %></td>
  ...
  • todos_controller.rb の show メソッドは、Javascriptからのリクエスト時にはlayoutを使わないようにするだけです。
  def show
    @todo = Todo.find(params[:id])
    respond_to do |format|
      format.html { render layout: (request.headers["X-Requested-With"] != 'XMLHttpRequest') }
      format.json { render json: @todo }
    end
  end
  • 最後にサーバーから送られて来たhtmlをdivに入れるJavascriptをindex.html.erb に追加します。jquery_ujsではサーバーからデータを受け取った時に ajax:success イベントが発生しますので、それを受け取るリスナーを書いてあげます。注意点としては リスナーの引数 status に サーバーからのhtmlが入る点です。 data ではありません!
<div id="show_area"></div>
<%= javascript_tag do %>
$('a.show').on('ajax:success', function (data, status, xhr) {
  $('#show_area').html(status);
})
<% end %>

3. jQuery のみ

jQueryはとても強力で、かつ簡潔に記述できるJavascriptライブラリーです。:remote => true を使わなくても jQuery だけでも Ajaxアプリは書けます。

  • index.html.erb の Showリンクをクリックした時に、jQueryの .getメソッドでサーバーにリクエストを送り、受け取った結果を div に書き込めば良いのです。
  • 以下のような簡単なコードです。 ちなみに、サーバー側は、2. と同じです。
<% @todos.each do |todo| %>
  ....
  <td><%= link_to 'Show', "#", "data-id" => todo.id, :class => 'show' %></td>
  ....
<%= javascript_tag do %>
$('a.show').click(function() {
  $.get("<%= todo_path(9999) %>".replace('9999', $(this).data('id')), 
    function(data) { $('#show_area').html(data) } )
})
<% end %>

使い分け

2. のスタイルが Rails3の標準でしょうか?
1.のスタイルは単純なAjaxには良いかもしれませんが複雑な Javascriptアプリは書けませんし、デバックも大変なので Rails2のアプリをアップグレードした場合以外にはあまり使われないかと思います。
また、表示にJavascript を多用したサイトであれば、jquery_ujs にこだわらない 3. のスタイルも良いかもしれません。












.

最近作った Jekyll (Liquid) のプラグイン

最近作った、Jekyll (Liquidテンプレート) のプラグインの解説を書きます。Jekyllの良いところは、Rubyプログラマーなら簡単に独自タグ等のプラグインが書けるところです。ただし、情報が少ないので参考になれば嬉しいです。


1. h1タグに付けた番号を引き継げる h2タグ

テキストを書いていると 1. Ruby入門 ... 1.1 リテラル ... 1.2 式 ... 1.3 制御構造 ... のように連番のサブタイトルを書きますが、途中に章が追加さると番号を振り直さないといけません。そこで、サブタイトル(h2)の連番を タイトル(h1) から引き継いだ連番を自動生成すれば良いわけです。

このタグはこのように使います、これで <h2>1.1 リテラル</h2> ... <h2>1.2 式</h2> ... <h2>1.3 制御構造</h2> ... が生成されます

{% h1 1 Ruby入門 %}
 ...  
{% h2 リテラル %}
 ... 
{% h2 式 %}
 ...  
{% h2 制御構造 %}
...

コードは以下のようになります。

module Jekyll
  class SequencedH1Tag < Liquid::Tag
    def initialize(tag_name, text, tokens)   
      @h1_text = text      
      super      
    end
  
    def render(context)
      context['h1_seq'] = @h1_text.to_i
      context['h2_seq'] = 0

      "<h1>#{@h1_text}</h1>"
    end 
  end

  class SequencedH2Tag < Liquid::Tag
    def initialize(tag_name, text, tokens)   
      @h2_text = text      
      super      
    end
  
    def render(context)
      context['h2_seq'] = context['h2_seq'] + 1

      "<h2>#{context['h1_seq']}.#{context['h2_seq']} #{@h2_text}</h2>"
    end 
  end
end

Liquid::Template.register_tag('h1', Jekyll::SequencedH1Tag)
Liquid::Template.register_tag('h2', Jekyll::SequencedH2Tag)
  • タグの解釈は initialize メソッドに、展開された文字列作成は render メソッドに書きます
  • initialize から render へ値を渡すには インスタンス変数を使います
  • initialize、render は テキストにタグ(ここでは h1, h2) が書かれている度に呼び出されます
  • ページ生成中に覚えておきたい値は context に格納します

2. テーブルの幅(%)指定タグ

これは

{% table_width table1 30,8,8 %}
table(table1).
|_. Railsのバージョン |_. Ruby1.8.X |_. Ruby1.9.X |
| 2.3.X |=. ○ |=. x |
| 3.0.X |=. ○ |=. ○  |
| 3.1.X |=. ○ |=. ○  |
| 3.2.X (現在) |=. ○ |=. ○ |
| 4.0.X (次期) |=. x |=. ○ |

のように書くと下のような幅が指定されたテーブルが生成されます。

... ... は Textile のテーブルで table(table1). でテーブルに table1というクラス名を付けています。 我ながら便利だと思います ^^)/
<style type="text/css">
.table1 {width: 46%;}
.table1 td:nth-child(1) {width: 30%;}
.table1 td:nth-child(2) {width: 8%;}
.table1 td:nth-child(3) {width: 8%;}
</style>
<table class="table1">
	<tr>
		<th>Railsのバージョン </th>
		<th>Ruby1.8.X </th>
		<th>Ruby1.9.X </th>
	</tr>
	<tr>
		<td> 2.3.X </td>
		<td style="text-align:center;"></td>
		<td style="text-align:center;">x </td>
	</tr>
 	<tr>
		<td> 3.0.X </td>
		<td style="text-align:center;"></td>
		<td style="text-align:center;"></td>
	</tr>
    ・・・・
</table>

コードは以下で <style ...> 〜 </style>を生成しています。

module Jekyll
  class TableWith < Liquid::Tag
    Syntax = /(.*)\s+([\d,]+)\s*/o

    def initialize(tag_name, markup, tokens)
      if markup =~ Syntax
        @table_class = $1
        @width_array = $2.split(/,/).map{|e| e.to_i}
      else
        raise SyntaxError.new("Syntax Error in 'table_width' - Valid syntax: table_width [class of table] [width, width...]")
      end
    end

    def render(context)
      s = %|<style type="text/css">\n|
      s += "  .#{@table_class} {width: #{@width_array.inject(0){|x,s| s += x}}%;}\n"
      @width_array.each_with_index {|w, ix| s += "  .#{@table_class} td:nth-child(#{ix + 1}) {width: #{w}%;}\n"}
      s += "</style>\n"
      s
    end 
  end
end

Liquid::Template.register_tag('table_width', Jekyll::TableWith)
  • initializeメソッドの引数の解釈やエラーメッセージの表示は Liquid テンプレート コード https://github.com/Shopify/liquid の定型です
  • TextileとLiquid の適応の順番ですがですが、Textile が先に適応されます

3 「この章の目標」タグ

これは

{% goalbox %}
* TDDを知る
* RSpecについて理解する
* 受け入れテストを知る
{% endgoalbox %}

が 下のような tableになります

<table class="goalbox">
<tr><th>この章の目標</th></tr>
<tr>
   <td>
    <ul>
	<li>TDDを知る</li>
	<li>RSpecについて理解する</li>
	<li>受け入れテストを知る</li>
    </ul>
  </td>
</tr>
</table>

コードは

# -*- encoding : utf-8 -*-
module Jekyll
  class GoalBox < Liquid::Block
    def render(context)
      output = super
      %|<table class="goalbox">
          <tr><th>この章の目標</th></tr>
          <tr>
            <td>
              #{output}
            </td>
          </tr>
        </table>|
    end
  end
end

Liquid::Template.register_tag('goalbox', Jekyll::GoalBox)
  • Liquid::Blockを使うとコンテンツを持つタグが作れます。閉じタグは end〜 になります。
  • コンテンツの文字列は親クラスからもらいます

まとめ

このように、Jekyll なら同じパターンが良く出てくるドキュメントを書くのに、プラグインを書けば楽ができます。 Jekyll は怠慢なプログラマーに超お勧めなブログ、ドキュメントツールです。

Redmineをバージョン 2.0 に上げてみた

Redmine 2.0.0 がリリースされてから時間が経ってしまいましたが、今まで使っていた 1.0.2 を 最新の 2.0.3 にアップデートしてみました。


インストール

アップデートの手順は、Redmine 2.0.3 をインストールし、1.0.2 から DB と添付ファイルをコピーすることにしました。

Redmine 2.0.3 のインストール
% wget http://rubyforge.org/frs/download.php/76259/redmine-2.0.3.tar.gz
% tar xzf redmine-2.0.3.tar.gz
% ln -s redmine-2.0.3 redmin
% cd redmin
rvm を設定

Redmine 2.0 は Ruby 1.9.3 が使えます!! Rails も 3.2.6 です。

rvm 1.9.3@rails3.2
Gemインストール(bundle)

Gem のインストールは bundle で簡単。ただしデフォルトの Gemfile には MySQL,PostgreSQLなども書かれていますので不要なものは コメントアウトします。

LDAPOpenIDも使わないのですが、インストールしないとサーバーが起動しませんでした・・・・

今回の Gemfile

source 'http://rubygems.org'

gem 'rails', '3.2.6'
gem 'prototype-rails', '3.2.1'
gem "i18n", "~> 0.6.0"
gem "coderay", "~> 1.0.6"
gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby]
gem "builder"

# Optional gem for LDAP authentication
group :ldap do
  gem "net-ldap", "~> 0.3.1"
end

# Optional gem for OpenID authentication
group :openid do
  gem "ruby-openid", "~> 2.1.4", :require => "openid"
  gem "rack-openid"
end

# Optional gem for exporting the gantt to a PNG file, not supported with jruby
#platforms :mri, :mingw do
#  group :rmagick do
#    # RMagick 2 supports ruby 1.9
#    # RMagick 1 would be fine for ruby 1.8 but Bundler does not support
#    # different requirements for the same gem on different platforms
#    gem "rmagick", ">= 2.0.0"
#  end
#end

# Database gems
platforms :mri, :mingw do
#  group :postgresql do
#    gem "pg", ">= 0.11.0"
#  end

  group :sqlite do
    gem "sqlite3"
  end
end

platforms :mri_18, :mingw_18 do
#  group :mysql do
#    gem "mysql"
#  end
end
platforms :mri_19, :mingw_19 do
#  group :mysql do
#    gem "mysql2", "~> 0.3.11"
#  end
end

#platforms :jruby do
#  gem "jruby-openssl"

#  group :mysql do
#    gem "activerecord-jdbcmysql-adapter"
#  end

#  group :postgresql do
#    gem "activerecord-jdbcpostgresql-adapter"
#  end

#  group :sqlite do
#    gem "activerecord-jdbcsqlite3-adapter"
#  end
#end

group :development do
  gem "rdoc", ">= 2.4.2"
  gem "yard"
end

group :test do
  gem "shoulda", "~> 2.11"
  gem "mocha"
end

local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
if File.exists?(local_gemfile)
  puts "Loading Gemfile.local ..." if $DEBUG # `ruby -d` or `bundle -v`
  instance_eval File.read(local_gemfile)
end

# Load plugins' Gemfiles
Dir.glob File.expand_path("../plugins/*/Gemfile", __FILE__) do |file|
  puts "Loading #{file} ..." if $DEBUG # `ruby -d` or `bundle -v`
  instance_eval File.read(file)
end
% bundle install
DB、添付ファイルの移行

Redmine 1.0.2 から DB、添付ファイル をコピー

cp ../redmine-1.0.2/config/database.yml config/
cp ../redmine-1.0.2/db/redmine.db db
cp ../redmine-1.0.2/files/* files/

config/database.yml の形式が変わっていました

vi config/database.yml
production:
  adapter: sqlite3
  database: db/redmine.db
  timeout: 5000
migration, 設定
% RAILS_ENV=production rake db:migrate
% rake tmp:create 
% rake generate_secret_token
確認

Rails内蔵サーバーで動作を確認

rails s -e production
Unicorn の設定

設定ファイルをコピーし、rvm wrapper を作成

cp ../redmine-1.0.2/config/unicorn.conf config
rvm wrapper 1.9.3@rails3.2 redmine unicorn_rails

前回作った /etc/init.d/redmine_unicorn start redmine が起動できました。

Redmine 2.0 にすると何が嬉しいか?

@yusuke_kokubo さんの指摘 で、不勉強に気づき、不適切な部分を変更しました。 指摘ありがとうございます!

現在の Redmine 2.0は機能的には機能的には Redmine 1.4 と同じで、 Redmine 1.0.2 と比べると機能は増えています。 現在のところ Redmine 1.4 でも最新の機能は使えます 。 ちなみに Redmine 1.4 は Rails2.3 ベースです。

Redmine 2.0 は Rails3.2 ベースになったので、 メモリー使用量が増えます、またサーバー起動時間がかかります(私の環境ではメモリー使用量に関しては Redmine 1.0.2 が 173Mbyte なのに Redmine 2.0.3 は 202Mbyte に上がりました)。

現時点ででの Redmine 2.0 のメリットは、正式にサポートされている Rails3.2 ベースの安心感でしょうか? サーバーの環境等で2.0にアップデート出来ない場合も 1.4 にはしておいた方が良いですね。

テーマ を変えてみた

Redmine 2.0 に変えても変化が無くてつまらないので、テーマ(見かけ)を変えてみました。一番上にある画像は、一見 Redmine にみえないでしょ!

実はテーマが変えられる事を、今まで知らなかったのですが今回、いろいろと調べていて知りました。 Redmineのサイトに テーマの一覧 があります。たくさんあるのですが、どんな画面になるのかはリンク先に行かないと判らないので、先頭にあった A1 を入れてみました。インストール方法は ここ に書かれています。

% cd /tmp
% wget http://redminecrm.com/projects/a1theme/products/1279
% mv 1279 a1-1_0_3.tgz
% tar xvzf a1-1_0_3.tgz
% cd  XXXXXX/redmine-2.0.3
% mv /tmp/a1 public/themes/

Redmine の 管理→設定→表示(タブ)のテーマでA1を選択し保存ボタンを押す。
これでテーマが変更できます、気分も Redmine2.0 になりました。


今日の結論: 見かけ重要