日ふわ録

日常のふわっとした記録。プライベートから仕事まで幅広く記録。

Virtualbox + Vagrantを試してみた

前提

インストール

  1. virtualboxをインストールする 以下よりダウンロードしてインストールする

https://www.virtualbox.org/

  1. vagrantをインストールする 以下よりダウンロードしてインストール

https://www.vagrantup.com/

インストールできているか確認

$ vagrant -v
Vagrant 1.8.5

vagrantcentosを立ち上げてみる

vagrantcentosのboxを追加する(イメージはvirtualboxのもの)

$ vagrant box add centos https://sourceforge.net/projects/nrel-vagrant-boxes/files/CentOS-6.7-x86_64-v20151108.box
==> box: Box file was not detected as metadata. Adding it directly...
==> box: Adding box 'centos' (v0) for provider:
    box: Downloading: https://sourceforge.net/projects/nrel-vagrant-boxes/files/CentOS-6.7-x86_64-v20151108.box
==> box: Successfully added box 'centos' (v0) for 'virtualbox'!

vagrantfileを生成する

以下で生成できるがカレントディレクトリに作成されている

$ vagrant init centos
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.

vagrantを起動する

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: hogehoge_default_1469340727921_20407
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    ・
    ・

. SSHで接続してみる

別terminalにてsshでつなぐ

$ vagrant ssh

これで実際に接続できている

. webサーバをいれてみる

$ sudo yum -y install httpd
読み込んだプラグイン:fastestmirror
インストール処理の設定をしています
Determining fastest mirrors
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
base                                                                                                                                                                      | 3.7 kB     00:00
base/primary_db                                                                                                                                                           | 4.7 MB     00:15
extras                                                                                                                                                                    | 3.4 kB     00:00
extras/primary_db                                                                                                                                                         |  37 kB     00:00
updates                                                                                                                                                                   | 3.4 kB     00:00
updates/primary_db                                                                                                                                                        | 1.4 MB     00:03
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package httpd.x86_64 0:2.2.15-54.el6.centos will be インストール
--> 依存性の処理をしています: httpd-tools = 2.2.15-54.el6.centos のパッケージ: httpd-2.2.15-54.el6.centos.x86_64
--> 依存性の処理をしています: apr-util-ldap のパッケージ: httpd-2.2.15-54.el6.centos.x86_64
--> 依存性の処理をしています: /etc/mime.types のパッケージ: httpd-2.2.15-54.el6.centos.x86_64
--> 依存性の処理をしています: libaprutil-1.so.0()(64bit) のパッケージ: httpd-2.2.15-54.el6.centos.x86_64
--> 依存性の処理をしています: libapr-1.so.0()(64bit) のパッケージ: httpd-2.2.15-54.el6.centos.x86_64
--> トランザクションの確認を実行しています。
---> Package apr.x86_64 0:1.3.9-5.el6_2 will be インストール
---> Package apr-util.x86_64 0:1.3.9-3.el6_0.1 will be インストール
---> Package apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 will be インストール
---> Package httpd-tools.x86_64 0:2.2.15-54.el6.centos will be インストール
---> Package mailcap.noarch 0:2.1.31-2.el6 will be インストール
--> 依存性解決を終了しました。

依存性を解決しました

=================================================================================================================================================================================================
 パッケージ                                      アーキテクチャ                           バージョン                                             リポジトリー                               容量
=================================================================================================================================================================================================
インストールしています:
 httpd                                           x86_64                                   2.2.15-54.el6.centos                                   updates                                   833 k
依存性関連でのインストールをします。:
 apr                                             x86_64                                   1.3.9-5.el6_2                                          base                                      123 k
 apr-util                                        x86_64                                   1.3.9-3.el6_0.1                                        base                                       87 k
 apr-util-ldap                                   x86_64                                   1.3.9-3.el6_0.1                                        base                                       15 k
 httpd-tools                                     x86_64                                   2.2.15-54.el6.centos                                   updates                                    79 k
 mailcap                                         noarch                                   2.1.31-2.el6                                           base                                       27 k

トランザクションの要約
=================================================================================================================================================================================================
インストール         6 パッケージ

