2007年10月24日水曜日

今日も認証

大文字で始まるメソッドの呼び出し

Module モジュールのクラス。


−−−−−−−−−−−
■ ログイン要求/判別 

class HogeController
include AutheticatedSystem
before_filter :login_required
....
end

これだけである。
これで、HogeController配下のアクションでは全てログインが必要となる。
未ログイン状態でアクセスすると/account/loginにリダイレクトされ、
そこでログインすると元のアクションに戻ってくる。
−−−−−−−−−−−−

とのことだけど、
AccountController・SchedulesController・ApplicationControllerの
3つとも指定しましたが・・・全然ログインを求められません。
キャッシュでも残っているのかな?と思い、
キャッシュの消去もしてみましたが;;
ただ、http://localhost:3000/ や
http://localhost:3000/account/ などのアクセスがlogin画面になっているのは・・・・
/config/routes.rbの中で下記のように指定したからですね。

map.connect '', :controller => 'account', :action => 'login'
map.connect '/account/', :controller => 'account', :action => 'login'
map.connect '/schedules/', :controller => 'account', :action => 'login'

同じ内容を3行って・・・
ApplicationControllerでbefore_filterが効けば必要ないのかな?

● 継承時の Filter

>コントローラを継承している場合、親クラスのコントローラで定義された
>Filter が先に実行されます。
>また、Filter を評価した値(戻り値)が false である場合、
>その時点で Filter の適用は停止され、以降の Filter は実行されません。
>(これは継承とは無関係に Filter の特徴です)

うーなぜfilterがかからないのか
全然分からない・・・・なにがいけないんだぁ

● routes

同じ内容3行でも良さそう。
でも、認証させたいコントローラーが多くなったらどうするのだろう?

例えば
map.connect '/:controller/', :controller => 'account', :action => 'login'
など、色々当てずっぽうに入れて為してみましたが、

http://localhost:3000/schedules/ にアクセスすると

<エラー文> Unknown action
No action responded to login

となってしまいます。
たぶん、schedulesにloginなんてアクション無いぞ。と言われている。

どんな処理でエラーになっているか?

Processing SchedulesController#login
Parameters: {"action"=>"login", "controller"=>"schedules"}

ここが気になりますね。SchedulesControllerのloginにparamを
持っていってますね。やはり。

しかし、http://localhost:3000/account/ にアクセスすると・・・

Processing ApplicationController#index
Parameters: {}

login画面が表示されるし、ApplicationControllerにプロセスしてる!
んんーーーー? これは、actionメソッドが同じだからぽい。

Processing SchedulesController#month
Parameters: {"action"=>"month", "controller"=>"schedules"}

でも、ApplicationControllerにはプロセスしていない。

あー分からないので、とりあえず進んでいきます。
urlではaction名を指定すればログイン無しで入れます!

・・・・・・・

★明日-最終日-の課題★

1.スケジュール新規登録でファイル添付をしていないとエラーが出るのを直す
<エラー文> NoMethodError in SchedulesController#create
undefined method `original_filename' for "":String
app/controllers/schedules_controller.rb:102:in `set_file_name'

2.認証・・・


明日は、今までの振り返りプレゼンをして、
残り時間で上記の課題をやろうと思います。

2007年10月23日火曜日

signup画面

さて。サインアップ画面のカスタマイズです。
acts_as_authenticatedで作ってくれるsignup.rhtmlの中は下記のように
書いてあります。
<%= error_messages_for :user %>
<% form_for :user do |f| -%>
<label for="login">name
<%= f.text_field :login %>



で、今回新規登録にもプルダウンで部署を選択できるようにするために
collection_selectで書いたのが、以下。
<label for="group_id">部署
<%= collection_select(:groups, :id, @groups, :id, :name) %>


これでは、:userに放りこまれてません。
頭に「f.」を付ければ良い・・・わけありませんでした。


