blog.takuyan.com

Ruby & Javascript & Hack

HerokuとGitで、2台のPCによる共同開発をやる

なにがしたいのか

自分が会社のPCと、ノートPCの両方で開発したいだけなんですがね。
技術者なんか俺だけですので。


Heroku関連は過去記事参照のこと。


参考:WindowsでRubyでHerokuでGitでRailsやった - 常識という迷信

最初に、railsプロジェクトの作成とHerokuへのcommit

会社でプロジェクトを作成して、手元のgitにcommitする。

rails myapp
cd myapp
git init
git add .
git commit -m "first commit hogehoge"


次に、ディレクトリはそのままで、Heroku側にアプリを作成する。

heroku create myapp
git remote add heroku git@heroku.com:myapp.git
git push heroku master

ここまでは、Herokuインストールして「heroku」だけ入力すると同じのが出ますので。

次に、ノートPC側でrailsプロジェクトを共有する

事前準備

ノートPCにも、予めGit&Herokuはインストールされているものとします。
鍵も作成&Herokuに送付しておくこと。分からない場合は、以下参照。


参考:Deploying with Git | Heroku Dev Center


こんなカンジで鍵を作りました。

ssh-keygen -C "xxx@example.com" -t rsa
Herokuのmyappをgitでpullする

ノートPCの任意のディレクトリで以下を実行する。

git clone git@heroku.com:myapp.git


そうすれば、任意のディレクトリ以下にmyappディレクトリ以下の全ファイルが作成される。
git initあたりもやってくれる。

手元のgitにherokuのリポジトリを登録する

cd myapp
git remote add heroku git@heroku.com:myapp.git

Herokuにpushする

# add とか、commitとかしたら...
git push heroku master

おまけ

log以下のファイルはgitで管理したくないので、除外します。
やりかたは、以下のサイトが詳しいので参考のこと。


参考:はてなダイアリー

ActiveRecordでのdistinctについて

  • あるModelから、
  • user.idで抽出し、
  • field_nameでDistinctしたレコードを、
  • created_atの降順で、
  • 5つ欲しかった

ので、以下のように実装してみた。

models =
  SomeModel.find(:all,
            :select => "distinct field_name",
            :limit => 5, 
            :order => "created_at desc", 
            :conditions => ["user_id = ?", user.id])

ローカル環境(MySQL)では、こいつでもまあ良かったのだが、
公私共にお世話になっているHerokuではPostgresqlを使っている様子で、
Distinct の文法が若干異なるのでエラーを出された。


なんで、以下のようにして解決した。

if connection.supports_count_distinct?
  select_str = 
    connection.distinct(:field_name, "created_at desc")
  models =
    SomeModel.find(:all,
              :select => select_str,
              :limit => 5, 
              :conditions => ["user_id = ?", user.id])
end

細かい点

connection.supports_count_distinct?

こいつは、各データベース用のアダプタでDistinctが実装されているか確認するメソッド。
connectionってのは、以下を参照のこと。


参考:
Ruby on Rails - ActiveRecord -

ありえるえりあ

  connection.distinct(:field_name, "created_at desc")

こいつで、各データベースがDistinctを拡張しているので、
言われたとおりにデータを渡す。


参考:


というカンジ。

ついでに

なお、Distinctが実装されていない場合も考えて
以下の実装も追加した。

temp_models = 
  SomeModel.find(:all,
            :order => "created_at desc", 
            :conditions => ["user_id = ?", user.id])

models = 
  temp_models.map{ |i| i }.uniq[0..5]

まとめ

最終的にはこんなカンジ。

class SomeModel < ActiveRecord::Base
  def self.recent(user)
    if connection.supports_count_distinct?
      select_str = 
        connection.distinct(:field_name, "created_at desc")
      models =
        SomeModel.find(:all,
                  :select => select_str,
                  :limit => 5, 
                  :conditions => ["user_id = ?", user.id])
    else
      temp_models = 
        SomeModel.find(:all,
                  :order => "created_at desc", 
                  :conditions => ["user_id = ?", user.id])

      models = 
        temp_models.map{ |i| i }.uniq[0..5]
    end
  end
end

rubyの自己代入擬似演算子について

あまりにもブログ書いてないので、適当に書いてみる。

自己代入擬似演算子

x += y # => x = x + y
x -= y # => x = x - y
x *= y # => x = x * y
x /= y # => x = x / y
x %= y # => x = x % y
x **= y # => x = x ** y
x &&= y # => x = x && y
x ||= y # => x = x || y
x &= y # => x = x & y
x |= y # => x = x | y
x ^= y # => x = x ^ y
x <<= y # => x = x << y
x >>= y # => x = x >> y

取り急ぎ。

即視力回復した...!?

仕事柄ずっとモニタとにらめっこなので、さすがに最近は視力の低下を感じる。
そんなとき、下記の「眼筋トレーニング」を読んだので、さっそく今朝、通勤時にやってみた。

涙が出るまで遠くを見る眼筋トレーニングの効用 | Lifehacking.jp

たとえば遠くにある建物の表面がタイル状だったりすると、このとき端から端までタイルがいくつあるのか数えたりします。また、遠くに木立があると、ほとんど見えるはずもない木の葉の一枚一枚が見えるようになるまで目を見開いて見つめます。夜なら一目でわかる一等星など無視して、暗い等級の星を探します。

