2015年1月18日日曜日

【RoR】オブジェクトがnewされたものか、DBからselectされたものか(保存済みのものか)チェックする方法。

初回保存のときと、それ以外とかで処理を変えたいことはよくある。原理的にはidでDBをselectして該当があるか見る っということなんだけど、Railsではそれようのメソッドが既にあるので便利。しかし名前をよく忘れる。その名は persisted?


item = Item.new
item.persisted? # DBに保存されてないのでfalseになる。selectしたオブジェクトはtrueに。

2015年1月12日月曜日

300 RISE OF AN EMPIRE| スリーハンドレッド 帝国の進撃 観た

 まず私が言いたいのは、TUTAYAでレンタルすると順新作は370円。旧作は100円・・・・。旧作かりなよ ってことだ。(いつもうっかり忘れて準新作かりてしまう俺。。。)
でも面白かった「300 帝国の進撃」。血がどばどばでるからえぐいけど、きれい。引き込まれる。

話は前作300の戦いの裏で行われていた海戦の話。前作でスパルタ軍って最終的に全滅してたんだっけ?記憶がもうあいまいなんだけど、前作は7年前だったんだな。そんなに昔だったんだなぁ。海から迫るペルシア海軍にスパルタ以外の各都市は対抗すべく団結して連合軍を作り、かつてのマラトンの戦いでペルシア軍を破ったアテナイの将軍が指揮を執る・・・・

ペルシア側の女将軍(エヴァ・グリーン)が準主人公でペルシア側の戦に至った事情も描かれているのでこのタイトルになっている模様。
この女将軍がキレイ&かっこいい!残酷だが凛々しく色っぽい。ハマーン様の様。衣装がまたかっこよく戦場、しかも海の上だというのに出てくるたびに違うドレス(笑)甲冑要素はあるがほぼドレス!奇抜だけどかっこいいデザインはレディガガよりよっぽどいけてると思う。
主人公のギリシア軍主人公との濡れ場もあり、あぁ、、こりゃR-18納得のクオリティ。


戦いはペルシアの大型船相手にギリシアの小型船が機動性と戦術で当初圧倒する流れ。手扱ぎなのにめちゃスピード感があって、大型船もじゃんじゃん壊れて、見応えばっちり。そして相変わらず筋肉隆々の戦士達、剣で人がざくざくと切れていく。。。スピード感ばっちりで飽きない、面白かったっす。




2015年1月10日土曜日

【Rails】Sitemapの更新

 Sitemapをつくってwebmastertoolから送信するのは、googleのクロール最適化の第一歩だが、Sitemapを手動でメンテナンスするのは大変。
そんなときは sitemap_generator を使う

script/sitemap.rb


SitemapGenerator::Sitemap.default_host = "http://www.hogehoge.com"

SitemapGenerator::Sitemap.create do
# Put links creation logic here.
#
# The root path '/' and sitemap index file are added automatically for you.
# Links are added to the Sitemap in the order they are specified.
#
# Usage: add(path, options={})
# (default options are used if you don't specify)
#
# Defaults: :priority => 0.5, :changefreq => 'weekly',
# :lastmod => Time.now, :host => default_host
#
# Examples:
#
# Add '/articles'
#
# add articles_path, :priority => 0.7, :changefreq => 'daily'
#
# Add all articles:
#
# Article.find_each do |article|
# add article_path(article), :lastmod => article.updated_at
# end

add '/about', priority:0.9
add '/rule', priority:0.5
add '/registration', priority:0.8
add '/inquiry', priority:0.1
Category.all.each do |cate|
next if cate.id/100==99
pri = 0.5
pri = 0.8 if cate.id/100 == 0
add category_path( cate.id ), priority:pri
end
Site.all.each do | site |
add site_path( site.id ), priority: 0.5, lastmod: site.updated_at
end
end
SitemapGenerator::Sitemap.ping_search_engines


トップページは明示的にaddしてかかなくてもsitemap.xmlの先頭にはいる。

