2012年3月13日火曜日

都道府県別に表示する

簡単に都道府県別で分けれたらいいかと思い、プロジェクト内で作成したのでここにメモ

今回重要なのは都道府県をマッチさせなければならない為、登録の際に間違って登録されていたらうまく表示されない。

routes.rb
resources :users

resources :prefectures do
  resources :users
end

usersが存在するという仮定で作成
都道府県表示する為に

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

users_controller.rb
def index
    if params[:prefecture_id]
      @users = User.where(:PREF => NKF.nkf("-eW", params[:prefecture_id])).order("created_at DESC").paginate(:page => params[:page], :per_page => 40)
    else
      @users = User.where("NAME <> ''").order("created_at DESC").paginate(:page => params[:page], :per_page => 70)
    end
  end


ここでもしパラメーターが[prefecture_id]が来たらwhereで(:PREF)のNKF.nkf("-eW",)で変換されたパラメーター[:prefecture_id]を返すという設定。
NKFは前回でのブログでmysqlの文字コードが違う為に今回仕方なく設定している。

index.html.erb
<h3>都道府県別</h3>
  <% choose_region.collect do |p| %>
    <%= link_to p, prefecture_users_path(:prefecture_id => p),
      :class => 'prefectures' %>
  <% end %>

<div class="organization">
      <% @users.each do |user| %>
        <%= link_to(user.name, user) %><br/>
      <% end %>
    </div>

という形。choose_regionで都道府県をcollectで出し、それぞれをリンクにして、無理矢理prefecture_users_pathで指定しいる
今回は都道府県用のdbを作成しないので無理矢理パスを決めている。

以上のようにすれば都道府県がしっかり登録されていれば都道府県をクリックしたら都道府県別に表示された。

文字コードを変換する方法

今回のプロジェクトは既に昔から動いているperlで出来たHPの管理システム。
mysqlの文字コードはlatin1を使用していてテンパったのでここにメモ

database.ymlを書く

development:
  adapter: mysql2
  encoding: latin1
  database: データベース名
  pool: 5
  username: ユーザー名
  password: パスワード

データベースを作る

  • 今回は既存のデータに追加する形で使う
  • データベースのテーブル名は大文字である
  • 必要なデータだけdevelopmentで再現する
$ rails g model user

class CreateUsers < ActiveRecord::Migration
  def change
    if Rails.env.production?
      add_column :USER, :advertisement, :text
      add_column :USER, :created_at, :datetime
      add_column :USER, :updated_at, :datetime
    else
      create_table :USER do |t|
        t.string :NAME
        t.string :PREF
        t.string :ADDRESS
        t.string :EMAIL
        t.string :TEL
        t.text   :advertisement #今回追加する部分
 
        t.timestamps
      end
    end
  end
end

今回は1つデータベースに追加する形なので小文字がRailsプロジェクトで作成したカラムである。他は開発環境で再現する為に作った開発環境のみのDB。
またRAILS_ENVの時は「add_column」で「USER」テーブルに追加する

次にモデルの編集

class User < ActiveRecord::Base
  self.table_name = "USER" #このままだとseedに挿入出来ないのでテーブル名を指定する。

  attr_accessor :ad, :pref, :address, :name # カラム名を変換

  after_find do # 変換する
    self.pref = self.PREF ? NKF.nkf("-Ew", self.PREF) : ""
    self.ad = self.advertisement ? NKF.nkf("-Ew", self.advertisement) : ""
    self.address = self.ADDRESS ? NKF.nkf("-Ew", self.ADDRESS) : ""
    self.name = self.NAME ? NKF.nkf("-Ew", self.NAME) : ""
  end

  before_save do
    self.PREF = NKF.nkf("-eW", self.pref) if self.pref
    self.ADDRESS = NKF.nkf("-eW", self.address) if self.address
    self.NAME = NKF.nkf("-eW", self.name) if self.name
    self.advertisement = NKF.nkf("-eW", self.ad) if self.ad
  end
end

seedを作成する
中身は以下の通りである。「attr_accessor」で指定したカラム名に変更
テキスト内容は以下の様にして外部ファイルを読み込む

