tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【git】git tagを取り消す

はじめに

git tagを取り消すメモ。 ほとんど手順メモ程度な感じ+他記事で使うスニペット記事。

補足

他の取り消しもぱっと見たい自分用にまとめたので参考までに。

【git】add、commit、push、merge、pull request、merge pull request、tagの取り消し

アジェンダ

  1. localでの取り消し(削除)
  2. リモートでの取り消し

1. localでの取り消し(削除)

ローカルで消す場合は git tag -d タグ とします。

$ git tag
v1.0.0
v1.0.1
v1.0.2
v1.0.4
v1.0.5

$ git tag v1.0.6

$ git tag
v1.0.0
v1.0.1
v1.0.2
v1.0.4
v1.0.5
v1.0.6

$ git tag -d v1.0.6
Deleted tag 'v1.0.6' (was 7bd2f6b)

$ git tag
v1.0.0
v1.0.1
v1.0.2
v1.0.4
v1.0.5safdsa

2. リモートでの取り消し

リモートのtagを消す場合は git push origin :refs/tags/タグ とします。
ローカルを先に消す必要も無いし、localのが一緒に消えるわけでもないです。

# リモートのタグを確認
$ git ls-remote --tags
From https://github.com/tweeeety/git-tag-sample.git
6d0a343aa89b63f6d01116116afcca30c7250ed1  refs/tags/v1.0.0
08c9f32c3f36a7577366440f24b095a697c8645d  refs/tags/v1.0.1
0715d6e897c84b003ee3f1d9833bfe23d0023355  refs/tags/v1.0.2
063adbe5ed48fc19dbea5d92491995e09ad762f2  refs/tags/v1.0.4
33ed691e1c4363b4b5cf7f102fab3ca27f5ba5ab  refs/tags/v1.0.5
7bd2f6b05c73cc1042d0b9b8b311e96d3375b13f  refs/tags/v1.0.6

# リモートのタグを削除
$ git push origin :refs/tags/v1.0.6
To https://github.com/tweeeety/git-tag-sample.git
 - [deleted]         v1.0.6

# 消えてるか確認
$ git ls-remote --tags
From https://github.com/tweeeety/git-tag-sample.git
6d0a343aa89b63f6d01116116afcca30c7250ed1  refs/tags/v1.0.0
08c9f32c3f36a7577366440f24b095a697c8645d  refs/tags/v1.0.1
0715d6e897c84b003ee3f1d9833bfe23d0023355  refs/tags/v1.0.2
063adbe5ed48fc19dbea5d92491995e09ad762f2  refs/tags/v1.0.4
33ed691e1c4363b4b5cf7f102fab3ca27f5ba5ab  refs/tags/v1.0.5

# ローカルには残ってるので別途消してね
$ git tag
v1.0.0
v1.0.1
v1.0.2
v1.0.4
v1.0.5
v1.0.6

終わり

git ls-remote --tags のほうを忘れそうw

【git】git tagの使い方をかんたんにおさらい

はじめに

リリース管理やブランチ管理にはまぁまぁ利用するgit tagですがおさらいがてらにメモ

アジェンダ

  1. git tagとは
  2. よく使うgit tagコマンド
  3. tagの作成
  4. tagの一覧
  5. tagの確認
  6. tagの削除
  7. tagのpush
  8. リモートのタグの一覧
  9. リモートのタグの削除

1. git tagとは

タグとは、コミットを参照しやすくするために、わかりやすい名前を付けるものです。

Gitでは、軽量タグと、注釈付きタグの2種類のタグが使用できます。また、一度付けたタグはブランチのように位置が移動することはなく固定です。

説明下手なので参考サイトから引用させていただきました。 * http://www.backlog.jp/git-guide/stepup/stepup4_1.html

2. よく使うgit tagコマンド

あんちょこ的に先にまとめておきます。
コマンドベースでざっとできる事を羅列

# tagの作成
$ git tag タグ
$ git tag -a タグ -m "こめんと"

# tagの一覧
$ git tag

# リモートのタグの一覧
$ git ls-remote --tags

# tagの確認
$ git show タグ

# tagの削除
$ git tag -d タグ

# tagのpush
$ git tag push タグ
$ git push --tags

3. tagの作成

軽量タグの作成

コマンド

git tag タグ

$ git tag v1.0.0

注釈付きタグの作成

