MotoJapan's Tech-Memo

技術めも

【AWS】初期導入のハマりポイント覚書(導入からJupterNotebookでリモート作業まで)

GWなのでAWSを使ってみたいと思ったので、
先輩と導入からJupterNotebookでのリモート作業までやってみました

今回はハマったところを覚書

作業の主な流れ

①アカウント登録
②EC2インスタンス作成
③クライアントからEC2インスタンスに接続
python環境構築(anaconda3インストール
⑤JupterNotebookリモート操作環境構築

基本的な作業手順は後述のリンクで確認が吉

①アカウント登録

特になし

流れに身を任せて「まずは無料ではじめる」をクリックして作業していきます
登録にはクレジットカードが必要なのでお忘れなく
f:id:motojapan:20170505134053p:plain

②EC2インスタンス作成

アカウントが登録できればコンソールという管理画面へのログインができます
この画面↓インスタンスは「仮想マシンの起動」から行う(※リージョンは適切なものを選択)
f:id:motojapan:20170505134437p:plain

リージョン選択を忘れずに!

「使用を開始する」をクリック。。。する前にリージョン選択(水色のところ)
リージョンによって使用料金はが変わります
f:id:motojapan:20170505135258p:plain

今回の構成は無料枠利用目的なので、
OS :AMI
instance type: t2.micro

あとは流れに従い、無事インスタンス生成完了!
「アクション」ボタンでインスタンスの「開始、停止、再起動、削除」ができます
f:id:motojapan:20170505150008p:plain

③クライアントからEC2インスタンスに接続

今回はSSHで繋ぐ為、teratermから接続

接続先 : IPv4 パブリック IP (インスタンス画面の下部に記載 ※起動毎に変わるので注意)
EC2のデフォルトユーザ名 : ec2-user
EC2のデフォルトパスワード : (なし)
②のインスタンス生成時に生成したprivate keyを指定(xxx.pem)
f:id:motojapan:20170505150235p:plain

python環境構築(anaconda3インストール

AMIはどうやらpython2系が標準装備なので普段使っている3系に合わせたいと思います
日頃はanacondaを使用するのでそれを入れます

git,emacs,gcc もろもろを入れる

$ sudo yum -y install gcc gcc-c++ make git openssl-devel bzip2-devel zlib-devel readline-devel sqlite-devel

pyenvをインストール

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv

編集

$ emacs ~/.bashrc

次を書き込み

export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
export PATH=${PYENV_ROOT}/bin:$PATH
eval "$(pyenv init -)"
fi

適用

$ source ~/.bashrc

anaconda インストール

$ pyenv install anaconda 3-2.3.0


pyenvでpythonがデフォルトで指しているsystemからanaconda 3-2.3.0へ変更

$ pyenv global anaconda 3-2.3.0
$ pyenv global
system

変更されてないだと。。。

pyenvで環境が切り替えらえない場合

いろいろ調べましたが、結論が見つからず結局再起動で解決でした。。。

$ sudo reboot
$ pyenv global anaconda 3-2.3.0
$ pyenv global
anaconda 3-2.3.0

⑤JupterNotebookリモート操作環境構築

実用編です
先輩からの提案でJupyterNotebookリモート環境を構築してみました

つまり、
「手元のクライアントPCからAWS上のEC2インスタンス機械学習とかできてみんなハッピー!」
というストーリーです

参考資料はこちら
apt-get環境ありが基本になっているので、AMIでの構築手順を記載します
qiita.com


1.jupyterインストール
まず早速ですがjupyterが入らないです。。。

pip install jupyter

→ setuptoolsでerror

jupyterが入らない場合

これはcondaの更新が必要でした

conda update setuptools
pip install jupyter

無事インストール

2.notebookをインストール

git clone https://github.com/jupyter/notebook.git
cd notebook
pip install --pre -e .
jupyter notebook

3.ipython設定
ipythonはanacondaのサブセットとして入っているので改めて入れなくてOK

SHA1キーを取得するため次を実行

$ ipython
from notebook.auth import passwd
passwd()

ここで2回Enterすると、SHA1キー(xxxxxxxxxxxxx)が得られます。(メモ)


コンソールから次を一旦実行

$ jupyter notebook

.jupyterフォルダが生成されいます。

設定ファイルを記載

~/.jupyter/jupyter_notebook_config.py
c = get_config()
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8080
c.NotebookApp.password = u'sha1:xxxxxxxxxxxxx'

jupyter notebookサーバー起動

$ jupyter notebook &

無事起動ですね!


ここからクライアントPCでの作業

クライアントPCのブラウザから次を実行

http://<パブリック IP>:8080

無事、、、はいれません!

クライアントから接続できない場合

これはEC2の設定問題でした
確かにポートを開ける必要があるので次の設定が必要です

1.EC2のインスタンス画面⇒対象のインスタンスのセキュリティグループを選択
2.編集⇒カスタムTCPルールのポート範囲/送信元を設定(8080 -8084/カスタム)


無事接続完了!
f:id:motojapan:20170505145804p:plain

【Unity5】ボールをキーボード操作で移動させる

これの続き
motojapan.hateblo.jp
motojapan.hateblo.jp


今回はスクリプトをコーディングしまする
Unityのみでは、細やかな操作やアニメーションを実装できないので、
C#でコーディングしまする

簡単なコードで動きますね

①Script用フォルダを作成

Assets->Create->Folderでフォルダ作成
(フォルダ名は適当にScripts)
f:id:motojapan:20170503180816p:plain

Scriptsを左クリックでCreate -> C# Script
(ファイル名は適当にball_controller)
f:id:motojapan:20170503180854p:plain

ball_controllerをクリックすると何やら右側にCode Previewが映っています
f:id:motojapan:20170503181004p:plain

②Scriptを編集する

ball_controllerをダブルクリックするとVisual Studioを立ち上がります
(Editorは環境依存です)
f:id:motojapan:20170503181206p:plain


次のTemplateが出現しますね

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ball_controller : MonoBehaviour {

    // Use this for initialization
    //最初に一度だけ呼ばれる処理
    void Start () {	
    }
	
    // Update is called once per frame
    //毎フレーム呼ばれる処理
    void Update () {
    }
}


なのでUpdateを次のように編集してみる

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ball_controller : MonoBehaviour {

    //ここの宣言が後でUnityでいじれる設定となる
    public Vector3 ball_position = new Vector3(0.0f, 0.0f, 0.0f);
    
    // Use this for initialization
    //最初に一度だけ呼ばれる処理
    void Start () 
    {	
    }
	
    // Update is called once per frame
    //毎フレーム呼ばれる処理
    void Update()
    {
        //[W]クリック時の処理
        if (Input.GetKey(KeyCode.W))
        {
            transform.position += ball_position;
        }
        //[Q]クリック時の処理
        if (Input.GetKey(KeyCode.Q))
        {
            transform.position -= ball_position;
        }		
    }
}

③Scriptをボールに適用する

ボールのInspectorからAddComponentで②で編集したball_controllerを選択
f:id:motojapan:20170503182209p:plain

ball_controllerが追加されたので、
Ball_positionのZのみを1にしてみる
これで「W」をクリックすると、ボールが奥に移動し、「Q」をクリックすると手前に移動する(はずだ)

④チェック

例によって再生ボタンをクリック

これが
f:id:motojapan:20170503182806p:plain
Wを押すとこうなって
f:id:motojapan:20170503182849p:plain
斜めの丘を転げる
f:id:motojapan:20170503182918p:plain


Have a nice GW !!

【Unity5】ボールを置いて落としたり、弾ませたりする

これの続き
motojapan.hateblo.jp

①ボールを追加

GameObject -> 3D object -> Sphereを選択
f:id:motojapan:20170503173105p:plain

位置はカメラ位置を意識して次を設定
position x / y / z = 500 / 10 / 510
f:id:motojapan:20170503172637p:plain

②ボールに重力を設定

ボールの追加だけだと浮いている状態なので、
重力を設定します。

SphereのInspectorからAddComponentを選択
RigidBodyを入力して選択
f:id:motojapan:20170503173633p:plain

Use Gravityにチェックを確認
f:id:motojapan:20170503173757p:plain

③チェック

ではほんとに落ちるかチェック
再生ボタンをクリック!
(Main Cameraのtransform positon yは5にしておきます)

これが
f:id:motojapan:20170503174126p:plain
こうなる
f:id:motojapan:20170503175150p:plain

④ボールに跳ねる設定を追加

Assets -> Create -> Physical Materialを選択
f:id:motojapan:20170503173322p:plain

下のAssetsにそれらしきものが追加されます。
それをクリックして、Bouncinessを設定
(今回は0.8)
f:id:motojapan:20170503174335p:plain

そしてsphereにドラック&ドロップ
f:id:motojapan:20170503174505p:plain

⑤再度チェック

再生ボタンをクリック

すると、これが
f:id:motojapan:20170503174832p:plain
こうなって
f:id:motojapan:20170503175020p:plain
こうなる
f:id:motojapan:20170503174903p:plain
跳ねた!(確信)

結構簡単ですね!

【Unity5】プロジェクトを開始して地形をつくる

最近は機械学習やっていますが、GWで暇すぎるのでUnitiyを触ってみた。

Unity環境はすでに入れている前提で雑多にメモ。(すぐ忘れちゃうので)

環境
Windows 8.1
Unity 5.6.0f3

①プロジェクトを開始

[+New]→Project nameを適当に埋める→Create Project
(私の場合、Project nameは 170503_sandbox)
f:id:motojapan:20170503171609p:plain

操作画面を確認
f:id:motojapan:20170503162105p:plain

②地形(terrian)を作る

参考資料は次
http://qiita.com/yando/items/ef76c200bb50005170d5

GameObject -> 3D Object -> Terrian を選択
f:id:motojapan:20170503162346p:plain

地形追加されました
f:id:motojapan:20170503162442p:plain

左に追加されているTerrianをクリックして、Inspectorの歯車をクリックして、Resolutionを設定

defaultのTerrian Width / Length / Heightを適宜変更

私の場合は、Terrian Width / Length / Height
500/ 500 / 600 → 1000 / 1000/ 600

変更前
f:id:motojapan:20170503162837p:plain
変更後
f:id:motojapan:20170503162915p:plain

ドン!広がった!

③地形に張るテクスチャを追加する

張りたい画像をAssetsにドラッグ&ドロップする
(今回は適当に海の画像.png)
f:id:motojapan:20170503163522p:plain

TerrianのInspectorから筆マークを選択→Edit Texturesで追加
f:id:motojapan:20170503170830p:plain
張れました~

④地形変化する

TerrianのInspectorから最左のアイコンをクリック
Brushsを選択してドラッグすることで丘を作成

f:id:motojapan:20170503164600p:plain

⑤カメラ位置を変えて確認

MainCameraをクリックすると現在のカメラ画角がわかります。
見やすいようにPreview画面の左上の3軸のY軸を触ると、トップからのビューになります

現在のカメラ位置と向きはこんな感じなので、移動することでCamera Previewをまともにしてみる
MainCameraを選択 → Transformを変更

変更前
f:id:motojapan:20170503164728p:plain
変更後
Position x/y/z = 500 / 10 / 500
f:id:motojapan:20170503165222p:plain


作成した丘もできてますね。完成です。

結構簡単!

【Raspberry Pi 基礎知識③】 BluetoothでAndroidとシリアル通信(Python編)

五月雨で覚書

RFCOMMプロトコルを使用するために、
まずPythonでBTのソケットを作ります。

①ソケット作成

sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )

②接続

繋ぎに行く場合(Client)

sock.connect((相手のサービスBTアドレス, 相手のPORT))

繋がれるのを待つ場合 (Server)

sock_client,address = sock.accept()

③データのやり取り

Clientの場合

sock.send("データ")

Serverの場合

data = sock_client.recv(1024)

以上の情報で、Pi上にPythonでClient/Serverを実装すると、
どちらもAndroidのターミナルからデータのやり取りができました。
Remote(AndroidWindows)からPiを操作したいなら、Serverだけで十分ですね。

以上!

【Raspberry Pi 基礎知識②】 BluetoothでAndroidで接続&シリアル通信

ざっくりお覚書です。(デジャブ)

①まずデバイスの検索

hcitool scan

②BTインタフェースにターゲットのBTデバイスをセットする

※ XX:XX:***** は①で検索したBTアドレス

sudo bluez-simple-agent hci0 XX:XX:XX:XX:XX:XX

aleardy exist と出た場合は、以下

sudo bluez-simple-agent hci0 XX:XX:XX:XX:XX:XX remove

③シリアル通信のサービス登録とその確認

sdptool add --channel=22 SP
sdptool browse local

④rfcommを起動

sudo rfcomm listen /dev/rfcomm0 22

これが起動したら、AndroidBluetooth Terminal からConnectを張る
コネクトが張れれば、Connection from XX:*** と出るので、
Ctrl+Zで抜けます(ココ重要)

⑤受信

cat /dev/rfcomm0

⑥送信

echo "send data" > /dev/rfcomm0

送受信は、Terminal上でこんな感じにでます。
赤がAndroidからの送信データ 青がRaspberry piからの受信データ!

f:id:motojapan:20150720005219p:plain

【Raspberry Pi 基礎知識①】 無線LANに固定IPで接続

下記覚書ですね
ちなみに、WPA2 - AES(PSK)です。

①まずWifiドングルを突き刺してデバイスを確認

lsusb

一応、検出をしているかも確認

iwlist wlan0 scan

ここで使いたいssidをメモ


②次に無線用のパスフレーズを作る

直接書き込むなら以下

wpa_passphrase ssid password  >> /etc/wpa_supplicant/wpa_supplicant.conf

私はとりあえず出力してコピー
ここで出力されたpskは、平文からの変換処理が施されたものになります。


③次に②の出力を以下のファイルに書き込み準備
/etc/wpa_supplicant/wpa_supplicant.conf

network={
        proto=WPA2
        key_mgmt=WPA-PSK
        pairwise=CCMP
        group=CCMP
        ssid="②のssid"
        psk=②のpsk
}

④interfaceの設定
/etc/network/interfaces

以下を追加

auto wlan0
iface wlan0 inet static
        address XXX.XXX.XXX.XXX
        netmask XXX.XXX.XXX.XXX
        gateway XXX.XXX.XXX.XXX
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

ちなみに
手元のラズパイはiface wlan0 inet dhcpとの相性が悪すぎて挫折

④ステーションとの認証をテスト

wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant.conf -i wlan0 -Dwext