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でのプロジェクト環境構築&作成考えています。

以上.

【LXD】爆速でLXD環境を構築する!!

LXDとは?

コンテナと言えばDockerが有名ですが、LXDというシステムコンテナマネージャーもあります。

イメージとしては、仮想マシンと認識していれば大丈夫でしょう。 LXDを使用すれば、多数のKinuxディストリビューションを使用し、容易に開発環境が構築できます。

無料で利用できることや、起動が高速なこと、Dockerを利用する際の1コンテナ1プロセスといったベストプラクティスはないのが特徴でしょうか。

ググってみると、"LXC"という単語もヒットしますが、これはLXDの機能強化前のものです。 なので、LXDでできることはLXCでも実現可能です。

使ってみる

ここでは、とりあえず早くローカル環境にLXDを構築し、試しにCentOSのコンテナをたててみることを目的としています。

(※ VirtualBoxなどのインストール方法は割愛していきます。)

わたしの環境は、macOSです。

用意する

VirtualBox

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

Downloads – Oracle VM VirtualBox

vagrant

vagrantもインストールしておきます。

Download - Vagrant by HashiCorp

Boxの追加

UbuntuのBoxをインストールします。

ubuntu - Vagrant Cloud

推奨されているのは、xenial64ですがお好きなメーカーのヴァージョンを選択します。

選択したらURLを控えましょう。控えたら、以下のように修正します。

https://vagrantcloud.com/ubuntu/boxes/<xenial64>/versions/<20170929.0.0>/providers/virtualbox.box
※ "<>"で囲んだ部分が任意のものに変わります。

任意のディレクトリに移動し、以下を実行します。 ボックスの追加には、時間がかかるかもしれません。

$ vagrant box add ubuntu/xenial64 https://vagrantcloud.com/ubuntu/boxes/xenial64/versions/20170929.0.0/providers/virtualbox.box
$ vagrant init ubuntu/xenia164
※ ボックスの名前など、コマンドのオプションで指定可能


# vagrantコマンドで、ubuntuを起動
$ vagrant up

VagrantFIleが作成されていて、エラーが出ていなければ順調です。

LXDのインストール

Ubuntuに入って、lxdをsnapを使用してインストールします。

$ vagrnat ssh


## 以下、Ubuntuでの実行


# 最新にアップデート
$ sudo apt update


# インストール
$ sudo su - 
$ snap install lxd


# vagrantユーザーでもlxcコマンドが使用できるようにする(任意)
$ sudo gpasswd -a vagrant lxd 
$ id                     ## 確認
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),110(lxd) 

LXDが動くか確認

なにも起動させていないので、空の表だけでればOK。

# コンテナ&イメージ確認
$ lxc list
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |


$ lxc image list
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCH | SIZE | UPLOAD DATE |

LXDの初期設定

コンテナの起動の前に、設定をしてきます。 ここでは、細かい設定方法は省きます。

ただし、IPv6の設定のみnoを選択し、他はデフォルトを選択していきます。

# vagrantユーザーに戻っても、rootで実行しても大丈夫ですが、
# ここでは、vagrantユーザーで実行

# 途中の設定項目で、UIが変わって紫色の画面に移行しますが、表示されたIPなどをEnterで選択していきます。
$ sudo lxd init


LXD has been successfully configured.   ##  これが出たら完了

CentOSのコンテナをたてる

# リモートから取得できるイメージを確認
$ lxc image alias list images: | grep centos
| centos/6                            | 8b47ce0dd288 |                       |
| centos/6/amd64                      | 8b47ce0dd288 |               |
| centos/6/default                    | 8b47ce0dd288 |                 |
| centos/6/default/amd64              | 8b47ce0dd288 |         |
| centos/6/default/i386               | 4fc4ed167966 |             |
| centos/6/i386                       | 4fc4ed167966 |                   |
| centos/7                            | ef750fe8dd4c |                         |
| centos/7/amd64                      | ef750fe8dd4c |                 |
| centos/7/arm64                      | 2418b61d1c47 |               |
| centos/7/armhf                      | 4112b64d31c2 |                 |
| centos/7/default                    | ef750fe8dd4c |                    |
| centos/7/default/amd64              | ef750fe8dd4c |            |
| centos/7/default/arm64              | 2418b61d1c47 |          |
| centos/7/default/armhf              | 4112b64d31c2 |           |
| centos/7/default/i386               | 22f770b50316 |           |
| centos/7/default/ppc64el            | 91279dabc143 |        |
| centos/7/i386                       | 22f770b50316 |                |
| centos/7/ppc64el                    | 91279dabc143 |             |




