2013年11月7日木曜日

Google App Engine の dev_appserver起動時にsqliteでエラーがでる場合の対処法

久しぶりにMacOSでGo言語版のGoogle App Engineを触ってみたら、sqliteでエラーがでしまったので、なんとかした時のメモ

ちなみに環境は、下記の通り

  • MacOS X Marveric
  • go-app-engine-64(home brewでインストール)
  • sqlite 3.8.1 (home brewでインストール)
  • python 2.7.5 (home brewでインストール)

 

まずは、実行してみると

$ dev_appserver.py myapp
Traceback (most recent call last):
File "/usr/local/bin/dev_appserver.py", line 197, in <module>
_run_file(__file__, globals())
File "/usr/local/bin/dev_appserver.py", line 193, in _run_file
execfile(script_path, globals_)
File "/usr/local/Cellar/go-app-engine-64/1.8.7/share/go-app-engine-64/google/appengine/tools/devappserver2/devappserver2.py", line 33, in <module>
from google.appengine.tools.devappserver2 import api_server
File "/usr/local/Cellar/go-app-engine-64/1.8.7/share/go-app-engine-64/google/appengine/tools/devappserver2/api_server.py", line 50, in <module>
from google.appengine.api.logservice import logservice_stub
File "/usr/local/Cellar/go-app-engine-64/1.8.7/share/go-app-engine-64/google/appengine/api/logservice/logservice_stub.py", line 22, in <module>
import sqlite3
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sqlite3/__init__.py", line 24, in <module>
from dbapi2 import *
File "/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sqlite3/dbapi2.py", line 27, in <module>
from _sqlite3 import *
ImportError: dlopen(/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_sqlite3.so, 2): Library not loaded: /usr/local/opt/sqlite/lib/libsqlite3.0.8.6.dylib
Referenced from: /usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_sqlite3.so
Reason: image not found

 

てな感じに、『sqliteのイメージが見つかんないよ』と言われてしまう。

ということで、おいでませStackOverflow!

エラーメッセージで調べてみると、それっぽい記事を発見

http://stackoverflow.com/questions/15595473/python-import-sqlite-error

 

この記事のとおりに試してみます。

まずは、HomeBrewでインストールしたSqliteとPythonをアンインストールします。

brew rm sqlite python

 

そして、再度Pythonのみをインストールします

brew install python

 

pythonのインストール時に、合わせてSqliteも入るため、そっちを使うようにするようです。

 

とりあえず、これでうまくdev_appserver.pyが動くはずです。

自分の環境では、app.yamlの構文エラーで失敗しましたが・・・。

2013年9月24日火曜日

Go言語からNeo4jを試してみる

ここ一年半ほどあるものを実装しようとモヤモヤしていたのですが、先週元上司との会話の中でヒントをもらった気がしたので、グラフDBをためしてみることにしました。
グラフDBは初挑戦のため、情報も多いメジャーどころのNeo4jを使用することにしました。
そもそもグラフDBとはなんぞや?って人は各々ググッてください。

◯Neo4Jのインストール

とりあえずローカルで試せればいいので、brewから一発でインストールします
brew install neo4j
で、インストールが終わったら、
neo4j start
で実行させるのですが、Neo4jの動作にはJava7が必要ということらしく、Oracleのサイトからダウンロード&インストールを行いました。
再度 neo4j start コマンドを実行すると、文句を言われながらも、サーバーが立ち上がります。
$ neo4j start
WARNING! You are using an unsupported version of the Java runtime. Please use Oracle(R) Java(TM) Runtime Environment 7.
Using additional JVM arguments: -server -XX:+DisableExplicitGC -Dorg.neo4j.server.properties=conf/neo4j-server.properties -Djava.util.logging.config.file=conf/logging.properties -Dlog4j.configuration=file:conf/log4j.properties -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -Dneo4j.ext.udc.source=homebrew
Detected installation in launchd, starting it...

 サーバが正常に立ち上がったら、Web管理者用ページを開いてみます。
open http://localhost:7474/webadmin/
Neo4j 001
上記の画面はいくつかテスト的にデータを突っ込んだ後の状態になっています。
とりあえず、ここまで確認できたら、インストールは完了です。


◯Go言語用クライアントをインストール

Go言語のライブラリを探す際は、
  • できるだけ最近更新されており
  • こまめにコミットされている
を基準としてるため、Neo4jを試した日(2013/09/23時点)で、最も上記に当てはまった
jmcvetta/neoism
 を採用しました。
ということで、さくっとインストールを行います。
$go get github.com/jmcvetta/neoism

◯データの登録

Go言語からデータの登録を行います。

上記のコードで、一個のルートノードに対して、5つの子ノードを、"ConnectTo"というリレーションで接続したグラフが作成されます。
fmt.Printlnで表示しているルートノードのIDはメモっておきましょう。この後使用します。


◯データの検索

RDBのSQLの様に、Neo4JではCypherというクエリでデータの作成、検索を行えます。
先ほどの
http://localhost:7474/webadmin/
にアクセスして、Power tool Console タブを選択します。
Neo4j 002
そして、コンソールに対して、以下のクエリを入力します。
START a = node([先ほどの実行結果のID])
MATCH a-[r]->b
RETURN a,r,b;
Neo4j 003

START句は、検索開始のノードを指定します。
今回は自分の環境での実行結果が、ルートノードID=20だったため、node(20)を開始ノードとして設定しています。
そして、開始ノード に対して a という別名を定義しています。

