トップ «前の日(11-10) 最新 次の日(11-12)» 追記

3 日坊主日記


2003-11-11

_ [Ruby] win32-apache2-ruby1.8.1-mod_ruby (VC6SP5)

できたよ!

追記: Mysql(DBI) との連携を確認。速すぎ!

追記: howto.txt の手順で作った mod_ruby.so を置きました。使われる方は自己責任でお願いします。

_ [qmail] vpopmail はまり道

覚えているうちになんとなくまとめ。

_ ユーザ名にドメインをつけたくない(自分のドメインだけ)。

configure に --enabled-default-domain=<mydomain> をつけましょう。

_ 外部から外部への配信を許可したい(POP before SMTP)。

configure に --enable-roaming-users=y をつけましょう。

_ 自分のドメインは問題ないんだけど、バーチャルドメインが拒否される。

rcpthosts にバーチャルドメインを書きましょう。

_ バーチャルドメインは問題ないんだけど、自分のドメインだけ届かなくなった。

locals から自分のドメインを外しましょう。

vpopmail の FAQ に書いてます。

_ いつのまにかファイルの所有者が変わってる!

vpopmail のインストール時に ~vpopmail 配下のファイルは容赦なく chown されるらしい。

_ いつのまにか alias 設定が効かなくなったんだけど。

UNIXアカウントと同名のユーザの alias ( /var/qmail/alias/.qmail-<user> ) は無視されるみたい。ホームの .qmail に書かないといけません。(例えば tdiary さん^^;)

_ 最新版(開発版)はどこだ?

実は vpopmail.sf.net qmailadmin.sf.net にあります。


2005-11-11

_ [第五] ネットワーク障害

2005-11-11 00:07-00:58 にかけて止まっていました。 原因はモデム-ルータ間のLANケーブルでした。orz

_ Rails勉強会@大阪

やべー。準備できてない。 ポジペも書けてない。 ネガポジリング。

ちょろっと試すとJavaScriptのエラー。うう。

AWDwR はPDF版しか持ってないのだけど、Beta book の段階でAjaxの章の発展的な内容 (仕様が固まっていないところ) はカットされてたりする。印刷本だとどうなってるのか気になる。

本日のツッコミ(全4件) [ツッコミを入れる]

# ささだ [Rails 勉強会?]

# moriq [y]

# keisuken [Rails勉強会をT松でする予定はありませんか(^^;?]

# moriq [やりたいですねぇ]


2007-11-11

_ [Rails] validates_uniqueness_of は信頼できない

ActiveRecord のトランザクション処理を調べてみているのだが、 並行処理すると validates_uniqueness_of を破れるようだ。

# db/schema.rb:
ActiveRecord::Schema.define(:version => 1) do

  create_table "users", :force => true do |t|
    t.column "login", :string
  end

end
# app/models/user.rb:
class User < ActiveRecord::Base
  validates_presence_of     :login
  validates_uniqueness_of   :login, :case_sensitive => false
end

まず script/console を使って SQL を確認しておく。

C:\tmp\demo>ruby script\console
Loading development environment.
>> u=User.new(:login=>"moriq")
=> #<User:0x46906dc @attributes={"login"=>"moriq"}, @new_record=true>
>> u.save!
=> true
>> u=User.new(:login=>"moriq")
=> #<User:0x466f66c @attributes={"login"=>"moriq"}, @new_record=true>
>> u.save!
ActiveRecord::RecordInvalid: Validation failed: Login has already been taken
...
# log/development.log
SQL (0.016000)  BEGIN
User Load (0.047000)  SELECT * FROM users WHERE (LOWER(users.login) = 'moriq') LIMIT 1
SQL (0.000000)  INSERT INTO users (`login`) VALUES('moriq')
SQL (0.047000)  COMMIT
SQL (0.000000)  BEGIN
User Load (0.015000)  SELECT * FROM users WHERE (LOWER(users.login) = 'moriq') LIMIT 1
SQL (0.000000)  ROLLBACK

コンソールをふたつ用意して mysql 接続。

C:\tmp\demo>mysql -u demo demo
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.0.45-community-nt MySQL Community Edition (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> SELECT @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

    C:\tmp\demo>mysql -u demo demo
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 6
    Server version: 5.0.45-community-nt MySQL Community Edition (GPL)

    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

    mysql> SELECT @@tx_isolation;
    +-----------------+
    | @@tx_isolation  |
    +-----------------+
    | REPEATABLE-READ |
    +-----------------+
    1 row in set (0.00 sec)

InnoDB のデフォルト分離レベル (isolation level) は REPEATABLE READ。

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)

    mysql> BEGIN;
    Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM users WHERE (LOWER(users.login) = 'maiha') LIMIT 1;
