2010年07月30日

Ruby on Rail With PostgreSQL countで重複を除く

countで重複を除くとは?


まぁそのままですがrailsとpostgresでcountするときに重複を除く方法です。

環境


rails1.2.6
postgresql8.4.4
table1
user_id
-----
1
2
1

PostgreSQLでの使用方法


SELECT count(*) FROM table1;
=> 3
SELECT count(DISTINCT user_id) FROM table1;
=> 2


Ruby on Railsでの使用方法


Hoge.count
=> 3
Hoge.count(:user_id, :distinct => true)
=> 2
posted by RicK at 19:50| Comment(0) | TrackBack(0) | 日記

2010年07月28日

Ruby on Rails form_tagでmethodをgetにする

methodをgetとは?


通常formを使用するとpost送信になります。
しかし、たまにgetではないとダメな気もあります。

環境


rails1.2.6
app/views/hoge/hoge.rhtml

使用方法


$ vi hoge.rhtml
<% form_tag({:action=> 'boge'}, {:method => 'get'}) do %>
・・・
<% end %>

これでデータの引き渡し方法をgetへかえてくれます。
posted by RicK at 17:30| Comment(0) | TrackBack(0) | 日記

2010年07月22日

Ruby on Rails 行と列を意識したCSV出力

行と列を意識したCSV出力とは?


通常のcsv出力は1カラムが1行として出力するのが普通ですが、
例えば、クイズが1〜3の3種類あったとしてそれを
一つずつ列にして、なおかつ行に日付にします。
つまり
期間 クイズ1 クイズ2 クイズ3
5/1 title title title
5/2 title title title
5/3 title title title

このような形のcsv出力をしたいという訳です。
テーブルのカラムは
id,quiz,type,created_at

といったところです。
日付でGROUP BYなどして出力しても
期間 クイズ種類 title
5/1 クイズ1 title
5/2 クイズ2 title
5/3 クイズ3 title

このようにクイズの種類ごとに並べることはできません。

環境


rails1.2.6
table1
app/controllers/csv_controller.rb

使用方法


結構なごり押しな感じな書き方ではありますが、
2重配列を作成して吐き出す方法をとりました。
$ vi csv_controller.rb
class CsvController < ApplicationController
 def csv
  require 'csv'
  @csv = []
  start_date = Date.parse(params[:start])
  end_date = Date.parse(params[:start])
  date = end_date - start_date
  // 日付の開始と終わりのデータを取ってきています(このviewは省略)
  p_date = date.to_i + 1
  i = 0
  p_date.times do
   end_date = start_date + i
   type1 = Table1.type_titel(1, end_date)
   type2 = Table1.type_titel(2, end_date)
   type3 = Table1.type_titel(3, end_date)
   // 日付とクイズの種類を指定してデータを取り出す処理(省略)
   @csv << [end_date, type1.title, type2.title, type3.title]
   i += 1   
  end
  // これで@csvに2重配列となり、日付とそれぞれのクイズのタイトルが入ります。
  
  headers["Content-Type"] ||= "text/csv"
  headers[""Content-Disposition] ||= "attachment; filename=\hoge\"
  csv_string = FasterCSV.generate do |csv|
   csv << ["期間", "クイズ1", "クイズ2", "クイズ3"]
   // 列の名前
   @csv.each do |a_csv|
    csv << a_csv
    // ここで行を入れる
   end
  end
  render :text => csv_string.tosjis
 end
end
posted by RicK at 16:05| Comment(0) | TrackBack(0) | 日記

2010年07月20日

Postgres 曖昧join

曖昧joinとは?


曖昧といってもjoinのid=idがid=hogeでもいいとかではなく
created_at=created_atとする場合
2010-07-19 12:38:33.960312と2010-07-19 12:37:53.012715で
日付で紐付けたいが、時間が邪魔でひもづかない場合などの曖昧です。

環境


PostgreSQL8.4.4
tabe1
table2

使用方法


psql -U hoge hoge
SELECT * FROM table1 LEFT JOIN table2 ON to_char(table1.created_at, 'YYYY/MM/DD') = to_char(table2.created_at, 'YYYY/MM/DD')

このようにto_charでフォーマットを整えてあげれば、
時間を無視して、同じ日付で紐付けることが可能です。
posted by RicK at 16:32| Comment(0) | TrackBack(0) | 日記

2010年07月15日

アンドロイドアプリ作成 for Mac

流れ
環境設定構築からHello World表示まで

環境


Mac10.5 MacBookPro

アンドロイド開発環境の取得と設定



上記からMac OS X用をdownload
解凍後、Applicationフォルダに入れる。
$ vi ~/.bash_profile
export PATH=$PATH:/Applications/android-sdk-mac_86/tools

上記PATH追加

eclipseの取得



からEclipse IDE for Java Developersをdownload
解凍後、Applicationにフォルダごと入れる。

ADTのPlugin install