MATCH句は、検索対象のパターンを記載します。
MATCH a-[r]->b
は、aに接続されている、リレーション r と、子ノード bという意味合いです。
それぞれ、a, r, b という別名が定義され、以降は別名で参照することができます。
なおここで、リレーションの種類を指定したい場合は、[r]の代わりに
MATCH a-[:ConnectTo]->b
と記載することで、aとbをつなぐリレーションをConnectToのみに限定することができます。

RETURN句はそのまま、返却する値を定義します。
ここで指定した別名がそのまま実行結果として返ってきます。
RDBでいうところのSELECT句ですね。

と、比較的わかりやすい構文で構成されています。
構文についは、Consoleの左サイドバーにチートシートがあるので、いろいろ試してみると新しい発見があるかもしれません(僕もまだ全部は見てないです)

◯感想

触ってみた感想としては、RDBとは異なったパラダイムですが、Cypherが比較的理解しやすいのと、データ構造が人間に理解しやすい形のため、
さわりの部分で投げ出すことはなさそうです。
とは言え、『やっと動かせた!』ってレベルなので、そもそも僕の目的にあっているのか吟味しながら触っていこうと思います。

2013年9月17日火曜日

話題の Genymotionをインストールしてみた

話題の高速androidエミュレータの GenymotionをMacBook Airにインストールしてみました。

 

◯前準備

まずは公式ページにサインアップし、アカウントの作成とdmgファイルをダウンロードしておきます。

Genymotion

 

Genymotionは仮想エンジンとして、VirtualBoxを使用しているので、こちらも事前にインストールしておきます。

 

◯インストール

dmgファイルをマウントし、以下のファイルをApplications内に放り込みます

  • Genymotion.app
  • Genymotion Shell.app

 

Genymotion 008

 

とりあえず、Genymotionを起動します。

『仮想デバイスが無いけど、作るかい?』と聞かれるので、Yesと答えておきましょう。

Genymotion 001

 

 

すると、前準備で作成したアカウントを尋ねられるので、それぞれ入力した後に『Connect』をクリックします。

Genymotion 002

 

 

次に作成する仮想イメージのタイプを選択します。

今回はとりあえず、我が愛機『Galaxy Nexus』の4.2.2 with Google Appsを選択しました。

Genymotion 003

 

 

確認画面が出てくるので、そのまま『Next』をクリックします。

Genymotion 004

 

仮想イメージのダウンロードが始まります。

Genymotion 005

 

自分の環境では約200MBのダウンロードで、5〜10分くらいで完了しました。

Genymotion 006

 

作成する仮想環境に名前をつけます。

今回は特に深く考えずにそのままにしておきました。

Genymotion 007

 

サクッと作成完了です。

ここまでで20分もかかってません。

Genymotion 009

 

◯イメージの起動

インストール完了画面で『Finish』をクリックすると、下記のようなメニュー画面が表示されます。

先ほど作成したイメージだけが表示されています。

Genymotion 010

 

そのまま、『Play』をクリックすると、『Android SDKのパスが設定されてねーよ!このスットコドッコイ』と言われてしまったので、

『Yes』をクリックし、設定画面に移ります。

Genymotion 011

 

自分の環境では、android-sdkはhomebrewで管理しているため、下記のように設定を行い、『OK』をクリックします。

/usr/local/Cellar/android-sdk/22.0.5/

Genymotion 012

 

今度は『VirtualBoxのエンジンがロードできねーぞ!この唐変木が!』と言われてしまいました。

もともと入っていたVirtualBoxが古かったようなので、最新の4.2.18をダウンロードし、インストールを行います。

VirtualBoxのインストールは、主題から外れるので割愛します。

 

さて、VirtualBoxの最新化ができたところで、再度メニューから『Play』をクリックします。

瞬殺でandroidが立ち上がりました。

言語を日本語に設定し、『開始』をクリックします。

Genymotion 014

 

なんか表示がおかしくなっている部分がありますが、まぁ見なかったことにしておきましょう。

あとはいつもどおり、Googleのアカウントを設定して、

Genymotion 015

 

バックアップの設定をして

Genymotion 016

 

位置情報の設定をして

Genymotion 017

 

セットアップ完了です!

Genymotion 018

 

あとは煮るなり焼くなり好きにすればいいじゃない。

Genymotion 019

 

 

◯感想

ちょっといじってみた感想としては、前評判通り動作が実機よりさくさく(ぬるぬる?)と動きます。

Google純正のエミュレータよりも、起動もはやくストレスが少なく感じますね。

ただ、この環境で動作テストを行ってしまうと、実機での検証時に『あれ?』ってなってしまいそうです。

 

 

2013年9月10日火曜日

MSDeployを使用して、JenkinsからWebサーバにデプロイする

定型処理は自動化しましょう!ということで、JenkinsからMSDeployを使ってASP.netプログラムを、Windows 2012 Server上のIISにデプロイできるようにしてみました。

 

Windows Server 2012 (デプロイ先)の設定

◯前提条件

  • サーバーマネージャーからIISがインストールされている状態

 

◯Web Platform Installer から、Web配置ツールをインストール

製品 → すべて → Web配置ツールを探し出して、追加をクリック

無題クリップ 062813 030821 PM

 

インストールをクリックすると、『これでインストールするけど、いいかい?』って聞かれるので、同意しましょう。

無題クリップ 062813 030930 PM

 

 

インストールが終了するまで待ちます。

無題クリップ 062813 030957 PM

 

 

他のもいろいろインストールされましたが、Web配置ツールが入ったので良しとしましょう。

