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"

2015年2月22日日曜日

LXCとSoftEtherを利用してサーバー上にセキュアな作業システムを作る その2

今回はSoftEther用のLXCコンテナの作成方法についてメモします。

コンテナの作成とSoftEtherのインストール

まずコンテナを作成し、起動します。

sudo lxc-create -n コンテナ名 -t ubuntu
sudo lxc-start -n コンテナ名

その後、以下のコマンドをコンテナ内で実行することでSoftEtherがインストールされます。

sudo apt-add-repository ppa:dajhorn/softether -y
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install softether -y

なお、本コマンドでインストールされるSoftEtherは本家が配布しているdebパッケージではありません。本家からインストールする場合、makeから必要になります。 ※本debパッケージの配布元:https://launchpad.net/~paskal-07/+archive/ubuntu/softethervpn

また、lxc-wrapperをインストールしている場合は以下のコマンドでインストールできます。

sudo lxc-wrapper -c -n コンテナ名 -t softether-ubuntu

初期設定

作成したコンテナ上で下記を実行します。

sudo vpncmd /server localhost /CMD HubCreate lxcvpn /password:
sudo vpncmd /server localhost /CMD BridgeCreate lxcvpn /DEVICE:eth0
sudo vpncmd /server localhost /CMD HubDelete DEFAULT
sudo vpncmd /server localhost /CMD VpnAzureSetEnable yes
sudo vpncmd /server localhost /CMD Flush
sudo vpncmd /server localhost /CMD VpnAzureGetStatus

一番最後のコマンドでazureのサブドメインが表示されるので、SoftEther管理マネージャーからアクセスしてください。 なお、この状態ではパスワード等が設定されていないため、早めに設定変更してください。

設定のバックアップとリストア

設定のバックアップはSoftEtherの管理マネージャーから行えるので、そちらから行う方が楽でしょう。
リストアを行う場合、設定ファイルを上書きし、SoftEtherサービスを再起動してください。

sudo cp vpn_server.config /var/lib/softether/vpn_server.config
sudo service softether restart

LXCとSoftEtherを利用してサーバー上にセキュアな作業システムを作る その1

プログラム作成やシステム構築を行っていると、jenkinsなんかのツールが欲しくなってきますが、家のマシンで動かすと電源を落とせなくなりますし、クラウド上のサーバーで動かしてそのままインターネットでアクセスできる状態にするのもセキュリティ上、好ましくありません。

そこで、クラウド(今回は「さくらのVPS」を利用)上のサーバーにLXCをインストールした上で仮想マシン(正確にはコンテナ)にSoftEtherをインストールし、VPN接続することで比較的セキュアな環境を用意することにしました。

構成概要

まず、一番土台となっているlxc serverについては「さくらのVPS」の2コア・HDD100GBを利用しています。ここは、lxcが入っているだけで他は何も入っていません。
次に、lxc上で動いている「SoftEther」ですが、こちらはlxc上で動いているubuntuイメージのコンテナに、SoftEtherをインストールしたものです。
PCをVPNで接続すると、lxcのネットワークに接続され、DHCPでIPが割り振られます。また、lxc serverに直接VPN接続を行い、SoftEtherまでリダイレクトするとIPアドレス変更時等に設定変更が必要となるため、SoftEther側で用意されているAzureを経由する方式にしています。
なお、SoftEtherをホストに直接インストールする場合、lxc用に自動生成されるnicとは別にSoftEther用の仮想nicを用意しないとDHCPが正常に動作しません。
最後に自動化ツールのベースとして、jenkinsを用意し、バックアップを行わせています。

2015年2月7日土曜日

lxc-wrapper

最近、dockerの説明で「コンテナ型」とか「差分ディスク」と言うところにフォーカスされていることが多いんですが、それ自身はdockerのベースとなっているlxcでもできることで、dockerのコアではない、と個人的に思っています。ただ、lxcで差分ディスクを利用するのも結構面倒なので、ちょっとしたwrapperを作成しました。なお、ubuntu用なのでubuntu以外では動作しません。

概要説明

lxcでコンテナを作成すると、デフォルトでは「/var/lib/lxc/コンテナ名/rootfs」にシステム一式を保存します。
lxc-wrapperを利用すると、「/var/lib/lxc/images/イメージ名/rootfs」にシステム一式を保存し、「/var/lib/lxc/コンテナ名/diff」に差分を保存するコンテナを作成できます。
1つのイメージから複数コンテナ作成すれば、dockerの時と同様に、差分のみでコンテナを作成できるわけです。

なお、コンテナからイメージも作成することができますが、dockerとは異なり、差分の差分の差分の・・・と言うような構造は取らず、イメージにする時に全部コピーします。

インストール

以下の方法でインストールします。

git clone https://github.com/ccat/lxc-wrapper.git
cd lxc-wrapper
sudo sh ./install.sh

使い方

  • lxcテンプレートからイメージ作成
    sudo lxc-wrapper -m -t テンプレート名 -i イメージ名
    例:sudo lxc-wrapper -m -t ubuntu -i ubuntu_0001
  • コンテナからイメージ作成
    sudo lxc-wrapper -m -n コンテナ名 -i イメージ名
    例:sudo lxc-wrapper -m -n server1 -i server_0001
  • イメージからコンテナ作成
    sudo lxc-wrapper -c -n コンテナ名 -i イメージ名
    例:sudo lxc-wrapper -c -n server2 -i server_0001
  • なお、作成したコンテナは普通にlxcとして動作するため、lxc-start等で起動できます。