2011年3月27日日曜日

AlertDialogで二重クリック

androidのAlertDialogは、ボタンが一回押されたら閉じてしまう。だから、ボタンは一回しか押されない。そう思っている時期が私にもありました。
でも、違いました。AlertDialogは、二度押しを防ぐ仕様にはなっていません。

最近、AlertDialogのボタンが二度押しされていると思わせるような事があったので、簡単なサンプルを書いてエミュレーターで試してみました。
new AlertDialog.Builder(DialogTestActivity.this)
.setTitle("Dialog Test")
.setMessage("Are you OK?")
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
 @Override
 public void onClick(DialogInterface dialog, int which) {
  Log.d(TAG, "Clicked OK.");
 }
})
.setNegativeButton("Cancel", null).show();
こんなコードを書いて、表示されたダイアログのOKボタンをダブルクリックすると、二重押しを示すログが残ります。
03-27 10:02:27.576: DEBUG/DialogTest(317): Clicked OK.
03-27 10:02:27.629: DEBUG/DialogTest(317): Clicked OK.
OnClickListener()の中に多重実行を想定していない処理が書いてあると、問題が起きるかも知れません。

2011年3月22日火曜日

今日の停電は何時から?

停電前に家鯖をshutdownするのを忘れないように、停電時刻を表示するシェルスクリプトを書いてみました。使い方は、usageを見ればだいたいわかるでしょう。第一引数がグループ、第2引数が日のオフセットです。引数は省略可で、省略時には私の家の属する第4グループの予定を表示します。オフセットを与えることで、翌日以降のスケジュールもわかります。

しかし、ここで問題が。3月26日以降は各グループがさらに5分割されるので、正確さを期すためには、より細かい判定が必要になります。今のスクリプトでも使るでしょうが、停電対象から外れる空振りが多いはずです。

#!/bin/sh

# arg1 or default(4) as blackout group
grp=${1:-4}
# args or default(0) as day of year offset
offset=${2:-0}
if [ $grp -lt 1 -o $grp -gt 5 -o $offset -lt 0 ]
then
  echo usage $0 [1-5] [offset]
  exit 1
fi
echo Group $grp

doy=`date +%_j`
doy=`expr $doy + $offset`
pattern=`expr $doy - $grp`
pattern=`expr $pattern % 5`

case $pattern in
0) echo 9:20-13:00, 16:50-20:30 ;;
1) echo 6:20-10:00, 13:50-17:30 ;;
2) echo 18:20-22:00 ;;
3) echo 15:20-19:00 ;;
4) echo 12:20-16:00 ;;
esac
exit 0

実際にUbuntu Linuxの上で動かしているのは、こんなスクリプトです。

#!/bin/sh

# arg1 or default(4) as blackout group
grp=${1:-4}
if [ $grp -lt 1 -o $grp -gt 5 ]
then
  echo usage $0 [1-5]
  exit 1
fi

doy=`date +%_j`
hour=`date +%k`
pattern=`expr $doy - $grp`
pattern=`expr $pattern % 5`

if [ $pattern -eq 0 -a $hour -eq 9 ]
then
  # 9:20
  shutdown -P now
elif [ $pattern -eq 1 -a $hour -eq 6 ]
then
  # 6:20
  shutdown -P now
elif [ $pattern -eq 2 -a $hour -eq 18 ]
then
  # 18:20
  shutdown -P now
elif [ $pattern -eq 3 -a $hour -eq 15 ]
then
  # 15:20
  shutdown -P now
elif [ $pattern -eq 4 -a $hour -eq 12 ]
then
  # 12:20
  shutdown -P now
fi
exit 0


これを、cronを使って毎日6,9,12,15,18時台の早い時刻に実行して、停電前であればshutdownを実行するようにしています。

13  6,9,12,15,18        * * *   root    /usr/local/bin/scheduledshutdown.sh

追記
実は我が家のあるエリアは計画停電の実施対象外である事が判明。道理で、今日まで一度も停電してません。

2011年3月10日木曜日

Shuttle XS35

 先週末にLOOX T70HからShuttle XS35へおうちサーバーを引っ越しました。
http://www.shuttle-japan.jp/barebone/XS35/
なかなかいい感じです。冷却ファンが爆音なくせにメモリ付近に熱がこもるT70Hと比べると、XS35は静かです。内蔵した5400rpmのHDDも思いのほか静かで、これならリビングに置いても問題になりません。
性能的には、PentiumM 1.1GHzのクロックを落として使っていたT70Hより向上していると思います。MRTGの負荷グラフは以前より低くなりました。

