helloworlds

not a noun, it's a verb

【VR】Oculus GoをPCへミラーリングさせる(無線)

先日Oculus Goが家に届きました!

私が購入したのは、これ。

www.oculus.com

64GBの方を選びました。 俗に言うスタンドアローンというVR機器になるようです。

カートに入れて、購入完了して数時間で発送しますね!というメールがきました。 大体到着まで5日間ほどで手元に届きました。

「けっこうはやいな!」

中身を見てみるとけっこうシンプルにまとまっていました。 メガネを日頃かけている方でも安心。 メガネをかけている人用のアクセサリーみたいなのも付いていて、 スマホのアプリからOculusの設定をする時に、装着ムービーも丁寧に紹介されていました。

(※ わかりやすいように、画像を載せようかと思っていたのですが、この記事では割愛します。が、その分丁寧に書いてくつもりです! また、後日画像を掲載させていくかもしれません。合わせて詳細も追記していければと思います。)

ここから、"PCへのミラーリング"について順をおって説明します。 今回は以下の記事を参考にさせて頂きました!さっそく先人の方に感謝...!!

Oculus Goの画面をPCにWirelessでミラーリング表示する

準備

まず、色々準備が必要です。 すんなりいけば大丈夫ですが、私はある設定で少し詰まりました... スマホアプリの開発を経験されている方はけっこうすんなりいきそう...

では、まず環境から。 あくまで私の環境ですので、他の環境では試していません。随時、自分にあった環境の設定方法をググる必要があるかもしれません。

環境: Windows10 (デスクトップPC) ブラウザ: Chrome

1. スマホアプリと連携

iPhoneならApp Storeで、AndroidならPlayストアOculusというアプリをダウンロード。

ログインを行い(アカウントを作成する必要があります)、手順に従って連携完了まで行う。

1-2. 開発者モードにする

ミラーリングするにしても、Unityで開発を行うにしても Oculusに対して開発者モードに設定する必要があります。

まず、以下のURLへ移動しログインします。

https://dashboard.oculus.com

そうすると、「新しい団体の作成」という画面が表示されるかと思います。 任意の団体名を記入し、送信し、完了させます。

完了すると以下の画面が出てくるかと思います。

f:id:o21o21:20180531111157p:plain

一旦これでOKです。

スマホアプリに戻ります。

画面下部メニューの"設定" -> 接続しているOculus(シリアルナンバー付)をタップ

-> ”・・・その他の設定” -> "開発者モード" -> スイッチを"有効化" (青色にする)

これで完了です。

2. Android Studioをインストール

続いては、PCの方です。

色々調べてみると、ミラーリングするだけだったらadbコマンド (Android Debug Bridge)が使用できていれば問題なさそうです。 なので、既にAndroidの開発などをされている方は、不要かもしれません。 ここでは将来的にUnityでOculus Goを開発することを目的にしたいので、一気にAndroid Studioをインストールします。

公式: Android Studio概要

以下のURLに行って、ダウンロードします。

Download Android Studio and SDK Tools  |  Android Developers

f:id:o21o21:20180531114053p:plain

  1. ダウンロードした.exeを開きます。
  2. 特に指定がなければ全部デフォルトでインストール&Nextボタン押下で大丈夫です
  3. 全てのインストールが完了すると、Android Studioを起動します
  4. ウィンドウ下部にある、Configure -> SDK Manager を選択
  5. 左メニューAndroid SDKを押下し、タブSDK Platformを選択。
  6. API Level19以上のものにチェックを入れます
  7. タブSDK Toolsを押下し、LLDBGoogle USB Driverにもチェックを入れます
  8. ウィンドウ下部のOKを押下し、Component Installerが開かれインストールが開始されます

ここまでできたらウィンドウを閉じて大丈夫です。

3. adbコマンドを試す

Android StudioをインストールしてSDKもインストールできれば、 Windowsコマンドプロンプトadbコマンドが使用できているでしょう。

ここで、付属していたUSBケーブルとPCを接続します!

私の場合はここでadbコマンドが使用できず、 "’adb’は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません"

と、出力...

「なんでやあああああぁぁ!!!」

とか言いながらググりました。

結果、環境変数のPATHが通っていないことが判明。 いつもやってんのに... 普段Windowsあんまり使わないから見落としてた。 (私の場合は早期に環境変数に気づきましたが、PATHがさらに間違っていたから時間とりましたww)

もしコマンドが使用できないなら、コントロールパネルを開いて、 システムとセキュリティ -> システム -> 左メニューのシステムの詳細設定 -> 詳細設定タブ環境変数(N) -> 環境変数PATHを選択して編集 -> 新規

ここで私は2つPATHに対して新規で追加。

C:\Users\ユーザ名\AppData\Local\Android\Sdk\platform-tools
C:\Program Files(x86)\Android\android-sdk\platform-tools

ちゃんとPATHがは自分で確認してください!! 上記のpathを参考にエクスプローラーからポチポチしていけば確認できかと思います。

そして、いざコマンド実行。

> adb devices
List of devices attached
xxxxxxxxxxxxxxxxxx        unauthorized

「NOOOOOOOOOぉぉぉぉぉ〜〜〜!!!」

なんか権限ないですやん...

まあ、ただadbコマンドは使用できていてOculusは認識しているっぽい。

ふむふむ

ってことは、どっかで権限を有効にしてやるかんじかなと、またググる

本来?というかAndroid端末であればどうやらUSBデバッグの許可の取り消しなるオプションがあるらしい。 ただ今回はOculusさんだぞ...

「どこを探してもない.... おおおおおおおおおお」

ってなってたらオキュラスのレンズから光が見えた!!!!www

