2011-06-25

子育てするようになってから、草花を育てるのも楽しくなったかも

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
最近、草花を育てるのがちょっと楽しいです。

昔は草花を育てるのは、まどろっこしくあんまり好きでなかったのです。
水をあげたら、すぐ育つぐらいのレスポンスを求めていたのかもしれないです。

最近は子育てしているせいか、レスポンスがなくても全然平気です。

昨日との違いはなくても、長い目で見れば着実に育っている感じが
子育てと通じるものがあるので、ちょっと草花を育てるのも楽しいのかもしれません。

そんな草花を育てるのをより楽しむために、以下の本を買ってみたりしてみました。

2011-06-21

オシロスコープがちょっと欲しい

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
最近、オシロスコープがちょっと欲しくなっています。

あったところで使いこなせるわけではないような気がするし、結構お高いし、
実際は買うことないかなぁと思っていたのですが、
DSO Nano v2
という安い素人が最初に使うにはよさそうな気がするものがあることを知り、
現在ちょっと悩み中です。

う~~ん、どうしよう。

2011-06-17

ActiveScaffoldでファイルアップロード

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldで管理しているモデルにファイルアップロード機能をつけたいと思ったわけです。

なんとActiveScaffoldでは、ファイルアップロードを使えるようにするfile_columnプラグインを利用できるようにすれば
勝手にファイルアップロードの画面が現れるのです。
http://wiki.activescaffold.com/wiki/published/FileColumnBridge

というわけで、file_columnプラグインを使えるようにします。

インストールは以下で。
script/plugin install http://filecolumn.googlecode.com/svn/tags/file_column

でも、2.3.11では、
uninitialized constant FileColumn::ClassMethods::Inflector
というエラーがでて動きませんでした。

なので
vender/plugins/file_column/lib/file_column.rb
のエラー発生部分を以下のように修正しました。
def file_column(attr, options={})
  options = DEFAULT_OPTIONS.merge(options) if options
      
  my_options = FileColumn::init_options(options, 
#                                        Inflector.underscore(self.name).to_s,
                                        ActiveSupport::Inflector.underscore(self.name).to_s,
                                        attr.to_s)
      
  state_attr = "@#{attr}_state".to_sym
  state_method = "#{attr}_state".to_sym
これとは別に以下のサイトでも直し方が紹介されています。
http://d.hatena.ne.jp/aki-s-119/20081201/1228168584

さらにデフォルトだと、日本語ファイル名は使えないので、
vender/plugins/file_column/lib/file_column.rb
の一部をいじりました。
def self.sanitize_filename(filename)
  filename = File.basename(filename.gsub("\\", "/")) # work-around for IE
#  filename.gsub!(/[^a-zA-Z0-9\.\-\+_]/,"_")
  filename.gsub!(/[^\w\.\-\+_]/,"_")
  filename = "_#{filename}" if filename =~ /^\.+$/
  filename = "unnamed" if filename.size == 0
  filename
end
以下のサイトを参考にさせていただきました。
http://www.kestrel.jp/modules/tinyd04/content/index.php?id=4

で後は、file_columnを使うことをモデルに記載してやればOKです。
以下の例では、foosテーブルのfilenameカラムにアップロードしたファイルの情報を格納して
実際にはpublic/uploadディレクトリの下にアップロードしたファイルが格納されます。
class Foo < ActiveRecord::Base
  file_column :filename, :web_root => "upload/",
                         :root_path => File.join(RAILS_ROOT, "public", "upload")
end

他にfile_columnに関しての情報は、以下が参考になります。
http://gdgdlog.net/log/show/227

後は、Fooモデル用のActiveScaffoldの画面を用意すれば、勝手にfilenameカラムがファイルアップロードのものになります。

私の環境では一度アップロードしたファイルを別のファイルに更新しようとするには一度、削除してからアップロードしないとダメでしたが、楽チンさを考えたらそれぐらいはよしです。

ActiveScaffoldステキです。


2011/6/24 追記
Railsアプリが
http://www.xxx.jp/
のような感じであれば上記だけで問題ないのですが、
専用のディレクトリの下で以下のような感じでやりたいとき、もうちょっとやることがあります。
http://www.xxx.jp/aaa/
アップロードはできるけど、ダウンロードがaaaを配慮してくれないのでできない情況です。

なのでActiveScaffoldとfile_columnそれぞれにちょっと手をいれます。