コマンド

git tag -a タグ -m ‘コメント’

$ git tag -a v1.0.0 -m 'add readme'

タグをあとからつける

コマンド

git tag -a タグ -m ‘コメント’ コミットハッシュ

$ git tag -a v1.0.0 -m "add readme" 6d0a343aa89b63f6d01116116afcca30c7250ed1

4. tagの一覧

コマンド

git tag

$ git tag
v1.0.0
v1.0.1
v1.0.2
v1.0.3

5. tagの確認

コマンド

git show タグ

$ git show v1.0.0
tag v1.0.0
Tagger: tweeeety <tweeeety.0719@gmail.com>
Date:   Mon May 8 23:09:11 2017 +0900

add readme

commit 6d0a343aa89b63f6d01116116afcca30c7250ed1
Author: tweeeety <tweeeety.0719@gmail.com>
Date:   Wed Apr 19 21:58:44 2017 +0900

    first commit

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..71d9d7a
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# git-tag-sample

6. tagの削除

コマンド

git tag -d タグ

$ git tag
v1.0.0
v1.0.1
v1.0.2
v1.0.3

$ git tag -d v1.0.3
Deleted tag 'v1.0.3' (was 8bfcc5a)

$ git tag
v1.0.0
v1.0.1
v1.0.2

7. tagのpush

個別にpush

コマンド

git push origin タグ

$ git push origin v1.0.2
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 525 bytes | 0 bytes/s, done.
Total 6 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/tweeeety/git-tag-sample.git
 * [new tag]         v1.0.2 -> v1.0.2
補足

タグv1.0.2は一番最後のcommit(8bfcc5aa8eab54d20b46864595de4e8b992c4479)に対してつけたもの。 最初のcommitから最後までpushを一度もしてないままに、
git push origin v1.0.2 とする事もできる。

$ git log
commit 8bfcc5aa8eab54d20b46864595de4e8b992c4479
Author: tweeeety <tweeeety.0719@gmail.com>
Date:   Mon May 8 23:11:22 2017 +0900

    modify third

commit 0715d6e897c84b003ee3f1d9833bfe23d0023355
Author: tweeeety <tweeeety.0719@gmail.com>
Date:   Mon May 8 23:10:42 2017 +0900

    modify second

commit 08c9f32c3f36a7577366440f24b095a697c8645d
Author: tweeeety <tweeeety.0719@gmail.com>
Date:   Mon May 8 23:07:55 2017 +0900

    modify first

commit 6d0a343aa89b63f6d01116116afcca30c7250ed1
Author: tweeeety <tweeeety.0719@gmail.com>
Date:   Wed Apr 19 21:58:44 2017 +0900

    first commit

まとめてpush

それまでpushされてないlocalで作成済みのtagがまとめてpushされます

コマンド

git push –tags

$ git push --tags
Counting objects: 12, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 509 bytes | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 1 local object.
To https://github.com/tweeeety/git-tag-sample.git
 * [new tag]         v1.0.2 -> v1.0.2
 * [new tag]         v1.0.4 -> v1.0.4
 * [new tag]         v1.0.5 -> v1.0.5

8. リモートのタグの一覧

commitとの紐付けも見れて便利

コマンド

git ls-remote –tags

$ git ls-remote --tags
From https://github.com/tweeeety/git-tag-sample.git
6d0a343aa89b63f6d01116116afcca30c7250ed1  refs/tags/v1.0.0
08c9f32c3f36a7577366440f24b095a697c8645d  refs/tags/v1.0.1
0715d6e897c84b003ee3f1d9833bfe23d0023355  refs/tags/v1.0.2
063adbe5ed48fc19dbea5d92491995e09ad762f2  refs/tags/v1.0.4
33ed691e1c4363b4b5cf7f102fab3ca27f5ba5ab  refs/tags/v1.0.5

9. リモートのタグの削除

コマンド

git push origin :refs/tags/タグ

# リモートのタグを確認
$ git ls-remote --tags
From https://github.com/tweeeety/git-tag-sample.git
6d0a343aa89b63f6d01116116afcca30c7250ed1  refs/tags/v1.0.0
08c9f32c3f36a7577366440f24b095a697c8645d  refs/tags/v1.0.1
0715d6e897c84b003ee3f1d9833bfe23d0023355  refs/tags/v1.0.2
063adbe5ed48fc19dbea5d92491995e09ad762f2  refs/tags/v1.0.4
33ed691e1c4363b4b5cf7f102fab3ca27f5ba5ab  refs/tags/v1.0.5
7bd2f6b05c73cc1042d0b9b8b311e96d3375b13f  refs/tags/v1.0.6

