僕のメモ帳

僕のメモ帳です。

Goの勉強 Hello World編

こんばんわ。たかしです。

 

今日もGoの勉強です。

時間が取れず、めちゃくちゃ久しぶりにやっています。

 

とはいえ、今日ももう時間がないので…プログラミングを勉強するときの基本「Hello World」を表示してみよう!をやります。

 

プログラム書いたことある人はご存知かと思いますが、理由は知らないんですけど、プログラミング言語勉強するときって必ず「Hello World」と表示させるところから勉強が始まるんです。

まあ、何か文字を出力させるのが一番簡単なことだし、「あ…ここここんにちは…」なんてコミュ障丸出しの出力だと気持ち悪いので、ここは先人に倣って「Hello World」を表示させて今日は寝ようかと思います。

 

というわけで、今日はいつもと違う記事を参考に進めたいと思います。

参考にしたのはこちらのページです。

news.mynavi.jp

 

さあ、早速進めましょう。

 

Hello World!!

プログラムはサクラエディタなり好きなエディタで書けばいいかと思いますが、今日はチョンプロなのと、いちいち書いたソースをAWSにアップするのは面倒なので、viコマンド使って書いて行っちゃいます。

$ vi hello.go

Go言語のファイル拡張子は「.go」らしい。

 

まずは、パッケージ名を指定するようだ。

package main 

 

続いて、文字出力するのに必要なprintf関数を利用するために「fmtパッケージ」を指定するようだ。

 import "fmt"

※fmtは"(ダブルクォート)で囲うみたいね。

 

そして最後にmain関数を定義して文字出力を行う。

文字の出力にはfmt.Printf関数を使うとのこと。