まずはActiveScaffoldは以下のファイルを以下のように変更します。
vendor/plugins/active_scaffold/lib/bridges/file_column/lib/list_ui.rb
       def active_scaffold_column_download_link(column, record, label = 
nil)
         return nil if record.send(column.name).nil?
         label||=as_(:download)
-        link_to( label, url_for_file_column(record, column.name.to_s), :popup => true)
+        link_to( label, url_for_file_column(record, column.name.to_s, {:absolute => true}), :popup => true)
       end

       def active_scaffold_column_thumbnail(column, record)

file_columnは以下のファイルを以下のように変更します。
vendor/plugins/file_column/lib/file_column_helper.rb
     return nil unless relative_path

     url = ""
-    url << request.relative_url_root.to_s if absolute
+    url << ActionController::Base.relative_url_root.to_s if absolute
     url << "/"
     url << object.send("#{method}_options")[:base_url] << "/"
     url << relative_path


2012/3/12 追記
Rails3.0では、ActionController::Base.relative_url_rootが使えなくなっているのでfile_columnは以下のように変更します。
vendor/plugins/file_column/lib/file_column_helper.rb
    url = ""
-   url << request.relative_url_root.to_s if absolute
-   url << "/"
+   url << root_url
    url << object.send("#{method}_options")[:base_url] << "/"
    url << relative_path


2011-06-15