# リモートのタグを削除
$ git push origin :refs/tags/v1.0.6
To https://github.com/tweeeety/git-tag-sample.git
 - [deleted]         v1.0.6

# 消えてるか確認
$ git ls-remote --tags
From https://github.com/tweeeety/git-tag-sample.git
6d0a343aa89b63f6d01116116afcca30c7250ed1  refs/tags/v1.0.0
08c9f32c3f36a7577366440f24b095a697c8645d  refs/tags/v1.0.1
0715d6e897c84b003ee3f1d9833bfe23d0023355  refs/tags/v1.0.2
063adbe5ed48fc19dbea5d92491995e09ad762f2  refs/tags/v1.0.4
33ed691e1c4363b4b5cf7f102fab3ca27f5ba5ab  refs/tags/v1.0.5

# ローカルには残ってるので別途消してね
$ git tag
v1.0.0
v1.0.1
v1.0.2
v1.0.4
v1.0.5
v1.0.6

リポジトリ

https://github.com/tweeeety/git-tag-sample

終わり

おさらいというかあんちょこ的になったけど、それはそれで良し\(^o^)/

【git】最初のgit commitを取り消す - `git update-ref -d HEAD`もしくは`git filter-branch`

はじめに

以前、【git】git commitを取り消すという記事を書きました。

git reset xxxで普段のcommitの取り消しは問題なくできますが、
そのリポジトリで1発目のcommitの取り消しができません。

たとえばこんな時ありますよね。
「あ、間違ってauthor違う名前でcommitしちゃった。取り消して設定しなおそ」
みたいな。

そんな時のメモ

補足

他の取り消しもぱっと見たい自分用にまとめたので参考までに。

内容

  1. git reset xxxでcommit取り消しできない例
  2. git update-ref -d HEAD でcommit取り消しできる例
  3. git update-ref -d HEAD でcommit取り消したがgithub上は違う方法で変えなきゃな例

1. git reset xxxでcommit取り消しできない例

リポジトリを作成し、1発目にcommitしたものを取り消します。

# log確認。当然1つしかない
$ git log
commit 5646f5ca182c74329094f89c888d80f6b3de92fa
Author: hogehoge <hogehoge>
Date:   Fri Apr 14 22:32:41 2017 +0900

    first commit

# reset --soft HEAD^で1つ前を取り消そうと思ったけどできない
$ git reset --soft HEAD^
fatal: ambiguous argument 'HEAD^': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

2. git update-ref -d HEAD でcommit取り消しできる例

章題に書いてますが、git update-ref -d HEAD でできます。

# log確認。当然1つしかない
$ git log
commit 5646f5ca182c74329094f89c888d80f6b3de92fa
Author: hogehoge <hogehoge>
Date:   Fri Apr 14 22:32:41 2017 +0900

    first commit

# 
$ git update-ref -d HEAD

# 無事リセットされてる
$ git log
git log
fatal: bad default revision 'HEAD'

git update-ref についてはあまり調べてませんが、参照を更新するコマンドらしいです。

3. git update-ref -d HEAD でcommit取り消したがgithub上は違う方法で変えなきゃな例

2の項目で一見落着な感じでしたが、
これはlocalで行った操作が git add / git commit のみの場合です。

git push してgithub上にpushしてしまった場合は、以下の方法で変える必要があります。
※ ここは以前書いたのではしょりました

おわり

慣れてるつもりでもあんまりやらない操作だと
わからない事はまだまだ多いですね\(^o^)/

【go】golangはmapは宣言だけだと `panic: assignment to entry in nil map` に...なることがあるよのメモ

はじめに

かなり初歩的ですがpanic: assignment to entry in nil map で小一時間悩んだので自分戒めメモ。
わかってるつもりが、mapの宣言と初期化を混同していましたというお恥ずかしいアレです...

panic: assignment to entry in nil map が起こった例

  • mapを宣言して
  • funcで取得した値を入れて
  • その後にdefaultでkey:valueを追加しておきたい

