Dockerによる楽々開発環境構築

なんで書こうと思ったの

WebアプリをHerokuにデプロイするときに、サーバー上でapt-getするためにはDockerでデプロイしなくちゃいけない ?っぽいことが分かったので勉強のためにまとめることにした。

※素人が書いてるのであまり参考にはしないでください。

Dockerは何のためにある?

色々あるが、基本的にはチームで開発環境を同じにするためにあると思ってる。

ユースケース

チームでWebアプリで開発していたとする。ソースコードGithubで共有されているとしよう。 各人はGithubからソースコードをpullしてきて、それに変更を加えることで開発を進めていく。 すると、自分の加えた変更をMergeする前に実際の環境(開発環境)で正しく動くか確かめる必要があるだろう。 そのためによく使われるのが仮想環境と呼ばれるもの。さてこの仮想環境だが、自分の知る中で二種類ある。

二種類の仮想環境構築方法の比較

virtualboxを使った場合

virtualboxを使うと、以下の手順で任意のosの仮想環境を構築することができる。

  1. . ホストosにvirtualboxをインストールする
  2. . 任意のゲストosのisoファイルをダウンロードしてきて、virtualbox上にインストールする
  3. . ゲストos上でアプリのソースコードをgit pullする
  4. . ゲストos上で手順書に従って必要なアプリをapt-getなどでインストールする
  5. . その他、時刻や言語、データベースなどの設定をゲストos上でする

この方法の問題点は、手順一個一個に時間がかかることと、複雑であるためミスが起こりやすいこと。 しかも、各人がサーバーを使っている最中にアプリを追加でインストールしたりもできるので、各人の開発サーバーが異なる条件になってしまうリスクがある。 Dockerでは、これが解決する。

Dockerを使った場合

  1. . ホストosにDockerをインストール(WindowsならDocker for Windows)
  2. . ホストosでソースコードをgit pull してくる
  3. . チーム内で共有されているDockerfileをソースコードのあるフォルダに置き、以下のコマンドを叩く $ docker image build [OPTIONS] PATH | URL | -

これだけ。ゲストのosとかはどこから持ってきてるの?っていうと、Docker hubっていうクラウドから持ってきてる。 イメージはこんな感じ↓

f:id:gakki-uec15:20190805172939p:plain
Dockerのイメージ図

こうすることで、チーム内でDockerfileだけ共有していれば、みんな同じ仮想サーバーでテストができる。 何よりも楽。

他のメリット

デプロイにも使える

Dockerはもともと、単一のlinuxサーバー上にコンテナという区切りを設けて複数のサーバーを構築するのにつかわれるもの。 AWSGoogle Cloud Platform、Herokuなどでもこの技術は使われている。つまりどういうことかというと、こういったサーバーにWebアプリをデプロイするときも Dockerが使えるということ。その時必要なのはアプリのソースコードとDockerfileだけになる。 実際Herokuのドキュメントでもその方法でデプロイできると言っている。

Dockerfileが手順書の代わりになる。

Dockerfileを読めば、要求性能が一目でわかるのは便利そう。

軽い

コンテナ技術はvirtualboxと違ってosをまるのせするわけではないのでDocker Images自体が軽い。 この辺はググったらいくらでも出てくるのでそっちを参照してください。

まとめ

Dockerを使うとチームで開発するときに便利だし、デプロイも楽になる。

参考

devcenter.heroku.com

  • この中の「Building Docker Images with heroku.yml」がDockerfileだけでデプロイする方法。Docker Image自体をデプロイする方法もある。

最適化の勉強 その1

なんで書こうと思ったの

  • 目的
    • 最適化を使って学会発表するのに理解できてなくない?ということでアウトプットの意味で書く
    • ゴールは非線形最適化の概要を把握するのと、実際に研究で使ってるPythonライブラリのTNC法を理解すること
  • 構成
    1. 非線形最適化の概要
    2. 制約付きの場合
    3. Python.scipy.optimize()ライブラリの各アルゴリズムに関する説明(主にTNC)
  • 注意
    • 一応ブログとして書いてるけと個人の学習用なので悪しからず。
    • 文頭全部に「たぶん」が付く

