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

以上.

【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

#1【アルゴリズム】入門 モチベーションを上げていく!

さて、さっそく初回の記事になります。

この記事は、#1として、具体的なアルゴリズムを見る前の心構えなんかを記述していきます。

普段の開発からアルゴリズムを意識できるようにしたい。。。

そして、プレッシャーがかかった時に(最近ちょっと悔しい思いをしまして...)、

できるだけ頭を整理しながらコードを組み立てられるような思考なんかも合わせて勉強したいと思います。

なにごとも基礎を大事にということで笑

ちょっと今回は定性的なことが多い初回の記事かもしれませんが、よろしくお願い致します!

アルゴリズム (algorithm) とは?

いきなり引用ですが、アルゴリズムとは、

数学、コンピューティング、言語学、あるいは関連する分野において、問題を解くための手順を定式化した形で表現したものを言う。算法と訳されることもある。引用: アルゴリズム - Wikipedia

当たり前ですが、アルゴリズムはプログラミングの領域のみではなく、いろんな領域で用いられてるようです。

アルゴリズムは、問題を効率的根拠を持って解決をするための手段といえるでしょう。

ちなみに、アルゴリズム(algorithm)という語は、9世紀イラクの数学者アル=フワーリズミーからきていると言われています。

フワーリズミー - Wikipedia

人の名前が由来だったんだ...!!!!

アルゴリズムを活かす

私としては、とくに効率的というところに着目したいです。

エンジニアとしては、効率性が重視されると思います。

コードの高速化や何かの構成のシンプル化(= 効率的且つ冗長化されたときも効率的になるのか)など、活かせる場面は多々あります。

(ほとんどの)アルゴリズムは、コンピュータプログラムとして実装されることを意図しているそうです。

たしかにそれは納得できます。いろんな機器にせよ、専門的な分野のツールにせよ、プログラムが動いていますよね。そこで、アルゴリズムが使用され、より効率的に処理したりするわけです。

DVDの再生にせよ、ストリーミング再生にせよ、電車乗り換えアプリにせよ、ありとあらゆるところにアルゴリズムは存在しています。

多くの記事で、「アルゴリズムは、計算法!」みたいに記述されていますが、現代におけるアルゴリズムの厳密な定義としては、

【計算可能なもの】を計算する手続き

と、されている。

なんだか、こっちのほうがしっくりきます。仮に一時的に計算不可能?なものがあるとして、これを解こうとして、アルゴリズムを駆使する。って考えるとなんだか計算方法というよりか、手段であると納得します。

と、まあここらへんにして、アルゴリズムは一体どれだけの種類があるのでしょうか?

アルゴリズムの種類

パッと調べてみると、Wikipediaのこんなページを見つけました。

List of algorithms - Wikipedia

ものすごい沢山ありますねw

でも、安心してください。全部覚える必要はありません笑

ググって出てくる主要なアルゴリズムがあるので、それを優先して勉強していけば良さそうです。

ですが、もう少し調べてみることにします。

米メディア、mediumのTop algorithmの記事がありました。

medium.com

ちょっと英語なので、アルゴリズムの名前が日本語とで呼び方が違うかもしれませんが、見慣れているアルゴリズムが多いでしょう。

主要なアルゴリズムは、次回以降の記事でおっていけたらと思います!

この記事をみると、Top Data Structures(データ構造)という項目もあります。

データ構造とはなんでしょうか?

Data Structure (データ構造)

データ構造は、データを効率よく扱うため、システマナイズ(あるパターンを持たせた)し格納する形式のことです。

配列やリストもこの1種になります。

わたしの経験から、このデータ構造は非常に重要だと思います。笑

大規模なシステムになると、長期的にみて、バグや冗長化困難なリスクを抱えたりします。

運用からジョインした人は、構造が悪ければ修正するべきですし、新規開発ではよく考慮して開発すべきだと思います。

データ構造の決定は、使用するアルゴリズムを決めたり、

または、アルゴリズムが決まれば、データ構造を定めることもできますね。

データ構造はアルゴリズムにも密接に関係してきますので、こちらも基本的なデータ構造もこのシリーズでおっていけたらと思います。

  • 配列
  • スタック - LIFO(Last In First Out)
  • キュー - FIFO(First In First Out)
  • 連想配列
  • ハッシュテーブル
  • ルックアップテーブル
  • 線形リスト
  • 木構造
  • グラフ

引用: データ構造 - Wikipedia

アルゴリズムを勉強するモチベーション

これに関しては、アルゴリズムを学ぶのが好き!って人は読み飛ばしてください笑

アルゴリズムを学ぶにあたり、いろんな書籍や記事がありますが、

外部ライブラリを使用していたりして肝心な根本のロジックがわからない!とかよくあると思います。

また、○○やりたいのに前提となる数学の知識がけっこう必要...、そもそも数学が苦手…などなど、少し抵抗感がある人もいるかもしれません。

ですが、まずアルゴリズムを学ぶ上で、学ぶことによって得られるスキルを思い浮かべてみます。

1点目、日頃のタスクの改善に繋がるかも!

日頃、四苦八苦していたコードがあったとして、改善する策が増えることでタスクをこなす時間短縮できるかもしれません。

空いた時間で、さらに違う技術を勉強できるかも!

2点目、自作ライブラリ?笑

今まで普通に使用していた便利なライブラリがあるとして、そのライブラリを理解し、

拡張、または、自分で自作できるようになるかもしれません。

3点目、○○の視点がかわるかも?笑

いつもなんとなーく見ていた何かに気づきがあるかもしれません。笑

実はこれ、こういうパターンで成り立っているんだ!とかとか。

わたしは勉強をはじめて、数時間ほどでに関しての考え方が少し変わりました!