総ダウンロード容量: 1.1 M
インストール済み容量: 3.7 M
パッケージをダウンロードしています:
(1/6): apr-1.3.9-5.el6_2.x86_64.rpm                                                                                                                                       | 123 kB     00:00
(2/6): apr-util-1.3.9-3.el6_0.1.x86_64.rpm                                                                                                                                |  87 kB     00:00
(3/6): apr-util-ldap-1.3.9-3.el6_0.1.x86_64.rpm                                                                                                                           |  15 kB     00:00
(4/6): httpd-2.2.15-54.el6.centos.x86_64.rpm                                                                                                                              | 833 kB     00:01
(5/6): httpd-tools-2.2.15-54.el6.centos.x86_64.rpm                                                                                                                        |  79 kB     00:00
(6/6): mailcap-2.1.31-2.el6.noarch.rpm                                                                                                                                    |  27 kB     00:00
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                                                             329 kB/s | 1.1 MB     00:03
rpm_check_debug を実行しています
トランザクションのテストを実行しています
トランザクションのテストを成功しました
トランザクションを実行しています
  インストールしています  : apr-1.3.9-5.el6_2.x86_64                                                                                                                                         1/6
  インストールしています  : apr-util-1.3.9-3.el6_0.1.x86_64                                                                                                                                  2/6
  インストールしています  : apr-util-ldap-1.3.9-3.el6_0.1.x86_64                                                                                                                             3/6
  インストールしています  : httpd-tools-2.2.15-54.el6.centos.x86_64                                                                                                                          4/6
  インストールしています  : mailcap-2.1.31-2.el6.noarch                                                                                                                                      5/6
  インストールしています  : httpd-2.2.15-54.el6.centos.x86_64                                                                                                                                6/6
  Verifying               : apr-util-ldap-1.3.9-3.el6_0.1.x86_64                                                                                                                             1/6
  Verifying               : apr-1.3.9-5.el6_2.x86_64                                                                                                                                         2/6
  Verifying               : httpd-tools-2.2.15-54.el6.centos.x86_64                                                                                                                          3/6
  Verifying               : mailcap-2.1.31-2.el6.noarch                                                                                                                                      4/6
  Verifying               : httpd-2.2.15-54.el6.centos.x86_64                                                                                                                                5/6
  Verifying               : apr-util-1.3.9-3.el6_0.1.x86_64                                                                                                                                  6/6

インストール:
  httpd.x86_64 0:2.2.15-54.el6.centos

依存性関連をインストールしました:
  apr.x86_64 0:1.3.9-5.el6_2     apr-util.x86_64 0:1.3.9-3.el6_0.1     apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1     httpd-tools.x86_64 0:2.2.15-54.el6.centos     mailcap.noarch 0:2.1.31-2.el6

完了しました!

完了ありがとう!

. 起動してみる

 sudo service httpd start
Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName
                                                           [  OK  ]

curlなどで見ると確かにvagrant環境ではあがってる

Docker初心者の入門1 (Docker for mac)

前提

  • コンテナに触ってみたい気持ち
  • docker for macで試してみる(ベータだけど)

Docker for macをダウンロードする

公式サイトからダウンロード

docs.docker.com

f:id:goto0717:20160724123608p:plain

ダウンロードしたらインストールする

f:id:goto0717:20160724123747p:plain

即準備できた。

いろいろお試してしてみる

試しにnginxのイメージをあげてみる

$ docker run -d -p 80:80 --name webserver nginx

Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
51f5c6a04d83: Pull complete
a3ed95caeb02: Pull complete
51d229e136d0: Pull complete
bcd41daec8cc: Pull complete
Digest: sha256:0fe6413f3e30fcc5920bc8fa769280975b10b1c26721de956e1428b9e2f29d04
Status: Downloaded newer image for nginx:latest
e8b41ba32d99860ceab9b976333d2e5209ecdae0c86eee25eb794bd3a07a120c

無事終わりました。 試しにlocalhostアクセスしてみる。

http://localhost/

f:id:goto0717:20160724124600p:plain

でた。 簡単だな。

コンテナがあがっているか確認する

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
e8b41ba32d99        nginx               "nginx -g 'daemon off"   4 minutes ago       Up 4 minutes        0.0.0.0:80->80/tcp, 443/tcp   webserver

コンテナを終了させる

$ docker kill e8b
e8b

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

感想

うん。簡単だなー

GO言語初心者が入門3(プログラミング)

前提

  • インストールや設定は以前の記事に
  • golang1.6.3

goコマンド

