2014年8月22日金曜日

docker でハマったところ

今年に入って賑やかになってきたDocker界隈ですが、そろそろこのビッグウェーブに乗るしかなくなってきたため、入門してみました。

その上で、ハマった部分などを整理してみようと思います。

 

DNSの設定

ubuntuのコンテナを作成するため、下記のようなDockerfileを作成。

 

単純にパッケージの最新化を行っているだけなので、失敗するはずが無いと思っていたら、apt-get updateを発行している部分で下記のようなエラーが発生 

Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://archive.ubuntu.com trusty-security InRelease
Err http://archive.ubuntu.com trusty Release.gpg Could not resolve 'archive.ubuntu.com'
Err http://archive.ubuntu.com trusty-updates Release.gpg Could not resolve 'archive.ubuntu.com'
Err http://archive.ubuntu.com trusty-security Release.gpg Could not resolve 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg Could not resolve 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/Release.gpg Could not resolve 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-security/Release.gpg Could not resolve 'archive.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.

 

どうも名前解決できていないようなのですが、ローカルのUbuntuで試してみても大丈夫・・・。 はてなんぞや?と悩んでいたら、全く同じエラーが出ている方がいました。

Docker on Ubuntu 14.04 - Could not resolve 'archive.ubuntu.com'

 

要するに、/etc/default/docker.ioの

#DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4"

のコメントアウトを外して、DNSサーバを明示的に指定しなさいってことでした。

ホストのDNS設定を勝手に使ってくれるものだと思っていたので、長いことハマってました・・・。

 

パッケージ名

Ubuntuの標準リポジトリでは、すでにdockerという別のパッケージが存在している。

docker - System tray for KDE3/GNOME2 docklet applications

ということで、ここでいうところのdockerはdocker.ioというパッケージ名となっております。

なにも調べないままに、

sudo apt-get install -y docker

としてしまい、X関連のパッケージがインストールされてしまいビビるという事案が発生しました。

 

 

こうやって見てみるとDNSサーバの設定で長々とはまっていただけで、いうほどハマりどころはなかったですね・・・。

とりあえず簡単そうなところで、Growthforecast のDockerfileを作ってみました。

golaboratory/docker-growthforecast

 

これから開発で使用するサーバ系をひと通りdocker上に乗っけてみようとしているので、随時増やしていこうかと考えております。

 

2014年1月13日月曜日

Packer 0.5.0以降のテンプレートに対応する

自分はPackerをhomebrew経由でインストールしているわけですが、久しぶりにupdateしてみたら、packer 0.5.1が来ていたので、早速インストールしたらハマりました。

$ packer build --only=virtualbox template.json
Failed to create build 'virtualbox':

No builder returned for name: virtualbox

 

あれ?テンプレートの定義変えてないよな?

と思いつつ、エラーメッセージでぐぐってみたら、同じ現象にあたっている人がいたので、その方の対応を参考にさせてもらいました。

 

Packer ではまる - Memo


packer 0.5.0以降から、『virtualbox』や『vmware』は『virtualbox-iso』や『vmware-iso』の様に、サフィックスとして『-iso』とつける必要があるようです。

とりあえず、template.jsonの該当する部分に『-iso』を付与することで、上記のエラーは解消出来ました。


よくよく公式のドキュメントを見てみると、『packer fix』 というコマンドが増えていることに気が付きました。

どうもtemplate.jsonの定義を0.5.0以降用に変換してくれるようです。


$ packer fix template.json > template.json

 

やっぱり公式のドキュメントはちゃんと読んでおかないとダメですね・・・。

 

とりあえず、githubに公開中のテンプレートは0.5.0以降に対応させてみました。

golaboratory/my-packer-template-files

2014年1月11日土曜日

HTML5 でインラインSVGの要素をいじってみる

お仕事でHTML5のインラインSVGを触る機会があったので、簡単に備忘録として。

今までAdobeのSVG Viewerとか使わないとできなかったことが、HTML上でできるようになっているようです。

しかもHTMLの要素へのアクセスとほぼ同じにアクセスできるというので、簡単なサンプルを組んでみました。

 

◯とりあえずサンプル

はい素敵!

インラインSVGであれば、HTMLと同様に、getElementByIdでエレメントを取得でき、addEventListenerでイベントリスナーの設定も出来てしまう。

iPadやandroidタブレットで表示して、ピンチイン/ピンチアウトしても当然SVGなので、きれいなベクターデータとして表示されます。

ただ、今回のお仕事以外で活用できそうな場面が思いつかないなぁ・・・。

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

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