2009年9月26日土曜日

[Mac OS X][Java]: Mac OS XのデフォルトのJVMを変更する

Mac OS X用のJava SE 6がダウンロードできるようになってずいぶん経つが,未だにOS XのデフォルトのJVMはJ2SE 5.0である.

コンパイルされたクラスファイルであれば動作すると思うが,Java 6で追加されたアノテーション周りのコードをコンパイルしようとするとJ2SE 5.0のコンパイラではエラーを吐いて止まってしまうため,これが原因で色々とプログラムが動かなかったりすることがある.

というわけで,以下はMac OS XでデフォルトのJVMをJava 6にする方法.

「アプリケーション->ユーティリティ->Java Preferences」を開く


「概要」タブにリストされているJVMの項目をドラッグ&ドロップで,一番上に「Java SE 6」が来るように移動する.


これでOK.

2009年8月31日月曜日

[Snow Leopard]: Snow Leopardにして動かなかったソフト:MenuMeters


手持ちのMacのうち一台(Macbook黒)をSnow Leopardにアップデートしてみた.
その結果,普段常駐させているアプリの一つであるMenuMetersが動かなくなった.

以下,公式サイトからの引用
  • MenuMeters 1.3 does not run on Snow Leopard because the process that hosts the MenuMeters plugins (SystemUIServer) is now 64-bit. There are a number of subtle 64-bit bugs in MenuMeters so more than a simple recompile is needed.

    I'm working on an update to MenuMeters and expect to have a public beta shortly after Snow Leopard retail availability.


どうやら64bit版のSystemUIServerがバグバグで簡単には対応できないそうな.

ちなみにMenuMetersは画面上部のメニューバーにリソースの使用状況を表示できるアプリ.

特にメモリ,CPU,HDDの状態が常に確認できるのが良くて重宝している.システムが遅くなったときなどにこれがあればI/Oで止まってるのか,CPUで止まってるかなどの切り分けの役に立つ.

普段お世話になっているだけに早く対応してくれるといいなぁ

[Macbook]: Macbookのバッテリーが死んだのでGenius Barに行ってきた


2週間ぶりくらいに私物のMacbook黒(Late 2007)を起動したら、バッテリが死んでいた。
具体的には、システムプロファイラからバッテリの情報は見えるのだが、Magsafeの電源コネクタのLEDが緑から橙(充電中)にならず、バッテリが充電モードにならないという現象に見舞われた。

初代Intel Macbook Proも同じバッテリの死に方をしたので、こりゃー無理かなーと思いつつ買い替えも検討したのだが、そういえばAppleCare Protection Planに入っていたかもと思い確認した。

手持ちのMacのサポート期限は以下のURLから確認できる。
保証終了日の欄にある日付がAppleCareの保証終了日になる.通常だと1年だったはず.
https://support.apple.com/techtooldeluxe/main?id=dl&lang=ja

さて,Genius Barで見てもらったところ,すんなりバッテリの不良によるものであることが判明.充放電の繰り返しによる消耗は有償交換となるが,今回のような故障のケースであれば無償交換の対象らしい.銀座Genius Barではその場で新しいバッテリを用意して交換してくれた.すばらしい!

ちなみにざっと検索してみたところ,当該バッテリは9000円位の値段のようだ.AppleCare Protection Planの価格が30000円位なので,まだ元は取れていない.
正直僕のように自分である程度のトラブルシュートができる人には割高なPlanな気がする(バッテリのトラブルだとしたら3個予備のバッテリが買える計算).

来年の秋まではサポート範囲内なので,その間にまたどこか壊れれば損益分岐点を超えることもあるのだろうか?
でもその頃には新しいマシンを購入している気がするなぁ:-P

2009年8月14日金曜日

[Java on Linux]: Ubuntu 9.04で日本語がトウフにならないようにする設定

Ubuntu 9.04でJava(JDK, JRE)をSUNからダウンロードしてインストールしている場合,フォントの設定がされていないため日本語が白い四角(□,一部では豆腐,トウフとも言う)になってしまう問題を解決した.

Java 1.6ではフォントに関する定義は$JRE_HOME/lib/fontconfig.propertiesというファイルで置けば良いみたいなので,JVMをインストールしたディレクトリに以下の内容のファイルを配置する.
# Version

version=1

# Component Font Mappings

allfonts.chinese-cn-iso10646=-misc-zysong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
allfonts.chinese-tw-iso10646=-arphic technology co.-ar pl mingti2l big5-medium-r-normal--*-%d-*-*-c-*-iso10646-1
allfonts.lucida=-b&h-lucidasans-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1

serif.plain.japanese-iso10646=-japanese-mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1
serif.plain.korean-iso10646=-misc-baekmuk batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1
serif.plain.latin-1=-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1

serif.bold.japanese-iso10646=-japanese-mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1
serif.bold.korean-iso10646=-misc-baekmuk batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1
serif.bold.latin-1=-b&h-lucidabright-demibold-r-normal--*-%d-*-*-p-*-iso8859-1

serif.italic.japanese-iso10646=-japanese-mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1
serif.italic.korean-iso10646=-misc-baekmuk batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1
serif.italic.latin-1=-b&h-lucidabright-medium-i-normal--*-%d-*-*-p-*-iso8859-1

serif.bolditalic.japanese-iso10646=-japanese-mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1
serif.bolditalic.korean-iso10646=-misc-baekmuk batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1
serif.bolditalic.latin-1=-b&h-lucidabright-demibold-i-normal--*-%d-*-*-p-*-iso8859-1

sansserif.plain.japanese-iso10646=-japanese-gothic-medium-r-normal--*-%d-*-*-c-*-iso10646-1
sansserif.plain.korean-iso10646=-misc-baekmuk gulim-medium-r-normal--*-%d-*-*-c-*-iso10646-1
sansserif.plain.latin-1=-b&h-lucidasans-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1

sansserif.bold.japanese-iso10646=-japanese-gothic-medium-r-normal--*-%d-*-*-c-*-iso10646-1
sansserif.bold.korean-iso10646=-misc-baekmuk gulim-medium-r-normal--*-%d-*-*-c-*-iso10646-1
sansserif.bold.latin-1=-b&h-lucidasans-bold-r-normal-sans-*-%d-*-*-p-*-iso8859-1

sansserif.italic.japanese-iso10646=-japanese-gothic-medium-r-normal--*-%d-*-*-c-*-iso10646-1
sansserif.italic.korean-iso10646=-misc-baekmuk gulim-medium-r-normal--*-%d-*-*-c-*-iso10646-1
sansserif.italic.latin-1=-b&h-lucidasans-medium-i-normal-sans-*-%d-*-*-p-*-iso8859-1

sansserif.bolditalic.japanese-iso10646=-japanese-gothic-medium-r-normal--*-%d-*-*-c-*-iso10646-1
sansserif.bolditalic.korean-iso10646=-misc-baekmuk gulim-medium-r-normal--*-%d-*-*-c-*-iso10646-1
sansserif.bolditalic.latin-1=-b&h-lucidasans-bold-i-normal-sans-*-%d-*-*-p-*-iso8859-1

monospaced.plain.japanese-iso10646=-japanese-mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1
monospaced.plain.korean-iso10646=-misc-baekmuk batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1
monospaced.plain.latin-1=-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1

monospaced.bold.japanese-iso10646=-japanese-mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1
monospaced.bold.korean-iso10646=-misc-baekmuk batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1
monospaced.bold.latin-1=-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1

monospaced.italic.japanese-iso10646=-japanese-mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1
monospaced.italic.korean-iso10646=-misc-baekmuk batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1
monospaced.italic.latin-1=-b&h-lucidatypewriter-medium-i-normal-sans-*-%d-*-*-m-*-iso8859-1

monospaced.bolditalic.japanese-iso10646=-japanese-mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1
monospaced.bolditalic.korean-iso10646=-misc-baekmuk batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1
monospaced.bolditalic.latin-1=-b&h-lucidatypewriter-bold-i-normal-sans-*-%d-*-*-m-*-iso8859-1