①プログラムを実行する

go runを利用すると気軽に実行できます

$ go run main.go

②ブログラムのビルド

go buildコンパイルして実行ファイルを生成します

# hello.goのみ存在
$ ls -la
total 4408
-rw-r--r--  1 hogehoge  1796141739       78  7 23 17:16 hello.go

# hello.goをビルドします
$ go build -o hello hello.go

# 実行ファイルのhelloができました
$ ls -la
total 4408
-rwxr-xr-x  1 hogehoge  1796141739  2249680  7 23 18:34 hello
-rw-r--r--  1 hogehoge  1796141739       78  7 23 17:16 hello.go

# 実行するとちゃんとhello.goの実行と同じになります
$ ./hello
Hello World

GO言語の実行ファイルはソースファイルに比べて大きくなります。 これはGO言語はOSによって提供される標準ライブラリに依存しないという言語仕様のためです。 (OSの機能を使わずに、GO側に同様のライブラリをもっているため)

プログラムにまつわるエトセトラ

①パッケージ (package)

  • GO言語では変数や関数などのプログラムの全ての要素はパッケージに必ず属す
  • 1つのファイルは単一のパッケージにしか属せない
  • なんでpackage宣言からプログラムは始まる
package main

②インポート (import)

  • ファイル内で利用するパッケージを指定するのがimport
  • packageの後にimport宣言がくる感じ
  • 参照されない宣言はコンパイルエラーになります(きっちりチェック)
package main

import (
    "fmt"
)

③エントリーポイント

  • main関数がGOのエントリーポイント(実行開始される場所)
  • 最低限のお決まりを実装すると以下になる
package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello World!")
}

④コメント

コメントは行コメントとブロックコメントの2種類があります。 * 行コメント

// コメントです
  • ブロックコメント
/*
  コメントです
  このブロック内はコメントです
*/

ステートメントの区切り文字

GO言語のステートメントの区切り文字は;セミコロンである。 が、セミコロンを省略できる言語仕様となっている。

以下のようなケースは独特ですので注意

   // 改行無しの場合はこれでOK
    color := [3]string{"red", "blue", "yellow"}
    fmt.Println(color[0])

    // 改行入れた場合は最後の部分にカンマがないとダメな言語仕様らしい
    color2 := [3]string{
        "red",
        "blue",
        "yellow", // 最後もカンマいれないとコンパイルエラーになる
    }
    fmt.Println(color2[0])

⑥変数

GO言語の変数の概要

  1. 値型 (整数や実数などの値を格納する型)
  2. 参照型 (スライス、マップ、チャネル)
  3. ポインタ型 (C言語同様のポインタ)

変数の宣言

// 明示的に宣言
var i int
// 複数宣言とかもできる
var x, y, z int
// こんなまとめもできる
var {
    var i int,
    name string
}

変数の代入

=演算子で代入。

var i int
i = 5  // OK
i = "test"  // コンパイルエラー

暗黙的な定義 (型推論)

型指定をせずに代入する:=演算子

// int型の変数iを宣言して1を代入
i := 1

ちなみに以下みたいなものはコンパイルエラー(:=演算子は変数定義なので)

i := 1   // OK
i := 100  // コンパイルエラー(すでにiは宣言されている)

明示的か?暗黙的か?

基本型推論

GO言語の場合は、積極的に暗黙的な宣言でよさげ。 静的型付けでありつつ、煩雑な型指定を省略できるようにしている。 そのため、GOの言語仕様のメリットを教授するためにも、 可能な限り、型推論におまかせがよさげ。

パッケージ変数とローカル変数

関数内部はローカル変数 関数外はパッケージ変数となる。 パッケージ変数はプログラム全体で1つの値を参照する

基本型

いろいろあるのでチュートリアルをみた方が早い。

golang.jp

配列型

GOの配列型は宣言した要素数から縮小や拡張できない固定である

これもチュートリアルをみてほしい

golang.jp

interface 型とnil

  • interface{}が一つの型となる。
  • GOのあらゆる型と互換性がある特殊な型である
  • Cの汎用ポインタ、JavaのObject型のような存在
var x interface{}
fmt.Println(x)

上記の実行結果は<nil>となります。 これはJavaでいうnullのようなもの。

演算子

これも多いのでチュートリアル熟読

golang.jp

⑦関数

基本的な関数

こんなの