アルゴリズムを学ぶことでってわけでもないですが、上記のようなことを想像して少しずつ勉強できたらいいと思います。

では、最後に少し準備していくことを簡単に!

準備&参考にしていくもの

o21o21.hatenablog.jp

こちらの過去記事から、進数の項目を参考にします。

書籍

プログラマの数学第2版

珠玉のプログラミング 本質を見抜いたアルゴリズムとデータ構造

サイト

docs.python.org

pep8-ja.readthedocs.io

Github

GitHub - TheAlgorithms/Python: All Algorithms implemented in Python

では、初回はこれくらいにして、次回の記事のテーマは数学の体操にしようかと思います!笑

以上.

【アルゴリズム】 〜目次〜 のんびり学ぶ!!

※ この記事は、シリーズものとして扱いたいため、目次記事になります。

随時更新していく予定ですので、こちらをブクマして頂けるようであれば、便利に観覧できかと思います。

アルゴリズム 入門!(のんびり)

エンジニアとして、無視できないアルゴリズム。 

このシリーズでは、#1〜順に、

アルゴリズムとは?」「どうして学んだほうがいい?」「難しいから勉強が続かない...」などなど

勉強していく上でのモチベーションの持ち方や具体的なアルゴリズムについてものんびり勉強していこうと思います。

せっかく勉強していくので、続かないと意味がありません。

また、実際にコードが書けないと意味がありません 。

最近では、Pythonのnumpyなど便利なライブラリがありますが、ここではできるだけ外部ライブラリは使用せず、標準で用意されているライブラリを使用して、できるだけ生の状態でコードを記述できたらいいと思います。

なので、のんびりをテーマに、少し時間がかかっても学べるように(というか私が楽しさを見出しながら笑)できるだけ理解しやすいようにかければいいと思っています。

私も勉強しながらなので、記事投稿後も部分的に修正が入ってしまうことや、シリーズの前後があるかもしれませんが、ご了承くださいm( )m

また、プログラミング言語は、Pythonを選択します。

目次

以上.

【AWS】2019年8月23日の障害についてメモ

今回AWSの障害についてです。

ついこの前、AWSの東京リージョン(AP-NORTHEAST-1)で大きな障害が発生しました。

なので、

さくっと、メモ程度にAWSの障害が起こった際の対応やチェックしたいサイトなどを残していきます。

今回の障害について

今回は、東京リージョン(AP-NORTHEAST-1)で大規模な障害が発生しました。

(マネージャーさん曰く1年に1回あるかないかくらいの規模だったらしい)

私は仕事中で、ちょうどお昼くらいだったでしょうか。

12:30頃

たぶん12時半ころに、1台のインスタンスのアラートが発生しました。

そして、5分以内くらいに2、3台のインスタンスが次々とアラートを起こし、監視ツールはお祭り騒ぎ。笑

13:30〜15時頃

13時を過ぎても、次々とインスタンスがおちていき、AWSコンソールのEC2一覧のステータスチェックは合格しない状況。

インスタンスの状態は、runningだったのですが、ほとんどのインスタンスがステータスが安定しない時間が数時間に渡って続きました。

また、SSH接続は可能なのですが、インスタンスにのっているアプリが安定せず、コマンドが通らない状況でした。

すべてのインスタンスが不安定だったわけでなく、発生から2時間くらい経った時に、あるAZの障害なのではないか?とパターンがだんだん推測できるようになりました。

〜17時頃

色々と不安定なインスタンスをみてみると、AZ ID: apne1-az4の領域にあるインスタンスが不安定なようでした。

以下、サーバーワークスさんもお知らせ欄でほぼリアルタイムで障害について調査しているようでした。

さすが、障害発生中のときでも随時情報が追記されていってました。

AWSの公式からは、ほぼ報告がなかったので、非常に有益な情報といえるでしょう!(また、今は障害時のまとまったスライドも展開されているので、資料になります。)

www.serverworks.co.jp

不安定なインスタンスを停止-> 開始のフローで強制的に再起動させてみても、なかにはステータスチェックに何回も合格せず放浪しているインスタンスが多かったです。

なんやかんやで、AWSに依存しすぎていてほぼ手を動かすことがなくってしまった時間もありました。

また、サーバーの監視ツールももちろんインスタンスにのっています。

これはマルチAZで対応しなければならないと学びました。

AWS公式からの報告は、以下の2つをサイトでチェックすることが可能です。

障害発生時、非常に更新が遅いので、Twitterなどで少し情報を取得することをオススメします!笑

もちろんあくまで参考程度にしかできませんが、どんなサービスが影響を受けているのか、知る手段の1つだと思います。

また、障害発生中にAWSのサポートに復旧時間(見込み)を質問しました。

ものの15〜30分くらいで回答は返ってきましたが、回答内容はほぼステータスサイトと同様でした。

で、結局原因は?

原因は、公式からの以下がまとまっているので参考にしてみてください。

aws.amazon.com

簡単にいうと、単一のアベイラビリティゾーンで、オーバーヒート ですね。

冷却装置がこわれて温度が上昇し、サーバーのパフォーマンスが一気に低下したようです。

なんというか、しょうがないとしか言えないよな事象...

EC2も影響を受けましたが、EBSも影響をうけました。

23日の夜(24日の朝方)にスナップショットを取得する処理も、なんか不安定で、取得に失敗したスナップショットがありました。

かるくまとめ

AWSといえど、こういった障害はつきものですね。笑

いつも便利で使用させもらっているので、わたしはまあ、AWSの人も大変だろうに、くらいしか思いませんでした。笑

今回はマルチAZなどで対策したり、リージョン単位での対策も一部必要なのだと実感できた障害となりました。

以上.

【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サービスもどんどんできてくると思うので、覚えておいて損はなさそうです。

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

以上.