[Linux]CentOS 5.3/5.4のsudoコマンドが曲者。

Written by uechoco 1月 11

CentOS 5.3以降で、sudoコマンドのバージョンが新しくなり、sudoコマンド自体や、今まで使えていたsudoを含むスクリプトなどが使えなくなってしまうケースが出てきました。私も同様の現象にはまりました。私の場合は、スクリプト内で使用しているsudo付のコマンドでPATHが通らなくなってしまったという現象です。

今は以下のURLなどを参考に解決し、今まで通りの運用をしています。

記憶の片隅にでも覚えておいてもらえると役に立ったりするときがくるかもしれません。

[Mac]netatalkの.AppleDoubleでsymfonyコマンドがつまずく時がある

Written by uechoco 9月 13

タイトルでもわかるとおり、非常に限定的な環境でsymfonyを使ったときにハマってしまったので、今後、私と同じようなマニアックな環境でハマってしまった人がググってくれることを期待して備忘録を残します。

さて、私はMac OS X上にVMware Fusion 2を導入していて、会社での開発をVM上のCentOS 5で行っています。開発ではMacのCocoaに対応したEclipse 3.5を主にしようしています。EclipseでVM上のファイルを直接読み書きするため、netatalkというMac版sambaとも言えるソフトウェアをCentOSに導入して、MacとLinux間の共有を行っています。ここら辺のお話は、以前3回に渡って書いたnetatalk導入のブログの記事を参照してもらえればと思います。

Mac OS Xでで外部ストレージ(NFS)などを用いるとき、ファイルのメタ情報を保存するために、netatalkでは.AppleDoubleというフォルダを各フォルダごとに生成し、そのフォルダの中に元ファイル名と同名のファイル名でメタ情報を格納します。※WikipediaのAppleSingleにAppleDoubleについて記載があります。netatalkではnoadoubleというオプションがあり、「必要なければ.AppleDoubleを作らない」という設定にすることができるのですが、必要ある場合は当然作成されてしまいます。例えば、Eclipseからアクセスして保存とかをすると、.AppleDoubleが作られてしまうような気がします。

CentOS上にsymfonyを展開してMacからターミナルで操ろうとしたとき、基本的にはsymfonyのあの深いフォルダ階層のすべてに.AppleDoubleが生成されてしまうということです。そこでこまったのがsymfonyコマンド。propel:build-xxxとかやろうとすると、どうも.AppleDoubleのせいでうまくいかないことがあります。

例えばpropel:build-model