pref = ["北海道","東京都","神奈川県","愛知県","大阪府","福岡県","沖縄県"]
0.upto(200) do |idx|
  User.create!(
    :name => "団体名第 #{idx}",
    :pref => "#{pref[idx % 7]}",
    :address => "#{pref[idx % 7]}",
    :EMAIL => "mail#{idx}@example.com",
    :TEL => "00-1234-5678",
    :ad => File.read(Rails.root.join("db/seeds/advertisement.txt"))
  )
end

あとはcontrollerを設定すれば表示されるはずです。「次は都道府県別に表示する」をメモします。

アプリケーションをサーバに上げる手順

Railsアプリケーションを完成させたのでそれを上げるまでの一連の流れをメモ!

ドメインを作成

レポジトリを作る
$ mkdir hoge
$ hg init
$ ls -a
.  .. .hg
「hg init」でレポジトリが出来るので確認してコミットする
$ hg push ssh://xxx@hg.xxxx.jp/directory/directory/main
.hg/hgrcを編集する
[paths]
default = ssh://xxx@hg.xxxx.jp/directory/directory/main
とすれば以降プッシュが楽になる。

デプロイ先を決める

deploy.rbを書く
require 'bundler/capistrano'
load 'deploy/assets'

set :application, "application名"
set :scm, :mercurial
set :use_sudo, false
set :keep_releases, 3

desc "説明文"
task :production do
  set :deploy_to, "/var/rails/#{application}"
  set :repository, "ssh://xxx@hg.xxxx.jp/directory/directory/main"
  set :user, 'app'
  set :runner, "app"
  set :staging_server, false
  set :use_passenger, true
  set :rails_env, 'production'
  set :resettable, false  role :app, "サーバー"
  role :web, "サーバー"
  role :db,  "サーバー", :primary => true
  set :default_environment, {
    'PATH' => "/usr/local/bin:$PATH",
  }
end

desc "説明文"
after "deploy:update_code", :roles => :app do
  run "cp #{shared_path}/config/database.yml #{release_path}/config/"
end

namespace :deploy do
  # deploy:restart の上書き
  desc "説明文"
  task :restart do
    run "mkdir -p #{shared_path}/tmp"
    run "touch #{shared_path}/tmp/restart.txt"
  end
end
↓ デプロイ先にフォルダを作る
$ cap production deploy:setup
database.ymlを作る
通常のサーバー上であれば
/var/rails/application名/shared/config/database.ymlに書く
production:
  adapter: mysql2
  encoding: 文字コード
  database: application名
  pool: 5
  username: ユーザー名
  password: パスワード
  timeout: 5000

デプロイする
$ cap production deploy

サーバー上で手動でマイグレーションする(deploy.rbに書かない場合)
サーバー上で
$ export RAILS_ENV=production
$ bundle exec rake db:migrate

サーバー上で手動でrake db:assets:precompileをする(deploy.rbに書かない場合)
$ export RAILS_ENV=production
$ bundle exec rake db:assets:precompile

apacheのconfを書く
標準であればこんな感じ?
<VirtualHost *:80>
  ServerName ドメイン
  ErrorLog "/var/log/httpd/ドメイン.error_log"
  CustomLog "/var/log/httpd/ドメイン.access_log"
  DocumentRoot /var/rails/linkage/current/public
  RailsEnv production
  RackEnv production
  PassengerRestartDir /var/rails/linkage/shared/tmp
</VirtualHost>

apacheのconfが間違っていないか確認
$ sudo ./apachectl configtest
apacheの再起動
$ sudo ./apachectl graceful

2012年2月9日木曜日

Centos6.2にRailsプロジェクトを入れる

VMwarePlayerにCentOs6.2「basic server」をインストールしてプロジェクトを載せるまで実行してみました。 環境はUbuntu11.10デスクトップ版64bitです。VMwareはバージョン4です。 まずインストーラーが動き始めたら以下のように進めます。






