プログラミングと目的

桐島、Rubyやめるってよ」ってプレゼンが有って、まぁ論理的じゃなくふんわりしててあんま好きじゃないんだけど、それはそれとして、職業プログラマなら目的なかったらアホだけど、自宅でやるならアリだよね。

 
んで、目的ナシで成果が出るときってどんな場合だろう?って考えてた。んで突き詰めてくと、道具って目的を内包してるなと気づいた。トンカチ握ると何でも釘に見えるという揶揄があるが、それはそれとして、トンカチの作り出された目的は釘を叩くことである。プログラミングするってことはプログラミング言語を使うことであり、プログラミング言語も勿論道具であって、プログラミング言語の作り出された目的はコンピュータをうまく動かすことである。つまり、コンピュータの長所を活かすことでならプログラミング言語と戯れることで成果を残す可能性がある。
 
コンピュータの長所って言うと、
  • 計算が速い
  • 決められた順番に間違いなく実行してくれる
  • 繰り返しに強い
  • 寝ないで働ける
  • 大量の情報を扱っても疲れない

などなど。

 

これらの方面では成果を残せる可能性があるわけだ。インターネットとその先のデバイスを含めるとまぁ膨大なことができる。が、汎用ロボットは発達してないので物資界への関わりは限定的かな。そして人工知能はまだ居ないので創造性のあることはできない。あと、非プログラマの人々の力がないとできないことっていっぱいあるよね。

 

というわけで、成果がコンピュータに関わる範囲で収まるので満足できる人には、目的なしでプログラミングに打ち込むのもいいんじゃないでしょうか。

iPhoneにはてなブログアプリ入れてみた

これで万年床から書けるので更新頻度上がるかも?

しばらく停止してたのですが毎日100人前後は来てくれるみたいで有難いことです。

アクセス解析が付いてるとやっぱいいね。誰かが見てくれるっていうのは励みになりますね。というか誰も見てくれななかったら絶望する。自分が見てればいいという人もいるかもだけど。

アクセス解析見たら1日700人ぐらい来てた。ありがてえ。ところで、はてなブログアプリがサクサク動かなくてイラッとする。画面切り替えで溜めが入る感じ。

「ふーん、で、君はウェブサービスでどれが好きなの?」

「オウフwwwいわゆるストレートな質問キタコレですねwww
おっとっとwww拙者『キタコレ』などとついネット用語がwww
まあ拙者の場合ウェブサービス好きとは言っても、いわゆるビジネスとしてのウェブサービスでなく
メタSF作品として見ているちょっと変わり者ですのでwwwジェイン・マクゴニガルの影響がですねwwww
ドプフォwwwついマニアックな知識が出てしまいましたwwwいや失敬失敬www
まあソーシャルのメタファーとしてのFacebookは純粋によくできてるなと賞賛できますがwww
私みたいに一歩引いた見方をするとですねwwwポストTwitterのメタファーと
商業主義のキッチュさを引き継いだサービスとしてのですねwww
Instagramの文学性はですねwwww
フォカヌポウwww拙者これではまるでオタクみたいwww
拙者はオタクではござらんのでwwwコポォ」

Heroku に Rails 3.1 アプリを git push すると rake assets:precompile でエラーが出るときの対処法

Heroku で Rails 3.1 アプリを git push heroku master するとこんなエラーが出ることがあると思います。

-----> Preparing app for Rails asset pipeline
       Running: rake assets:precompile
       rake aborted!
       Failed to connect to a master node at localhost:27017

       Tasks: TOP => environment
       (See full trace by running task with --trace)
       Precompiling assets failed, enabling runtime asset compilation
       Injecting rails31_enable_runtime_asset_compilation
       Please see this article for troubleshooting help:
       http://devcenter.heroku.com/articles/rails31_heroku_cedar#troubleshooting

で、その末尾に書いてある URL を読むと、どうもこのタスクが実行される時点では環境変数(heroku config で見れます)が存在してないらしい。なので、config/database.yml や config/mongoid.yml で、ENV["DATABASE_URL"] とか ENV["MONGOLAB_URI"] を使用してると、nil が返り空白になり、デフォルトアドレス・デフォルトポート(この場合は localhost:27017)を見に行ってコケるらしい。


んでもって、何もコミットせずに再度 git push heroku master とかしてみたら、"Everything up-to-date" とか出やがる。あー、git push 自体は受け入れられてるのね。
ってことで、

$ heroku run rake assets:precompile

と後付けでやったところ、うまく動きましたとさ、めでたしめでたし。
(staging 環境とか作ってる人は適当に --app つけたりして脳内で補って下さい)

Rails のモデル名・ファイル名・ディレクトリ名を一斉に変更するスクリプトを書いた(修正版)

Rails のモデル名変更スクリプトを、まだ名前を明かせぬ人と一緒にペアプロして作った。
全テスト、オールグリーンなので、多分大丈夫。まぁでも Git などの SCM は必須だねぇ。当然、無保証です。
あ、テーブル名・カラム名変更は誰か追加して完全版作ればいい。ウチは今 MongoDB なんで必要ないんすよー。


実行はこんな感じ。

$ rails runner ./script/rename Old New


肝心の内容は以下。
あー、変数名は before/after じゃなくて old/new の方が良かったなー。適当に直すがよろし。

script/rename:

#!/usr/bin/env ruby
# coding: utf-8

old = ARGV[0]
new = ARGV[1]

if old.blank? || new.blank?
  STDERR.puts "Usage: rails runner ./script/rename old new"
  exit 1
end

old = old.downcase
new = new.downcase
olds = old.pluralize
news = new.pluralize

def file_each(&block)
  Dir.glob('./**/*') do |file|
    next if file["script/"]
    next if file["Gemfile"] || file["Rakefile"] || file["Guardfile"] || file["config.ru"]
    next if file["vendor/"]
    next if file["config/"] && !file["routes.rb"]
    next if file["db/"]
    next if file["tmp/"] || file["log/"] || file["doc/"]
    next if file[".git/"]

    print "."  
    yield file 
  end
  puts
end

# ディレクトリ名を変更する
puts "ディレクトリ名を変更しています"
file_each do |file|
  next unless File.directory?(file)
  if file[olds]
    # 複数形を変更する
    File.rename(file, file.gsub(olds, news))
  elsif file[old]
    # 単数形を変更する
    File.rename(file, file.gsub(old, new))
  end
end

# ファイル名を変更する
puts "ファイル名を変更しています"
file_each do |file|
  next unless File.file?(file)
  if file[olds]
    # 複数形を変更する
    File.rename(file, file.gsub(olds, news))
  elsif file[old]
    # 単数形を変更する
    File.rename(file, file.gsub(old, new))
  end
end

# ファイルの中の文字列を変更する
puts "ファイルを変更しています"
file_each do |file|
  next unless (File.file?(file) && !File.extname(file).match(/\.(jpg|png|gif|ico)$/))
  # 複数形を変更する
  system %Q|sed -i s/#{olds}/#{news}/g #{file}|
  system %Q|sed -i s/#{olds.capitalize}/#{news.capitalize}/g #{file}|
  # 単数形を変更する
  system %Q|sed -i s/#{old}/#{new}/g #{file}|
  system %Q|sed -i s/#{old.capitalize}/#{new.capitalize}/g #{file}|
end

(11/29 修正:sed によるファイルの書き換えが sync する前に、ファイル名・ディレクトリ名の変更が走って中身が古いままだったので、sed の処理を後ろにまわした)
guard-spork なんか使ってる人は、再起動すれば、テスト通る。