実行


$ bin/rails r script/sitemap.rb
In '/deploy/hogehoge/current/public/':
+ sitemap.xml.gz 1890 links / 16.3 KB
Sitemap stats: 1,890 links / 1 sitemaps / 0m01s

Pinging with URL 'http://www.hogehoge.com/sitemap.xml.gz':
Successful ping of Google
Successful ping of Bing


publicの下に sitemap.xml.gz ができる。解凍しなくてもクローラーはそのままでsitemapとして読んでくれるので、
robot.txtとwebmastertoolに登録してあるsitemapのパスを代えておく。CGM的なコンテンツならこのスクリプトを
自動でまわしておけばOK.

余談: googleへのsitemap.xml ping

上のスクリプトを動かすと、最後に「Successful ping of Google」とでる。
webmastertoolからSitemapの送信はできるがログインがいる。どうやってやるのかと思ったら、
googleへはgetでパスを送るがけでsitemapの更新を知らせることができるんだ。

http://www.google.com/webmasters/sitemaps/ping?sitemap=http://www.direc.biz/sitemap.xml

Bingも同様なんだろう。

2015年1月9日金曜日

【Ruby】クラスインスタンス変数という罠

 @var は インスタンス変数、 @@var はクラス変数というのはrubyの基礎だが、 @var をクラスメソッドのスコープ内で定義した場合はクラスインスタンス変数というらしい。インスタンス変数のつもりで使うと、スコープはクラス変数にちかく予期せぬ動きになってはまる。継承したクラスからはアクセスできないので 他の言語のprivateに近いか。



# coding:utf-8

class Test

def self.set v
@var = v
end

def self.get
@var
end

end

Test.set("first desu.")
Test.set("second desu.")

p Test.get
p Test.get



実行結果


$ ruby /tmp/test.rb
"second desu."
"second desu."


 間違えやすいわりに、使いどころが不明だ。

2015年1月7日水曜日

【Rails】Parallelで並列処理すると"DEPRECATION WARNING: Database connections will not be closed automatically, please close your database connection at the end of the thread by calling `close` on your connection. For example: ActiveRecord::Base.connection.close" と警告がでる

 ループ処理の高速化のためParallelでマルチスレッドにすると、処理後に、「DEPRECATION WARNING: Database connections will not be closed automatically, please close your database connection at the end of the thread by calling `close` on your connection. For example: ActiveRecord::Base.connection.close」という警告がでる。
コネクションを自分で閉じろとな、ふむふむ。言わんとしていることは分かるので、警告に従いclose処理をいれる。


Parallel.map_with_index( array, :in_threads=> 4 ) do | data, idx |
begin
# やりたい処理
rescue => ex
Rails.logger.error "エラーです。"
ensure
ActiveRecord::Base.connection.close
end
end

しかし警告は消えない。ホワイ? 結局解決方法はみつからず。しかし何回動かしてもプログラムの動作には
問題ないし、接続先のDBで接続すうを見てみると。

プログラム実行時


mysql> show status like 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 24 |
+-------------------+-------+
1 row in set (0.01 sec)

プログラム終了後


mysql> show status like 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 14 |
+-------------------+-------+

プログラム終了後に接続数はちゃんと減っているので大丈夫なんではないだろうか。

2015年1月6日火曜日

【RubyOnRails】オートコンプリート rails3-jquery-autocomplete を使うより jquery-ui のautocompleteを直接使う方がよかった。

 Railsでオートコンプリートというとrails3-jquery-autocompleteが主流なようだが、
  • マルチバイト文字を使うとき2文字以上入力しないと候補が表示されない
  • 該当する候補がないときにでる「no existing match」を消せない、且つ文字もかえれないっぽい。
という問題がある。
特に1つ目は今作ってるサービスはオートコンプリートで出したい候補に2・3文字のものが多いので、2文字手で打った段階でサジェストだとほぼ意味がない。
というわけでjquery-uiを使ってみる。
rails3-jquery-autocompleteも中ではjquery-uiのautocompleteを使っているようなので、同じことができるはず。