無題クリップ 062813 031118 PM

 

 

◯IISで展開の設定

IIS上のDefault Web Site を右クリックし、展開→Web配置による発行の有効化 をクリックします。

無題クリップ 062813 031514 PM

 

 

Web配置による発行の有効化の画面が出てきます。

ほとんどは初期値で良いのですが、『発行の設定ファイルの保存先を指定します』の項目だけは初期値ではうまく行かなかったので、C:¥inetpub¥wwwroot配下に設定します。

無題クリップ 062813 043330 PM

あとは、設定をクリックして、設定を反映しておきます。

 

 

 

Jenkins側の設定(Windows 7 Pro)

◯前提条件

  • .net Framework 4.0がインストールされていること
  • MSBuild(Jenkins Plugin)がインストールされていること

 

◯MSBuildプラグインの設定

まずは、.net Frameworkのバージョンを明示的に指定します。

Jenkinsのトップページから、『Jenkinsの管理』→『システムの設定』から、MSBuildの項目を下記のように設定します。

Name:任意の名称(バージョンがわかりやすければ、どんな名称でも問題ないと思います)

Path to MSBuild : 指定バージョンのMSBuild.exeへの絶対パス

Default Parameters : 今回は使用しません。

Blog 20130910 01

 

 

◯ジョブを作成する

フリースタイル・プロジェクトのビルド を選択して、新規ジョブを作成します。

 

◯MSBuildの設定

『ビルド手順の追加』から、『Buil a Visual Studio project or solution using MSBuild』を選択し、手順を追加します。

Blog 20130910 03

 

MSBuild Version : 『MSBuildプラグインの設定』で作成した、バージョン情報

MSBuild Build File : ジョブディレクトリ配下のworkspaceディレクトリ配下からの、プロジェクトorソリューションファイルへの相対パス

Command Line Arguments : ビルドはリリースで、ターゲットはPackageに指定

Blog 20130910 02

 

◯MSDeployコマンドを設定する

『ビルド手順の追加』から、『Windowsバッチコマンドの実行』を選択し、手順を追加します。 

Blog 20130910 04 

設定するバッチコマンドの内容は以下のようになります。(実際は一行で記述します。)

"C:\Program Files\IIS\Microsoft Web Deploy V3\msdeploy.exe" 

-verb:sync 

-source:package='[ビルドパッケージのパス]' 

-dest:auto,wmsvc=[サーバアドレス],includeAcls='False',username=[サーバユーザ],password=[ユーザパスワード] 

-setParam:"IIS Web Application Name"="[デプロイ場所]" 

-allowUntrusted=true

Blog 20130910 05

 

 

以上で、デプロイサーバ側、Jenkinsジョブの設定が完了です。

これでVCSのポーリングを組み合わせて、コミット/プッシュに応じてビルド〜デプロイまでを自動化することができます。

本番環境へのデプロイなんかは、間にテストをかませたり、ワークフロー的な動きが出てきたりしますが、開発環境レベルではこのレベルで問題かなぁと思います。

 

 

2013年5月31日金曜日

FxCopをWindows 2012 server にインストールする

 

いままでソースコード解析に使用していたFxCopが、なぜかそのままだとWindows 2012 serverにインストールできなかったので、試行錯誤の結果を備忘録としてまとめておきます。

 

FxCopとは

.NET のソースコードをチェックする、MS社謹製のツールです。

基本的にはMS社の『クラスライブラリ開発のデザインガイドライン』に則り解析をするようです。

FxCopのインストーラーは『Microsoft Windows SDK for Windows 7 and .NET Framework 4』に含まれています。

Windows 2008 standard 64bitはこちらでインストールが可能でした。

 

 

調べる

『FxCop Windows8』で調べると出るわ出るわ

どちらも解決方法が同じだったので、これらを参考に対処していきます。

 

 

ISOをダウンロード

下記サイトから、CPUアーキテクチャに合わせてISOをダウンロードします。

Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO)

 

 

インストール

ダウンロードしたISOを右クリックでマウントします。

CDドライブとしてマウントされたはずです。

 

先ほど参考にしたサイトの通り、ファイルを抽出します。

  1. CDのルート → Setup → WinSDKNetFxTools → cab1.cab をエクスプローラで開く
  2. cab1.cab内にある、『WinSDK_FxCopSetup.exe』から始まるファイル名のファイルを、適当なディレクトリ(デスクトップとか)にコピペする
  3. 拡張子をexeに変更し、実行する
  4. ウィザードに従って、インストールを進める

これで、FxCopがインストール出来ました。

スクリーンショット 053113 120349 PM

 

マイクロソフト様には、早めにWindows 2012対応のFxCopを出してほしいものです。

 

 

 

2013年5月28日火曜日

Jenkins Sounds Plugin を仕込んでみた

そこそこの人数でプロジェクトを回す際に、必要となってくるのがソースのバージョン管理と状態管理。

ということで、一年ほど前から継続的インテグレーションを実現させるために、Jenkinsを使用しています。

少人数(1〜3人くらい)で回している間は、なんかあったら『Jenkinsの結果見やがれ』で済んだんですが、今回人数がそこそこ入るプロジェクトにアサインされることになり、少々工夫をする必要が出てしまいました。

具体的には

  • コミットタイミングが開発者によってまちまちなため、ジョブのタイミングがわからない
  • ジョブの結果(success / fail / abort) が、瞬時にわからない

の二点です。

 

