WebでFIGletなんて使うところないよなあ、と思ってたら。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--    
                                              88           88              
      ,d                                      88           88              
      88                                      88           88              
    MM88MMM  88       88  88,dPYba,,adPYba,   88,dPPYba,   88  8b,dPPYba,  
      88     88       88  88P'   "88"    "8a  88P'    "8a  88  88P'   "Y8  
      88     88       88  88      88      88  88       d8  88  88          
      88,    "8a,   ,a88  88      88      88  88b,   ,a8"  88  88          
      "Y888   `"YbbdP'Y8  88      88      88  8Y"Ybbd8"'   88  88

-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

TumblrのソースにはFIGletが!

Googleマップのリファレンスによれば、GoogleマップはまだSSLに対応してないらしい。(SSLでのGoogleマップ

google_maps_alert

うぜぇっ。

Proxy作るもの面倒だしなあ・・・。

・・・・・・・・・っっっ!?

&lt;script type="text/javascript"&gt;var _alert = alert; <strong>alert = function(){}</strong>&lt;/script>
&lt;%= javascript_include_tag "http://maps.google.com/maps?file=api&v="+GOOGLE_MAPS_API_VERSION+"&key="+GOOGLE_MAPS_API_KEY %&gt;
&lt;script type="text/javascript">alert = _alert&lt;/script&gt;

これでよしと・・・。

・・・最低だ。

大体の画像系と同じようにnilとかを入れるだけでOK。

% ./script/console
Loading development environment (Rails 2.1.0)
>> grave = Grave.first
=> (略)
>> grave.overview.url
=> "/system/graves/overviews/1/normal/test_picture_large.gif" 
>> grave.overview = nil
=> nil
>> grave.save
=> true
>> grave.overview.url
=> "/overviews/normal/missing.png"

しかも、削除した場合のURLが自動的にmissing.pngに変わってる。

この勝手な挙動が嫌いな人もいるかもしれないけど面倒臭がりの俺としては嬉しい。

画像があるかどうかは、grave.overview.exists? で分かる。

thoughtbot: Paperclip File Attachments

Requirements

Only ImageMagick, which you can install quite easily install via apt, yum, or port, or the package manager of your choice.

あとやっぱりRMagick無くても動く!そういやImageMagick自体が問題なんじゃなくて、殆どの場合、パッケージのImageMagickが言語バインディングと合わないことが問題だったんだよね。PureRubyで再実装しかないと思ってた。頭良いな作者。

Helperはrails2.xからApplicationControllerにhelper :allとか書いてあって、こちらに書かれてるように優先順位があってハマった。(名前がかぶってたので)

パフォーマンスが厳しいアプリはhelper :allを外して、俺の様にそういうアプリがめったに無い場合はどうせ全部読まれるんだったらApplicationHelperに全部書いた方が見通しがいいと思った(実際個別のHelperに書いたのを何度も見失った)。そうなると、コントローラー名Helperがなければいけないという制約がうざい。

最近 config/initializers/rails_ext.rb に追加したもの。

module ApplicationHelper
  def web_root
    request.protocol+request.host_with_port
  end

  def free_dial?(str)
    /^0120/ =~ str ? true : false
  end

  def notice
    content_tag(:div, image_tag("notice.gif", :class =&gt; "icon")+flash[:notice], :id =&gt; "notice") if flash[:notice]
  end

  def warn
    content_tag(:div, image_tag("warn.gif", :class =&gt; "icon")+flash[:warn], :id =&gt; "warn") if flash[:warn]
  end

  def focus(element)
    content_tag(:script, "$('#{element}').focus()", :type =&gt; "text/javascript")
  end

  def options_by_prefectures
#     Prefecture.all.collect {|p| [p.name, p.id] }.unshift ["-- 選択してください --", nil]
  end
end

~/.rails/default/config/initializers/rails_ext.rb とかに置いといて、railsプロジェクト作成後にdefaultディレクトリ毎上書きする。

説明しようもないもんばっかり。free_dial? がお気に入りです。何に使うかというとおなじみのフリーダイアルアイコンを出すかどうか?とかだけです・・・。

options_by_prefecturesは都道府県プルダウン。どうせ毎回使うんだけどさすがに無いとエラーなので一応コメントアウトを。

何か、こういうライブラリとかにするまでもない小粒なコード辺が好きだ。ライフハックとか生活の裏技のプログラマー版みたいなもんか。

コード辺は実際に動いてくれる。それでいて主張は小さく、押しは弱い。常に「何とか志向」や「何とかドリブン開発」のような次々出てくる新しい思考法やメソッドに自分を合わせていかねばならない我々を一瞬ほっこりさせてくれるある種の清涼剤です。

参照:

RailsでGrave(お墓)というクラスを作った。

そしたらところどころで”“grafe”“が無いとか言われる。

おれの得意技typoだと思ってgrepしまくるも見つからず。

先ずirbより始めよ

の格言に従って調べると・・・

% irb -r activesupport
&gt;&gt; "grave".pluralize
=&gt; "graves" 
&gt;&gt; "grave".pluralize.singularize
=&gt; "grafe"

!?

graveの複数形はgravesだけどgravesの単数形はgrafe!?

あー!

knife => knivesのルールが適応されてるのか。

config/initializers/inflections.rbに例外を書いて治た。

Inflector.inflections do |inflect|
  inflect.irregular 'grave', 'graves'
end

leaf => leaves や wolf => wolves のルールより優先されてる?

もう英語力がね・・・アレなんですわ。

Railsのlayoutで基本、一緒なんだけど

「ココとココのページだけは特定のjavascript読み込みたい」

とか

「SEOのためにtitle, meta description, meta keywordsをページ毎に細かく分けたい」

とかいう場合にControllerで@titleに文字を入れておくとかいうのは非っ常に気持ち悪い。

そういう時、layoutには

&lt;html&gt;
  &lt;head>
    &lt;%= yield :header %&gt;
  &lt;/head&gt;
(略)

と書いておいて、それぞれのページでは

&lt;% content_for :header do %&gt;
  &lt;%= content_tag :title, "タイトル" %&gt;
&lt;% end %&gt;

とやると、

&lt;html&gt;
  &lt;head>
    &lt;title&gt;タイトル&lt;/title&gt;
  &lt;/head&gt;
(略)

となる。Controllerが綺麗になってうれしい。やっぱりHTMLはViewに書きたい。

javascriptはlayoutの最後の行に同じく yield :footer_js とか作って最後に読んだ方がいいかも。

Railsレシピブックに載ってました。どーってことないアレだけど、183個のレシピのなかでこれが一番うれしかった。

Railsレシピブック 183の技
  • Railsレシピブック 183の技
  • ソフトバンククリエイティブ(2008-05-31)
  • ソフトバンククリエイティブ
  • 定価:¥ 2,940
  • 新品価格:¥ 2,940
  • 中古価格:¥ 2,540
  • ASIN:4797336625

halcyon

Rackの動画の中で気になっていたHalcyon(ハルシオン)。気になったつっても技術的にじゃないけど一応調べときました。(ハルシオンはカワセミのことらしいです。ちなみにパルレオンは無いw)

Halcyonは軽くて速いJSONのフレームワークだそうです。コード見たほうが早い。

class Message &lt; Sequel::Model; end
class Messages &lt; Application
  def new
    # respond with fields acceptable
    ok Message.columns
  end
  def create
    msg = Message.create(params)
    msg.save
    ok msg.id
  end
  def read
    ok Message[params[:id]]
  end
  def update
    Message.filter(:id =&gt; params[:id]).update(params)
    ok
  end
  def delete
    Message.filter(:id =&gt; params[:id]).delete
    ok
  end
end

SequelベースにしてAPIが簡単に作れて、

{"status"=&gt;200, "body"=&gt;"Tue May 27 19:53:15 -0500 2008"}

JSONでレスポンスが返る、と。

API用サーバとかに良いんですかね。最近じゃRailsでも大して手間変わんないので”速い”っていうのがどのくらい速いかが気になるとこです。

No mobile me

MobileMe…

sport-captain

NO THANK YOU…

MySQLロゴ

slowlog

[mysqld]
log-slow-queries=/var/log/mysqld-slow.log
long-query-time=1

slowlogをメール

dailyでlogrotateしておいて、下記。

% crontab -l
50 3 * * * mysqldumpslow -s t /var/log/mysqld-slow.log | mail -s "mysql slowlog" foo@bar.com

CSVにエクスポート

SELECT * FROM employees INTO OUTFILE "/tmp/employees.csv" FIELDS TERMINATED BY ',' optionally enclosed by '"';

CSVからインポート

load data infile "item.csv" into table item fields terminated by ',' optionally enclosed by '"';

CSVからインポート(1行目を無視)

load data infile "item.csv" into table item fields terminated by ',' OPTIONALLY ENCLOSED BY '"' ignore 1 lines;

auto_incrementの値を設定

ALTER TABLE test AUTO_INCREMENT = 1;

ユーザー追加

grant all on dbname.* to `username`@localhost identified by 'password';

バッククォートで囲えばハイフンも使える。

rootのパスワード削除

set password for root@localhost=password('');

DBバックアップ

% crontab -e
0 5 * * * mysqldump -uproject -pxxxxxxx project_production | bzip2 > /var/www/html/project/backups/project_production.`date +\%Y\%m\%d\%H\%M\%S`.dmp.bz2

カラム追加

ALTER TABLE `foos` ADD COLUMN `foo_id` int(11) NOT NULL DEFAULT 123 AFTER `title`;

Macにインストール

% sudo port install mysql5 +server
% sudo -u mysql mysql_install_db5
% sudo cp /opt/local/share/mysql5/mysql/my-small.cnf /etc/my.cnf

Macで起動

% sudo /opt/local/share/mysql5/mysql/mysql.server start

Macでlaunchdで再起動

% sudo launchctl stop org.macports.mysql5
% sudo launchctl start org.macports.mysql5

文字化け

# my.cnf
default-character-set = utf8
skip-character-set-client-handshake

外部からの接続禁止

# my.cnf
skip-networking

クエリーのログを取る

[mysqld]
log=/var/log/mysqld-query.log