f.を頭に付けてみると、
<エラー文>undefined method `merge' for :name:Symbol と言われます。

---------------------

signup.rhtmlと_userForm.rhtmlの中身が同じような感じなのがよく分からない。
webブラウザに生成されたhtmlをみてみると、_userForm.rhtmlに書かれている

<!--[form:user]-->
<!-- all custom fields here -->

<label for="group_id">所属グループ
<select id="user_group_id" name="groups[id]">
<option value="1" selected="selected">総務
<option value="2">営業
<option value="3">開発
のコメントが入っている。んーどこからどう調べていったら良いのか・・・
signup.rhtmlの頭に書いてある<% form_for :user do |f| -%>と
_userForm.rhtmlの頭の<!--[form:user]-->
これは、signup.rhtmlも_userForm.rhtmlも:userモデルを・・・なんだろう?
どういう意味なのかな??

*** :userモデル回りに関するformということだそうです ***

---------------------

<%= collection_select(:groups, :id, @groups, :id, :name) %>
ここに大きな間違えが!
<select id="user_group_id" name="groups[id]">
ここにも大きな間違えが起こってました。

<%= collection_select(:user, :group_id, @groups, :id, :name) %>
とすれば
<select id="user_group_id" name="user[group_id]">となって、
新規登録で、DBにも部署名(group_id)が登録できました。

さてさてあと2日・・・
最悪、エラーが出ないようにしたい・・・・汗

やっぱりRubyを一通り勉強しないと、カスタマイズは出来ないなぁ。


■ Ruby on Rails を使ってひとりでサービスを作ってみよう

■ パーミッション(所有権)の変更 linux

■ Module ActionView::Helpers::FormOptionsHelper

2007年10月22日月曜日

collection_selectとユーザ一覧

新規ユーザーの登録でも部署名をプルダウンで選択させたい。

collection_select()
selectのなかでHashかArraysを使う

例:select (:artists, :name, @deadArtists)
は@deadArtistsにある全ての芸術家のドロップダウンリストを生成する。
deadArtistは値が@artists.nameに一致するか、それぞれチェックされる。
一致した場合、その芸術家が選択された状態のドロップダウンが生成される。



[/account_controller.rb]
def signup
@groups = Group.find(:all)
@user = User.new(params[:user])
return unless request.post?
@user.save!
self.current_user = @user
redirect_back_or_default(:controller => '/account', :action => 'list_group')
flash[:notice] = "Thanks for signing up!"
rescue ActiveRecord::RecordInvalid
render :action => 'index'
end



[signup.rhtml]

<label for="group_id">部署</label>
<%= collection_select(:groups, :group_id, @groups) %>





query文
Group Load (0.001989) SELECT * FROM groups



クエリはあっているようだけど

<エラー文> wrong number of arguments (3 for 5)

5個のとこが3個しかないっていわれてる?
だとすれば。。。プルダウンに入る値の設定かな?



<%= collection_select(:groups, :group_id, @groups, :id, :name) %>


<エラー文> undefined method `group_id' for #




そりゃそうだった!groups DBには :id と :name の2項目しかありません。



<%= collection_select(:groups, :id, @groups, :id, :name) %>



おお!ちゃんとプルダウンで部署名が表れました。

新規ユーザー登録してみると・・・(まだgroup_idのDBへの登録は設定してない)
あ。やっぱりどのグループにも登録されてない。
が、登録したユーザーでのログインは出来ました。
とりあえず、ユーザー一覧も作っておこう。・・・としたら、
上で書いている『どのグループにも登録されてない』おかげで
うまいこと表示されず、またまた遠回りをしてしまいましたが、
日に日に「ピン!」と来る回数は増えたのですが、
debugが上手に出来ず小さなミスで右往左往している気がします。

明日は、やりかけた、acts_as_authenticatedとは
で勉強しつつ、
authenticatedに無い新しい項目のDB登録を完成させたいです。

2007年10月19日金曜日

Viewとにらめっこ

今日はViewについてさらに深く勉強して、
DBの関連についてもやっと「なるほど!」と分かった。
contorollerをさわり、AとBとCのデータベースにそれぞれに登録されている
学生名とか学校名とか出身地をViewにならべて表示出来た!

さて、週明けにこれを仕上げるぞ〜〜

早いもので週明けからはたった4日でOJTが終わります。
ん〜本当に早い!



Listing students





<% for column in Student.content_columns %>

<% end %>

-----------------------------------
 カラム名が入る
-----------------------------------
 ■Studentとは

 [student.rb]

 class Student < ActiveRecord::Base
 belongs_to :school
 has_one :profile
 end

 ■.content_columns()とは
 "_id" または "_count" で終わる全カラム、
 つまりプライマリ id と、単一テーブル継承に
 使用されるカラムを全て取り除いた
 カラムオブジェクトの配列を返します。
 
 ■obj.human_name
  英単語の頭を大文字に変換する。
  日本語の場合不要。
-----------------------------------

<% for student in @students %>
-----------------------------------
 ■@studentsとは

 [ students_controller.rb ]

 def list
  @student_pages, @students =
paginate :students, :per_page => 10
 end
 
 ▽paginate collection_id, options={}

「ページ管理オブジェクト」,「オプションで指定した個数のインスタンスが入ってる」=
paginate「第一引数 ARモデル(モデルクラスの複数形/対象とするテーブル名)」,「オプション」
-----------------------------------

<% for column in Student.content_columns %>


-----------------------------------
 DBの中に入っている値が出る。
-----------------------------------
 ■send(name[, args ... ])
  オブジェクトのメソッド name を、引数に args を渡して呼び出し、
  メソッドの実行結果を返します。
  ブロック付きで呼ばれたときはブロックもそのまま引き渡します。
  メソッド名 name は文字列かSymbol です。
 
 ■obj.name
  オブジェクトのnameを返す。
-----------------------------------
<% end %>