結果的に、

  1. 定期的にJenkinsの管理画面を確認し
  2. どのコミットでエラーが発生したかを確認し
  3. コミットの担当者を突き止め
  4. 修正させる

という、至極面倒くさいフローをたどることになります。

Redmineも併用しているため、Jenkinsからチケットを投げて、チケット管理させるという方法も考えたのですが、やはり能動的な通知が必要なのでは?と思い始めました。

 

前置きが長くなりましたが、ということで今回採用したのが、『Jenkins Sounds Plugin』です。

 

なにそれ?

Jenkinsのアクションごとに、指定の音声ファイルを再生するだけのプラグインです。

ジョブの結果ごとに、再生する効果音を指定出来ます。

 

インストールする

Jenkinsはすでにインストール済みである前提で進めます。

まずはJenkinsのダッシュボードから『Jenkinsの管理』をクリックし、『プラグインの管理』をクリックします。

スクリーンショット 2013 05 28 9 55 2

 

『利用可能』タブから、『Jenkins Sounds Plugin』にチェックを入れて、インストールボタンを押すだけ。はい簡単。

スクリーンショット 2013 05 28 9 58

 

 

設定をみてみる

インストールが正常に完了すると、Jenkinsのダッシュボードに以下のような『Sounds』という項目ができているはずです。

スクリーンショット 2013 05 28 10 25

とりあえず、これをクリックしてみましょう。

テスト用の画面が表示されます。

ここで重要なのは、『Sounds Output』に記載されている『(see http://127.0.0.1:8080/jenkins/sounds/jsonpdemo)』というリンクだけです。

あとは読み飛ばしましょう。

 

ジョブに通知音を仕込む

それではジョブに通知音を仕込んでみましょう。

今回はサンプルなので、通知音を鳴らすだけのジョブを新規に作成します。

スクリーンショット 2013 05 28 10 34

 

『ビルド後の処理』から、『Jenkins Sounds』を選択します。

スクリーンショット 2013 05 28 10 35

 

Jenkins Soundsの項目を追加すると、通知音の設定を追加できます。

何も考えず『Add sound』をクリック

スクリーンショット 2013 05 28 10 37

 

すると、ビルド結果の指定と、通知音を設定できるようになります。

スクリーンショット 2013 05 28 10 38

 

 

通知音を鳴らすタイミングは『On build result』で設定します。

設定できるタイミングは以下の5つ

  • Not build
  • Aborted
  • Failure
  • Unstable
  • Success

成功とそれ以外を知りたいので、とりあえずSuccessとFailureあたりを追加しておきます。

 

通知音の種類は『Play sound』で適当に選択します。

なんかたくさんあるので、適当なものを選択しておきます。

 

もう一つ準備

さて、ここまで来てふと『うちJenkinsは仮想サーバでスピーカーもついてねぇよ』とか、『スピーカーはついてるけど、Jenkinsさんがサーバー室に閉じ込められてるんだけど・・・』と思った人は、ここを読んでください。

開発する場所と、同じ場所にスピーカー設置済みのJenkinsを搭載したサーバがある人は読み飛ばしてください。

Jenkins Sound PluginはHTML5のWebAudio機能で、アクセスしているブラウザ上で通知音を再生することが可能です。

ダッシュボード → Jenkinsの管理 → システムの設定 からJenkins Soundsを探しだして、『Play through HTML5 Audio enabled browser』にチェックを入れてください。

スクリーンショット 2013 05 28 15 18

Jenkins Sound Pluginのバージョン0.4では標準でチェックが付いているようです。

 

先ほどのJenkins Soundsの管理画面で表示されていたURL http://[Jenkinsサーバアドレス]/sounds/jsonpdemo を別のタブにでも表示しておきましょう。

 

 

実際に音を鳴らしてみる

 

ここまで来たらあとは通知音を聞いてみましょう。

先ほど作成したジョブを流してみます。

スクリーンショット 2013 05 28 10 40

 

ビルド完了からしばらくおいて、通知音が流れたかと思います。

通知音が出なかった場合は、設定やスピーカーがミュートになっていないか確認してみましょう。

 

これでひとまず、ビルド結果に応じて、Jenkinsから能動的に通知が出来る状態になりました。

 

通知音を変更する

さて、ここまで来ると通知音を自分好みに変えたくなるのが人情というもの。

まずは、通知音の選定です。

ここで重要なのは

  1. 成功/失敗がチーム内でわかりやすい
  2. 成功時はスパっと短めに
  3. 失敗時は、失敗とわかりながらも重たくない音

この3つです。

1つめは言うまでもなく、コミットを行ったプログラマが『あ、今の失敗、俺のコミットかも!』と気がつけるように。

2つめは成功音を長いファンファーレなんかにすると、ビルドの度にファンファーレが鳴り響き、思わずスピーカーをミュートにしてやりたくなるので、短めに。

3つめですが、これが一番重要かと思います。

一時期失敗の通知音を某有名RPGの『冒険の書1が消えました』的な音楽にしてあったんですが、失敗する度に過去のトラウマを刺激され、ビルドする意欲が削られていったのを覚えています。

今は、

  • 成功→某有名RPGのレベルアップ音 or 某ヒゲの配管工がコインを取る音 
  • 失敗→某ヒゲの配管工がやられたときの音

と、比較的軽い音にするようにしています。

 

さて、実際の設定方法ですが

  1. 再生したいwavファイルを用意
  2. そのwavファイルをディレクトリを掘らずに、並列でzip圧縮
  3. jenkinsをホスティングしているサーバにzipファイルをアップロード
  4. Jenkinsダッシュボード → Jenkinsの管理 → システムの設定 → Jenkins Sounds内のSound archive location に先ほどアップロードしたzipファイルのパスを設定する

となっています。

上記手順が済んだら、ジョブを作成した際に出てきた『Play sound』に、アップロードしたファイルが表示されると思います。

あとはお好きなタイミングで、お好きな通知音を設定するだけ。

素敵なJenkinsライフをお過ごしください。

 

2013年5月9日木曜日

Vagrantをインストールしてみた

なんだか流行りっぽいのと、GW中にMacbookAirの大掃除をしてディスク容量に余裕ができたので、Vagrantを試してみた。

 

VirtualBoxとVagrantをインストールする

VMWare Fusion版もあるらしいのだけれど、そんなブルジョワなアプリを持っていないので、VirtualBoxで試すことにします。

とりあえず、Mac版のVirtualBoxをダウンロードしてきます。

 

Downloads – Oracle VM VirtualBox

 

インストールについては本筋ではないので割愛

 

続いてVagrantをダウンロードして、インストールを行います。

バージョンはよく分からないのと、新しいものは良い物なので、1.2.2を選択


Vagrant - Downloads

 

インストールは、インストーラーに従っていれば躓くところもないので、やっぱり割愛

 

 

インストールを確認

ちゃんとインストールできたかを確認するために、コマンドを発行して確認します。

$ vagrant -v
Vagrant version 1.2.2

バージョンが表示されればOK

 

 

Boxのダウンロード

vagrantではイメージファイルをBoxと呼ぶらしいです。

構築済みのBoxがダウンロード可能なようなので、まずはここからチョイスしてダウンロードを行います。

 

A list of base boxes for Vagrant - Vagrantbox.es


今回はベーシックに『CentOS 6.4 x86_64 Minimal (VirtualBox Guest Additions 4.2.8, Chef 11.4.0, Puppet 3.1.0)』を選びます。

URLの横のCopyをクリックし、URLをコピーしておきます。


ターミナルを開いて以下のようにコマンドを発行します。


$ vagrant box add centos64 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130309.box
Downloading or copying the box...

Extracting box...te: 309k/s, Estimated time remaining: 0:00:01))
Successfully added box 'centos64' with provider 'virtualbox'!

 