Empty set (0.00 sec)

    mysql> SELECT * FROM users WHERE (LOWER(users.login) = 'maiha') LIMIT 1;
    Empty set (0.00 sec)

mysql> INSERT INTO users (`login`) VALUES('maiha');
Query OK, 1 row affected (0.00 sec)

    mysql> INSERT INTO users (`login`) VALUES('maiha');
    Query OK, 1 row affected (0.00 sec)

REPEATABLE READ では SELECT の共有ロックはすぐ外れる。 SELECT はスナップショットを読み取る。ロックを設定しない。 INSERT はブロックすることなしに両方とも成功する。

mysql> COMMIT;
Query OK, 0 rows affected (0.08 sec)

    mysql> COMMIT;
    Query OK, 0 rows affected (0.06 sec)

mysql> select * from users;
+----+-------+
| id | login |
+----+-------+
|  1 | moriq |
|  2 | maiha |
|  3 | maiha |
+----+-------+
3 rows in set (0.00 sec)

    mysql> select * from users;
    +----+-------+
    | id | login |
    +----+-------+
    |  1 | moriq |
    |  2 | maiha |
    |  3 | maiha |
    +----+-------+
    3 rows in set (0.00 sec)

mysql> \q
Bye

    mysql> \q
    Bye

DB 側に unique 制約を付けておくべきだな。

_ sqlite3 - Getting Started

いまさらながら sqlite3 (コマンドラインの) Getting Started をやってみた。意外と楽しい。

C:\tmp>sqlite3 ex1
SQLite version 3.5.2
Enter ".help" for instructions
sqlite> create table tbl1(one varchar(10), two smallint);
sqlite> insert into tbl1 values('hello!',10);
sqlite> insert into tbl1 values('goodbye', 20);

MySQL ぽくカラムをインデント表示。

sqlite> .mode column
sqlite> select * from tbl1;
hello!      10
goodbye     20

見出しを見せるには .mode header 。

sqlite> .header on
sqlite> select * from tbl1;
one         two
----------  ----------
hello!      10
goodbye     20

MySQL の \G みたいに見出しと値を組にして見せるには .mode line。

sqlite> .mode line
sqlite> select * from tbl1;
  one = hello!
  two = 10

  one = goodbye
  two = 20

HTML table 形式で見せるには .mode html。

sqlite> .mode html
sqlite> select * from tbl1;
<TR><TH>one</TH><TH>two</TH></TR>
<TR><TD>hello!</TD>
<TD>10</TD>
</TR>
<TR><TD>goodbye</TD>
<TD>20</TD>
</TR>

やめるときは .quit。

sqlite> .quit

スキーマは sqlite_master という名前のテーブルから読める。

sqlite> .mode line
sqlite> select * from sqlite_master;
    type = table
    name = tbl1
tbl_name = tbl1
rootpage = 2
     sql = CREATE TABLE tbl1(one varchar(10), two smallint)

mysqldump みたいにダンプするには .dump。

sqlite> .dump
BEGIN TRANSACTION;
CREATE TABLE tbl1(one varchar(10), two smallint);
INSERT INTO "tbl1" VALUES('hello!',10);
INSERT INTO "tbl1" VALUES('goodbye',20);
COMMIT;

explain は opcode を吐く。これは面白い。

sqlite> .explain

ここで .explain は .column と .width をやってくれるらしいんだけど ちょっと .width 指定がいまいちなので修正……

sqlite> .width 4 16 4 4 8
sqlite> explain select * from tbl1;
addr  opcode            p1    p2    p3
----  ----------------  ----  ----  --------
0     Goto              0     11
1     Integer           0     0
2     OpenRead          0     2
3     SetNumColumns     0     2
4     Rewind            0     9
5     Column            0     0
6     Column            0     1
7     Callback          2     0
8     Next              0     5
9     Close             0     0
10    Halt              0     0
11    Transaction       0     0
12    VerifyCookie      0     1
13    TableLock         0     2     tbl1
14    Goto              0     1
15    Noop              0     0

2008-11-11

_ LED 蛍光灯

試験的に導入。オフィス環境には良い。