<% end %>
<%= column.human_name %>
<%=h student.send(column.name) %> <%= link_to 'Show', :action => 'show', :id => student %> <%= link_to 'Edit', :action => 'edit', :id => student %> <%= link_to 'Destroy', { :action => 'destroy', :id => student },
:confirm => 'Are you sure?', :method => :post %>



■ update(id, attributes)

update は、複数のカラムを更新し、save します。

update は find(id) して得られる AR オブジェクトに対して update_attributes(attributes) を行います。 update_attributes(attributes) は self.attributes = attributes して save します。戻り値は save の戻り値です。

2007年10月18日木曜日

データベースの関連について

今日は、一日関連について勉強してましたが、
schoolデータベースと関連付けたはずの
students データベースのschool_idカラムがなぜかnilのまま!

id | name |school_id
1 | 田中 | nil
2 | 中田 | nil
3 | 山田 | nil

と、イライラ〜としながらRailsで作るAjax住所録のサンプルソースなんかを
取り込んでいじってみたりしてましたが、
またしても完全な思い込み・・・・
関連づけても、school_idは自動で入ってくれるわけではないのですね。
ん〜 どうして思い込むのだろう?

また、基本をすっ飛ばして触り始めたRailsだったので、
今日初めて .rhtml の中身をじっくり見てみました。
なんだかすこしずつ頭の中の「?」がほどけていってる気がします。
まだまだ「?」多いですけど。



SQLiteで間違えてカラムを追加しちゃった場合。
SQLite−カラムの削除方法。

テーブルそのものの操作方法(テーブル名変更・列の増減など)



sqlite> ALTER TABLE schools ADD COLUMN school_id integer;
sqlite> select * from schools;
id|name|school_id
1|工学院|

sqlite> select * from students;
id|name|school_id
1|01|
2|02|
3|山田|


sqlite> BEGIN TRANSACTION;
sqlite> CREATE TEMPORARY TABLE schools_backup(id,name);
sqlite> INSERT INTO schools_backup SELECT id,name FROM schools;
sqlite> DROP TABLE schools;
sqlite> CREATE TABLE schools(id,name);
sqlite> INSERT INTO schools SELECT id,name FROM schools_backup;
sqlite> select * from schools;
id|name
1|工学院
sqlite> DROP TABLE schools_backup;
sqlite> commit;


2007年10月17日水曜日

関連について

今日は、「Ruby on Rails 入門 -優しいRailsの育て方 」 p83〜 を勉強。
「1:多」の関連までやったところで、昨日から痛めている首が辛くなってしまい、
腰までひびいてきたので、早退をさせてもらいます。

すみません。

2007年10月16日火曜日

Aptanaでacts_as_authenticated

acts_as_authenticatedを分かる範囲で調べたところ
script/generate authenticated user account してからmigrateする。
と書いてあるけど、今回は「user」というモデルと「account」という
コントローラーが既にあるので、プラグインすることで
今まで作ったファイルが上書きされちゃわないかの確認。

「実際には変更しない = -p, --pretend」オプションで走らせてみる。
/*Aptanaの「Generator」ではうまく動かなかったので、プロンプトで
script/generate authenticated user account を実行*/

overwrite app/models/user.rb? [Ynaqd]
overwrite app/controllers/account_controller.rb? [Ynaqd]
overwrite test/functional/account_controller_test.rb? [Ynaqd]
overwrite app/helpers/account_helper.rb? [Ynaqd]
overwrite test/unit/user_test.rb? [Ynaqd]
overwrite test/fixtures/users.yml? [Ynaqd]

計6つのファイルが上書きされてしまう模様なので、
別フォルダを作って上記6つのファイルを移動させておく。

-pオプションなしで実行。




exists app/models/
exists app/controllers/
exists app/helpers/
exists app/views/account
exists test/functional/
exists test/unit/
create app/models/user.rb
create app/controllers/account_controller.rb
identical lib/authenticated_system.rb
identical lib/authenticated_test_helper.rb
create test/functional/account_controller_test.rb
create app/helpers/account_helper.rb
create test/unit/user_test.rb
create test/fixtures/users.yml
identical app/views/account/index.rhtml
identical app/views/account/login.rhtml
identical app/views/account/signup.rhtml
exists db/migrate
Another migration is already named create_users: db/migrate/004_create_users.rb




で、できた。が。んん?見落としていたけど、最後の行は−pの時も出ていた。
User modelを作った時に出来たmigrateスクリプトも移動しておかなきゃ
いけなかったんですね。たぶん。
移動させて、もう一度authenticatedしたら、新たにdb/migrate/004_create_users.rbが
出来ました。中身を見てみると・・・




class CreateUsers < force =""> true do |t|
t.column :login, :string
t.column :email, :string
t.column :crypted_password, :string, :limit => 40
t.column :salt, :string, :limit => 40
t.column :created_at, :datetime
t.column :updated_at, :datetime
t.column :remember_token, :string
t.column :remember_token_expires_at, :datetime
end
end

def self.down
drop_table "users"
end
end


