【文法系】【go】基本⑥:文字列型
本noteの概要
golang(以下、go)の基本的な文法と出力内容について確認する。
本noteの対象者
・goをインストール済みの方
※ 筆者は仮想環境上でgoを実行していますが、ローカル環境でも基本的に挙動は変わらないと思います、goがインストールされていれば問題ないかと。
▽ 仮想環境上でgoを動かしたい方は以下参考までに ▽
【手順系】【go】仮想環境上でのWebアプリケーション開発①:go環境構築 - This is My note
本noteの環境
PC環境(ホスト)
# OSのバージョン (base) $ sw_vers ProductName: Mac OS X ProductVersion: 10.14.6 BuildVersion: 18G2022 # Virtualboxのバージョン (base) $ VBoxManage -v 6.1.2r135662 # vagrantのバージョン (base) $ vagrant -v Vagrant 2.2.7
仮想環境(ゲスト)
# Linuxのバージョンが記載されているファイルを検索 vagrant@:~$ ls /etc/*-release /etc/lsb-release /etc/os-release # ゲストOSのバージョンを出力 vagrant@:~$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
仮想環境上のディレクトリ構成
workspace - src - test - lesson.go
現在のディレクトリ
vagrant@vagrant-ubuntu-trusty-64:~/workspace/src/test$ pwd /home/vagrant/workspace/src/test
【注】
以降、特段の記述がない限り、コマンドの実行は現在のディレクトリ(test)で行われるものとし、文字数削減のため、表記を以下に省略して記述する。
省略前:vagrant@vagrant-ubuntu-trusty-64:~/workspace/src/test$
↓
省略後:$
Today's Thema:goにおける文字列の取り扱い
1.文字の連結
package main import ( "fmt" ) func main(){ fmt.Println("Hello World!") fmt.Println("Hello " + "World!") fmt.Println("Hello", "World!") }
▼ 実行
$ go run lesson.go Hello World! Hello World! Hello World!
2.指定したインデックス番号に対応する文字の出力
package main import ( "fmt" ) func main(){ fmt.Println(string("Hello!"[0])) fmt.Println(string("Hello!"[1])) fmt.Println(string("Hello!"[2])) fmt.Println(string("Hello!"[3])) fmt.Println(string("Hello!"[4])) fmt.Println(string("Hello!"[5])) }
▼ 実行
$ go run lesson.go H e l l o !
《解説》
RubyやPythonでは[]でインデックス番号を指定するだけで、対応する文字を出力することができるが、goではインデックス番号の指定に加えて、文字列型(string)であることを明示する必要がある。
なお、文字列型(string)を指定しなかった場合には、以下のようにアスキーコード(ASCII code)が出力される。
func main(){ fmt.Println("Hello!"[0]) }
▼ 出力
72
3.文字の置換
使用例①
package main import ( "fmt" "strings" // ライブラリ(strings)のインポート ) func main(){ fmt.Println(strings.Replace("Hello", "H", "X", 1)) // 置換設定:strings.Replace("文字列" or 変数名, "変換対象の文字", "変換後の文字", 変換する回数) }
▼ 実行
$ go run lesson.go Xello
使用例②
package main import ( "fmt" "strings" ) func main(){ var s string = "Hello World" fmt.Println(strings.Replace(s, "l", "X", 2)) }
▼ 実行
$ go run lesson.go HeXXo World
《解説》
上記については、あくまで文字を置き換えて出力しただけなので、元々の変数(s)の中身は変わっていない。変数の中身自体を変更したい場合は、置換した内容を再度変数に代入する必要がある。
package main import ( "fmt" "strings" ) func main(){ var s string = "Hello World" fmt.Println(strings.Replace(s, "l", "X", 2)) fmt.Println(s) s = strings.Replace(s, "l", "X", 2) fmt.Println(s) }
▼ 実行
$ go run lesson.go HeXXo World Hello World HeXXo World
4.特定の文字を含むかどうかの確認
package main import ( "fmt" "strings" ) func main(){ var s string = "Hello World" fmt.Println(strings.Contains(s, "World")) }
▼ 実行
$ go run lesson.go true
5.文字の繰り返し
package main import ( "fmt" "strings" ) func main(){ fmt.Println(strings.Repeat("*", 20)) fmt.Println("Hello World") fmt.Println(strings.Repeat("*", 20)) }
▼ 実行
$ go run lesson.go ******************** Hello World ********************
《解説》
RubyやPythonでは乗算の演算子(*)を使って「"文字列"*出力回数」と書くことができるが、goでは使えないので注意。goでは「strings.Repeat("文字列" or 変数名, 出力回数)」とする必要がある。
6.文字列の改行
使用例①:改行箇所に「\n」をつける
package main import ( "fmt" ) func main(){ fmt.Println("Hello\n" + "World") }
▼ 実行
$ go run lesson.go Hello World
使用例②:`(バッククォート)で囲む
※``で囲んだ場合、コード内の位置のまま出力される
package main import ( "fmt" ) func main(){ fmt.Println(`Hello World Hello Tsubasa `) }
▼ 実行
$ go run lesson.go Hello World Hello Tsubasa
7.その他
特殊文字("(ダブルクォーテーション)など)の出力
package main import ( "fmt" ) func main(){ fmt.Println("\"") // \(バックスラッシュ)をつける fmt.Println(`"`) // `(バッククォート)で囲む }
▼ 実行
$ go run lesson.go " "
【手順系】【go】仮想環境上でのWebアプリケーション開発①:go環境構築
本noteの概要
仮想環境上でgolang(以下、go)を使用するため、Vagrantfileやシェルスクリプトに必要なコードを記載し、vagrant upコマンドで仮想環境を構築をする。
本noteの対象者
・VirtualBoxおよびVagrantをインストールしている方
・docker hubのアカウントを開設している方
・以下2つのVagrantプラグインをインストールしている方
❶ vagrant-vbguest
❷ vagrant-docker-compose
(base) $ vagrant plugin list vagrant-docker-compose (1.5.1, global) vagrant-vbguest (0.21.0, global)
(base) $ vagrant plugin install vagrant-vbguest Installing the 'vagrant-vbguest' plugin. This can take a few minutes... Fetching: micromachine-3.0.0.gem (100%) Fetching: vagrant-vbguest-0.21.0.gem (100%) Installed the plugin 'vagrant-vbguest (0.21.0)'! (base) $ vagrant plugin install vagrant-docker-compose Installing the 'vagrant-docker-compose' plugin. This can take a few minutes... Fetching: vagrant-docker-compose-1.5.1.gem (100%) Installed the plugin 'vagrant-docker-compose (1.5.1)'!
本noteの環境
PC環境(ホスト)
# OSのバージョン (base) $ sw_vers ProductName: Mac OS X ProductVersion: 10.14.6 BuildVersion: 18G2022 # Virtualboxのバージョン (base) $ VBoxManage -v 6.1.2r135662 # vagrantのバージョン (base) $ vagrant -v Vagrant 2.2.7
仮想環境(ゲスト)
# Linuxのバージョンが記載されているファイルを検索 vagrant@:~$ ls /etc/*-release /etc/lsb-release /etc/os-release # ゲストOSのバージョンを出力 vagrant@:~$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
This is My note
完成図
<最終的なディレクトリ構成>
▼ ホスト(ローカル)
- src # 今後のアプリケーション開発でソースを管理するための空のディレクトリ - setup - install.sh -Vagrantfile
▼ ゲスト(仮想環境)
- workspace - src - test - lesson.go
1.仮想環境構築準備
⑴ Vagrantfileの作成(Vagrant 初期化)
ターミナル上でvagrant init
コマンドを実行し、Vagrantの初期化を行います。初期化が完了すると、コマンドを実行したディレクトリ下に自動でVagrantfileが作成されます。
なお、vagrant init
コマンドの後に記載しているubuntu/trusty64
は、仮想環境上で動作させるOSの名称になりますが、vagrantのHPに多数の選択肢がありますので適宜必要なものをお使いください。
※ただし、選択したOSによっては、後ほど記載するシェルスクリプトの内容も合わせて変更する必要があります。
(base) $ vagrant init ubuntu/trusty64 =>出力 A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information on using Vagrant.
⑵ 構築する仮想環境の内容設定
① Vagrantfileへの記載
<Vagrantfile>
Vagrant.configure("2") do |config| config.vm.box = "ubuntu/trusty64" config.vm.network "forwarded_port", guest: 8085, host: 8085, auto_correct: true config.vm.synced_folder 'src', '/home/vagrant/workspace/src' config.vm.provision :docker config.vm.provision :docker_compose, compose_version: "1.24.1" config.vm.provision :shell, :path => "setup/install.sh" end
② シェルスクリプトの作成および記載
(base) $ mkdir setup && cd setup (base) $ touch install.sh
<setup/install.sh>
#!/bin/bash sudo DEBIAN_FRONTEND=noninteractive apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confnew" install git curl -O https://storage.googleapis.com/golang/go1.9.1.linux-amd64.tar.gz tar -xvf go1.9.1.linux-amd64.tar.gz mv go /usr/local rm go1.9.1.linux-amd64.tar.gz touch /home/vagrant/.bash_profile echo "export PATH=$PATH:/usr/local/go/bin" >> /home/vagrant/.bash_profile echo `export GOPATH=/home/vagrant/workspace:$PATH` >> /home/vagrant/.bash_profile export GOPATH=/home/vagrant/workspace mkdir -p "$GOPATH/bin"
2.仮想環境の起動・接続
⑴ 仮想環境の起動
(base) $ vagrant up Bringing machine 'default' up with 'virtualbox' provider... ==> default: Importing base box 'ubuntu/trusty64'... ==> default: Matching MAC address for NAT networking... ==> default: Checking if box 'ubuntu/trusty64' version '20190514.0.0' is up to date... ==> default: Setting the name of the VM: golang_default_1581772039639_59475 ==> default: Clearing any previously set forwarded ports... ==> default: Clearing any previously set network interfaces... ==> default: Preparing network interfaces based on configuration... 〜中略〜 default: go/test/const5.go default: go/test/const6.go default: go/test/convT2X.go default: go/test/convert.go default: go/test/convert1.go default: go/test/convert2.go default: go/test/convert3.go default: go/test/convlit.go default: go/test
⑵ 仮想環境への接続
(base) $ vagrant ssh Welcome to Ubuntu 14.04.6 LTS (GNU/Linux 3.13.0-170-generic x86_64) * Documentation: https://help.ubuntu.com/ System information as of Sat Feb 15 13:10:13 UTC 2020 System load: 0.51 Processes: 82 Usage of /: 4.3% of 39.34GB Users logged in: 0 Memory usage: 35% IP address for eth0: 10.0.2.15 Swap usage: 0% IP address for docker0: 172.17.0.1 Graph this data and manage this system at: https://landscape.canonical.com/ New release '16.04.6 LTS' available. Run 'do-release-upgrade' to upgrade to it.
⑶ インストール内容の確認
① goのインストール確認
vagrant@vagrant-ubuntu-trusty-64:~$ go version go version go1.9.1 linux/amd64
② dockerのインストール確認
vagrant@vagrant-ubuntu-trusty-64:~$ docker version Client: Version: 18.06.3-ce API version: 1.38 Go version: go1.10.3 Git commit: d7080c1 Built: Wed Feb 20 02:27:13 2019 OS/Arch: linux/amd64 Experimental: false Server: Engine: Version: 18.06.3-ce API version: 1.38 (minimum version 1.12) Go version: go1.10.3 Git commit: d7080c1 Built: Wed Feb 20 02:25:38 2019 OS/Arch: linux/amd64 Experimental: false
③ docker-composeのインストール確認
vagrant@vagrant-ubuntu-trusty-64:~$ docker-compose version docker-compose version 1.24.1, build 4667896b docker-py version: 3.7.3 CPython version: 3.6.8 OpenSSL version: OpenSSL 1.1.0j 20 Nov 2018
3.Hello world! (goファイルの作成と実行)
⑴ goファイルの作成
vagrant@vagrant-ubuntu-trusty-64:~$ cd workspace/src vagrant@vagrant-ubuntu-trusty-64:~/workspace/src$ mkdir test && cd test vagrant@vagrant-ubuntu-trusty-64:~/workspace/src/test$ touch lesson.go
⑵ Hello world!(goファイルの実行)
① goファイルの編集
<test/hello.go>
package main import "fmt" func main(){ fmt.Println("Hello world!") }
② goファイルの実行
ⅰ)go buildでコンパイル後に、バイナリファイルを実行
go buildでコンパイルすると、goファイルと同名の実行ファイル(バイナリファイル)が作成される。それを踏まえて、「./実行ファイル名」 でgoファイルを実行。
vagrant@vagrant-ubuntu-trusty-64:~/workspace/src/test$ go build vagrant@vagrant-ubuntu-trusty-64:~/workspace/src/test$ ./hello Hello world!
ⅱ)go runで自動的にコンパイル&バイナリファイルの実行
go runを使用すると自動的にコンパイルおよびバイナリファイルの実行をしてくれる。ただし、go buildのようにカレントディレクトリ以下の全ファイルを読み込むわけではないため注意。
vagrant@vagrant-ubuntu-trusty-64:~/workspace/src/test$ go run hello.go Hello world!
【参考】
・ゲスト OS のタイプが正しく設定されていることを確認する
・fmt - The Go Programming Language
・go run と go buildの違い - PONCOTSU
強化学習の概要
強化学習の概要
強化学習とは
強化学習(きょうかがくしゅう、英: reinforcement learning)とは、ある環境内におけるエージェントが、現在の状態を観測し、取るべき行動を決定する問題を扱う機械学習の一種。エージェントは行動を選択することで環境から報酬を得る。強化学習は一連の行動を通じて報酬が最も多く得られるような方策(policy)を学習する。
強化学習 - Wikipedia
強化学習の起源
強化学習という考え方は、学習心理学(行動分析学)の見地に立ったB.F.スキナーの「強化理論」に由来する。「強化理論」とは、人間や動物の自由意思のように見える行動も、すべては過去の報酬や嫌悪刺激(罰)に基づいて決定づけられるとする理論であり、スキナー箱(※1)を用いた実験(オペレント条件づけ)が有名である。なお、強化理論は、行動療法やUI/UX設計、脱洗脳など様々な応用事例があり、それを機械学習に活用したものが強化学習である。
※1:スキナー箱とは、マウスが餌が出るレバーを押すように自発的に行動(operate)するようになることを観察する代表的な実験装置のこと。 オペラント条件づけ - Wikipedia
強化学習の要素
・Agent:強化学習における行動する主体のこと
・Environments:機械学習が実施される環境のこと
・at:ある時間tにおけるAgentの行動(action)のこと
・st:ある時間tにおける状態(state)のこと
・rt:ある時間tにおける報酬(reward)のこと
・πt:ある時間tにおいて、どういう行動(action)を取るかの方針のこと