# コンテナを起動 (今回はcentos/7を選択してみました)
$ lxc launch images:centos/7 centos7
Creating centos7
Starting centos7


# 確認 (作成されていればOK)
$ lxc list

これで完了です。

まとめ

Dockerとは違うコンテナを触ってみました。

私は業務の開発環境としても使用しています。(※ コスト面にも良いです笑 )

例えばAWSサービスを利用して、最小のインスタンスを建ててVPCにてセキュアなネットワークを構築。

LXDをインストールし、欲しい環境をインストール。

リモートからのアクセスを確立し、みんなで開発!

なんてことも、容易ですしVPCまわりをやったことない人にとっては勉強にもなりますし、みんなに喜んでもらえる環境にもなりそう!しかも、安い!

Ubuntuに依存してしまうということを除けば、扱いも共有も便利です。

作成した環境のイメージをエクスポートしたりすることも可能です。また、ホスト(自身のラップトップ)から、LXDで管理している環境に直でSSHすることも可能です。

LXDはDockerのイメージもありますので、コンテナonコンテナも可能。

Dockerよりは有名ではありませんが、この記事でやった環境を1回整えてしまえば開発も楽ちんですね!!

以上.

【AWS】かなり気になる! PartiQLを触ってみた! (入門)

今回は、2019年8月にAWS公式から発表された、

PartiQL を触ってみようと思います!

個人的にかなり気になるクエリ言語ですので、簡単にチュートリアル的な部分を見ていきます!

それでは、まずは概要からみていきましょう!

※ この記事を書いた当初の情報のみ記載しております。後ほどのアプデなどで変更されている点を考慮し、読んでください。

PartiQLとは??

一言で言うと、

データを効率的に問い合わせ可能にするSQL互換の問い合わせ言語 (引用: 下記ブログより)

らしいですな。

これはもしや.....

そう、会社でよくあるデータ移行や、先人達が勝手に(勝手ではないか!w)導入してきたDBなりファイルサーバー、またはデータをまとめたCSVファイル達を容易に操作できるものなのでは?

クエリエンジンがPartiQLをサポートしていれば、リレーショナルデータベース(トランザクションとアナリティクスのどちらも)、オープンなデータフォーマットの半構造化データや入れ子形式のデータ(Amazon S3データレイクなど)、そしてNoSQLのスキーマレスなデータや行ごとに異なる属性を持つことを許容するドキュメントデータベースなども対象となります。(引用: 下記ブログより)

やっぱり!!!これは期待できそうですね!

以下、公式の発表されたブログになります。(英語)

aws.amazon.com

f:id:o21o21:20190816105725p:plain

(図引用: 上記ブログより)

リリースの経緯

けっこう便利そうなサービス。

どうしてリリースしたのでしょうか?

これも上記ブログより引用ですが、Amazonの社内ではすでに使用されてるとのこと。

すごい。。。

ってことは、やはりEC事業として、部署間でのデータの相互性が問題だったのだろうか?

ブログの"Why we built it"に記載がありました。

Chris Suver率いるAmazonの小売事業は、SQLに似たクエリ言語を追求していた。

既存のSQLの知識を活かすようなものを開発する必要があったと書いてあります。

つまり、AWSはこれまでRDBなどたくさんのDBに関するサービスはリリースしてきたが、より互換性を保つために、

ネストされたデータや半構造化されたデータを処理するのに必要な能力を備えながら、SQLに非常に近いままで使用できるクエリ言語を開発したのでしょう。