うわー高機能ですね。

さて、ここで問題が。以前に作ったUsersテーブルはどうすればいいのか?

もともと作っていたuserテーブルの中身は、:group_idと:nameだけなので、
group.rb は has_many :users のまま、新しい user.rb に belongs_to :group してもう。


[ /model/user.rb ]

require 'digest/sha1'
class User <>
 [ /controller/account_controller.rb ]

(略)

def logout
self.current_user.forget_me if logged_in?
cookies.delete :auth_token
reset_session
flash[:notice] = "You have been logged out."
redirect_back_or_default(:controller => '/schedules', :action => 'month')
end

の後ろに、昨日までに作ったaccount_controller.rbの内容を
とりあえずドバっとコピペしてみたら、ユーザー管理からログインした後に
グループ一覧へ行けるようになり、グループについては新規追加/削除/編集が出来た。
ログアウトも出来る!
・・・・と、一通り喜んでみたものの、まだDBは何も触ってません。
ので、明日はDBを:includeや:has_manyなどを使って作ろうと思ってます。

2007年10月15日月曜日

スケジューラー 明日はLog in

先週の『Parameterの"id"が"update"になる謎。』はやはり単純なミス
<%= start_form_tag({:action => 'update', :id => @schedule}, :multipart => true) %>
引数で :id => @schedule の指定を忘れていました。

さて、次のエラーは。


NameError in SchedulesController#create
uninitialized constant FILE_PATH

/1.8/gems/activesupport-1.4.3/lib/active_support/dependencies.rb:266:in `load_missing_constant'
/1.8/gems/activesupport-1.4.3/lib/active_support/dependencies.rb:452:in `const_missing'
/1.8/gems/activesupport-1.4.3/lib/active_support/dependencies.rb:464:in `const_missing'




const_missing
>定義されていない定数を参照したときに Ruby がこのメソッドを呼びます。
>参照した定数名の Symbol が引数に渡されます。
>デフォルトではこのメソッドは例外 NameError を発生させます。

こちらもケアレスミス。複数名の定数を呼び出すところを単数名で呼んでいた。
ボンミスは良くしますが、今日はちょっと多すぎて自分でも嫌になるなぁ。
風邪のせいとは言えませんが(言ってるw) ぼ〜っとしすぎです。

その後もケアレ・スミス氏と格闘して、「ログイン機能」の追加までたどり着きました。
教本ではLoginGeneratorを使っているのですが、もう古く、
現在 認証系を作る場合は『Acts as Authenticated』を使用するとのことで、
とりあえずPluginはインストールしておいたので・・・
明日は Acts as Authenticated を調べながら自分でやってみようと思います。


□明日のための参考サイト

[本家] Acts as Authenticated

Ruby on Rails: ログイン機能を作る (acts as authenticated 編)


Acts as Authenticatedまとめ


Acts as Authenticated plugin を少しだけセキュアにする

あとで読むRailsのススメ acts_as_authenticated

2007年10月12日金曜日

スケジューラー 続き

教本を進めていくと、月間表示を作成したので
「scaffoldで生成されたlist.rhtmを削除する」と言う項目に従って
list.rhtmlを消すと、エントリを削除できるリンクが無くなってしまった。
教本では後々付け加えるのかもしれないけれど、ちょっと挑戦してみようと思って作業を始める。

まずはedit.rhtmlに


<% form_tag :action => 'destroy', :id => @schedule do %>
<%= submit_tag '削 除' %>
<% end %>



としてみると。簡単に削除ができた。
「削除しますか?」の確認画面が欲しいと思い:confirmを使うためlink_toにして
(最初はform_tagに入れようとしていたけど、うまくいかなかった)



<%= link_to("Destroy",{ :action => "destroy", :id => @schedule }, :confirm => "Are you sure you want to delete this entry?", :post => true %>



と追加してみる。ヨシ、できた。

「Are you sure you want to delete this entry?」にタイトルを入れたくなった。
:confirm => "『 タイトル:#{@schedule.title} 』のエントリを削除しますか?"
でOKだった。



private
def set_file_name
@file = params[:schedule][:file_name]
params[:schedule][:file_name] = @file.original_filename
end




の部分でoriginal_filenameが見付からないというエラーが出たが、
start_form_tagの書き方が教本の頃より変わったらしい。

<%= start_form_tag('create', :multipart => true) %>
と書き直してOK。

次はなぜか
Parameterの"id"が"update"になる謎。


ActiveRecord::RecordNotFound in SchedulesController#edit
Couldn't find Schedule with ID=update

workspace/scheduler/app/controllers/schedules_controller.rb:80:in `find_schedule'


で止まっているし、idに"update"が入るというのはスクリプトの打ち間違えかな
週明けに格闘してみようと思います。



□ Javaから見たRuby on Rails

2007年10月11日木曜日

db:migrate

文字化けはとりあえずDBの作り直しが良いだろうと思ったので作りなおしてみると
db:migrate実行時に



