GoLandを使わずにVS codeとdockerでGoの環境構築してみた

GoLandに さよならバイバイ♪

俺はこいつと 旅に出る♪(ドカチュー!)




はい、久々の更新です。週1で更新してやらぁとか言ってといて何ですが、申し訳ございません!


今回ですが、Go言語を学ぶにあたり、通常の環境構築だと迷わずGoLandにすると思うのですが、

あまり利用しないにも関わらず課金するのもなんだかなという思いと、同時に使い慣れているDockerとVS codeで開発したいという思いから試してみました。

試行錯誤の上、なんとかできたのでまとめます。

※超初心者、及び自分へのメモとして普通のエンジニアの方ではそこまで記載しないよってレベルまで細かく記載します。


なお、前提条件は以下

macOS Monterey
Apple M1
・Docker Desktop 4.7.0

目次
- Docker Desktop for Macをインストール
- VS codeのインストール
- 拡張機能のインストール
- Remote-Containersの設定をする
- コンテナの準備(compose作成→ volumeも同時に)



Docker Desktop for Macをインストール

Docker Desktopからチップを選んでdmgファイルをダウンロードする。

dmgファイルがDLされるのでダブルクリックすると、下記のポップアップよりクジラのマークをダブルクリックしてアプリをインストールする。

※ちなみに私の場合はこのクジラマークをダブルクリックすることが当初分からず、ひたすらdmgファイルをダブルクリックしてはこのポップアップが延々と出まくるという負のループで手こずった…多分自分だけ





VS codeのインストール

こちらからVS codeをインストール


※日本語化については下記参照
junpei-sugiyama.com




拡張機能のインストール

VSCodeのExtensionであるRemote Containersをインストールする。

Dockerを動かしつつ、VS codeで開発していくのに必要なものです。

構造は下記です。

code.visualstudio.com


インストール手順について

VSCodeの[歯車アイコン]->[拡張機能]をクリック

VS codeの左タブにある検索窓で「remote - containers」と入力し、Remote – Containersが出てくるのでインストール




Remote-Containersの設定をする

実際に開発で利用するディレクトリをVSCodeで開いて、設定を行います。 

Window左下のこのマークをクリックして

検索窓に「remote」と入力して、「Remote-Containers: Add Development Container Configuration Files...」がでてくるので、選択。

その後、再度上記の検索窓から「Remote-Containers: Add Development Container Configuration Files...」を選択。

検索窓にて「go」を入力し、Goを選択。

バージョン選択後、「OK」ボタンが出てくるので、OKをクリック。
右下に出てくるポップアップウィンドウの「Reopen in Container」をクリック。

以上でRemote-Containersの設定は完了!




コンテナの準備(compose作成→ volumeも同時に)

開発を行いたいディレクトリをマウントするため、docker-compose.ymlを作ります。


docker-compose.yml

version: "3"

services:
  golang:
    image: golang:1.9.3-alpine3.7
    tty: true
    volumes:
      - ./:/go
    environment:
      - "GOPATH=/go"

コンテナの中に入る

$ docker-compose exec golang ash
/go # echo $GOPATH
/go

goが入っているのが確認できます。

次にマウントできているか確認します。

$ docker-compose exec golang ash
/go # ls -la

docker-compose.yml
ファイルが確認できたのでマウントできたことがわかります。
これで完了!

ちなみに私は上記の手順を実行しても、最初はなぜかマウントが確認できなかったのですが、VS codeを再起動すると成功しました!

あと、Dockerfileかdocker-composeの議論があるようですね。

https://shura.design/2020/08/11/archives/2604shura.design


以上!

参考文献

https://qiita.com/masakurapa/items/fa867451053e41b69126
qiita.com

https://yamavlog.com/environment-vscode-docker-golang-mac/
yamavlog.com

PATHってなに???

PATHとは何か?

お待たせいたしました!お待たせしすぎたかもしれませんっ!!!



はい、週1で更新すると周りに言いふらかしつつ、全く更新できませんでした。
今回Udemy講座を受講する中で何度も「PATHが通ってないから無理っす」ってエラーに遭遇しました。

振り返りとまとめを合わせて書き残したいと思います。
本来私が知りたかったのは後に「PATHを通すとは何か」ということだったのですが、こちらは後述します。

PATH=ファイルやフォルダの置いてある場所を示す情報のこと