PartiQLAWS(Amazon)社内の問題解決のために開発されたツールといってもいいでしょう。

非常に感激してしまいます。さすが世界の頭脳集団があつまっている組織です。

では、発表された特徴を見てみましょう。

特徴

  • SQL compatibility (SQLの互換性)
  • First-class nested data (ネストされたデータに特化)
  • Optional schema and query stability (オプションのスキーマとクエリの安定性)
  • Minimal extensions (最小限の拡張)
  • Format independence (フォーマットの独立)
  • Data store independence (データストアの独立)

なんとなくイメージできますかね?

とりあえず触れてみるのは良さそうです!

さわってみる

とりあえず触ってみよう!ということで、チュートリアル的なものがGithubにて公開されています。

インストールして動かしてみるところまでが、この記事のゴールです。

わたしの環境は、macOSです。 また、JVMがインストールされている環境であることが前提になります。

え!最近mac買ってまだJavaインストールしてないわ!

あ!OracleJDK有償化で手順違うやんけ!なんかめんどくさ!

って方は、以下の記事を参考にしてみてください!!

o21o21.hatenablog.jp

こちらPartQLの公式サイトです。

PartiQL

インストール

こちらより、手動でもwgetでもいいので、ローカルに展開します。

github.com

wgetをインストールしてない場合は、 $ brew install wgetwgetをインストールしましょう。

$ wget https://github.com/partiql/partiql-lang-kotlin/releases/download/v0.1.0-alpha/partiql-cli-0.1.0.tgz
$ tar -zxvf partiql-cli-0.1.0.tgz

$ ll
README  
Tutorial   # pdfおよびhtml形式のチュートリアルが含まれています。サブフォルダーコードには、3種類のファイルが含まれる
bin          # macOSおよびUnixシステム用の起動スクリプトpartiqlおよびWindowsシステム用のpartiql.batが含まれる
lib           # PartiQLの実行に必要なすべてのJavaライブラリ

起動してみる

では、PartiQLを起動してみます。

$ ./bin/partiql
Welcome to the PartiQL REPL!

PartiQL>

こんなかんじで起動できたらOKです!

OK! (0 ms) って出てくるのは、クセでEnterを連打すると出てくるようです。

これは、Enterを2回連打でクエリが実行される仕様なのだそうです。

終了は、ctr + d です。

ちょっと試してみる

チュートリアルにもあるのですが、少しクエリを実行してみます。

  • SELECTしてみる
PartiQL> SELECT * FROM [1,2,3]
   | 
===' 
<<
  {
    '_1': 1
  },
  {
    '_1': 2
  },
  {
    '_1': 3
  }
>>
--- 
OK! (114 ms)
  • ファイルを読み込む( -e )

Tutorialディレクトリにサンプルファイルをあります。

それを読み込んで、環境変数!global_envにロードされているものを参照することが可能です。

$ ./bin/partiql -e Tutorial/code/q1.env

Welcome to the PartiQL REPL!
PartiQL> !global_env
   | 
===' 
{
  'hr': {
    'employees': <<
      {
        'id': 3,
        'name': 'Bob Smith',
        'title': NULL
      },
      {
        'id': 4,
        'name': 'Susan Smith',
        'title': 'Dev Mgr'
      },
      {
        'id': 6,
        'name': 'Jane Smith',
        'title': 'Software Eng 2'
      }
    >>
  }
}
--- 
OK! (12 ms)

少しこのサンプルファイル(q1.env)の内容をみてます。