/ruby/gems/1.8/gems/activerecord/lib/active_record/vendor/mysql.rb:523:in `read'
rake aborted!


42000だけど、以前のエラーとはちょっと違うみたい。

>'scheduler_development' なんてデータベースは知りません.
って。知らないだろう。
だって、db:migrateで作ってくれるんじゃないの!?
ということで、ググり

Unknown database bug in Chapter 2 1

>Creating the database is perhaps the easiest way to go.

そうですか。やはり。なんだか腑に落ちないけど。
MySQLでcreateして、問題なくdb:migrateできました。
そして、昨日悩まされていたDBの文字化けについても完治です!

----- db:migrate についての理解不足でした。
データベースを先に作っておかないと、db:migrateもできないのですね。
はい。 


CalendarHelperを使って、なんとかカレンダー表示までたどり着きました。
途中、『 app/controllers/schedules_controller.rb 』に
月を表示させる為のメソッド"month"を作る際に
何も考えず一番最後に追加してしまい、なかなか表示ができませんでしたが、
カレンダー表示をする際にどこまでメソッドを呼び出しているのか
今いち分からないので、とりあえず頭に追加することで解決。

・・・index,list,show,new,creat,edit,updateにmonthを追加するのに
頭もケツもあまり関係ないように思えるが、どこが作用しているのかな??

CSSも設置して、とりあえず形になってきたので
やっと面白くなってきました!!

2007年10月10日水曜日

テーブルが作れるようになった・・・先週からの続き。

MySQLのデータベース権限を指定してあげることでrake db:migrateにて
テーブルが作れるようになった・・・先週からの続き。
スケジューラーのチュートリアルを完成させようと思います。

が、scaffoldでMVCを構築してもらい、「 $ rake 」でテストをしたら
出ました エラー ・・・ 涙




$ rake
(in /home/b-tech01/scheduler)
/usr/bin/ruby1.8 -Ilib:test "/usr/lib/ruby/1.8/rake/rake_test_loader.rb" "test/unit/schedule_test.rb"
Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader
Started
.
Finished in 0.051288 seconds.

1 tests, 1 assertions, 0 failures, 0 errors
/usr/bin/ruby1.8 -Ilib:test "/usr/lib/ruby/1.8/rake/rake_test_loader.rb" "test/functional/schedules_controller_test.rb"
Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader
Started
EEEEEEEE
Finished in 0.066953 seconds.

1) Error:
test_create(SchedulesControllerTest):
StandardError: No fixture with name 'first' found for table 'schedules'
/home/b-tech01/scheduler/config/../vendor/rails/activerecord/lib/active_record/fixtures.rb:489:in `schedules'
./test/functional/schedules_controller_test.rb:15:in `setup_without_fixtures'
/home/b-tech01/scheduler/config/../vendor/rails/activerecord/lib/active_record/fixtures.rb:562:in `setup'

−−−− 略 −−−− 同じエラーが8つ −−−−

8 tests, 0 assertions, 0 failures, 8 errors
/usr/bin/ruby1.8 -Ilib:test "/usr/lib/ruby/1.8/rake/rake_test_loader.rb"
rake aborted!
Test failures




エラーで該当している箇所を見ても、もちろん追いきれなかったので、
『StandardError: No fixture with name 'first'』をググってみた。

Railsのテストが通らない場合


上記URLの " その一 " を実行したら 即、解決! 

> scaffoldを利用した場合、test/fixturesフォルダにfixtureされるymlファイルが生成されます。
> が、なぜかこのファイル内に :firstがうめこまれていないのです。それなのにテストコードのほうは
>
> @first_id = hogehoges(:first).id
>
> で、:firstを探しにいっているので見つからずにエラーになるわけです。不思議ですねぇ

本当に、不思議ですねぇ。
無事表示ができるようになったところで教本の通り、
『一覧表示画面のカスタマイズ』をしてみます。

まず最初のエラーは、簡単なsyntax error
schedules_controller.rbに追記する際に「 , 」を忘れていた。

そして次。
テスト用のデータベースにデータを入れるため/test/fixtures/schedules.ymlに




schedule1:
id: 1 
 datetime: 2007-10-10 12:00
 title: 勉強1
 content: 今日も勉強1
schedule2:
 id: 2
 datetime: 2007-10-11 12:00
 title: 勉強2
 content: 今日も勉強2




と記述するものの、やはりエラーーーー

Fixture::FormatError: ../test/fixtures/schedules.yml. Please note that YAML must be consistently indented using spaces. Tabs are not allowed.