dialog.plain.japanese-iso10646=-japanese-gothic-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialog.plain.korean-iso10646=-misc-baekmuk gulim-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialog.plain.latin-1=-b&h-lucidasans-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1

dialog.bold.japanese-iso10646=-japanese-gothic-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialog.bold.korean-iso10646=-misc-baekmuk gulim-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialog.bold.latin-1=-b&h-lucidasans-bold-r-normal-sans-*-%d-*-*-p-*-iso8859-1

dialog.italic.japanese-iso10646=-japanese-gothic-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialog.italic.korean-iso10646=-misc-baekmuk gulim-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialog.italic.latin-1=-b&h-lucidasans-medium-i-normal-sans-*-%d-*-*-p-*-iso8859-1

dialog.bolditalic.japanese-iso10646=-japanese-gothic-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialog.bolditalic.korean-iso10646=-misc-baekmuk gulim-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialog.bolditalic.latin-1=-b&h-lucidasans-bold-i-normal-sans-*-%d-*-*-p-*-iso8859-1

dialoginput.plain.japanese-iso10646=-japanese-mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialoginput.plain.korean-iso10646=-misc-baekmuk batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialoginput.plain.latin-1=-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1

dialoginput.bold.japanese-iso10646=-japanese-mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialoginput.bold.korean-iso10646=-misc-baekmuk batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialoginput.bold.latin-1=-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1

dialoginput.italic.japanese-iso10646=-japanese-mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialoginput.italic.korean-iso10646=-misc-baekmuk batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialoginput.italic.latin-1=-b&h-lucidatypewriter-medium-i-normal-sans-*-%d-*-*-m-*-iso8859-1

dialoginput.bolditalic.japanese-iso10646=-japanese-mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialoginput.bolditalic.korean-iso10646=-misc-baekmuk batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1
dialoginput.bolditalic.latin-1=-b&h-lucidatypewriter-bold-i-normal-sans-*-%d-*-*-m-*-iso8859-1

# Search Sequences

sequence.allfonts=latin-1
sequence.allfonts.UTF-8.ko.KR=latin-1,korean-iso10646
sequence.allfonts.UTF-8.ja.JP=latin-1,japanese-iso10646
sequence.allfonts.UTF-8.zh.CN=latin-1,chinese-cn-iso10646
sequence.allfonts.UTF-8.zh.TW=latin-1,chinese-tw-iso10646
sequence.allfonts.UTF-8.zh.HK=latin-1,chinese-tw-iso10646
sequence.fallback=lucida,chinese-tw-iso10646,chinese-cn-iso10646,japanese-iso10646,korean-iso10646

# Exclusion Ranges

exclusion.japanese-iso10646=2200-22ef,2701-27be,20a0-20aa,2153-215f,2166-2168,216a-216f,2173-2182

# Font File Names

filename.-arphic_technology_co.-ar_pl_mingti2l_big5-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/zh_TW/TrueType/bsmi00lp.ttf
filename.-misc-baekmuk_batang-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/ko/TrueType/batang.ttf
filename.-misc-baekmuk_gulim-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/ko/TrueType/gulim.ttf
filename.-misc-kochi_gothic-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/ja/TrueType/kochi-gothic-subst.ttf
filename.-misc-kochi_mincho-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/ja/TrueType/kochi-mincho-subst.ttf
filename.-misc-zysong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/zh_CN/TrueType/zysong.ttf
filename.-b&h-lucidasans-medium-r-normal-sans-*-%d-*-*-p-*-iso8859-1=$JRE_LIB_FONTS/LucidaSansRegular.ttf
filename.-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1=$JRE_LIB_FONTS/LucidaBrightRegular.ttf
filename.-b&h-lucidabright-demibold-r-normal--*-%d-*-*-p-*-iso8859-1=$JRE_LIB_FONTS/LucidaBrightDemiBold.ttf
filename.-b&h-lucidabright-medium-i-normal--*-%d-*-*-p-*-iso8859-1=$JRE_LIB_FONTS/LucidaBrightItalic.ttf
filename.-b&h-lucidabright-demibold-i-normal--*-%d-*-*-p-*-iso8859-1=$JRE_LIB_FONTS/LucidaBrightDemiItalic.ttf
filename.-b&h-lucidasans-bold-r-normal-sans-*-%d-*-*-p-*-iso8859-1=$JRE_LIB_FONTS/LucidaSansDemiBold.ttf
filename.-b&h-lucidasans-medium-i-normal-sans-*-%d-*-*-p-*-iso8859-1=$JRE_LIB_FONTS/LucidaSansRegular.ttf
filename.-b&h-lucidasans-bold-i-normal-sans-*-%d-*-*-p-*-iso8859-1=$JRE_LIB_FONTS/LucidaSansDemiBold.ttf
filename.-b&h-lucidatypewriter-medium-r-normal-sans-*-%d-*-*-m-*-iso8859-1=$JRE_LIB_FONTS/LucidaTypewriterRegular.ttf
filename.-b&h-lucidatypewriter-bold-r-normal-sans-*-%d-*-*-m-*-iso8859-1=$JRE_LIB_FONTS/LucidaTypewriterBold.ttf
filename.-b&h-lucidatypewriter-medium-i-normal-sans-*-%d-*-*-m-*-iso8859-1=$JRE_LIB_FONTS/LucidaTypewriterRegular.ttf
filename.-b&h-lucidatypewriter-bold-i-normal-sans-*-%d-*-*-m-*-iso8859-1=$JRE_LIB_FONTS/LucidaTypewriterBold.ttf

# AWT X11 font paths
awtfontpath.chinese-tw-iso10646=/usr/share/fonts/zh_TW/TrueType
awtfontpath.chinese-cn-iso10646=/usr/share/fonts/zh_CN/TrueType
awtfontpath.japanese-iso10646=/usr/share/fonts/truetype
awtfontpath.korean-iso10646=/usr/share/fonts/ko/TrueType
RedHat用のファイルを元にEmacsでReplace Stringしただけだけど,とりあえずこれで動いたので良しとする.

でも,JREをアップデートしたらまた配置し直すのを忘れそうだ・・・

2009年6月16日火曜日

[Android] HT-03A(GDD2009Ver)で Android System Recovery Utilityを立ち上げる



先日のGoogle Developer Day 2009でAndroid Phoneをもらった.モノはDoCoMoから発売予定のHT-03Aと同じものらしい.
一通り弄ってみたのだが,自分としてはどうにかしてこいつに自分でビルドしたAndroidイメージを焼けないものかと思い,色々調べてみたところ,Android端末にはAndroidイメージをアップデートする用にAndroid Sytem Recovery Utilityというものがあるようだ.

ただし,色々と調べてみたところ,G1というキーボード付き端末ではAndroid System Recovery Utility起動後,Alt+lキーでファームウェアアップデートができるようなのだが,HT-03Aにはハードウェアキーボードが無いため,ここで詰まってしまった.

上記の写真は電源を切った後,Homeボタンを押しながら電源を入れると見ることができるAndroid System Recovery Utilityの画面である.

・・・せっかく開発用に配った端末なんだから,Linuxイメージもいじれるようにして欲しいなぁ>Googleさん

2009年4月21日火曜日

[Qt][Windows]: Qt CreatorでBuildに失敗する




Qt 4.5 & Qt Creator 1.0.0でのTips.

Windows環境でBuildに失敗するときはプロジェクトパスに日本語が含まれている可能性がある.
Qtライブラリに入っているQStringやQDir,QFileは完全Unicode対応なので,見落としやすい.
恐らくqmakeをコマンドライン経由で叩いている関係なのだろう.

Windows環境は色々と面倒な事が発生して大変だなぁ.みんなMac OS X環境になれば楽なのに:-P

2009年4月18日土曜日

[Windows][Qt]: Windows&Qt 4.5環境でstatic linkedなプログラムを作る