func plus(x, y, int) int {
    return x + y
}

戻り値がない関数

func plus(x, y, int) {
    fmt.Pinrtln("OK");
}

複数の戻り値を返す関数

func div(x, y, int) (int, int){
     q := x / y
     r := x % y
     return q, r
}

q, r := div(19, 7)

関数とエラー処理

GOには例外処理機構はないので、複数の戻り値を利用してエラー処理をする

result, err := doExec()
if (err != nil) {
    // エラー処理
}

無名関数

関数リテラルを代入した変数的な。

f := func(x, y int) int {return x + y}
fmt.Println(f(2, 3))

実行結果は5と出力される

関数を返す関数

func ResultFunc() func() {
    return func() {
        fmt.Println("function!")
    }
}

func main() {
    f := ResultFunc()
    f()
}

関数を引数にとる関数

func ResultFunc() func() {
    return func() {
        fmt.Println("function!")
    }
}

func CallFunction(f func()) {
    f()
}

func main() {
    f := ResultFunc()
    CallFunction(f)
}

無名関数をクロージャとして利用する

func later() func(string) string {
    var store string
    return func(next string) string {
        s := store
        store = next
        return s
    }
}

func main() {
    // クロージャ
    l := later()
    fmt.Println("クロージャstart")
    fmt.Println(l("Golang"))
    fmt.Println(l("is"))
    fmt.Println(l("Good"))
    fmt.Println("クロージャend")
}

↑を実行すると

クロージャstart

Golang
is
クロージャend

となります。

ちなみにクロージャが意味不明なので以下を参考に

dqn.sakusakutto.jp

クロージャを使ったジェネレーター

func integers() func() int {
    i := 0
    return func() int {
        i += 1
        return i
    }
}