みたいな時にpanic: assignment to entry in nil map がでてぱっと原因がわからなくて悩みました。

あとで単純かしたpanicも載せますが、よく考えれば当たり前とはいえロジック中だと最初ほんとにわからなかった...

sample.go

package main

import "log"

func main() {
  // 宣言
  var m map[string]string
  
  // 条件に応じて取得
  // trueの時は問題無し
  // falseだと....
  if condition := false; condition {
    m = getMap()
  }

  // mapにdefaultでkey:valueを追加
  //   -> ここで `panic: assignment to entry in nil map` 
  addMapValue(&m)

  // 出力
  log.Printf("m: %+v", m)
}

// mapを取得する
func getMap() map[string]string {
  return map[string]string{"hoge": "fuga"}
}

// mapに追加する
func addMapValue(m *map[string]string) {
  // 何か処理をして

  // からの追加
  key := "piyo"
  value := "magu"
  (*m)[key] = value
}

実行結果

  • condition := true の場合
$ go run sample.go 
2017/04/11 00:38:48 m: map[hoge:fuga piyo:magu]
  • condition := false の場合
$ go run sample.go 
panic: assignment to entry in nil map

goroutine 1 [running]:
panic(0xbab40, 0x8201ce290)
  /usr/local/Cellar/go/1.6.2/libexec/src/runtime/panic.go:481 +0x3e6
main.main()
  /Users/hoge/sample/sample.go:26 +0x162
exit status 2

原因

  • 初期化前のmapはnil
  • nilのmapに要素を割り当てられない

参考サイト Go言語:Map

要は宣言だけのmap(やsliceなどのポインタ系)はゼロ値がnilのためという事ですね。

panic: assignment to entry in nil map の単純な例

かなり単純化して書くとわかりやすいです。

func main() {
  // 宣言
  var m map[string]string

  // key:valueをsetのつもり
  // -> この時点で `panic: assignment to entry in nil map`
  m["hoge"] = "fuga"

  // 出力
  log.Printf("m: %+v", m)
}

最初から素直にこうしろって感じですね。。。

func main() {
  // 初期化
  m := map[string]string{"hoge": "fuga"}

  // 出力
  log.Printf("m: %+v", m)
}

終わり

goさわりはじめたとはいえだいぶ慣れたよな〜と思ってたころでしたが、
まだまだやん...と思いました、というメモ\(^o^)/

【vim】vimの設定の確認 - :set

はじめに

vimには:set number:set autoincrementなどいろいろな設定があり、
また、.vimrcに設定する事もあれば開いてから設定する事もあります。

設定の仕方はさておき今開いてるvimでの設定はなによ?というのを知りたいときのメモです。 初歩的すぎますがたまに忘れて調べるので…

内容

  1. 全部確認する
  2. 設定のon/offを確認する
  3. 個別の設定を確認する
  4. 設定をhelpで確認する
  5. どんな設定があるか日本語で確認する
  6. 設定の説明が書いてある日本語のサイトを開く

1. 全部確認する

全部確認は簡単です。vim開いてる中のコマンドモードで:setと打つだけです。

打つとこんな感じで今設定されている内容がでてきます

:set
--- Options ---
  ambiwidth=double    background=dark     cursorline          hidden              ignorecase          list                number              scroll=32           smartcase           ttyfast             window=67         nowrapscan
  autoindent          backspace=eol       helplang=en         hlsearch            laststatus=2        modified            paste               shiftwidth=2        tabstop=2           ttymouse=xterm    nowrap
  directory=~/.vim/tmp
  fileencoding=utf-8
  fileencodings=ucs-bom,utf-8,default,latin1
  filetype=htmlcheetah
  listchars=tab:>-,trail:-,nbsp:%,extends:>,precedes:<
  runtimepath=~/.vim,~/.vim/bundle/Vundle.vim,~/.vim/bundle/nerdtree,~/.vim/bundle/vim-go,~/.vim/bundle/gocode/vim/,/usr/local/share/vim/vimfiles,/usr/local/share/vim/vim74,/usr/local/share/vim/vimfiles/after,~/.vim/after,~/.vim/bundle/Vundle.vim/,~/.vim/bundle/Vun
dle.vim/after,~/.vim/bundle/nerdtree/after,~/.vim/bundle/vim-go/after,~/.vim/bundle/gocode/vim//after
  statusline=%F%r%h%=
  syntax=htmlcheetah

