doridoridoriand’s diary

主に技術的なことを書いていく予定(たぶん)

Ubuntu上に最新のSwiftをソースからコンパイルして使えるようにする

Ubuntu上で行うことを想定。 ひとまず公式サイト https://swift.org/ に何か載っていないか見てみる。

公式サイトで案内されているgithubリポジトリ参照してみると普通にやり方書いてあった。 https://github.com/apple/swift

とりあえず公式が案内している方法に従ってみる。

$ sudo apt-get install git cmake ninja-build clang python uuid-dev libicu-dev icu-devtools libbsd-dev libedit-dev libxml2-dev libsqlite3-dev swig libpython-dev libncurses5-dev pkg-config libblocksruntime-dev libcurl4-openssl-dev autoconf libtool systemtap-sdt-dev tzdata

$ mkdir swift-source
$ cd swift-source
$ git clone git@github.com:apple/swift.git
$ ./swift/utils/update-checkout --clone-with-ssh
$ sudo apt-get install cmake
$ git clone git@github.com:ninja-build/ninja.git && cd ninja
$ git checkout release
$ cat README
$ cd
$ ./swift-source/swift/utils/build-script -r -t

エラーが出た。

CMake Error at CMakeLists.txt:613 (message):
  Python 2.7 or newer is required

Pythonが古いとのこと。しかし、現在インストールしているPythonは3.6.0。おかしい。 もしかして2系じゃないといけないのかと思い、pyenvで2.7.13をインストールしてみる。

どうやらビンゴ。コンパイルが進み始めた。結構掛かりそう。

。。エラーがまた出た。

[6/29] Building HTML documentation
FAILED: cd /home/dorian/swift-source/swift/docs && /home/dorian/.pyenv/shims/sphinx-build -W -D latex_elements.papersize=letter -d /home/dorian/swift-source/build/Ninja-RelWithDebInfoAssert/swift-linux-x86_64/doctrees -b html . /home/dorian/swift-source/build/Ninja-RelWithDebInfoAssert/swift-linux-x86_64/docs/html
pyenv: sphinx-build: command not found