vagrant box add に続いて、Box名、URLを指定します。

Box名は任意に命名できるようなので、自分が管理しやすい名前をつけます。

ダウンロードは時間がかかるようなので、じっくりと待ちます。

 

 

Vagrantfileを作成する

Vagrantfileはvagrantの設定ファイルのようです。

Vagrantfileを作成する前に、格納用のディレクトリを作成します。

自分はvagrantというディレクトリを作成後、Box名でディレクトリを作成する形式にします。このへんは各自の好みでいいと思います。

 

$ mkdir vagrant/centos64/

$ cd vagrant/centos64/

 

ディレクトリ作成後、vagrant init でVagrantfileを作成します。

$ vagrant init
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

$ ls
Vagrantfile

 

Vagrantfileの中身をみてみると、ごにょごにょといろいろ記載されていますが、コメントを除外すると

Vagrant.configure("2") do |config|

  config.vm.box = "base"

end

ここまでシンプルになります。

config.vm.box にvagrant box add で指定したBox名を指定するように編集します。

Vagrant.configure("2") do |config|

  config.vm.box = "centos64"

end

色々と設定できるようですが、最低限上記の設定があれば、起動はできるようです。

 

 

起動する

実際に起動してみましょう。

起動するためには、先ほどVagrantfileを作成したディレクトリで、vagrant up コマンドを発行します。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'centos64'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for VM to boot. This can take a few minutes.
[default] VM booted and ready for use!
[default] Configuring and enabling network interfaces...
[default] Mounting shared folders...
[default] -- /vagrant

ターミナルが戻ってきたら、起動完了です。

さて、ターミナルが戻ってきただけで、ViatualBoxの画面が出てくるわけでもなし・・・。

 

 

vagrant ssh でssh接続する

Boxにssh接続を行う vagrant ssh なるコマンドがあるようなので、それを使用します。

$ vagrant ssh
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]

これでBoxに接続出来ました。

抜けるときは通常のsshと同様に exit で抜けます。

[vagrant@localhost /]$ exit
logout
Connection to 127.0.0.1 closed.

これであとは煮るなり焼くなりお好きにBoxを調理してあげてください。

 

 

Boxをシャットダウンする

ここまで来たら、あとはシャットダウンさせるだけです。

シャットダウンは vagrant halt で行います。

$ vagrant halt
[default] Attempting graceful shutdown of VM...

 

あとはコンフィグファイルをいじり倒して、自分が使いやすい仮想環境にするだけです。

 

しかし、Macbook Air のメモリが4GBぽっちの環境じゃあんまり重たい処理はさせられそうにないです・・・。

2013年4月25日木曜日

Raspberry Pi の Arch Linux で使用領域を拡張する

 

 

Raspberry Piにsshで接続するところまでできたわけですが、ディスクが1.7GBしか認識されていなかったため、拡張することにします。

OSにRaspbianを選択していると、Raspi-configで簡単に設定できるようですが、ArchLinuxではちょっと手間がかかります。

今回は、8GBのSDカードを使用しているので、限界まで拡張したいと思います。

まずは、拡張前の df -hの結果です。

