2012年11月22日木曜日

jQueryのdatepickerで特定の曜日のみ押下可能

ある曜日だけを活性にして、他を押せないようにする場合、jQuery の datepicker の
beforeShowDay オプションでハンドリングできます。


下記では、日曜日のみ押せるようにしています。(日曜日=0)
<script>
  $(function() {
    $('#start').datepicker({
        beforeShowDay: function(dt) {
         return [dt.getDay() == 0 ? true : false];
        }
    });
  });
</script>

<参考>
http://jquerybyexample.blogspot.com/2010/07/disable-specific-days-in-jquery.html

2012年11月8日木曜日

cronで実行するとエラーになる

手動で実行すればエラーにならないのに、cronから実行するとエラーになる。
過去に2-3度同じことがあったので、メモっておきます。

前提
・環境はUbuntu10.04
・/etc/crontab にcron定義

問題1
<現象>
・日本語のメール送信が化ける
・日本語を含むファイルやフォルダにて、日本語が文字化けして読み込めない

<対処法>
下記をcrontabに追加 。
    LANG=ja_JP.UTF-8
エラーログが/etc/crontab で実行した際に表示されていなかったが、
crontab -e では、表示されたので気づいた。

問題2
<現象>
・broken pipeエラーが発生
 Javaでは、こんなエラーだったり…
   Caused by: java.net.SocketException: Broken pipe
 Rubyでは、こんなエラーだったり…
   #<Errno::EPIPE: Broken pipe>

<対処法>
/dev/nullに出力を捨てる!
"command > /dev/null 2>&1"



Rubyで最後の文字取得

最後の文字取得には、いろいろ方法があるとは思いますが、
忘れない内にこんな方法もあるってことを書いておきます。

> str = "ABCDE"
 => "ABCDE"

# 最終文字
> str[-1, 1]
 => "E"

# 最後から3番目の、そこから2文字
> str[-3, 2]
 => "CD"

2012年11月1日木曜日

ActionMailerの使い方

Rails3でActionMailerを用いたメール送信について。
ファイルは多い感じですが、いたって簡単。

◆雛形の生成
$ rails g mailer WeeklyMailer
      create  app/mailers/weekly_mailer.rb
      invoke  erb
      create    app/views/weekly_mailer
      invoke  rspec
      create    spec/mailers/weekly_mailer_spec.rb

◆差出人、送信先、本文の送り方
# app/mailers/weekly_mailer.rb
class WeeklyMailer < ActionMailer::Base
  default from: "abc@example.com"

  def weekly_email

    @date = Period.date_from

    recipient = "xxx@example.com"
    subject = "お知らせ @date"
    mail(:to => recipient,
         :subject => subject)do |format|
      format.html # HTML形式
      format.text # テキスト形式
    end
  end
end

◆ テンプレートの書き方
こちらでは、HTML形式のビューの書き方を紹介。
bodyタグ内を書けば良し。
text形式の場合は、ファイル名を weekly_email.text.erb にして不要なタグをなくせばOK。
# app/views/weekly_mailer/weekly_email.html.erb

<!DOCTYPE html>
<html>
  <head>
    <meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
  </head>
  <body>
    <p>てすと</p>
  </body>
</html>

◆コントローラから呼び出し
週次にcronから呼びたいので、こちらに。
ボタン押下してメール送信したいほうが多いかな?
class WeeklyMailController < ApplicationController
  class << self
    def exec
      WeeklyMailer.weekly_email.deliver
    end
  end
end

◆実行
rails r WeeklyMailController.exec

◆デバッグ
こちらより→ http://blog.twiwt.org/e/a986c5

# config/initializers/action_mailer_log_subscriber.rb
require 'action_mailer/log_subscriber'

module ActionMailer
  class LogSubscriber
    def deliver_with_debug(event)
      deliver_without_debug(event)
      debug(Mail.new(event.payload[:mail]).subject)
      debug(Mail.new(event.payload[:mail]).body)
    end
    alias_method_chain :deliver, :debug
  end
end


◆ Configファイル (開発環境)
ここまでやって、エラーもないし、送られてるはずなんだけど、届いてない!
そんな時は、定義ファイルの設定を確認しましょう。

config/environments/development.rb

  config.action_mailer.raise_delivery_errors = true  #デフォルトはfalse
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
      :enable_starttls_auto => false,    ## ないとエラー(※)がでる
      :address        => 'xxxxx.example.com',
      :port           => 250,
    }

※エラー内容
bundle/ruby/1.9.1/gems/railties-3.2.6/lib/rails/commands/runner.rb:53:in `eval': hostname does not match the server certificate (OpenSSL::SSL::SSLError)
        from /home/xxx/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/smtp.rb:585:in `tlsconnect'
        from /home/xxx/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/smtp.rb:560:in `do_start'
        from /home/xxx/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/smtp.rb:519:in `start'
...

TLS接続を使用としてエラーになっているみたいなので、TLS接続をしないようにすれば良いらしい。

◆ メールの差出人に日本語名を出したい場合
gemがないと文字化けしますので、bundleに追加。
gem 'mail-iso-2022-jp'
差出人を書く所は、こんな書き方になります。
default from: "なまえ<aaa@example.com>", :charset => 'iso-2022-jp'

◆参考
http://edgeguides.rubyonrails.org/action_mailer_basics.html

2012年10月30日火曜日

rails g のロールバック

rails g もしくは、 rails generate でファイルを生成した際に、名前を間違えたからやり直したい場合があると思います。
その際には、一個ずつ消さなくても、rails destroyで元通りにしてくれます。
いつもrollbackと打とうとして忘れるんですよね。。destroyです。

$ rails g model latest_info
      invoke  active_record
      create    db/migrate/20121030042916_create_latest_infos.rb
      create    app/models/latest_info.rb
      invoke    rspec
      create      spec/models/latest_info_spec.rb

infos って微妙と思い…。

$ rails destroy model latest_info
      invoke  active_record
      remove    db/migrate/20121030042916_create_latest_infos.rb
      remove    app/models/latest_info.rb
      invoke    rspec
      remove      spec/models/latest_info_spec.rb

画面に表示させるテキストの改行処理方法

DBからデータ取得をして、画面に表示させる際に、\n を <br/>にしたい場合
gsubで、\n を <br /> に変換しなくても simple_format という便利なライブラリがあります。
こんな感じに書くだけ!
<%= h simple_format(text) %>
http://railsdoc.com/references/simple_format
文字列を<p>で括る
改行は<br />を付与
連続した改行は、</p><p>を付与


人によっては、生成される<p>タグがうざいと思う人もいるかも…。

2012年10月19日金曜日

HTMLの表のカラム幅指定

HTMLでTableタグを使って表を作る場合、先頭のカラムのみ固定して、
残りを文字数に関係なく等間隔にしたい場合の方法。
テーブルタグのスタイルに table-layout:fixed; を設定する。

こうするだけで、tdにwidthを設定したものだけ固定され、
他は等間隔になります。colspan, rowspanを使っていても問題なし!

<table border=1 width="100%" style="table-layout: fixed;">
  <tr>
    <th width="100px">Col ABC</td>
    <th>Col ABCDE</td>
    <th>Col3 ABCDE FGHIJ</td>
    <th>Col4</td>
  </tr>
</table>

jQueryのtoggle

リンクを押すとテーブルの表示・非表示をするのに、jQueryのtoggleを利用。

表示・非表示したい部分をdivタグで囲む。
画面表示時は表を表示させたくない場合に、style="display: none"をつける。
<div id = "my_table" style="display: none">
  <table>
    ...
  </table>
<div>

jQueryが入ってることを前提とし、下記のJavaScriptを追加
なお、toggleの引数は、fast, slow, なし 等の設定ができる。
http://api.jquery.com/toggle/
<script type="text/javascript">
function toggleDiv(divId) {
   $("#"+divId).toggle('fast');
}
</script>

選択するリンクにJavaScriptの呼び出しを追加
<a href="javascript:toggleDiv('my_table');" style="text-decoration: none;">Click!</a>





2012年10月17日水曜日

カスタムバリデーションの作り方

Rails3でカスタムバリデーションを作ってみました。
Rails2ですら作ったことなかったのですが、思ったより簡単でした。