The `sphinx-build' command exists in these Python versions:
  anaconda-2.4.0

[6/29] Compiling /home/dorian/swift-source/build/Ninja-RelWithDebInfoAssert/swift-linux-x86_64/stdlib/private/SwiftPrivateLibcExtras/linux/x86_64/SwiftPrivateLibcExtras.o
ninja: build stopped: subcommand failed.
./swift-source/swift/utils/build-script: fatal error: command terminated with a non-zero exit status 1, aborting

どうやらpython周りが結構面倒くさそう。私の環境がデフォルトと違うっていうのが大きそうだけれども。 エラー文言を読んでみると sphinx-buildanaconda-2.4.0 にしかないとのこと。 対処療法的だけれども、anaconda-2.4.0に切り替えて、再度ビルドを実行。 進み始めた。

Testing Time: 396.22s
  Expected Passes    : 2891
  Expected Failures  : 88
  Unsupported Tests  : 837
-- check-swift-linux-x86_64 finished --
--- Finished tests for swift ---

インストールが終わった模様。 最後にパスを通す必要がある。

export PATH=/home/自分のユーザー名/swift-source/build/Ninja-RelWithDebInfoAssert/swift-linux-x86_64/bin:"${PATH}"

REPLを実行してみる。

$ swift
***  You are running Swift's integrated REPL,  ***
***  intended for compiler and stdlib          ***
***  development and testing purposes only.    ***
***  The full REPL is built as part of LLDB.   ***
***  Type ':help' for assistance.              ***
(swift)
(swift) let greeting = "Hello!"
// greeting : String = "Hello!"
(swift) print(greeting)
Hello!
(swift)

問題なく動いていそう。

インストール時にpythonとの依存関係がちょっと面倒だったけれども、その後は割とすんなりいった印象。 最新を使いたいとかでなけれは実はDockerHubにDockerfileがあったりする。

https://hub.docker.com/_/swift/

いい時代だ。 次回はまたPythonに戻る予定。

pyenvで管理しているPythonからOpenCVを使えるようにする

MacはHomebrew経由でインストールできる模様。以下コマンドを実行してみる。

$ brew install opencv

以下のエラーが出力された。

$ brew install opencv
Error: No available formula with the name "opencv"
It was migrated from homebrew/core to homebrew/science.
You can access it again by running:
  brew tap homebrew/science

メッセージに従って brew tap homebrew/science を実行。

再度 brew install opencv を実行したところ、無事にインストールできた。 ここでpythonからOpenCVを呼び出せるか、試しにREPLを起動してみる。

$ python
Python 3.5.1 (default, Apr 16 2017, 13:35:06)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'cv'
>>> import opencv
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'opencv'
>>> exit()

どうやらモジュールが発見できていない模様。調べてみるとこのインストール方法はどうやら古い気がする。 python3系から呼び出すためには、別のopencvをインストールする必要がありそう。 先ほどインストールしたものを削除する。

$ brew uninstall opencv
Uninstalling /usr/local/Cellar/opencv/2.4.13.2... (278 files, 35.6MB)

インストールオプションを調べる。

$ brew info opencv3
homebrew/science/opencv3: stable 3.2.0 (bottled), HEAD [keg-only]
Open source computer vision library, version 3
http://opencv.org/
Not installed
From: https://github.com/Homebrew/homebrew-science/blob/master/opencv3.rb
==> Dependencies
Build: cmake ✘, pkg-config ✔
Recommended: eigen ✔, jpeg ✔, libpng ✔, libtiff ✔, openexr ✔, numpy ✔
Optional: ffmpeg ✘, gphoto2 ✘, gstreamer ✘, jasper ✘, jpeg-turbo ✘, libdc1394 ✘, openni ✘, openni2 ✘, qt ✘, tbb ✘, vtk ✘
==> Requirements
Optional: cuda ✘, java ✔, python3 ✔
==> Options

次のコマンドを実行。

$ brew install opencv3 --with-python3

(オプション入れたせいか、すごい時間がかかる。。) (make走るのでかなり時間が掛かる。。) (一時間位かかりそう。。)

なんかまたエラーが出た。

Already downloaded: /Users/dorian/Library/Caches/Homebrew/numpy--nose-1.3.7.tar.gz
==> python3 -c import setuptools... --no-user-cfg install --prefix=/usr/local/Cellar/numpy/1.13.1/libexec/nose --single-version-externally-managed --record=installed.txt
==> python3 setup.py build --fcompiler=gnu95 --parallel=8 install --prefix=/usr/local/Cellar/numpy/1.13.1 --single-version-externally-managed --record=installed.txt
==> Caveats
If you use system python (that comes - depending on the OS X version -
with older versions of numpy, scipy and matplotlib), you may need to
ensure that the brewed packages come earlier in Python's sys.path with:
  mkdir -p /Users/dorian/.local/lib/python3.5/site-packages
  echo 'import sys; sys.path.insert(1, "/usr/local/lib/python2.7/site-packages")' >> /Users/dorian/.local/lib/python3.5/site-packages/homebrew.pth

Python modules have been installed and Homebrew's site-packages is not
in your Python sys.path, so you will not be able to import the modules
this formula installed. If you plan to develop with these modules,
please run:
  mkdir -p /Users/dorian/.local/lib/python3.5/site-packages
  echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' >> /Users/dorian/.local/lib/python3.5/site-packages/homebrew.pth
==> Summary
🍺  /usr/local/Cellar/numpy/1.13.1: 1,375 files, 29.1MB, built in 2 minutes 14 seconds
==> Installing homebrew/science/opencv3 --with-python3
==> Downloading https://github.com/opencv/opencv/archive/3.2.0.tar.gz
==> Downloading from https://codeload.github.com/opencv/opencv/tar.gz/3.2.0
######################################################################## 100.0%
Error: opencv3: Does not support building both Python 2 and 3 wrappers

Error: opencv3: Does not support building both Python 2 and 3 wrappers

え。そうなの? 確かにオプション一覧に無かった。。

ひとまず埒が明かないので、もう一回オプション無しでインストールする。

$ brew install opencv3

問題なくインストール完了。

ではこれを pyenv でインストールしたpythonから呼び出せるか試してみる。 python用のバイナリファイルは以下パスに入っているみたい。

/usr/local/Cellar/opencv3/3.2.0/lib/python2.7/site-packages

個人的にはpython3系に一本化したいので、しばらくpython3でうまく出来ないか(python3系用のsoファイルがインストールされないか)格闘していたが、一筋縄では行かないと判明したので、さっと諦めて pyenv で2.7.11にバージョンを変更。

pyenv でインストールしたpythonは以下ディレクトリに格納されている。

~/.pyenv/versions

brew経由でインストールされたOpenCVpython用バイナリをpyenv経由でインストールしたpythonから参照出来るようにするために、シンボリックリンクを貼ってあげれば良い。そのためには以下コマンドを実行する。

ln -s /usr/local/Cellar/opencv3/3.2.0/lib/python2.7/site-package/cv2.so ~/.pyenv/versions/2.7.11/lib/python2.7/site-packages

実際にpythonから呼び出せるか確かめてみる。

/Users/dorian/.pyenv/versions/2.7.11/lib/python2.7/site-packages python
Python 2.7.11 (default, Aug  6 2016, 11:14:26)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'
>>>

問題なく呼び出せた模様。 環境作るのに時間かかってしまった。。

おまけ

シンボリックリンクの張り替えで、opencvとopencv3を切り替えられた。

$ python
Python 2.7.11 (default, Aug  6 2016, 11:14:26)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.2.0'
>>> exit()
$ rm .pyenv/versions/2.7.11/lib/python2.7/site-packages/cv2.so
$ ln -s /usr/local/Cellar/opencv/2.4.13.2/lib/python2.7/site-packages/cv2.so ~/.pyenv/versions/2.7.11/lib/python2.7/site-packages
/Users/dorian python
Python 2.7.11 (default, Aug  6 2016, 11:14:26)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'2.4.13.2'

補足

Twitterでつぶやいたら、anacondaなら一発じゃね?って飛んできたので、試したら本当に楽に入ってしまった。。開発用途ならこれで十分かも。

ブログを移行しました

気がつけば社会人2年目も半ばになっているっていう。 後輪矢のごとしとはまさにこのことですね。

HUGO+レンサバから、はてなブログ+S3(アセット)に移行しました。 理由としては

  • ブログをもっと気軽に更新したかった。
  • 自分のドメイン = 旧ブログにしてしまっていたので、気軽に自分のドメインを実験に使えなかった

などがあります。学生時代には予想もしなかったインフラエンジニアになっている、ほぼ毎日酒を飲んでいるなど、中々めまぐるしく変化している社会人生活ですが、 技術的なことを主軸にこのブログを更新していこうと思います。

インフラエンジニアになっても何故か仕事レベルで書ける言語は増える一方なので、インフラという枠(あるレベル以下は既にその境界線が無いようなものですが)に囚われずに書いていきます。

AWSをVagrantから使ってみる

卒研とか引っ越しとかで忙しくてねえ。。(言い訳)

AWS便利すぎて値段が割高というデメリットが完全に霞んでいる感ありますね。個人的にはもう少しGoogleCloudPlatform使いたいんですけど。 でも結局GCPあんま使ってないっていう

・・・

vagrant-awsというプラグインを利用することによって、AWSをあたかもVagrantVirtualboxなりVMWareなりのVMを立ち上げているかのように使えるということで、試しに使ってみました。 作者のページを見れば当たり前ですが詳しく書かれているのでどうぞ

まあまずプラグインをインストールしないことには始まりませんので、インストールします。(あ。VagrantAWSを普段そこそこ使用している方向けの記事ですので、Vagrantって何ぞやって方はまず普通にVagrantを使ってみてください)

$ vagrant plugin install vagrant-aws

次にvagrantが利用するboxをインポートします。そもそもVagrantはローカルにVMを立てて使うものなので、どうしてもVMのイメージが必要となります。

$ vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box

これでvagrant-awsを利用する下準備が出来ました。

次にAWSに接続するために必要な情報を集めます。今回はAWSに接続するためにアクセスキーIDとシークレットアクセスキーが必要となります。しかし、ルート権限を持った状態でのこの2つの発行は出来ないことになっているのでIAMユーザーを作成し、 そのユーザーのアクセスキーIDとシークレットアクセスキーを用いて接続することにします。

まずAWSのコンソールにログインし、上のメニューバーを[サービス] -> [IAM]の順にクリックしていきます。

するとこのような画面が現れます。

ここでVagrantから操作する専用のIAMユーザーを作成しましょう。 [個々のIAMユーザーの作成] -> [ユーザーの管理] -> [新規ユーザーの作成] とクリックしていきます。ユーザー名は任意で大丈夫です。ここで重要なのは、画面下に設置してある[ユーザーごとにアクセスキーを生成]のチェックボックスにちゃんとチェックが入っているかどうかです。 これにチェックしていないとちゃんとアクセスキーが発行されませんので注意してください。

これで無事作成すると、[これは、これらのユーザーセキュリティ認証情報をダウンロードできる最後の機会です。]などという文言と共にアクセスキーIDとシークレットアクセスキーが表示されると思います。 これをどっかにメモっておきましょう。

これでAWS側の準備は整いました。ではVagrantfileを作成してゆきましょう。 任意のフォルダでvagrant initを実行します。

最初に書かれているサンプルをさくっと削除して、次の内容を書き込みます。

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.box = "dummy"

  config.vm.provider :aws do |aws, override|
    aws.access_key_id = "さっき取得したアクセスキーID"
    aws.secret_access_key = "さっき取得したシークレットアクセスキー"
    aws.keypair_name = "いつも使用しているリージョンの公開鍵の名前"

    aws.tags = {'Name' => 'Vagrant'} # AWSのEC2に名前を付けられる。とりあえずVagrantにした
    aws.ami = "ami-a21529cc" # Ubuntu14.04LTS HVMのイメージ
    aws.instance_type = "t2.micro" #インスタンスのサイズはご自由に
    # セキュリティグループの設定がうまくいかない
    #aws.security_groups = {'groupId' => 'セキュリティグループID'}
    aws.region = "ap-northeast-1"

    override.ssh.username = "ubuntu"
    override.ssh.private_key_path = "公開鍵の絶対パス"
  end
end

以上の状態でvagrant upを実行します。するとこのようにAWS上にVagrantを立てることが出来ました。

AWS上でもインスタンスが稼働していることがわかります

Vagrant全ての機能を使えるわけではありませんが、気軽に実際にサーバーを立てて検証するには良いと思いました。個人的にはMulti-VMモードで複数起動出来るか試してみようと思います。

めっちゃ日付あいた

例によって画像は関係ありません笑

色々あってブログを書くことが出来ませんでした。すません しかし、新規にネタもない感じなので、とりあえず今気になっていることを列挙しておきます (書くことない時の手です)

  • RAXE
  • PHPのcodeigniter
  • HUGOのテーマ作成
  • JRubyでデスクトップアプリ作る
  • PlayFrameworkで書いていてストップしている案件どうにかする
  • GoのRevel
  • C++のCROW
  • C#のNancy
  • JavaのJetty
  • そういやPassengerV5(RAPTOR)出たけどためしてねーや

おわり (ぉ

C#のyieldに関して

まあなんか書くことなかったんだけど笑 C#のyieldを目にする機会が多かったので、ちょっと調べてみました。Microsoftのドキュメントを読んでみると

ステートメントで yield キーワードを使用した場合、メソッド、演算子、または get アクセサーが反復子であることを示します。 yield を使用して反復子を定義すると、カスタム コレクション型の IEnumerable および IEnumerator パターンを実装するときに明示的な余分なクラス (列挙の状態を保持するクラス。たとえば IEnumerator を参照) が不要になります。

フーン

まあコード書いてこのyieldの利益をえてみましょう。まずyieldを使っていない書き方から

class YieldTest {
  static void Main(String[] args) {
    foreach (var item in GenDataset()) {
      Console.WriteLine(item);
    }
  }

  static List<String> GenDataset() {
    List<String> dataset = new List<String>();

    for (int i = 0; i < 100; i++) {
      dataset.Add(i.ToString());
    }
    return dataset;
  }
}

まあ単純に0から99までの数字を配列に入れているだけです。次にyieldを使った書き方に変更してみます

class YieldTest {
  static void Main(String[] args) {
    var dataSet = GenDataset();
    foreach (var item in dataSet) {
      Console.WriteLine(item);
    }
  }

  static IEnumerable<String> GenDataset() {
    for (int i = 0; i < 100; i++) {
      yield return i.ToString();
    }
  }
}

ListからIEnumerableというインターフェースに変更して、かつ内部のListの変数宣言などが不要になっています

正直この例だと簡単過ぎてメリットを感じないのですが笑

ここでメソッドから帰ってきた配列の型を確認してみましょう。普通に書いた方は System.Collections.Generic.List1[System.String]`