2. 設定のon/offを確認する

hoge=fugaの設定については内容がわかりやすいですね。
ignorecaseとか単体のものは表示されている=その項目がonです。

ためしにignorecaseをOFFにして確認してみます。
設定をOFFにするには設定名の前にnoをつけます。

# 今の状態を確認
:set
--- Options ---
  ambiwidth=double    background=dark     cursorline          hidden              ignorecase          list                number              scroll=32           smartcase           ttyfast             window=67         nowrapscan
  autoindent          backspace=eol       helplang=en         hlsearch            laststatus=2        modified            paste               shiftwidth=2        tabstop=2           ttymouse=xterm    nowrap
  directory=~/.vim/tmp
  fileencoding=utf-8
  fileencodings=ucs-bom,utf-8,default,latin1
  filetype=htmlcheetah
  listchars=tab:>-,trail:-,nbsp:%,extends:>,precedes:<
  runtimepath=~/.vim,~/.vim/bundle/Vundle.vim,~/.vim/bundle/nerdtree,~/.vim/bundle/vim-go,~/.vim/bundle/gocode/vim/,/usr/local/share/vim/vimfiles,/usr/local/share/vim/vim74,/usr/local/share/vim/vimfiles/after,~/.vim/after,~/.vim/bundle/Vundle.vim/,~/.vim/bundle/Vun
dle.vim/after,~/.vim/bundle/nerdtree/after,~/.vim/bundle/vim-go/after,~/.vim/bundle/gocode/vim//after
  statusline=%F%r%h%=
  syntax=htmlcheetah

# 消してみる
:set noignorecase

# 再度確認してみる
# ignorecaseが消えている
:set
--- Options ---
  ambiwidth=double    background=dark     cursorline          hidden              laststatus=2        modified            paste               shiftwidth=2        tabstop=2           ttymouse=xterm    nowrap
  autoindent          backspace=eol       helplang=en         hlsearch            list                number              scroll=32           smartcase           ttyfast             window=67         nowrapscan
  directory=~/.vim/tmp
  fileencoding=utf-8
  fileencodings=ucs-bom,utf-8,default,latin1
  filetype=htmlcheetah
  listchars=tab:>-,trail:-,nbsp:%,extends:>,precedes:<
  runtimepath=~/.vim,~/.vim/bundle/Vundle.vim,~/.vim/bundle/nerdtree,~/.vim/bundle/vim-go,~/.vim/bundle/gocode/vim/,/usr/local/share/vim/vimfiles,/usr/local/share/vim/vim74,/usr/local/share/vim/vimfiles/after,~/.vim/after,~/.vim/bundle/Vundle.vim/,~/.vim/bundle/Vun
dle.vim/after,~/.vim/bundle/nerdtree/after,~/.vim/bundle/vim-go/after,~/.vim/bundle/gocode/vim//after
  statusline=%F%r%h%=
  syntax=htmlcheetah

3. 個別の設定を確認する

:setの確認はすべてが表示されましたが、設定名はわかっていてそれだけ知りたいんだよという事もありますよね。
その時は :set 設定名? と打ちます

# ↑でignorecaseを消した状態で確認してみる
# -> noignorecaseと表示される
:set ignorecase?
noignorecase

# 再度設定してみる
:set ignorecase

# 再度確認してみる
:set ignorecase?
ignorecase

4. 設定をhelpで確認する

設定をhelpで見るには :helpに続けて設定項目名を打ちます

:help ignorecase

自分の設定だとこんな感じで画面上部に表示されているのがhelpです f:id:tweeeety:20170404195839p:plain

5. どんな設定があるか日本語で確認する

よくまとまっているサイトがあるのでまんま見てください、というだけですw

6. 設定の説明が書いてある日本語のサイトを開く

vimでは:!に続けて外部コマンドを打つ事で、vimを開きながらコマンドが打てます。

↑で紹介したサイトを使わせて頂きますが、
openコマンドを使ってvimから直接↑のサイトの該当の説明へ飛ぶ事も可能です。

:! open http://www.kawaz.jp/pukiwiki/?vim\%2Foptions\#ignorecase

このまま打つことはあり得ないと思うので
直接ブラウザで開くなりscript化しちゃったほうが良いですねw

終わり

初歩過ぎ的な内容でしたが、改めて書くと頭にもより入っていいですね\(^o^)/