1. 非線形最適化

降下法

非線形最適化問題の解法の概念として、降下法がある。

  1. ある点x^{k}から見て、目的関数が減少するような方向d^{k}を探す(部分問題)
  2. その方向に一定量進み、その点をx^{k+1}として1.に戻る

を繰り返す

各種アルゴリズムはこの考えに基づいている。 問題は、1.の目的関数が減少する方向をどう探すか。

最急降下法

探査方向ベクトルを

d^{k} = -\nabla f(x^{k})

とする方法。勾配の方向ってことは目的関数が減少する方向だよね。

目的関数の勾配ベクトルを求める必要がある。

Newton法

目的関数をx^{k}の周りでテイラー展開して二次に近似する。 するとその近似関数の最小値は探査方向として有用である。

最小値自体は目的関数の勾配ベクトルとヘシアンの逆行列で表せる。 つまり探査方向を求めるためにヘシアンの計算が必要。その計算が大変なのがデメリット。

共役方向

共役方向と呼ばれる方向がめっちゃいいらしい。 なんでかっていうと、この方向は変数変換したときに目的関数の等高線に対して直交で、まっすぐ解に進むから。 ちなみにここで言う「共役」は「複素共役」とかとは意味が違う。

Powell法

共役方向がめっちゃいいのは分かった。じゃあこの方向どうやって見つけるの?っていうのがこの方法。

共役勾配法

Powellで共役方向を求めながら最小化していく方法

まとめ

よく聞くNewton法とかCG法についてなんとなくわかった気になった。 次回は制約付きについて理解する

参考文献

今野 浩, 山下 浩 ,"非線形計画法", pp146-147,pp169-188

電通大の学内ネットからGithubにsshする方法

きっかけ

  • 研究室のネットワークはもともとグローバルIPを持っていたのだけど、ついこの間 学内のネットからプライベートIPをもらってつなぐ形になった。(セキュリティ的な問題があったらしい)
  • つまりUECWirelessでつないでるのと同じような状態で、学外のサイトにつなぐ場合はプロキシを通さないといけなくなった
  • httpsブラウジングとかならいいが、Githubにプッシュするときに使っていたsshが出来なくなってしまった。

解決法

  • どうやらGithubhttps用のプロキシサーバーを経由してssh接続する方法があるらしい。
  • 以下手順(公開鍵の配置などは終わっているものとする)
  • 環境はwindwsなのであしからず

手順

  1. ~/.ssh/configの設定をssh用にする。
Host ssh.github.com
User git
Port 443
Hostname ssh.github.com
TCPKeepAlive yes
IdentitiesOnly yes
IdentityFile ~/.ssh/id_rsa
  1. connect.exeをどこかから見つける

    • 自分の場合はC:\'Program Files'\Git\mingw64\bin以下にあった
    • 正直これなんなん?って感じ(今度調べてみる)
  2. '~/.ssh/config'にさらに以下を追記

    ProxyCommand [connect.exeのパス] -H proxy_url:proxy_port %h %p

  3. pushできる。

まとめ

よかったよかった

参考サイト

proxy経由で社内からgithubにアクセスする。 - Qiita

追記

pipの場合は

py -m pip install ほにゃらら --proxy http://....

でいける。

追記2

パスの書き方が間違っていました。 Windowsの場合はパスをC:/'Program Files'/Git...というように/を使います。 (\\でもいいはず)

VS CodeでPython環境を入れたときにインポートできなくてはまった

ハマったこと

  • VS CodePythonプラグインを入れることで、コンソールが出てPythonコマンドを打てるようになるんだけど、ライブラリがうまくインポートできない。

解決手順

  • 生のPythonをインストールして特定のフォルダに仮想環境を作る
