メモの日々


2007年03月05日(月) [長年日記]

[ruby] Railsアプリが「Too many open files」エラーを出す

Ruby on Railsで作成中のアプリケーションを動かし続けていると、development.logに

Errno::EMFILE (Too many open files - nantoka.rb):

のようなエラーが出るようになって動かなくなってしまう。

検索すると、RailsのTracに

というチケットがあった。こちらでもSQLiteを使っているので、ここにあるパッチで直るのかも。まだ試していないけどメモ。

修正はtrunkには取り込まれているが1.2ブランチにはマージされていないみたい。待っていればマージされるのかなあ。

(追記)

パッチを適用してみたところ、エラーは出なくなったように見える。この修正がリリースされるまでは Rails + SQLite を運用環境で使うのはまずそうだなあ。

あーっと、これはdevelopmentモードのときだけ起こる問題なのかな。ならあまり気にしなくていいのかも。

やること

  • 年金

2007年03月19日(月) [長年日記]

  • 全然書くことがない。今日の予定を書く。
    • パスの所の処理を見直して、テストを書く。
    • 検索結果画面に手を付けて、検出の機能を作り始める。
  • テストを書くのはできた。でもテストケースが全然足りない。検出の機能には手が回らず。でもこれは後回しでよいことになった。
  • vimのマウス機能が便利すぎる件を試してみた。すごいんだけど、今までとクリック時の挙動が変わるので使いにくいさが勝る。慣れれば平気かなあ。

[howto][unix] grep -r で対象ファイルを絞り込む

grep -r は簡単でよいけど対象ファイルを絞り込めないので不便、と思っていたが、ときどきの雑記帖 リターンズによると絞り込めるみたい。

試してみた。

$ grep -r adapter *
config/.svn/text-base/database.yml.svn-base:  adapter: sqlite3
config/.svn/text-base/database.yml.svn-base:  adapter: sqlite3
config/.svn/text-base/database.yml.svn-base:  adapter: sqlite3
config/database.yml:  adapter: sqlite3
config/database.yml:  adapter: sqlite3
config/database.yml:  adapter: sqlite3
$ grep -r --include='*.yml' adapter *
config/database.yml:  adapter: sqlite3
config/database.yml:  adapter: sqlite3
config/database.yml:  adapter: sqlite3

ちょっと長くなるけどfindを使うよりは短い。

参考:grepのmanより:

      -R, -r, --recursive
             Read all files under each directory, recursively; this is
             equivalent to the -d recurse option.

        --include=PATTERN
             Recurse in directories only searching file matching PATTERN.

        --exclude=PATTERN
             Recurse in directories skip file matching PATTERN.

[ruby] 今日学んだこと

private_class_method

クラスメソッドをプライベートにするときはprivate_class_methodを使う。

これには private のように以下に書いたもの全てをプライベートにする機能はないみたい。

定数

定数が指しているオブジェクトは変更可能。

一時ディレクトリ、一時ファイル

システムの一時ファイルディレクトリは Dir.tmpdir で取得できる。一時ファイルは Tempfile クラスで作れるようだが一時ディレクトリを作ってくれる標準ライブラリはなさそう。

レシピブックにはDir.tmpdirの返す値が環境変数により変わるように書かれているが、そのような挙動は確認できなかった(ruby 1.8.5 (2006-12-04 patchlevel 2) )。

特異メソッド

特異メソッドを使ってみた。

my_string = String.new
def my_string.mmmmm
  '特異メソッド'
end
puts my_string.mmmmm   #=> 特異メソッド

こんな感じで、オブジェクトmy_stringに対してメソッドを定義できるようだ。

RAILS_GEM_VERSION

environment.rb で定義されている定数 RAILS_GEM_VERSION により、使用するRailsのバージョンが固定されるみたい。この定数を定義しなければ最新のRailsを使ってくれる模様。

[ruby] Refeの文字化け

Refeを使ってみたが文字化けしてしまう。とりあえず適当日記にあったのと同じ修正をした。うーむ。

