windows の 64bit で ruby は茨の道?

windows の 64bit で ruby は茨の道?


windows 7 64bi と truby 2.0 と Rails 4.0 の組み合わせて
ruby tutorial (http://ruby.railstutorial.org/ruby-on-rails-tutorial-book)
をやろうとしてるんだけど、
まぁ、なんというか、どうにもこうにも、うまくいかないことが多い


・nokogiri が入らない

 これは、Windows 環境だからか。
 
 ここの内容が参考になった
 http://www.kaoriya.net/blog/2013/03/29/


 んが、自分の環境では libxslt がコンパイルできない。

 

 いろいろ調べた結果

 http://www.zlatkovic.com/libxml.en.html

 から、コンパイル済みのモジュールを落としてきて、gem をたたいて何とかなった。

 落とすモジュールは、自分の場合は3つだった
  iconv
  libxml
  libxslt

 んで、適当なフォルダに解凍して、gem コマンド。
 自分の場合は
  --with-xml2-dir
  --with-xslt-dir
  -with-iconv-dir
 オプションで、解凍したフォルダを指定した。

 gem install nokogiri --platform=ruby -- --with-xml2-dir=C:/tool/Develop/ruby/lib/libxml --with-xslt-dir=C:/tool/Develop/ruby/lib/libxslt --with-iconv-dir=C:/tool/Develop/ruby/lib/iconv

 こんな感じ


postgreSQL のドライバが入らない?

 Gemfiile に

 gem 'pg'

 と書いて、

 bundle install
 bundle update

 とかやるのに、rails の DB 関連のコマンドをたたくと「pg がないよ」と怒られる(>_<


 Gemfile.lock を見ると

 pg (0.16.0-x86-mingw32)

 とあり、32bit 版が入ってるような雰囲気


 https://bitbucket.org/ged/ruby-pg/issue/169
 をみると、bundler のバグだ、とあいてあるような、、

 Gemfile.lock ファイルに
  PLATFORMS
   ruby
   x64-mingw32
   x86-mingw32
 こう書いて、Genfile に

 gem "pg", "~> 0.16.0"

 とかく。
 参考:http://rubygems.org/gems/pg/versions/0.16.0-x64-mingw32

 すると、うごいた。


 途中、メモってないコマンドも何かたたいたので、これだけでは動かないかもしれない、、、


・Guard が動かない

 tutorial の 3.6.2 に書いてあった

 bundle exec guard init rspec

 とやると、「pry がないよ」と怒られる。

 これも、Gemfile.lock をみると

 pry (0.9.12.2-x86-mingw32)

 と書かれていて、どうも、32bit 版が入っているみたい、、、




 もう、この辺で力尽きた、、、

 Ruby 32bit 版でやったほうが、まだ先に進む気がしてきた、




 とりあえず ruby の 64bit 版で環境周り作るのはもうやめ。
 

rails で foreign key はどやる

ちょっとギブアップぎみ

メモとして残す


ためになったのは以下のサイト

http://www.katawara.com/2008/use_foreign_key/
http://blog.eiel.info/blog/2013/04/08/foreign-key-constrait-on-rails/
http://d.hatena.ne.jp/iriya_0624/20130427/1367082310

とりあえず、foreign key が作れることはわかった。
plugin 使うと、いろいろ自動化してくれるらしいこともわかった。



http://aligach.net/diary/20110224.html

に書いてあった
リレーションシップ≠foreign key
という考えにのっとると、
Rails としては、テーブル間の関連は、model に書いてあげるのがやっぱり正解なんだろうなぁ。



http://codenote.net/ruby/rails/1094.html

によると

rails g model tester title:string user:references

のように「references」を使うことで、関連をていぎできるみたい。

これはこれで便利そう。

DB の スキーマー定義から schema.rb を作る

前の記事は、いまいち君。

http://stackoverflow.com/questions/1428499/ruby-rails-reverse-migration-ddl-to-ruby-code

にあるように、DDL で DB にテーブル作ってから、


rake db:schema:dump

とやる方が簡単な感じ。


http://www20.atwiki.jp/katow30it/pages/12.html

↑ここにも、既存の DB から始める方法が書いてありますね

突然の Rails

突然の Rails

Rails のお仕事があったので、頑張る。

以下適当。いますんごい眠いんで超適当。メモ代わりに残す。




最初、DB 構造を考えて、ER 図書いて DDL でばーっとテーブル作ったんだけど、
Rails って DDL からテーブル作るんじゃなくて

> rails generate model Hoge code:ineteger name:string

みたいに、generate でテーブルを作って行く開発スタイルなんでしょうか?



もう、ER 図も作って、foreign key も貼って、DDL 作ったんだけどなぁ、、、
頑張って Rails の規則に沿ったテーブル名や項目名にしたのになぁ、、、
rails g model 、、、 ってテーブル分やらんといけないのかなぁ、、、、



ddl で DB にテーブル作っちゃったので、DB の情報から自動で Rails の model って作成できないのだろうか?

google 先生に聞いてみたところ、以下の情報にヒット


http://kagen88.blogspot.jp/2012/12/rails.html


Rails のクラス使って、DB 情報引っこ抜いて、rails g model hogehoge コマンドをつくればいいよ」って感じかしら。


ならば、と早速試すも、
「si_cols = ActiveRecord::Base.connection.columns(si_table_name,"#{name} Columns")」
でエラーになる。

windowsRuby 2.0 と Rails 4.0 ではだめなのか― (>_<


というわけで、載ってた Ruby スクリプトを変更。

Ruby 初めてだから超適当。すごい適当。
とりあえず DB からテーブル全部引っこ抜けぇ

def model_name(s)
  if s[-4..-1] == "ries" 
    s[0..-4] + "y" 
  elsif s[-1] == "s" 
    s[0..-2]
  else
    s
  end
end

def out_generate
  si_tables = ActiveRecord::Base.connection.tables()
  si_tables.each do |t|

    si_tname = model_name(t)
    si_cols = ActiveRecord::Base.connection.columns(t)
    si_field_names = Array.new;
    si_cols.each do |c|
      si_field_names << "#{c.name}:#{c.type}" if c.name != "id" && c.name != "created_at" && c.name != "updated_at" 
    end
    si_colparas = si_field_names.join(' ')

    puts "rails g scaffold #{si_tname} #{si_colparas}" 
  end
  return "";
end


コマンドプロンプトから

> cd [Rails プロジェクトのディレクトリ]
> rails console

rails のコンソールにして、上のコードを貼りつけ。


その後、out_generate() ってやれば

rails g scaffold user login_id:string name:string password:string

みたいな文字列がコンソールに表示されるから、コンソールの内容コピーして、
Rails コンソール抜けて、
貼りつけるといけるんじゃないだろうか。







でも、ER 図作る時に、一生懸命 Unique Kye とか Default とか付けたのに
model に反映されない。
foreign key も一生懸命付けたのに、model に反映されない。


さみしいなぁ。


生成された model にいちいち手で制約とか書いていかないといけないのか、、、、

うーん。いまいち。

Google翻訳API の制限文字数

追記:2011/03/02

 まちがい。5000文字が正解の模様。
 ドキュメントに書いてあった

http://code.google.com/intl/ja/apis/language/translate/v2/using_rest.html

 The q parameter in the POST body must be less than 5K characters.
      • -

Google翻訳APIの最大文字数は5120文字。


たぶん。

redmine_importer で 親チケット情報も登録する

redmine_importeでCSVデータの一括登録出来たよ(^^



とおもってたら、どうも親チケットの登録が出来ないみたい、、、

親チケットは最近の機能だから仕方がないのかな。



でも、どうしても親チケットの登録がしたかったので、pluginの修正を行ってみました

rubyrailsも分かんないけど、何とかなったよ。



編集ファイルは
/var/lib/redmine/vendor/plugins/redmine_importer/app/controllers/importer_controller.rb


1.ファイルの先頭あたりにあるISSUE_ATTRSの内容を修正

  ISSUE_ATTRS = [:id, :subject, :parent_issue, :assigned_to, :fixed_version,
    :author, :description, :category, :priority, :tracker, :status,
    :start_date, :due_date, :done_ratio, :estimated_hours]

 配列(?)の中に :parent_issue を追加する
 これで、インポート時の選択肢に「親チケット」が出るようになる



2.222行目あたりの「# optional attributes」コメントの下に以下の行を追加

      issue.parent_issue_id = row[attrs_map["parent_issue"]] || issue.parent_issue_id


これで新規登録のチケットは、親チケットの情報が登録されるようになりました。





が、既存チケットの更新の際はエラーになります。



まぁ、更新は今のところ使わないので、とりあえずこれで使ってみます。

RedmineでチケットをCSVで一括登録する

すんごいハマったので、メモ。


Redmineでチケットを一括登録したい。


やはりCSVから一括登録出来たらいいよね、とgoogle先生に聞きまくって、
最終的にたどり着いたのが↓のサイト


http://daily-postit.blogspot.com/2010/11/redmine-importer.html



どうも、RedmineCSVインポートのpluginはいろんな人が派生させて作っていて、
Redmineのバージョンによって使えたり、り使えなかったり、日本語がだめだったり、
とまぁ3日間ハマりっぱなしでした。


最終的には、上記サイトに書いてあるpluginを使うことでうまくいきました。


ちなみに自分の使っているRedmineのバージョンは
Redmine 1.1.1.stable」
というやつでした。



インストールはそのままとはいかなくて、


0.依存モジュールを設定
 Redmine CSV Import Pluginを試す | 「世界」旅と子育てとガジェットを愛するエンジニアリングマネージャーのブログ
にある通り、

依存するのがfastercsvなので必要であれば「gem install fastercsv」しておく。

 fastercsvをインストールしておく


1.gitHUBから、pluginをダウンロードする
  上記サイト内の「そちらに変更分を登録してみました」にリンクがあります
  自分の場合は

# wget --no-check-certificate https://github.com/akiko-pusu/redmine_importer/tarball/master

  こんな感じでダウンロード

2.とりあえず解凍して、ディレクトリ名を変えてRedmineに配置

# tar -zxvf akiko-pusu-redmine_importer-7dd533d.tar.gz
# mv akiko-pusu-redmine_importer-7dd533d redmine_importer
# mv redmine_importer /var/lib/redmine/vendor/plugin

  ディレクトリ名をredmine_importerにしないと、plugin実行時に↓のように怒られました(^^;

log/production.logの中身

ActionView::TemplateError (No plugin called 'redmine_importer' - please use the full name of a loaded plugin.) on line #2 of vendor/plugins/akiko-pusu-redmine_importer/app/views/importer/match.html.erb:
1: <% content_for :header_tags do %>
2:     <%= stylesheet_link_tag 'importer', :plugin => 'redmine_importer' %>
3: <% end %>
4:
5: <h2><%= l(:label_match_columns) %></h2>

    vendor/plugins/akiko-pusu-redmine_importer/app/views/importer/match.html.erb:2
    app/helpers/application_helper.rb:856:in `content_for'
    vendor/plugins/akiko-pusu-redmine_importer/app/views/importer/match.html.erb:1
    passenger (3.0.2) lib/phusion_passenger/rack/request_handler.rb:96:in `process_request'
 ・
 ・
 ・


3.言語ファイルを修正

 なぜか英語の言語ファイルの形式が変になっていたので修正

# cd /var/lib/redmine
# cd vendor/plugins/redmine_importer/
# cd config/locales/
# vi en.yml

 最後の2行の先頭に、スペースを2つ入れる
 これをしないと、サーバ再起動後、Redmineのサイトを見ると

Ruby on Rails application could not be started
These are the possible causes:
There may be a syntax error in the application's code. Please check for such errors and fix them.
A required library may not installed. Please install all libraries that this application requires.
The application may not be properly configured. Please check whether all configuration files are written correctly, fix any incorrect configurations, and restart this application.
A service that the application relies on (such as the database server or the Ferret search engine server) may not have been started. Please start that service.
Further information about the error may have been written to the application's log file. Please check it in order to analyse the problem.
Error message:
undefined method `deep_symbolize_keys' for "Save match rules and submit":String
Exception class:
NoMethodError
Application root:
/var/lib/redmine

 という、むらさきっぽいエラー画面が表示されてしまう。


4.サーバ再起動

 これでインストール終わり。
 自分はApacheで使っているので、Apacheを再起動

# service httpd restart


5.実際にインポート

 Redmineのページからプロジェクトの設定画面へ行き、
 モジュールタブから「Importer」にチェックし保存する。


 するとプロジェクトの目―ニューに「インポート」が出てくるはず。


 実際のインポートは、いろんなサイトに書いてある通り、チケットのCSV出力した
そのままの形式でインポート可能でした

 直すところは
  ・ユーザ名を設定するところは、名前でなくてユーザIDを使う
  ・日付は yyyy-mm-dd
ぐらいでした。
 他のサイトでは「CSVのカラムを必ず""で括らないといけない」とか
書いてありましたけど、特にそんなことなかったです。



 ほんと3日間かけて何にも成果出せてなかったので、うまくいってホント良かった(;_;