USBデバッグの許可は、Oculusの画面から許可してあげる でしたwww

すげえバカでしたが、まあよしとする。

一応なのですが、adbサービスの再起動として、以下のコマンドを実行させます。

# 停止
> adb kill-server

# 起動
> adb start-server

ということで、もう一度デバイスの確認実行。

> adb devices

List of devices attached
xxxxxxxxxxxxxxxxxx        device

OK。

続いてOculusのIPを調べる。 無線LANなのでwlan数値を指定します。 ちなみにeth0は有線。

> adb shell ip addr show wlan0

出力された情報のinetの横にIPが確認できるかと思います。 おそらく192.168.xx.xxみたいに出てるかな?

adbでportを開放

portを開いていきます。 portの範囲は、5555~5585の範囲で奇数を指定したほうがよさそうです。 こちらがadb の仕組みです。

今回は公式で紹介されている通り5555で試します。

> adb tcpip 5555

これでUSBを介して、port5555でTCP/IP 接続をlistenするようにOculusを設定しました。

ここで、PCに接続しているOculusをUSBケーブルを抜きます

※ 接続切れている場合は、adb connect <IP>:5555 で接続にトライしてみてください。

Vysorの設定

ここまできたら、あとはVysor(バイザー)のインストールと設定のみです。

Vysorとは、ブラウザChromeで動くアプリケーションです。 スマホ画面をパソコンへミラーリングさせるアプリのようです。わたくし初見でした。

まず、ブラウザにインストールします。

Vysor - Chrome ウェブストア

すると、chrome://apps/ に追加されていると思います。

起動させます。

起動させたウィンドウ上部にOculusの接続が確認できていればOKです。 もし、確認できていなければ、Settingsの上にあるConnectボタンを押下。

コマンドプロンプトで確認したIPとportを指定して接続します。

これでOculus Goを開始すればミラーリングできているかと思います!!!!!

f:id:o21o21:20180601001606p:plain

自分では見えねえよってかんじですがww

Discordの画面共有で友人にみせてあげましたww

当人いわく、「画面見れてるよ!!! ただお前ほどの感動はない」

とのことでしたwww

やはりVRで見れないので、購入してVR体験してもいいかもしれませんね!!

次回は、Unityでのプロジェクト環境構築&作成考えています。

以上.

【terraform】"Error: Failed to load state" を解決する?!

今回は、Terraformについてです。

わたしがちょっとしたことでハマってしまったエラーについて、簡単ではありますが、メモがてら残したいと思います。

タイトルに"?!"と書いたのは、決定的な解決策?というか、 そもそも私のTerraformに関しての知見が足りないことでハマってしまったと思うので、ご了承ください。。。

また、完全な対応策というよりは、一時的な対応策になるので、そこもご了承ください。

(※完全にTerraformのstateファイルの挙動を理解していないので、わかり次第更新or新規で記事を投稿します!)

では、さっそく。

まえおき

Terraformでコマンドを叩いていたときのこと。

terraform planterraform applyなどなど

そしたらいきなり以下のエラーメッセージが表示されて、コマンドが叩けなくなってしまった。

Error: Failed to load state: Terraform 0.12.20 does not support state version 4, please update.

エラー内容的に、

Terraformのヴァージョン0.12.20は、stateファイル(.tfstate)のヴァージョン4をサポートしていません。アップデートしてください。

まあ、そのままなんだが、Terraformのヴァージョン0.12.20は、当時tfenvの最新ヴァージョンで、

前回実行したときのstateファイルにも、以下が記述され問題なさそう。