ということなので、駅から仕事場まで歩いてるときに、正面に見えるビルのタイルで試した。
書いてあった通り「このとき眉間に力をいれず、目をしかめず、カッと見開いて」見てみた。


すると、やはり目が潤んできたので、そこで中断した。
何度かまばたきをして、再度タイルを眺めると、なんとさっきより、大きく、鮮明に見えた。
タイルの枚数も数えることが出来た。


「こんなにすぐに効き目がでるとは。」と、驚きだった。




が、直後、自分の頭の悪さに笑えた。
まだ寝ぼけていたようだ。

一般的なID/クラス名の例のまとめ

いつも忘れて本を開くので、自分用のメモ。


転職後、WEBデザイン全般も担当するようになり、XHTML&CSSもガツガツ書くようになったが、
なにぶん、ID名とかクラス名が思いつかないことが多いので、以下表の名称を頻繁に使わせて貰っている。

部品例 名称例
本文全体を囲むコンテナ container, wrapper, page, pagebody, all
ヘッダー header, header-area
ナビゲーション nav, navi, navigation
グローバルナビゲーション global_nav, gnav
ローカルナビゲーション local_nav, lnav
補足ナビゲーション assist_nav, utility, utility_nav
パンくずナビゲーション topicpath, breadcrumbs
コンテンツ全体 content(s), container, wrapper
メインコンテンツ main, maincontent(s), content(s), alpha, primary
サブコンテンツやサイドバー sub, subcontent(s), sidebar, bate, secondary
見出しと本文のまとまり section, entrybody, article(s)
記事単体 article(s), entry(-ies)
フッター footer, footer_area, copyright, publication
ロゴ logo
メインの絵 keyvisual, mainvisual
画像や写真、グラフなど image, photo, fig, figure
検索 search, search_area, search_box
注釈、ヒント、本題から外れた補足や囲み記事 aside, hint, note
商品一覧 products, item_list, shopitems

現場のプロから学ぶXHTML+CSS

現場のプロから学ぶXHTML+CSS


この本、ホントに良いのでオススメです。

また、HTML5のサイトなども確認すると良いとのこと。

RubyにおけるFizzBuzz

ブラウジングしてたら、ひさびさに読んだ。
どうしてプログラマに・・・プログラムが書けないのか?

かなりの試行錯誤の末に、コードを書こうともがいている人たちというのは、単に大きな問題に対して苦労しているのではないことがわかった。やや小さな問題(連結リストを実装するというような)に対して苦労するということでさえない。彼らはまったくちっぽけな問題に苦労しているのだ。


それで、そういった類の開発者を見分けるための質問を作り始め、私が「Fizz-Buzz問題」と呼んでいる問題のクラスを考え出した。これはイギリスの学校の子供たちがよくやっている遊び(というかやらされている遊び)にちなんで名付けた。Fizz-Buzz問題の例はこんな感じだ。


 1から100までの数をプリントするプログラムを書け。
 ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、
 3と5両方の倍数の場合には「FizzBuzz」とプリントすること。


ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。


で、やってみた。記録は2分ジャストくらい。
「ちゃんとしたプログラマ」認定は頂けませんでしたww

for i in 1..100
  str = ""
  str << "Fizz" if i % 3 == 0
  str << "Buzz" if i % 5 == 0
  str << i.to_s unless i % 3 == 0 || i % 5 == 0
  puts str
end

もっとスマートに書けないかなぁ、と思ってググッたら、
こんな感じのワンライナーを発見。
Rubyの最短FizzBuzzの解説、の補足 - バリケンのRuby日記 - Rubyist

1.upto(?d){|i|i%3<1&&x=:Fizz;puts i%5<1?"#{x}Buzz":x||i}


うはは。
いまの俺じゃさすがに2分以内にここまではできねぇや。


精進が足らないみたい。


にほんブログ村 ベンチャーブログへ

最近ハマったiPhoneアプリ3選

1. blocked

f:id:kattton:20090417012058j:image
右側に一箇所、固定でEXITがあって、特定のブロックをそこにブチ込むという単純アプリ。


単純だからこそ、そうとうハマった。
頭が痛くなるほどやったレベル。

2. ZEN BOUND

f:id:kattton:20090417012501j:image
簡単に言えば、木像に紐を巻き付けていくという、これまた単純アプリ。
黙々とプレイしている様を観察すると、『この人、そういう趣味があるのかも』という誤解を与えかねないのが残念な点だが、やはりこれも止まらない。


数日は常に寝不足なレベル。
f:id:kattton:20090417013926j:image
あらかた巻くとこんな感じ。

3. GEO DEFENSE

f:id:kattton:20090417013152j:image
俗に言う、タワーディフェンスモノ。これまた単純アプリ。これは現在進行形でハマってます。


他のタワーディフェンスモノと違う点は、比較的モノが小さめなのと、敵を倒した時の爽快感ですね。連続で倒した時なんか、音もスゴイし、火花もスゴイし、確実に視力が低下するレベルです。


f:id:kattton:20090417013708j:image
敵を倒した時。


ともあれ、すべてオススメです。


流石は進化するケータイ、iphoneといったところ。
これからも楽しませてくれそうです。