ActiveScaffoldでThe {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead ってエラーが出た時は

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldを使っていてログを見ていたら
The {{key}} interpolation syntax in I18n messages is deprecated. Please use %{key} instead
というエラーが表示されていました。

ちなみに利用しているRailsのバージョンは、2.3.11です。
別に問題なく利用できているのだけど、なんか気持ち悪いのです。

とりあえずエラーを消すならば
vendor/plugins/active_scaffold/lib/active_scaffold/locale/ja.yml
に書かれている
{{}}
をエラーメッセージどおりに
%{key}
に変えてやればOKでした。

Railsで文字列内のURLにリンクをはる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsでテキストの中にURLが入っていたら、リンクを張りたいなぁと思って検索したら、
以下の方法が見つかりました。

require 'uri'
def url2link_of_string(html_string,options={})
  target=options[:target] || '_blank'
  URI.extract(html_string).uniq.each{|url|
    html_string.gsub!(url,"#{url}")
  }
  html_string
end

これをApplicationHelperにでも書いておいてviewで呼べばOKです。

こちらを参考にさせていただきました。
http://gendosu.ddo.jp/redmine/wiki/rails/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF%E5%86%85%E3%81%AEURL%E3%82%92%E8%87%AA%E5%8B%95%E3%81%A7%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

2011-06-14

Railsのモデルをcloneしたときにcreated_atとかはコピーされたくない

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsのモデルのインスタンスをコピーして、ちょっとだけ内容を変更して別レコードとして保存したいときに
clone
でモデルをコピーして必要部分だけを変更しているのですが、
モデルに
created_at,updated_atがあるときは、この値もそのままコピーされてしまいます。

created_at,updated_atはコピーして別レコードとして保存した日時になって欲しいなぁとか思ったわけです。

なので以下のような感じにしてみました。
a = Foo.find(:first)
=> #<Foo id: 1, article: "aaa", created_at: "2011-06-10 17:02:21",updated_at: "2011-06-10 17:02:21">
b = a.clone
=> #<Foo id: nil, article: "aaa", created_at: "2011-06-10 17:02:21",updated_at: "2011-06-10 17:02:21">
b.created_at = nil
=> nil
b.updated_at = nil
=> nil
b.save!
=> true
p b
#<Foo id: 2, article: "aaa", created_at: "2011-06-13 14:27:23", updated_at: "2011-06-13 14:27:23">

created_at,updated_atをnilにしてからsaveしただけです。
他にも方法があるような気がしますが、まぁよしです。

ActiveScaffoldで削除するときに独自エラーメッセージを出す

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldで削除をするときに
before_destroyで削除前にチェックをして条件を満たさないと削除できないようにしようと思ったわけです。
削除自体はできなくなるのですが、エラーメッセージが出なかったり、出たとしても
削除できませんでした。
な感じのそっけないメッセージになります。

できれば削除できない理由をちゃんとメッセージしたいなぁと思ったわけです。
まずエラーメッセージを出すようにするには
before_destroyの中で例外を発生させる必要があります。

でエラーメッセージですが、
do_destroyという関数を書けばよいようです。
以下のような感じです。
def do_destroy 
  destroy_find_record 
  begin 
    self.successful = @record.destroy 
  rescue Exception => ex 
    flash[:warning] = "オリジナルメッセージ"
    self.successful = false 
  end 
end

以下が参考になりました。
http://groups.google.com/group/activescaffold/browse_thread/thread/3af21f82c1695a57?pli=1

2011-06-03

M-51 エンジニアバッグ

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク




エンジニアバックという響きがキニナルのです。
そしてポケットの多さが、またキニナルのです。

BEN DAVIS/ベンデイビス

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク



アメリカのワークウェアのブランドだそうです。
ゴリラのマークがキニナルのです。

2011-06-01

電子工作お勉強中

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
最近、プログラムだけでなくなんか作りたいなぁとか思って、いろいろと本は読んだりしていたのですが、やっぱり読んだだけではわからんなぁと当たり前のことになってしまいました。
そこで実際に本に書いてあるものを作ってみるのがいいのでしょうが、部品を集めるのがちょっと面倒だったりしたのです。

そんな時、以下の本を見つけました。



部品も入っていて実際に手を動かしながらやってみようというものなのです。
やっぱり実際に手を動かした方が理解できることが多いです。
本を読んだだけでは、あんまりイメージできなかった、どんな感じでどれくらいの電流が流れているのかなぁとかがちょっとイメージできるようになったような気がします。

ちなみに理解を深めるためには、テスターはあった方がよいです。
この本で使う分には、電流と電圧が測れればOKです。


この本のシリーズがまだあるようなので、もうちょっと買ってみようと思います。
(もうちょっと安いとうれしいのですけどね)

WBS「トレたま」で放送された商品をAmazonで検索してみた(201105放送分)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
WBSのコーナーの「トレたま」で放送された商品をAmazonで検索してみました。

iPhoneでもブレない (放送:2011.05.31)
 amazonにありました
 ステディカム スムージー

ワンプッシュで冷凍おしぼり (放送:2011.05.30)
 見つかりませんでした

新レンタル太陽光発電 (放送:2011.05.27)
 見つかりませんでした

新感覚!おかずゼリー (放送:2011.05.26)
 見つかりませんでした

車もメーキャップ (放送:2011.05.25)
 見つかりませんでした

光る画板? (放送:2011.05.24)
 見つかりませんでした

スマホで動かすミニ四駆 (放送:2011.05.23)
 見つかりませんでした

懐かしのジャケット復活! (放送:2011.05.20)
 見つかりませんでした

熱で動くエンジン! (放送:2011.05.19)
 amazonにありました
 スターリングエンジン発電機付き (SE-905GR)
 スターリングエンジン (SE-905NB)
 スターリングエンジン (SE-905NR)

鼻歌が名曲に! (放送:2011.05.18)
 見つかりませんでした

飛び出るボード! (放送:2011.05.17)
 バックボード ウォーリー
 見つかりませんでした
 !!!!!amazon検索失敗2

変化する印刷! (放送:2011.05.16)
 見つかりませんでした

偽りの着信 (放送:2011.05.13)
 見つかりませんでした

つるして隠す (放送:2011.05.12)
 見つかりませんでした

エコハンガー (放送:2011.05.11)
 amazonにありました
 ウェットスーツに最適!画期的なペットボトルハンガー RETHINK HANGER <イエロー> 乾きやすく型崩れなし
 ウェットスーツに最適!画期的なペットボトルハンガー RETHINK HANGER <グリーン> 乾きやすく型崩れなし

落書きクッション (放送:2011.05.10)
 amazonにありました
 お絵かきクッション『Note me』 Pillow (レッド)

非常用めがね (放送:2011.05.09)
 amazonにありました
 災害緊急用オールマイティメガネ「アドレンズ・エマージェンシー」
 災害などの予測不能なアクシデントやもしもの時に!度数が調節できる緊急用メガネ。【ADLENS EMERGENSEE】アドレンズエマージェンシー

電動自転車 変身キット (放送:2011.05.05)
 見つかりませんでした

押す?回す?爪切り (放送:2011.05.04)
 見つかりませんでした

刀削麺ロボット (放送:2011.05.03)
 見つかりませんでした

飛んで飛んで飛んで~ (放送:2011.05.02)
 見つかりませんでした