{
  "version": 4,
  "terraform_version": "0.12.20",
  "serial": 11,
.... 以下略 .... 

 調査

tfstateファイルは、手動で変更するのは推奨されてはいないので、手を加えたくありません。

同様に、ファイルを他のディレクトリにも移動させたくはありませんでした。

ググってみたところ、これしか近しいのが見つからず。。

github.com

と、ここで思ったこと。

思い当たる節

ちょっとした検証だったので、stateファイルはローカルで管理していました。

その際、.tfstateファイルをデフォルトの階層ではなく(terraform applyした階層)、.terraformに出力するようにしていました。

terraform {
  backend "local" { path = ".terraform/terraform.tfstate" }
}

.terraformディレクトリは、自動的に作成されるディレクトリなので、なーーんか怪しいかんじがしました。

一時的に対応

先に結論!

.tfstateファイルを移動させ、新たにterraform initする。

.terraformディレクトリから、違うディレクトリにstateファイルを移動させます。

この時、新たにディレクトリ作成してもいいし、backendで指定していたところを削除して、デフォルト状態にしてもいいと思います。

次に、コマンドterraform plan / applyをすると、以下のメッセージが表示されると思います。

Backend reinitialization required. Please run "terraform init".
Reason: Initial configuration of the requested backend "local"

The "backend" is the interface that Terraform uses to store state,
perform operations, etc. If this message is showing up, it means that the
Terraform configuration you're using is using a custom configuration for
the Terraform backend.

Changes to backend configurations require reinitialization. This allows
Terraform to setup the new configuration, copy existing state, etc. This is
only done during "terraform init". Please run that command now then try again.

If the change reason above is incorrect, please verify your configuration
hasn't changed and try again. At this point, no changes to your existing
configuration or state have been made.

Error: Initialization required. Please see the error message above.

tfstateファイルが意図したディレクトリにないので、バックエンドの初期化が必要とのこと。

なので、terraform initしましょうって書いてあります。

initする前に、前回applyを実行したときに反映したリソースを考慮します。

理由は、initコマンドを叩くとわかるのですが、以下を問われるかと思います。

$ terraform init

Initializing modules...

Initializing the backend...
Do you want to copy existing state to the new backend?
  Pre-existing state was found while migrating the previous "local" backend to the
  newly configured "local" backend. No existing state was found in the newly
  configured "local" backend. Do you want to copy this state to the new "local"
  backend? Enter "yes" to copy and "no" to start with an empty state.

  Enter a value: no

Successfully configured the backend "local"! Terraform will automatically
use this backend unless the backend configuration changes.

Initializing provider plugins...

Terraform has been successfully initialized!

簡単に訳すと、

設定された新しい"ローカル"バックエンドがあります。 新しく構成された"ローカル"バックエンドに既存の状態が見つかりませんでした。 コピーするには"yes"、空の状態で開始するには"no"を入力。

新しくstateファイルを管理するにあたって、"no"を選択する場合、

(おそらく)前回まで反映したリソースが反映してなかったことになります。

わたしの場合、そこまで重くないリソースを反映していたので、"no"を選択し完全に新規で管理することにしました。

terraform init実行!

イニシャライズ完了すれば一旦オーケーです。

ちょっと気になったこと

stateファイルに関しては、色んな記事で見かけますが、planファイルなるものが存在することも頭の片隅に入れておくべきかと思いました。

  • stateファイル -> terraformのリソースを管理
  • planファイル -> stateファイルを管理

planファイルは、terraform apply実行時に行われる一連の変更の説明や、stateファイルの配置場所を設定しているファイルになるのかと思います。

上記で説明したエラーに関連して、planファイルは.terraform/ディレクトリに自動生成されるようです。

もし、stateファイルをそのディレクトリに出力するようにしていると、ファイル名がおなじならどっちのファイルがどっちのファイルかわからなくなっていた、というわけです。

まとめ

まとめるほど、完全に理解できていないのですが、、、

一旦、.terraformディレクトリにはstateファイルを出力しないようにすることにしました。

ヴァージョン0.12系の記事も思ったよりなかったので、あまり下手なことはせずに管理するのもありかと思います。

もう少しアップデートが進んで、公式ドキュメントも充実してきたら色々とローカルでの管理方法を試してみようと思います。

それまでは、S3で管理したりするのがベターかな。

また、まとめなのに1つ疑問が。。。

私は新たにディレクトリを作成し、backendで指定し管理したのですが、コマンドを(plan)を叩くと成功はするですが、

新しく作成したディレクトリと、なぜか.terraformディレクトリと2つのstateファイルが作成されました。。。

なんなんだこれ。。。

(stateファイルとplanファイルがあると書かれている英語の記事を見つけました。。)

これは後ほど調査してみたいと思います。

あんまりまとまっていない内容でしたが、

以上.

【Python】pyenv installでインストールできなかった話... →解決!!

今回はPythonのヴァージョン管理ツール、pyenvです。

前回の記事同様、環境としてはWindowsのWSL(Ubuntu)でゴニョゴニョしていました。

この記事もtipsのみで、記事内容は短いのであしからず!

まえおき

WindowsのWSL、Ubuntu18.04を使用していました。

Pythonがちょっと必要になったので、定番のpyenvをインストール!

インストール自体は問題なく、いつも通りpyenv install <version> と!

そしたら以下。

curl: (7) Failed to connect to www.python.org port 443: Connection refused
error: failed to download Python-3.7.6.tar.xz

あれーーー、プロキシの設定はしてあるはずなのに、なんでだろう~。。。

この前の記事でも少し紹介しました、WSLでの環境設定でプロキシサーバーがある場合、

ちょっと設定をしてあげる必要があったので、設定はしたはず。

o21o21.hatenablog.jp

ちょっとエラーをみてみる

まあ、それはそうと、まずエラーの確認から。

curl: (7) Failed to connect to www.python.org port 443: Connection refused
error: failed to download Python-3.7.6.tar.xz

叩いたコマンドは、pyenv install 3.7.6 --verbose

--verboseは、インストールするときの詳細を表示してくれるオプションです。

うん、pyenvはcurlを使っているのね。なんか通信が外に出られていないのねってこと。

curlの場合、プロキシ設定として、ホームディレクトリに.curlrcというファイルを作成し、

ファイルを以下のように記述します。

proxy-user = "(user_name):(pwd)"
proxy = "http://proxy.xxx.co.jp:(port)"

では、単純にcurlを叩いてみる。(この前通ることは確認したばかりなのになーー。。。)

結果、やはりcurlはちゃんと外に出られているようです。(レスポンスが返ってきました)

.basrc.bash_profileにもプロキシの設定はしてあります。

ええーーーなんでだーー

解決策

あーだこうだ考えたり、試したり、ググってみたところ、以下のコマンドで通りました。

$  https_proxy=http://proxy.xxx.co.jp:8080 pyenv install 3.7.6

なんか.curlrcに記述してあるproxyより、pyenvがcurlを呼んだときにhttpsが自動的に押し付けられるかんじになるのかな?

ちょっとまだ調べきれてないですが、完全にわかったらまた更新しようと思います。

取り急ぎ、以上

【Terraform】Windows(WSL)に、tfenvをインストール!

今回もWindows系です。

まえおき

Terraformを使用するにあたって、バージョン管理が必要ですね。

そのままインストールしてもいいと思いますが、後々のことを考えたり、

チームメンバーとの環境を合わせるにあたっても、バージョンの管理は必須です。

MacOSの方だと、brewで簡単にインストールできるみたいですが、

Windowsだとそんなに記事がなかったので、ただのインストールのみの記事ですが、メモがてら残しまーす。

今回は、WindowsWSLでインストールしてみようと思います。

WSLについては過去記事に少しあるので、なんか参考になればと思います!

o21o21.hatenablog.jp

o21o21.hatenablog.jp

tfenv

Terraformのバージョン管理は、tfenvが一般的みたいです。

github.com

Githubにあるので、単純にgit cloneしてくるだけです!

導入

まず、ホームディレクトリにクローンします。

$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv

.bash_profileにパスを通します。

export PATH="$HOME/.tfenv/bin:$PATH"

反映もわすれずに。

$ source .bash_profile

確認してみます。

$ tfenv -v

tfenv 2.0.0-alpha3-2-ge36f027

これでおkですね!あっさりインストールできました。

コマンド色々メモ

tfenvの最低限のコマンドをメモします。

# インストールしたバージョンを表示
$ tfenv list

# インストール可能なヴァージョンを表示
$ tfenv list-remote

# ヴァージョンを指定してインストール
$ tfenv install <version>

※ 最初のインストールで、エラーが発生。
WSL(Ubuntu)で、unzipをインストールしてないことが原因でしたので、以下を実行。
$ sudo apt-get unzip

# バージョンの切り替え
$ tfenv use 0.12.20

Switching to v0.12.20
Switching completed

以上.

【Windows】Dokcer + WSL + VSCodeが楽!

昨日に引き続いて、Windowsの開発環境がテーマです!

今回はそんなに内容がありませんが、Windowsでの開発がそんなになかったので

自分のデフォルト的な設定を残しがてら記事を書きます。

WSLからWindows for Dockerを操作

前回の記事で少し詳しい内容を書きました!

o21o21.hatenablog.jp

Linux操作に慣れてる人にとっては、だいぶ良い環境になると思います!

ただ、ヴァージョンアップなど、ある程度自由にできない環境だとちょっと環境設定のときに試行錯誤が必要かもしれません。

↑上記の設定が済んだあと、エディタはどうすればいいのかと思いました。

エディタ

わたしの場合、vimも好きなので、そのままWSLの方でvimの設定を少しすれば使用できるので、

すごく困るわけではないのです。

が、

エディタを使用したデバッグなど、エディタのプラグイン的なので便利に利用できるものも多いはずです。

ここでは、VSCodeを紹介しておきます!

code.visualstudio.com

まだWSL+VSCodeを駆使してがっつり開発している段階ではないですが、すごく楽な拡張機能を見つけたので、残しておきます。

WSLのプロジェクトに接続

WSLからWindowsのDockerを操作できることはよかったので、

今度は、git cloneなどでプロジェクトをクローンしてきたプロジェクトフォルダを簡単に開けないものか。。。

ということで、VSCodeのこのプラグイン

Remote Development !!

拡張機能の検索から、↑で調べます。

インストールしたら、左のメニューの "リモート エクスプローラー" を選択します。

そうすると、"WSL TARGETS" という項目が自動的に表示されています。

接続したので、そのままフォルダを開けば大丈夫です!

いやーーーーー、ほんとに便利です!

ものの1分もかからずにWSLのプロジェクトを開くことができました!!

以上.

marketplace.visualstudio.com

【Windows】WSLからDocker for Windowsを操作する設定メモ

今回は、仮想環境のちょっとした記事です。

Windows10で、Dockerをインストールしたのはいいけど、

Windowsコマンドプロンプトの操作から脱出したかったのがきっかけでした。(別にWindowsが嫌いとかではもちろんなく、ただ使い慣れた環境操作が良かった!笑)

なので、Windows標準で使用できるWindows Subsystem for Linux (WSL)で、

WindowsにインストールしたDockerを操作できるようにしたメモ記事です!

細かい個々のツールに関しては解説はしません。 不具合があった際は、適宜ヴァージョンなどを確認してみてください!

では、さっそく。

環境

  • Windows10 : version 1903
  • Docker (Windows側: 19.03.5, WSL側: 18.09.7)
  • docker-compose (Windows側: 1.25.2, WSL側: 1.25.3)
  • WSL(Ubuntu) : 18.04
  • apt: 1.6.10

Windows

Dockerをインストールしていく

まずは、公式からDockerをインストールします。

※インストールには、Dockerのアカウントが必要かもしれません。

手順通りインストールすれば問題ないでしょう。

docs.docker.com

インストールが完了したら、コマンドプロンプトを立ち上げて、以下を実行してみます。

> docker -v
Docker version 19.03.5, build 633a0ea

> docker-compose -v
docker-compose version 1.25.2, build 698e2846

ヴァージョンが表示されればおkです。

試しにhello-world(docker run hello-world)もやってみたくなりますが、わたしは敢えてスキップしました。

別に今やってもいいのですが、あとでWSLからdocker ps -a でコンテナがあるか確認します。 特に意味はないのですが、WSLにもWindowsにもコンテナが今はないほうがスッキリするだけです笑

プロキシの設定をする

社内環境などで使用する場合、プロキシの設定をしないとDockerが外へ出ることができません。

なので、もし必要な場合が設定をしましょう。

  1. タスクバーにあるDockerをクリック
  2. Settings
  3. Resources-> PROXIES
  4. 環境に合わせてプロキシサーバーのURLを入力 (ex.. hoge.proxy.co.jp:8080)
  5. 入力したら、"Apply&Restart"

Cドライブをマウント

こちらもDockerのSettingsから確認できます。

  1. タスクバーにあるDockerをクリック
  2. Settings
  3. Resources-> FIRE SHARING
  4. "C" にチェック
  5. 入力したら、"Apply&Restart"

WSLからDocker for Windowsのデーモンを呼び出す設定

こちらもDockerのSettingsから確認できます。

  1. タスクバーにあるDockerをクリック
  2. Settings
  3. General
  4. "Expose daemon on tcp://localhost:2375 without TLS" にチェック
  5. 入力したら、"Apply&Restart"

WSL側

WSLを立ち上げて設定やらインストールやらしていきます。

.bashrc

.bashrcに以下を追記します。

DOCKER_HOST=tcp://localhost:2375

もし、.bashrcを今回新規作成していたら、.bash_profileに以下を追記します。

if [[ -f ~/.bashrc ]] ; then
    . ~/.bashrc
fi

プロキシ

もしプロキシサーバーがあれば、以下を設定していきます。

aptの設定

もしapt.confというファイルがなければ作成します。

$ sudo vim /etc/apt/apt.conf

# 以下を追記 (ドメインのところはご自身のものに編集)
Acquire::http::Proxy "http://hoge.foo.com:8080";
Acquire::http::Proxy "https://hoge.foo.com:8080";

curlの設定

ホームディレクトリに.curlrcファイルを作成し、編集する。

$ vim .curlrc

# 以下を追記 (ドメインのところはご自身のものに編集)
proxy = http://hoge.proxy.co.jp:8080

Dockerのインストール

今回のわたしの環境は、Ubuntuです。

公式にUbuntuへのDockerのインストールがあるので、参考にします。

Get Docker Engine - Community for Ubuntu | Docker Documentation

公式に手順があるので、ここではざっくりとした手順のみ記述します。

# アップデート
$ sudo apt-get update

# aptがHTTPS経由でリポジトリを使用できるようにする
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# Dockerの公式GPGキーを追加
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# フィンガープリントを確認
$ sudo apt-key fingerprint 0EBFCD88

# リポジトリの設定
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# 再度アップデート
$ sudo apt-get update
  • GPGキーとは?

GPG(GNU Privacy Gard)とは、暗号化・復号化のツールのキー。Dockerのパッケージを復号化するために使用します。

  • add-apt-repository

aptのリポジトリというものがあります。リポジトリは複数あり、リポジトリを設定することでそのリポジトリからパッケージをインストールすることができます。 今回の設定では、Dockerをインストールするために、stableを選択しました。

続いて、Dockerをインストールしていきますが、

わたしがインストールしていくとき、公式のコマンドでエラーが出てしまいました。

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

docker-ceがどうしてもインストールできませんでした。docker-ceは、コミュニティヴァージョン(無償)です。

まだ、きちんと確認できてはいないのですが、エラーをみるとdocker.ioをインストールしろとのこと。

ここで疑問が浮かび上がりました。

docker-ceとdocker.ioの違いとは?

先程も書いたとおり、docker-ceは世間一般で言うDockerのことらしい。

docker-eeは有償版らしい。

docker.ioUbuntuがメンテナンスしているパッケージのことらしい。

What is the difference between docker-engine and docker.io packages? - Quora

インストール(docker.io)

つまり、エラーのとおり、UbuntuでDockerをインストールしたい場合は、パッケージ名としてdocker.ioを指定するといいのかもしれない。

$ sudo apt-get install docker.io

docker-composeをインストール

docker-composeをインストールする。

docs.docker.com

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

# 確認
$ docker-compose -v

WSLの再起動

WSLを再起動をします。

これをしないとうまく設定が反映されないと思うので、実行します。

このコマンドは、PC自体を再起動しなくとも、WSLのみ再起動させることができるので、便利です!

WSLのウィンドウを閉じるだけでは、再起動していることにならないので、注意してください!

> net stop LxssManager
> net start LxssManager

確認

確認の方法はどうでもいいと思うのですが、この記事の冒頭で書いたとおり、

Windows側のコマンドプロンプト> docker run hello-world をして、hello-worldのイメージとコンテナが作成されるはずです。

Dockerの簡単なコマンドです。

# コンテナを全て表示
$ docker ps -a

# 稼働中のコンテナを表示
$ docker ps

# イメージを表示
$ docker images

runさせたら、Windowsコマンドプロンプトでコンテナを確認します。

次は、WSLの方で、Windows側で作成されたコンテナとイメージが確認できるかdocker ps -a を叩いて確認してみましょう。

無事、コンテナが確認できたらおkです!!

以上.

【Linux】Windows + VirtualBox(Vagrant) + CentOS (+ Proxy)

だいぶ期間が空いてしまいた。。。

アルゴリズムシリーズもまた更新したいのですが、

今回がWindowsでの仮想環境構築についてメモがてら記事を書きました。

まえおき

いつもはMac(MacOS)メインで使用していますが、Windowsを使用する機会があったので、

今回はWindowsが前提になります。

仮想環境構築ということで、VirtualBoxVagrantをインストールし、CentOSのイメージを対象にしました。

また、あるある?なのかわかりませんが、

転職やらで新しい会社に入社したときとかに、よく社内のネットワークの都合でプロキシサーバー(Proxy)が配置されているかと思います。

私自身、あまりWindowsでプロキシサーバーを経由した仮想環境の構築する機会がなかったので、 記事にして残しておこうと思います。

各ツールの解説がこの記事では割愛させて頂きます!(過去記事に説明している記事もありますので!)

では、さっそく!!

※ 前提: Windows10

VirtualBox

まず、VirtualBoxをインストールします。

公式ページからダウンロードします。

Downloads – Oracle VM VirtualBox

公式ページでは、最新のヴァージョンがダウンロードできます。

が、後でインストールするVagrantとのヴァージョンの関係でうまく機能しない場合があります。

No usable default provider could be found for your system.

Vagrant relies on interactions with 3rd party systems, known as
"providers", to provide Vagrant with resources to run development
environments. Examples are VirtualBox, VMware, Hyper-V.

・・・・・略

あとでダウングレードするのも手間なので、ヴァージョンの確認or少し前のヴァージョンをインストールしてもいいかもしれません。

過去のヴァージョンは以下から。

Download_Old_Builds – Oracle VM VirtualBox

手順に沿ってダウンロードすればOK。

Vagrant

続いて、Vagarantをインストールします。

Vagrantも公式から

Download - Vagrant by HashiCorp

手順に沿ってインストールすれば問題ありません。

CentOS

続いては、仮想環境となるOSのイメージになるファイルを選択します。

Vagrantをインストールしているので、直接サイトにいってダウンロードする必要はありませんが、 VirtualBoxでポチポチして進めたい場合は、以下を参考にしてください!

ポチポチしない場合は、この項目↓は読み飛ばして大丈夫です。

この記事では、CentOS 7系を選択します。

今回はboxファイルをダウンロードしてみます。

なので、拡張子が .box のものをダウンロードしてください。

A list of base boxes for Vagrant - Vagrantbox.es

また、他の拡張子だと以下から確認できます。

virtualbox centos インストール などでググればたくさん出てきますので、CentOSの細かいヴァージョンなど指定がある場合は調査してみてください。

CentOSの公式ページは以下です。 ( CentOS Linux DVD ISO の方を選択して、ダウンロードへ )

Download CentOS

ここでは、以下のURLから過去のヴァージョンを確認&ダウンロードできます。

http://archive.kernel.org/centos-vault/

# パスの例
http://archive.kernel.org/centos-vault/7.6.1810/isos/x86_64/

コマンドプロンプトで作業

Boxの追加

コマンドプロンプトを開きます。

以下を実行して、boxを登録します。 <name> は任意の名前で大丈夫です。わかりやすい名前をつけると後で楽です笑

# 基本
> vagrant box add <name> <box_file_url>

# 例
> vagrant box add centos7.0 https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box

以下から対象ヴァージョンのURLを確認。 A list of base boxes for Vagrant - Vagrantbox.es

少し時間がかかるかもしれません。

できるだけネットワーク環境の良いところで実行することをオススメします!

Boxの確認

正常にインストールできれば、以下のコマンドで確認できます。

> vagrant box list

centos7.0 (virtualbox, 0)

Vagrantfileの作成

Vagrantfileというファイルを作成します。

仮想環境の設定を記述するために必要なので、必ず以下を実行します。

# 基本
> vagrant init <name>

# 例
> vagrant init centos7.0

Vagrantfileの編集

ここでは必要最低限の編集のみです。

# Create a private network, which allows host-only access to the machine
# using a specific IP.
config.vm.network "private_network", ip: "192.168.XX.XX"        ## ← ここをアンコメント

・・・・略

# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
config.vm.provider "virtualbox" do |vb|                                 ## ← ここをアンコメント
#   # Display the VirtualBox GUI when booting the machine
#   vb.gui = true
#
#   # Customize the amount of memory on the VM:
#   vb.memory = "1024"
     vb.customize ["modifyvm", :id, "--memory", "2048"]         ## ← ここを追記
end                                                                                          ## ← ここをアンコメント
#
# View the documentation for the provider you are using for more
# information on available options.

config.vm.network "private_network" のIPですが、ホスト(Windows)から確認できるIPを指定します。

このIPはWindowsコマンドプロンプトで、確認することができます。

> ipconfig

イーサネット アダプター VirtualBox Host-Only Network #3:

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::xxxx:f1ed:xxxx:4bxx%53
   IPv4 アドレス . . . . . . . . . . . .: 192.168.25.1                    ## ← これに値する
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .:

仮想環境の立ち上げ

ここでもvagrantのコマンドで仮想環境をたちあげます。

> vagrant up

このとき、ERRORなどの単語に注意してください。 ここではエラー対処の方法は説明しません。

RLoginで接続

使い慣れたエミュレータがいいと思いますが、なんとなくRLoginを使ってみたいと思います。笑

WindowsにはコマンドプロンプトやWSLなどありますが、あまり詳しくないのでここでは無視させてください笑

rlogin/telnet/ssh(クライアント)ターミナルソフト

詳しい使い方はググってみてください!

ファイル→ サーバーに接続→

ログイン名 / パスワードorパスフレーズは、vagrantを指定。

ホスト名は、Vagrantfileで指定したprivate_networkのIPを入力。

上記を入力して、SSHで接続します。(vagrant upしたあとで)

色々確認

無事にCentOSに接続できたら、外に(インターネット)接続できるか確認したりします。

冒頭で述べたように、会社のプロキシサーバーなどで、かんたんにインターネットに接続できない場合があります。

そうなると何かツールをダウンロードしたり、yumがアップデートできなかったりして、そもそも仮想環境の意味がなくなってしまいます。。。笑

ここでは、非常に最低限なプロキシサーバーを経由した設定をちょっと紹介できたらと思います。

イメージ的にはこんな↓

f:id:o21o21:20200117153900p:plain

適当な図で申し訳ないですが、、

では、CentOSないでの確認です。

CentOS6系と7系でコマンドなどに違いがあります!ご注意ください!

言語設定

# 言語設定確認
$ localectl 

# 日本語に設定
$ localectl set-locale LANG=ja_JP.utf8

# 英語に設定
$ localectl set-locale LANG=en_US.UTF-8

ログイン後、反映されます。

ping / curl

pingcurlで外に出られるのか確認してみます。

$ ping www.yahoo.co.jp
$ ping www.google.co.jp

$ curl <your_proxy>

意外と重要です!笑

なにか設定を変更してしまう前に、単純な方法でどこまで到達できるのか確認してみるのもありです!

NetworkManagerとNetwork Initscript

CentOSでは、nmtuinmcliというコマンドを使用して、NetworkManagerを操ります。

nmtuiはメニュー方式で簡易で操作、nmcliはコマンド形式で ネットワーク設定ができるようになっているようです。

NetworkManagerとは、ネットワークを動的に設定できるサービスです。

RHEL6とRHEL7でネットワークの管理方法が変わってきているようでした。(知るの今更感…)

ここではnmtuiコマンドを詳しく説明はしませんが、CentOS6と7系とで、大きく変わったコマンドがあります。

service(CentOS6)systemctl(CentOS7)です。

主になにかのサービス(ツール)を起動させたり、停止させたりするのに多様されています。

# 6系: 例
$ service httpd start

# 7系: 例
$ systemctl start httpd

これは覚えておくといいでしょう!

ググっていて、あれ?このコマンド使えないじゃん!とか、 この人の環境は6系か!など環境の記載がない場合などに気づきます笑

ちょっとNetworkManagerからそれてしまいましたが、CentOSでは6からNetworkManagerがネットワークの設定サービスとして採用されています。

ググってみると、NetworkManagerの停止 などが多く記事でありますが、まず無用に停止させないで状態を確認してみましょう。

$ systemctl status network

network.service - LSB: Bring up/down networking
   Loaded: loaded (/etc/rc.d/init.d/network)
   Active: active (exited) since 月 20XX-01-01 12:12:45 JST; 4h 47min ago

$ systemctl status NetworkManager

NetworkManager.service - Network Manager
   Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled)
   Active: active (running) since 月 20XX-01-01 1212:45 JST; 4h 47min ago
 Main PID: 4245 (NetworkManager)
   CGroup: /system.slice/NetworkManager.service
           ├─4245 /usr/sbin/NetworkManager --no-daemon
           └─4262 /sbin/dhclient -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-enp0s3.pid -lf /var/lib/NetworkManager/d...

