田舎の技術者が奮闘中

php ruby node.js javascript などのスクリプト言語とサーバー(Chef、Vagrant)に関して書きます。

都道府県コードや市区町村コードをDBにマスタデータとして作成

全国版のポータルサイトなどを作成する際に、会社情報などを登録するフォームを作成すると思いますが、住所の登録などをどのように構築するかいつも悩んでしまいます。
登録だけでなく検索でも都道府県などの住所を流用した検索画面にしたい場合は、おそらくですが都道府県と市区町村をDBに保持し、コードなどで検索をすると思います。
今回はその都道府県コードや市区町村コードを利用し、railsへの組み込み方法を考えていきます。
railsのseedを使用するので、都道府県と市区町村のCSVファイルを2個準備します。

まずデータをDL

兎にも角にもデータが無いと、どうしようもないのでgoogle先生に訪ねてみました。
「先生!市区町村コードをDL出来る優良サイトは無いっすか?」

はい、有りました。

http://www.dictator.co.jp/i/i_jis/i_jis_00_handle.html

武蔵野ウイング有限会社様が無料で提供していました。
本当に感謝です。

早速CSVをDLしてきます。
CSVをそのまま使用してもいいのですが、ちょっとだけ加工します。

コード,CD付き,市区町村名,よみがな,市外局番,主要郵便番号上5桁
01100,011002,札幌市,さっぽろし,,
01101,011011,札幌市中央区,さっぽろしちゅうおうく,011,060-00 064-08 064-09

これを・・・

1,札幌市,さっぽろし
1,札幌市中央区,さっぽろしちゅうおうく

このように変更します。
rubyでスクリプト組んでもいいですが、あまり修正を入れない情報なので、サクラエディタなどを活用しデータを加工しました。
短径選択するだけです。1分で終わります。(プログラム組むより早いですね)


都道府県コードに関しては、47都道府県しか無いので自作します。
(探せばあると思いますが、面倒くさいので作ったほうが早いです。)

北海道
青森県
岩手県
宮城県
秋田県
山形県
福島県
茨城県
栃木県
群馬県
埼玉県
千葉県
東京都
神奈川県
新潟県
富山県
石川県
福井県
山梨県
長野県
岐阜県
静岡県
愛知県
三重県
滋賀県
京都府
大阪府
兵庫県
奈良県
和歌山県
鳥取県
島根県
岡山県
広島県
山口県
徳島県
香川県
愛媛県
高知県
福岡県
佐賀県
長崎県
熊本県
大分県
宮崎県
鹿児島県
沖縄県

これで2個のCSVができたと思います。
とりあえず都道府県のCSVをmst_japans.csv、市区町村のCSVをmst_cities.csvと名称を付けます。
(文字コードはUTF-8に)

そしてファイルを「db」の直下に配置します。

DBの構成

リレーションさせますので、簡単なDB構成をメモ

# 都道府県テーブル
rails g model mst_japan id:integer name:string

# 市区町村テーブル
rails g model mst_city id:integer japan_id:integer name:string kana:string

seed.rbに追記

seed.rbにプログラムを追加します。

require "csv"
# mst_japans
CSV.foreach('db/mst_japans.csv') do |row|
  MstJapan.create(:id => row[0], :name => row[1])
end

# mst_cityes
CSV.foreach('db/mst_cities.csv') do |row|
  MstCity.create(:id => row[0], :japan_id => row[1], :name => row[2], :kana => row[3])
end

コマンド

rake db:seed

これでデータが入ると思います。

railsにtwitter bootstrapを導入する。

デザインセンスがないので、「twitter bootstrap」を導入してみます。
んで、githubで色々と探していたら、結構出てきました。
その中で今回は「twitter-bootstrap-rails」を使用したいと思います。

まずGemfileの修正

gem "twitter-bootstrap-rails"

んで「bundle install」を行います。

bundle install

bootstrapを組み込む

railsでtwitter bootstrapが使用出来るようにします。

rails g bootstrap:install

layoutにtwitter bootstrapを適用させたい場合は

rails g bootstrap:layout [LAYOUT_NAME] [*fixed or fluid]
#以下サンプル
rails g bootstrap:layout application fixed
#よくわからないのですがfixedを指定してもfluidを指定してもレイアウトに変化が見られませんでした・・・

上記だけで、テンプレートが使用できます。
ちなみにCSSテンプレートは「sass」ではなく「less」みたいです。
「less」は後発らしく、CSSへの変換はJavascriptで出来きます。
うむぅ面白い・・・

erbをhamlに変換する。

詳細はここから確認してください。

gemファイルに追加

group :development do
  gem 'erb2haml'
end

実行

$ bundle install

んで変換

rake haml:convert_erbs

元ファイルは残るみたいですね。
必要に応じて削除しましょう。

