2014年4月4日金曜日

SQLでテーブルの最終更新日時か、テーブルが空の場合は適当な値を返す

PostgreSQLで行いました。タイトルの通り、テーブルの最も新しい更新日時か、テーブルが空の場合には指定した値を返します。
SELECT
    updated_at
FROM (
    (
        SELECT updated_at
        FROM sample_table
        ORDER BY updated_at DESC
        LIMIT 1
    )
    UNION
    SELECT '1970-01-01 00:00:00' AS updated_at
) AS sample
ORDER BY updated_at DESC
LIMIT 1
;
これでできます。 例えば
CREATE TABLE sample_table (
    id SERIAL NOT NULL,
    updated_at TIMESTAMP WITHOUT TIME ZONE NOT NULL,
    created_at TIMESTAMP WITHOUT TIME ZONE NOT NULL
);
この構造の空テーブルがあるときに実行すると
     updated_at      
---------------------
 1970-01-01 00:00:00
(1 row)

こうなります。
INSERT INTO sample_table (updated_at, created_at) VALUES (NOW(), NOW());
適当に挿入した後に実行すると
         updated_at         
----------------------------
 2014-04-03 15:07:44.447706
(1 row)

こうなります。

2014年3月22日土曜日

hostsの優先順位

/etc/hostsについてです。このファイルにはIPアドレスとホスト名の対応を記述します。Wikipedia

このファイルで
127.0.0.1       localhosts
127.0.0.2       localhosts
このように異なるIPアドレスに対して同じ名前が与えられていた場合、Firefoxは後のもの、今回だと127.0.0.2を優先し、Chromeは逆に127.0.0.1を優先していました。

今回自分がたまたま記述を誤ってこれに遭遇しただけで、全く調べずに記録を書いているだけなのでこの記事に誤りが含まれている可能性は非常に高いです。

環境はUbuntu 13.10 64bitです。

2013年9月10日火曜日

Python 2.xと3.xに両対応した継承するだけでSingletonになるクラスを書きました

継承するだけでSingletonになるクラスです。Python 2.xでも3.xでも使用することができます。
getInstance()のような操作は不要です。

>>> from singleton import Singleton
>>> class SubClass(Singleton):
...     pass
...     
... 
>>> sub = SubClass()
>>> sub.value = 1
>>> print(sub.value)
1
>>> SubClass().value
1

2013年8月18日日曜日

Pythonで同名のファイルと同名のディレクトリがあった場合、どちらが優先されるのか

Pythonのfromやimportは指定した名前のディレクトリとファイルのどちらも読み込むことができるので、どちらが優先されるのかを調べました。 名前を指定するときに拡張子を書かないので重複させることができてしまいます。このような構成を用意しました。
% tree
.
├── hoge
│   └── __init__.py
├── hoge.py
└── main.py

2013年7月7日日曜日

git pushで送信されるコミットのログを表示するシェルスクリプトを書きました

git prepushです。git push -nを行い、プッシュの対象になるコミットのログを表示します。



#!/bin/sh
# Copyright (c), Naruse Motoki (motoki@naru.se)
# Licensed under The MIT License

dryrun=`git push -n 2>&1`
echo "$dryrun"
fromto=`echo $dryrun | sed -e "s/.* \([0-9a-z]\+\.\.[0-9a-z]\+\) .*/\1/g"`
if expr "$fromto" : "^[0-9a-z]\+\.\.[0-9a-z]\+$" >/dev/null; then
  echo "`git log --date=short --pretty=format:"%h %ad %an %s" $fromto`"
fi

Gitにもあります。https://gist.github.com/narusemotoki/5943549

パスの通った場所にgitprepush.shという名前で保存し、.gitconfigに「prepush = "! gitprepush.sh"」と書くとgit prepushが利用できるようになります。

git push -nではこのように、リモートリポジトリ名、対象コミットのハッシュ、ブランチしか表示されません。

% git push -n
To git@github.com:narusemotoki/appengine_django_blank.git
   4c4237f..e6c2e1b  django1.4 -> django1.4

ここから自分で対象コミットを確認するのが手間だったので作りました。

2013年6月15日土曜日

Ubuntuとその派生ディストリビューションの消費電力比較

Ubuntuとその派生ディストリビューションの消費電力を比較しました。
比較対象は公式のUnity、GNOME、KDE、Xfce、LXDEに加え、消費電力が低いと紹介されていたwattOSです。いずれもUbuntu 13.04ベースの64bit版です。
これらに対し、2013年6月15日時点でのアップデートをすべて適用し、powertopを用いて消費電力を計測しました。
検証に使用したのはThinkPad T420sです。CPUはCore i5-2520M、8GBのメモリー、HDDは搭載せず、カード型のSSDを搭載しています。無線LANとBluetoothを有効にし、輝度を最大にしています。