ここで注意!!ネットワークの設定をしなければあとで面倒なのでここで設定します。
「Configure Network」をクリックし、編集から「自動接続」にチェックを入れます。









ここまでが一連のインストールの流れです。
あとはhttp://www.oiax.jp/books/kiso_rails2/prepare_centos_6_2.html
に沿って入れるのですが、Rails3.2で

$ rake assets:precompile

とするとエラーが「Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes.」と出たため 調べた結果Gemfileに以下を追加

gem 'execjs'
gem 'therubyracer'

$ bundle install

とすれば通ります。参考:http://stackoverflow.com/questions/6282307/rails-3-1-execjs-and-could-not-find-a-javascript-runtime
またCentOsの場合は問題ないですが、Ubuntuでsudo権限を与える為には

$ sudo adduser hoge admin

でsudoが使える様になります。 また参考ページにはないので参考までに載せると、VMwarePlayer上のサーバーにブラウザからアクセスするには
/etc/hostsに以下のように加えます。

192.168.251.130 hoge.jp

これでブラウザにhoge.jpとすれば繋がります。 ちなみにsshで繋げるには

$ ssh ubuntu@192.168.251.130

となりますユーザー名にIPアドレスです。 これで一通りテスト環境は整いました。
参考ページ


CentOsのインストール:http://www.kkaneko.com/rinkou/linux/centosinstall.html
Railsのプロジェクトを本番環境に載せる:http://www.oiax.jp/books/kiso_rails2.html
rake assets:precompileのエラーについて:http://stackoverflow.com/questions/6282307/rails-3-1-execjs-and-could-not-find-a-javascript-runtime

2012年2月6日月曜日

Jquery-UIのdraggableを使ってみた

これから仕事で使いそうなプラグインを使ってみた。

Ruby on Rails 3.2
Ruby 1.9.3
ほぼ見た目はbloggerのマネです。
Jquery UIを使用するときはapplication.jsに
//= require jquery-ui
を追加しあとは流れで
まずtop/index.html.erbに

<h1>Jqueryを遊ぶ</h1>
<table width="50%">
<tr>
 <td align="left" style="vertical-align: top;">
      <div class="a">ブログ全体</div>
    </td>
  </tr>
  <tr>
    <td align="left" style="vertical-align: top;">
      <table width="100%">
        <tr>
          <td align="left" style="vertical-align: top;">
            <div class="b">
              <div class="c" id="">
                <input type="text" tabindex="-1" style="opacity:0; height: 1px; width: 1px; z-index: -1; overflow-x: hidden; overflow-y: hidden; position: absolute;">
                <div class="d">
                  <div class="e"></div>
                  <span class="f"></span>
                  <div class="g">最大</div>
                  <div class="h">最小</div>
                </div>
              </div>
            </div>
          </td>
        </tr>
      </table>
    </td>
  </tr>
</table>

としてassets/stylesheets/top.css.scss

body {
  background-color:#ccc;
}
.a{
  color:#fff;
  font-size:13px;
  font-weight:bold;
  margin-left:5px;
}
.b{
  width:500px;
}
.c{
  height:20px;
  margin: 0 6px 10px;
}
.d{
  position:relative;
}
.e{
  width: 488px;
  background-color: #999;
  barder: none;
  height:9px;
  overflow:hidden;
  position: absolute;
  top:6px;
}
span.f{
  cursor: pointer;
  position: absolute;
  top: 0;
  z-index: 1px;
  height:21px;
  width:11px;
  background:#fff;
}
.g {
  position:absolute;
  font-size:85%;
  top:24px;
}
.h{
  position: absolute;
  font-size:85%;
  top:24px;
  right:0;
}

最後にassets/javascripts/change.jsを作成し

jQuery (function() {
  jQuery('span.f').draggable({
    containment: 'div.d' ,
    scroll: false,
     axis: "x"
  });
});

遊んでみました。

Windowsでthinを使う

Windowsでthinを使う

今回セミナーでthinを使用したところ、Windows使用の方々が全員エラーになったので
ここにメモをしておく。
環境は「Rails3.2.1」、「Ruby 1.9.3」

Gemfileを以下のように修正