メモ:プロジェクト内の「.erb」を全て削除する。

 find ./ -name *.erb -exec rm {} \;

bundler入門

今まで何気にbundlerを使っていたが、あまり詳しく知らなかったので、勉強+ブログ更新がてら再度勉強することにしました。
といっても本サイトをコピペするだけですけど。。。

まずはじめに

bundlerをインストールします

gem install bundler

プロジェクトルートに「Gemfile」を作成して設置します。

Gemfileの編集

作成した「Gemfile」にURLを指定します

以下の3つのどれでもいいみたいです。gemのDL先の指定ですね。

source "http://rubygems.org"
source "http://gems.rubyforge.org"
source "http://gemcutter.org"

インストールしたいパッケージを追加する

とりあえず「rails」を入れときます

gem "rails", "3.2.1"

編集完了したらインストールする

$ bundle install

その他の設定

バージョン番号など、必要なgemsを宣言します。構文を使い使用するバージョンを指定する

ちょっと「~」(チルダ)の使い方が特殊なぐらいで、簡単に指定できます。

#何も指定なしだったら、最新をインストール
gem "nokogiri"
# 指定したバージョンがインストールされる
gem "rails", "3.0.0.beta3"
# バージョン1.0以上をインストール
gem "rack",  ">=1.0"
# 例を一応出します。
# "~>2.0.3"は">=2.0.3" と "<2.1" の間にマッチする。
# "~>2.1"は">=2.1" と "<3.0" の間にマッチする。
# "~>2.2.beta" は "2.2.beta.12" のようにマッチする。
gem "thin",  "~>1.1"

gemのメインファイルが、gem名と異なる場合は、それを要求する方法を指定する

gem "rspec", :require => "spec"
gem "sqlite3-ruby", "1.2.5", :require => "sqlite3"

Gitを指定することも可能

gem "nokogiri", :git => "git://github.com/tenderlove/nokogiri.git", :branch => "1.4"

group化する

gemをグループ分けし環境でgemの使い分けができます。

gem "wirble", :group => :development

group :test do
  gem "rspec"
  gem "faker"
end

グループを除外してインストールすることができます。
これによって、本稼働時のインストールとテスト時のインストールを使い分けることができます。

$ bundle install --without test development


ちなみにGemfileはデフォルトで「group: assets」となっている。(rails3.2)
最初勘違いしたのだが「assets」は本番環境で読み込むんだったら、「production」じゃないか?と思ったら
じつは「application.rb」で

Bundler.require(*Rails.groups(:assets => %w(development test)))

ってなっていました、これで「development test」では「assets」は読み込まないってなってたんですね・・・
しらなかったorz

まとめ

まだ理解していないところが多いですが、今回はここまで!
時間があるときに、また追記します。

「rails generate devise:install」をした際に初期設定を言われたのでメモっとく

本当にメモです。

以下、和訳

Some setup you must do manually if you haven't yet:
※いくつかのセットアップを手動で行う必要があります。

1. Ensure you have defined default url options in your environments files. Here
is an example of default_url_options appropriate for a development environment
※あなたの環境ファイルにデフォルトのurlオプションが定義されていることを確認してください。
※以下のdefault_url_optionsの設定例はdevelopmentで適しています。
in config/environments/development.rb:

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

In production, :host should be set to the actual host of your application.
※製品環境では「:host」を実際のホストに設定する必要があります。

2. Ensure you have defined root_url to *something* in your config/routes.rb.
※config/routes.rb内で*something*にroot_url定義されていることを確認します。
For example:

root :to => "home#index"

3. Ensure you have flash messages in app/views/layouts/application.html.erb.
※app/views/layouts/application.html.erbにflashメッセージを持っていることを確認してください。
For example:

<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

4. If you are deploying Rails 3.1 on Heroku, you may want to set:
※Heroku上にRails 3.1を公開している場合は、設定した方がいいですよ。

config.assets.initialize_on_precompile = false


和訳間違ってたらご指摘ください。(ホントgoogle翻訳さまさまやで)

ruby on railsをubuntu11.10にインストール

前回の続きになります。

今回はフルスタックのフレームワークで有名な「ruby on rails」をubuntuにインストールします。

フレームワークは学習コストが高いですが、それに対する見返りのほうが大きいので是非勉強することをお勧めします。

フレームワーク導入の利点!

  1. 開発生産性の向上
    • 設計方針や基盤部分のコードをフレームワークに委ねますので、考える必要がなくなります。
  2. メンテナンス性に優れる
    • コードに一貫性が出るので可読性があがります。
  3. 品質が担保できる

railsの記事を読むと必ず出てくる決まり文句?があります。