--- searcher.rb 2003-10-17 21:44:12.000000000 +0900
+++ /usr/lib/ruby/gems/1.8/gems/refe-0.8.0.3/lib/refe/searcher.rb       2007-03-19 15:00:23.000000000 +0900
@@ -9,7 +9,7 @@
 #

 require 'nkf'
-
+require 'iconv'

 module ReFe

@@ -19,7 +19,8 @@
       if shift_jis_platform?
         NKF.nkf('-Es', str)
       else
-        str
+        #str
+        Iconv.iconv("UTF-8","EUC-JP", str)
       end
     end

やること

  • 年金

2007年03月21日(水) [長年日記]

  • 今日は休日。

[soft][windows] VMware Playerを使う

自宅のノートPCにVMware Playerをインストールした。使用するイメージは、VMwareのサイトのVirtual Appliance Marketplaceに集められているものから探す。

慣れているFedora Coreを使いたいが、これはどれもサイズが大きい。Ubuntu 6.10 (Edgy Eft) base server applianceというイメージが63MBと小さめだったのでダウンロードしようとしたが、配布はBitTorrentだけでしか行っていないようだ。BitTorrentのことは何も知らないので調べたところ、使用するにはポートを開ける必要があるみたい。それはちょっと嫌なのでこのイメージは諦める。

で、Ubuntu繋がりでUbuntu 6.10 Server, standard installを使うことにした。171MBと巨大だが、HTTPでも配布している。ダウンロードの速度は遅く、なかなか終わりそうにないので寝た。起きたらダウンロードが終わっていた。

ネットワークの設定変更

Ubuntuをごにょごにょ設定した後ssh経由でログインしようとしたがうまくいかない。UbuntuのイメージはNATモードで動作しており、そのときに割り当たるIPアドレスが192.168.x.xで、これだとうちのネットワークではうまくルーティングできず繋がらないようだ。

こんなときはVMware Playerと一緒にインストールされている「vmnetcfg.exe」を使えばよいはず。これを起動し、[ホスト仮想ネットワークの割当て]タブでVMnet8のサブネットの設定を別アドレス体系に変更したら、ssh経由で繋がるようになった。

[unix] Ubuntu 6.10 を使う

Ubuntuを使うのは初めて。ちょっとメモ。Ubuntuはrootユーザを使わずsudoで運用するポリシーみたい。

キーボードの設定

VMware用イメージの配布サイトにあるUbuntu 6.10 (Edgy Eft) in 1 minuteという説明を見て、

# sudo dpkg-reconfigure console-setup

を実行し日本語キーボードを使えるようにした。が、「|」を入力できない。

[ubuntu-jp] コンソール キーボード問題。からリンクされているページに書かれている

sudo vi /usr/bin/ckbcompで以下のように2箇所を修正し、 sudo rebootで「|」や「_」やバックスラッシュが入力出来るようになりました。
 133 => -1, # Japanese
   ↓
 133 => 124, # Japanese

 211 => -1, # Japanese
   ↓
 211 => 89, # Japanese

という変更を行うことで解決。

apt

aptを使うのは久しぶり。1から覚えないと。

apt-getでパッケージをインストールしようとすると、us.archive.ubuntu.com に繋ぎに行く所で止まってしまい困った。そもそもダウンロード元はどこで設定するのか。

非公式 Ubuntu 6.06 (Dapper Drake) 初心者用ガイドを眺めて、/etc/apt/sources.list を編集すればよさそうだと知る。このファイルの中の us.archive.ubuntu.com を jp.archive.ubuntu.com に変更した。

が、apt-get install でリポジトリを見つけられないようだ。ああ、その前に apt-get update を実行する必要があるのか。これをやったらインストールできるようになった。

で、今では apt-get よりも aptitude というコマンドを使う方がいいみたい。

をメモ。

UTF-8

ロケールは ja_JP.UTF-8 にしていたんだけど、apt-get install 時にロケール関係の警告が沢山出力された。

Jetspeed Blogにある通り、language-pack-ja パッケージをインストールしたら直ったみたい。

[unix] Debian sarge を使う