Windows上でQt SDK 4.5を使ってコードを書いていて,コンパイルすると,通常はshared libraryなコードがはき出される.
shared linkはファイルサイズが小さくなって良いのだが,動作環境にQt 4.5のライブラリが無いと動かないので,配布には不向きである.

というわけで,Qtでqmakeしたコードがstatic linkになるように設定する.
Qt公式ドキュメントでは,Qtのインストールディレクトリで
configure -static
すればいいことになっている.

しかし,Qt 4.5でこれをやると途中で止まってしまい,Makefileが生成されない.具体的には

Generating Makefiles...
Could not find mkspecs for your QMAKESPEC(win32-g++) after trying:
C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.5.0/qt\mkspecs
Error processing project file: C:/Qt/2009.01/qt/projects.pro
Qmake failed, return code 3

といって止まってしまう.

エラーメッセージをよく見ると,mkspecsのパスがC:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.5.0/qt\mkspecsというところに決め打たれているのが原因であることが分かる.
そもそも本来のmkspecsはデフォルトではC:\Qt\2009.01\qt\mkspecsになるはずである.

調べてみると,とりあえずの回避策が見つかった.
http://www.qtcentre.org/forum/archive/index.php/t-19227.html

具体的には,JunctionというWindows上でシンボリックリンクを実現するソフトを使い,決め打たれているパスから正しいmkspecsへのリンクを貼ってやる事になる.
まずはJunctionのダウンロードページからJunctionをダウンロードし,インストールする.

その後,C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Trollディレクトリまでを手動で作成し,以下のコマンドをコマンドプロンプトで実行する.

junction C:/qt-greenhouse/Trolltech/Code_less_create_more/Trolltech/Code_less_create_more/Troll/4.5.0 C:\qt\2009.01

この後,Qtのインストールディレクトリで通常通り
configure -static
mingw32-make.exe

すれば良い.Qtの再コンパイルには相当な時間がかかる.僕の手元では7時間以上かかった.

コンパイルが終われば,後は通常通りQt CreatorからプロジェクトをCleanしてBuildすれば良い.
これでstatic linkされたバイナリが作成できる.

2009年4月14日火曜日

[Mac OS X]: Qt SDK 4.5とQt Creatorをインストールする

ひょんなことからQtを使ってアプリを書くことになったのでそれに関するメモなど.
まずは何よりインストールから.

まず,Mac OS XでQtを動作させる場合,X Code Toolsをインストールしておく必要がある.恐らく無くてもNativeなQtアプリを作るのには問題無いと思うのだが,標準ライブラリすらincludeできなかったりするので入れておいた方が良い.

X Code ToolsはMacを買ったときに付いてくるInstall Discか,ADC(Apple Developer Connection)に無料会員登録してダウンロードすることで入手することができる.
ただ,ADCからダウンロードするとDVDの1GBくらいあるDMGイメージをダウンロードすることになるので,回線が細い場合はおとなしくインストールディスクから入れた方が無難だと思う.

X Code Toolsのインストールが終われば,Qt公式サイトのダウンロードページからSDK(Standard Development Kit)をダウンロードする.
この時,よく見ると「Commercial Downloads」と「LGPL / Free Downloads」からライセンスを選択してダウンロードするのに気をつける.通常はLGPL版のSDKで良いだろう.



後は普通にダウンロードしてきたイメージをインストールすれば良い.

次に,Qt開発環境であるQt Creatorをインストールする.

Qt CreatorはQt開発に特化した統合開発環境で,Javaで言えばEclipse,Windows開発で言えばVisual Studioに相当する.
実は,最初はEclipse/CDTというEclipseのC++開発にQt Eclipse Integrationを入れて使おうと思ったのだが,なんとMac OS XだけPluginが提供されていない.
というわけで,仕方ないのでQt Creatorを使うことにした.

Qt Creatorは先ほどのダウンロードページ左下に「Qt Creator IDE」という項目があるので,そこからダウンロード/インストールできる.
Qt Creatorを起動すると,最近のIDEらしくWelcome画面が表示される.



試しにHelloWorldを書いてみる.
FileメニューからNewを選択し「Qt Console Application」を選択.適当な名前でプロジェクトを作成して後はデフォルトのまま次へボタンを押していく.
すると,Editモードに切り替わるので,main.cppの内容を以下のように編集する.

#include <QtCore/QCoreApplication>
#include <QDebug>

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "Hello, World.\n";
return a.exec();
}


qDebug()はC++標準関数で言うcoutの代替として使えるQt関数である.
あとはQt Creator左下にある再生ボタンを押すか,Buildメニューから「Run」を実行すれば,以下のような形でHelloWorldが表示される.



とりあえず今日はここまで.

2009年4月10日金曜日

[書籍]: 反日マスコミの真実 2009を読んだ



ニコニコ動画のマスコミ批判関連で有名だったこの本を今更ながらに読んだ.
以下僕の印象など.

特集記事として「大マスコミが報じない田母神問題」「毎日新聞変態記事の衝撃」「報道されないニュース」といった記事が取り上げられており,紙面の4/5位は特集記事で埋まっている.
執筆者陣は非常に多彩で,各種専門家からブロガーまで,いろいろな人から記事を集めていることが面白い.
構成としては,2Pから4P位の記事が中心で,読みやすいと感じた.記事によって行間がかなり大きいものもあるのは愛嬌かな:-P

記事の内容はどうかというと,感情的になりすぎてちょっと一歩引いてしまうような記事が多かった.話題の中心は2ch系まとめブログなどを斜め読みしていれば大体どこかで読んだことのあるような内容がメインなのだが,それだけに記事の内容が被ってしまっていることも多く,特に田母神問題の記事についてはくどいと感じられることもあった.
ネットで行われたような議論の内容で終わってしまうような記事が多かったのは,正直レベルが低いなと思う.ただ,普段あまり本を読んでいなかったり,何も考えず流し読みするのであればいいのかも.

一方,それぞれの特集や連載の中で,ただのマスコミ批判に終わらず客観的に独自の意見を述べている記事もいくつかあり,それらはなかなか読み応えがあった.1200円はちょっと高いとは思ったが,こういった雑誌はあまり見ないので,仕方無いとは思う.
僕としてはこういった記事と前述の様な軽い(読みやすい)記事を分けて書いておいてくれると良かったなと思う.

2009年1月29日木曜日

[UNIX]: シェルスクリプトで指定回数の繰り返し処理

普段プログラミングしていて,指定回数繰り返す処理といったら

for(int i = 0; i < n;i++){
.....;
}


であるが,たまにシェルスクリプトを書いているときに同じように書こうとしても,for文を使うとなかなかうまくいかない.
というわけで,シェルスクリプトで繰り返しを書くときは,while文を使って次のように書いている.

loop=10;#繰り返し回数
i=0;
while true
  do
  ...;
  i=`expr $i + 1`
  if `expr $i \>= $loop`
    then
    break;
  fi
done
要はexprコマンドを使って数値の計算と比較を行う.ちなみに,break文が入っているif文の条件を
if [ $i > $loop ]

とすると多分うまくいかない.
というのは,man testすると<, >の記号は文字列としてASCIIコード順での順位で比較すると書いているためで,もし数値比較したいのであれば-gt, -ltを使うように書いてある.

そんなわけで,シェルスクリプトで数値比較をするときにはexprを使うと覚えておけばとりあえず間違いは無いということだろう.

[Firefox Add-ons]: HttpFoxでHTTPヘッダやボディ情報をチェックする


Webアプリケーション開発をしていると,サーバが返すHTTPレスポンスヘッダやブラウザが問い合わせるHTTPリクエストヘッダの他に,ボディ情報も見たいことがある.
Live HTTP HeadersはそういったときにHTTPヘッダ情報を取得することができるスニファツールで,ヘッダだけを観察したいときには便利である.