ですが、yieldで書いた方は YieldTest+<GenDataset>c__Iterator0

という形で返ってきています。イテレータとなっていることから、List型ではなく、反復子として処理されたことがわかります。なので、内容はList型のような参照を行うことが出来ません(配列要素をカウントするCountなどをメソッドチェインすることは不能です)

。。結論として何を言いたいんだって感じになってしまいましたが、まあRubyにもYieldあったなあって思って色々試しただけですw

久しぶりにまとまらない話になりましたorz

C#の開発環境をMac上に整えてみる

C#面白いけどUnity上でしか触っていないので、コンソールから叩けるようにしようと思い、インストールしてみました

C#マイクロソフトが開発した言語で、.NET Framework上で動くように設計されています。 しかし、マイクロソフトが.NETに関する仕様を公開したのに伴って、オープンソースによる.NET Frameworkと互換性のあるフレームワークが作成されるようになりました。まあ詳しくはWikipediaでも見といてください
(ぉ

まあ長々と説明していてもしかたがないので、さくっとインストール方法を書いていきます。
といっても大変簡単で、Monoプロジェクトの本家のサイト に懇切丁寧な説明がありました。Macにインストールしていきます

・・・

まずインストールパッケージをダウンロードしましょう。MonoのサイトからDownloadに行き、Download Mono MDKをクリックして.pkgファイルをダウンロードします

ダウンロードしたファイルをダブルクリックすると以下のような画面が出てくると思います

あとはインストーラーにしたがってインストールを完了させてください

実際にインストールされたかを確認するには以下のコマンドを実行してください

$ mcs --version

僕の環境で実行したところ次のようになりました

では使えるか試してみましょう。以下のコードを適当なcsファイル内部にコピペしてください

using System;

class MonoTest {
  static void Main(String[] args) {
    Console.WriteLine("うぇぇいww");
  }
}

作成したファイルをコンパイルして実行しましょう。以下のコマンドで行うことが出来ます

$ mcs hogehoge.cs
$ mono hogehoge.exe

ここで$ mono hogehoge.exeとしている理由ですが、MonoのC#コンパイラがexeファイルを出力するためです。exeファイルの実行にはmonoコマンドを利用します

無事に実行できました。次回はUbuntu上で実行出来るようにします