【文法系】【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
!

《解説》
RubyPythonでは[]でインデックス番号を指定するだけで、対応する文字を出力することができるが、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
********************

《解説》
RubyPythonでは乗算の演算子(*)を使って「"文字列"*出力回数」と書くことができるが、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

Vagrantプラグインのインストール確認>

(base) $ vagrant plugin list
vagrant-docker-compose (1.5.1, global)
vagrant-vbguest (0.21.0, global)

Vagrantプラグインのインストール方法>

(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

強化学習の要素

f:id:otsuba1:20200207165943p:plain

・Agent:強化学習における行動する主体のこと
・Environments:機械学習が実施される環境のこと
・at:ある時間tにおけるAgentの行動(action)のこと
・st:ある時間tにおける状態(state)のこと
・rt:ある時間tにおける報酬(reward)のこと
・πt:ある時間tにおいて、どういう行動(action)を取るかの方針のこと

強化学習の適用事例

・ゲーム
・自動運転
・火星探査機
・洗濯物の自動折りたたみマシン
・省エネ(Google DeepMind

Googleがデータセンター冷却電力を40%削減、DeepMindのAIを活用 | 日経 xTECH(クロステック)