Bash:
  1. [ueno@localhost project]$ ./symfony propel:build-model
  2.   Unable to parse file "/path/to/project/config/.AppleDouble/schema.yml": Unable to parse line 1 (

なぜか.AppleDoubleフォルダ内のshema.ymlがパースできないと言われてしまいます。前述の通り、.AppleDoubleフォルダの中に元ファイル名と同名のメタファイルを生成しますので、もしかしたらschema.ymlという名前に反応してしまったのかもしれません。一応propel:build-modelのヘルプを見てみましょう。

Bash:
  1. [ueno@localhost project]$ ./symfony help propel:build-model
  2. Usage:
  3.  symfony propel:build-model [--phing-arg="..."]
  4.  
  5. Aliases: propel-build-model
  6.  
  7. Options:
  8.  --phing-arg  Arbitrary phing argument (multiple values allowed)
  9.  
  10. Description:
  11.  The propel:build-model task creates model classes from the schema:
  12.  
  13.    ./symfony propel:build-model
  14.  
  15.  The task read the schema information in config/*schema.xml and/or
  16.  config/*schema.yml from the project and all installed plugins.
  17.  
  18.  You mix and match YML and XML schema files. The task will convert
  19.  YML ones to XML before calling the Propel task.
  20.  
  21.  The model classes files are created in lib/model.
  22.  
  23.  This task never overrides custom classes in lib/model.
  24.  It only replaces files in lib/model/om and lib/model/map.

検索条件はconfig/*schema.ymlと書いてありますので、フォルダも引っかかってしまうようです。

で解決策はどうするのか?propel:build-xxx系のコマンドなどでは、symfonyライブラリの中に含まれるsfFinder.class.phpというユーティリティを利用しています。この中に、指定されたルールに基づいて、ファイルやディレクトリを検索するというin()メソッドがあるのですが、この中で、バージョン管理ソフトのディレクトリを無視するようなプログラムの掛かれば部分があります。symfony 1.2.8のlib/symfony/util/sfFinder.class.phpの341行目付近です。

php:
  1. /**
  2.    * Searches files and directories which match defined rules.
  3.    *
  4.    * @return array list of files and directories
  5.    */
  6.   public function in()
  7.   {
  8.     $files    = array();
  9.     $here_dir = getcwd();
  10.  
  11.     $finder = clone $this;
  12.  
  13.     if ($this->ignore_version_control)
  14.     {
  15.       $ignores = array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg');
  16.  
  17.       $finder->discard($ignores)->prune($ignores);
  18.     }

svnやらcvsやらgitやらのメタ情報を保存するフォルダの除外指定が列挙されています。ならばここにAppleDoubleをいれればいいんでないか?ということで、修正多野がこちら

php:
  1. if ($this->ignore_version_control)
  2.     {
  3.       $ignores = array('.svn', '_svn', 'CVS', '_darcs', '.arch-params', '.monotone', '.bzr', '.git', '.hg', '.AppleDouble');
  4.  
  5.       $finder->discard($ignores)->prune($ignores);
  6.     }

symfonyのコアを書き換えるのはどうかと思ったのですが、この設定を付け加えるだけでnetatalk環境でのsymfonyコマンドが問題なく使えるようになったので開発が進みそうです。

まぁ、こんな環境でsymfony使う人はなかなか居ないと思いますが。。。

[Linux]ユーザ権限cron(crontab)のファイルの場所

Written by uechoco 7月 15

Linuxでcronをよく使うのですが、いつも/etc/crontabを直接編集してたりします。

最近はユーザ権限cron(個々のユーザでcrontab -eコマンドで作成したcron)も使うようになりました。

通常のcrontabのファイルは/etc/crontabにありますが、ユーザ権限のcrontabは、

  • /var/spool/cron/ユーザ名
  • /var/spool/cron/crontabs/ユーザ名

といったディレクトリに格納されているようです。どちらのディレクトリにあるかは、ディストリビューション(Debian、Fedora、CentOSなど)依存だと思われます。これらのファイルを開くと、crontab -eで編集していた内容と全く同一です。

[Linux]r8168ドライバが再起動後にr8169に戻る

Written by uechoco 1月 31

Linux(CentOS 5.2)にて、NICのr8168ドライバとr8169ドライバの誤認問題がありますが、USB経由か何かでr8168モジュールをダウンロードして、モジュールのインストールに成功している人は多々見受けられます。

しかしながら私の環境では、一度r8168ドライバをインストールしたはずなのに、再起動すると再びr8169ドライバを認識してしまいます。毎回モジュールのインストールをしているわけにもいかないので、思案していたところ、r8168.koが/lib/modules/2.6.18-92.el5/kernel/drivers/net/にインストールされたことを見たので、もしやと思ったら、同じディレクトリ内にr8169.koもありました。試しにr8169.koをr8169.ko.escapeに改名して再起動したところ、最初からr8168ドライバを認識するようになりました。

一応動いてるから、これで万事OK?

[Linux]manコマンドが便利すぎる

Written by uechoco 1月 12

ちょっと野暮用でLinux(gcc)でC言語プログラムを組んでいます。普段C言語を使っていないので、たまに書くとポインタの使い方が間違っていたり、関数の引数を間違えたり大変です。
いつもはネット可能環境にいるので、Google先生がなんでも答えてくれるのですが、たまにネットができないところに行くと関数の引数がわからなくなって、開発が中断してしまっていました。
さっきふとLinuxの中にマニュアルがあったらいいのになぁとか思って、「man memcpy」とかシェルに打ち込んだら、マニュアル出てくるじゃないですかww
今まで知らなくて損してましたね。自分が知ってる関数とかだったらmanコマンドの冒頭の関数宣言を見るだけですぐに使い方がわかるので、Google先生に聞くより早い。