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-build
が anaconda-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経由でインストールされたOpenCVのpython用バイナリを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なら一発じゃね?って飛んできたので、試したら本当に楽に入ってしまった。。開発用途ならこれで十分かも。
pyenv 使ってるならbrewじゃなくてanaconda で入れたら一発な気がする。。
— Yuto Suzuki (@moc_yuto) 2017年7月22日
ブログを移行しました
気がつけば社会人2年目も半ばになっているっていう。 後輪矢のごとしとはまさにこのことですね。
HUGO+レンサバから、はてなブログ+S3(アセット)に移行しました。 理由としては
などがあります。学生時代には予想もしなかったインフラエンジニアになっている、ほぼ毎日酒を飲んでいるなど、中々めまぐるしく変化している社会人生活ですが、 技術的なことを主軸にこのブログを更新していこうと思います。
インフラエンジニアになっても何故か仕事レベルで書ける言語は増える一方なので、インフラという枠(あるレベル以下は既にその境界線が無いようなものですが)に囚われずに書いていきます。
AWSをVagrantから使ってみる
卒研とか引っ越しとかで忙しくてねえ。。(言い訳)
AWS便利すぎて値段が割高というデメリットが完全に霞んでいる感ありますね。個人的にはもう少しGoogleCloudPlatform使いたいんですけど。 でも結局GCPあんま使ってないっていう
・・・
vagrant-aws
というプラグインを利用することによって、AWSをあたかもVagrantでVirtualboxなりVMWareなりのVMを立ち上げているかのように使えるということで、試しに使ってみました。
作者のページを見れば当たり前ですが詳しく書かれているのでどうぞ
まあまずプラグインをインストールしないことには始まりませんので、インストールします。(あ。VagrantやAWSを普段そこそこ使用している方向けの記事ですので、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
次に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を立てることが出来ました。
Vagrant全ての機能を使えるわけではありませんが、気軽に実際にサーバーを立てて検証するには良いと思いました。個人的にはMulti-VMモードで複数起動出来るか試してみようと思います。
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.List
1[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上で実行出来るようにします