以下を参考にして、まずどのようなネットワークを構成させればいいのか考慮します。

access.redhat.com

yum.conf

わたしの場合、デフォルトではyumコマンドが機能しませんでした。

なので、/etc/yum.confに以下を追記します。

[main]
proxy=http://<your_proxy:port>

こうすることで、yumが機能するかもしれません。

その他

VirtualBoxの設定にも、あらかじめプロキシー設定のメニューが用意されています。

ファイル→ 環境設定→ プロキシー→ 手動プロキシー設定

また、上記のメニューで、ホストのプロキシー設定を自動検出というものもあります。

ホストはここでいうWindowsになるので、Windows環境変数に設定しておくのもありかもしれません。(ちょっとこの自動検出がどこまでなのか調べていないので、なんとも言えません、、、)

コマンドプロンプト環境変数を確認してみましょう。

> set
略・・・
HTTPS_PROXY=http://<your_proxy>
HTTP_PROXY=http://<your_proxy>
略・・・

まとめ

かなりざっくりしたかんじになりましたが、とりあえず状態を先に確認してみることが重要です。

むやみに調べたコマンドを実行し、なにが変更されたのかわからない状態は避けていきたいですね。ネットワークなので、そもそもインターネットに接続できなければ、仮想環境を構築した意味もなくなってしまいます。