{ 
    'hr': { 
        'employees': <<
            -- a tuple is denoted by { ... } in the PartiQL data model
            { 'id': 3, 'name': 'Bob Smith',   'title': null }, 
            { 'id': 4, 'name': 'Susan Smith', 'title': 'Dev Mgr' },
            { 'id': 6, 'name': 'Jane Smith',  'title': 'Software Eng 2'}
        >>
    }
} 
  • このようなJSON形式のデータの場合、hr.employeesのようにしてテーブルとして扱いが可
  • --でコメントを記述
  • <<>>は、データが順不同のコレクション(バッグ)。コレクション=配列のようなイメージ(タブル間の順序はなし)
  • PartiQLリテラルは単一引用符で囲まれていますが、JSONリテラルは二重引用符で囲まれる
  • ↑ PartiQL( 'employees': <<..... )とJSON( "employees": [... )

では、上記のサンプルデータを元に参照してみます。

PartiQL> SELECT e.id, 
   | e.name AS employeeName, 
   | e.title AS title
   | FROM hr.employees e
   | WHERE e.title = 'Dev Mgr'
   | 
===' 
<<
  {
    'id': 4,
    'employeeName': 'Susan Smith',
    'title': 'Dev Mgr'
  }
>>
--- 
OK! (6 ms)

すごい!

  • ジョイン
PartiQL> SELECT e.id AS id, 
   | e.name AS employeeName,
   | e.title AS title,
   | p.name AS projectName
   | FROM hr.employeesNest AS e LEFT JOIN e.projects AS p
   | 
===' 
<<
  {
    'id': 3,
    'employeeName': 'Bob Smith',
    'title': NULL,
    'projectName': 'AWS Redshift Spectrum querying'
  },
  {
    'id': 3,
    'employeeName': 'Bob Smith',
    'title': NULL,
    'projectName': 'AWS Redshift security'
  },
  {
    'id': 3,
    'employeeName': 'Bob Smith',
    'title': NULL,
    'projectName': 'AWS Aurora security'
  },
  {
    'id': 4,
    'employeeName': 'Susan Smith',
    'title': 'Dev Mgr'
  },
  {
    'id': 6,
    'employeeName': 'Jane Smith',
    'title': 'Software Eng 2',
    'projectName': 'AWS Redshift security'
  }
>>
--- 
OK! (65 ms)

同様にして、サブクエリもできました!

まとめ

PartiQLのチュートリアルを元にして触ってみました。

データもサンプルデータをもとにして簡単に用意して色々触ることができそうです。

今後利用可能なAWSサービスもどんどんできてくると思うので、覚えておいて損はなさそうです。

学習コストもそんな高くないと思うので、今後の情報もキャッチアップしていくと良さそうです!

以上.

【Java】OpenJDK(無償)をmacOSにインストールする

今回は短い記事(メモ)です。

macOSJava(JVM)をインストールするといった内容になります。

どうして今頃Javaのインストールなのか

今年2019年にはいって、OracleJDKが有償化されました。(個人開発目的は無償)

なので、 macOS java インストール のように検索すると、

OracleJDKのインストール手順はけっこう出てくるのですが、OpenJDK の手順が出てこないので(別に記事自体少なくはないです!)今回メモとして残します!

個人開発(デモ目的)は無償となっていますが、なんかOracleのライセンス適用ログイン画面に遷移したり面倒なので、一気にOpenJDKに移行ということで残します。

OpenJDKをインストール

OpenJDK は無償です!

以下の公式サイトで、任意のヴァージョンを選択します。 ここでは12を選択しています。

http://jdk.java.net/12/

展開

$ tar xvzf <ダウンロードしたtarファイル>

ファイルの移動

$ sudo mv <展開したファイル> /Library/Java/JavaVirtualMachines/

環境変数の設定

$ export JAVA_HOME=`/usr/libexec/java_home -v <選択したヴァージョン 例: 12>`

確認

$ java -version

openjdk version "12.0.2" 2019-07-16
OpenJDK Runtime Environment (build 12.0.2+10)
OpenJDK 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing)

このようにヴァージョンの確認で、インストールしたヴァージョンがでてくれば完了です。

以上.

【ネットワーク】VPNについて簡単におさえる!!

今回はネットワーク系の記事になります。

主に VPN についてです。

IT業界にいなくとも、会社で1回は聞いたことがあったり、なにかは知らないけど利用はしている!なんて方は多いのではないでしょうか。

