2012年11月25日日曜日

apache設定。。とほほ@Macbook Air

いつも同じハマり方してると思う。
いい加減学習しろっつの。ということで、
書いておきます。

ついに、 Macbook Air を買ってしまいました。
特別にアップル信者ではないですが、自宅デスクトップ、Thinkpad がクタクタになってきたので、そろそろ、、ということで、次は64bitパソコンだろうと思ってましたが、私もついにMacを使い始めることになるとはね。。

MacはBSDです。ずっとLinuxをいじっていたので、大丈夫かなと思ってましたが、今のところ問題ないですね。もちろんMac独自のものが色々あると思いますが。

今日は、だらだら余計なことを言ってしまいましたが、、、
起こっていた現象


  • デフォルトのドキュメントルートだとうまく表示される
  • ドキュメントルートを変更するとForbidden が返る。

もう、初心者か!と自分に突っ込みました。

指定したドキュメントルートはこんな感じ

/Users/MY_ACCOUNT/Documents/workspacePDT/MyProject/web


Macで浮かれていたのか、BSDでさくさく自由にプロセス立ち上げて開発できるのが嬉しくて、か、、上記で言いたいのは、"/Users/..." にドキュメントルートを指定したことです。("/Users"は、言うまでもなく、ユーザディレクトリで、Linuxなら、"/home"に該当)
Mac OS X (10.8.2) の apache は、"_www"ユーザ、"_www"グループでプロセスが起動されます。
ドキュメントルートパスがトップディレクトリからたどって行って、この_wwwユーザか_wwwグループの権限の人が"読み込み"、"実行"権限がないディレクトリが一つでも間に入ると、読み取ることができなくなり、"Forbidden"になってしまいます。

とりあえず、
chgrp _www /Users/MY_ACCOUNT/Documents
chmod 750 /Users/MY_ACCOUNT/Documents


これで見れるようになりました。
Documents ディレクトリ意外は "その他"のグループ権限に読み込み・実行権限が割り当てられていました。
という事でした。
ふぅー、危なくMacPortsで新たにapacheをインストールするところだった。

2012年11月10日土曜日

MySQL BLOB の画像が切れる

ふひー。やはりブログは性に合わない。。

いくつか書きたまってますが、公開してません。間違ったこと書きたくないので。なるべくね。

今日は、忙しいのに、なぜか書いてる。

ちょっとだけハマった事書いておきます。

MySQL の BLOB 型は 64KB までしか入りません。
64KB 以上のバイナリを入れようとすると、そこで切れます。

64KB 以上の画像など、バイナリをMySQLへ保存したい時は、MIDIUMBLOB とかにします。
MIDIUMBLOB は 64M までいけます。

それだけです。。


2012年3月5日月曜日

svn: File not found: transaction

subversionでタグを作成する際に発生したエラー。
原因は単純。
中間のディレクトリが存在しない状態でタグやブランチを作成しようとするとエラーが発生します。
例えば

/svn_repositories/projects/AAA/source/trunk/

このtrunkから"release1.0"タグを作成したい場合

svn copy file:///svn_repositories/projects/AAA/source/trunk/ file:///svn_repositories/projects/AAA/source/tags/release1.0

を実行する際には、間のディレクトリ

/svn_repositories/projects/AAA/source/tags

が先に作成されていなくてはなりません。
作成されない状態で、実行すると

svn: File not found: transaction

が発生します。

間のディレクトリを作成するには

svn mkdir file:///svn_repositories/projects/AAA/source/tags

を実行します。

2012年2月12日日曜日

ORA-00907:右カッコがありません。

職場でちょっとハマったのでメモ。

副問い合わせにorder byを入れると右カッコがありませんになる。

2012年2月9日木曜日

Android のログレベル

ログレベルについて軽く調べたところによると、特にマニュフェストファイルの
<application android:debuggable>
属性に連動しているわけではないという事がわかった。

知らないうちにLog.d()などを沢山埋めている場合、
<application android:debuggable="false">
にしたところで、勝手に抑止されるわけではないので、以下のようなクラスを用意すると良いだろう。

public class Log {

 private Log() {
 }

 public static void i(final String tag, final String msg) {
  i(tag, msg, null);
 }

 public static void i(final String tag, final String msg, final Throwable th) {
  // info は常に出す。
  if (null == th) {
   android.util.Log.i(tag, msg);
   
  } else {
   android.util.Log.i(tag, msg, th);
  }
 }

 public static void d(final String tag, final String msg) {
  d(tag, msg, null);
 }

 public static void d(final String tag, final String msg, final Throwable th) {
  if (!AppMan.DEBUG_MODE) {
   return;
  }
  if (null == th) {
   android.util.Log.d(tag, msg);
  } else {
   android.util.Log.d(tag, msg, th);
  }
 }

 public static void e(final String tag, final String msg) {
  e(tag, msg, null);
 }

 public static void e(final String tag, final String msg, final Throwable th) {
  // error レベルは常に出す
  if (null == th) {
   android.util.Log.e(tag, msg);
  } else {
   android.util.Log.e(tag, msg, th);
  }
 }

 public static void w(final String tag, final String msg) {
  w(tag, msg, null);
 }

 public static void w(final String tag, final String msg, final Throwable th) {
  // warning も常に出す事にする。
  if (null == th) {
   android.util.Log.w(tag, msg);
  } else {
   android.util.Log.w(tag, msg, th);
  }
 }

 public static void v(final String tag, final String msg) {
  v(tag, msg, null);
 }

 public static void v(final String tag, final String msg, final Throwable th) {
  if (!AppMan.DEBUG_MODE) {
   return;
  }
  if (null == th) {
   android.util.Log.v(tag, msg);
  } else {
   android.util.Log.v(tag, msg, th);
  }
 }
}


後は、各クラスでeclipseの ctrl + shift + o でimport定義を更新して、上記クラスを利用するようにすれば、簡単にマニュフェストファイルに連動して抑止する事ができる。

ただし、上記ソースを見て頂ければわかると思いますが、AppMan.DEBUG_MODE がマニュフェストファイルと連動していなくてはならない。
アプリケーション起動の際、この定数をマニュフェストファイルを参照して初期化する必要がある。

マニュフェストファイルの android:debuggable 属性を参照するコードは以下。

public class Utils {
 private Utils() {
 }

 public static boolean  isDebugAble(Context ctx){
  PackageManager manager = ctx.getPackageManager();
  ApplicationInfo appInfo = null;
  try {
   appInfo = manager.getApplicationInfo(ctx.getPackageName(), 0);
  } catch (NameNotFoundException e) {
   Log.e(e.toString());
   return false;
  }
  if((appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) == ApplicationInfo.FLAG_DEBUGGABLE) return true;
  return false;
 }
}

このソースは以下から貰いました。ありがとうございます。

http://www.taosoftware.co.jp/blog/2009/03/android_apireleasedebug.html

後は、アプリケーション起動時、一番最初に表示されるActivityなどで、独自のAppManクラスのDEBUG_MODE定数に上記ユーティリティの戻り値をセットすれば良い。