C:\Users\user1> py -m venv C:\Users\user1\py3env
C:\Users\user1> C:\Users\user1\py3env\Scripts\activate.bat
  • これでこのフォルダでpyコマンドを使うとその仮想環境上で実行される。
  • この仮想環境内でライブラリを入れるとその仮想環境だけで使えるようになる。
C:\Users\user1> py -m pip install numpy
C:\Users\user1>py
>>>import numpy
  • 次にプラグインを入れたVS Code上でコンソールを開き、同じフォルダに移動。
  • C:\Users\user1> C:\Users\user1\py3env\Scripts\activate.batでさっきの仮想環境に切り替えて import "さっき入れたライブラリ"しても「モジュールが見つかりません」とか出る。
  • どうやらVS CodeのコンソールはコマンドプロンプトではなくPowerShellとして動いているらしく、 PowerShellの仮想環境を有効にするには別のコマンドを実行しないといけないらしい。
PS C:\> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
PS C:\Users\user1> C:\Users\user1\py3env\Scripts\activate.ps1

結果

VS Codeのコンソール上でPythonの仮想環境が使えるようになった

参考サイト

www.python.jp

新しいPCに古いグラボを増設した話

研究室の大掃除として、壊れていて廃棄予定のPCを分解してハードディスクを取り出す作業をしていました(多分情報漏洩とかを防ぐため)。すると、いくつかのPCは古いとは言っても第7世代のintel CPUを積んでいて、さらにグラボもありました。分解するついでに先輩に「これ、自分のPCに増設してもいいですか?」と聞いたところ、「いいんじゃない?」とのことなのでやってみることにしました!!

 

研究室の自分のPCは去年の春に買ってもらったばかりで、Core i7 7700 を搭載した新しいモデルです。古いPCにグラボを増設する話はよくありますが、逆に新しいPCに古いグラボを増設する話は少ないんじゃないかなと思って書きます。

 

取り出したのはNVIDIA GTX650 というグラボ。調べてみると2012年頃発売のモデルのようです。(7年前...)

f:id:gakki-uec15:20190224224509j:plain

取り出したグラボ

 

まずこれが、増設して性能が良くなるグラボなのか確認します。

というのも、最近の新しいIntelのCPUにはもとからグラフィック処理能力(GPU)が入っていて、そのままでもそこそこ性能良いです。そのため古いグラボを増設しても性能的には微妙なのではないかと思いました。

 

Intel製CPUに内蔵されるグラフィックは種類によって違います。

 Windows 10 の場合、「設定」→「システム」→「ディスプレイ」→「ディスプレイの詳細設定」から現在使用されているグラフィックが確認できます。

自分のPCは「HD630」という内蔵グラフィックが使われているようでした。

そこでこの「HD630」と「GTX 650」を比較します。

 

こちらのサイトを利用させてもらいました。名前を入れるだけでいろいろな性能を比較してくれてとても便利です!

https://gpu.userbenchmark.com/Compare/Nvidia-GTX-650-vs-Intel-HD-630-Desktop-Kaby-Lake/3154vsm178724

 

結果としては、すべての項目でGTX 650のほうの性能が高いようです!古いとは言ってもさすが専用のグラフィックボード。

なのでこのグラボを増設することに決めました。

f:id:gakki-uec15:20190224221959p:plain

グラボ性能比較

 

グラボの増設手順は簡単です。いろいろなサイトで解説されているのでそちらを見てください。(自分はこちらのサイトを参考にさせていただきました。↓

初心者向け「グラフィックボードの増設と交換」を徹底解説 | ちもろぐ)

 

 

増設完了。さあ電源を付けるぞ!というところで問題?が発生しました。

CUI画面が開き「The VGA card is not supported by UEFI driver」というメッセージが出ます。調べてみるとグラフィックボード・マザーボードには「UEFI」というものに対応しているものと対応していないものがあり、古いものは対応していない場合が多いそうです。今回はマザボ側は対応しているのに古いグラボ側は対応していない、という形でした。

 