社外から社内へのネットワークにアクセスする際に利用している手段かもしれませんね。

合わせて、セキュアな通信を行うための手段についても簡単に書いていければと思います! (具体的な導入は除く)

VPNとは

VPN とは、「 Virtual Private Network 」を略したものです。

だいたいイメージはつくのではないでしょうか?

なんかプライベートとあるので、セキュリティ高めの通信方式かなんか?みたいな。

単純に言うと(wikipedia引用)、

インターネットに跨って、プライベートネットワークを拡張する技術、およびそのネットワークである。

f:id:o21o21:20190726120841p:plain

わたしはここで疑問に思ったことがあります。

「インターネットを経由するってことは、けっこう危ないんじゃね?」

単純のVPNときくとセキュリティ的に高めの印象を持ちますが、結局インターネットを経由するのであれば、怖い....

そこで、VPNには主に2種類の方法があるようです。

  • インターネットVPN
  • IP-VPN

インターネットVPNは、インターネット等のネットワークを利用したVPNのことです。

IP-VPNは、通信事業者などが提供している閉じられた(クローズド)ネットワークを介したVPNのことです。

これで少し疑問が解消されました。IP-VPNは第三者(拠点間以外)が提供している閉域網を利用して、よりセキュアな通信を可能にできそうです。

では、インターネットVPNの方はどんな接続方法があるのでしょうか?みていきます。

インターネットVPN

インターネットVPNには、2つの接続の仕方があるようです。

  • サイト間VPN
  • リモートアクセスVPN

サイト間VPNは、VPNを実装したルータ同士を接続する方法。

リモートアクセスVPNは、ラップトップやスマホなどの機器にインストールVPNにクライアントソフトを利用し拠点のLANに接続する方法。

なんとなくイメージできてきました。

例えば、本社から支社間の相互接続が必要な場合など、クライアントソフトウェアをインストールしないでネットワーク間をVPNゲートウェイを経由して接続するのが、サイト間VPN

VPNゲートウェイの役割として、送信トラフィックカプセル化する。また、暗号化も担当している。

そして、インターネットに構築してある(構築する必要がある)トンネルと呼ばれる仮想回路なるものを通過し、送信先VPNゲートウェイに送られる。

受け取り手であるVPNゲートウェイは、非カプセル化を行うことで、データが受け取れることになる。

では、リモートアクセスVPNの方はどうなるかというと、ユーザーはクライアントソフトのインストールが必要となる。

例えば、営業が社外からインターネット経由で社内のLANに安全にアクセスしたいときなどが考えられるでしょうか。近年では在宅勤務(リモートワーク)ではこちらの手段を使用している方が多いのではないかと思います。

このクライアントソフトは、トラフィックを送信する際、カプセル化/暗号化を行う。その後、送信先ネットワークの末端(エッジ)にあるVPNゲートウェイに送られることになる。

その先はサイト間VPNと同様に非カプセル化されターゲットに展開される。

ここで新たな用語がいくつか出てきましたが、トンネル(トンネリング)について、少し詳しくみていきます。

トンネル(のプロトコル)

トンネルは道路のトンネルみたいなものを想像しても良いかもしれません。

が、道路のトンネルと違うのは、ただ単に車を通過させるためでなく他に役割があるという点です。

※ ここではトンネルの構築方法は説明しません。

インターネット上にこのトンネルを構築する = 仮想的な経路を作成する

この経路作成するための素材として、プロトコルがあります。

トンネリングを行えるプロトコルには、PPTP,L2F,L2TP,IPsec,GREなどがあります。

ですが、この中で暗号化が可能なのがIPsecのみです。なので、IPsecでないプロトコルを使用した場合はIPsecを組み合わせて暗号化を実現する必要があるようです。

ここでよくググって出てくるのは(IPsecと対比して)、SSL-VPNです。

IPsecSSL-VPNどちらが良いの?という話があるが、ここでは以下の説明にとどめておく。

SSL-VPNは、OSI7階層モデル(○○層とかのやつ)のセッション層で実装される技術であるということ。