ヴァージョンやコマンド、ファイルの情報を調べて少しずつ進めていけたらOKです^ ^

以上.

#2 【アルゴリズム】頭の体操! 0やロジカルシンキングについて再入門

#2 のテーマは、頭の体操です笑

と、いっても数学の領域全体ですと、扱いきれないほど覚えることがあるので、

ここでは、エンジニアとして重要な考え方などを取り扱っていきます。

実用的な数学を解説するというよりか、考え方寄りのお話になってくると思います。

実践的な数学は、各アルゴリズムをみていくときに一緒に解説できたらと思っています。

なので、それまでに頭を柔らかくするためのものか〜くらいに思って頂けると嬉しいです!

※数学得意!って方向けではありませんのでご了承のほど。 

参考にするのは、こちらの本。

プログラマの数学第2版

また、このブログのシリーズの目次は以下。

o21o21.hatenablog.jp

前提

この記事でいう数学の体操とは、

プログラマ、エンジニアには数学が必要か?」とか

加減乗除は前提で、線形代数微分積分などが必要」とか

そういったことではありません。

どちらかというと、こういう見方で数字をみてみよう!みたいなノリです。

説明に不足してしまう部分もありますが、ご了承のほどよろしくお願い致します!

ロジカルシンキング

嫌というほど見聞きするであろう、ロジカルシンキング(論理的思考/論理思考)