1. Eclipseを起動して, Helpメニューから Install New Software を選択
2. Available Software ダイアログが表示されたら、[Add....] をクリックする。
3. Add Site dialog が表示されたら、リモートサイトの名前をNameフィールドに入力する(”Android Plugin” みたいな感じに)。
Locationフィールドには以下の URLを入力する。
https://dl-ssl.google.com/android/eclipse/
注意:もし上手くいかなかったら”https”を”http”にかえて試してみる。
[OK] をクリックする。
4. Available Software ダイアログに戻ると、リスト上に”Developer Tools”という上が追加されているはず。
この行のチェックボックスをチェックすることで、これ以下の階層にある Android DDMS とAndroid Development Tools もチェックされる。 [Next] をクリックする。
5. インストール実行され、結果が Install Details dialogに表示される。 Android DDMS と Android Development Tools がリストされているはず。 [Next] をクリックして使用許諾に合意し、[Finish]をクリック。インストール処理が開始される。
 途中で警告が出たが、気にせずおk
6. Eclipseを再起動する。

パッケージのinstall


$ android

上記コマンドでandroidが起動
Available Packages選択、urlタグクリックしたら、自分の場合
No suitable XML schema validator could be found in your Java environment. Please update your version of java

エラー発生。

にてjava for Mac OS X 10.5 pdate 5をdownloadしてinstallすれば解決。
再度urlクリックで、プラグインがいろいろ表示される。
すべてにチェックをつけてinstall Selectedを押す。

仮想でバイスの作成


$ android list target

これでどのversionのアンドロイドにあわせて作るかみる
$ android create avd -n 名前 -t 上で決めたid(3とか)

Android 1.6 is a basic Android platform.
Do you wish to create a custom hardware profile [no]
と確認を求めてきます。これは「アンドロイド1.6のプラットフォームで仮想デバイスを作ります、良いですか?」という意味ですので、そのまま Enterを入力します。
Created AVD ‘android’ based on Android 1.6, with the following hardware config:
hw.lcd.density=160
とメッセージが表示されれば、仮想デバイスの作成は終了です。

パス指定


eclipseの環境設定でAndroidのSDK Location:にandroid--sdk-mac_86のパスを記述

実行


eclipseのRunからRun ASでAndroiod Applicationを選択
Androidが実行されてしばらく待っているとHello World, HelloAndroid!が表示されます。

なぜなにも書いてないのにHelloWorldが表示されるかは、次のアンドロイド説明時にします。
posted by RicK at 16:08| Comment(0) | TrackBack(0) | 日記

2010年07月13日

Ruby 配列(Array) 生成

配列とは?


以前参照

今回は、配列の生成について

環境


ruby1.8.6
irb

生成方法


$ irb
Array[1,2,3]
=> [1,2,3]

Array以外でやるとエラーなので注意
$ irb
Bay[1,2,3]
NameError: uninitialized constant Bay
from (irb):3


$ irb
Array.new(5,3)
=>[3,3,3,3,3]

配列5つ分作成、中身は第2引数

$ irb
Array.new(3){|i| i}
=>[0,1,2]

配列3つ作成、中身はブロック

$ irb
array = []
array
=>[]

これが一番楽ですかね。

$ irb
array = [1,2,3]
array
=>[1,2,3]
posted by RicK at 14:53| Comment(0) | TrackBack(0) | 日記

2010年07月08日

Mac install Rails

前回の続き

Railsのinstall


Leoperdは、最初からrubyとrailsが入っているので、
とりあえず、なにが足りないかプロジェクトを起動して確認します。
$ ruby script/server
no such file to load -- postgres (MissingSourceFile)

ruby用のpostgres入れないとですね。
$ sudo gem install postgres
gem could not find postgres locally or in a repository

???ない??じゃぁ
$ sudo gem install postgres-pr
gem could not find postgres-pr locally or in a repository

gemが悪いっぽいかなぁ
$ sudo gem update --system
$ sudo gem install postgres

なんか入んないや
$ sudo gem install postgres-pr

まぁこれでいいか、といことで入りました。
$ ruby script/server
no such file to load -- RMagick (MissingSourceFile)

Mac Portからいれます。
http://svn.macosforge.org/repository/macports/downloads/
こっから最新を落としてきて、インストーラーなので手順に従ってインストール
パスが自動で追加されるので
$ source ~/.bash_profile

を忘れずに。
んでportのupdate
$ sudo port -d selfupdate


さて、Rmagick入れましょ
$ sudo port -d sync
$ sudo port install ImageMagick
$ sudo port install rb-rmagick
$ ruby script/server
no such file to load -- rubygems (LoadError)

$ sudo port install rb-rubygems

・・・rb-rubygemsのinstall、これは、、やんない方がいいかもw
理由は、rubyとgemがなんだか新しいのはいってるっぽいw
/usr/local/bin/rubyや/usr/local/bin/gemを先に見に行っちゃって
/usr/bin/rubyと/usr/bin/gemを見に行かなくなっちゃたw