【GCP】Google Cloud Platformとは? からのGCPサービス全体増、特徴、メリットを書籍を読んで自分まとめ

はじめに

最近gcp関連を触ることがあったので、google cloud platformについて全体的に俯瞰して知りたいなーということで
以下の書籍を読んでみました。

読んでみて印象に残った部分 + αのなんとなく自分まとめです。
書籍では1章〜5章までありますが、この中でも文章としてまとめやすい 1章、2章の内容にしぼっています。

※ 内容は書籍を購入した2016年中盤の情報です ※ 一部、調べるために他のサイトも参考にさせて頂いています。thx!

Google Cloud Platformとは?

GCP自体は聞いた事があるものの、どんなものなのよ?とは具体的に知らなかったので勉強になりました。

Google Cloud Platform(GCP) とは、Google がクラウド上で提供するサービス郡の総称です。
Google 社内で使われているものと同じテクノロジーやインフラを使用してインフラ環境をクラウド化できます。
基本的な構成要素が初めから各種サービスとして用意されているため、それらを使用してすばやく開発を行うこともできます。

AWSや他のクラウドサービスプロバイダとの違い

  • AWSなど
    • 仮想マシンやオブジェクトスレージといった低レベルのコンピュートリソース提供から始めて徐々に抽象度の高い高度なサービスを公開
  • GCP
    • 抽象度の高いアプリケーションプラットフォームやAPIサービスからスタートし、後からより低レベルのコンピュートリソースである仮想マシンやクラウドストレージをリリース

世界最大級のコンピュータ

  • Googleは巨大なデータセンタの構築、運営を自社で行っている
    • 世界14カ所
  • データセンタはPUE1.12(2015/12月現在)という非常に効率よい電力消費
    • 1ユーザが1ヶ月Googleのサービスを利用するのに必要なエネルギーは自動車を1マイル運転するより少ない
  • カーボンフットプリントはゼロに近い
  • 地球環境に優しい運用が行われている

グローバルネットワーク

  • 数千マイルの光ファイバーケーブル、先進的なSDN(Software Define Network)、エッジキャッシュなどの技術により高度で安定したパフォーマンスとスケールを実現
  • 光ファイバーケーブルを太平洋の海底に独自に敷設
    • 通信会社と同じ土俵でネットワークインフラ投資に取り組む
  • 現在のJupiterファブリックは二分割帯域幅で1ペタbpsを超えている
    • 10万台のサーバがそれぞれ10Gbpsで情報を交換できる速度

分散コンピューティングの確信をリードするソフトウェア

  • OSより上位のソフトウェアについてもGoogleならではの工夫がされている
  • サーバマシンは壊れるもの、ソフトウェアレベルでアプリケーション自体の信頼性や安全性を担保しようという考え
    • Google File System(GFS)という分散ファイルシステム
    • 多数のマシンノードで並列処理するためのMapReduce
    • スケーラビリティのあるNoSQLであるBigtable
    • コンテナ管理メカニズムのBorg
  • 先進的なテクノロジーを3つのステップで公開
    • Google社無いでの利用経験をパブリックな論文として公開
    • それを実装するオープンソースや商用ソフトウェアとして公開
    • Google社内の基盤をGCPのサービスとして公開

まとめ

  • 他者サービスとくらべた特徴
    • 我々が利用できるGCP上で、実際のgoogle関連サービスも動いている

Google Cloud Platformの製品・サービス

基本構成

  • 利用可能なリージョンは世界4リージョン
    • 米国(東海岸)
    • 米国(中央)
    • 西ヨーロッパ
    • 東アジア
  • 各拠点にはゾーン(ほぼデータセンタと同義)が複数存在
    • データセンタ間の冗長化が必要な場合には複数ゾーンに配置
  • 全てのリソースが「プロジェクト」という枠組みで一元管理される
    • プロジェクトには「アカウント」を複数紐づけて権限設定可能
    • アカウントにはGoogleアカウントが利用される

製品・サービス全体増

  • GCPはコンピュート、ストレージ、ビッグデータ、APIサービスの4つの大きなカテゴリに分類される
  • 4カテゴリに加えて、ネットワーク、管理系のサービス群も存在