「筋道が立っている、筋が通っている考え方」

主にこういうふうに理解されているはずです。

わたしは、小さい頃から「なんで?なんで?」と両親に言い過ぎて叱られた記憶しかないですw

疑問を持って、ある問題から分岐した問題をさらに深堀りしていき、道筋を追い、適切な根拠付けを行うことは重要です。

また、数学的/エンジニア的な側面でどのように活かすのか考えてみます。

MECE

数学の問題(数学でなくともなにかの問題でも可)、出題された問題では、まず問題を理解することが重要です。

すなわち、述べられている事実を正確に読み解くことが重要だと思います。

問題を考えているうちに、余計なことを考えてしまうと、解決に至るまでの時間が長くなってしまったりします。

なので、正確に問題を表現する手法として、MECE(Mutually Exclusive and Collectively Exhaustive)という考え方が存在します。(ミースと読むらしい)

難しい単語が出てきましが、まったく難しくありません。むしろ日頃からやっているかもしれません。

要は、"重複なく・漏れなく" という意味です。

言葉だとイメージがわかないので、コードで例をみてみます。

age = 20

if age >= 20:
    print('OK, U can drink!!')
else:
    print('Sorry, U can not drink...')

これを実行すると、"OK, U can drink!!'"と出力されます。

なんてことないですね!20歳以上になれば、お酒飲めますよーって単純なことです。