まぁ、、やっちゃったもんはしょうがないから、シンボリックリンクでもしますか
$ su -
$ cd /usr/local/bin
$ ln -s /usr/bin/ruby
$ ln -s /usr/bin/gem

うし、戻った。
$ ruby script/server
/Library/Ruby/Site/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- gruff (MissingSourceFile)
$ gem install gruff

これ、無駄に悩みましたw
Rmagick関係かなぁ?とか思って
no such file to load -- gruff

とかで検索してもほとんどないし英語だしとかでよくわかんなかったんですが、
$ sudo gem install gruff

これだけでおkですw
$ ruby script/server


お〜やっとちゃんと起動した。
なんやらよけいなこともしちゃったけど、まぁおkでしょ。
posted by RicK at 12:31| Comment(0) | TrackBack(0) | 日記

2010年07月07日

Mac install PostgreSQL

仕事用のmacが壊れたので、軽く環境設定の話

環境


MacBookPro
Mac OS X 10.5.8

PostgreSQLのinstall


そのためにReadlineのinstall
そのためにgccのinstallが必要

macのサイトからXcodeを落としてきてインストール

Readlineのinstall
$ curl -O ftp://ftp.gnu.org/gnu/readline/readline-5.1.tar.gz
$ tar xzvf readline-5.1.tar.gz
$ cd readline-5.1
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
// なんか足りないとか出るけどきにしない


PostgresのInstal
Postgresのサイトから最新を落としてくる
$ ./configure --with-includes=/usr/local/include/readline -prefix=/usr/local/
$ make
$ sudo make install


postgresアカウント作成
$ su -
$ mkdir /usr/local/pgsql/data
$ chown postgres /usr/local/pgsql/data
$ su - postgres
$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
$ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
posted by RicK at 18:42| Comment(0) | TrackBack(0) | 日記

2010年07月05日

Ruby 正規表現のオプション

正規表現とは?


以前の内容をごらんください。

環境


ruby1.8.6
irb

オプション


i:大文字小文字の区別をしない
$ irb
/ruby/ =~ "Ruby"
=> nil
/ruby/i =~ "Ruby"
=> 0


o:一番最初に正規表現の評価が行われた時に一度だけ式展開され、同じ正規表現オブジェクトを返すようになります。
これは、ちょっと難しいです。
$ irb
a=["a","b","c"]
a.each do |x|
 if /\w/o =~ x
  puts x
 end
end
=> a
b
c

#流れ的にaだけが展開されてbcは無視されるんじゃぁないの?と言った感じですが、違います。
a=["a","b","c"]
a.each do |x|
 if /#{x}/ =~ x
  puts x
 end
end
=> a

これだとaのみ展開されます。
つまり、「一番最初に正規表現の評価が行われた時に一度だけ式展開され」これは、
//この正規表現を書く場所が一度展開されたら変わらないということです。
上記の1つ目は、\wという正規表現で変わらないため、全て表示されました。
一方2つ目は、a,b,cというように正規表現が変わろうとしたが、
oオプションにより最初のaしか式を展開しないため、
if /a/ =~ a
if /a/ =~ b
if /a/ =~ c

と言った具合に式が展開されたという事です。
これがオプションoです。
ほとんど使う事はないと思いますけどね。

x:正規表現中の空白や改行、コメントアウトを無視します。
$ irb
/foo # コメント
bar/x

これは/foobar/と同じ意味の正規表現です。

m:.が改行にもマッチする様になります。
$ irb
/a.c/ =~ "a\nc"
=> nil
/a.c/m =~ "a\nc"
=> 0


※ちなみに返ってくる値が0なのはindex0の場所がマッチしているという事です。

%r:/を勝手にエスケープしれくれます。
$ irb
%r|a/b/c|
=> /a\/b\/c/


$&:マッチした値を取り出します。
$`:マッチした前の値を取り出します。
$':マッチした後の値を取り出します。
$ irb
/b/ =~ "aabcc"
$&
=> "b"
$`
=%gt; "cc"
$'
=> "aa"
posted by RicK at 15:41| Comment(0) | TrackBack(0) | 日記

2010年07月01日

Ruby 文字列の配列化と配列からの文字列化

配列とは?


[1,2,3]こゆのです

環境


ruby1.8.6
irb

文字列から配列化


$ irb
hoge = "愛知,静岡,神奈川"
hoge.split(",")
=> ["愛知","静岡","神奈川"]
hoge
=> "愛知、静岡、神奈川"

文字列中の","を区切りとして配列を作成します。
区切りたい文字はsplitの引数に書けば","でなくても問題有りません。

配列から文字列化


$ irb
hoge = ["愛知","静岡","神奈川"]
hoge.join(",")
=> "愛知,静岡,神奈川"
hoge
=> ["愛知","静岡","神奈川"]

配列の各要素ごとを","によって区切り文字列として表示します。
区切りたい文字はjoinの引数に書けば","でなくても問題有りません。
posted by RicK at 15:48| Comment(0) | TrackBack(0) | 日記