XS35はなかなかいいのですが、、惜しい所が2点かあります。

  • 2台目のHDDを固定する金具が1台分しか無い。接続キットはオプションとして販売されていないので、HDD2台内蔵は無理。
  • 無線LANカードが内蔵されているが、。現在公開されているファームウェアでは使えない。初期状態では使えず、Windowsで起動して有効化する必要がある

どちらも、我が家の用途では問題になっていませんが、あてにしている人は要注意です。Linuxでも無線LANは使えますが、Linuxだけで完結できないのが残念。

2011年3月6日日曜日

おうちサーバが昇天間近

おうちサーバとしてUbuntu Linuxを動かしているLOOX T70Hがいよいよ駄目らしい。

カーネルアップデートのために再起動しようとしたら、冷却ファンエラーが発生するようになった。掃除で復帰するかと思ってやってみたら、かえって異音が増す始末。

引越しを決意して、AmazonでファンレスのCPU付きベアボーンとHDD、メモリ、キーボードを注文した。ちょうどプライム無料お試しの勧誘があったので、登録してお急ぎ便していした。1ヶ月経つ前に、プライム解約するのを忘れないようにしなくては。

引越しはMondoRescueを使うことになると思う、ATAからSATAへの引越し。ヒントになりそうなキーワードで検索したら、結局自分のblogにたどり着いた。またVMware Playerのお世話になりそうだ。

2011年2月3日木曜日

AndroidのonPreviewFrame()に渡されるformatが仕様と違う件

 Camera.PreviewCallback#onPreviewFrame(byte[] data, Camera camera)に渡されるデータは、デフォルトでYCbCr_420_SP (NV21)であるとReferenceに書いてある。検索してみると、この前提で書かれているサンプルもたくさんある。
  http://developer.android.com/reference/android/hardware/Camera.PreviewCallback.html

 しかし、SDKをここ数日使ってみたところ、どうも違うっぽい。実際にはYUV422SP(NV16)が来ている。Camera.Parameters#getPreviewFormat()は0x10(NV16)を返すし、data.lengthはY planeの2倍のサイズだし、NV16である前提でRGBに変換してみると、一応まともな画になる。逆に、NV21のつもりで変換すると、色がズレズレになってしまう。Issue 823のコメント22↓がまさにソレ。
  http://code.google.com/p/android/issues/detail?id=823#c22

 実機のカメラがLSIの都合でYUV422SPになるのはあり得るけど、エミュレータがこれではイカンですね。仕様が間違いなのか、実装が間違いなのか。RGB_565を指定してもまともに動かない、getSupportedPreviewFormats()を呼ぶとアプリが死ぬ等、PreviewFormatまわりは相当にひどい出来。まともにテストしてないね。

2010年12月7日火曜日

NLogを使ってみる

log4netからNLogへの移行を模索中。出力先をファイルにした場合に、最初のロギングまではファイルが生成されない模様。設定ファイルを読んだだけで0バイトのファイルができるlog4netより都合がいい。実行中のEnable,Disableも簡単。

スタートアップオブジェクトのMain()で一旦DisableLogging()を呼んでから、Settingsに従った初期化をする。

[STAThread]
static void Main()
{
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);

  NLog.LogManager.DisableLogging();
  Properties.Settings appsettings = Properties.Settings.Default;
  if (String.IsNullOrEmpty(appsettings.LogFolder))
  {
    appsettings.LogFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) +    System.IO.Path.DirectorySeparatorChar + "Log";
  }
  SetLocation(appsettings.LogFolder);
  if (appsettings.LogEnabled)
  {
    NLog.LogManager.EnableLogging();
  }

  Application.Run(new MainForm());
}

private static void SetLocation(string folder)
{
  NLog.Config.LoggingConfiguration config = NLog.LogManager.Configuration;
  if (config != null)
  {
    ReadOnlyCollection<NLog.Targets.Target> targets = config.AllTargets;
    foreach (NLog.Targets.Target target in targets)
    {
      NLog.Targets.FileTarget ft = target as NLog.Targets.FileTarget;
      if (ft != null)
      {
        string filename = Path.GetFileName(ft.FileName.Render(NLog.LogEventInfo.CreateNullEvent()));
        ft.FileName = NLog.Layouts.Layout.FromString(folder + Path.DirectorySeparatorChar + filename);
      }
    }
  }
}


2010年12月6日月曜日

.NET Framework 4から旧バージョン用のDLLを参照する

また忘れそうなのでメモ。
log4netとかSQLite.NETを参照する時に必要になる。
 http://msdn.microsoft.com/ja-jp/library/bbx34a2h.aspx
startup要素でuseLegacyV2RuntimeActivationPolicy属性をtrueにしろと。