これが比較結果です。アイドル時で目視できた最も低い値を掲載しています。

Ubuntu10.6W
Ubuntu GNOME10.6W
Kubuntu10.6W
Xubuntu10.6W
Lubuntu10.6W
wattOS11.1W
wattOS Microwatt Edition10.7W

公式系のディストリビューションは完全に横並びになり、wattOSがそれよりも劣るという結果になりました。これはアイドル時の値であり、実際に使用した場合はwattOSが最も優れた消費電力になるのかもしれません。
実際に使用すると3Dや半透明などを多用するUnityやGNOME、KDEの消費電力が跳ね上がるのではないかと思います。

上記の計測はアイドル時、しかも輝度最大にしてしまっているので、Windowsでのメーカー公称値の4.9時間駆動を上回っているのか下回っているのか分かりません。
ThinkPad T420sは44Whのバッテリーを搭載しており、バッテリー駆動時間のメーカー公称値は4.9時間です。
バッテリー駆動時間の計測方法にはJEITAバッテリ動作時間測定法というものがあります。
これの算出方法は、

  1. 画面輝度を20cdにし、MPEG1動画を再生する
  2. 画面輝度を最低にし放置する

レノボがこれに従っているのかはわかりませんが、この計測方法をUbuntu GNOMEで行ないました。

「測定方法にはバッテリーが切れるまで」とありますが、そんなに待っていたくないので、これもpowertopで消費電力を測って論理値を求めます。
結果です。

  1. 11.0W
  2. 7.81W
44 / ((11.0 + 7.81) / 2) = 4.678

メーカー公称値の4.9時間に届きませんでした。画面輝度をスマートフォンで計測したりと正確でない部分が多いので確実ではありませんが、Windowsよりもわずかにバッテリー持続時間は短くなってしまうようです。

実際に使っていると、わずかではなく圧倒的にWindowsよりも早くバッテリーがなくなると感じています。WindowsをUbuntuのように使う機会がほとんどないので気のせいかもしれませんが。それでもUbuntuを含めLinuxが好きです。

パラメータの調整をしたらUbuntuの方がバッテリー駆動時間が長くなる、ということも起こるかもしれませんね。

2013年6月10日月曜日

Chromebook PixelでChromeにショートカットキーを拾われることなくシェルに伝える方法

Google IOに参加した方(名前を出す許可が貰えたら名前に置換します)にChromebook Pixelを貸していただくことができたので、色々試してみました。

僕は普段プログラムを書くのにEmacsとChromiumとシェルぐらいしか使用しないので、Chromebook PixelではブラウザはChromeを使い、後はSSHで母艦やVPSに接続し、そこでEmacsを使えばChromebook Pixelでもプログラムを不自由なく書くことができそうです。

Chromebook Pixelではデベロッパーモードに入ることなく、SSHを利用することができます。Chrome拡張のSecure Shellを利用する方法や、Ctrl + Alt +tでCroshというタブを開き、そこでSSHを使用する方法があります。
しかしどちらもChromeのタブとして開かれることが致命的で、Emacsを使用するのに重要なキーの一部が、Chromeのショートカットキーとして動作してしまいます。例えば、C-n(Ctrl + n)はEmacsでは次の行に移動する基本的な動作ですが、Chromeのタブとして開いているため、新しいChromeのウィンドウが開きます。これではとてもEmacsを使えません。
さらに困ったことに、ショートカットキーを編集する系の拡張を利用しても、一部のショートカットキーを無効にすることができません。C-nも。

そこでCrosh Windowです。
これもChromeの拡張なのですが、先程のCroshをChromeの外で起動することができます。これによりChromeにキーを奪われることなくSSHを利用することができます。

Chromebook Pixelは3:2と縦方向に解像度が高いとても良いディスプレイを持っています。
単体では開発にはあまり向かないですが、この方法を利用すれば普段あまりGUIを使わずに開発している人にとってはとても開発に使いやすいマシンになるのではないでしょうか。


※この写真ではChromebook Pixelから別のマシンにSSHを使いログインし、Emacsを起動していますが、Crosh Windowは使用していません。タイトルバーの有無程度しか見た目の差はありませんが。
※無線LANとBluetoothを無効化し、USB接続のWiMAXを使用しています。