gem 'thin'
gem 'eventmachine', '1.0.0.beta.4.1'

とし、

$ bundle install

=> Booting Thin
=> Rails 3.2.1 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
>> Thin web server (v1.3.1 codename Triple Espresso)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:3000, CTRL+C to stop

できました!!

2012年2月2日木曜日

Virtualbox内のUbuntu-serverにローカルのUbuntu11.10からsshでアクセス

今回はUbuntu11.10上のVirtualbox内のUbuntu-serverにUbuntu11.10からsshでアクセスしてみました。

まずは「設定」→「ネットワーク」→「アダプタ1」→「割り当て」→「NAT」にして「高度」を展開します。
「ポートフォワーディング」をクリックします


次にプロトコルTCP、「ホストポート」を「2222」にし「ゲストポート」を「22」と設定します。


あとは公開鍵を設定するのですが、なかなかこのままでは難しいので簡単な方法として・・・

DropBoxを使用すると簡単です!!

公開鍵を「public」内に保存します。dropbox内でそのファイルを右クリックし「dropbox」から「パブリックリンクのコピー」を選択しテキストエディターか何かに貼り付けます。

するとhttp://dl.dropbox.com/u/xxxxxxxx/id_dsa.pub
という形のURLになります。

そしてゲストubuntu内で

$ wget http://dl.dropbox.com/u/xxxxxxxxx/id_dsa.pub

とし、あとは

$ mv id_dsa.pub authorized_keys

とすればOKです

んで、ホストubuntu内で

$ sudo ssh -p 2222 -l wataru localhost

これで繋がるはずです!!

Ubuntu-server10.04LTSのインストール

Ubuntu-server10.04LTSのインストール手順をまとめてみました。


英語でいきます。


一番上のインストールをクリック

言語はEnglishでいきます


国は日本がないので仕方なくUnited statesにしました。

キーボードレイアウトは手動でいくのでNoです


日本語キーボードがいいのでJapanです。


レイアウトがよく分からないから一番上で
次の画像が消えちゃったので画像はないですが、
サーバーに割り当てるホスト名を入力します。

タイムゾーン設定です。Asia/Tokyoになっているのを確認します。



パーティションはお任せとしてこのままいきます。


新しいパーティションを書き込んで良いかの確認です。


設定されたLVMボリュームに割り当てる容量を入力。デフォルトでいきます。


パーティションの最終確認です。これで良ければYesを選択します。


ユーザーアカウントの設定をします。まず最初にフルネームを入力します。ここで設定したユーザーがデフォルトの管理者ユーザーとなります。


次にユーザー名です。


次にパスワードです。これの後に確認用もでてきます。


ディレクトリーを暗号化するかどうかです。


プロキシを使う場合は入力します。


システムの自動更新です。今回はNoです。一番上を選択


必要なソフトウェアのインストールです。必要ないので、そのまま次へ


GrubブートローダをMBRに書き込んでよいかの確認なので「Yes」を選択します。


インストール完了です。

その後に出てくる画面で、loginできればOKです。!!

Virtualboxを使用してみる・・・

Ubuntu11.10のVirtualboxを使ってみました。
手順をメモっておきます。










ここまで出来たら次はイメージファイルを選択し起動と 同時にインストールを開始させる



以上です。これは簡単ですね。

VMwarePlayerにUbuntu-server10.04LTSをインストール

Ubuntu11.10-64bitの上のVMwarePlayerにUbuntu-server10.04LTSをインストールしてみました。「Create a New Virtual Machine」をクリック


同意します。


あらかじめダウンロードしてあるイメージファイルを選択します。


ユーザー名とパスワードを名前を決めます。Ubuntu-serverにログインする為のものです。


VirtualMachineの名前を決めます。


HDDの容量を決めます。任意で。こんなに入らないけど・・


Finishの前にカスタムしないと後で直せません。先に「Cusomize Hardware」を選択してメモり等をカスタムしましょう。

ここをしっかりやらないと後で面倒です。Finishをクリックすると自動でインストールしてくれちゃいます。

以上です。