初心者でもなんとなく分かります。なんでこれが必要やねんってのを「初心者なりに」深掘りしていきます。
私はエンジニアではなくプログラミングを独学で学ぶおっさんなので、細かい間違いなどありましたらコメント欄から突っ込んでいただけると大変ありがたいです。


PATHはどんな場面で使用されるか

PATHとは何もプログラミングだけで利用される用語ではなく、例えば普段の仕事などでExcelを使いたいなどの場合でも利用されています。
たとえば、

Usres/name/Documents/projects/office365/excel
とあれば
・name : 個人フォルダ内の
・Documents : の中にある
・projects : の中にある
・office365 : というファイルの中にある
excel : を動かす
という流れでエクセルが立ち上がり、PATHとはMacであれWindowsであれ、何かしらアプリやシステムを起動する際に使用され、PCを使う際にほとんどの人が使用しているものである。といえますね。


PATHを通すとは

それでは、本題であるPATHを通すとは何かについて触れたいと思います。
そもそもPATHについてブログに記事化しようとしたのは、terminalでsudoコマンドを利用しようとしたら、

command not found

と返され、観ていたUdemy講座を止めて、ググりまくった結果

PATHが通ってなかった
ことが原因でした。
で、PATHを通すとは

プログラム名だけで実行できるようにするために、PATH という環境変数(設定の一種)に「このプログラムも名前だけで実行できるようにしてください」という値を追加すること
ということでした。
環境変数 = コマンドを実行するプログラムが保存されているディレクトリの場所を設定する変数

つまり、私の場合はsudoコマンドを利用するためのPATHが通ってなかったことになります。


必要なPATHを通す

必要なPATHを通すための流れとしては
①必要なPATHがあるか検索

#echo $PATH

②必要なPATHを通す

#export PATH=$PATH:PATH名

②で重要なのが、必要なディレクトリを指定してPATHを追加しないと大変なことになるということ。(何が大変か、なんかここまで書いて面倒になったので引用記事を参照ください)

ちなみに私は結局PATHが通ってない云々以前にそもそもHomebrewをインストールしていなかったため、brewコマンドが使えなかったことが原因でした(Macユーザーは結構あるっぽい)



以上!!


最近、息子が歩き回るようになってきたので、これを書いてる時も何度も手を止めて助けに行ったり、遊んだりして時間かかっちゃいました。
息子が可愛すぎて親バカどころか、ただのバカになることに最近気づきました。




引用記事qiita.com
hara-chan.com
cha-shu00.hatenablog.com
qiita.com

ethicsとprofit

コンプライアンス!!!

 本日は普段やっているプログラミングから離れて、私自身も勤めているスタートアップ企業の話を記載しようと思います。

 

 

シリコンバレーseason6を観て
シリコンバレーという海外ドラマのシーズン6(ファイナルシーズン)を先ほど一気に観終わりました。
ネタバレになるので、あまり言及できませんでが、感想としてはシリコンバレーらしい完結の仕方でした。
このドラマはスタートアップ企業のドタバタをうまく表現していて、あのビル・ゲイツ

シリコンバレーを理解したいのならドラマ『シリコンバレー』を見るべき」

と言っているほどです。
私もベンチャーとの関わりは7年くらいありますので、観ていて共感できるものばかりです。
 
前置きが長くなりましたが、このシリコンバレーseason6の出だしが
「倫理観(ethics)と利益(Profit)」
の問題でした。ドラマの中ではGAFAの個人情報収集問題が発端となっていました。
 
 
 
企業の個人情報収集問題
このドラマの問題は現実でも起きており(というかそれをドラマのテーマとして取り上げてた)、実際にGAFAと欧州などの政府との間で大きく問題になりました。
具体的には個々人のCookieデータ等を大量に収集し、広告料を荒稼ぎしていた点です。
現在はある程度世界的な(GDPRなど)規制が引かれています。
 
 
 
スタートアップと倫理観
倫理観というより、コンプライアンスの面に重視してみると、日本でも度々起きており、有名な事件としてライブドア事件がありました(利益に先走り粉飾決算を行なった)。
 
こうした問題はスタートアップにはつきもので、特にサービスローンチ当初は本当にギリギリのラインを攻めるので、ある程度のコンプライアンスには目を閉じるという方針が多いです。
私も過去に在籍した企業などで、サービスローンチ前の法務レビューでは常に、本来なら止めなければならないブラックラインギリギリを通していました。
※当然弁護士のレビューもありましたが「かなりグレーゾーンです」と言われることもしばしば
 