また、IPsecは、ネットワーク層で実装される技術。

この階層の相違は開発/運用しているアプリに影響を与えるということです。

つまり、HTTPやSMTP,FTPなどのアプリを変更することなくIPSecVPNを使用して利用することが可能であることがわかる。 IPSecネットワーク層で実装されるため、上位のアプリケーションプロトコルに依存しないよということですね。

どういった影響があるとか、そういった説明はここでは割愛させて頂きます。

このトンネルですが、脅威がトンネル内に侵入する可能性もゼロではありません

100%の安全を保証することはインターネット上を経由するため不可能ですが、安全にやり取りする方法があるので、それを駆使するのが無難なようです。暗号化や認証をすることでVPNは安全性を高めることがきます。

さて、ここまできたら大体VPNのイメージがわかったのではないでしょうか。

技術者としての具体的なVPNの構築方法は、クライアントソフトやAWSなどのクラウドサービスによって異なります。

そのネットワークや実現したいことに合わせて、随時使いやすいツール導入したり、アーキテクチャを考える必要がありそうですね。

この記事では詳しい導入手順は記述しませんが、OpenVPNというソフトの紹介をAWSサービスを関連付けて簡単にみていきたいと思います。

OpenVPN

OpenVPNは、MacOS, WindowsLinuxで利用できるオープンソースVPNソフトです。

GPLというライセンス形態で配布されていて、もちろん無料です。

GPL(General Public License)とは、オープンソース フリーソフトウェア用のライセンスの1つで、著作権表示を保持しなければならないといことと、このソフトを使用して損害があったとしても自己責任ですよ。それさえ守れば複製・改変・頒布はOKというライセンスルールです。

以下、公式ドキュメントになります。詳しいことはここを覗いてみましょう。

OpenVPNとは | OpenVPN.JP

このソフトとAWSサービスをセットでアーキテクチャを構築している組織も多いでしょう。