func main(){
// 文字出力
fmt.Printf("Hello World!!\n")

 

さあ、これで完成。完成したソースはこちら。

// パッケージ名
package main

 

// fmtパッケージを取り込む
import "fmt"

 

// main関数
func main(){
    // 文字出力
    fmt.Printf("Hello World!!\n")

 

保存して、いざ実行!

$ go run hello.go
Hello World!! 

 

おー!表示された!

 

ところで、Goってコンパイルしなくても動くんですね。

なんて思ったら、本格的に動かすにはやはりコンパイルが必要なようだ。デバッグするときに「go run」を使うのかね。そこらへんはおいおい調べていきますかね。

 

先ほど作成した「hello.go」をコンパイルして実行するのはこうします。

$ go build hello.go
$ ./hello
Hello World!! 

 

ここら辺は、C言語に似ている感じかな。

 

今日教材にしたページには他にも色々あったので、明日また続きやろうかな。

今日はここまで。おやすみなさい。

Goの勉強 バージョン比較で遊んだから記事にしてみた編

こんにちは。たかしです。

 

今回も前回に引き続いて、Go言語とAmazon Web Service(AWS)の勉強です。

 

前回の記事はこちら

bokunomemocho.hatenablog.com

 

僕がGoの勉強をするのに使っている本はこちらです。kindle unlimited入っていると月額で読めますよ!

www.amazon.co.jp


 

今回は「第2章 S3イベントの活用」を読み進めていきたいと思います。

 

S3とかシーケンスとかフォルダ構成とか

最初のほうは、S3の説明とかシーケンス図とかフォルダ構成の説明とかが書いてある。

S3はAWSが提供しているサービスのことで、こういうのもブログでまとめていくといいんだろうなぁ。いずれAWSのことも本格的な記事にしていこうかと思います。

 

シーケンス図とフォルダ構成は重要なことではあるけれども、そもそもGoを触ったことないので、ソース読んだり書いたりしながら参照していくことにしよう。

 

では、ソース作成…その前に

ソース作成に入ります。こういうのってどこまで書いていいのか難しいところですなぁ。重要そうなポイントをピックアップしていくレベルなら問題ないかな?

 

まずは、Goは1.11.2を使用するそうなので、自分の作業領域だけを1.11.2にしてほしいとのこと。手順に従って1.11.2を設定。

$ goenv local 1.11.2
goenv: version '1.11.2' not installed

インストールされてないから設定できんのかーい!

 

仕方ない。インストールして設定しますか。

$ goenv install 1.11.2

$ goenv local 1.11.2

$ goenv local
1.11.2

$ goenv global
1.16.2

おーできたできた。「goenv local」は1.11.2だけど「goenv global」は1.16.2だ。

 

 

折角なので、「goenv local」と「goenv global」の違いを楽しんでみることにしよう。

今、「/home/ec2-user/work 」で作業をしている。つまりここのエリアでは、Go1.11.2が有効になっているわけだ。

$ pwd
/home/ec2-user/work
$ goenv local
1.11.2
$ go version
go version go1.11.2 linux/amd64

 

では、フォルダを移動した場合どうなるのだろうか?

試しにホームディレクトリに移動して、同じコマンドを実行してみよう。

$ cd ~

$ pwd
/home/ec2-user$ goenv local
goenv: no local version configured for this directory$ go version
go version go1.16.2 linux/amd64

 

ほー!なるほど!まず「goenv local」を実行すると「goenv: no local version configured for this directory」と言われる。つまり「ローカルバージョンの設定、このディレクトリではしていないですやん」とのこと。

そして、「go version」。「goenv local」でバージョン設定した「/home/ec2-user/work 」内では「1.11.2」。「/home/ec2-user」ではバージョンは「1.16.2」。つまり、環境構築時に設定した「go global」が有効になっているというわけ。

こうやって試すと、コマンドに意味が分かりやすいし楽しい。

 

 

と、なんかいい感じの記事になったので、いったんここで区切ります。

次回の更新では、続きのコーディング部分をやります!

 

ではまた。

Goの勉強 環境構築編

こんにちは。たかしです。

 

会社からの要望で、Go言語とAmazon Web Service(AWS)の勉強をすることになりました。

 

特に

  • Go
  • AWSのデータベース
  • AWS Lambda

ここを勉強してほしいと言われたことと、オススメ図書を教えてもらいましたので、まずはその本をやりながらブログ書いていこうかと思います。

 

ただの技術ブログだとつまらないので、読み物としても面白くなるように文章も頑張ります。

 

僕がオススメされた本はこちらです。kindle unlimited入っているので月額で読めました、ラッキー!

www.amazon.co.jp


 

まずは環境構築…いきなり問題発生

 さあ、まずは環境構築するか!ってことで「第一章 環境構築」を開く。

macOSでの開発を前提としています』だと…?!

 

家ではWindowsを使っている僕。(しかも20代前半で買ってそろそろ10年くらい経つ)

しかも、第二章を確認するとこの環境構築の章で扱っているものをかなり扱っている模様。

Windows向けに同じものをインストールしていく必要がありそう…

そういえば、昔勉強するためにAWSのアカウント作ったなー。AWS環境にGoインストールして使うかー。と思い、自分のEC2環境に構築することに。

使用しているOSは、Linuxです。

 

というわけで、早速インストール。

 

ブログ書きながら進めたので、作業はだいたい3時間ほどかかりました。

書かなければすぐ終わると思います。笑

 

anyenv

$ git clone https://github.com/riywo/anyenv ~/.anyenv

$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bashrc

$ echo 'eval "$(anyenv init -)"' >> ~/.bashrc

$ exec $SHELL -l

 

「exec $SHELL -l」が「exec $SHELL -1」に見えてしまい打ち間違い。コマンドが落ちてしまった。。。

再ログインするとこんなメッセージが表示された。

ANYENV_DEFINITION_ROOT(/home/ec2-user/.config/anyenv/anyenv-install) doesn't exist. You can initialize it by:
> anyenv install --init

 

念のため、初期化しておく。

$ anyenv install --init
Manifest directory doesn't exist: /home/ec2-user/.config/anyenv/anyenv-install
Do you want to checkout ? [y/N]: y
Cloning https://github.com/anyenv/anyenv-install.git master to /home/ec2-user/.config/anyenv/anyenv-install...
Cloning into '/home/ec2-user/.config/anyenv/anyenv-install'...
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 62 (delta 1), reused 1 (delta 0), pack-reused 57
Unpacking objects: 100% (62/62), done.

Completed!

 

ふー。これで何とかなったのかな?

 

 anyenvupdate

続いて、anyenvupdateを実行する。

$ mkdir -p $(anyenv root)/plugins

$ git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update

$ anyenv update

 

盛大にログ出るかと思ったら、結構あっけない量しかログが表示されなくて、本当にアップデートできているのか不安。笑

 

goenvとGo

いよいよGoのインストールだ。

goenvっていうのはGoのバージョン管理用のツールらしい。この本ではanyenv配下で管理をしていくとのこと。

$ anyenv install goenv

$ exec $SHELL -l

$ goenv install --list

 

インストールは、「goenv install --list」で表示されたバージョンの中から指定して実行するらしい。

使用している本はちょっと古いのでVer1.11.2らしい。

僕がこのブログ書いているときの最新はVer1.16.2 。

なので、1.16.2をインストールしておくことにします。

$ goenv install 1.16.2

 

利用するバージョンも指定する必要があるらしい。

「global」と「local」の二つがあって、システム全体で利用するなら「global」。特定ディレクトリ内なら「local」。という使い分けをするようだ。

システム全体で使いたいので、迷わず「global」で行けよ。行けばわかるさ。

$ goenv global 1.16.2

$ goenv global
1.16.2

 

本には書いてなかったけど、Goのバージョンを確認してみる。

$ go version
go version go1.16.2 linux/amd64

うん。ちゃんと1.16.2になってる。

 

最後に、GOPATHを指定してあげる必要があるようだ。指定先はどこでもいいようなので、とりあえず作業領域に設定しておく。

$ export GOPATH=/home/ec2-user/work

$ printenv GOPATH
/home/ec2-user/work

 

exportで設定したけど、ログイン時に毎回設定するの面倒なので「.bash_profile」に書き込んじゃうか。

$ echo 'export GOPATH=/home/ec2-user/work' >> ~/.bash_profile

$ tail -1 ~/.bash_profile
export GOPATH=/home/ec2-user/work

これで次回からログインしても設定する必要ないかな。

 

pyenvとPython

この本では、Pythonのインストールも必要らしい。

pyenvというのはPythonのバージョン管理ツールとのこと。先ほど利用したgoenvと同じですね。(※爆乳戦隊パイレンジャーのパイではありません)

$ anyenv install pyenv

$ exec $SHELL -l

 

ここから先も、goenvと使い方同じですね。

バージョン確認して、バージョン指定でインストール。利用するバージョンの指定をするようだ。

$ pyenv install --list

 

最新版のPythonを入れたいところだが、このあとインストールする「aws-sam-cli」というののサポートがPython2.7と3.6をサポートしているらしい。だから3.6をインストール。すると思いきや、この本によると3.7でも問題なく動いたから3.7インストールしようぜ!とのこと。まあ、3.7でも最新版ではないのだけど、ここは本に従うことにする。

$ pyenv install 3.7.0

~~~

BUILD FAILED (Amazon Linux 2 using python-build 1.2.26)

~~~

make: *** [install] Error 1

 ん?んんん???インストールエラー???

インストールできなかったら先に進めないけど、AWSに最初からPythonインストールされているならそれでいいよね。と思い、バージョン確認実施!

$ python --version
Python 2.7.18

よかったー!最初からインストールされてたじゃん!しかもサポートされている2.7で。なんて喜んでいたら、この後利用する「pip」コマンドがPython3.6からじゃないと対応していないんだってさ。(ブログでは端折ってますが、2.7のまま突き進んでエラーになって調べた。)

 

というわけで、違う手順を使ってバージョンアップを試します。

参考にしたのはこちらの記事。

docs.aws.amazon.com


 

さあ、バージョンアップだ!

$ sudo yum update

$ sudo yum install python3 -y

OK!

 

$ python --version
Python 2.7.18
$ python3 --version
Python 3.7.9

おー、 Pythonで見ると2.7.18だけどPython3で見ると3.7.9だ。

 

GoとPythonのバージョン確認

anyenvでインストールしたものは一覧で確認とれるらしい。さっき調子に乗ってGoもPythonもバージョン確認してしまったけど、ここでも確認しておく。

$ anyenv version
goenv: 1.16.2 (set by /home/ec2-user/.anyenv/envs/goenv/version)
pyenv: system (set by /home/ec2-user/.anyenv/envs/pyenv/version)

pyenvの「system」はインストールした3.7.9のことを言ってくれているんだと捉えて次行きますー

 

aws-cli

AWSのサービスを操作するためのツールとして「aws-cli」というのを使うらしい。

$ pip install awscli
bash: pip: command not found

あれれ。pipなんてコマンドは無いよって言われてしまった。

 

調べてみたら、インストールしてくる必要がある様子。

$ curl -kL https://bootstrap.pypa.io/get-pip.py | python

~~~

ERROR: This script does not work on Python 2.7 The minimum supported Python version is 3.6. Please use https://bootstrap.pypa.io/pip/2.7/get-pip.py instead.

3.6以上じゃないとだめだよって言われた。うおーめんどくせーーーー!

 

でもさ、待ちたまえよ。「Python」でバージョン確認したら2.7だったけど、「Python3」で確認したら3.7だったよね。つまりこういうことだ…

$ curl -kL https://bootstrap.pypa.io/get-pip.py | python3

~~~

Installing collected packages: wheel, pip
Successfully installed pip-21.0.1 wheel-0.36.2

はいビンゴ! 

 

では、再実行します。

$ pip install awscli

$ aws --version
aws-cli/1.18.147 Python/2.7.18 Linux/4.14.219-164.354.amzn2.x86_64 botocore/1.18.6

インストール成功!Pythonが2.7って表示されているのが気に食わないけど、まあいいでしょう。

 

クレデンシャルのセットが必要らしい。

$ aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-1
Default output format [None]:

とりあえずこれでOKかな?何か問題あったら都度修正しよう。

 

aws-sam-cli

続いて、aws-sam-cliをインストール。AWS Lambdaの実行とかができるようになるらしい。Dockerにも依存しているらしく。Dockerのインストールも必要。僕はDockerの勉強していたのでインストール済み。

 

では、早速aws-sam-cliをインストール。

$ pip install --user aws-sam-cli

 

続いて、環境変数のセット。

$ USER_BASE_NAME=$(python -m site --user-base)
$ export PATH=$PATH:$USER_BASE_NAME/bin

 

これも設定ファイルに書いておくか。

$ echo 'USER_BASE_NAME=$(python -m site --user-base)' >> ~/.bash_profile

$ echo 'export PATH=$PATH:$USER_BASE_NAME/bin' >> ~/.bash_profile

$ tail -3 ~/.bash_profile
export GOPATH=/home/ec2-user/work
USER_BASE_NAME=$(python -m site --user-base)
export PATH=$PATH:$USER_BASE_NAME/bin 

 

バージョン確認

$ exec $SHELL -l
$ sam --version
SAM CLI, version 1.21.1

 

これでaws-sam-cliのインストールは完了らしい。

 

saw

ホラー映画ではなく、CloudWatch Logsに出力されるログをコマンド画面に流してくれるツールとのこと。

早速インストール。

$ pip install saw

これで完了かな。

 

direnv

特定のディレクトリ配下の環境変数を管理するためのツールらしい。

$ git clone https://github.com/direnv/direnv

$ cd direnv

$ sudo su

# make install

ほい。インストール完了。

 

シェルにフックを設定する。

$ export EDITOR=vim
$ eval "$(direnv hook bash)"

 

ここら辺も設定ファイルに入れておこうかな。

$ echo 'export EDITOR=vim' >> ~/.bash_profile

$ echo 'eval "$(direnv hook bash)"' >> ~/.bash_profile

$ tail -5 ~/.bash_profile
export GOPATH=/home/ec2-user/work
USER_BASE_NAME=$(python -m site --user-base)
export PATH=$PATH:$USER_BASE_NAME/bin
export EDITOR=vim
eval "$(direnv hook bash)"

 

dep

Goの依存関係を管理するためのツールとのこと。

ただ、MACLinuxでは手順が違う上にうまくインストールできなかったので、いったんパスします。


gig

使用している本の筆者さんが作ったツールらしい。

いよいよLinuxへのインストール方法がわからなかったのでこれもパス。

 

環境構築終了

これで環境構築終了!

depとgigはどうしても必要そうだったらインストール方法考えます。

 

今日はここまで!

 

次回は本の第二章部分を書きます。

時間かかるかもなので、のんびり更新してきます。

 

ではまた今度。

ブログ始めた

こんばんは。たかしです。

 

日々の勉強したことを、のんびりブログに書いていきたいと思います。

思っているだけです。続くように頑張ります。

 

書き方とかわからないので、しばらくはブログを書くための練習みたいな内容になるかと思います。

 

上手く書けるようになったら、本格的な内容をアップしていきますね。

 

ではまた。