func main() {
    ints := integers()
    fmt.Println("ジェネレーターstart")
    fmt.Println(ints())
    fmt.Println(ints())
    fmt.Println(ints())
    fmt.Println("ジェネレーターend")
    ints2 := integers()
    fmt.Println("ジェネレーター2start")
    fmt.Println(ints2())
    fmt.Println(ints2())
    fmt.Println(ints2())
    fmt.Println(ints2())
    fmt.Println(ints())
    fmt.Println("ジェネレーター2end")

↑の実行結果は

ジェネレーターstart
1
2
3
ジェネレーターend
ジェネレーター2start
1
2
3
4
4
ジェネレーター2end

クロージャがつかむ変数は生成するクロージャ毎に別であることがわかる

⑧定数

constで宣言すれば定数っす

const x int = 1

⑨制御文

いっぱいあるのでこれまたチュートリアル

golang.jp

いくつか補足

  • defer : 関数終了時に実行する処理を記載できる。ファイルのクローズとかで便利
  • panic : JavaでいうとこのError系。基本そんな使わないくさい
  • recover : panicから復帰する制御みたい。これもあんまり使わないかも
  • goto : 他言語同様他ラベルへ飛ばす
  • go : ゴルーチン。並行処理を起動する
func sub() {
    fmt.Println("sub start")
    defer fmt.Println("sub end")
    for i := 0; i < 10; i++ {
        fmt.Println("sub:" + strconv.Itoa(i))
    }
    ioutil.WriteFile("/tmp/sample_go.out", []byte("hello world\n"), os.ModePerm)
}

func main() {
    // ゴルーチンで関数呼び出し
    go sub()
    // ゴルーチンで無名関数でも一緒
    go func() {
        fmt.Println("sub2 start")
        defer fmt.Println("sub2 end")
        for i := 0; i < 10; i++ {
            fmt.Println("sub2:" + strconv.Itoa(i))
        }
        ioutil.WriteFile("/tmp/sample_go.out", []byte("hello world\n"), os.ModePerm)
    }()
    // mainでもおんなじように
    for i := 0; i < 10; i++ {
        fmt.Println("main:" + strconv.Itoa(i))
    }
    // subの処理が行われる前にmainが終了しないようにとりあえず1秒スリーブ
    time.Sleep(time.Second)
}

実行するとこうなる

main:0
main:1
main:2
main:3
main:4
main:5
main:6
main:7
main:8
main:9
sub start
sub:0
sub:1
sub:2
sub:3
sub2 start
sub:4
sub:5
sub2:0
sub2:1
sub:6
sub2:2
sub2:3
sub:7
sub2:4
sub2:5
sub:8
sub2:6
sub2:7
sub:9
sub2:8
sub2:9
sub2 end
sub end
main end

⑩参照型

スライス (slice) : 可変長配列

// int型のスライス
var s = []int
// makeで生成
s := make([]int, 10)
// リテラルで生成
s := []int{1, 2, 3, 4, 5}
// 要素数を調べる
len(s)
// 容量を調べる (容量は内部的に確保されている領域)
cap(s)
// 要素追加
append(s, 6, 7, 8)
// スライスのコピー
copy(s, hogehoge)

マップ (map) : 連想配列的な

// intのキーとstringを値に持つmap
var m map[int] string
// makeで生成
m := make(map[int|string)
m[1] = "US"
m[81] = "Japan"
// mapのリテラル
m := map[int]string{1: "A", 2: "B", 3: "C"}
// 要素数
len(m)
// 要素の削除
delete(m, 2)

チャネル (chanel) : ゴルーチンとゴルーチンの間でデータを受け渡す際に利用

これもチュートリアル見た方が確実

golang.jp

⑪ポインタとか構造体とかインターフェースとか。

なんだかんだここもチュートリアルみた方がまとまってるね

golang.jp

GO言語初心者の入門2(IDEから実行させる)

前提

  • mac前提っす
  • IDEはInteliJ前提っす

InteliJをとってくる

以下からダウンロードする www.jetbrains.com

f:id:goto0717:20160723173240p:plain

Community、Ultimateどちらかお好きな方を。

インストールする

普通にいれる

f:id:goto0717:20160723173404p:plain

f:id:goto0717:20160723173913p:plain

無事入りました。

GO言語用のプラグインを設定する

  1. Preference -> Pluginsを開く f:id:goto0717:20160723174513p:plain

  2. 下の方にあるBrowse Repositoriesを開く f:id:goto0717:20160723174559p:plain

  3. 下の方にあるManage repositoriesを開いてリポジトリ(https://plugins.jetbrains.com/plugins/alpha/list)を追加する f:id:goto0717:20160723174705p:plain

  4. GOプラグインを設定 リポジトリからGOで検索して追加する f:id:goto0717:20160723174927p:plain 再起動を求められたら再起動する

SDKsの設定を追加する

  1. GOのSDKを設定 Project Structure -> Platform Settings -> SDKs f:id:goto0717:20160723175233p:plain f:id:goto0717:20160723175240p:plain

goをインストールした場所を設定する(検出してくれるはず)

試しに動かしてみる。

以下のような感じでmain.goを作って動かしてみる。 f:id:goto0717:20160723180205p:plain

所感

動いてよかったです\(^o^)/

GO言語初心者の入門1(インストール&設定)

前提

Goのインストール

homebrewを使っていれる

$ brew install go

公式ページからダウンロードしていれたいならば↓から必要なものを選んで落とす。

https://golang.org/dl/

f:id:goto0717:20160723165718p:plain

環境変数の設定

以下未設定なものをよしなに設定する。 homebrewでいれるとGOROOTとか設定不要だったと思うが一応。 GOPATHは外部ライブラリの格納場所なので、お好きな場所を指定してください。 (自分は一旦ホームディレクトリ配下にgoというディレクションを作成した)

$ vim ~/.bashrc
# 以下設定
GOROOT="/usr/local/go"
PATH="$PATH:$GOROOT/bin"
GOPATH="$HOME/go"

export GOROOT
export PATH
export GOPATH
# 読み込んで
$ source ~/.bashrc
# 設定されたことを確認
$ env | grep GOPATH
GOPATH=/Users/hogehoge/go
$ env | grep GOROOT
GOROOT=/usr/local/go

これで環境変数はOKなのでgoのバージョンを確認してみる

$ go version
go version go1.6.3 darwin/amd64

バッチリです。

試しにHello Worldしてみよう

一旦IDEとか使わずコマンドラインでさっくり動かしてみる 1. 適当なファイル作る

$ vim hello.go
  1. Hello Worldさせる
package main

import (
    "fmt"
)

func main() {
    fmt.Println("Hello World")
}
  1. 実行する
$ go run hello.go
Hello World

できた!! これでGO言語を実行するための環境が整った。

ブログ始めました

はてなでブログはじめます。 ふわっと思ったことなど記録しておく用です。