このブログの記事を参考にさせてもらいました。

ただ、同じページにオートコンプリートしたいテキストボックスが複数ある場合だとこのサンプルだとうまくいかないので、ちょっと修正。

■HTML










■Javascript





1文字入れただけで候補が表示されるオートコンプリートを実現できた。
次はフォーカスした段階で、候補(この時点では絞り込まれていないリスト全体)を表示できるようにしたい。

2015年1月5日月曜日

【Javascript】consoleに出力したときに [object Object] とでる変数の中身を見るには

 jsのデバッグは console.log をつかうけど、


function( val ){
console.log("val="+val);
}

みたいにした場合、valがオブジェクトだと、
consoleには


val=[object Object]


って表示されてよくわからない。
中身をみるには、その変数だけを console.logに渡す。


function( val ){
console.log( val );
}


そしたらconsoleで中身を開けていける。



2015年1月4日日曜日

さくらVPSでcronに設定したRailsのバッチが動かなくてはまった。

こんな漢字でRailsのscript下にあるバッチのプログラムをcrontabに設定していたがまったく動かない。


0 3 * * * cd /deploy/my_app/current; bin/rails runner -e production "MyBatch.new.run"


手で叩くと動くし、echoするだけのコマンドならcrontabで実行できる。cronのログを見てみると、ちゃんと実行しようとしているし。。。。
切り分けで ファイルを作成するだけのrubyのプログラムを作ってそれをcrontabに設定してみたらそれも動かない。ここまでやって、rubyのPATHがとってないってことに気づいた。
それで下記のようにcrontabの冒頭でPATH設定して解決。


PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/goy/bin

0 3 * * * cd /deploy/my_app/current; bin/rails runner -e production "MyBatch.new.run"



これも前にもはまった記憶があるな。。。
けっきょくRails関係ないLinuxの基本的なお話。

2015年1月3日土曜日

NAVY SEALS 観た。

 年末年始の休みになんか見ようということでレンタル。息子と一緒にTSUTAYAにいくと、まったく落ち着いて選べない。「アンパンマンのところ行く~」の連発。しかもなにやらトイレ我慢しているっぽいモジモジ君。。。しかし「おしっこでない!」っていや、我慢してるだろ絶対!

 っということで失敗しないようヒューマン系はさけてドンパチ系のわかりやすそうなやつに。

 軍人ものって、死と隣り合わせなこと、で隊員にも家族がいてその家族はいつも急に家族を失うことになるかもしれないという恐怖に耐えなきゃいけないことを強いられる職業だ ということがしっかり描かれている。特殊部隊をヒーローナイズする系のものだとそこらへんはアクションの引き立て程度っていうか、描かれてないのが普通だし、こっちの方がリアルだよな。
 そういう職業絶対無理だわ。おれはITエンジニアでよかった。きっとリアルにそういう職業のひとも若いときはそういうこと考えないで、危険な作戦に身をさらすことにスリルや使命感を感じるってことばっかりで入隊したりするのかもだけど、後で家族ができるときっと考えるんだろうなぁ。(俺も前のブラックな会社はある意味特殊部隊級で、子供が生まれるから考えて転職したな。ぜんぜんレベル違う話だけど。)

 メキシコ?の市街の一角が麻薬カルテルに占拠されてて、警察も手出しできなくて、その地下にアメリカまで伸びてる大規模なトンネルが複数あるって本当なんか? 

 http://commonpost.info/?p=80073
 あ、本当なんだぁ、メキシコすごいな。。。

 職務に忠実でも、隊員が大事でも、勇敢でも、マニュアルにどうあったって、
 自分の死確実って行為を1秒で決めて実行できるかって、その場にならないとわからないなぁ。
 今シュミレーションする限りは、無理だな。
1.5秒で次善の策を考えてそれにしそう。それでもいいよな。うん、きっといいはず。