ArgumentError: syntax error on line 3, col 10: ` datetime: 2007-11-11 12:43:00'

tabは使ってないから大丈夫。・・・と思っていたら、
記述した「 id: 1 」の前にスペースを入れ忘れていた・・・




schedule1:
id: 1 ←←← スペースが入ってない!
 datetime: 2007-10-10 12:00
 title: 勉強1
 content: 今日も勉強1




このケアレスミス、一人だったらほぼ気づけないと思う(汗


そして、現在MySQLの日本語文字化けと格闘中。

● [MySQL] 文字化け問題を本気で直す

を参考にしてみるが、現在もまだ文字化け「????」中。
SQLite3にして先に進んだ方が良いかなぁ・・・とは思いつつも
MySQLでやってみてエラーをたくさん経験して、今のうちに
自分が弱いところなどを知るのも良いかと思ってます。

でも、明日で最後にするつもりです・・・
さきほどまでコマンドプロンプトで作っていたプロジェクトを
Aptanaにインポートしてやっていて、rakeフォルダの中にrakeフォルダ・・・
と意味の分からないことになっていたのが気になっていたので、
Aptanaで最初から同じところまで作ってrakeでテストしました。

・・・が、やはり文字化けしてました。

今日はここまでで、明日頑張ります。
でも、Aptanaの使いかたが分かりつつあるので
無駄ではない!ハズ・・・

2007年10月4日木曜日

No such file or directory - /tmp/mysql.sockについて

ちょっと視点を変えて下記を試してみましたが

・/var/run/mysqld/mysqld.sock のリンクを作成して mysql.sock とリンク名を変更
・RoRで作りかけアプリの中 /scheduler/tmp に放りこんでみる
・/scheduler/config/database.ymlに昨日追加した
「socket: /var/run/mysqld/mysqld.sock」の一文を削除
・$ rake db:migrate を実行してみる。

→ やっぱりダメ!

database.ymlをもう一度見てみる。
コメントには「MySQLのバージョンは4.0と5.0がお勧め」って書いてある。
バージョンは 5.0.38 だから問題なさそう。

database.ymlの socket: 指示を消すと rake はどこから
「/tmp/mysql.sock」だと命令されているのか?


ググってみると
☆ MySQLのソケットの位置はどうやって指定する?

> 1. 引数
> 2. 環境変数 MYSQL_UNIX_PORT
> 3. デフォルト値 /tmp/mysql.sock
> の順でソケットの位置を見ていることがわかった。

だから、やっぱり、scheduler/config/database.ymlに
「socket: /var/run/mysqld/mysqld.sock」って追加すればいいのでは??
ううう。

自分的 FAQ (よくある質問とその回答)
今までやっていたことと同じような感じですが、

>4.WEBrick を再起動

これが気になります。

□WEBrick 起動コマンド
$ ruby ./script/server

http://localhost:3000/確認。
問題なく立ち上がってます。

もう一度



$ rake db:migrate
(in /home/b-tech01/scheduler)
rake aborted!
#42000 Access denied for user 'rails'@'localhost' to database 'scheduler_development'




あー やっとエラーの内容が変わりました!
たぶん、socketは通った(?)
次はMySQLのエラーが〜

MySQLの「#42000Access denied for user ''@'localhost' to database 'sample'」というエラー


>「grant」文で、作ったデータベースで、ユーザー「recipe3」に
>アクセス権減を与える訳ですが、僕はここの「recipe3@localhost;」という
>箇所をチュートリアルのままやっていたので「recipe@localhost;」としたままでした。
との一文・・・で、どう解決されたのだろう・・・

私もチュートリアルの言うままdatabase.ymlを

adapter: mysql
database: scheduler_development
username: rails
password:
host: localhost
encoding: utf8
socket: /var/run/mysqld/mysqld.sock

としたのですが、「'rails'@'localhost'」でエラーが出ているということは
アクセス権の問題?まだテーブル作ってませんが・・・

RubyOnRails を使ってみる 【第 2 回】 (続・RubyOnRails を使ってみる)
データベースの設定

↑ここに答えがありました!!!!

rails@localhost がscheduler_developmentとscheduler_testを
扱えるように下記Queryを実行



mysql> grant all on scheduler_development.* to rails@localhost;
Query OK, 0 rows affected (0.04 sec)

mysql> grant all on scheduler_test.* to rails@localhost;
Query OK, 0 rows affected (0.00 sec)


WEBrickをおまじないのように再起動


$ rake db:migrate
(in /home/b-tech01/scheduler)
== CreateSchedulers: migrating ================================================
-- create_table(:schedules)
-> 0.0647s
== CreateSchedulers: migrated (0.0651s) =======================================



mysql> show tables;
+---------------------------------+
| Tables_in_scheduler_development |
+---------------------------------+
| schedules |
| schema_info |
+---------------------------------+
2 rows in set (0.00 sec)



できたーーーーーーーーー!!

高級?なMySQLではちゃんとデータベースごとにユーザ設定をしてあげなければ
ならないということでした。
はぁ〜〜長かった・・・

Install Aptana to ubuntu --- 続き

AptanaでRadRailsが表示されない現象について、
情報をいただきました。
お恥ずかしいことに、Javaのバージョン確認を見逃していました。

>原因:Javaのバージョンが1.4のまま
>
> * 参考
> o Aptana Forums :: View topic - FAQ - Please read first
> o http://www.aptana.com/forums/viewtopic.php?t=2102
>
>対応:Javaの5.0(1.5)をインストール 

まずはバージョンを確認。

-------------------------------------------
-------------------------------------------

$ java -version
java version "1.4.2"
gij (GNU libgcj) version 4.1.2 (Ubuntu 4.1.2-0ubuntu5)

-------------------------------------------
-------------------------------------------

1.4.2でした!なるほど・・・

$ sudo aptitude install sun-java5-jdk
インストール終了後

> cd /usr/bin
> sudo mv java java_1.4
> sudo ln -s /usr/lib/jvm/java-1.5.0-sun/bin/java java

教えられた通りにやってみると、
java version "1.5.0_11"
になりました!

以前にRubyもRakeも入れたハズ・・・確認してみると

cd /usr/share/doc/r
radeontool/ readahead/ rss-glx/
rails/ readline-common/ rsync/
rake/ reiserfsprogs/ ruby/
rdesktop/ restricted-manager/ ruby1.8/
rdoc/ rhythmbox/
rdoc1.8/ rpm/

入っているので、Aptanaを起動してみると・・・
Radrailsが入りましたーー!

Javaバージョンなんて、最初に確認しないとだめですよね・・・

AptanaにRadRailsが入ってくれたので、
昨日プロンプトで作りかけていたschedulerプロジェクトをインポートしてみました。

ちょっと気になる感じではありましたが、
インポートも完了。
これから教本見つつAptanaで開発していこうと思います。

その前に、昨日のmigrateのNo such file or directory - /tmp/mysql.sockってとこの問題を
解決しなければ・・・・

2007年10月3日水曜日

RoR チュートリアル

結局、とにかくなにかアプリが作りたい!と思い、
『はじめよう Ruby on Rails』を見ながらコマンドプロンプトで
スケジューラーを作成し始める!! 16時すぎから・・・ (>_<) 本の言う通りに設定を済ませ、データベースも作り、 サクサクサクサク進んで喜んでいたら、「5-1 データベースの設計」で rake を使ってテーブルを作ろうとしたら・・・・出ましたエラー

---------------------------------------

$ rake db:migrate
(in /home/b-tech01/scheduler)
rake aborted!
No such file or directory - /tmp/mysql.sock

---------------------------------------

はい。実際 /tmp/ の中身は空っぽでした。

が、ググったらすぐにみつかりました。

/tmp/mysql.sockが見つからないって言われた

調べてみると


---------------------------------------

sudo mysqladmin version
mysqladmin Ver 8.41 Distrib 5.0.38, for pc-linux-gnu on i486
Copyright (C) 2000-2006 MySQL AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Server version 5.0.38-Ubuntu_0ubuntu1-log
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 4 hours 44 min 23 sec

---------------------------------------

config/database.ymlに socket: /var/run/mysqld/mysqld.sock と書いてみる。


・・・・

---------------------------------------

$ rake db:migrate
rake aborted!
No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb, Rakefile.rb)
/usr/lib/ruby/1.8/rake.rb:1822:in `load_rakefile'
(See full trace by running task with --trace)

