寝ても覚めてもこんぴうた

プログラム書いたり、ネットワーク設計したり、サーバ構築したり、車いじったり、ゲームしたり。そんなひとにわたしはなりたい。

Mac OSにpyenvを利用してpython3をインストールし、pythonの切り替えも便利に

pyenvを利用することで、pythonの切り替えを便利にできるので、 直接python3をインストールするのではなく、pyenvを利用していく

pyenvのインストール

brew install pyenv

コマンド自体はこんな漢字でインストール完了

pythonを切り替えるために以下の設定を .zshrc なり .bashrc なりに投入する

echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.zshrc

bashの人は最後の .zshrc.bashrc か何かに切り替えて

pyenvを利用してpythonをインストールする

インストール可能なバージョンの確認

pyenv install --list

ダーッと文字が流れますが、上の方の数字の部分がpythonのバージョン、 記事を書いた現在(2018/06/19)、3.6.5が最新なのでそれをインストールする。

python 3.6.5 のインストール

pyenv install 3.6.5

pythonのバージョンの切り替え

システム全体のpythonのバージョンを変更する場合には以下のglobalコマンドを利用します。(ほとんどの人がこっちかな)

pyenv global 3.6.5

一時的に異なるバージョンを利用したい場合には

pyenv local 3.6.5

global or local を実行したあとに設定を有効にするためにrehashを実行します。

pyenv rehash

python のバージョンを確認する

python --version

を実行し、目的のバージョンに変わっていればokです。(今回の場合には3.6.5)

おまけ

あとはpythonのバージョンを変更したい場合には、

pyenv install --list でインストールできるバージョンを確認

pyenv install x.x.x でインストール

pyenv global x.x.x でバージョン切り替え

pyenv rehash で設定変更のおまじない

という流れでok。

rehashするのがめんどくさいって人がいれば、自動化するツールもあるみたい。
個人的にはrehashぐらい自分でやろうよ。という感じなので入れてません。

ではー

AKSのクイックスタートなぞってみた(Azure)

AKSのクイックスタートなぞってみた

まず、はじめるには

クイックスタートでは Azure Cloud Shell を利用する雰囲気で書いてある。
GCPばっかり使っていたので Cloud Shell は無料かと思いきや、Azureの場合にはストレージ領域分課金されるとのこと。
がっかりしたのでmacにインストールしたコマンドで実行することにした。

Azure Clientのバージョン確認

Cloud Shellを使わなくても、Azure Clientから実行ができる。
ただし、AKSのサンプルを試すにはバージョン 2.0.27 以降である必要があるので、以下のコマンドでバージョンを確認する。

az --version
azure-cli (2.0.35)
~~ snip ~~

という感じで表示されたのでバージョン的には問題なしなのでそのまま進めよう。

Azure Clientでのログイン

Azure Clientのログインを事前に行う必要がある。
コマンドは

az login

ターミナル上にURLが表示されるのでそのURLをブラウザに貼り付けて実行し、ターミナル上に表示されたキーをブラウザに貼り付ける。
ブラウザ側の処理が完了するとターミナル側の処理が進む(json形式のレスポンスが返ってくる)のでそれを待ちましょう。

AKSプレビューの有効化

必要なサービスプロバイダーが有効になっているかのチェックを実施。

az provider register -n Microsoft.Network
az provider register -n Microsoft.Storage
az provider register -n Microsoft.Compute
az provider register -n Microsoft.ContainerService

リソースグループを作成する

リソースグループとはリソースを任意のかたまりにまとめ、ライフサイクルや権限を一括して管理するための仕組み。というもののようです。
検証用の環境としてリソースグループ単位でゴソッと用意し、要らなくなったら一気に消す、などのようなことができるっぽい。 フロントのwebサーバグループ、裏側のDBグループ、のようなものではなく、webサーバ、DBサーバ、バッチサーバという感じでアプリケーション一式の塊をグループ化するのがお作法のようだ。

