システムの標準エディタを変更したい

色々ございまして、当分の間更新頻度が激減すると思われます。
で、タイトルの件。
Ubuntuでcrontabを登録しようとすると「nano」というエディタが立ち上がる。nanoの使い方はサッパリ分からないので、vi/vimあたりに変更したい。

$ sudo update-alternatives --config editor

これで、エディタの選択肢が出てくるので番号を選択すれば良いみたい。
update-alternativesコマンドは、Debian系だけじゃなくてRedHat系でも使えるみたい。
修理中のノートPCが帰ってきたら、Fedoraで色々実験してみよう(・x・ ).o0○

yum.cronからのエラーメッセージ

自宅のサーバはミッションクリティカルでも何でもないので、パッケージ管理は毎夜cronにお任せ。
で、そのcronからエラーメールが飛んできた。ちょっと長いけど以下のような内容。

Traceback (most recent call last):
File "/usr/bin/yum", line 29, in ?
yummain.user_main(sys.argv[1:], exit_code=True)
File "/usr/share/yum-cli/yummain.py", line 229, in user_main
errcode = main(args)
File "/usr/share/yum-cli/yummain.py", line 104, in main
result, resultmsgs = base.doCommands()
File "/usr/share/yum-cli/cli.py", line 343, in doCommands
return self.yum_cli_commands[self.basecmd].doCommand(self, self.basecmd, self.extcmds)
File "/usr/share/yum-cli/yumcommands.py", line 645, in doCommand
return base.doShell()
File "/usr/share/yum-cli/cli.py", line 284, in doShell
yumshell.script()
File "/usr/share/yum-cli/shell.py", line 78, in script
self.onecmd(line)
File "/usr/lib/python2.4/cmd.py", line 219, in onecmd
return func(arg)
File "/usr/share/yum-cli/shell.py", line 165, in do_ts
self.do_transaction(line)
File "/usr/share/yum-cli/shell.py", line 191, in do_transaction
return self.do_run('')
File "/usr/share/yum-cli/shell.py", line 325, in do_run
(code, msgs) = self.base.buildTransaction()
File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 647, in buildTransaction
(rescode, restring) = self.resolveDeps()
File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 704, in resolveDeps
for po, dep in self._checkFileRequires():
File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 939, in _checkFileRequires
if not self.tsInfo.getOldProvides(filename) and not self.tsInfo.getNewProvides(filename):
File "/usr/lib/python2.4/site-packages/yum/transactioninfo.py", line 414, in getNewProvides
for pkg, hits in self.pkgSack.getProvides(name, flag, version).iteritems():
File "/usr/lib/python2.4/site-packages/yum/packageSack.py", line 300, in getProvides
return self._computeAggregateDictResult("getProvides", name, flags, version)
File "/usr/lib/python2.4/site-packages/yum/packageSack.py", line 470, in _computeAggregateDictResult
sackResult = apply(method, args)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 861, in getProvides
return self._search("provides", name, flags, version)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 43, in newFunc
return func(*args, **kwargs)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 837, in _search
for pkg in self.searchFiles(name, strict=True):
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 43, in newFunc
return func(*args, **kwargs)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 586, in searchFiles
self._sql_pkgKey2po(rep, cur, pkgs)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 470, in _sql_pkgKey2po
pkg = self._packageByKey(repo, ob['pkgKey'])
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 413, in _packageByKey
po = self.pc(repo, cur.fetchone())
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 68, in __init__
self._read_db_obj(db_obj)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 94, in _read_db_obj
setattr(self, item, _share_data(db_obj[item]))
TypeError: unsubscriptable object

ちょうどPythonの勉強を始めた事もあって、何とかエラーの内容は想像がついた。単純にアップデートが出来ていない模様。
検索してみたところ、以下の記事にたどり着いた。
CentOS 5 の yum に失敗 (TypeError: unsubscriptable object)
以下のコマンド実行後にyum updateしたら、無事動くようになった。

# yum clean metadata

こうなった原因が気になるところ(・x・ ).o0○

geditの文字コード判定がおかしい

実は9.04をインストールしてから気になっていた点。
8.10に入っていたgeditでは、UTF-8以外でもsjisだろうがEUC-JPだろうがちゃんと判別してくれたのだけれど、9.04のgeditはどうも上手く判別してくれない。
仕方なく毎回手動で文字コード指定してたけど、gconf-editorで「apps/gedit-2preference/encodings」にある「auto_detected」に自動判別してほしい文字コードを追記すると、ちゃんと判別してくれるようになった。
あとは、PHPファイルで比較演算子「<」を入力すると、タグだと判断して「>」が補完されちゃうのさえ何とかなればバッチリなんだけどなぁ…。
この違いはさすがにコンピュータでは理解し兼ねるかも(・x・ ).o0○

shutdownコマンドで時間指定

今さらだけど、shutdownコマンドでは時間指定出来る。

;; manによると秒(sec)単位
# shutdown -h 3600 

->1時間後にhaltされる

自宅で一人で使ってたりすると、時間指定は「now」ばかり。
Dropboxの同期作業に妙に時間がかかっていたので、外出前に初めて時間指定してみる。

;; Ubuntu 9.04
$ sudo shutdown -h 3600

って、「3600分後にhaltします」とかメッセージが出るんだけど??
もう一度manに目を通したいと思います(・x・ ).o0○

実行に時間のかかるSQLを記録する

twitterにハマって1ヶ月も放置していたけれど、今日からまた再開。
現在SQLの最適化で絶賛悩み中。下手くそなSQLのせいで、100万件のデータを毎回全部読んでしまう。

コンソールから直接SQLを流して、平均2〜3秒。PHPのアプリ経由だと5秒以上かかる。

お話にならないので、色々最適化する方法を調べていたら、MySQLでは実行に時間のかかったSQLをログ記録してくれる「スロークエリログ」とかいう機能があるらしい。ので、早速設定。

;; my.cnfファイルを編集

[mysqld]

何だかんだ

log-slow-queries=/var/log/mysqld-slow.log
long-query-time=2
log-queries-not-using-indexes

実行時に「long-query-time」で設定した秒数以上かかったSQLを「/var/log/mysqld-slow.log」に記録してくれる。さらに、全件スキャンしてるSQLも記録してくれるそうなので、パフォーマンスの分析に役立つみたい。

閲覧時は、単純にlessやcatでも良いけど、

$ mysqldumpslow /path/to/slow_log

だと見やすく整形してくれるらしい。

こりゃ便利!!

だけど、どう最適化したらいいのかな〜(・x・ ).o0○

strcmpで文字列比較

Fedora 11と戯れすぎてブランクが空いてしまったけど、今日からまた再開。
PHPでよく話題になる「変数の型比較」。型の違う変数を比較するとPHPがよしなに型変換してくれるのだけれど、そのルールが中々にトリッキーらしい。
ので、自衛手段として文字列比較は「strcmp()」を使いましょうという事らしい。

int strcmp ( string $str1, string $str2 )

返り値:
str1str2 よりも小さければ < 0 を、str1str2 よりも大きければ > 0 を、 等しければ 0 を返します。

という事は、 if (! strcmp($a, $b)) で良いのかな?と思いきや、型をちゃんと意識するなら if (0 === strcmp($a, $b))なのでしょうか…?
基本的に比較演算子は「===」を使っているんだけど、独学の悲しい性、それがモアベターな方法なのかどうか分からない。
フリーのソースなんかだと大抵「==」で、あまり厳密な比較にはこだわってないみたいだけれど…。
どうなんでしょう??(・x・ ).o0○