---------------------------------------

だめじゃ〜ん・・・

ついでに、 /var/lib/mysql/mysql.sock も試してみるがダメでした。
今日はここで時間がきてしまいました。
明日、引き続き頑張ってみます。
うううう・・・・

Install Aptana to ubuntu

□ 参考HP
AptanaでWebプロジェクトを開発・管理する
Ubuntu素人日記
apt-getの使いかた
don007の日記 [Mac][開発環境]Eclipseインストール
最強のIDEを追い求める Eclipse + Aptana + TruStudio (+RadRails)
本気でRailsでアプリを作る

Aptana

□ 今日覚えた便利なコマンド
sudo nautilus − root権限でGUI操作ができる!・・・結局GUI操作・・・


Linux用Aptanaはインストーラーが用意されていないので、
まずは Milestone Release 9 (Stable: Build 17048) のzipをダウンロード。
AptanaでWebプロジェクトを開発・管理するを参考にして難なくインストール終了!

更新マネージャーで必要そうなものを更新して、
「Aptana RadRails」もインストールしました。
これからアプリ制作に取りかかってみます。



上の日誌を書いたのは午前11時ごろ・・・現在15時すぎました
なにがどうしてかが分からないのですがAptanaにRadRailsが入っていない!
プラグインを入れたはずなのに!!ど〜して?
・・・・・・ ということで調べた結果の私の予想では、

1 『Eclipse3.1.2にAptana含めRradRailsもプラグインで追加していく』
 噂1)重いらしい 
 噂2)Eclipse3.2ではAptana の一部機能が使えない


 OR

2 『Aptana RadRails (Linux)を最初からインストールしてしまう』