コンピュート
App Engine
  • スケーラブルなWebアプリケーションやモバイルバックエンドのためのアプリケーションプラットフォーム
  • フルマネージドなPaaS(Platform as a Service)
  • サーバインスタンスが立ち上がる速度は早いと数十ミリ、長くても秒単位
Compute Engine
  • Googleのインフラストラクチャ上で動作する仮想マシンサービス
  • linuxであれば30秒程度で起動
  • 分単位の課金、月額利用時間に応じた割引も自動適用
  • PreemptibleVMというマシンタイプを選ぶと79%オフ
    • 最大24時間しか稼働しない短期間リソースが必要なもの向け(バッチとか)
  • ライブマイグレーションにより透過的なメンテナンス
    • VMを止める事なく、別のHWに移動する事ができる技術
Container Engine
  • Dockerコンテナを動かすための実行環境を提供
  • Container Engineの実態はKubernetesと呼ばれるコンテナ管理のオープンソースのフルマネージサービス
  • Kubernetes環境を自分で作るのと比べると
    • ロギングやモニタリングの機構が予め組み込まれている
    • ロードバランサの設定が容易
ストレージ
Cloud Storage
  • 高い可用性と耐久性を持つオブジェクトストレージ
  • デフォルトでグローバルなエッジキャッシュを持つ
    • 世界中のどこにいてもオブジェクトに高速にアクセス可能
Cloud Datastore
  • Webアプリケーションやモバイルバックエンドを想定したスケーラブルなNoSQLサービス
  • シャーディングとレプリケーションが自動で行われる
    • スケーラブルで可用性が高い
Cloud SQL
  • MySQLデータベースを提供するフルマネージドサービス
  • バックアップやメンテなすを自動的に行う
  • 秒間数千トランザクションを捌くようなアプリでも利用可能
Cloud Bigtable
  • Google内部で10年以上使われていた大規模NoSQLを外部向けサービスとして公開した製品
    • HBaseやCassandraにも影響を与えた
  • 数百ペタ倍とまでのスケーリングを自動で行う
  • 低レイテンシ、高スループット
Big Data
BigQuery
  • 数TB大規模データセットに対して、高速&安価にクエリ実行可能なデータウェアハウスサービス
  • 大規模データセットに対するクエリ実行に、内部では数千台規模のマシンが使用される
Cloud Dataflow
  • 大量データに対するバッチおよびストリーミング処理を実現するフルマネージドサービス
    • HadoopやSparkの後継
  • 1つのアプリケーションコードがバッチ処理とリアルタイム処理両方をカバーできる
  • Apache Beamとしてオープンソース化されている
Cloud Dataproc
  • HadoopやSparkのジョブをGCP上で実行できるようにしたもの
  • オンプレや他クラウドで動かしていたHadoopやSparkを利用する場合にはCloud Dataflowより得策
Cloud Pub/Sub
  • 大規模かつ高速なメッセージングサービス
  • 秒間100万以上のメッセージを1対1、1対多、多対多、問わず低遅延で配信可能
APIサービス
Cloud Endpoints
  • AppEngineのアプリケーションから容易にRESTful APIを作ることが可能
  • iOSやAndroid、Javascriptクライアント用のライブラリを自動生成し、フロントエンドと簡単に通信
Translate API
  • 他言語間の翻訳APIサービス
  • Google翻訳と同様の翻訳サービスをAPIとして提供
Prediction API
  • 機械学習アルゴリズムを利用できる、データの分析と予習のためのAPI
ネットワーク
ロードバランシング
  • Googleサービスを支えるロードバランサを利用できる
  • ネットワークバランシング
    • リージョン内のインスタンスプールに対してTCP/UDPパケットを負荷分散
  • HTTP/HTTPSロードバランシングが存在する
    • グローバルロードバランサの機能をもっており、1つのIPでバックエンドリソース全体にアクセス可能
    • ユーザのリクエスト元を認識し、最も近いデータセンタにルーティング
DNS
  • 画面やAPIから設定できるDNSサーバサービス
  • Googleが世界中に展開しているAnycast DNSサーバのネットワークからは、信頼性が高く弾力的で低レイテンシのDNSサービスを得ることが可能
管理
Deployment Manager
  • Compute Engineの環境に各種ミドルウェアまで導入済みのサーバを自動的に立ち上げてくれるサービス
  • WordpressやLAMP構成は数クリックで立ち上げ可能