古いPCのUEFI未対応マザボに対応したグラボを増設する場合はPC側で設定する必要があるそうです。しかし、対応しているマザボに未対応グラボを増設している例は見つかりませんでした。とりあえず、メッセージ画面に出ていた「SET UP」から進んでみました。

 

するとグラフィックの設定BIOS?のような画面が出ます。

うーん、分からん。

 

ということでとりあえずF10で再起動してみたところ、普通に起動できましたw

Windows側で確認してもちゃんと動いています。↓

f:id:gakki-uec15:20190224223537p:plain

GTX 650が認識されている様子

 

一応、なんとなくドラクエベンチマークを走らせてみました。



f:id:gakki-uec15:20190224223723p:plain

増設前(HD 630)

f:id:gakki-uec15:20190224223808p:plain

増設後(GTX 650)

増設後のほうが明らかにスコアが上がっていることが確認できます!!

 

.

.

というわけで、今回の結論としては、

「新しいPCに古いグラボを増設する場合、最初にメッセージが出るが一度再起動すれば大丈夫!!」また「数年前のグラボでも最新のIntel CPU内蔵グラフィックより性能が高い」

ということになりました。

 

なんか釈然としませんが、同じように悩んでいる人の役に立てばと思います。

(当方は一切の責任を負いません。)

 

それではまた!

 

 

 

 

 

 

ビックカメラ札幌の福袋抽選に行ってきました

今日1/1(元旦)は、初めて大型電気店の福袋というものを買おうと並んでみた。

 

朝8:00の地下鉄に乗って札幌駅へ。車内には人がまばらで元旦の早朝から出かけるもの好きは少ないものだなと感じた。

 

どうやらステラプレイスも1日は基本お休み。2日から営業らしい。いいと思う。使う人がいるから働く、という悪循環を断ち切るには無数の消費者に頼るのではなく企業が手を入れるしかないのだ。

 

などと言いながら自分はビックカメラに向かっているわけで、やはり人間は自分に都合のいいように考え、自分が行きたい店は元旦でも関係なく開いててくれと願うわけだ。

 

さて、8:30ごろビックカメラに到着した。すでに長蛇の列ができていた。

 

物好きは自分だけではなかったようだ。まばらにヨドバシカメラの福袋の箱(?)を持っている人がいた。さらに早くからヨドバシにならび、その足でビックカメラに向かったといったところだろうか。元気な人達である。

 

そんなことを言っている自分もこうしてわざわざ当たるかもわからない列に並んでいるわけだから、さしずめ「まあまあ元気な人」だろう。

 

列の途中で整理券(抽選券ではない)を頂いた。

f:id:gakki-uec15:20190101170857j:plain

整理券

 

これぐらいのものなら近くのコンビニに行って番号を書き換えてコピーすれば使えるのではないかと悪いことを考えたりもしたが、どうやら整理券の番号は順番になっているのではなくランダムにしてあり、それを抽選券を渡す人と読み合せるようだ。

 

さて、整理券をもらってから並ぶこと約20分、ようやく抽選券をもらえた。番号は142。2*71。とりたてて面白みもない数だ、と言ったらラマヌジャンに怒られそうだが。僕の後ろにもかなり(多分100人以上)の列ができており、そのうちの割と多くの人はiPadの抽選券を選ぶだろうから、iPadを選んだ人は合計200人ぐらいだろうか。iPadは5袋だから、実倍率は約40倍。まず当たらないだろうが、できれば当たってほしかった。

 

f:id:gakki-uec15:20190101171002j:plain

抽選券とさっぽろたん

 

その流れで先着式の福袋を買うことができるカウンターに続いた。自分は抽選のiPad以外興味なかったのでスルー。このとき9:30ごろ。列の最後に戻って見ると「抽選販売最後尾」というプラカードを持った店員さんがいた。どうやら抽選販売は9時までに並んだ人までが参加でき、それ以降に並んだ人は抽選には参加できないが先着式の福袋は買うことができる、という仕組みらしい。

 