なんだか納得がいきませんが、私にとっては2が一番の近道だと・・・
といっても既に半日使ってる・・・うー
コマンドプロンプトに慣れていないから、 IDE で・・・と思いましたが、
こんなに遠回りになってしまうとは〜!
でも、自分で調べて解決をしていくのはやはり勉強になります。

2007年10月2日火曜日

今日のまとめ 10/2

Railsをやろうと環境作りでちょっと戸惑いました。
コマンドプロンプトもある程度は使えるようにならなくてはー!

教本「Ruby on Rails入門」の"1-1 Rubyが初めてのひとの概要"を読み、
Javaでもず〜っと意識してきた"ハズの"オブジェクト指向が
分かりやすく載っていたので、再確認できたうえ、
Javaとの文法の違いが分かりました。・・・まだ覚えられませんが・・・
なにか目的がないとなかなか頭に入ってこない性格なので、
明日は 教本「はじめよう Ruby on Rails」に載っているスケジューラーか
何かひとつアプリを作ってみます。

前から欲しいと思っていた「シンプルな家計簿」でも、いいな〜
今晩少しRailsで作る家計簿などを検索してみようと思います。

Hashクラス

チュートリアルのHashクラスの項目に下記のように書かれていました。



ハッシュの項目の名前としては文字列が使われることが普通ですが、
やろうと思えばどんな種類のオブジェクトでも使うことができます。
(それが必要になるとはあまり思えませんが)、配列や他のハッシュだってOKです。


weirdHash = Hash.new

weirdHash[12] = 'モンキーズ'
weirdHash[[]] = 'からっぽ'
weirdHash[Time.new] = 'するなら今だ'



JavaでもいまいちHashは理解していなかったので、
教本「たのしいRuby」を読んで表示させてみた。

----------------------------------------------

weirdHash = Hash.new

weirdHash[12] = 'モンキーズ'
weirdHash[[]] = 'からっぽ'
weirdHash[Time.new] = 'するなら今だ'

weirdHash.each {|codeType, color|
puts codeType.to_s + ': ' + color.to_s
}

----------------------------------------------
  結  果

: からっぽ
Tue Oct 02 10:35:05 +0900 2007: するなら今だ
12: モンキーズ

----------------------------------------------

9. クラス

-----------------------------------------------------------------
 練習問題
• 生まれた年、月、そして日を順に訊いてそこから年齢を計算します。
そして、過ごしてきた誕生日それぞれに対して大きなおめでとう!を
プレゼントしましょう。
-----------------------------------------------------------------
puts '生まれた年は?'
year = gets.chomp

puts '生まれた月は?'
month = gets.chomp

puts '生まれた日は?'
day = gets.chomp

today = Date.today

age = today.year.to_i - year.to_i

puts age.to_s + "歳ですね"

-----------------------------------------------------------------

たぶん、練習問題の意味とは違うような気がしますが。
上記だと生まれ年だけ聞けば良いですもね。

.to_iと.to_sの使いわけに気づきました(おそい)
Javaと違って最初に変数の型を宣言しないから、
「today.year.to_i - year.to_i」としなければ
計算ができないのですねー

あと、Date::todayメソッドで"年-月-日"と取得したら
today.year/.month/.day と取り出せるのも便利ですね。

2007年10月1日月曜日

今日のまとめ

Ruby 練習問題をやり、
「sortメソッドを使わずに配列の中身をソートする」問題でつまずきました。
その後、なんだか乗れずに数字を英語に変換するプログラム(100なら one hundred)でも
ん〜いまいち・・・

-------------------------------

練習問題

• 10億(One billion)秒... (もし記録が残っているなら)あなたの生まれた 正確な時刻を見つけ、いつ10億秒歳になる(あるいはなった)のかを 計算してみなさい。そしてカレンダーに印をつけましょう。

-------------------------------

time = Time.mktime(1976, 8, 3, 10, 11)
puts "あなたの生まれた時"
puts time
bilSec = 1000000000
time = time + bilSec

puts "10億秒後は"
puts time

-------------------------------

上記プログラムはあっているのだろうか???
10億秒後の日付って・・・

Rubyを使って 練習問題

7. 配列とイテレータ

好きな数だけ単語の入力をしてもらい
(1行に1単語、最後はEnterだけの空行)、
アルファベット順に並べ変えて出力するような
プログラムを書いてみましょう

-----------------------------------------

ary =[]
elem=nil


puts 'なにか入力してください'

while elem != ''
  elem=gets.chomp
  ary<<elem
end

puts ary.sort

------------------------------

「elem=nil」と宣言し忘れRubyに何度か怒られた
「最後はEnterだけの空行」は・・・?「''」だけで良いんですね。
「.sort」は02さんが見つけてくれました。
はじめ「ary<<gets.chomp」としましたが、これだと改行しても配列表示してくれず、
上記のように変更してみたら成功!

Ruby学習 参考URL



□ プログラミング入門 - Rubyを使って -


□ 逆引きRuby


□ Ruby リファレンスマニュアル