構築したいアーキテクチャは、それぞれ異なると思いますので、"ほんとに"簡単な流れのみ記述していきます。w

  1. OpenVPNをEC2などにインストール
  2. 認証局など、証明書の発行/設定を行う (参考: https://qiita.com/ohechi/items/7ed8a61194eb1dcca283 )
  3. OpenVPN自動起動を設定
  4. AWS-> VPC -> ルートテーブル/Security Groupなど設定
  5. クライアント側のOpenVPNを利用するための設定(OpenVPN GUIなどダウンロード)

ほんとにざっくりですが、主にポチポチで済む作業がほとんどですね。

また、macの場合はクライアントアプリとしてTunnelblickが良いと思います。

tunnelblick.net

.crt , .key , /usr/share/doc/openvpn-2.4.3/sample/sample-config-files/client.conf -> xxxxx.ovpn

このようなファイルは大切に、導入後もきちんと管理できるディレクトリに置いておきましょう。(クライアント側)

まとめ

簡単ですが、VPNについて書きました。

利用はしたことはあるけど、構築をする機会やあんまり勉強してないや!ってかんじでも

最低限ここまで抑えることができたら、あとは構築する組織のネットワークとの相性や使い方との相談です。笑

プログラミング言語のライブラリなどと比べて、そこまでたくさんのツールが用意されているわけではなさそうなので、1度覚えたらあとは応用です!

また、今回はサイト間VPNについては詳しく記述していません。

専用のルーターや回線をひくことになるので、情シスさんやインフラ屋さんは、通信事業者と相談することになるでしょう。

AWSを利用している組織は、

AWS Direct Connectなんかも関連して、概要だけでも知っておくのはありかもしれません。

aws.amazon.com

以上.

参考

【AWS】boto3で扱うprofile

今回はAWSPythonを使用してなにかコードを記述するときに使用するprofileの扱い方についてです。

Pythonだとboto3をしようする場面がおおいと思います。

また、AWSサービスを利用するにあたって、1人(またはチームや部署、プロジェクト)でいくつかのcredential情報をしようするかと思います。

また会社によっては、1つのプロジェクト(システム)に複数人のcredential情報を使用して、自由にw開発しちゃってる場合も...

まあそれは組織や考え方で様々ですが、boto3において柔軟にcredential情報を扱う方法をメモしていきます。

boto3とは?

aws.amazon.com

簡単にPythonAWSサービスを容易に統合できるライブラリですね。

インストールも簡単です。

$ pip install boto3
$ pip3 install boto3

ここで抑えておきたいのは、低レベル / 高レベル インターフェイスということば。

AWSによると以下の認識でいいのかなと思います。

  • 低レベル: 実現したいことのために、細かい事を指定する (client)
  • 高レベル: 実現したい事だけ指定する (resource)

以下の公式ドキュメントでは、AWSサービスごとに使用できるクラスが記載されています。

Available Services — Boto 3 Docs 1.9.170 documentation

本題に入ります。

boto3を使用する際、AWSのクレデンシャル情報を如何にして取得するか確認してみます。

Credentials (クレデンシャル)の設定

わたしはいつもローカルで開発する際、.awsディレクトリにconfigとcredentialsというファイルを置いています。

そして、そこに記述しているprofile情報をpythonに渡していたりしますが、それがベストプラクティスなのか確認したいと思います。

credential情報の取得して、他には環境変数に設定しているのを取得したり、そのままコードのべた書きしたり(よろしくないですね笑)できますかね。

AWS的にはなにを推奨しているのか、

以下のドキュメントに記載してありました。

Credentials — Boto 3 Docs 1.9.170 documentation

ちょっとまとめてみると、

boto3がcredential情報を取得しにいく優先順位として以下になるようです。

  1. Passing credentials as parameters in the boto.client() method
  2. Passing credentials as parameters when creating a Session object
  3. Environment variables
  4. Shared credential file (~/.aws/credentials)
  5. AWS config file (~/.aws/config)
  6. Assume Role provider
  7. Boto2 config file (/etc/boto.cfg and ~/.boto)
  8. Instance metadata service on an Amazon EC2 instance that has an IAM role configured.

訳:

  1. boto.client()メソッドで、パラメータが設定される
  2. Sessionオブジェクトを生成して、パラメータが設定される
  3. 環境変数の設定
  4. ~/.aws/credentials での設定
  5. ~/.aws/config での設定
  6. AssumeRoleを使用 (AWS STS)
  7. Boto2の /etc/boto.cfg and ~/.boto の設定
  8. IAMロールが設定されているAmazon EC2インスタンスインスタンスメタデータサービス

ちょっとAWS STSはなるほど!ってかんじでしたが、大体予想通りの展開ですね。

ここからはチームや個人の方針に委ねられるかんじもしますが、

基本的には4や5が良さそうなかんじでしょうか。

2と4でもいけますかね。

仮にコンソール上で実行するようなものであれば、ファイル実行者に.aws/配下に設定されているprofile情報をオプションで入力させ、権限さえあれば実行できそうです。

環境変数でも場合によっては、悪くなさそう。

AWSコンソールのLambdaのメニューからなら環境変数を簡単に入力できますね。(もちろんそれを良しとして、きちんとLambdaへの権限が設定されていたりすればですが)

まとめ

実際きちんと公式を読むと推奨されている事柄が把握できました。

どんなツールでも向き不向きがあるように、できるだけ開発者の意図に沿った使い方ができれば後の運用や保守も少しは楽になりそうですね。

意外と見落としがちな点かもしれませんが、チームや組織、プロジェクトの方針を最初にバチッと決めておくと、

メンバーがハッピー(楽)に開発できそうです!

参考

【Python】datetimeでハマったこと...

今回はPythondatetimeというライブラリについてです。

ちょっと久々Pythonコードを書いていて、エラーがずーーーーっと出て、20分くらい「なんでやねん!」

ってなってたところがあるので、少しですがメモ程度に記事します。

※このモジュールの詳しい使い方はここでは説明しません。

まえおき

Pythonを書いたことがある人は1度は絶対に見たことがあるだろうdatetime

主に時間(日付など)に関するデータを扱うときに使用するかと思います。

今回、わたしも指定した期間の毎月1日を出力するコードを書いている時に使用しました。

このdatetimeには、3つの型があるようです。

  • datetime
  • date
  • time

ふむふむ、と。

エラー

まずテストでちょっとコードを書いてみました。

today = datetime.date.today()

まあ、なんてことないプログラムです。

それに続けてちょっとコード書いて実行したら....

AttributeError: 'method_descriptor' object has no attribute 'today'

「お?」

今日の日付すら出力できないありさまに。。。

前も同じコード書いてこともあるし、ググってもやはり問題はなさそう。

如何にしても駄目だったので、エラーをググってみたところ以下の質問がヒット。

https://teratail.com/questions/164127

理由

上記の質問での回答者の方が答えているように、

なんとdatetimeライブラリ、「ライブラリ名とクラス名が同じなんだ!」笑

よくpythonの日付処理の記事は目にしますが、importの仕方にわたしは問題がありました。

今回記述していた書き方は、こんなかんじ。

from datetime import datetime, date, timedelta

ちょっと違うプログラムで、こういう書き方をすることがあって、

(datetime.datetimeの下にもdateメソッドがあって、datetimeの下にもdateクラスがある...)

そこから持ってきていたからいつものimport datetimeこの書き方でなかった...

調べていると、2年前くらいにも同じこと調べた気がする...

まあ、コピペはいけませんがw、さすがにこれはdatetimeライブラリの作りが悪い!!!!

ってことにしたいです。笑

以上.

【インフラ】motdをカスタマイズ!!

少し投稿が止まってしまいました...

今回は小ネタ的な内容になります!

インスタンス(サーバー)にSSH接続した時に出る、格好いい文字!

こんなの↓

f:id:o21o21:20190524113903p:plain

ローカル環境構築してるときや、

開発において環境ごとになにか作業する時に、目立つmotd を設定していたほうがいいですよね! (まあ小ネタ的なかんじなので、しっかり接続方法を管理しておけばいいというのはおいておいて...)

なので、motd (Message Of The Day) の変更方法をメモがてら記事にしました。

※ OSによって若干の変更方法が違い場合もあるかと思いますが、大まかな手順をわかって頂けたらと思います!

今回のわたしのテスト環境としては、centOSのversion7です。

EPEL設定

$ yum install epel-release
$ yum update

次の手順でfigletというコマンドをインストールするのですが、centOSではデフォルトで

EPELリポジトリが設定されていないようなので、上記のコマンドを実行します。

figletをインストール

$ yum -y install figlet

確認してみる。

$ figlet Hello

 _   _      _ _       
| | | | ___| | | ___  
| |_| |/ _ \ | |/ _ \ 
|  _  |  __/ | | (_) |
|_| |_|\___|_|_|\___/ 
                      

おお、もうできました笑

あとは、適当に用途にあったメッセージをうまーく出力させるだけです。

出力させたら、motdファイルを変更します。

$ vim /etc/motd

# 確認してみる
$cat /etc/motd

これで文字が崩れたりしてなければ、次回以降このOSに接続した際に表示されるはずです。

色をつける

上記では、figletコマンド でやりましたが、こちらのサイトに行って、

そのままFontやら変えてコピペしても大丈夫です笑

ただ、Fontによってうまくいかない場合もありましたので、少し苦戦する場合もありそうです。

あと、日本語にも注意してくだいね!

まとめ

けっこう気になってる方も多いmotdについてでした。

まず私はこれを、「メッセージ オプ ザ デイ」というこも知りませんでした笑

また、他のファイルと合わせて、なにかOSの状態を表示させる方法なんていうのも思いつきますね!

(まあ、ただ接続時の時だから状態は、普通にコマンドで確認ですかねw)

それについては以下の記事が良さそうでした!

motdの設定をしてみた | bacchi.me

今回はちょっと薄い内容でしたが、、

また近いうちに更新できたらと思います、

以上.