kaeruspoon

Write Great Code〈Vol.2〉低いレベルで考え高いレベルで書く: 本: Randall Hyde,鵜飼 文敏,まつもと ゆきひろ,後藤 正徳,八重樫 剛史,トップスタジオ

Write Great Code〈Vol.2〉低いレベルで考え高いレベルで書く

「Write Great Code〈Vol.2〉低いレベルで考え高いレベルで書く」を買いました。高かったけどおもしろそうだったから。アセンブラは高校の授業でやって以来だなあ。

Amazonおすすめ広告をつくってみた

 Amazonには、google adsenseみたいに、サイトの内容に即した広告を出すシステムがある。でも、なんだかいまいちで、どこがサイトの内容に即しているのかよくわからないし、そもそも毎回内容が変化しないのであまり広告としての意味もないのです。
 そこで、今までブログで紹介してきた製品を、最初の記事の下にランダムで表示するようにしてみました。これならぼくのオススメという感じがするし、なんだかいい感じです。

Railsの開発環境でもThinを使う

 開発環境でThinを使っても、別プロセスでtail -f でログを見なくちゃいけないので面倒です。なので、commands/serverのソースを参考に気軽にThinを開発環境で使えるようにしてみました。

RAILS_ROOT/script/thin

#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/boot'
require 'activesupport'
require 'commands/servers/base'

ENV["RAILS_ENV"] = "development"
RAILS_ENV.replace("development") if defined?(RAILS_ENV)

require 'initializer'
Rails::Initializer.run(:initialize_logger)

puts "=> Rails application starting by Thin"
puts "=> Ctrl-C to shutdown server"
tail_thread = tail(Pathname.new("#{File.expand_path(RAILS_ROOT)}/log/#{RAILS_ENV}.log").cleanpath)

trap(:INT) { exit }

begin
  `thin start`
ensure
  tail_thread.kill if tail_thread
  puts 'Exiting'
end


これだけ。特に深くソースを探ったわけではないので、おかしなことをやっているかもしれないけど、まあ動いたし、使うのはぼくだけだからいいや。これで、

./script/thin

を実行すれば、

[tsukasa@] $ ./script/thin 
=> Rails application starting by Thin
=> Ctrl-C to shutdown server
  SQL (0.000165)   SET NAMES 'utf8'
  SQL (0.000103)   SET SQL_AUTO_IS_NULL=0
  SQL (0.000120)   SELECT version FROM schema_info

こんな感じでログも表示されるので便利です。

javascriptの実行中に外部スクリプトを実行する方法で、document.writeにハマる

 ページのonload後にjavascriptを実行し、その最中に外部のjavascriptファイルを読み込んで実行したかったのだけど、

$('sample').insertHTML = '<script type="text/javascript" src="http://sample/test.js"></script>';

みたいなやり方ではダメだった。だめっぽい雰囲気は漂っていたけど、やっぱりスクリプトを実行してくれない。
いろいろ調べてみて、次のやりかたで解決することがわかった。

var js = document.createElement("script");
js.type = "text/javascript";
js.src = "http://sample/test.js";
$('sample').appendChild(js);


 ところが、その外部スクリプトが広告を表示するもので、内部でdocument.writeを使っていると、新たなページを構築しようとするのか白紙になって、しかも処理が返ってこなくなる。
 ここでいろいろハマったのだけど、以下のようなやり方で解決した。

document.write_original = document.write;
document.write = function(){
        var buffer = [];
        for(var i=0; i < arguments.length; i++){
                buffer.push(arguments[i]);
        }
        $('sample').innerHTML = buffer.join("");
};

こうやって、問題のdocument.write自体を書き換えてみた。このあとで、上記の外部スクリプトを実行する処理を行えばOK。

というようなことを、飲み会で終電がなくなったので会社に戻り、カップラーメンを食べたり仮眠を取ったりしてコンタクトの目が超ドライアイな土曜日の朝にやっていたりします。ずっと起きて仕事をしていたみんなは、今就寝中です。そろそろ帰ろうっと。

追記
このままではまだちゃんと動きません。「ページロード後に外部スクリプトのdocument.writeを実行する方法の間違いを直す」に続きがあります。

またまた小説に失敗する

 ライトノベルを買ってみたら、超駄作だったというお話。これでお金とっちゃいけないよ。オンライン小説のレベルよりも低いぞ。最初の数ページは、よく文章を読んで買わなくちゃです。こうなったら、秘蔵のトマス・H・クックの新刊を読んでお口直しをしなければ。

RailsでURLパラメータにactionが存在したときの対処方法

 Railsで、URLパラメータにactionという名前が使われていると、controllerのactionと名前がかぶってしまって、うまくルーティングができなくなります。もちろん、そんな名前のパラメータを使わなきゃいいんだけど、昔のシステムでそんなURLを使っていて変更できないときなんかは困ったことになります。
 そんな場合は、config/routes.rbで

  map.connect ":controller/:method_name/:id", :controller => "Sample", :action => "router"

みたいな感じにして、SampleControllerで

  def router
    if request.url =~ /\?.*action=([^&]+)&*/
      @param_action = $1
    end

    if self.public_methods(false).delete_if{|a| a == "router"}.include?(params[:method_name])
      eval(params[:method_name])
    else
      (エラー処理)
    end
  end

としてやれば、とりあえずなんとかなります。他にもっといい方法があるかもしれません。

会社でも家でもプログラミング

 仕事で朝10時から夜8時くらいまでRubyプログラミングをして、家に帰ってご飯を食べたら寝るまで3時間くらいRubyでまたまたプログラミングをしているのですが、さすがにやりすぎだろうと思わないでもありません。
 今はmilookの完全リニューアルに取り掛かっているところ。今はオレンジ色がベースだけど、今度は青っぽくなるかもです。