忘れたときに備えた記録

トップ 最新 追記
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|12|
2011|07|09|
2012|09|11|
2013|02|03|09|
2015|10|11|
2016|01|08|11|
2017|02|08|10|
2018|11|

2008-08-04(Monday)

CapsLockを押しただけでロックされてしまう現象

Ubuntuのデスクトップ環境では、CapsLockキーを押しただけで英数ロックされてしまいます。これがコンソールやWindowsだと、Shiftキーと一緒に押した場合にロックされて、単独でCapsLockキーを押しても何もおきません。

昔使っていた環境の影響で、CapsLockキーを押したときに日本語入力モードが解除されるようにSCIMを設定したいのですが、デフォルトだとその度に英数ロックがオン・オフされてしまいとても不便でした。

これまではGnomeの設定画面を使って他の使っていないキーと入れ替えたりしていたのですが、これだと極まれにCapsLockが必要になったときに使えません。

それで、根本的に解決できないものかと思って試行錯誤してみました。そもそものきっかけは、先日たまたま

# dpkg-reconfigure xserver-xorg

をしたときに、Debianを使っていたころには見かけなかったオプションが有効になっているのを発見して、それが原因じゃないかと気がついたからです。

というわけで、結論。まず、UbuntuのDesktop版をインストールすると、 /etc/X11/xorg.conf にこんな行ができています。

	Option		"XkbLayout"	"jp,jp"

これを、こう直します。

	Option		"XkbLayout"	"jp"

これだけ。これで、忌々しい「CapsLockを単独で押しただけなのにロックされちゃうよ現象」を解決できます。どっとはらい。


2008-08-06(Wednesday)

Vistaで縦線化するJPEGファイル

Vistaのエクスプローラは画像ファイルを大きいサムネイルで表示してくれるので重宝しています。

ところが、まれに縦線として表示されてしまうJPEGファイルがあります。しばらく放置していたのですが、とうとう気になって調べてみました。

あちこち探した結果、JPEGファイルのヘッダ部分に記述されたアスペクト比がおかしい場合に、この現象が起こると分かりました(参考:*怪物領域* 魔魅夢MEMO *)。

参考ページで公開されているツールで特定のディレクトリ下にある画像ファイルを修正できるのですが、ディレクトリを再帰的に調べてはくれないようです。

そこで、再帰的に修正するスクリプトをRubyで作ってみました。JPEGのヘッダについて参考にしたのは

です。

#!/usr/bin/ruby

class FixAspect
   class NotJpeg < StandardError; end

   def initialize(file)
      @file = file
      open(@file, "rb") do |f|
         @head = f.read(18)
      end
   end

   def jpeg?
      @file=~/\.jpe?g\z/i && @head =~ /\A\xff\xd8\xff\xe0..JFIF\x00/
   end

   def aspects
      @head[14, 4].unpack("nn")
   end

   def incorrect?
      ha, va = aspects
      ha != va
   end

   def fix!
      return self unless jpeg? && incorrect?

      a = aspects.max
      @head[14, 4] = [a].pack("n")*2
      
      body = open(@file, "rb") do |f|
         f.seek(18)
         f.read
      end

      open(@file, "wb") do |f|
         f.print @head, body
      end

      self
   end
end

if $0==__FILE__
   path = $*[0]
   flg = $*[1]=="fix"
   if path
      Dir[File.join(path, "**/*")].each do |f|
         next if File.directory?(f)
         fa = FixAspect.new(f)
         puts "Incorrect jpeg: #{f}" if fa.jpeg? && fa.incorrect?
         fa.fix! if flg
      end
   else
      puts "Usage: fix_aspect.rb path"
   end
end

WindowsでもLinuxでも使えます。

fix_aspect.rb dir

とすると、dir以下のJPEG画像ファイルを調べて、アスペクト比がおかしいファイルの一覧を表示します。

fix_aspect.rb dir fix