しかし,バグや予期せぬ挙動を追いかけるときに,ヘッダ情報だけでは不十分な時がある.
そんなときにはボディ情報も一緒に取得できるHttpFoxが便利である.
HttpFoxは,パケットスニファであるWireShark(tcpdump)を使ったことのある人ならすぐに使いこなすことができるだろう.
ダウンロードサイトからアドオンをインストールし,起動すると以下の様な画面が現れる.

左上の「Start」をクリックすると,HTTP通信の記録が開始される.

主な手順としては,
  1. 「Start」をクリックして監視したい操作を行う
  2. 「Stop」をクリックしてスニファを停止する
  3. 通信内容を見て必要な情報を解析する
といった順序で解析することになる.

実際に通信をキャプチャすると,以下の画像の様になる.


WireSharkなどとほとんど同じなので,Web開発をしている人にはいちいち説明する必要は無いと思う.
簡単なフィルタ機能も備えているので,解析の取っかかりには便利なAdd-onだろう.

最近のWebアプリケーションフレームワークは,たまに思わぬ挙動をすることがあるので,こうしたツールを覚えておくと予期せぬ現象を追いかけるのに役に立つだろう.

2009年1月25日日曜日

[Mac OS X]: 図やグラフをきれいに作れるOmniGraffle


Mac OS Xで図やグラフを作成するのにOmniGraffleを使っている.
















OmniGraffleはフリーソフトではないが,簡単,お手軽に図やグラフをきれいに描くことができる.
Windowsで言えばVisioに相当するソフトで,出力形式にはPDFやJPGなどはもちろん,EPSやTIFFにも対応しているため,一般的なベクタ画像を作るのに使える.
また,PDF出力はA4などの定型サイズだけでなく,任意のサイズのPDFを出力できるため,PowerPointなどにそのままコピー&ペーストするのに便利である.

また,ライセンスの利用形態が「コンピュータ」と「個人用」の二種類あり,「コンピュータ」だとそのマシンでしか使えない(代わりに全てのユーザが利用可能)が,「個人用」にすれば自分の持っている他のMacにもインストールできるため,複数台のMacを利用している人には経済的である.

後は,Graffletopiaというサイトでステンシル(PowerPointのクリップアートのようなもの)が多数公開されているので,プレゼン資料などを作る時は重宝している.ネットワーク系のアイコンなどは,統一感のあるきれいなアイコンがあまりなかったりするのでありがたい.

2009年1月23日金曜日

[PHP][Symfony]: SymfonyのドキュメントルートのURLを取得する