こんな単純な例ですが、ここで考えたいのでは、重複漏れになります。

人間の年齢というのは、19歳と20歳同時になっている瞬間というのはありません(= 1人の人間は年齢の重複はない)。

これは年齢単位でグルーピングしていることになります。

しかし、この例は日本に限る話であり、世界の国々では飲酒できる年齢は様々です。

例えば、アメリカでは飲酒できる年齢は、州ごとに違います。また、ブラジルでは18歳からの飲酒がOKです。

一旦、表にしてみます。

country 飲酒できる年齢
日本 20歳以上
アメリ 州によって異なる
ブラジル 18歳以上

2つ国が増えたことで、先程のコードは適用できなくなりますね。

集合を使う?

例えば、先程のコードで、修正するとしたらifand 条件をたす方法もあるかもしれませんね。

こんなかんじに。

if age >= 20 and country == 'Japan': 

あるときはこれでいいかもしれません。

でも、あるときはこれではバグを生む原因になりかねません。

ここで推したいのは、何回もいいますが、重複と漏れです。

例えば仕様の変更で、扱う国が増えたら大幅なコードの修正になるかもしれません。

また、条件が足された場合も、考慮する点が増えてきます。

なので、まず落ち着いて関係性を表現してみます。

どういう風に表現するかというと、集合(ベン図)です。