Ubuntuを設定している途中で、やっぱりDebianを使いたい、という気になってしまった。

Virtual Appliance Marketplace経由でDebian 3.1 (Sarge), minimal installをダウンロードする。配布元はUbuntuを配布しているのと同じ会社だった。こちらは115MB。

ダウンロードしたイメージを起動するとDebianのインストーラが動いて、ネットワークインストールする所から始まった。

で、Debianを設定していたのだけれど、どうやらDebian sargeはまだデフォルトのエンコーディングがUTF-8ではないようだ。ja_JP.UTF-8に設定してみたけれど日本語マニュアルをちゃんと表示できない。ムキー。

頑張ればUTF-8でも使えるのかもしれないけど面倒だなあ。UbuntuはUTF-8で普通に使えていたから、やっぱりUbuntuを使おうかなあと思っているところ。……と思いつつもDebianをもう一度起動して試してみたら普通にUTF-8が使えた。うまくいかなかったときとの違いは分からず。

やること

  • 年金

2007年03月25日(日) [長年日記]

[javascript] HTML要素のドラッグでIEの挙動に悩まされる

IEはSELECT要素を最前面に表示してしまう

SELECTが最前面に

script.aculo.us を使うとHTML要素を簡単にドラッグ可能にすることができる。が、Internet Explorer では問題があって、画面にSELECT要素があるとそれが常に最前面に表示されてしまう。このページの一番上のボックスで試せる。なんでや。

SELECT要素はIFRAME要素で隠せる

検索すると、IE6まではそういう仕様だという説明がたくさん見つかる。もー。IE7では改善されているようだ。

SELECT隠れた

この問題はIFRAME要素を使えば一応対処できるみたい。dev2devに詳しい説明があった。

このテクニックを使ってみたのがこのページの二番目のボックス。ドラッグ対象のDIVの中にSELECTを隠すためのIFRAMEとコンテンツを記述するためのDIVを重ねて配置するようにした。

これでSELECT要素はうまく隠れるようになったのだけれど、こうするとドラッグ時に文字列選択状態になるようになってしまった。なんでや。

文字列選択はmousemoveイベントを伝播させないことで防げる

文字列選択に関しては これからドラッグ&ドロップを書く人のために というページで色々調べられていた。ここを参考にしてmousemoveイベントのデフォルトの挙動を抑止してみたら、文字列選択されなくなったみたい。このページの三番目のボックスがそれ。

ただ、このボックスだけスムーズにドラッグできなくなっている。ボックス内でのマウス移動時にボックスが動いていないな。改善の余地ありだけれどちょっと時間切れ。

あと、3パターン全てで、XREAで表示される広告にドラッグすると文字列選択状態になってしまう。これに関しても未調査。

(追記)

三番目のボックスでドラッグがきちんとできていなかったのを改善した。「mousemoveイベントのデフォルトの挙動を抑止してみた」というのを、

Event.observe("box4", "mousemove", function(e) {
  Draggables.updateDrag(e);
  Event.stop(e);
}, true);

と書くようにした。これでそれなりにスムーズにドラッグでき、通常は文字列選択状態にならないみたい。それでも油断していると選択状態になることがあるのだけれど、もうよくわからん。

IFRAMEを挟むと文字列選択状態になる現象が発現する理由は未だに謎。IFRAMEがなければ問題ないんだよなあ。script.aculo.us は文字列選択状態にならないように(かどうかは知らんけど)内部で Event.stop をちゃんと呼んでいるのに、IFRAMEがあるとこのガードがうまく働かないのだ。

[life]図書館へ行く

  • 日蝕 (平野啓一郎)
  • Quick Japan Vol.68 「グラビアアイドル」
  • サッカーマガジン 2007.1.9 「06→07 サッカー界」

を借りた。本屋に行きたかったのに、改装中で閉まっていた。

やること

  • 年金
本日のツッコミ(全1件) [ツッコミを入れる]

まりこ [インフルエンザで布団の中 適当に携帯見てたら メモの日々 って… パソコンのことなんか わかんないけど 筆者の 淡..]