imgの画像が取得できなかった場合に別の画像を表示する

imgの画像が取得できなかった場合に別の画像を表示するのはonerrorを使うといいらしい、というのはWebで散見できました。
このときonerrorで指定する画像がさらに取得できなかった場合は永久ループするので、ループしないように仕込む必要があるとのこと。
これについてもonerrorの処理を一回だけにするような解決方法があるようなのですが、
昨今のほとんどのクライアント環境でHTML5が使えるのならこの別の画像自体をCanvasで作ったほうがいいんじゃないかと思って試作。
imgである必要さえないのでは?とも思いましたがHTMLやCSSの構成上画像のほうが都合がいいこともある(はず?)

Canvasを用意

function createCanvas() {
  var canvas = document.createElement('canvas');
  canvas.width = 150;
  canvas.height = 150;
  var context = canvas.getContext( "2d" ) ;
  var text = 'Not Found';
  context.textAlign="center"; 
  context.fillText(text,75,75);
  context.rect(0,0,150,150);
  context.stroke();
  return canvas;
}

imgで指定された画像が取得できない(onerrorが発生)場合の処理

document.addEventListener('DOMContentLoaded', function() {
  var elements = document.querySelectorAll('img');
  for (var i=0; i<elements.length; i++) {
    elements[i].addEventListener('error', function() {
      var canvas = createCanvas();
      this.src =  canvas.toDataURL();
    });
  }
});

imgで指定された画像が取得できない(onerrorが発生)場合の処理(jquery版)

$(function(){
  $('img').error(function(){
    var canvas = createCanvas();
    $(this).attr('src', canvas.toDataURL());
  });
});

検証

Chrome, Firefoxは問題なくCanvasで生成した画像が表示されましたが
IE11でたまにonerrorが発生しないことがありました。
onload、document.readyあたりをもうちょっと工夫したほうがよいかもしれません。

qmailインストールメモ

Rails1.xとRails2.xのscaffoldの使い方が違う

Railsの便利なジェネレータ機能scaffold
が、何回使ってみても、どこの解説を見ても、全然思うように動いてくれない
いっこうにコツが掴めないままかなりの時間を使いましたが
要はRailsのバージョンが違うとscaffoldの使い方も違ったということで…

Railsにてscaffoldしてmigrationしたのにデータベースにcreateされるテーブルのカラムが足りない

Rails2.xにて、scaffold のオプションにてカラムの型を指定しますが、これには大文字小文字の区別がある。誤って大文字を設定してmigrationを実行してしまうと、そのカラムは設定されない。このとき、何もエラーらしきものが発生しないのも注意!(※RadRails上、そう見えるだけなのかもしれない?)


誤ってStringと型指定してしまう

> scaffold user name:String

生成されるマイグレーションファイル

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.String :name # 正しくは t.string :name

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

migration実行

> rake migration

 コンソール上にも、特にエラーもなにも起こらない


生成されたテーブル

 name カラムが生成されない

mysql> desc users;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| created_at | datetime     | YES  |     | NULL    |                |
| updated_at | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
7 rows in set (0.02 sec)

Apache+OpenSSLのインストーラにopenssl.cnfがない

Download - The Apache HTTP Server Project より Win版の apache_2.2.14-win32-x86-openssl-0.9.8k.msi をダウンロードしてインストー
Apacheのインストーディレクトリ内をgrepしてもopenssl.cnfが見当たらないのはそういうモンなんだろうか?
それでも以下のコマンドで公開鍵(server.csr)が作成できてしまう不思議

openssl.exe req -new -key ../conf/server.key -out ../conf/server.csr -config ../conf/openssl.cnf

ちなみに「-config」オプションがないと怒られます
これまた不思議…