Logging
  • GCEやGAEのログを集約するサービス
  • BigQueryに流しこむことも可能
  • メトリクス設定する事で条件に合致した場合にアラートをあげるMonitoringと連携可能
Monitoring
  • 監視サービス
  • StackDriverというサービスをGCPに統合する形で提供
  • 死活監視、ログ監視、性能監視、ダッシュボードなど様々な監視が可能

他のクラウドとの比較

ここも面白い内容でしたが、詳細は書籍を読むとして特に印象に残った部分だけ抜粋します。

  • グローバルネットワークを持っている事でできるグローバルロードバランシングが可能
    • 固定IP1つで複数リージョン(米国とアジアなど)をまたいだロードバランシングが行える機能

GCPの特徴とメリット

グローバルネットワーク
  • 各データセンタはプライベートネットワークで繋がった状態がデフォルト
  • ロードバランサもグローバルで展開可能
  • 帯域品質はyoutubeなどでお墨付き
ライブマイグレーション
  • 物理サーバ間での仮想マシンインスタンスの移動が無停止で行われる
  • クラウド便だの都合によるHW・仮想化はイパバイザ側のメンテナンスによる停止時間が理論上発生しない
ロードバランシング性能
  • 数秒で100万同時アクセスがきてもさばけるレベル
  • グローバルIP1つでリージョン間を跨いだ振り分けが可能
Preemptibleインスタンス
  • 正規料金の3割りで利用できるインスタンス
  • 24時間以内に必ずGoogle側の都合でシャットダウンされる
課金について
  • 使った分量による課金
  • ムーアの法則による減額を行う
性能・コストパフォーマンス
  • 起動が早く性能が安定している(他クラウドと比べて)
運用性・アカウント管理
  • Googleアカウントで行われる
  • Gmail、Google Apps、任意のメールアドレスによるGoogleアカウントが利用可能
  • ブラウザからのアクセスでGoogleアカウント認証を行うため、証明書等を配る運用の手間がない
サポート
  • サポートサービスに入ることで日本語のサポートも可能
  • サポートメンバの技術的スキルも非常に高い
  • 回答までの時間も非常に早い(プランにはよる)
ビッグデータ処理
  • 分散処理に必要な点において圧倒的な優位性をもっている
    • 短時間起動
    • 短時間課金
    • インスタンスの安定した性能
    • ネットワーク性能
    • 負荷分散装置の性能

GCPにお足りないところ

  • 実績
  • 日本語のドキュメント不足
  • 日本リージョン不足

おわり

かなりサクサク読めました。
Google Cloud Platformがどんなものかかなりわかりやすく書かれていて良かったです\(^o^)/

【go】【glide】glide installで`[ERROR] Update failed for : Cannot detect VCS` と言われる件

はじめに

glide使いはじめたばかりのglide情弱のメモです。
適当なアプリを作って、とりあえずglideを試したかったので何かしらのinstall対象としてechoだけ入れることにしました。
そんなときに出たエラーと対応方法のプチメモ。

参考にこっちもはっておきます

glide installでエラーがでる

この状態からglide.yamlにechoを指定してglide installしたいだけとします。

tree
.
├── app.yaml
└── src
    └── myApp
        └── main.go

おもむろにglide installしてみます

# myAppに移動
$ cd src/myApp

# glide initしてglide.yaml作成
$ glide init
$ ls -al 
-rw-r--r--   1 hoge  hoge   131  3  7 21:47 glide.yaml
-rw-r--r--   1 hoge  hoge   219  3  7 21:09 main.go

# yamlの編集
$ vim glide.yaml
---- vim編集 ----
package: myApp
import:
  - pacage: github.com/labstack/echo
----------------

# glide installする
$ glide install
[INFO]  Lock file (glide.lock) does not exist. Performing update.
[INFO]  Downloading dependencies. Please wait...
[INFO]  --> Fetching updates for .
[WARN]   is an empty directory. Fetching a new copy of the dependency.
[WARN]  Unable to checkout 
[ERROR] Update failed for : Cannot detect VCS
[ERROR] Failed to do initial checkout of config: Cannot detect VCS

対応

VCS(Version Control System)を指定しないと出るようなので、
glide.yamlvcsを追加します。

package: myApp
import:
  - pacage: github.com/labstack/echo
    vcs: git

おわり

使い始めってなんでもわからない事が多いですよね!><