DRY(Don't Repeat Yourself) = 同じ記述を繰り返さない
CoC(Convention over Configuration) = 設定よりも規約

上記の設計哲学を引き継いで開発されたフレームワークは「cakephp」などが存在します。
railsrubyだけではなく他言語まで影響を与えるフレームワークと言えます。

まぁrailsの説明はここまでにして、早速インストール手順から入ります。

前回のruby導入からの続きです。

Bundlerのインストール

bundlerとは外部のGemを管理するためのツールでGemfile上で記述されているgemの依存関係を解決し、その上で必要なパッケージをインストールしてくれます。
ですので、パッケージをインストールする際は「Gemfile」の修正のあと「bundle install」を行うようにします。

$ gem install bundler

ディレクトリの作成

Railsをインストールするディレクトリを作成します。

$ mkdir -p ~/sample
$ cd ~/sample/

railsのインストール

$ rails new

Gemfileの編集

おそらくデフォルトのGemfileが作成されるので、編集を行います。
※自分はmysqlを使いたいので以下の内容に変更

gem 'sqlite3'
↓
gem 'mysql2'

パッケージのインストール

$ bundle install

サーバー起動

$ rails s


http://localhost:3000/」でURLを叩くとおそらく確認できるはずです。

まとめ

rails自体のインストールは簡単ですが、どのようなサイトを構築するかによって、Gemfileに書き込む内容を変更しないと行けません。
ですが「bundle」や「migration」などで開発中も環境を柔軟に変更することが可能です。

railsさまさまです。

ruby on rails3 + paperclip + amazon S3 に画像をアップしてみる

はい、rails初心者です。
初回はrailsからAWSのS3に画像をアップしてみます。


ほとんどrails触ったことないんで、実際に完成できるか心配ですが頑張ってみます。
(環境に関しては次回まとめます。ちなみに nginx + passenger + mysqlです。)

railsのインストールなどは行なっている前提で書きます。

まず画像アップ用のプラグインは「paperclip」を利用します。
他にもDragonflyなどもあるらしいですが、情報が少なかったので今回は「paperclip」で!

Gemfileを修正

まず「paperclip」は必要だが、他にも「aws-sdk」が必要なのでGemfileに書き込む。

gem 'paperclip'
gem 'aws-sdk', '~> 1.3.4'

書き込みが完了したら、「bundle install」を行う。

$ bundle install

modelの準備

今回は新たにmodelを作成する。

rails g scaffold item name:string

テーブル準備

rake db:migrate

Modelの修正を行う。

class Item < ActiveRecord::Base
 has_attached_file :photo,
  :styles => {
   :thumb  => "100x100",
   :medium => "200x200",
   :large => "600x400"
  },
   :storage => :s3,
   :s3_credentials => "#{Rails.root}/config/s3.yml",
   :url => "AWS_URL",
   :s3_host_name => "AWS_URL",
   :path => ":attachment/:id/:style.:extension"
end

s3_credentialsで呼び出しているs3.ymlファイルを新規で作成。
※設定はAWSから取得する。

development:
  bucket: myappdevelopment
  access_key_id: your key
  secret_access_key: your key

test:
  bucket: myapptest
  access_key_id: your key
  secret_access_key: your key

production:
  bucket: myapp
  access_key_id: your key
  secret_access_key: your key


画像の情報を保存するためにitemsテーブルを変更するので
マイグレーション用のスクリプトを作成する。
※各カラムのphoto_○○は、has_attached_fileの引数で指定した名称になる。

$ rails g migration add_photo_columns_to_item
class AddPhotoColumnsToItem < ActiveRecord::Migration
  def self.up
    add_column :items, :photo_file_name,    :string
    add_column :items, :photo_content_type, :string
    add_column :items, :photo_file_size,    :integer
    add_column :items, :photo_updated_at,   :datetime
  end

  def self.down
    remove_column :items, :photo_file_name
    remove_column :items, :photo_content_type
    remove_column :items, :photo_file_size
    remove_column :items, :photo_updated_at
  end
end

マイグレーションする。

rake db:migrate

viewの修正

_form.html.erbを編集

#一行目編集
<%= form_for @item , :html => { :multipart => true } do |f| %>
#formタグの中に追加
<%= f.file_field :photo %>

show.html.erbを編集

<%= image_tag @product.photo.url %>
<%= image_tag @product.photo.url(:medium) %>
<%= image_tag @product.photo(:thumb) %>
<%= image_tag @product.photo(:large) %>


とりあえずS3にはアップできたが、表示側が見れないorz
多分modelの設定だと思うが。。。とりあえずDocumentを読んでみる。
※「s3_host_name => "AWS_URL"」を追加すると正常に見れます。
よくわからないですが、勝手に違うリージョンに行ってたみたいです・・・なんでですかね?

https://github.com/thoughtbot/paperclip
http://rubydoc.info/gems/paperclip/Paperclip/Storage/S3