というより、サービス自体がそもそも他のにパクリにならない革新的なものを目指すと、どうしてもそうした法の抜け穴をついた内容にならざるを得なかったというのが正しい表現だと思っています。
 
利益を前提に考えれば、必ずしも倫理観を欠くことにはつながりませんが、少なくともゼロから競合他社と同じ領域で勝負しなければならないようなスタートアップでは、倫理観と利益の天秤は必ず直面します。
 
 
 
倫理観を捨てたら終わり
 とはいえ、やはり倫理観(コンプライアンス)を全く無視したやり方ですと、どんなに革新的で便利なサービスであっても、いつかは終わりがきます。
コンプライアンスについてより厳しくなった現在の世の中では、一度つまづいてしまうと、その後の成功はかなり厳しいものとなります。
特にVCから資金調達に頼る設立したばかりのスタートアップではなおさらであり、一度つまづくと上場はかなり遠ざかります。
 
一定の倫理観を捨てずに利益も出して、世の中を幸せにするのが真のスタートアップである
 
と信じこれからも業務に励みます(-`д´-)キリッ
 
 

久々の更新

f:id:pythonchan:20210529162732p:plain


3年ぶりの更新をさせて頂きます。

とはいえ、ずっとプログラミングは続けており、Djangoを扱うようになり、言語もPythonだけでなく、GOにも幅を広げました。そしてPCもMacBookにしました。

 

古くからの友人にも久々にエンジニアブログを更新することを告げ、自分にプレッシャーを掛けるつもりでも改めて更新しようと思います。

 

これまで読んでいただいた方もいれば、初めて読む方もいるので、改めて簡単な経歴紹介を行おうと思います。(ここまで真面目(-`д´-)キリッ

 

小さい頃から法律(中学2年で六法全書を買った)触れ、大学も法学部に進む。

卒業間近で、ロースクールに進学が決まっていたにも関わらず、何を思ったか盛大な厨二病を発症し、

「将来はCIAかMI6と仕事してぇな」と思い、警察庁(の公安部)か公安調査庁を目指すようになった。

 

特に公安調査庁は実際にCIAと仕事をしていると聞いた(官庁訪問でこっそり教えてくれた)ので、志望度は高かった。

公安調査庁|法務省ってどんなところ?|きっずるーむ

 

当時司法試験の勉強で16時間/日くらい勉強していたため、国家公務員Ⅰ種試験(法律職)(以下、「国I」)も「司法試験にくらべたらm9(^Д^)」みたいなノリだった。

 

昔から僕は数学が異常に好き、いやもう趣味であったので、高校時代は何を思ったか、SAT mathを解いたりと本当に頭がおかしかった。

 ※高校時代は純粋な文系組

そこで、国Iの試験科目の一つである数的処理にはまり、朝起きて深夜まで解き続けることもあった。
www.path-to-success.net

なんだかんだギリギリで国Iに合格し、官庁面接ではまず警察庁を受けたが、面接官がとてもムカつくクソ野郎で「君公務員向いてないね」とか言われた合わない方だったので、途中でぶん殴りそうになったので面接を中断して帰った。(始まって20分くらい)

 

