ゼロから作るDeep Learningの学習環境をDockerで作った
会社で「ゼロから作るDeep Learning」を使ってDeep Learningを学ぶ勉強会をしようということになったので、環境を作ってみた。
使用する書籍はこちら↓
なぜDockerなのか
- Pythonや各ライブラリのバージョン差異によるメンバー間の挙動の違いが発生しないようにしたい。
- そもそも環境の構築が面倒なのでサクッと作れるようにしたい。
といった感じ。
というわけで、Docker for Macを使って学習環境を作った。
環境・バージョンなど
Mac
Docker
- Python 3.5.2 :: Anaconda 4.2.0 (64-bit)
- Jupyter 4.2.0
Docker for Macのインストール
まだインストールしていなければこちらからDocker for Macをダウンロードしてインストールする。
詰まるところは無いと思うのでインストール方法は省略。
公式のGit HubをForkしてClone
こちらがオライリーが公式に公開している、「ゼロから作るDeep Learning」用のGitHubリポジトリ。
色々コードを触りたいので、自分のGitHubアカウントにForkして、Cloneする。
今回は/Users/{USER_NAME}/github/deep-learning-from-scratch
にcloneした。
$ cd ~ $ mkdir github $ cd github $ git clone https://github.com/{GITHUB_ACCOUNT}/deep-learning-from-scratch.git
Jupyter notebookを使うことになるので、.gitignoreに以下の行を追加しておくといい。
.ipynb_checkpoints/
Docker Imageの作成
※Docker for Macは起動させておく。
Docker Imageはこちらのannaconda用イメージを利用した。
docker-images/anaconda3 at master · ContinuumIO/docker-images · GitHub
# docker imageをpullする $ docker pull continuumio/anaconda3 # docker imageを作成(ざっくり以下の設定を行っている) # cloneしておいたGitHub用のリポジトリを、/opt/notebooks/deep-learning-from-scratchにマッピング # 8888番ポートをフォワード $ docker run -i -t -v /Users/{USER_NAME}/github/deep-learning-from-scratch:/opt/notebooks/deep-learning-from-scratch -p 8888:8888 continuumio/anaconda3 /bin/bash
docker runするとプロンプトがdocker内に移動するので、以下のコマンドでJupyter notebookをインストールする。
# /opt/notebooksをJupyterのルートディレクトリにし、8888番ポートを利用する $ /opt/conda/bin/conda install jupyter -y --quiet && /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser
Jupyterが起動するので一度Ctrl + C
で終了し、exitで抜けておく。
以上でDockerの環境ができた。
Docker環境完成後
2回目以降は以下の手順でDocker Imageを立ち上げることができる。
# dockerのプロセスを探す $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a5f0b5dbc6db continuumio/anaconda3 "/usr/bin/tini -- /bi" 12 hours ago Exited (0) 10 hours ago serene_curran # ↑で探したコンテナID(今回の場合:a5f0b5dbc6db)を指定してdockerを起動する $ docker start -i a5f0b5dbc6db
dockerのプロンプトに移動するのでJupyterを起動する
$ /opt/conda/bin/jupyter notebook --notebook-dir=/opt/notebooks --ip='*' --port=8888 --no-browser
Jupyter起動中は、ブラウザでhttp://localhost:8888/
にアクセスすることでJupyterを使う事ができる。
また、Mac側の指定したディレクトリとシンクされているので、deep-learning-from-scratch
というディレクトリが既に存在する。
deep-learning-from-scratch
以下には各チャプターごとの参考コードが載っているし、notebookを作成し、notebookから該当のコードを呼び出すことができる。
呼び出し方は書籍内に出て来るのでそちらを参照。
Mac側とディレクトリを共有しているので、当然finderで中身を見ることもできるし、ブラウザ上のJupyter notebookで編集したnotebookを、自分のGitHubリポジトリにpushすることもできる。
これで色々捗りそうなので、Deep Learningについても学んでいきたい。
【iOS】Table Viewを使ってみる
前回の続き。
今回はTable Viewを表示する所をやってみる。
予め2ページ目の中央に配置していたLabelは削除しておく。
story boardでObject LibraryからTable View
を探してページに置く。
続けてTable View Cell
を探し、先程配置したTable View
の上に置く。
ここで2ページ目を表示するためのView Controllerを作成する。
プロジェクトツリーで右クリック -> New File..
を選択。
以下の画面でCocoa Touch Class
を選択する。
クラス名にSecondPageViewController
と入力し、
Subclass of にはUIViewController
を選択する。
※Table Viewだけのページであれば、UITableViewController
でも良さそう。
Storty Boardに戻り、2ページ目のView ControllerのAttribute Inspectorの設定で、classに先程作成したSecondPageViewController
を指定する。
Assistant Editor(∞みたいなアイコン)を開くと、左側にStory Board 右側にSecondPageViewControllerが表示される。
※表示されなければ表示されるように調整する。
この状態で、Table ViewからCtrl
キーを押しながらSecondPageViewControllerのクラス定義の直下にドラッグする。
↓画像のようなダイアログが出るので、tableView
という名前で設定する。
そうすると、@IBOutlet
でStory BoardのUITableViewとSecondPageViewController
のUITableViewがtableView
という変数名で接続され、以下のようにコードが挿入される。
その後、クラス定義部分にUITableViewDelegate
とUITableViewDataSource
を追加して以下のように書き換える。
class SecondPageViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
Story Boardに戻って、tableView
のConnection Inspector
を開く。
dataSource
とdelegate
からSecondPageViewController
に向かってドラッグする。
そうすると、dataSource
とdelegate
がSecondPageViewController
に接続される。
ここでdataSource
とdelegate
を実装していないのでコンパイルエラーが出るけど、先にCellの定義を追加する。
新たにCocoa Touch Class
作成画面を開く。
クラス名にSecondPageTableViewCell
を指定し、
Subclass of: にUITableViewCell
を指定する。
Story BoardでTableViewCellのIdentity Inspector
を開き、classにSecondPageTableViewCell
を指定する。
ついでにCellで画面表示したい項目をLabelで配置しておく。
画像の例だと、Labelでid
とname
を配置している。
同様にAttributes Inspector
を開き、IdentifierにSecondPageCell
を指定する。
※この項目は後ほどコード上でCellを取得するために使われる。
Assistant Editorで左にStory Board 右にSecondPageTableViewCell
を開いて、
Story BoardのCellからid
項目とname
項目をCtrl
キーを押しながらドラッグして、SecondPageTableViewCell
に接続する。
更に、データセット用のメソッドを定義する。
func setUserData(id: String!, name: String!) { self.id.text = id self.name.text = name }
最終的には以下のようなクラスになっている。
import UIKit class SecondPageTableViewCell: UITableViewCell { @IBOutlet weak var id: UILabel! @IBOutlet weak var name: UILabel! func setUserData(id: String!, name: String!) { self.id.text = id self.name.text = name } override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } }
SecondPageViewController
に戻って、TableViewの実装を行う。
まずはtableViewが何行あるかを表示するための以下のメソッドを実装する。
今回は練習なので単純に5をreturnする。
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 5 }
さらに、対象行のCellを取得するためのメソッドを定義する。
withIdentifier
に設定する項目は、Attributes InspectorでIdentifierに設定した値に合わせる必要がある。
今回の場合は、SecondPageCell
になる。
また、型はSecondPageTableViewCell
を指定する。
最後にsetUserData
でCellにセットする項目を入れる。
※今回の場合、現在の行のindexというidと"hoge"という名前がセットされる。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "SecondPageCell", for: indexPath) as! SecondPageTableViewCell cell.setUserData(id: String(indexPath.row), name: "hoge") return cell }
この状態でビルドして実行すると、以下の画面のようにTable Viewを表示することができた。
ここまで進めてきて徐々に難しくなってきた反面、楽しくなってきたので引き続きiOSアプリ開発方法を学んでいきたい。
Swiftのコード実装も増えてくるといい感じ。
【iOS】NavigationBarで前の画面に戻れるようにする
前回の続き。
今回は画面遷移した後、元のページに戻るという部分をやってみた。
今回もソースコードの変更はなし。
まずは右下のObject LibraryからNavigation Bar
を探して、遷移後の画面に配置する。
続いて同様にBar Button Item
を探して、先程追加したNavigation Bar
の左側に配置する。
↑で配置したTitle、Itemと表示されている部分をダブルクリックすると表示名を変更できるようになるので、適当な名前に変更しておく。
今回の場合だと、
- Title -> 2nd Page
- Item -> Back
にそれぞれ変更した。
続いてBar Button Item
を選択した状態で、Ctrl
キーを押しながら1画面目のView Controllerにドロップする。
Segueのアクションをどうするか聞かれるので、Show
を選択。
そうすると、↓図のように2ページ目から1ページ目へのSegueが表示されるようになる。
この状態でシミュレータを起動すると、
- 1ページ目の
Next
ボタン -> 2ページ目 - 2ページ目の
Back
ボタン -> 1ページ目
に遷移できるようになった。
今回もコードはいじっていないので次はコードを触っていきたい。
次のMacはディスク256GBにしよう
愛用しているMacBook Pro Early 2015のディスク容量が心許なくなってきた。
early 2015の中でも一番安いモデルなので、構成は↓こんな感じ。
ディスクは載ってないけど、128GBのモデル。
以前、以下で書いたように一度 TranscendのJetDriveを購入してSDカードとして増設している。
おかげで+64GBされているが本体側のディスク容量が既に半分以下になってしまった。
自分はあまり容量を使わないし、と油断していたらこんな結果になっていた。
容量が半分を切ると、精神衛生上あまり良くないなと感じるようになってきました。
JetDriveをもっと使えばいいと思うかもしれないけど、やっぱりいくつか不満もあって、最近では本体のSSDばかり使ってしまう。
気になっているのは以下の点。
- 本体のSDDの方が高速
- SDカードが刺さっているとスリープ状態でもバッテリーを消費してしまう
- Finder上で別のデバイスとして認識されるので、少しだけ面倒
最初は気にしないようにしていたものの、長く使っていくとやっぱり気になってくるもので、、
次は少しディスクに余裕を持たせようと思うようになった。
購入するのはもう少し先になりそうだけど、Appleの商品ページを見ていたら最新のラップトップでディスクが128GBってもうMacBook Airしかなかった。
次もきっとMacBook Proを買うと思うので杞憂に終わった。
Late2016は色んな意味で話題になっているし、USB-TypeC対応の周辺機器がまだまだ出揃っていないので、自分の買い時は 2017年か2018年モデルかなという感じ。
(それまでディスクが持てば・・)
とりあえずその時までにお金を貯めよう・・!
【iOS】単純な画面遷移をやってみる
練習用にプロジェクトは作ったので、まずは単純な画面遷移をしてみる。
今回はstoryboardで完結するのでコードの変更はなし
単純な画面遷移
まずはXcodeでMain.storyboard
ファイルを開く。
画面右下から遷移先用画面となるView Controllerを選択して、1画面目の右にドロップする。
画面が2枚に増えるので、画面右下の検索ウィンドウでbutton
と入力。
出てきたbutton
を、1画面目の真ん中あたりにドロップする。
ボタンの表示やサイズは適当に設定する。
ボタンを選択した状態で、ctrl
キーを押したまま、2画面目にドロップする。
Segueの接続先を選べるので、今回はShow
を選択する。
1画面目と2画面目を接続するラインができた。(これがsegue..?)
2画面目が分かるように、適当にlabel
を配置する。
この状態で保存して、実行してみる。
1画面目でNext
ボタンが表示され、ボタンを押すと
2画面目に遷移してmoved!
と表示された。
今回は単純な画面遷移しかしていないものの、1行もコードを書くことなく画面遷移ができたのはなかなか新鮮。
次はもう少し複雑な画面遷移をやってみる。
CocoaPodsでRealmの設定をする
以前Laravelの学習用に環境を用意したものの、実際に業務で扱うのが先に伸びたので、正月休みにiOS開発の学習を始めた。
iOSアプリを開発する上で、パッケージマネージャとして有名 & よく使われているものが
CocoaPodsっぽかったのでCocoaPodsのインストールと、試しにRealm用のプロジェクトを作ってみた。
※Swift3からは公式にSwift Package Managerが登場したらしいが、まだ主流はCocoaPodsっぽいのと、iOSなどにはまだ対応していないようなので今回は見送った。
Note that at this time the Package Manager has no support for iOS, watchOS, or tvOS platforms.
バージョン情報など
Xcode 8.2.1
Swift 最新版(3.x)
CocoaPods 1.1.1
Realm Swift 最新版
CocoaPodsのインストール
公式ページにある通り、gemでインストール。
$ sudo gem install cocoapods ・・・ $ pod --version 1.1.1
Realm Swift用のプロジェクトを作成
公式のドキュメントを参考に、進めていく。
CocoaPodsのSpecリポジトリを更新する
※CocoaPodsインストール直後などの場合はいらない
$ pod repo update
Xcodeで新規iOSプロジェクトを作成する
目的がなければとりあえずSingleViewApplication
でNext
プロジェクト設定はとりあえず適当に設定
Product Name | RealmSample |
---|---|
Organization Name | デフォルトで設定されているもの |
Organization Identifier | デフォルトで設定されているもの |
Language | Swift |
Devices | iPhone |
Use Core Data | 未チェック |
Include Unit Tests | 好みで |
Include UI Tests | 好みで |
podの設定
上で作成したXcodeプロジェクトは一度閉じておく。
作成したプロジェクトのディレクトリに移動してpod init
でPodfile
を作成する。
$ cd ~/swift/RealmSample/ $ pod init
続いてPodfileを設定する。
以下の通り、対象のターゲットにpod 'RealmSwift'
を追記し、ファイルの末尾にSwiftのバージョンを指定するように設定。
https://realm.io/jp/docs/swift/latest/
@@ -6,10 +6,12 @@ target 'RealmSample' do use_frameworks! # Pods for RealmSample + pod 'RealmSwift' target 'RealmSampleTests' do inherit! :search_paths # Pods for testing + pod 'RealmSwift' end target 'RealmSampleUITests' do @@ -18,3 +20,11 @@ target 'RealmSample' do end end + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['SWIFT_VERSION'] = '3.0' + end + end +end
その後、pod install
を実行する。
$ pod install
実行が完了すると(多少警告は出るものの).xcworkspace
ファイルが作成される
xcworkspaceファイルを開く
生成された.xcworkspace
ファイルを開いてXcodeを起動する
プロジェクトのGeneral
-> Linked Frameworks and Libraries
の+
ボタンを選択
Realm.framework
とRealmSwift.framework
を選択してAdd
一度 Cmd
+ B
でビルドすると、RealmSwiftが認識されてimportできるようになる
これで準備完了
VagrantでLaravelの開発環境を作った
先日、職場で「来年からPHP(Laravel)やってもらうかも」と言われたので、
少し勉強をしようと思い、まずは環境を作ってみた。
PHPといえば最近7系にメジャーバージョンアップして、色々変化があったようです。
とはいえ、ドットインストールで少しPHPをやってみた事があるくらいで、全然PHPは書けない
(やばい・・)
最近はLaravel人気が高まっているらしい。
とりあえず、VagrantかDockerで環境構築できたら楽だなと思い、公式ページを見ていると、Homestead
を使うと楽にできそうだったので、試してみることにした。
Laravel Homestead - Laravel - The PHP Framework For Web Artisans
以下のソフトウェアが含まれたVagrantのBoxで簡単に環境が作れるものらしい。
- Ubuntu 16.04
- Git
- PHP 7.1
- Nginx
- MySQL
- MariaDB
- Sqlite3
- Postgres
- Composer
- Node (With Yarn, PM2, Bower, Grunt, and Gulp)
- Redis
- Memcached
- Beanstalkd
手順にそってインストールしていく。
Vagrant / Virtual Boxのインストール(アップデート)
※Virtual Boxが5.1系じゃないと駄目らしく、5.0.30 + Extensionで試した所、vagrant起動時にssh key関連で止まってしまい、原因が分からなくてかなりハマった。
Before launching your Homestead environment, you must install VirtualBox 5.1, VMWare, or Parallels as well as Vagrant. All of these software packages provide easy-to-use visual installers for all popular operating systems.
vagrantのboxを追加
% vagrant box add laravel/homestead
providerを聞かれたので、2(virtualbox)を選択
==> box: Loading metadata for box 'laravel/homestead' box: URL: https://atlas.hashicorp.com/laravel/homestead This box can work with multiple providers! The providers that it can work with are listed below. Please review the list and choose the provider you will be working with. 1) parallels 2) virtualbox 3) vmware_desktop Enter your choice: 2 ==> box: Adding box 'laravel/homestead' (v1.0.1) for provider: virtualbox box: Downloading: https://atlas.hashicorp.com/laravel/boxes/homestead/versions/1.0.1/providers/virtualbox.box ==> box: Successfully added box 'laravel/homestead' (v1.0.1) for 'virtualbox'!
※光回線で15分くらいかかった。
※ダウンロード中に以降の手順を先に進めてしまってもok
Homesteadをホームディレクトリにclone
% cd ~ % git clone https://github.com/laravel/homestead.git Homestead
Homesteadのイニシャライズ
% cd Homestead/ % bash init.sh Homestead initialized!
イニシャライズすると、~/.homestead/Homestead.yaml
に設定ファイルが生成される
ファイルを開いて以下の点を確認した。
- provider: virtualbox になっている
- nfsを有効にする
- ↓のように
type: "nfs"
を追記
- ↓のように
provider: virtualbox folders: - map: ~/Code to: /home/vagrant/Code type: "nfs"
また、vagrantのファイル共有のディレクトリが~/Code
になっているので、
それ用のディレクトリを作っておく
※ここは任意のディレクトリをfolders:のmapに指定してもok
% cd ~ % mkdir Code/
hostsの設定
/etc/hosts
に以下の一行を追加する。
192.168.10.10 homestead.app
vagrantの起動
ここまで設定が終わったら、vagrantを起動する
% cd ~/Homestead/ % vagrant up 起動時のメッセージ色々 % $ vagrant status Current machine states: homestead-7 running (virtualbox) The VM is running. To stop this VM, you can run `vagrant halt` to shut it down forcefully, or you can run `vagrant suspend` to simply suspend the virtual machine. In either case, to restart it again, simply run `vagrant up`.
Laravelのインストール
% vagrant ssh
※ここからはvagrant内での作業
laravelのインストール
※既に入っているよと言われたのでスキップして良さそう。
$ composer global require "laravel/installer" Changed current directory to /home/vagrant/.composer Using version ^1.3 for laravel/installer ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Nothing to install or update Writing lock file Generating autoload files
プロジェクトの作成
今回はblogというプロジェクトを作成した。
$ cd Code/ $ mkdir -p ./Laravel/public $ cd Laravel/public/ $ laravel new blog
この状態でchromeで以下のURLを開くと
http://homestead.app/blog/public/
Laravelのページが表示された!
※自分は必要なかったが動かなければblog
ディレクトリの直下でphp artisan serve
を実行してみる。
実際にはURLが微妙なので、~/Code
直下でlaravel new blog
を実行し、
~/.homestead/Homestead.yaml
でsites
の設定を以下のように変えてあげると
http://homestead.app/
でアクセスできるはずなのでその方が良さそう。
sites: - map: homestead.app to: /home/vagrant/Code/blog/public
その他
vagrantの/home/vagrant/Code/
ディレクトリとホスト(mac)の/Users/${user name}/Code
ディレクトリはnfsでマウントされているので、ホスト側でコードを編集すれば、すぐに反映される。
<?php echo "hogehoge!"; ?>
なので、PhpStormやAtomなどでもそのまま開発ができそう。
環境作りで色々ハマって疲れたのでLaravelの学習はまた今度・・・