2015年3月16日月曜日

lxc-wrapperのMACアドレス自動生成

lxc-wrapperについて、MACアドレスを自動生成させるようにしました。
https://github.com/ccat/lxc-wrapper

2015年3月10日火曜日

django-mptt (0.6.x) README.rst

Djangoでツリー構造を作る時に便利なdjango-mpttのreadme.rstの和訳です。 django-mpttは便利なのですが、日本語の資料が少なそうなので和訳しました。 なお、日本語として読みやすくするために、言い回しや文のつなぎの変更や省略を行っています。気になる方は原文を確認してください。
原文はこちら
他のドキュメントもそのうち和訳するかもしれません。

django-mptt

djangoモデルに修正された先行順走査(MPTT)を実装し、モデルインスタンスのツリーとして動作するユーティリティです。

プロジェクトホーム: http://github.com/django-mptt/django-mptt/
ドキュメント: http://django-mptt.github.io/django-mptt/
ディスカッショングループ: http://groups.google.com/group/django-mptt-dev

修正された先行順走査(MPTT)とは何か?

MPTTとは、階層的なデータをデータベースに保存する手法です。 検索処理を効率化することを目的としています。

効率化のトレードオフとして、要素の追加や移動がより複雑になっており、ツリー構造を保つには追加の作業が必要です。

MPTTについて、どう動作するか詳細を理解できるいくつかの記事を示しておきます。

SQLの中のツリー (Trees in SQL)

データベースに階層構造のデータを保存する (Storing Hierarchical Data in a Database)

MySQLの中の階層的なデータを管理する(Managing Hierarchical Data in MySQL)

django-mpttとは何か?

django-mpttは、簡単にMPTTをあなたのdjangoモデルで使えるようにする、再利用可能なdjangoアプリケーションです。 データベースのテーブルをツリー構造として管理し、モデルインスタンスのツリーを操作するツールを提供します。

必要要件

Python 2.6以上 (実験的なサポート:python 3.2以上)
Django 1.4.2以上

特徴

  • モデルの簡単な登録 - ツリー構造に必要なフィールドを自動的に追加します。
  • モデルインスタンスを作成・削除したり、親を変更したりすると、自動的にツリー構造を更新します。
  • あなたが選択した単一(もしくは複数)のフィールドで、ツリーの各レベルを自動的に整列させます
  • 登録されたモデルに対して、次のような新しいモデルメソッドを追加します。
    • 木の中の位置を変更
    • 祖先、兄弟、子の検索
    • 子孫の数を数える
    • その他の木に関する操作
  • 登録されたモデルに対して TreeManagerが追加され、以下のメソッドを提供します。
    • 木周辺、もしくは別の木へのノードの移動
    • 木のどこかへノードを挿入
    • 木のMPTTフィールドの再生成(djangoの外側でアップデートを行った際に利用)
  • ツリーモデル用のFormフィールド
  • ツリーモデル用のユーティリティ機能
  • ツリーを描画するためのテンプレートタグとフィルター

2015年3月8日日曜日

Pi Digit Generation Protocolの実装

go言語について、どんな感じかちょっと知りたかったこともあり、RFCの3091で定義されている、パイ(円周率)の値を延々と流し続けるサービス(Pi Digit Generation Protocol)を実装してみました。

プログラム:pidigitgen

なお、円周率の値はhttp://pi2.cc.u-tokyo.ac.jp/index.htmlからいただきました。

TCPで、www.whiteblack-cat.infoの31415ポートにアクセスすると、円周率の小数点以下の数字が延々と流れてきます。

UDPで、www.whiteblack-cat.infoの31415ポートに整数を投げると、リクエストされた桁数と小数点以下でその桁の数字を返してきます。例えば、"2"とリクエストを送ると、"2:4"(3.1415の4)が返ってきます。

2015年3月2日月曜日

Django-MPTT(0.6.x) のインストール

