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等で起動できます。

    2015年2月1日日曜日

    「売れる確信を持ってから作る」と言うこと 【Lean Startupの注意点】

    • 対象読者:Lean Startupについて調べている人
    • 概要:Lean Startupについて気づいた注意点を列挙しました

    本記事ではLean Startupの注意点をつらつらと記載しました。私自身が勉強中なので、増えたり減ったり修正したりしていくと思います。
    TOC

    Lean Startupの目標は「手元資金が尽きる前に新しい商売を立ち上げる」こと

    Lean Startupの目標は「手元資金が尽きる前に新しい商売を立ち上げる」こと。この前提がずれている場面ではあまり役に立たない。

    顧客が「お金を払ってでも入手したい」と思っていることを可能な限り確認してから生産を開始すること

    顧客が「お金を払ってでも入手したい」と思っていることを可能な限り確認してから生産を開始すること。Kickstarter等のクラウドファウンディングはその確認に最適。もし、クラウドファウンディングに出してもムダだと思えるなら、アイデアに問題があるのかもしれない。

    「誰に(Customer)」、「どんな価値を提供し(Value Proposition)」、「どう利益を得るか(Revenue)」の3点を重視すること

    ビジネスモデルキャンバスは考えの整理には良いが、全部を埋めることばかりに注力してもしょうがない。最低限、「誰に(Customer)」、「どんな価値を提供し(Value Proposition)」、「どう利益を得るか(Revenue)」の3点が考えられていれば良い。

    競合優位性が提供価値であると言うこと

    ビジネスモデルキャンバスには「競合」と言う概念は出てこないが、実際には「提供価値(Value Proposition)」は「競合」に大きく左右される。競合を知っている顧客に取って、「提供価値」は競合との差別化ポイントだけだからだ。そこに十分な魅力が無ければ競合からは移ってこない。

    競合優位性は模倣しにくい方が望ましいが、絶対条件ではないと言うこと

    競合との差別化ポイントが簡単に模倣できると、その差別化に価値があると判明した瞬間に模倣されてしまう。そのため、模倣しにく方が望ましいが、模倣を極端に恐れるのも馬鹿げている。 模倣を恐れるよりも、まずはニーズとのかい離を恐れるべきだ。

    顧客の話はよく見極めること

    顧客に話を聞くと、「こんな機能があったら欲しい」と言う意見が頻繁に出てくるが、その機能を実装するかはよく検討するべきだ。十中八九はそのような機能を実装しても結局買ってくれない。と、同時に十中一二は機能を追加すれば買ってくれる。

    Lean Startupが常に最善と言うわけではないと言うこと

    Lean Startupは設計や製造に時間がかかることを前提としている。設計や製造に時間がかかるから、先にニーズをとことん検証しよう、と言うわけだ。そのため、もし設計や製造が極端に短い時間で終わる(例えば1日とか)なら、考えるより先に作ってしまうと言う方式も成立する。

    利用する人とお金を払う人が同一とは限らないと言うこと

    実際に利用する人とお金を払う人が同一とは限らない。企業向けのシステムや子供向けのおもちゃ等はその最たる例だ。両方のニーズを満たして初めて製品が売れる。