Symfonyは基本的に専用のバーチャルドメインを立てて,web/index.phpがドキュメントルートにあることを前提としている(例えば,http://example.com/index.php).

しかし,ドキュメントルートには静的なコンテンツを置きたいとか,一つのバーチャルドメイン上で複数のSymfonyアプリケーションを動かしたいという時には,ドキュメントルート直下で無い所にindex.phpが置かれる.例えば,http://example.com/SF_APP/index.phpなどである.

この様にSymfonyのアプリケーションディレクトリがドキュメントルート直下にあることが保証されない場合,他のファイルのURLをどのように取得すればよいかが困る.
例えば,web/contents/hogehoge.dataといったデータを置いている場合,上記の場合で言えば「/SF_APP/」というサイト内絶対パスを取得する方法が必要になる.

これがスタイルシートやJavaScriptなら,stylesheet_path()やjavascript_path()といった関数がテンプレート内で使えるが,これらの関数は勝手に拡張子を補完したり,cssやjsディレクトリの補完を勝手にやってしまうため,その一つ上位のディレクトリであるwebディレクトリにアクセスすることはできない.

で,色々と検索してみたのだが,それっぽい関数は見つからなかったので,結局以下の方法に落ち着いた.
テンプレート内で,
dirname($sf_request->getScriptName());
これで,Symfonyのwebディレクトリに当たるディレクトリのサイト内絶対パスを取得することができる.
具体的には,

<a href="<?=dirname($sf_request->getScriptName())?>/contents/hogehoge.data">
の様な形式になる.

・・・でもこういった処理は何か関数がありそうなんだけどなぁ・・・

2009年1月22日木曜日

プログラミングに英語は必要か〜検索の有利と不利〜

前回は英語のエラーメッセージが目に入らないという話をした.

プログラミングに英語は必要か〜視界に入らないエラーメッセージ〜

残念ながら僕が会ったことのあるプログラマ(プロ・アマを問わず)は,多くの場合英語が苦手な人が多い気がする.

しかし,得意にならないまでもプログラミングのスキルアップを目指す上で,最低限の英語の能力は必須と言っていい.
それは,検索におけるヒット率に大きく関係する.

プログラミングがそこそこ分かってくると,プログラミングというのは多くの場合0から1を自分自身の力で生み出すというよりは,あちこちにある部品を拾ってきてコピペし,さらに自分なりの修正を加えることが早く正確なプログラムを書くコツだと言うことが分かる.
# もちろんコピペ元のコードの品質をチェックする技量は必要
また,エラーに遭遇したり困ったときには自力解決するよりも,先人達に同じ経験をした人がいないかを調べるのが普通である.

そして,その部品を探すときに使うのが検索エンジンなのだが,ここで日本語しか使えないのと英語も使えるというのでは,天と地ほどの差がある.

以前の記事でも書いた様に,プログラミングの世界の標準言語は英語である.エラーメッセージも普通は英語であるし,世の中に出回っているソフトウェアのドキュメントにしても,日本語版がないことはあっても英語版がないことは少ない.
また,もし日本語のサポートサイトがあっても,作者が英語圏の人だった場合,ドキュメントにしてもサポートにしても,日本語のサポートが受けられることは少ない.

こうした状況の中で日本語の文書しか読めない場合,非常に不利である.
例えば,英語のエラーメッセージでGoogle検索に書けた場合「日本語のページを検索」と「Web全体から検索」ではヒットする件数が圧倒的に違う.
試しに「"Segmentation Fault"」で検索してみたところ,日本語は75,000件程度,Web全体では1,500,000件程度ヒットした.
単純に20倍ほど違うのである.

これは,英語が読める人が英語を読めない人に比べて20倍の情報を参照できると言うことを意味している.
当然これらの中にはただの質問を投げただけのページや,中国語やドイツ語などの英語以外のページも含まれるが,それを考慮しても圧倒的な差になる.
そして,日本語で見つからなかった情報も英語なら手に入る可能性もある.

英語から逃げ続けているプログラマは,自分がすごく損をしていることを自覚した方が良いだろう.

[PHP][Symfony]: 特定のスタイルシートを読み込まないようにする

# テスト環境はSymfony v1.2.0

Symfonyを使っていると,apps/APP_NAME/config/view.ymlに書いたデフォルトのスタイルシートは常に勝手に読み込まれることに気付く.
これは親切なのだが,デフォルトのapps/APP_NAME/templates/layout.phpを使わずに全て手動でHTMLを出力させたい時などには不便である.

例えば,apps/APP_NAME/templates/null.phpとして,以下のようなファイルを作る.

<?php echo $sf_content ?>

このレイアウトは,デフォルトのlayout.phpと違い,HTMLタグやHEADタグなどを含んでいないため,CSVを出力したり,HTML以外の任意のデータを出力する時に使う.
使い方は,Actionの中で

$this->setLayout('null');
とすればよい.

さて,このレイアウトテンプレートはCSSやXMLなどの非HTMLを出力する場合は問題なく機能する.
しかし,HTMLを出力しようとした際に問題が発生する.
というのは,アクションのテンプレートにHTMLを普段通り記述しただけでは,SymfonyがHEADタグを自動検出して,デフォルトのスタイルシートを読み込んでしまうのだ.

例えば,以下のテンプレートの場合,赤字の部分にデフォルトのスタイルシートが読み込まれる.

<html>
<head>
<meta ... />
<meta ... />
<!--ここに読み込まれる-->
</head>
<body>
</body>
</html>


デフォルトのスタイルシートを読み込みたくない場合,この動作はお節介なので,読み込まないように設定したい.
で,SymfonyのAPIドキュメントによると,Responseクラスを継承したsfWebResponseクラスにremoveStylesheet()というメソッドがあるので,これを使ってみるのだが,うまくいかないことが分かる.

public function executeHoge(sfWebRequest $request){
$response = $this->getResponse();
$response->removeStylesheet('stylesheet_to_remove');
return sfView::SUCCESS;
}

どうみても問題なさそうなのだが,やはりデフォルトのスタイルシートが挿入されてしまう.

で,お行儀が悪いが,テンプレートの方でこのメソッドを呼んでみる.

<?php
$sf_response->removeStylesheet('stylesheet_to_remove');
?>
<html>
<head>
<meta ... />
<meta ... />
</head>
<body>
</body>
</html>

すると,無事にスタイルシートが読み込まれなくなった.

どうやら,デフォルトのスタイルシートを挿入する処理は個別のActionのテンプレート処理の後に行うらしい.多分Filterか何かがやっているのだと思う.
この処理の順番を知らなかったのでかなりハマった.同じような経験をした人はいるのかな?

2009年1月21日水曜日

[Mac OS X]: デスクトップ上の任意の点の色を取得したい


Webページなどを作っていると,既存のデザインに合わせるために各種の色を16進数(#ffffff)などで取得したいことがある.
そんな時,スクリーンショットを撮ってから画像編集ソフトで開き,色を調べると言う方法もあるが,Mac OS X環境があるのなら標準搭載のDigitalColor Meterを使うと手っ取り早い.

「アプリケーション->ユーティリティ->DigitalColor Meter」を開くと,すぐに色を調べることができる.
デフォルトでは16ビット表示になっているので,通常使われる8ビットの値を表示させるために「RGBを16進表示(8ビット)」に変更する.
その後,マウスポインタを任意の色を取得したい部分に持って行くだけで,色情報を取得できる.


上記の例であれば,#3377ABが測定部分の色となる.

いちいちソフトを起動したりする必要もないので,地味だがかなり重宝する.

2009年1月20日火曜日

[ThinkPad]: TPFanControlでCPUファンの騒音を軽減する

現在,Lenovo(IBMと書けないところが何となく寂しい)のThinkPad X61 TabletをWindowsメインマシンとして使っているのだが,どうもファンがやたらとうるさい.
どうやら全力で回ったり止まったりを繰り返しているようで「ファン停止状態->温度上がる->ファン全力回転->ファン停止」を繰り返しているようだ.

これではファンが動作しているときにうるさくてたまらないので,ファンをもっと低速で回す方法は無いかと思い,インストールしたのがTPFanControlである.

TPFanControl by troubadix


TPFanControlはその名の通りThinkPadのファンを任意の動作で動かすことのできる常駐ソフトで,Modeを「BIOS」にすればThinkPad標準の動作,「Smart」にすればTPFanControlの設定ファイル(TPFanControl.ini)を元にした動作,「Manual」にすれば一時的に強制的にファンを回したり止めたり,と言ったことができる.

基本的にはデフォルト設定で「Smart」で起動させておけば問題ない.
インストールされたTPFanControl.exeのショートカットを「プログラム->スタートアップ」にでも入れておけばいちいち起動する手間も省けて良い.

もし自分で動作を変更したい場合は「プログラム->TPFanControl->TPFanControl.ini」をテキストエディタで開き,編集する.
編集すべき所は最終行の辺りで,僕は現在以下の設定にしている.

// Celsius: // Fahrenheit: (Level FAN 0>80 -> Fahrenheit) Level=60 0 // Level=140 0
Level=70 1 // Level=150 1
Level=75 3 // Level=170 3

見て分かる通り「Level=[温度] ファンの状態」の書式で書けば良く,上記の設定であれば,

摂氏60度以下 -> 停止
摂氏70〜75度 -> 1(最低速)で稼働
摂氏75度以上 -> 3(3/7)の速度で稼働

と言うことになる.
ファンの回転速度は最高が7で最低が0(停止)の8段階で,最高速で回るとうるさいので僕は早くても3で回すようにしている.

また,回転速度は各温度に達した時点で判定される様なので,上記の例なら70度になるとファンが回転し始め,60度になるまでは止まらない.
この辺りは細かく設定したい人は好きなように設定すれば良い.
ただ,コメントアウト部分にも書いてあるが,温度の部分を80よりも大きい値にすると華氏温度と認識されるので注意が必要である.

そんなわけで最近のThinkPadの動作音がやかましいと感じる人は試してみると良い.
・・・それにしてもThinkPadはLenovoになってから品質が下がってしまったのが残念である.キーボードとか,細かい部分への配慮が足りなくなっている様に感じる.
個人的な一番の名器はX40/X41なのだが,さすがに今メインで使うのにはスペックが低くて厳しい.
# それでもThinkPadを使い続けてるのは,品質が落ちてもなお他社製ノートPCよりも使いやすいからなのだけれどね :-P

[Mac OS X]: Windows Live Syncがアップデートで使えなくなったので手動アップデート

以前の記事で,FolderShareがWindows Live Syncにアップグレードされた際にMac OS X版のクライアントを手動で探す必要があることを書いた.

FolderShare to Windows Live Sync on Mac OS X

その中で,バージョン14.0.6066.1211のクライアントのダウンロードサイトを紹介したのだが,この度「This version of Windows Live Sync is out-of-date. Please download the latest version from sync.live.com」と,クライアントのアップデートを要求された.


でも,相変わらずsync.live.comにログインしてもMac OS X版のクライアントはダウンロードできない.
前述のmac.softpedia.comも新しいクライアントはまだ公開していないようだ.

そこで,Firefoxの設定を弄ってダウンロードリンクを表示させることにした.
Firefoxメニューから環境設定,「コンテンツ」タブの「言語設定」を開き,以下の様に設定する.


これで,日本語と英語両対応のサイトでは英語が優先されるようになった.

この状態でsync.live.comにログインすると,めでたくMac OS X版クライアントのダウンロードリンクが表示される.


後は,このクライアントをダウンロードしてインストールすれば問題ない.
ちなみに現在最新のバージョンは14.0.6067.1212である.

そんなわけで,日本語ユーザに対しての配慮が色々と足りないWindows Live Syncを手動でアップデートする方法を紹介した.

2009年1月18日日曜日

[Linux]: LinuxでSATA HDDの型番とシリアルナンバーを調べる

最近Seagate製SATA HDDの一部の型番の製品に,電源投入時にHDDが認識されないFirmwareのバグが存在するらしい.

Seagateナレッジベース

GALACTIC FUNC | seagateがやばい

というわけで,手元のLinuxマシンでHDDの型番を調べる方法を紹介.
やり方は,
$ cat /proc/scsi/scsi
するだけ.

(1/19追記)Seagateから手持ちのHDDが該当する個体かをシリアルナンバーから確認するフォームが提供された.

http://support.seagate.com/sncheck.html

シリアルナンバーを調べるには,
# hdparm -i /dev/[HDDデバイスファイル]
とする.
$ sudo hdparm -i /dev/sdb

/dev/sdb:

Model=ST31000333AS , FwRev=SD15 , SerialNo= XXXXXXX
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
BuffType=unknown, BuffSize=0kB, MaxMultSect=16, MultSect=?8?
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=1953525168
IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6
AdvancedPM=no WriteCache=enabled
Drive conforms to: unknown: ATA/ATAPI-4,5,6,7

* signifies the current active mode

Firmwareアップデートで対応できるみたいだけど,以下の型番に該当しないか動いている内に調べて,もし該当していたらとりあえずデータを退避させることを勧める.

Barracuda 7200.11
ST31000340AS/1TB
ST31000640AS/1TB
ST3750330AS/750GB
ST3750630AS/750GB
ST3640330AS/640GB
ST3640630AS/640GB
ST3500320AS/500GB
ST3500620AS/500GB
ST3500820AS/500GB
ST31500341AS/1.5TB
ST31000333AS/1TB
ST3640323AS/640GB
ST3640623AS/640GB
ST3320613AS/320GB
ST3320813AS/320GB
ST3160813AS/160GB

Barracuda ES.2 SATA
ST31000340NS/1TB
ST3750330NS/750GB
ST3500320NS/500GB
ST3250310NS/250GB

DiamondMax 22
STM31000340AS/1TB
STM31000640AS/1TB
STM3750330AS/750GB
STM3750630AS/750GB
STM3500320AS/500GB
STM3500620AS/500GB
STM3500820AS/500GB
STM31000334AS/1TB
STM3320614AS/320GB
STM3160813AS/160GB
# 1/18 : 容量を併記
# 1/19 : シリアルナンバーの取得方法を追記

2009年1月17日土曜日

プログラミングに英語は必要か〜視界に入らないエラーメッセージ〜

以前プログラミングに数学の知識は必要かというトピックを書いたが,今回は英語について.プログラミングに英語の能力は必要かという話について取り上げる.

以前「数学ができないからプログラミングに苦手意識を持つ人が多い」という話を書いたが,では数学が(少なからず)できる人たちはというと「英語ができないことが多い」というケースに遭遇する.
これは僕の大学がいわゆる数学受験や英語受験といった入試方法があることも関係しているのかも知れないが,割合一般に言えることだと思う.

ちなみに,ここでいう「できる」「できない」の基準はかなり低いレベルで,例えば英語が「できる」というのは高校レベルの読み書きができるレベルで「できない」というのは全く読めないか,そもそも読もうとしないレベルである.
数学についても「できる」というのは高校で理系コースを取っていればがんばって勉強していなくても十分なレベルで「できない」というのは算数レベルはともかく,数学レベルの論理立てた証明などが理解できないという人たちである.

# ちなみに僕は昔は数学が「できて」英語が「できない」グループに属していた

さて,こうした数学ができて英語ができないグループの人たちがプログラミングでつまずくのはどこかというと,コンパイルエラーなどのエラーメッセージなのである.
最近は日本語のエラーメッセージを出力するプログラムも多いが,基本的にはコンパイラのエラーメッセージなどは英語が標準である(日本語のエラーメッセージについては書きたいこともあるのだが,それはまた別の機会に).
なので,プログラムを書いていると意外と英語に触れる機会は多い.

そして,こうした(自称)英語できないグループの人たちの傾向として「英語のエラーメッセージを読もうとしない」ことがある.それがたとえどんなに平易な文章だったとしても,である.
例えば,「Command not found.(コマンドが見つからない)」や「File does not exist.(ファイルが存在しない)」などは単語の意味さえ分かれば呼んでも良さそうなものなのだが「動きません」と言われて見に行くと,割とこういった単純なメッセージを読まずに投げ出していることが多い.

なぜ自分でメッセージを読まないのかを昔の僕を思い出しつつ考えてみると,理由が分かった.
英語できないグループの人というのは,英語のメッセージを文章として見るのではなくただの「記号」としてしか見ておらず,そもそも眼中に入っていないのである.これは英語が読めないからとか,苦手だからとかそういう話ではなく,単純に視界に入っていないのだ.

これは,例えば普段PCを使っていて何度も見るエラーメッセージの処理をするときに似ている.
昔のWindows 9x系では「このプログラムは不正な処理を行ったため強制終了されます」といってプログラムがクラッシュすることが多かったのだが,このエラーメッセージをいちいち読んでいる人はいなかっただろう.単にエラーのウィンドウが出たら「ああ,またかよ」と思いながらウィンドウを閉じていたように思う.

ちょっと話が脱線したが結局どういう事なのかというと,こういった人たちに大切なのは,まずこうしたエラーメッセージの存在に気づかせてあげることと,意外と読める部分もあるのだということを理解してもらうことだと思う.
実際,僕がプログラミングを教えるときも,読める部分だけでも良いのでエラーメッセージを読んでもらい,それがどういう意味なのかを考えてもらうようにしている.
そして,エラーメッセージを元に問題を解決するという手順を何回か繰り返していく内に,自然とエラーメッセージを無視しなくなっていくのである.

もちろん,知らない単語や分からない文章の場合は質問するように伝えてあるのだが,ほとんどの場合自力解決してしまう.これは(自称)英語ができないグループの人たちも同様で,実は今までは読もうとしなかっただけで,読もうと思えばちゃんと読める人たちだったわけである.

そんなわけで,英語ができないとエラーメッセージを無視している人や,そういった人たちにプログラミングを教えている人は,まずはエラーメッセージを視界に入れて,読むための努力をしてみるのが良いのではないだろうか.

2009年1月16日金曜日

[Mac OS X]: Mac OS XでWindowsのスタートメニュー風な起動メニューを実現する

WindowsからMac OS Xへ移行した人にとって,アプリケーションを起動するためのスタートメニューが無いのに戸惑っている人は結構多いと思う.
実際,いちいちFinderを開いて,アプリケーションリストからプログラムを起動するのは面倒だと思う.


そこで,通常使っているDockにスタートメニューの様なランチャ機能があると便利である.
具体的には以下の画像のような開き方ができれば,Windowsのスタートメニューと同じ使い方ができる.


これを実現するには,以下の手順で操作を行う.
まず,Finderを開き,左のメニューにある「アプリケーション」を右クリックし,「内包するフォルダを開く」を選ぶ.



すると,新しく「System」というタイトルのFinderウィンドウが開く.これは実はMac OS X自体のルートディレクトリ(/)なのだが,これは分かる人だけ分かればOKである.

ここで,この中の「アプリケーション」アイコンをドラッグして,Dockの右の方(ゴミ箱の隣くらいが良い)に持って行く.

すると,アプリケーションへのショートカットがDockに作成される.

さて,この状態でこのショートカットをクリックすると,タイル上にアプリケーションアイコンが表示される.



このままでも良いという人は良いのだが,この表示方式は見た目はきれいな代わりに一覧性が悪く,必要なアプリケーションが探しにくい.
なので,アプリケーションアイコンを右クリックして「内容の表示形式」から「リスト」を選択する.


ここまで設定すると,最初に紹介した画像の様に,アプリケーションリストが文字のリスト表示になる.
アプリケーションが増えてくるとDockにアイコンをいちいち追加していられないので,色々とアプリケーションを入れている人や,Windowsの操作に慣れてしまった人にはお勧めである.

[Mac OS X]: Mac本体のシリアル番号を調べる

Mac OS Xでシリアル番号を調べるには,二種類の方法がある.

一つは,左上のAppleメニューから「このMacについて」を開き,出てきたウィンドウの中の「Mac OS X」と書かれた下の部分(バージョンが表示されている部分)をクリックする.
すると,クリックするたびにバージョン番号->ビルド番号->シリアル番号の順に表示が切り替わる.


もう一つは,上記の「詳しい情報」をクリックするか「アプリケーション->ユーティリティ->システムプロファイラ」を開き「ハードウェア」を表示する.


下の方にシリアル番号が表示されている.

サポートセンターに繋ぐときなどにはこれで調べてから電話すると,話が早い.

2009年1月14日水曜日

[Windows Vista]: スクリーンセーバーをOFFにしても勝手にログオン画面へ戻されるのを防ぐ

ThinkPad X61 tabletでWindows Vistaを使っているのだが,10分くらい操作をしないと勝手にログイン画面に戻される(画面のロック)ので色々といじってみた.
まずは電源周りを疑い,スリープ関連の設定を片っ端から切ってみたが,うまくいかなかった.
次にスクリーンセーバーにこれと同等の機能「再開時にログオン画面に戻る」というのがあるので,これを疑ってみたが,そもそもスクリーンセーバーを「なし」に設定してあるので影響が無いと思っていた.
後は,何か別のセキュリティ設定があるのかと思い,コントロールパネルをひっくり返してもだめで,今度はThinkPadの付属ソフト「ThinkVantage」の特殊な設定の可能性も考え,片っ端から設定を眺めてみたが,該当する項目は見つからなかった.

しかし,最終的な結論から言うと,スクリーンセーバーの設定が犯人だった.

スクリーンセーバーを「なし」に設定すると「再開時にログオン画面に戻る」チェックボックスが無効になる.

これを見れば普通の人は,スクリーンセーバーが無しならログオン画面に戻ることもないと思うのだが,ところがどっこいスクリーンセーバーの有効/無効と自動ログオフの有効/無効は別々に制御されているようなのだ.
なので,一度適当なスクリーンセーバーに設定し,このチェックボックスを外し,またスクリーンセーバーを「なし」に設定する.

これで数分後に強制的にログオン画面に戻されることは無くなった.

・・・これはUIが良くない気がする.

[Mac OS X]: MacBook Proでバッテリが認識されない

昔使っていた15インチ版MacBook Proを久しぶりに起動してみたところ,なぜかバッテリを認識して折らず,バッテリアイコンに×印が付いていた(既に復旧したのでスクリーンショットはない).
そのまま電源ケーブルを抜いてみると,当然のように電源が落ち「バッテリーが死んだかな?」とイヤな予感がして,システムプロファイラを見てみると,きちんとバッテリの情報が表示された.
ただし,電源残量は0 mAhと表示されており,明らかに異常で,充電状態もなしと表示されていた.
どうやら,ハードウェア的には見えているが,実際に電源は供給されておらず,充電もされていないらしい.
一度サポセンに問い合わせてみたが,特に事例はなく,有償の交換修理か新品を買って対応と言われてしまった.

今更ほとんど使ってないマシンに10000円もするバッテリは買えないので,ソフトウェア的に何とかならないか検索してみると,以下の事例が見つかった.

MacBook and MacBook Pro: バッテリーが完全に消耗すると認識されない

・・・って,もろに公式に書いてあった....

というわけで,SMC(PMU)リセットしたところ,無事に認識するようになった.

サポセンも,これを教えてくれれば良かったんだけど,まあサポセンの人たちは技術者な訳じゃないから仕様がないかなぁ

2009年1月11日日曜日

[Mac OS X]: Mac環境でLaTeX環境を構築する

Mac OS XでLaTeX環境を構築する際のメモ.

基本的には以下のサイトを参考にすれば良いが,いくつかの点で注意すべきことがある.
教授でもできるMac OS X へのX11, LaTeX, Ghostview, gcc, g77, CERNLIBのインストレーションと環境設定
それは,Ghostscriptをインストールする際に,ESP版ではなくGPL版を選択することである.
具体的には,OmniGraffleからテキストの含まれるファイルをEPS出力したファイルを読み込む際にエラーが出て読み込めなくなる.

他にはTeXShopのインストールなども問題なく行えるので問題ないが,この手順でインストールされるLaTeX環境はShift-JIS用の環境なので,他のUNIX環境で作成したファイルを処理する際は文字コードを変換してから読み込ませる必要がある.
その際,Mac OS Xなら標準でPHP環境がインストール済みなので,以前紹介した以下のスクリプトを用いることで一括変換できる.

[PHP]: ディレクトリ内の任意のファイルの文字コードを一括変換

以上,最近LaTeXを使う人は減っているみたいだが,細々と使っている人もいると信じたい.

[Emacs]: Emacsで文字コードを指定して保存する

WindowsからMac OS Xに移行してテキストエディタとして最近Emacsを使い始めた人で,文字コードを指定して保存する方法が分からなくて困っている人をよく見かけるので紹介.

保存のためのコマンドは「C-x RET f」である.初心者の人に分かりやすく書くと「Ctrl+xの後にReturn(Enter)キーを押し,さらにfキーを押す」ということになる.
ここまで正常に実行されると「Coding system for saving file (default nil): 」と表示されるので,保存したい文字コードの名前を入力する.
対応する文字コードはTABキーを二回押すことでリストされるので,どのような名前で指定すれば良いか分からない場合はこの中から選択することもできる.


通常日本語環境で使うのはウィンドウズで標準の「shift-jis-dos」または「sjis-dos」,Mac OS XやXMLなどで標準の「utf-8」,古いUNIX系システムで使われている「euc-jp-unix」あたりだろう.

ちなみに現在編集中のファイルの文字コードは画面下部のステータス部の先頭をよく見ると分かる.
「-u」となっていればUTF-8,「S(DOS)」となっていればSJIS-DOS,「-E」となっていればEUC-JPとなる.

[Windows]: Windows標準のメモ帳でUTF-8のファイルを作成する

いつの間にかWindows標準のメモ帳がShift-JIS以外の文字コード指定に対応していたのでメモ.
普通にスタートメニューから「プログラム->アクセサリ->メモ帳」で起動しファイルメニューの「名前を付けて保存」から「UTF-8」や「Unicode」を選択できる.

これでUTF-8のファイルをちょっと編集する時に,秀丸やEmEditorをインストールする必要が無くなった.
他人のPCを使ってファイルを見せる程度なら十分だろう.

ちなみにVistaだけでなくXPも問題なく文字コードを選択できるようになっている.

2009年1月7日水曜日

[Mac OS X]: Macでスクリーンキャプチャの動画を作成する

ニコニコ動画などでデスクトップのキャプチャ動画が色々と上がっている.WindowsならDisplay2AVIなどのソフトがあり,AVIでキャプチャしたものをAVIUtilなどでH.264にエンコードしてアップロードするのが良さそう.この辺はニコニコ動画まとめWikiが詳しい
ではMac OS Xではどうすれば良いだろうか.

Mac OS Xで使えるデスクトップキャプチャ(スクリーンキャプチャ)のフリーソフトとして僕が使っているのはJingである.
画像のスクリーンショットやデスクトップの指定した領域の動画を録画できるソフトで,H.264での保存はできず,SWFでの保存のみだがWebにアップロードする場合はこちらの方が面倒が無くて良いと思う.15分でBlogを作るRailsのScreencastのような画面キャプチャ動画を作るのならこれで十分だろう.

インストールはJing Projectのページに行って右側にあるMac OS X用のDMGイメージを落として来ればOKで,起動すると画面右上(デュアルディスプレイ時はメイン側のディスプレイ)に常駐し,マウスを持って行くと拡大してメニューが現れる.

このメニューの左上にあるのがキャプチャ用のアイコンで,これをクリックするとキャプチャするエリアを指定する画面になる.全画面をキャプチャするわけではなく,画面の一部分のみをキャプチャできるので,見せたくない部分は見せないようにすることができる.

領域を指定すると,次は画像で保存するか,動画を録画するかを設定するメニューが出るので「Video」を選択すると,3秒後に録画が開始される.
この枠の中が録画されるので,後は好きなように作業を行い,最後に停止ボタンをクリックして保存先を指定すればSWFで保存される.Screencastとの連携もあるようだが,試してはいない.

全画面ではなく画面の一部だけを保存できるというのが個人的にはポイントが高い.後で切り出す必要が無いのでそのままアップロードも可能で,非常に簡単でお手軽である.

2009年1月6日火曜日

[PHP]: Mac OS X 10.5.6におけるPHPのデフォルトconfigureオプション

ふと気になったのでMac OS X 10.5.6(現行最新)環境でのPHPのconfigureオプションを調べてみた.
'--prefix=/usr'
'--mandir=/usr/share/man'
'--infodir=/usr/share/info'
'--disable-dependency-tracking'
'--with-apxs2=/usr/sbin/apxs'
'--with-ldap=/usr'
'--with-kerberos=/usr'
'--enable-cli'
'--with-zlib-dir=/usr'
'--enable-trans-sid'
'--with-xml'
'--enable-exif'
'--enable-ftp'
'--enable-mbstring'
'--enable-mbregex'
'--enable-dbx'
'--enable-sockets'
'--with-iodbc=/usr'
'--with-curl=/usr'
'--with-config-file-path=/etc'
'--sysconfdir=/private/etc'
'--with-mysql-sock=/var/mysql'
'--with-mysqli=/usr/bin/mysql_config'
'--with-mysql=/usr'
'--with-openssl'
'--with-xmlrpc'
'--with-xsl=/usr'
'--without-pear'
--with-xmlと--with-xslが標準で付いているのはSymfony使いの自分としてはありがたい.
--enable-socketsも付いているので,Perlの代わりにPHPを使う僕のようなPHPスクリプターにとっては助かる.
でも--without-pearなのは何でだろう?Apple側で管理できないパッケージは入れたくないということだろうか.まあ必要なら自分でライブラリを丸ごと持ってきた方が互換性問題に悩まされずに済むのでこれはこれでいいか.でもやっぱり不便.

ちなみにPHPのバージョンは5.2.6だった.
$ php -v
PHP 5.2.6 (cli) (built: Jul 17 2008 23:04:49)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies

2009年1月5日月曜日

[Mac OS X]: Macをアンプ付きスピーカーとして使う

デュアルディスプレイ環境で使っているBenQのディスプレイにはHDMI端子が付いているので,手持ちのゲーム機(XBox 360)を繋いで久々にゲームをしようとおもったら,手元にまともなスピーカーが無くて困ってしまった.
とりあえず,iMacの内蔵スピーカーから音を鳴らせないかと思い,iMacのライン入力にゲーム機からの出力をそのまま繋いでみた.つまりMacをスピーカーとして使うということだ.

・・・が,鳴らない.

どうやら,Mac OS Xではデフォルトではライン入力から内蔵スピーカーへモニタスルーできないらしい.
確かに,デフォルトで入力から出力にスルーしてしまうと,マイクを繋いだときにめちゃくちゃにハウリングしてしまう気がするので,OFFになるのは正常かなと思った.
でも,機能としては標準であるだろうと思い,ぐぐってみると,以下のサイトが見つかった.
the Surfside Stomp - WebMaster's Monologue -
こちらのサイトによると「アプリケーション->ユーティリティ->Audio MIDI設定」からスルーの設定ができるらしい.
というわけで開いてみた・・・が,上記のサイトの通りにやろうとしても,Thruのチェックボックスが無効化されていてONにすることができない.
どうやら,Mac OS Xのバージョンが変わったことにより,Thruできなくなったとか,そういうことらしい.
このままではどうしようもないので,さらに調べてみると,どうやらLineInというフリーソフトを使えばライン入力から内蔵スピーカーへのスルーを実現できそうだということが分かった.
Rogue Amoeba | Freebies: Free software for Mac OS X
このソフトをインストールして起動し,Inputを「Built-in Input: Line In」,Outputを「Built-in Output: Internal Speaker」に設定して「Pass Thru」ボタンをクリックすると,無事にライン入力に入力したサウンドを内蔵スピーカーから鳴らすことができた.

というわけで,部屋に多入力のアンプやミキサーが無い人は試してみるといいかも.

2009年1月4日日曜日

Subversionで22番ポート以外にsvnsshする方法

SSHサーバを22番ポートで運用していると,海外を中心にあちこちからブルートフォースアタックが飛んでくるため,/var/log/secureがひどいことになる
Jan 4 05:42:51 www sshd[26460]: Invalid user postgres from ::ffff:121.96.42.157
Jan 4 05:42:51 www sshd[26461]: input_userauth_request: invalid user postgres
Jan 4 05:42:51 www sshd[26460]: reverse mapping checking getaddrinfo for 121.96.42.157.bti.net.ph failed -
POSSIBLE BREAKIN ATTEMPT!
Jan 4 05:42:53 www sshd[26460]: Failed password for invalid user postgres from ::ffff:121.96.42.157 port 5
7258 ssh2
Jan 4 05:42:53 www sshd[26461]: Received disconnect from ::ffff:121.96.42.157: 11: Bye Bye
Jan 4 05:42:55 www sshd[26462]: Invalid user pilarova from ::ffff:121.96.42.157
Jan 4 05:42:55 www sshd[26463]: input_userauth_request: invalid user pilarova
Jan 4 05:42:55 www sshd[26462]: reverse mapping checking getaddrinfo for 121.96.42.157.bti.net.ph failed -
POSSIBLE BREAKIN ATTEMPT!
....
そのため,sshd自体を22番以外のポートで運用するという対策がある.CentOS,FedoraといったRedhat系Linuxでは/etc/sshd/sshd_configに
Port 222
としてやればいい(222番ポートの場合).

ただ,こうするとsubversionのサーバとして使っているサーバの場合,svnコマンドで「svn+ssh://〜〜」といった指定をしてもアクセスできなくなってしまう.これはsvnがsshは22番ポートで動作している事を前提としているからである.

これを回避するには,~/.subversion/configを開いて,[tunnel]というセクションがあるので,その後ろの行に
[tunnels]
p222=ssh -p222
という行を追加してやり「svn+ssh://〜〜」としていた部分を「svn+p222://〜〜」といった形に直してリポジトリにアクセスすれば良い.
後ろのsshオプション部分をいじってやれば,指定した公開鍵でログインといったこともできる(はず).

コンフィグファイルを編集せずに,コマンドラインオプションで設定する方法を探したのだが,見つからなかったので今はこんな形で対応している.

[Firefox Add-ons]: FirefoxでIriaっぽくページのリンク先をまとめてダウンロード

その昔,まだインターネット回線がISDNが主流だった頃,ダウンローダというソフトが流行った時期がある.古くはReGetからFlashGet,DCさくらなどなど,いろいろなダウンローダがあったのだが,その中で一部のユーザに支持されていたのがIriaというダウンローダだ(いまはIrvineという名前に変わっている).
こういったダウンローダの持つ機能としては,最低限以下のものが含まれる.
  • 所定のファイルのダウンロードを再開する(Resume)機能
  • 複数のファイルを登録しておき,順番にダウンロードしていく機能
  • ダウンロードのHTTPリクエストを投げる際のHTTPヘッダを細かく制御する機能
ここで,最後の機能についてよく分からない人向けに解説をすると,HTTPヘッダの中にはリンクを辿った元のページのURL(Referrer)や,接続元のブラウザやOS(User-Agent),Proxy使用の有無などのデータが含まれており,サイトによっては特定のリンクから辿ったときでないとファイルへのアクセスを許可していない時があるのだ.
たまにダウンロードURLをそのままブラウザに打ち込んでも弾かれる時などが上記の場合に相当する.
他にも,ダウンローダによっては,CSVで書いたURLリストを読み込ませたり,一つのファイルを多セッションで同時にダウンロードする分割ダウンロード機能や同時にダウンロードするファイル数を制限したりといった機能が搭載されている.

その中でも僕が特に愛用していたのは,Iriaに搭載されていた「ページの全てのURLをIriaに送る」機能である.この機能はどういう事かというと,そのページにある全てのリンク(aタグ)を解析し,そのリンク先URLを全てダウンロードリストとして登録するというものである.
これがどのような時に役に立つかというと,画像掲示板や多数の画像をまとめて公開しているサイトなどで,全部の画像をまとめてダウンロードする時に重宝する.
当然全てのリンクをそのままダウンロードしてしまうと,ページに存在するバナーや他のページへのリンクなど,無駄なものまで対象になってしまうので,実際にはファイル形式などでフィルタをかけて使う.

この機能に相当するソフトがMac OS X環境に移行してから見つかっていなかったのだが,半年ほど前くらいからDownThemAll!というAddonがあることを知って使っている.
このAddonをインストールすると,ページのどこかで右クリックした際に「DownThemAll!」という項目が追加される.

この項目を実行すると,ページを解析したURLリストと,どのURLをダウンロードするかを選択できる.

この中の「Filters」を設定することで,指定した拡張のみをダウンロードリストに含めることができる.これで指定したページの画像ファイルを一括ダウンロードするといったことが実現できる.

他にもAddonの設定などを見れば,色々と設定項目があるので,昔Iria/Irvineを使っていて今ダウンローダを使っていない人は試してみるといいかもしれない.