config定義
バリデーションクラスを置く場所を定義します。
# config/application.rb
config.autoload_paths += %W(#{config.root}/lib/validators)

バリデーションクラス
options[:message]がバリデーションチェック対象の項目名。
今回はリポジトリ名(name)になりますが、
「リポジトリ名は存在しません。」というようなエラーになります。
# lib/validators/repo_presence_validator.rb
class RepoPresenceValidator < ActiveModel::EachValidator
  def validate_each(object, attribute, value)
    unless mail_groups(value)
      object.errors[attribute] << (options[:message] || "は存在しません")
    end
  end

private
  def mail_groups(value)
   ...
  end
end

モデル
青字部分が今回作ったバリデーションを呼んでる所になります。
validates :name, :presence => true, :repo_presence => true
<参考>
http://railscasts.com/episodes/211-validations-in-rails-3
http://hajimete-ruby.jugem.jp/?eid=69

2012年10月9日火曜日

複数テーブルのJOIN

ActiveRecordを使って、複数テーブルのJOINをする際にincludesを使う場合、
複数テーブルをどうやって指定すれば良いのだろうと調べてました。

ひとまず忘れないうちにメモっておきます。

1テーブルのみJOINする場合は、下記のようにかけるのですが、
さらに遡リたい場合はどうすればよいのだろうと。
下記は、projectsがclient_idを持ってるイメージ。
Project.includes(:client)

2テーブルJOINする場合は、下記のように配列とハッシュの組み合わせになります。
こんなふうに書くと、どんどん遡ってかけます。
下記は、teamsがproject_idを持っていて、projectsがclient_idを持ってるイメージ。
Team.includes(:project => [:client])
さらにwhere句を付ける場合は、下記のようにテーブル名をつけてあげます。
Team.includes(:project => [:client]).where("clients.code = ? ", code)

ActiveRecordでIN句

ActiveRecordではIN句を記載するwhereに配列を渡すことができます。
Rails3では下記の書き方になります。
login_ids = ["sato", "suzuki", "tanaka"]
@users = User.where(["login in (?)", login_ids])

こう書くことで、下記の文が実行されます。
SELECT `users`.* FROM `users` WHERE (login in ('sato','suzuki','tanaka'))

2012年9月28日金曜日

jQueryのカレンダー(Datepicker)

jQueryのDatepickerを初めて使ってカレンダーを表示させてみました。
なかなか便利だけど、ハマったところもあり。
バージョンはこれ。
  • Rails 3.2
  • jQuery 1.8.23

最初は、'jquery-ui-rails' のGemを使ったのですが、ローカルのWEBRickのproductionモードでは動いたのに、Apacheにすると前月/翌月のアイコンが表示されない問題に遭遇。
画像ファイルは、Gemに入ってるのでどうにもならず、Gemを使うのをやめました。

さて、jQueryのファイルをどこに置くのか。
こちらのサイトを参考にしました。
http://www.ninxit.com/blog/2012/04/08/railsjqueryuidatepicke/


  • JSファイルの配置
app/assets/javascripts/jquery-ui-1.8.23.custom.min.js
  • JSファイルの読み込み
$ vi app/assets/javascripts/application.js
//= require jquery
//= require jquery-ui 
//= require jquery_ujs
//= require_tree .
  • CSSファイルの配置 
app/assets/stylesheets/jquery-ui/jquery-ui-1.8.23.custom.css
  • CSSファイルの読み込み
$ vi app/assets/stylesheets/application.css
*= require_self
*= require_tree .
*= require_tree ./jquery-ui 

  • 画像ファイルの配置(ここ注意! images/imagesになります) 
app/assets/images/images/*.png

  • 日本語化対応のファイル配置
app/assets/javascripts/jquery.ui.datepicker-ja.js
  • 日本語化対応のファイル読み込み
    • 下記からjaのファイルを取得します。 
    http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/ 
$ vi app/assets/javascripts/application.js 
//= require jquery.ui.datepicker-ja
  •  あとは、いつもどおり precompile。
$ bundle exec rake assets:precompile RAILS_ENV=production
$ rails s -e production

ハマったところは、上記の赤字にある画像ファイルのパス。
ググると皆いろいろなことを書いてます。
環境によるのかもしれませんね。
cssには、 url(images/ui-bg_glass_75_ffffff_1x400.png) のような定義をされているので、
imagesディレクトリの中のimagesディレクトリという読み方になってしまってます。
CSSの定義を変えても良いのですが、将来的のバージョンアップを考えると
あまり好ましくないということで、画像ファイルの配置場所を変えることにしました。
Rails3はややこしい(>_<)

railsのfavicon

faviconを初めて作ってみました。

以下、やったこと。
  • faviconの作成
    • ネットにごろごろ転がっているfaviconメーカーを使いました
  • headタグ内に下記を追加
  <%= favicon_link_tag %>
  • public/favicon.icoの差し替え
ブラウザのキャッシュとかが残ってると差し替えた時とかにうまく変わらなくて
キャッシュの削除と、ブラウザの再起動をいろいろやってなんとか変更(^^;

2012年9月18日火曜日

バリデーションメッセージの日本語対応

en.yml の locale ファイルのトップにも書かれていますが、下記のサイトにアクセスすると、言語ごとに用意されています。
https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale

デフォルトは、英語なので、例えばName欄が空欄だと、下記のようなエラーになります。
"Name can't be blank"

日本語対応にすると
"Name を入力してください"
になります。

しかし、"名前 を入力してください"にしたいところです。

では、どうすれば良いのでしょうか。

ja.ymlのロケールファイルに下記のように記載します。
 activerecord:
    attributes:
      user:
        name: "名前"

こう書くことで、UserモデルのNameカラムを"名前"にして表示します。

【参考】
http://guides.rubyonrails.org/i18n.html#translations-for-active-record-models

バリデーションチェックのエラー表示場所

railsのscaffoldで生成したビューファイルにはエラーメッセージを表示する場所があります。

ここの部分ですね。
  <% if @admin_client.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@admin_client.errors.count, "error") %> prohibited this admin_client from being saved:</h2>

      <ul>
      <% @admin_client.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
ちなみに、このエラーメッセージ表示部をpartialで切り出して、@adminのところを引数で渡すようにすると、変更が容易になりました。

上記のメッセージ部とは別に、エラーが出ると、該当の項目が赤くなります。
しかし、この赤い部分は見た目的にもイマイチで、レイアウトが崩れることもあるので、
非表示する場合の設定がこちら。
config/application.rb に、下記を追加します。
config.action_view.field_error_proc = Proc.new {|html_error, instance| "#{html_error}".html_safe }

【参考】
http://techlog.knocking.co.jp/archives/1161

数値の3桁区切り

Railsにはさまざまな便利なヘルパーが用意されています。
例えば、数値を3桁ごとにカンマを入れたい場合は、number_with_delimiter() を使います。

詳細はこちら
http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html
他にも便利な数値系のヘルパーがあります。

3桁区切りでは、
Viewに下記のように書くと、
<%= number_with_delimiter(12345678, :delimiter => ",") %>
こんなふうに表示されます。
12,345,678

カンマ等の区切り文字は、ロケールファイルに切り出すのも良いでしょう。


2012年9月11日火曜日

Railsの画像表示

CSSに設定して表示する場合もありますが、ヘルパークラスから表示させる場合はimage_path()を使います。
相対パスを書いて、開発環境では動いてるのに、本番環境では動かず困ったことがありました。
その際にimage_path()について知りました。
http://railsdoc.com/references/image_path

こんなふうにヘルパークラスで書くと
content_tag(:img,"" ,:src=>image_path("test.png"))

こんなhtmlを生成してくれます。
<img src="/assets/test.png">

2012年8月31日金曜日

railsとmysqlのインデックス

インデックスを付与してみよう!ってことで…

migrateファイルにはこんなふうに書いて、 rake:migrate を実行
class AddIndex < ActiveRecord::Migration
  def change
    add_index :users, [:project_id, :login], :unique=>true, :name=>'users_project_login'
  end
end

uniqueをつけると、ユニークインデックス
name はインデックスの名前。指定しないと、
テーブル名_カラム名1_カラム名2_...カラム名N になります。

mysqlで実際どんなふうになているかを見る時のコマンドはこれ。
 show index from index;

ちなみにインデックスを外すときはmysqlでこれね。
migrate/rollbackしてるうちにデータがおかしくなった私(^^;
drop index index_name on tbl_name;

ユニークインデックスとは

「ユニークインデックス」と「ユニークじゃないインデックス(ノンユニークインデックス?)」の違いって?

あれこれ読んだ所、私なりの解釈としてはざっくりと・・・

ユニークインデックス
  指定したカラムの値は重複しない。(重複したデータ入れることができない)

ノンユニークインデックス
  重複したデータを入れることが可能。


また、インデックスには、複数のカラムの指定が可能。

これを理解した上で、railsに設定します!

テーブル行のしましま

Railsでテーブルの偶数・奇数行に異なる色を付けてシマシマにしたい場合
cycle が便利!
テーブルだけでなく、リストでも使えます。


View定義
<tr class="<%= cycle('even', 'odd')%>">
なお、cycleの引数は2つ以上取れます。例えば、red, yellow, blueにした場合は、3色が順になります。

CSS定義
.odd {background-color:#f6f7f8;}
.even {background-color: #fff;}

同じページで複数会cycle()を使うと、奇数行の場合にずれるので(奇数で終わると、次は偶数色から始まる)、その場合は、下記で一旦リセットする。
<% reset_cycle() %>


2012年8月30日木曜日

No route matches [GET] "/image

Rails で No route matches [GET] "/image ... なエラーが出ました。
画面にイメージを表示したいために、CSSに下記を記載してるのですが…。

Try1 (image以下の画像を表示!でも、上記のエラーが…。)
background-image: url(/images/sort_asc.png);

Try2 (あ、そうか、階層が違うか。 でもダメだった…)
background-image: url(../images/sort_asc.png);
Try3 (assetが必要? でもダメだった…)
background-image: url(/assets/images/sort_asc.png);
Try4 (もしや、ただ単に画像ファイル名だけ?Bingo!)
background-image: url(sort_asc.png);

これって、Rails3からなのかしら?

rails のlayout と 複数 yield と content_for

Railsのlayouotに複数yieldを埋め込みたい場合はどうすれば良いのでしょうか?

yieldに名前をつけてあげます。下記の例で言えば、:sidebar

<div id = "sidebar">
  <%= yield :sidebar %>
</div>

<div id="content">
  <%= yield %>
</div>

その際に、view側では、 content_for というタグを使って、
yield :sidebar のところに埋め込む部分を定義します。
例えば、partialでメニューを埋め込む場合はこんな感じ。
<% content_for :sidebar do %>
  <%= render(:partial => 'menu') %>
<% end %>

2012年8月7日火曜日

rubyの小数点計算

小数点の計算と小数点以下N桁の表示にハマったのでメモしておきます。
roundは引数が持てるんですね。

1.9.3p194 :001 > 1/3
 => 0
1.9.3p194 :002 > 1/3.to_f
 => 0.3333333333333333
1.9.3p194 :003 > (1/3.to_f).round
 => 0
1.9.3p194 :004 > (1/3.to_f).round(2)
 => 0.33
1.9.3p194 :005 > 1/4
 => 0
1.9.3p194 :006 > 1.to_f/4
 => 0.25
1.9.3p194 :007 > (1.to_f/4).round
 => 0
1.9.3p194 :008 > (1.to_f/4).round(1)
 => 0.3
1.9.3p194 :009 > (1.to_f/4).round(2)
 => 0.25

2012年6月27日水曜日

railsでMySQLのデータが文字化け

RailsのActiveRecordからMySQLのデータ取得すると日本語が文字化け…。
MySQLのコンソールから見ると、ちゃんと見れる。
mysqldumpをすると文字化け…

default-character-setの指定が必要云々とあったので、
下記ファイルに
sudo /etc/mysql/my.cnf 
これを1行追加して
default-character-set=utf8
MySQL再起動すればOK!
$ sudo /etc/init.d/mysql restart


2012年5月2日水曜日

rvm の更新

今こんなものが入っていて、1.9.3を追加しようかと。
1.9.2だと、Redmine1.4を動かすのにプラグイン周りでエラーが出るのです…。

現状
$ rvm use list

rvm rubies

   jruby-1.6.2 [ amd64 ]
   ree-1.8.7-2011.03 [ x86_64 ]
   ruby-1.8.6-p420 [ x86_64 ]
   ruby-1.8.7-p352 [ x86_64 ]
   ruby-1.9.2-p290 [ x86_64 ]
rvm を最新に更新する 
しばらくやってないからか時間がかかる…
$ rvm get head
アップデートしたrvmの再読み込み
$ rvm reload
RVM reloaded!

インストール可能なRuby一覧
$ rvm list known
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-p358]
[ruby-]1.8.7-head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2-p180
[ruby-]1.9.2-p290
[ruby-]1.9.2-p318
[ruby-]1.9.2[-p320]
[ruby-]1.9.2-head
[ruby-]1.9.3-preview1
[ruby-]1.9.3-rc1
[ruby-]1.9.3-p0
[ruby-]1.9.3-p125
[ruby-]1.9.3-[p194]
[ruby-]1.9.3-head
ruby-head

1.9.3のインストール
$ rvm install 1.9.3
Installing Ruby from source to: /home/tiffany/.rvm/rubies/ruby-1.9.3-p194, this may take a while depending on your cpu(s)...
"--head"をつけるとリポジトリの最新リビジョン。
付けないとパッチがあたってる最新のものが取れるらしい。

使ってみる
$ rvm use 1.9.3
Using /home/tiffany/.rvm/gems/ruby-1.9.3-p194

1.9.2に切り替えてみる
$ rvm use 1.9.2
ruby-1.9.2-p320 is not installed.
To install do: 'rvm install ruby-1.9.2-p320'
あれ… どもう最新じゃないからインストールせよと…
とりあえず1.9.2もインストール。(こうやって更新するのね。ふむふむ)
$ rvm install ruby-1.9.2-p320

1.9.2に切り替え
$ rvm use 1.9.2
Using /home/tiffany/.rvm/gems/ruby-1.9.2-p320

もともとあった1.9.2には、こんなふうにすれば切り替わる。
$ rvm use ruby-1.9.2-p290
Using /home/tiffany/.rvm/gems/ruby-1.9.2-p290

2012年4月27日金曜日

MD5の作成

picasaにあるようなプライベート設定の認証キーにMD5を使う場合、
RubyからMD5キーを生成してみました。

irbで実行するとこんな感じ。
> require 'digest/md5'
=> true
> Digest::MD5.hexdigest("aa")
=> "4124bc0a9335c27f086f24ba207a4912"
> Digest::MD5.hexdigest("AA")
=> "3b98e2dffc6cb06a89dcb0d5c60a0206"

大文字小文字で違うキーが生成されます。

MD5のreverse用の辞書も存在するので、そこでマッチしない言葉を選びましょう!
http://md5.rednoize.com/

2012年4月20日金曜日

Sinatraをapacheで動かす

sinatraをapacheで動かしてみましょう。
Apacheが入ってることが前提で、passenger のインストールを行います。
先に作成した config.ru が必要になります。

下記を参考にしました!ありがとうございます!
http://d.hatena.ne.jp/foosin/20090619/1245426335

passengerのインストール
2つのモジュールが必要です。
1つ目はあっという間。
$ gem install passenger
Fetching: fastthread-1.0.7.gem (100%)
Building native extensions.  This could take a while...
Fetching: daemon_controller-1.0.0.gem (100%)
Fetching: passenger-3.0.12.gem (100%)
Successfully installed fastthread-1.0.7
Successfully installed daemon_controller-1.0.0
Successfully installed passenger-3.0.12
3 gems installed
Installing ri documentation for fastthread-1.0.7...
Installing ri documentation for daemon_controller-1.0.0...
Installing ri documentation for passenger-3.0.12...
Installing RDoc documentation for fastthread-1.0.7...
Installing RDoc documentation for daemon_controller-1.0.0...
Installing RDoc documentation for passenger-3.0.12...

2つ目はちょっと長いです。
$ passenger-install-apache2-module
Welcome to the Phusion Passenger Apache 2 module installer, v3.0.12.

This installer will guide you through the entire installation process. It
shouldn't take more than 3 minutes in total.

Here's what you can expect from the installation process:

 1. The Apache 2 module will be installed for you.
 2. You'll learn how to configure Apache.
 3. You'll learn how to deploy a Ruby on Rails application.

Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.

Press Enter to continue, or Ctrl-C to abort.
ここではとりあえずEnter押下。
しばし待つと
 1. The Apache 2 module will be installed for you.
が終わって、
 2. You'll learn how to configure Apache.

の説明が表示されます。

下記3行は環境によって異なりますので、メモしておきます。
あとで必要になります。
Load xxxxx
PassengerRoot xxxxx
PassengerRuby xxxxx

--------------------------------------------
The Apache 2 module was successfully installed.

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /home/tiffany/.rvm/gems/ruby-1.9.2-p290@rails3/gems/passenger-3.0.12/ext/apache2/mod_passenger.so
   PassengerRoot /home/tiffany/.rvm/gems/ruby-1.9.2-p290@rails3/gems/passenger-3.0.12
   PassengerRuby /home/tiffany/.rvm/wrappers/ruby-1.9.2-p290@rails3/ruby

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

Press ENTER to continue.
無事インストールされたようなのでEnter押下。
最後に
 3. You'll learn how to deploy a Ruby on Rails application.

で、こういうメッセージが表示されます。
--------------------------------------------
Deploying a Ruby on Rails application: an example

Suppose you have a Rails application in /somewhere. Add a virtual host to your
Apache configuration file and set its DocumentRoot to /somewhere/public:

   <VirtualHost *:80>
      ServerName www.yourhost.com
      # !!! Be sure to point DocumentRoot to 'public'!
      DocumentRoot /somewhere/public   
      <Directory /somewhere/public>
         # This relaxes Apache security settings.
         AllowOverride all
         # MultiViews must be turned off.
         Options -MultiViews
      </Directory>
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips, troubleshooting and other useful information:

  /home/tiffany/.rvm/gems/ruby-1.9.2-p290@rails3/gems/passenger-3.0.12/doc/Users guide Apache.html

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)
http://www.modrails.com/

Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.


Passengerのインストールはこれで終了です。


apacheの設定
環境によって異なると思いますが、、下記のファイルに上記3を参考に設定を行います。
$ sudo vi /etc/apache2/sites-available/xxx
そのファイルに下記を追加します。
上記でメモした3行

   LoadModule passenger_module /home/tiffany/.rvm/gems/ruby-1.9.2-p290@rails3/gems/passenger-3.0.12/ext/apache2/mod_passenger.so
   PassengerRoot /home/tiffany/.rvm/gems/ruby-1.9.2-p290@rails3/gems/passenger-3.0.12
   PassengerRuby /home/tiffany/.rvm/wrappers/ruby-1.9.2-p290@rails3/ruby
モジュールのパス設定
<VirtualHost *:80>
    ServerName www.yourhost.com
    DocumentRoot /home/tiffany/sinatra/public
    <Directory  /home/tiffany/sinatra/public>
        AllowOverride all
        Options -MultiViews
    </Directory>

     ErrorLog /var/log/apache2/error.log
     CustomLog /var/log/apache2/access.log combined
</VirtualHost>

これで、apacheを再起動すればOK!
RACK_ENV=productionでアプリが起動します。
もし、development環境でapache を動かしたい場合は、下記のようにRackEnv development をapacheの設定ファイルに追加してください。
    DocumentRoot /home/tiffany/sinatra/public
    RackEnv development

Sinatraをconfig.ruで起動

config.ruに下記を書くだけで動きます。

例えば、myqpp.rb のアプリを動かしたい場合
config.ru を myapp.rb と同じ階層に配置します。

#  config.ru
require "./myapp.rb"
run Sinatra::Application

require "./myapp.rb"
の記載は、下記のように書いてもOK
require File.dirname( __FILE__ ) + "/myapp.rb"

起動コマンドは
$ rackup config.ru
[2012-04-20 15:51:07] INFO  WEBrick 1.3.1
[2012-04-20 15:51:07] INFO  ruby 1.9.2 (2011-07-09) [x86_64-linux]
[2012-04-20 15:51:07] INFO  WEBrick::HTTPServer#start: pid=27704 port=9292

port は 9292 になります。
ruby myapp.rb の port 4567と同じ動きです。

productionモードで動かす場合は下記のコマンドになります。
RACK_ENV=production rackup config.ru

Sinatraのルートの最後のスラッシュ

ルートの最後にスラッシュがあってもなくても動くようにしたい場合は、
最後に「/?」をつければ良いです。
http://www.sinatrarb.com/faq.html#slash


例えば、下記のどちらでも動かせるようにしたい場合、
スラッシュなし
get '/hello' do
  "Hello"
end
スラッシュあり
get '/hello/' do
  "Hello"
end

こんなふうに書くだけでどちらにもマッチします!
get '/hello/?' do
  "Hello"
end

2012年4月19日木曜日

Sinatraの環境切り替え

config.ymlといった定義ファイルをdevelopmentモードとproductionモードといったモードで切り替えを行う方法です。

http://www.sinatrarb.com/contrib/config_file.html


下記2行を追加すれば、railsのようにproduction/developmentの記載できます。
require "sinatra/config_file"
config_file 'path/to/config.yml
例えば、こんなconfig.ymlがあったとします。
production:
  server: sinatra_production
  port: 5555
development:
  server: sinatra_dev
  port: 5555
test:
  server: sinatra_test
  port: 5555
settings.serversettings.port でそれぞれのモードに応じた値が取得できます。
settingsはお決まりの用語です。

なお、上記のymlでも下記のymlでも同じ結果になります。
server:
  production: sinatra_production
  development: sinatra_dev
  test: sinatra_test

port: 5555

どちらの記載が良いのかは、定義ファイルの書く内容次第ですね。

Sinatraのホットデプロイ

ファイルを変更するたびに、Ctrl+Cして、再起動していたので、
何かないか探してた所、sinatra-reloaderというものがありました。
http://www.sinatrarb.com/contrib/reloader
$ gem install sinatra-reloader
Fetching: backports-2.5.1.gem (100%)
Fetching: rack-test-0.6.1.gem (100%)
Fetching: eventmachine-0.12.10.gem (100%)
Building native extensions.  This could take a while...
Fetching: sinatra-contrib-1.3.1.gem (100%)
Fetching: sinatra-reloader-1.0.gem (100%)
Successfully installed backports-2.5.1
Successfully installed rack-test-0.6.1
Successfully installed eventmachine-0.12.10
Successfully installed sinatra-contrib-1.3.1
Successfully installed sinatra-reloader-1.0
5 gems installed



ファイルのほうには、こんなふうに書いてあげれば良し。
if development?
  require "sinatra/reloader"
  also_reload File.dirname(__FILE__) + "/Xxxx.rb" ## 一緒にリロードするファイルがあれば
end
この下にはいつも通りの configure… before… get…等が続く。


2012年4月11日水曜日

Sinatraでviewに引数を渡す

Rails同様に:localsを使う
get '/get' do
  res_data = find(x,y)
  erb hello, :locals => {:data => res_data}
end
views/hello.erb
Result:
<%= data %>

2012年4月10日火曜日

Sinatraの起動ポート変更

Sinatra起動時のポートは4567だが、変更する場合は、下記のように -p をつけて起動すれば良い。
$ ruby api.rb  -p 4568
[2012-04-10 18:05:45] INFO  WEBrick 1.3.1
[2012-04-10 18:05:45] INFO  ruby 1.9.2 (2011-07-09) [x86_64-linux]
== Sinatra/1.3.2 has taken the stage on 4568 for development with backup from WEBrick
[2012-04-10 18:05:45] INFO  WEBrick::HTTPServer#start: pid=13966 port=4568
他にもいくつかの起動オプションあり。
$ ruby api.rb  -h
Usage: api [options]
    -p port                          set the port (default is 4567)
    -o addr                          set the host (default is 0.0.0.0)
    -e env                           set the environment (default is development)
    -s server                        specify rack server/handler (default is thin)
    -x                               turn on the mutex lock (default is off)



2012年4月5日木曜日

RubyからMongoへのアクセス

単一のMongoDB
conn = Mongo::Connection.new("localhost",27017)

ReplicaSetsのあるSecondaryに接続
conn = Mongo::Connection.new("localhost",27017, :slave_ok=>true)

ReplicaSetsでMongoDB
conn = Mongo::ReplSetConnection.new(['10.20.30.40:27017','10.20.30.41:27017'], :read => :secondary)
Secondaryが落ちてる場合は、Primaryに接続される。

PrimaryとSecondaryのどちらに接続されているかを確認ができる
conn.read_primary?


参考
http://api.mongodb.org/ruby/current/Mongo/ReplSetConnection.html

Sinatraのロケールファイル

railsみたいにロケールファイルを用意するにはどうすれば良いのだろう?と
調べていたら辿りついたのがこのサイト!ありがとうございます♪
http://d.hatena.ne.jp/ruedap/20110331/ruby_sinatra_i18n_r18n

gemのインストール
$ gem install sinatra-r18n
Fetching: r18n-core-0.4.14.gem (100%)
Fetching: sinatra-r18n-0.4.14.gem (100%)
Successfully installed r18n-core-0.4.14
Successfully installed sinatra-r18n-0.4.14
2 gems installed
ロケールファイルの作成
プロジェクトルート以下に、i18nのフォルダを作成し、ja.ymlやen.ymlといったファイルを作成。

YAMLファイルなので、下記のように記載。
message:
  error1: サーバーが停止しています

呼び出し側の記述下記のrequireを追加して、tオブジェクトを用いて
ロケールファイルの定義を記載するだけで表示!
require 'sinatra/r18n'

t.message.error1

2012年4月2日月曜日

JSONView

Chromeに便利なJSONを整形して表示するプラグインがあったのでメモっておきます

開発元
https://github.com/gildas-lormeau/JSONView-for-Chrome

ダウンロード先
https://chrome.google.com/webstore/detail/chklaanhfefbnpoihckbnefhakgolnmc

sinatraを使ってjsonを返す際に、見やすくなります。

はじめてのSinatra

見よう見まねで、とりあえず
http://www.sinatrarb.com/intro-jp.htmlを試してみた♪
あっさり動いて感動!

gemのインストール
$ gem install sinatra
Fetching: rack-1.4.1.gem (100%)
Fetching: rack-protection-1.2.0.gem (100%)
Fetching: sinatra-1.3.2.gem (100%)
Successfully installed rack-1.4.1
Successfully installed rack-protection-1.2.0
Successfully installed sinatra-1.3.2
3 gems installed
Installing ri documentation for rack-1.4.1...
Installing ri documentation for rack-protection-1.2.0...
Installing ri documentation for sinatra-1.3.2...
Installing RDoc documentation for rack-1.4.1...
Installing RDoc documentation for rack-protection-1.2.0...
Installing RDoc documentation for sinatra-1.3.2...

アプリの作成
# myapp.rb
require 'sinatra'
get '/' do
  'Hello world!'
end

Webサーバーの起動
$ ruby -rubygems myapp.rb
[2012-04-02 16:37:45] INFO  WEBrick 1.3.1
[2012-04-02 16:37:45] INFO  ruby 1.9.2 (2011-07-09) [x86_64-linux]
== Sinatra/1.3.2 has taken the stage on 4567 for development with backup from WEBrick
[2012-04-02 16:37:45] INFO  WEBrick::HTTPServer#start: pid=24126 port=4567

アクセス
http://localhost:4567/

2012年3月27日火曜日

MongoDBのReplicaSetsの構築

Primary / Secondary / Arbiter の3台を構築

全3台の定義ファイルを変更
$ sudo vi /etc/mongodb.conf

## ReplicaSetsの名前をつける。のちの設定で使用。
==
replSet = log_rep
==

## 変更後サービスの再起動
$ sudo service mongodb restart

現状のステータス
以降、PrimaryのMongoにアクセスして設定を行う。
> rs.status()
{
        "startupStatus" : 3,
        "info" : "run rs.initiate(...) if not yet done for the set",
        "errmsg" : "can't get local.system.replset config from self or any seed (EMPTYCONFIG)",
        "ok" : 0
}
自分自身の定義
> config = {_id: 'log_rep', members: [{_id: 0, host: '10.20.30.191:27017'}]}  ★定義ファイルで指定した名前が_id部
{
        "_id" : "log_rep",
        "members" : [
                {
                        "_id" : 0,
                        "host" : "10.20.30.191:27017"
                }
        ]
}
初期化
> rs.initiate(config)
{
        "info" : "Config now saved locally.  Should come online in about a minute.",
        "ok" : 1
}
>

初期化完了
> rs.status()
{
        "set" : "log_rep",
        "date" : ISODate("2012-03-23T09:49:38Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "10.20.30.191:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "optime" : {
                                "t" : 1332496142000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-23T09:49:02Z"),
                        "self" : true
                }
        ],
        "ok" : 1
}
SECONDARYの定義追加
PRIMARY> rs.add("10.20.30.192")
{ "ok" : 1 }

PRIMARY> rs.status()
{
        "set" : "log_rep",
        "date" : ISODate("2012-03-23T09:55:43Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "10.20.30.191:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "optime" : {
                                "t" : 1332496301000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-23T09:51:41Z"),
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "10.20.30.192:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",  ★無事SECONDARYになった!
                        "uptime" : 242,
                        "optime" : {
                                "t" : 1332496301000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-23T09:51:41Z"),
                        "lastHeartbeat" : ISODate("2012-03-23T09:55:41Z"),
                        "pingMs" : 0
                }
        ],
        "ok" : 1
}
Secondaryのほうは何もしなくて良い
SECONDARY> rs.status()
{
        "set" : "log_rep",
        "date" : ISODate("2012-03-23T10:01:54Z"),
        "myState" : 2,
        "syncingTo" : "10.20.30.191:27017",
        "members" : [
                {
                        "_id" : 0,
                        "name" : "10.20.30.191:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 604,
                        "optime" : {
                                "t" : 1332496301000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-23T09:51:41Z"),
                        "lastHeartbeat" : ISODate("2012-03-23T10:01:53Z"),
                        "pingMs" : 1
                },
                {
                        "_id" : 1,
                        "name" : "10.20.30.192:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "optime" : {
                                "t" : 1332496301000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-23T09:51:41Z"),
                        "self" : true
                }
        ],
        "ok" : 1
}
Arbiterの設定
Arbiterの設定もPrimaryで行う。
Secondary追加時同様、しばらく待つとできあがる
PRIMARY> rs.addArb("10.20.30.190:27017")

PRIMARY> rs.status()
{
        "set" : "log_rep",
        "date" : ISODate("2012-03-26T08:23:53Z"),
        "myState" : 1,
        "syncingTo" : "10.20.30.192:27017",
        "members" : [
                {
                        "_id" : 0,
                        "name" : "10.20.30.191:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "optime" : {
                                "t" : 1332749742000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-26T08:15:42Z"),
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "10.20.30.192:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 514,
                        "optime" : {
                                "t" : 1332749742000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-26T08:15:42Z"),
                        "lastHeartbeat" : ISODate("2012-03-26T08:23:53Z"),
                        "pingMs" : 1
                },
                {
                        "_id" : 2,
                        "name" : "10.20.30.190:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",  ★ Arbiterが追加されたことを確認
                        "uptime" : 390,
                        "optime" : {
                                "t" : 0,
                                "i" : 0
                        },
                        "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                        "lastHeartbeat" : ISODate("2012-03-26T08:23:53Z"),
                        "pingMs" : 1
                }
        ],
        "ok" : 1
}

Arbiterのほうでmongoに入るとARBITERになってるのが確認できる
ARBITER>

2012年3月26日月曜日

MongoDBのバージョンアップ

実は入れた当初、MongoDBのバージョンが2.03だったので、2.04に更新。

現状のバージョンチェック
$ mongo
MongoDB shell version: 2.0.3
connecting to: test
PRIMARY> exit
bye

バージョンアップ
ここで手動停止しなくても、update時に停止コマンドが発行されている。
$ sudo service mongodb stop  ★ DB停止
 * Stopping database mongodb

$ sudo apt-get install mongodb-10gen  ★ update
… (省略)
mongodb-10gen (2.0.4) を設定しています ...
* Starting database mongodb  ★ DB起動

確認
$ mongo
MongoDB shell version: 2.0.4 
connecting to: test

2012年3月22日木曜日

MongoDBセットアップ(パッケージ編)

こちらを参考
http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages

Ubuntuに入れました。Mongoのバージョンは2.04です。
途中躓きましたが、なんとかできました。

キーの追加
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /etc/apt/secring.gpg --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
gpg: 鍵7F0CEB10をhkpからサーバーkeyserver.ubuntu.comに要求
gpg: 鍵7F0CEB10: 公開鍵“Richard Kreuter <richard@10gen.com>”を読み込みました
gpg: 絶対的に信用する鍵が見つかりません
gpg: 処理数の合計: 1
gpg:               読込み: 1  (RSA: 1)

※ proxy設定をする場合は、--keyserver-option http-proxy=http://10.20.30.40:8000 を追加してあげれば良い。


パッケージインストールに必要な設定(sources.listに定義を追加)
$ sudo vi /etc/apt/sources.list

# 下記を追加
==
deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen
==
インストール
$ sudo apt-get update
$ sudo apt-get install mongodb-10gen


DBの場所の変更
インストールすると同時にMongoDBが実行され、DBが構築される。
不要の場合は、/var/lib/mongodb を削除すれば良い。
※ mongodbを止めてから行う!
$ sudo service mongodb stop


他の場所に作る場合は、定義ファイルを変更する。
MongoDBの生成場所は、 /etc/mongodb.conf  に記載されている。

#dbpath=/var/lib/mongodb  ←DBの場所
#logpath=/var/log/mongodb/mongodb.log ←ログの場所

しかし、、定義を変更しても、DBパスとログパスがうまく読み込まれないので
下記の対応を行った。
## サービスが書かれている場所
$ sudo vi /etc/init.d/mongodb
==
## 88-90行目あたりを変更する。
DAEMONUSER=${DAEMONUSER:-mongodb}  # ログインユーザに変更してみる
DAEMON_OPTS=${DAEMON_OPTS:-"--dbpath $DATA --logpath $LOGFILE run"} # この行が呼ばれるからコメントアウト!
DAEMON_OPTS="$DAEMON_OPTS --config $CONF"
==


ひとまず、これで無事起動しました。
$ sudo service mongodb start
 * Starting database mongodb 

2012年3月9日金曜日

RubyからMySQLにアクセス

MySQLのデータベースに直接アクセスしてデータを抜く方法。
これ以外にももちろんあります!

require 'mysql'
db = Mysql.connect("ホスト", "ログイン名", "パスワード", "DB名")
sql = "select login, firstname, lastname from users;"
rs = db.query(sql)

# 件数
puts rs.num_rows

# 結果の表示
rs.each do |row|
  puts row[0] + " " + row[1] + " " + row[2]
end

db.close

selectで書いた login, firstname, lastnameが、
結果でも0,1,2の順に配列に入っています。

Rubyで配列をソートする方法

ここでは、単一配列、多重配列、昇順、降順についてメモしました。
条件によるソートもあるのですが、それは追々…。

sort
数字
> a = [1,4,2,5,7,3,6,8,9]
=> [1, 4, 2, 5, 7, 3, 6, 8, 9]
> a.sort
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
文字列
> b = ["e","c","a","b","d"]
=> ["e", "c", "a", "b", "d"]
> b.sort
=> ["a", "b", "c", "d", "e"]

sort_by
多重配列
> c = [[2,"b"],[1,"a"],[3,"c"],[2,"a"]]
=> [[2, "b"], [1, "a"], [3, "c"], [2, "a"]]
> c.sort_by{|item| item[0]}
=> [[1, "a"], [2, "b"], [2, "a"], [3, "c"]]
多重ソート
上記の場合だと、同じ値の時、[2, "b"], [2, "a"]になっています。
これを[2, "a"], [2, "b"]2つめもキーにしてソートしたい場合は
配列で順番を指定します。便利!
> c = [[2,"b"],[1,"a"],[3,"c"],[2,"a"]]
=> [[2, "b"], [1, "a"], [3, "c"], [2, "a"]]
> c.sort_by{|item| [item[0],item[1]]}
=> [[1, "a"], [2, "a"], [2, "b"], [3, "c"]]
c.sort でもできるけど、想定通りになるかは…?
> c.sort
=> [[1, "a"], [2, "a"], [2, "b"], [3, "c"]]

降順ソート
単一配列
> a.sort.reverse
=> [9, 8, 7, 6, 5, 4, 3, 2, 1]
> b.sort.reverse
=> ["e", "d", "c", "b", "a"]
多重配列
1項目は降順、2項目は昇順の場合
> c.sort_by{|item| [-item[0], item[1]]}
=> [[3, "c"], [2, "a"], [2, "b"], [1, "a"]]

2012年3月8日木曜日

cronから実行すると文字化け

忘れた頃にハマるのでメモっておきます。

cronからスクリプト等を実行する時は

    export LANG=ja_JP.UTF-8

をcrontabに書いておきましょう!

書かないと、実行した際に日本語が文字化けします。
cronだと環境変数が異なるんですよね。
手動で実行すると大丈夫なのに、cronからだと文字化けする時はまずここをチェック!

2012年3月3日土曜日

AWS Summit 2012 〜2日目〜

土曜日だけど、またもやAWS Summitへお邪魔してきましたー
今日はハンズオン!
EC2、S3、Beanstalkを動かしてみます。


EC2 (後藤さん)
http://www.slideshare.net/kaz.goto/jawsug-summit-ec2

AWSアカウントの作成完了までが事前準備とはいえ、なにやら終わってない人も…
さらにネットワークが遅くて、様々な要因が重なり時間が取られて
EC2でWordpressの起動まで終わらず。
起動は宿題になりましたー。
でも、休憩中に無事終わらせました♪
EC2は過去に1度だけ会社で使ったことがあるけど、
途中からだったので、今回は最初からできて勉強になりました!


S3 (李さん)
S3、CloudFront、IAMをやったのですが、IAMは途中で置いて行かれました(汗)
JSON形式で書く部分が全く分からず…。
でも、S3について権限設定とか分かったので良かったです。

Beanstalk (片山さん)
http://adsj-doc.s3.amazonaws.com/handson/beanstalk/AWS-ElasticBeanstalk-HandsOn-SUMMIT2012.pdf
最初の設定で何か間違えたらしく途中置いて行かれましたが、
最後に無事キャッチアップできました…。
Beanstalkはまだ東京リージョンにないけど、
Javaを使って開発している人にとっては便利かもしれないですね。

#ハンズオンのtogetter
http://togetter.com/li/267074?utm_source=dlvr.it&utm_medium=twitter

#jawsug
http://togetter.com/li/267065

さすがに2日目は迷わず到着したベルサール六本木。

Macのターミナルに色とalias設定


初Macで何が何だか…。
ターミナルを使うのにいろいろ設定したいのだが、
まず下記2点がやりたいのです。

1. ls -l と ls -a のショートカットとしてそれぞれ ll と laを設定したい。
2. ls の時に色を付けたい

起動時に読み込まれる .bash_profile に記載します。
ホームディレクトリ以下に.bash_profileを作成(or 記載を追加)。
$ cd
$ vi .bash_profile

追加する内容
alias ll='ls -l'
alias la='ls -a'
export CLICOLOR=1
export LSCOLORS=DxGxcxdxCxegedabagacad

ターミナルを一旦exitして再度入ればOK!

2012年3月2日金曜日

AWS Summit 2012 〜1日目〜

最初から出るはずが、いろいろ問題があり、
最後の1セッションのみの参加になりました(´・ω・`)
でも、いろいろな出会いもあり楽しかったです☆

印象深かったのは、佐藤さんが話してた下記の内容。
肩書きはデータサイエンティストより、データエンジニアのほうが良い
サイエンティストは成功事例だけを見るけど、
エンジニアは失敗事例も含めて見る。

togetterのまとめはこちら↓
http://togetter.com/li/266608

コミュニティセッション
アンケート回答でいただいたシール(左)とSAMURAIシール(右)♪




2012年3月1日木曜日

Rubyで配列を途中から最後まで取得する方法

配列を途中から最後まで取得したい場合は、「-1」を使います。

irbから見てみましょう。

> x = [1,2,3,4,5,6,7,8,9]
 => [1, 2, 3, 4, 5, 6, 7, 8, 9]
> x[0]   # 0番目
 => 1
> x[1]  # 1番目
 => 2
> x[3..5]  # 3-5番目
 => [4, 5, 6]
> x[3..-1]  # 3番目から最後まで
 => [4, 5, 6, 7, 8, 9]

2012年2月24日金曜日

Ubuntuにユーザの追加

ユーザを追加するには2つの方法があります。
adduser と useradd という紛らわしい名前のコマンド。

adduserのほうは、こんな感じ。
$ sudo adduser tester
ユーザ `tester' を追加しています...
新しいグループ `tester' (1001) を追加しています...
新しいユーザ `tester' (1001) をグループ `tester' に追加しています...
ホームディレクトリ `/home/tester' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しいUNIXパスワードを入力してください:
新しいUNIX パスワードを再入力してください:
passwd: password updated successfully
Changing the user information for tester
Enter the new value, or press ENTER for the default
        Full Name []:
        Room Number []:
        Work Phone []:
        Home Phone []:
        Other []:
Is the information correct? [Y/n] Y

もう片方は/home/testerは生成されません。
$ useradd tester

2012年2月3日金曜日

第2回ビギナー編 JAWS-UG

第2回ビギナー編 AWS User Group - Japan 東京の勉強会へ行って来ました。
http://atnd.org/events/24493

第1回は予定が合わなかったんですよね。
常連の皆さんはご遠慮ください的なことが記載があったけど、
いつも言葉が難しくてついて行けてない(T_T)
そんなこんなでビギナーでお邪魔してきましたー

感想としては、
ビギナー編って、丁寧に説明されて分かりやすいですね♪
EC2は使ったことがあるせいか、とてもわかりやすかったです。

AWS概要 by 玉川さん
http://www.slideshare.net/kentamagawa/aws-11401693


Amazonのビジネス
  • Eコマース
  • マーケットプレイス物流サービス提供(Amazon Services)
  • クラウドコンピューティング(AWS)
概要
  • 写真見せられて、これなんですか?
    • 1800年代につかわれていたもの自家発電機。
    • 現在はワシントン博物館にあるそうです。
  • いつでも必要なだけ安価にがAWSの本質。
    • [電気の工場] - [送電線] - [発電所] の対比として
    • [IT部門] - [インターネット] - [データセンター] がある。
  • 電気に相当するものは何?
    • データが電気に相当する。
  • ITのクラウドへの変化はあと何年で起こるかディスカッションでは、5年以下と考えてる人が多い。
EC2
  • Facebook上で公開してから、トラフィック急増。
  • ECインスタンス(サーバー)数が一気に増える。
  • ピーク時5000サーバー。
  • グラフがジグザグになっているのは必要なときだけ使ってそうじゃないときは落としているということも意味する
  • EC2事例として金融リスクシミュレーション
    • 平日は営業時間内は3000台、平日の営業時間外と週末はサーバーを300台に減らす。
  • クラスターコンピューティングの世界ランキングTOP500のうち42位!
    • スパコンのために作ったスパコンではないのに、42位に入るのはすごいこと。
AWSのサービス
  • CPU、ストレージ、ネットワーク等を提供
  • AmazonRoute 53は名前解決をするサービス。AmazonVPC、他、いろいろ…
  • AWSは従量課金制なので、使いたい分だけ使う。
    • レゴのブロックみたいな感じ。使いたいものだけを使う
事例
  • 国内でも事例が多い。
  • Cookpad、Panasonic、gumi、三井物産、他いろいろなロゴ
  • Social系からWeb系と幅広く使われている
S3
  • データ保持能力は99.99999999999% (11桁の9)
  • Q3/2011では566billionのオブジェクトが保存されている
  • DropboxもS3利用
都市伝説
  • クラウド導入時の考慮点(皆の不安点)
  • 価格、セキュリティ、ネットワーク性能、移行のしやすさ
    • 価格⇒従量課金は見積できる。Simple Monthly Calculator利用。
    • セキュリティ⇒AWSが取得した第三者認証/認定
      • Amazon VPCをつかうことで、「閉域網」でクラウドの利用が可能。
      • 「専用サーバー」 Delicated Instance
      • AWS Direct Connectはクラウドへの「専用線」
    • 移行性 フロントUI,開発言語、OS、どのような組み合わせでもOK
      • 複数のプラットフォームをインポートできる

「操戦術が大事」

S3 by 李さん
  • 書籍紹介にて、新しい本はElastic Map Reduce
  • クラウドストレージ構築ツール
    • Cloud Berryが使いやすい(無料) Proは別途かかる。
  • WebのURLでは何月何日まで有効可能化の設定ができる。
    • 期限が過ぎると自動的に削除される機能もある
  • Cloud Frontを使うとS3のデータをキャッシュすることができる
    • download: ファイル
    • streaming:動画
  • 全体的にCloud Berryを使ったデモが多かった


EC2 by 柳瀬さん(@oko_chang)
http://www.slideshare.net/serverworks/amazon-ec220120203
キーワードとその意味
  • Management Console
    • 管理画面
  • インスタンス
    • 仮想マシン
  • Region 、Availability Zone
    • 地域、場所
  • AMI
    • 仮想マシンイメージ
  • セキュリティグループ
    • ファイアーウォール
  • EBS
    • 仮想ハードディスク
  • EIP
    • 固定IP
  • ELB
    • ロードバランサー
EC2とは
  • すぐに使える、やめられる
  • お金は1時間単位に使った分だけ
  • Webの管理画面から簡単に操作
  • 必要な台数やスペックに変更できる
  • さまざまなシステムを運用できる
セキュリティグループ
  • SSH、HTTPによるアクセス(ufw/iptableみたいなもんかな?)
アクティビティ
  • stop:インスタンスの停止
  • terminate:インスタンス内のデータを完全削除
  • start:stopからの開始
  • reboot:再起動
EBS
  • 仮想の外付けハード。1GB~1TBまで。
  • 同一AZからアクセスが可能。付け替えはできる。
負荷分散
  • インスタンスを元にオリジナルAMIがつくれてしまう
    • 好きな名前を付けられる
  • 一台目と別のAZにて起動
  • ロードバランサを作り、配置するインスタンスを選択

皆のつぶやきはこちら
http://togetter.com/li/251782


以上♪

2012年1月30日月曜日

rvm gemset コマンド

よく使いそうなrvmのgemsetコマンドのメモ

◆一覧表示
rvm gemset list
デフォルトでは、globalが存在する

$ rvm gemset list

gemsets for ruby-1.9.2-p290 (found in /home/tiffany/.rvm/gems/ruby-1.9.2-p290)
   global

◆新規作成
rvm gemset create <gemset_name>

$ rvm gemset create test
'test' gemset created (/home/tiffany/.rvm/gems/ruby-1.9.2-p290@test).
$ rvm gemset list

gemsets for ruby-1.9.2-p290 (found in /home/tiffany/.rvm/gems/ruby-1.9.2-p290)
   global
   test

◆使う
rvm gemset use <gemset_name>
$ rvm gemset use test
$ rvm gemset list

gemsets for ruby-1.9.2-p290 (found in /home/tiffany/.rvm/gems/ruby-1.9.2-p290)
   global
   rails3
=> test

◆名称変更
rvm gemset rename <current_gemset_name> <new_gemset_name>

$ rvm gemset rename test test2
$ rvm gemset list

gemsets for ruby-1.9.2-p290 (found in /home/tiffany/.rvm/gems/ruby-1.9.2-p290)
   global
   test2


◆削除
rvm gemset delete <gemset_name>
本当に削除しても良いのか再確認される

$ rvm gemset delete test2
WARN: Are you SURE you wish to remove the entire gemset directory 'test2' (/home/tiffany/.rvm/gems/ruby-1.9.2-p290@test2)?
(anything other than 'yes' will cancel) > yes
$ rvm gemset list

gemsets for ruby-1.9.2-p290 (found in /home/tiffany/.rvm/gems/ruby-1.9.2-p290)
   global

2012年1月25日水曜日

IT系の女子イベント

IT系女子が集まるイベントへ参加してきましたー。
http://www.atnd.org/events/23538
Twitterのまとめはこちら
http://togetter.com/li/247538

7つの女子部がそれぞれ発表を行なって下さいました。
Twitter+下記のスライドを見ていただければ
だいたい話は分かるので、詳細は割愛〜

感想としては、こんなにもIT女子がいたことにびっくり!
数名とお話をしてみたところ、勉強会へ行ったことがない人も結構いました。
こういう場でいろいろな方とお会いできるのは、良い機会ですね。
発表をいろいろ聞いてみると、発表の勉強にもなります。
今回だけでなく、今まで参加した勉強会でも同じ事を思いました。
聴衆を惹きつけるプレゼンをする人はかっこいいですね♪


MongoDB女子部
昨年末にできたばかりなので、メンバー募集中とのことです。

JAWS-UG クラウド女子会
http://www.slideshare.net/dzeyelid/itvo1

JAZUG女子部
http://www.slideshare.net/joyfulAs/intro-jazuggirls-20120125

iPhone女子部
2万人も部員がいる女子部!(驚)
iPhone女子による人気アプリランキングが面白かった^^

Linux女子部
http://www.slideshare.net/manamitaira/linux-11273653
お子様連れのママさん発表素敵でした♪

Windows女子部
本日できたて!
部長さんはメンバーを知ってるけど、メンバー同士が会うのは初めてだそうです。
UXを実現するための会です。
Expression Blendの話がちらっと。

Android女子部
http://www.slideshare.net/Naokinha/android-dronjo

2012年1月20日金曜日

HTML5の勉強会

HTML5の勉強会へ行って来ました。
タイトルは、
「2012年のHTML5、CSS3、JavaScriptはこうなる~実際のサービス事例で考えるHTML5の近未来」
http://atnd.org/events/23129

申込み数が多くて、多い時はキャンセル待ちが200名超えも!

今回は、株式会社オプト1F大会議室 で行われました。
半蔵門線の神保町駅の改札からは遠かった(^^;
地上出たら目の前だったけど。



さて、内容ですが、HTML5初心者にとっては、難しいことは語れませんので、
簡単に理解したところだけを共有します。

基調講演 HTML5最新動向
株式会社オープンウェブ・テクノロジー 代表 白石俊平氏)
発表資料はこちら↓
http://www.slideshare.net/shumpei/html5-11207810
  • 要素数は108個。30の新要素と14の既存要素の変化。
  • ウェブ全体が大きなデータベースになっている
  • カメラやマイクからの取り込みが可能になってきている
  • WebアプリからEmail、SMS、MMSを送信できるAPIがある
  • パフォーマンスの最適化についても変更はあるが、地味なことが多いので知らなくても良い
  • etc

第1部 HTML5で実現する「世界で一番のマンガ投稿&共有サイト」
スパイシーソフト株式会社 アプリ&マンガゲット事業部 大谷恭仁氏)
  • マンガゲットを知ってますか?の質問に対して、知らない人が多い(私も知らなかった…)
  • マンガゲットは無料で配信して読める漫画共有サイト
  • 漫画をコマで見せるスタイルで、ページモードもあり
  • 深い話としては、アメリカではマンガ市場が少ない。
  • 漫画雑誌は落ち込んできているので、漫画作家、漫画好きが減少してしまう問題あり。
  • 作者はユーザの声から学び、読み手は自分でも書きたくなる。
  • マンガゲットでは、2011年3月に一億閲覧を達成!
  • 2010年の春に漫画閲覧をすべてのデバイスで提供したいことになった
    • すべてのデバイスとは、スマートフォンやパソコン
  • すべてのデバイスに対応するには、個別チューニングをしたり対応をしたりする必要もあったが、大元のコアソースは1つ!
  • システムを準備するだけではユーザが増えるわけでもないので、盛り上げることが必要!
  • ユーザを増やすためにやったこと
    • マンガゲットでは、初めの頃漫画家の卵や専門学校等でプレゼンテーションの機会をもうけ、招待メールを送った。
    • 招待メールがただのスパムにならないように、読んだ漫画の感想も添えた。
    • 開始直後は手厚いサポートを行った(システムを使うのが難しそうな人には、やってあげたりした)

第2部 スマホブラウザゲームのクオリティアップにHTML5あり! 
株式会社フォリフ 代表取締役 熊谷祐二氏)
  • スピード、UI、機能のブラウザで良くない部分はHTML5でカバー
  • WebSocketの活用例
  • Web Storageの使い分け
  • jQuery mobile、jQtouchというものがある
  • Facebookモバイルアプリの本格化
  • HTML5のリッチコンテンツ化

第3部 JavaScriptエンジニア向け!スマートフォンで動くブラウザゲームの作り方 
面白法人カヤック 技術部 吾郷協氏)
http://0-9.sakura.ne.jp/pub/lt/html5semi/start.html
  • JSerでチケット管理
  • ワークフローについてのお話
  • Androidは現代のIE。Androidベースで作った後にiOS対応をしたほうが楽
  • 詳細は、資料を読んだほうが早いです…(^^;

第4部 懇親会
ピザとドリンク等が用意されてました。
懇親会まで出たのは半分くらいの方かな?


皆さんのTweetのまとめはこちら↓
http://togetter.com/li/244470

感想
話についていくには、HTML5を使いこなさないとなぁと思いました(^^;
そもそも今どんな機能があるのかも分からないのに、こんなことができるようになりましたと言われてもピンとこないのが正直な所です。
つたない文章で失礼しました。。。

2012年1月18日水曜日

MongoDBのRubyドライバー

MongoDBのRubyドライバーのgemのインストールについてのメモです。
下記ではrvmを用いてます。
$ rvm gem use 1.9.2
$ rvm gemset use rails3
$ gem install mongo
Fetching: bson-1.5.2.gem (100%)
Fetching: mongo-1.5.2.gem (100%)
Successfully installed bson-1.5.2
Successfully installed mongo-1.5.2
2 gems installed

Installing ri documentation for bson-1.5.2...
Installing ri documentation for mongo-1.5.2...
Installing RDoc documentation for bson-1.5.2...
Installing RDoc documentation for mongo-1.5.2...

$ gem list --local

bson (1.5.2)
mongo (1.5.2)
 いざ、実行してみると
require 'mongo'
db = Mongo::Connection.new.db("test")
こんなエラー…。 gemが足りないようです。

$ ruby mongo_test.rb
**Notice: C extension not loaded. This is required for optimum MongoDB Ruby driver performance.
  You can install the extension as follows:
  gem install bson_ext
  If you continue to receive this message after installing, make sure that the
  bson_ext gem is in your load path and that the bson_ext and mongo gems are of the same version.

下記を入れたら、無事実行できました!
$ gem install bson_ext
Fetching: bson_ext-1.5.2.gem (100%)
Building native extensions.  This could take a while...
Successfully installed bson_ext-1.5.2
1 gem installed

Installing ri documentation for bson_ext-1.5.2...
Installing RDoc documentation for bson_ext-1.5.2...
$ gem list --local
bson (1.5.2)
bson_ext (1.5.2)
mongo (1.5.2)

下記を見たら、もしかしたらbson_extだけで良かったのかも
http://api.mongodb.org/ruby/current/file.TUTORIAL.html

2012年1月17日火曜日

"unable to resolve host ..."って何?

この概要は表示できません。投稿を閲覧するには ここをクリック してください。

2012年1月16日月曜日

はじめてのMongoDB

はじめてのMongoDB

参考にしたサイト

ダウンロード

現時点の86x64のバージョンでは、2.0.2が最新なので、下記をダウンロード。
$ wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.2.tgz
$ tar -xvzf mongodb-linux-x86_64-2.0.2.tgz
$ mkdir ~/mongo_test
$ mv mongodb-linux-x86_64-2.0.2 mongodb
$ pwd
/home/tiffany/mongodb/bin
$ ./mongod --dbpath ~/mongo_test/
Tue Dec 27 14:58:02 [initandlisten] MongoDB starting : pid=382 port=27017 dbpath=/home/tiffany/mongo_test/ 64-bit host=redmine-rvm
Tue Dec 27 14:58:02 [initandlisten] db version v2.0.2, pdfile version 4.5
Tue Dec 27 14:58:02 [initandlisten] git version: 514b122d308928517f5841888ceaa4246a7f18e3
Tue Dec 27 14:58:02 [initandlisten] build info: Linux bs-linux64.10gen.cc 2.6.21.7-2.ec2.v1.2.fc8xen #1 SMP Fri Nov 20 17:48:28 EST 2009 x86_64 BOOST_LIB_VERSION=1_41
Tue Dec 27 14:58:02 [initandlisten] options: { dbpath: "/home/tiffany/mongo_test/" }
Tue Dec 27 14:58:02 [initandlisten] journal dir=/home/tiffany/mongo_test/journal
Tue Dec 27 14:58:02 [initandlisten] recover : no journal files present, no recovery needed
Tue Dec 27 14:58:04 [initandlisten] preallocateIsFaster=true 27.82
Tue Dec 27 14:58:05 [initandlisten] preallocateIsFaster=true 22.32
Tue Dec 27 14:58:08 [initandlisten] preallocateIsFaster=true 23.08
Tue Dec 27 14:58:08 [initandlisten] preallocateIsFaster check took 6.006 secs
Tue Dec 27 14:58:08 [initandlisten] preallocating a journal file /home/tiffany/mongo_test/journal/prealloc.0
                115343360/1073741824    10%
                136314880/1073741824    12%
                (... 初回は長い)
                1017118720/1073741824   94%
                1059061760/1073741824   98%
Tue Dec 27 15:00:26 [initandlisten] preallocating a journal file /home/tiffany/mongo_test/journal/prealloc.1
                62914560/1073741824     5%
                94371840/1073741824     8%
                (... 初回は長い)
                996147200/1073741824    92%
                1059061760/1073741824   98%
Tue Dec 27 15:02:20 [initandlisten] preallocating a journal file /home/tiffany/mongo_test/journal/prealloc.2
                62914560/1073741824     5%
                136314880/1073741824    12%
                (... 初回は長い)
                996147200/1073741824    92%
                1038090240/1073741824   96%
Tue Dec 27 15:03:51 [websvr] admin web console waiting for connections on port 28017
Tue Dec 27 15:03:51 [initandlisten] waiting for connections on port 27017
Tue Dec 27 15:04:51 [clientcursormon] mem (MB) res:15 virt:100 mapped:0
mongoコンソール画面からアクセス
~/mongodb/bin$ ./mongo
MongoDB shell version: 2.0.2
connecting to: test
> show dbs
local   (empty)
> show collections
> db.users.save({name:"admin"})
> show dbs
local   (empty)
test    0.203125GB
> show collections
system.indexes
users
> db.users.find()
{ "_id" : ObjectId("4f0be472f1c128e1d88d7fa7"), "name" : "admin" }

データベースの作り方
インサート時に存在しなければ、自動的に作成してくれます。
上記のコレクションも同様です。
これにはビックリ!
便利だけど、ちょっと入力し間違えると存在しませんエラーが出ないので、違うデータベースやコレクションにインサートされてしまいますね。注意が必要そうです。
> show dbs
local   1.203125GB
test    0.203125GB

> use mydb
switched to db mydb

> show dbs
local   1.203125GB
test    0.203125GB

この時点ではまだmydbは生成されていません。
show collectionsしてみましょう。
> show collections
> show dbs
local   1.203125GB
mydb    (empty)
test    0.203125GB
生成されました!


データベースの削除
削除対象のデータベースに入り、 db.dropDatabase()を実行。
> show dbs
local   1.203125GB
mydb    (empty)
test    0.203125GB

> use mydb
switched to db mydb

> db.dropDatabase()
{ "dropped" : "mydb", "ok" : 1 }

> show dbs
local   1.203125GB
test    0.203125GB
削除されたことが確認できました。