[root@alarmpi ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 1.7G 665M 924M 42% /
devtmpfs 83M 0 83M 0% /dev
tmpfs 231M 0 231M 0% /dev/shm
tmpfs 231M 244K 231M 1% /run
tmpfs 231M 0 231M 0% /sys/fs/cgroup
tmpfs 231M 0 231M 0% /tmp
/dev/mmcblk0p1 90M 25M 66M 28% /boot

 
それでは、拡張手順です。
まず、

fdisk mmcbblk0

を実行し、Commandにpをタイプし、パーティションリストを表示します。

[root@alarmpi dev]# fdisk mmcblk0
Welcome to fdisk (util-linux 2.22.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): p
Disk mmcblk0: 7948 MB, 7948206080 bytes, 15523840 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0004f23a
Device Boot Start End Blocks Id System
mmcblk0p1 * 2048 186367 92160 c W95 FAT32 (LBA)
mmcblk0p2 186368 3667967 1740800 83 Linux

二番目のパーティションを削除します。

Command (m for help): d
Partition number (1-4): 2
Partition 2 is deleted

新たにパーティションを作成します。

Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (186368-15523839, default 186368):
Using default value 186368
Last sector, +sectors or +size{K,M,G} (186368-15523839, default 15523839):
Using default value 15523839
Partition 2 of type Linux and of size 7.3 GiB is set

編集結果を書き込みます。

Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.


ここで一回再起動をかけます。

reboot


起動したら、再度sshで接続し、resize2fsで拡張します。

[root@alarmpi ~]# resize2fs /dev/mmcblk0p2
resize2fs 1.42.7 (21-Jan-2013)
Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mmcblk0p2 is now 1917184 blocks long.


また再起動します。

reboot


ここまで問題なく設定できていれば、/が拡張されているはずです。
そして拡張後のdf -hの結果です。

[root@alarmpi ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/root 7.3G 667M 6.3G 10% /
devtmpfs 83M 0 83M 0% /dev
tmpfs 231M 0 231M 0% /dev/shm
tmpfs 231M 236K 231M 1% /run
tmpfs 231M 0 231M 0% /sys/fs/cgroup
tmpfs 231M 0 231M 0% /tmp
/dev/mmcblk0p1 90M 25M 66M 28% /boot


ばっちり拡張されています。

Raspberry PiにArchLinuxをインストールしてみた

誕生日プレゼントとして、友人から『なんに使うの?』と言われながらもRaspberry Piをいただきました。
IMG 20130405 212459
Raspberry Piって何?って人は、下記リンクを参照
http://ja.wikipedia.org/wiki/Raspberry_Pi

さすがに、むき出しのまま使うのも気が引けるので、みんな大好きAmazonでそれっぽいケースを探して装着してみました。
IMG 20130414 024205
こういう小物はスケルトンが良い感じです。

○Raspberry Piを動かすために必要なもの

  1. 700mA確保できるmicroUSB
  2. SDカード
  3. 有線LAN

本来は更に、

  • USBキーボード
  • HDMIケーブル&ディスプレイ

なんかが必要になるんですが、余剰がなかったのと、別に無くても困らなかったので、接続してません。

○Arch LinuxのイメージをSDカードに焼く

Raspberry PiにはOSが入っていません。そのため、OSをインストールしたSDカードを用意し、それをRaspberryPiに設置する必要があります。
インストール可能なOSとして

  • DebianをカスタムしたRaspbian
  • soft float版Debian
  • Arch Linux

などがあります。
他にも、AndroidやFirefoxOSのインストールを行なっている猛者もいますが、今回はArchLinuxを選択してます。
Arch Linuxを選択した理由としては、初期状態でsshが設定されており、LANケーブルさえ挿さっていれば、ディスプレイもキーボードも必要ないという理由からです。

ということで、下記サイトから、ArchLinuxイメージをダウンロードしてきます。
http://www.raspberrypi.org/downloads

zipファイルで、容量は200MBそこそこなので、そこまで時間はかからないと思います。
ここからは、MacOSを前提として、手順を記載します。

・MacにSDカードを挿入
自分の場合は、MacBookAirの11インチのため、USB接続のカードリーダ経由でSDカードを接続します。
・dfコマンドでSDカードのディレクトリを確認する
スクリーンショット 2013 04 14 3 24
面倒なので、詳細な探し方は流します。大体容量でわかると思いますが・・・。

・先ほどダウンロードしてきたArch Linuxのイメージファイルを解凍します。
 ダウンロードしてそのままであれば、ダウンロードディレクトリに入っていると思うので、

unzip ~/Downloads/archlinux-hf-2013-02-11.zip

とします。
 うまく解凍出来れば、Downloadsディレクトリに、archlinux-hf-2013-02-11.img ファイルができているはずです。

・イメージの焼き込み
 ddコマンドを使用して、SDカードへの書き込みを行います。
 コマンド例は、下記の状態を前提としています。

  • ~/Downloads/archlinux-hf-2013-02-11.img が存在する。
  • SDディスクが /dev/disk1s1 として認識されている。
sudo dd if=~/Downloads/archlinux-hf-2013-02-11.img of=/dev/disk1s1 bs=1m

自分の環境では、約2分ほどで書きあがりました。
 あとは、このSDカードを、RaspberryPiに挿せばOKです。

○sshでのログインから、パッケージの最新化

先ほどArchLinuxイメージを書き込んだSDカード、LANケーブル、電源ケーブルをRaspberryPiに接続します。
電源ケーブル差し込むと、勝手に起動が始まります。電源ボタンなるものは存在しません。

なお、電源ケーブルを挿したあと、USBコネクタ脇にあるLEDを確認しましょう。
IMG 20130414 033950
OSが正常に起動されている場合は、5つすべてのLEDが点灯している状態となります。
今回は大丈夫なようなので、このまま進めます。

次に、DHCPサーバのIP払い出しログを確認します。
ディスプレイもキーボードも接続していないため、RaspberryPiのArchLinuxに設定されているIPを確認するためです。
IPが確認できたら、いよいよsshでログインします。

ssh root@[IPアドレス]

パスワードを聞かれることがあるので、『root』と入れておきます。

ログインが出来たら、環境をアップデートしておきましょう

$ pacman -Syu


自分の環境では、パッケージ数も多く30分くらいかかったので、そのまま放置しておきます。

○固定IPを設定する

DHCPのままでは、リブートするたびにIPが変わってしまい、sshで使う上で不便極まりないため、IPを固定にします。
まずは不要になるDHCPサービスを止める

 systemctl disable dhcpcd@eth0.service


そして必要なパッケージをインストール

pacman -S netcfg


パッケージに含まれるサンプルのプロファイルをコピー

cp /etc/network.d/examples/ethernet-static /etc/network.d/raspberrypi


プロファイルの書き換え

vi /etc/network.d/raspberrypi

で、自分の環境では下記の項目を書き換えました。

  • ADDR='[IPアドレス]'
  • GATEWAY='[ルータのIPアドレス]'
  • DNS=('8.8.8.8')

最後のDNSはGooglePublicDNSを利用しています。

起動時にIPの設定を行うように登録

systemctl enable netcfg@raspberrypi


そして最後に再起動

reboot


本体のLEDの点滅が収まったら、設定したIPにsshで接続しIPが設定されていることを確認します。


とりあえず、インストールからSSH接続までできたので、そろそろ使用用途を考え始めることにします。
いろいろなサイトで、いろんな使い方を紹介されているので、迷ってしまいますね・・・。

CentOSからWindows共有ディレクトリをマウントする

CentOSから、Windows共有のディレクトリにアクセスしたくなったので、調べてみました。

Samba-Clientをインストール

Linux + Windows共有 ということで、 samba-client をインストール
yum install samba-client

マウントポイントを作っておく

root でログインしておいて
mkdir /mnt/win_share
とマウントポイントを作っておきます。

マウントコマンド

前提として、Windows共有は
サーバIP :192.168.0.1
共有名  :share
ユーザ名 :user
パスワード:user
で設定されているものとします。
早速マウントします
mount -t cifs -o username=user,password=user //192.168.0.1/share /mnt/win_share
マウントができたら
ls /mnt/win_share/
で、確認してみましょう。
共有されているファイルやディレクトリが参照出来ればマウント成功です。

Windows 2008 R2のHyper-V上に、CentOS6.3をインストールしてみた


社内ネットワーク内に、Linuxの検証環境が必要になったので、Windows 2008 Server R2のHyper-V上にCentOS 6.3をインストールしてみました。

ネットワーク周りが手間だったので、そのあたりを中心に備忘録として残しておこうと思います。


ISOの取得

まずは、インストールを行うためのCentOSのISOイメージを落としてきます。
今回はGUIも不要なため、minimal-EFIで行います。
上記のリンクから適当なミラーサーバを選んで、 CentOS-6.3-x86_64-minimal-EFI.iso をダウンロードしてきます。

仮想マシンイメージの作成

--省略--
というのも不親切なので、注意点だけ
  • メモリの設定は、使用する条件によって差があると思いますが、今回は大した用途に使わないので、512MBくらい振っておきます。
  • インストール時はネットワークが無いほうが後々面倒くさくなくていいので、『ネットワークの構成』では『接続しない』を選択しておきます。
  • 『インストールオプション』で『ブートCD/DVD-ROMからオペレーティング システムをインストールする』にチェックを入れて、先ほどダウンロードしたイメージファイルを設定しておきます。

CentOSのインストール

--省略--
他の親切なサイトを参照して下さい 今回の記事の趣旨はここではないので・・・。

レガシーネットワークの追加

CentOSのインストールが完了したら、仮想マシンをシャットダウンしておきます。
Hyper-Vマネージャー上から『停止』でもしておけばOKです。
停止状態になったら、『設定』を開きます。
設定画面の『ハードウェアの追加』→『レガシーネットワークアダプタ』を選択し、『追加』をクリック 設定画面の『ハードウェアの追加』→『レガシーネットワークアダプタ』を選択し、『追加』をクリック
レガシーネットワークにネットワークアダプタを設定して、OKをクリック MACアドレスは動的でも問題ないとおもいます。 レガシーネットワークにネットワークアダプタを設定
とりあえずここまで終わったら、設定画面を閉じて、CentOSを立ち上げます。

CentOSのネットワーク設定

とりあえずrootでログインしておきます。 ネットワーク用の設定ファイルを作成していきます。
/etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=[ホスト名をお好みで
GATEWAY=[デフォルトゲートウェイアドレス]
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet
IPADDR=[設定するIPアドレス]
NETMASKS=[サブネットマスク]
GATEWAY=[デフォルトゲートウェイアドレス]
DEFROUTE=yes
IPV6INIT=no
で、ここまで済んだら、
service network restart
を実行して、ネットワークを活性化させます。
確認のために、デフォルトゲートウェイにpingでも投げておきましょう。
うまくつながらない場合は、設定が間違っているっぽいので、上記のファイルを見直します。
さてこのままですと、DNSが引っ張ってこれませんので、使用するDNSサーバの設定を行います。
 
/etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
今回はIPアドレスも覚えやすいGoogle Public DNSを使用していますが、ここは環境に応じて設定して下さい。
で、再度
service network restart
を実行します。
DNSが効いているかの確認のために、
yum update
でも投げてみてください。
あとはお好きに設定して遊んでみるといいと思います。

Seleniumをソースからビルドする


Seleniumを使用して、Webアプリを自動操作するC#コードを書くお仕事をしておりますが、
公式からダウンロードできるIEDriverServerがちょくちょく落ちてしまい、イライラしていたところ、

『ダウンロードバイナリがダメなら、ソースからビルドすればいいじゃない』

と思いたち、やってみました。


○Seleniumのソースをゲットする

まずは、Seleniumのソース一式を

http://selenium.googlecode.com/svn/trunk

からSVN使ってダウンロードしてきます。


○JDKをゲットする

不覚にも作業用のPCにJDKが入っていなかったため、ダウンロードしてきます。
自分の場合は、何も考えずに JDK 7u9のx64をダウンロード&インストール&PATH設定。
とりあえずは、javaコマンドとjarコマンドが使えればOKのようです。


○README.mdを流し読みする。

英語への苦手意識を取っ払って読んでみましょう。

とりあえず、

  1. go.bat がビルドをおこなうスクリプト
  2. go -T で、タスクの一覧が出てくる
ってことだけわかれば、あとは何とかなります。


○ビルドする

タスクの一覧を眺めてみて、

go //dotnet:dotnet

とコマンドを発行すると、.net framework 4.0用のDLLが作成されるようです。
早速実行します。

D:\src\selenium>go dotnet
(in D:/src/selenium)
Compiling: //dotnet:dotnet as build\dotnet\unmerged\net40\WebDriver.dll
Merging: //dotnet:dotnet as build\dotnet\net40\WebDriver.dll
Compiling: //dotnet:support as build\dotnet\net40\WebDriver.Support.dll
Compiling: //dotnet:core as build\dotnet\net40\ThoughtWorks.Selenium.Core.dll
Compiling: //dotnet:webdriverbackedselenium as build\dotnet\net40\Selenium.WebDriverBackedSelenium.dll

D:\src\selenium>

とりあえず、DLLの方はできたようです。

ちなみに、.net framework 3.5用を作成したい場合は、

go //dotnet:dotnet35

と発行すれば良いっぽいです。(やってませんが・・・。)



合わせてIEDriverServer.exeを作成します。

作成には、下記のコマンドでいけるっぽいです。

go build/cpp/x64/Release/IEDriverServer.exe

今回は64bitで作成しますが、32bitが欲しい場合は、

go build/cpp/Win32/Release/IEDriverServer.exe

で生成されます。

早速実行!

D:\src\selenium>go build/cpp/x64/Release/IEDriverServer.exe
in D:/src/selenium)
Falling back to cpp/prebuilt/x64/Release/IEDriverServer.exe

D:\src\selenium>

あとは、生成したファイルをプロジェクトに組み込んで実行してみましょう。

そのへんのレポートはまた追々。

Macbook Air late 2012を買ってやったこと[アプリ編]



二代目MacbookAirの基本的な設定は済んだので、アプリの復旧です。

基本的にはAppStoreから再度インストールするだけなので、楽ちん



開発用


Xcode Appカテゴリ: 開発ツール
価格: 無料


Macで開発をするにあたって必要なツール類を一気にインストールできる素敵な開発環境



SourceTree (Git/Hg) Appカテゴリ: 開発ツール
価格: 無料


GitのGUIツール。自分はコマンド叩きたい派ですが、これはべんり



Marked Appカテゴリ: 仕事効率化
価格: ¥350


Github形式のmarkdownにも対応していて、ソースのシンタックスハイライトも素敵



ユーティリティ

DoublePane Appカテゴリ: ユーティリティ
価格: ¥450


Windows7でお馴染みのウィンドウを、右半分/左半分/全画面にショートカットキーから設定できるツール。
ターミナル開きながらエディタで編集したい時とか、ディスプレイスペースを有効活用できて便利。



Skitch Appカテゴリ: 仕事効率化
価格: 無料

スクリーンショットなんかに注釈をいれるのに便利。



ドキュメントの作成/管理


MindNode Pro Appカテゴリ: 仕事効率化
価格: ¥850

マインドマップ作成ツール。
操作感もよく、日本語も問題ないので、さくっとマインドマップ書いて、Dropboxへって使い方ができて便利。



Evernote Appカテゴリ: 仕事効率化
価格: 無料

言わずと知れたドキュメントやメモの管理ソフト。
はてなブックマークが対応してから、頻度が激増。ちなみにGalaxySを買った時からプレミアムアカウントで使用してます。


AppStoreから入れているものはこんなものでしょうか。
あとは、AppStore外で入れたものをリストアップ。


JavaScriptの開発には必須のIDE(らしい)。半額キャンペーンで購入しました。
まだあんまり使いこなしていないので、なんとも言えない・・・。


プラグインでの拡張が便利な万能エディタ。
最近のコーディングはもっぱらこいつ。キーバインドを自分好みに変更できるのがGood


iTerm2
MacOS標準のターミナルがあまりにダサイので、即効でインストールするものの一つ。
iTerm2とRictyはもう手放せない組み合わせ。


その他、もろもろインストールしていますが、手放せないアプリはこんなかんじでしょうか。
あとはHomebrewで諸々インストールしていますが、Macというよりは*nix系の話なので、別の機会にでも。