抽選の発表はビックカメラ札幌の公式キャラ「さっぽろたん」(かわいい) のTwitterアカウントで11:00に発表されるらしく、また当選した場合には15:00まで買うことができるという話だった。したがって店舗の近くで待つ必要はなかったのだが、11:30から西11丁目のビューホテルで祖母と家族とで新年会という名目のお食事会をすることになっていたので、ステラプレイス一階のスターバックスコーヒーで待つことにした。

 

1/1ステラプレイスは全店休業だと思っていたが、スターバックスは別らしい。外資系だからだろうか。新年早々駆り出されるスタッフの方は大変でさも不機嫌な顔をしている、と予想したものの店員さんは素敵な笑顔でスターバックスラテのショートサイズを渡してくれた。うれしい限りだ。

 

持ってきたノートPCでツイッターを見て卒論を書いていると、軽い腹痛が来た。

 

「ん...」

 

まあ、いつものことだろう。自分はカフェインと牛乳に弱い。ショートサイズとはいえ、その両方が入ったものを飲み、おなかが緩くなったのだろう。でもまあ、許容範囲内だ。

 

30分ぐらいたって、そろそろホテルに向かおうかなと立ち上がった瞬間、

 

「......!!!」

 

激しく腹の中で流動するものが来た。やばい...も・も・も...

 

新年早々〇らすのはまずい。大急ぎでカフェラテのカップを片付け、トイレを探す。

 

「一階のトイレは混むだろうから二階のトイレに行ったほうがいいだろう」という考えのもと二階へ行くエスカレートに乗ったとき、自分の誤りに気が付いた。そう、ステラプレイススターバックス以外元旦休業。

 

「ふざけるな!」

 

先ほどの言葉はどこへ行ったのやら、休むべき時に休む人々に自分勝手な文句を心の中で吐く。そう、人間なんて自分勝手なものなのだ。それを僕は、強烈な欲求 -便意という名の- をもって感じ入るのだった。

 

しょうがないので唯一営業している一番上のレストランフロアまでエスカレーターで昇っていくことにした。エスカレーターに乗りながら考える。

 

(おかしい。たかがカフェラテでこんなにおなかが痛くなるなんて。)

便意と戦う中じっと考える。

 

「...ナスの漬物だ!!!」

 

そう、機能の夕飯(osechi)にはナスの浅漬けが入っていたのだ(※北海道では大晦日におせちを食べる)。でも、微妙に違和感があった。なんか酸っぱかった。浅漬けなのに。僕は思い出す、サイクリング部の合宿の料理に使ったおつとめ品のもやし。なんか酸っぱかった。をヤバそうだからと誰も手を付けなかったことを。

 

頭のなかで思い浮かべる。

(これは夢だと信じたい。そういえば今日は元旦。夢ならば初夢だろうか。)

 

「イチフジ ミタカ サンナスビ」

 

そんなことを考えているうちにレストランフロアに到着した。

 

「トイレは!」

 

近くに案内標識があったので探す。

 

「こっちか!」

 

主人公を追い詰める悪役魔法使いのごとくトイレを血眼で追う。

そして男子トイレの青い看板を見つけると、幸い個室が開いていた。

 

入った瞬間、

 

ブ〇〇〇〇〇......!!!! (おせちを食べている人もいるだろうから擬音は割愛)

 

「はあああ......」

 

心地よい安堵の感触。圧倒的感謝。生きてるって素晴らしい。

 

ふと時計を見ると11時を回っていた。Twitterを見ると、すでに抽選発表がされていた。

外れ。しかし、そんなことはどうでもいい(オカリン風)。

そう、う〇ちは無事だった。生きてるって素晴らしい。

 

そのとき、あるフレーズが頭に浮かんだ。僕はにやりと笑う。やはりこれは初夢だ。

.

.

.

「ウンチ ブジ ミタカ サンナスベン(酸なす便)」