学生のときに散々みた、これです。(この図は、例を表してはいません。)

f:id:o21o21:20190918165929p:plain:w400

ちょっと手間かもしれませんが、このベン図を利用して考え方を固めていきます。

ちょっと例を参考に問題っぽいのを。

とあるエンジニア100人に飲酒・喫煙アンケートをとりました。
日本人のエンジニアで喫煙は10人、飲酒は20人。
アメリカ人のエンジニアで喫煙は7人、飲酒は30人。
また、両方と答えたのは、日本人は4人、アメリカ人は2人。
両方しないのは、何人でしょうか?

色々と数字が出てきましが、ベン図にしてみればシンプルに。

ちょっとみにくいですが、、

f:id:o21o21:20190918174322p:plain:w400

ここで以下のような式がたてられますね!

日本人: (10 + 20) - 4

アメリカ人: (7 + 30) - 2

26 + 35 + x = 100
26 + 35 -100  = x
61 = x
x = 61

一気に集合の話になってしましましたが、

個々の関係を(排他的(Exclusive)に)確認するということが大事です。

進法

ちょっとテーマを変えます。

コンピュータでは、基本的に2進数が使われています。

2進数は、01で表現されています。

人間が主に使用しているのは、10進数ですね。

進数(進法)について詳しく知りたい方は、以下の過去記事にて参考にしてみてください!

o21o21.hatenablog.jp

どうして進数について記述するのかというと、0(ゼロ)の認識について簡単に説明したいからです。

0とは?

私自身、改めて0に対しての気づきがありましたので、是非ここでその気付きを記述したいと思います。

※ この本(プログラマの数学第2版)を参考にしています。

エンジニアとして0は特に馴染みのある数字だと思います。

0からはじまるのが当たり前ですよね。

また、日常的に0は何もないことを表現するのに使いますね。

間違ってはいませんし、これからもそうだと思います。

ですが、少し見方を変えてみようと思います。

102

これは10の2乗ですね。(累乗an)

102 = 100 ですね。

では、これはどうでしょう?

100

101は、10です。

指数が0の場合は?

学校で累乗を習う場合、10をn回掛けたのが答えという風に考えるかもしれません。

間違ってはいませんが、指数が0や-1となった場合、少々シンプルに物事が考えられないかもしれません。

先に答えを。

100 = 1 となります。

どういう風に考えるかというと、

1/10(10分の1)ずつ増減する」ということです。

指数が-1でも、10-1 = 1/10と即答えを見つけ出すことが可能です。

場所を確保する

さて、0の話をしているのに累乗や進法の話になりました。

意味のない話ではありません。

10進数で、1051という数字があったとします。

百の位は0です。百に位はないと表現していますが、実はこれ

「千の位が落ちてこないように支えている」という認識にしてみましょう。

0が"ない"という意味であれば、1051ではなく、151と表してもいいことになってしまいます。

つまり、「0は、場所を確保している」という見方をしてみてください。

もう少しイメージをエンジニアらしく掘り下げていきます。

(例えが下手で申し訳ないです、、、笑)

お酒を飲むのが大好きな人がいたとします。

でも、毎日飲んでいては健康に悪いので、5日に1回は休肝日を設けるようにお医者さんに言われてしまいました。

5日に1回のサイクルを繰り返しているのは、お酒好きには大変です。

なので、奥さんがノンアルビールを用意したのです。

これで、5日1回を気にせず、毎日飲むというシンプルなルールになりました。

(ノンアルビールはビールと違う!というのはさておきw)

つまりは、パターンのシンプル化を行えるということに着目して下さい!笑

0は、ノンアルビール同様、あるパターンをシンプル化する要素を持ち合わせているんだって頭の片隅に覚えておけばいいでしょう。

まとめ

簡単にはなってしまいますが、少し頭の体操になれば幸いです。

まだ、定性的なお話が多いですが、次回は #1 であげたアルゴリズムの中から1つだけ例にとってコード化してみたいと思います。

わたし自身もまだまだ勉強不足、、勉強しながらということで、シリーズに前後あるかもしれませんが、ご了承願いますm( )m

以上

o21o21.hatenablog.jp

前回の記事

o21o21.hatenablog.jp