面接始まる10分前に本庁3階のトイレで金髪をスプレーで黒に染めたのもいい思い出である。(本当

 

結局、公安調査庁どうせつまねー奴が面接するだろうと思い断念した。

体も鍛えていたので、Navy SEALsに入隊しようとかたまに厨二病を発症しながら大学を卒業。

 

その後、企業で法務をやったり、ベンチャーで財務担当したり、上場企業の投資事業部でボロ雑巾のように働いたりと色々あったが、今は優秀なエンジニアさんたちが大勢いる会社で働けて幸せである。

以上経歴。

 

これからは週1くらいで更新しようと思う。内容は主にUdemyの講座で学んだことを発揮する場にしていきたいと思います。

 

 

ディープラーニングの入り口、Kerasを張り倒す

統計学の勉強に疲れたので、Pythonに立ち返る。

ってことでディープラーニングの世界に触れてみる

Kerasって何ってそこの人のために↓
dev.classmethod.jp
employment.en-japan.com
qiita.com

Kerasのインストール~TensorFlowのバックエンドの設定

# Kerasのインストール
$ pip3 install keras==2.0.5
# nanoエディタをインストール
$ apt-get install nano
# ファイルの記述の準備
$ mkdir ~/.keras
$ nano ~/.keras/keras.json

# TensorFlowをバックエンドで実行するため設定ファイルを記述
{
    "image_dim_ordering":"tf"
    "epsilon":1e-07,
    "floatx":"float32",
    "backend":"tensorflow"
}

# 記述後Ctrl+Xで保存を選択してnanoを閉じる

MNISTを試してみる

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import Adam 
from keras.utils import np_utils

# MNISTのデータを読み込む
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# データをfloat32型に変換して正規化する
X_train = X_train.reshape(60000, 784).astype('float32')
X_test  = X_test.reshape(10000, 784).astype('float32')
X_train /= 255
X_test  /= 255
# ラベルデータを0-9までのカテゴリを表す配列に変換
y_train = np_utils.to_categorical(y_train, 10)
y_test  = np_utils.to_categorical(y_test, 10)

# モデルの構造を定義
model = Sequential()
model.add(Dense(512, input_shape=(784,)))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.2))

model.add(Dense(10))
model.add(Activation('softmax'))

# モデルを構築
model.compile(
    loss='categorical_crossentropy',
    optimizer=Adam(),
    metrics=['accuracy'])


# データで訓練
hist = model.fit(X_train, y_train)

# テストデータを用いて評価する
score = model.evaluate(X_test, y_test, verbose=1)
print('loss=', score[0])
print('accuracy=', score[1])

結果…

60000/60000 [==============================] - 16s - loss: 0.2217 - acc: 0.9325
Epoch 2/10
60000/60000 [==============================] - 16s - loss: 0.1117 - acc: 0.9656
Epoch 3/10
60000/60000 [==============================] - 16s - loss: 0.0877 - acc: 0.9734
Epoch 4/10
60000/60000 [==============================] - 17s - loss: 0.0714 - acc: 0.9778
Epoch 5/10
60000/60000 [==============================] - 17s - loss: 0.0623 - acc: 0.9816
Epoch 6/10
60000/60000 [==============================] - 17s - loss: 0.0576 - acc: 0.9820
Epoch 7/10
60000/60000 [==============================] - 17s - loss: 0.0580 - acc: 0.9831
Epoch 8/10
60000/60000 [==============================] - 17s - loss: 0.0469 - acc: 0.9864
Epoch 9/10
60000/60000 [==============================] - 17s - loss: 0.0486 - acc: 0.9861
Epoch 10/10
60000/60000 [==============================] - 19s - loss: 0.0466 - acc: 0.9866
 9728/10000 [============================>.] - ETA: 0sloss= 0.09370438802893359
accuracy= 0.9782

サンプルコードを手打ちしたので疲れる…
訓練データとテストデータ合わせて約7万件のデータを処理するので割と時間がかかる…
正答率は97.82%という。
ディープラーニングのサンプルといえばMNISTだけども、実務ではどのくらいのデータ量を処理するのか…

今回何より勉強になるのが、TensorFlowをバックエンドで動かすところ。

TensorFlow単一で書くとより複雑で何やっているか分かりにくいが、Kerasだとすっきりして分かりやすい。

ちょっとわくわくしてくる(;゚д゚)ゴクリ…

詳しい中身はまた今度分析してみる

Docker tool-boxでwindowsホストディレクトリをマウントする

f:id:pythonchan:20180408162313j:plain
Dockerと一言で言っても

①Docker machine

②Docker tool-box

③Docker for windows,mac

と色々ある。私のような初学者だとdockerコマンドもいちいちググって実行するが、このホストディレクトリのマウントはかなり苦労したので備忘録として残す。

なお、これから記載する方法は

・Windows10 Home or Pro

・Docker tool-box

に限る。これ以外では通用しないことがあるのでご注意いただきたい。
失敗例から見ていきます。
通常下記の通り進めるとマウントできる(らしい)

通常
docker run時のオプションとして-v /c/Users/[host directory]:/[container directory]を入れる.

すると,ホストのC:Users/[host directory]が,コンテナの/[container directory]にマウントされる.

docker run -v /c/Users/[host directory]:/[container directory] [container]
# 例として
docker run -v /c/Users/Host/test:/test ubuntu /bin/bash

はい、できませんでしたー