とりあえず作成してみる。
2018/06/12 現在、AKSは東京リージョンに来ていないので、 centralus を使ってみることにする。

az group create --name ${RESOURCE_GROUP_NAME} --location centralus

"provisioningState": "Succeeded" のような値を含むjsonレスポンスが返ってくれば成功だろう。

AKSクラスターを作成する

タイトルの通り。コマンドを実行してAKSクラスタを作成します。
クイックスタートの例ではnode1台ですが、欲張って2台にしてみます。1台で良いという方は1にしましょう。

az aks create --resource-group ${RESOURCE_GROUP_NAME} --name ${CLUSTER_NAME} --node-count 2 --generate-ssh-keys

クラスタの作成はそこそこ時間がかかります。(20分程度??)
完了後にjsonのレスポンスが返ってくるのでそれまでのんびり待ちましょう。

クラスターへの接続

k8sクラスタへの接続には kubectl を利用します。
私はすでにインストール済みだったのでスキップしていますが、各自適当な方法でインストールしてください。

ex. Azure CLIでインストールするには

az aks install-cli

クレデンシャルの取得

kubectl用のクレデンシャルの設定を行います。

az aks get-credentials --resource-group ${RESOURCE_GROUP_NAME} --name ${CLUSTER_NAME}

ノードの一覧を取得してみる

kubectl get nodes

こんな感じの応答が返ってくる

kubectl get nodes
NAME                       STATUS    ROLES     AGE       VERSION
aks-nodepool1-38601818-0   Ready     agent     41m       v1.9.6
aks-nodepool1-38601818-1   Ready     agent     41m       v1.9.6

アプリケーションの実行

以下のようなマニフェストファイルを作成し、デプロイを行います。
pythonアプリケーションとredisインスタンスが定義されています。

azure-vote.yaml ファイル

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: azure-vote-back
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: azure-vote-back
    spec:
      containers:
      - name: azure-vote-back
        image: redis
        ports:
        - containerPort: 6379
          name: redis
---
apiVersion: v1
kind: Service
metadata:
  name: azure-vote-back
spec:
  ports:
  - port: 6379
  selector:
    app: azure-vote-back
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: azure-vote-front
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: azure-vote-front
    spec:
      containers:
      - name: azure-vote-front
        image: microsoft/azure-vote-front:v1
        ports:
        - containerPort: 80
        env:
        - name: REDIS
          value: "azure-vote-back"
---
apiVersion: v1
kind: Service
metadata:
  name: azure-vote-front
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: azure-vote-front

アプリケーションの実行

kubectl create -f azure-vote.yaml

以下のような出力がなされれば完了

deployment "azure-vote-back" created
service "azure-vote-back" created
deployment "azure-vote-front" created
service "azure-vote-front" created

アプリケーションをテストする

アプリケーションが実行されたあとに、アプリケーションフロントエンドを公開するための kubernetesサービス が作成されますが、数分かかります。
状況を監視するには以下のコマンドを利用します。

kubectl get service azure-vote-front --watch

EXTERNAL-IP が <pending> の状態ではまだ完了していません。
EXTERNAL-IPが確定したら、 ctrl+c を実行してwatchを停止します。

外部アドレスで接続し、アプリの動作を確認する

ブラウザに先程のEXTERNAL-IPを入力し、アクセスします。

→ Cats & Dogs の投票ができました。

(注:実行するとリソースグループごと消えます)クラスターを削除する

クイックスタートで実行したクラスタをリソースグループごと削除します。 (このコマンドを実行すると作成したクラスタが、最初に作成したリソースグループごと消えます)

az group delete --name ${RESOURCE_GROUP_NAME} --yes --no-wait

結構簡単に利用することができた。
一番しんどかったのはAKSクラスタを作成する az aks create コマンドを実行したときでした。(1時間近く待ちました・・・)