こちら(http://django-mptt.github.io/django-mptt/install.html)の和訳です。

Official releases

Official releaseはPyPIで利用可能です。

.zipの配布ファイルをダウンロードし、解凍してください。その中にsetup.pyと言うスクリプトが存在します。次のコマンドを入力してください。

python setup.py install
パッケージが自動的にインストールされます。

開発バージョン

別の方法として、gitから最新のソースコードを取得することもできます。

git clone git://github.com/django-mptt/django-mptt.git django-mptt

結果のフォルダをPYTHONPATHに追加するか、PYTHONPATHが通っているディレクトリ(例:Pythonのsite-packagesディレクトリ)にmpttディレクトリへのリンクを作成します。

PYTHONPATでアプリケーションが利用可能になっているか、Pythonインタプリターを起動して下記のコマンドを実行することで確認できます。

>>> import mptt
>>> mptt.VERSION
(0, 5, '+dev')
コピーしたソースコードをアップデートしたい場合、git pullコマンドをdjango-mpttディレクトリ内で実行してください。

注意:開発バージョンにはリリースバージョンには含まれていないようなバグや後方互換性の無い変更が含まれていることがあります。もしmasterブランチを利用している場合、ソースコードのアップデートを行う前に、コミット履歴をよく確認してください。

2015年3月1日日曜日

Titanium Studioでandroidのmenuを動的に変更する

Titanium Studioでアプリケーションを作成していると、ログイン/ログアウトボタンのように、動的にメニューを変更したくなる時があります。 そこで、android用のmenuを動的に変更する方法について、メモを作成しました。 なお、サンプルプロジェクトを以下に保存してあります。必要な方はご利用ください。
https://github.com/ccat/dynamic_menu

まず、メニューは動的に生成することもできますが、今回は始めにAlloyで生成した後、表示・非表示を切り替えることで動的に見た目を変更することにしました。viewのソースコードは下記の通りです。

<Alloy>
  <Window id="index" class="container">
    <Menu platform="android">
      <MenuItem id="menu1" itemId="1" title="Menu1" onClick="menu1func"  />
      <MenuItem id="menu2" itemId="2" title="Menu2" onClick="menu2func" />
    </Menu>
    <Label id="label" >Hello, World</Label>
  </Window>
</Alloy>

真ん中に存在する2つのMenuItemが、今回動的に見た目を切り替えるメニューです。Menu1を選択するとMenu1が非表示になってMenu2が表示され、Menu2を選択するとMenu2が非表示になってMenu1が表示されるようにします。
controllerからはitemIdで操作するため、忘れずにitemIdを設定するようにしてください。また、この時itemIdには整数を指定するようにしてください。整数を指定しない場合、以下のようなエラーが発生します。

[ERROR] :  TiApplication: (main) [27564,27843] Sending event: exception on thread: main msg:java.lang.NumberFormatException: Invalid int: "a1"; Titanium 3.5.0,2015/01/12 15:33,0014f83 
[ERROR] :  TiApplication: java.lang.NumberFormatException: Invalid int: "a1"

次に、controllerは下記のように記載します。


var menu1 = null;
var menu2 = null;
var menu1show=true;

function menu1func(e){
  menu1show=false;
  menuChange();
}

function menu2func(e){
  menu1show=true;
  menuChange();
}

function menuChange(){
  if(menu1!=null){
    menu1.setVisible(menu1show);
  }
  if(menu2!=null){
    menu2.setVisible(!menu1show);
  }
}

var activity=$.index.activity;
activity.onPrepareOptionsMenu = function(e) {
  var menu = e.menu;
  menu1 = menu.findItem("1");
  menu2 = menu.findItem("2");
  menuChange();
};


$.index.open();

まず「activity.onPrepareOptionsMenu」でメニューの各アイテムを取得し、各メニューが選択されるたびに表示を切り替えるようにしています。

「onPrepareOptionsMenu」は、メニューを表示する前に複数回呼び出されるため、メニューの作成をここで行う場合、同じメニューを何回も作成してしまわないように注意してください。
「onCreateOptionsMenu」の場合、1回だけ呼び出される関数なようなのですが、私の環境では1回も呼び出されなかったため、「onPrepareOptionsMenu」を利用しています。

LXCで利用するIPアドレス帯域を変更する

Ubuntuではlxcをaptでインストールすると、自動でNAT設定とDHCPの設定が行われます。そのままでも基本的に問題ありませんが、たまに設定を変更したくなる時があります。

Ubuntu 14.04では、DHCPで利用するネットワーク設定が、起動/終了スクリプトである「/etc/default/lxc-net」に下記のようにハードコーディングされています。

#/etc/default/lxc-net

LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.1.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.1.0/24"
LXC_DHCP_RANGE="10.0.1.2,10.0.1.254"
LXC_DHCP_MAX="253"

そのため、IPアドレス帯域を"10.0.10.0"に変更したい場合、下記のように変更します。

#/etc/default/lxc-net

LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.10.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.10.0/24"
LXC_DHCP_RANGE="10.0.10.2,10.0.10.254"
LXC_DHCP_MAX="253"