とすると、dir以下のJPEG画像のアスペクト比を修正して上書き保存し直します。自動でバックアップをとったりはしません


2008-08-07(Thursday)

ばぐってるぽい…

  1. mathmlプラグインを使っていると、投稿されてspam扱いしたコメントをhamとして処理しなおすときに、@cgi.user_agentを呼び出せないエラーが発生している
  2. 日本語コメントをトークン分解したときに、文字化けしている

という問題をたった今発見しました。今週末に直します。ぐふっ

Tags: SpamBayes

2008-08-19(Tuesday)

tDiaryのsqueeze.rbがメモリをとりまくる件

これについて、少し調べてみたのです。GCが効かなくなる現象というのが、自分が今進めているプロジェクトでも引っかかるんじゃないかと思って。

とりあえず、実行中のRubyが保持しているオブジェクトの一覧を得るためにこんなコードを書いて

class RubyDebug
   def self.objects
      r = []
      ObjectSpace.each_object{|i| r << i}
      r
   end
end

squeeze.rbのメインのループの中で

puts RubyDebug.object.size
GC.start

とか書いて様子を見てみると、確かにオブジェクトの総数が単調に増加していました。

それでtDiaryのあちこちのコードをコメントアウトして試行を繰り返して、どうもプラグインをロードするとそれだけでGCにひっかからないオブジェクトが増えてしまうと分かり、こんどは各プラグインのファイルやらディレクトリやらをmisc/plugin->misc/plugin.disやらhoge.rb->hoge.rb.disして無効にしていったわけです。

でまぁ、最終的には、misc/plugin/squeeze.rbが残っているとそれだけで破棄されないオブジェクトが増加していくのが分かりました。ので、squeeze.rbの始めと終わりに

 unless $squeeze_loaded
 $squeeze_loaded ||= true
 (中略)
 end

と入れてやると、とりあえず手元の環境ではメモリの増大が回避できました。

squeeze.rbのどの部分が本質的に問題なのかはまた後日調べてみます。多分。


2008-08-29(Friday)

入れ子になったクラス

Rubyが予想外の動作をしたのでメモです。

クラス定義の中でそのクラスのサブクラスを定義して、次のようなコードを書きました。

#!/usr/bin/ruby
class A
   class B < A
   end

   class C
   end
end

これに続いて、次の(1)のような処理を書くと、エラーにならずに実行されました。

# (1)
p A::B::B, A::B::B.new.is_a?(String)

# (2)
class A::B::B < String
end
p A::B::B, A::B::B.new.is_a?(String)

# (3)
p A::C::B

実行結果は次のようになります。(1)(2)(3)は後から書き足したものです。

(1)
A::B
false
(2)
A::B::B
true
(3)
./test.rb:20: uninitialized constant A::C::B (NameError)

(1)の時点ではA::B::Bは未定義ですが、そのような定数が参照された場合には親クラスAの名前空間で探して、A::Bを返しているわけです。

リファレンスの定数参照の優先順位に書いてあって言われてみればその通りなのですが、ちょっと驚いたのでメモです。

Tags: Ruby

2008-08-30(Saturday)

MathML用のフォント

以前、数式用のフリーなフォントSTIX Fontsがベータテストを開始 - スラッシュドット・ジャパンでの紹介を読んで知ったMathML用のフォントなのですが、プロジェクトのページからはダウンロード出来なくて、早く正式公開されないかなと待っていました。

それが今日、ふとFirefoxのMathMLについてのページに行ってみたら、なんとここからベータ版がダウンロード出来るようになっていました。

これで、UbuntuでもMathMLをいい感じに表示できるようになりました(今まではWindowsで見ていた)。

具体的な手順は

  • ダウンロードしたzipを展開する
  • *.otf なファイルが出てくるので ~/.fonts/ に移動
  • Firefoxを再起動

これでMathMLなページに行くと、ばっちり数式の特殊記号が表示されます。

Tags: MathML