とはいえ、コンテナも作成してあり、yamlの記述に不安がなければ比較的かんたんに利用できそうです。

enjoy!

Mac に brew を使って Azure Client をインストールする

そんなに難しい話じゃないのでサラッとメモ

Azure Client をインストール

brew update && brew install azure-cli

az コマンドでログイン

az login

こんなかんじ

(おまけ) コマンドのアップデート

brew update && brew upgrade azure-cli

ほぼ公式ドキュメントに書いてあるけど

URL : https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-macos

Windows Subsystem for Linux (Ubuntu) をインストールしてみた所感

ちょっとWindows上で開発する機会があり、 昔Windows上で開発する際に CoLinux (Portable Ubuntu) を入れて使っていたのが便利だったのを思い出し、 MS標準で提供されているWindows Subsystem for Linuxを使ってみた

インストール方法

他に詳しい記事が有るので書きませんw

所感

思っていたようなものではなかった

Windows側で実行したバッチが吐き出しているファイルをLinux側でtail -fして確認するなどをしたかったが、どうやら動かないようだ。

→ 結果としてwatchコマンドで0.5秒ごとに更新して使った watch -n 0.5 "tail -n 30 hogehoge.log" みたいな感じで

portable ubuntuではできていたような気がするのでこの点は悲しい。

数日触ってみたけど、なんとなく微妙だなぁという感想。

雑な記事になってしまったが、以上です。

Goでsliceをを結合する方法

Goのスライス同士を結合しようとした場合、
泥臭くループを回してappendをしようとしたあなた。ちょっと待って。✋

append のシグニチャをみてみる

builtin.go を読んでみましょう

func append(slice []Type, elems ...Type) []Type

ほほう。
二つ目の引数は可変長で受け取れるようになっている

appendは一度に複数追加できる

回り道しますが、
可変長の引数なので

append(hogeslice, elem1, elem2, elem3)

のような複数の追加が可能です。

可変長引数にスライスは ... をつけると渡せる

タイトルの通り。
つまり

append(hogeslice, fooslice...)

という感じでslice同士を結合することが可能です。
もちろん↑のコードは戻り値を変数で受け取ってませんが、
ちゃんと compositeslice := append(~~~) のように書いてくださいね。

goで再帰的にディレクトリを作成する

goでディレクトリを作成する場合、 os.Mkdir("./hello", os.ModePerm) のような感じで簡単にディレクトリを作れますが、
深い階層まで再帰的にディレクトリを作成したい場合には以下の方法を利用します。

再帰的にディレクトリを作成する

os.Mkdir は単一のディレクトリを作成する場合に利用します
フォルダパスで作成する場合には以下のように書きます。

os.MkdirAll(folderPath, os.ModePerm)

参考URL : go - How to create nested directories using Mkdir in Golang? - Stack Overflow

constで定義した値(string)をポインタとして扱おうと思ったら怒られた

タイトルの通りですが、

goでconstで定義したstringの値をポインタとして渡したい箇所があり、
constで定義した値をそのまま渡そうと思ったら cannot take the address~~ みたいな形で怒られたのでメモ

ざっくりとしたコード

具体的にはgoでS3のsdkを使っていてstringをポインタで渡さなくてはならない箇所があったのですが、
コードの概要として以下のようなイメージ

const a = "hoge"

process(&a) // cannot take the address

Stackoverflowでは

定数はアドレス指定可能なものとしてリストされておらず、アドレス指定可能なものとして指定されていないもの(上で引用したもの)は、アドレス演算子&のオペランドにすることはできません。

のように書かれていたのでやはりダメみたい。

一旦変数に受けてポインタにする

const a = "hoge"

p := a

process(&p)

変換する関数を経由すれば良いと思う

// const to pointer
func CtoP(con string) *string {
    return &con
}

const a = "hoge"

process(CtoP(a))

なるほどね。

参考URL : pointers - Find address of constant in go - Stack Overflow