何が起こるかというと、上記のコマンドを行うとdocker runなので当然コンテナができる。
しかし…

# 作成されたコンテナを使用するためコンテナ起動
$ docker start [container ID]

# 起動したコンテナに入る
$ docker attach [container ID]
You cannot attach to a stopped container, start it first

You cannot attach to a stopped container, start it first

は?

いやなんで入れないねんwってことで永遠と作成されたコンテナに入れません。docker ps -aで見ると確かに作成されているのは確認できるのに…

どうやらVirtualBoxとの連携バグからこうなるらしい(クソOracleめ)

そこで!大量のネットの情報を試しに試してたどり着いたのが以下の方法

正しいマウント方法

# 事前にsrcディレクトリに適当にtest.txtを作成
# ホストユーザーのsrcディレクトリをubuntuイメージでマウント
$ docker run -it -v //c/Users/#HOSTUSER/src:/src ubuntu /bin/bash

# コンテナinするので確認
$ [container ID]# cd src
$ [container ID]:/src# ls
test.txt

ま、マウントできた!!!
ポイントは/をcの前に二重にすること!
これだけのために色んなサイト見ましたが、//cと記載あるのは少なかった(どいつもこいつも自称エンジニア(笑)の知ったかばかりだ)


しかし、気づきましたが、Winows環境での開発は少ないのでもはやMacに乗り換えるのが必須かもしれません。
なぜならネット上の多くの情報がMac環境下での情報であり、Win環境は海外サイトを漁らないと出てこないことが多いからです…
そもそもdocker for windowsHyper-Vとかクソ重い仮想マシンも使いにくい…

以上

Selenium+PhantomJSの実行環境を整える

以前エラーが出まくって原因探るうちに日が暮れたので、再度復習の意味で記載。が、また同じエラーが出て日が暮れたので…
本当はAbemaTVの将棋チャンネルで順位戦A級プレーオフ「羽生竜王vs稲葉八段」を観ながらやっていたので間違えまくった

・Docker上にUbuntuを構築

# DockerにUbuntuのイメージを導入
docker pull ubuntu:16.04
# Ubuntuを実行しシェルにログイン
docker run -it ubuntu:16.04

・シェルにログイン後、PythonSeleniumをインストールする

# ログインするとroot@〇〇でログインしたことが分かる
# python3とpip3のインストール
apt-get update
apt-get install -y python3 python3-pip

# Seleniumのインストール
pip3 install selenium

# BeautifulSoup4をインストール
pip3 install beautifulsoup4

・PhantomJSをインストール

# PhantomJSの稼働に必要なライブラリをインストール
apt-get install -y wget libfontconfig

# バイナリをダウンロードしてインストール
mkdir -p /home/root/src && cd $_

# root@〇〇:/home/root/srcとなりディレクトリに入る
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2

# "phantomjs-2.1.1-linux-x86_64.tar.bz2' saved"で完了
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2

# なんかいっぱい表示されて震える
cd phantomjs-2.2.1-linux-x86_64/bin/

# root@〇〇:/home/root/src/phantomjs-2.1.1-linux-x86_64/binに入る
cp phantomjs /usr/local/bin/

ここまで書いたところで優勢だった稲葉八段がやばいことに気づき解説に食い入る…後手羽生さんの△6五角⇒△2八飛からの攻めがきつい…と思ったら△6五角と指され、稲葉八段が小刻みに揺れだす…

ではなく、よく間違えたのは日本語フォントが表示されるように調整するコード
この写経はつらい…

# 日本語フォントをインストール
apt-get install -y fonts-migmix

# フォントの設定を書き換える
cat <<EOF > /etc/fonts/local.conf

# ">"で書き換えができるようになる
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
   <match target="pattern">
        <test qual="any" name="family">
           <string>serif</string>
        </test>
        <edit name="family" mode="assign" binding="strong">
            <string>MigMix 2P</string>
        </edit>
   </match>
</fontconfig>
EOF

これでよし
PhantomJSが文字化けにならなくなる。

ここで△5六角(詰み筋は見えてまっせと言わんばかりの一手)というなんともえげつない手で稲葉八段がさらに追い詰められ、AIによる形成判断は「羽生竜王70:30稲葉八段」とされ完全におわt…

最後にコンテナIDをubuntu-phantomjsにコミットして終了

これが意外に後でかなり影響するので残しておく


参考にした本