tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^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

おわり

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

【vim】スワップファイル(.swp)について - 出さなくする/出力場所を設定する

はじめに

スワップファイル(.swpとか)って普段あまり気になりませんが、
PCやターミナルが不意に強制終了などするとそのまま.swpが残ってしまうときありますよね。

消すにもいろんなディレクトリにちらばって残っていたり
探すのもめんどくさいしでいっその事でなきゃいいのにとも思いますが、
クラッシュ前の変更を記録してくれたりするので出さなくするにもなーと思います。

そんなときのメモ。
内容自体は今更な内容ですw

アジェンダ

  1. スワップファイル(.swp)とは
  2. スワップファイル(.swp)できたとき
  3. スワップファイル(.swp)を出さなくする設定
  4. スワップファイル(.swp)の出力場所を設定する
  5. スワップファイル(.swp)の作り方

1. スワップファイル(.swp)とは

まずは.swpファイルについて軽く触れておきます。

swpファイルはスワップファイルと呼ばれています。
スワップファイルはアプリケーションのクラッシュに備えて、 vimエディタでの編集開始時に作成され、編集後に削除される編集情報の記録ファイルです。
スワップファイルを使用していれば、vimエディタがシステムエラーで強制終了しても、 保存前のデータが失われずに済みことがあります。

2. スワップファイル(.swp)できたとき

.swpがあるファイルをvimで開くとこんな表示がされます。

E325: ATTENTION
Found a swap file by the name ".swp_sample.txt.swp"
          owned by: hoge   dated: Mon Jan 23 12:09:39 2017
         file name: ~hoge/swp/swp_sample.txt
          modified: no
         user name: hoge   host name: O-04850-MAC.local
        process ID: 8563
While opening file "swp_sample.txt"
             dated: Mon Jan 23 12:07:24 2017

(1) Another program may be editing the same file.  If this is the case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r swp_sample.txt"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".swp_sample.txt.swp"
    to avoid this message.

Swap file ".swp_sample.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort: 

書いてある通りですが、それぞのキーを押す事で次の動作を決める事ができます。

キー オプション名 説明
O 読み込み専用 読み込み専用でファイルを開く
E 編集 .swpを無視してオリジナルのファイルに対して編集する。スワップファイルは新たに別名で作成される
R 復活 オリジナルのファイルと.swpファイルを使用してクラッシュ前の状態を復元する
D 削除 swapファイルを削除してオリジナルのファイルの編集をする
Q 終了 ファイルを開くのをやめる
A 中止 現在作業中の処理を停止する。連続でファイルを開いている場合などに中止する

3. スワップファイル(.swp)を出さなくする設定

スワップファイル(.swp)を出さなくするには
~/.vimrc に設定を足します。

set noswapfile

有効にする(出すとき)はこっちを設定します。

set swapfile

4. スワップファイル(.swp)の出力場所を設定する

出力する場所を変更するために
まずはmkdir ~/.vim/tmp.swpをおくディレクトリを作成してから
以下の設定を~/.vimrcに追加します。

set directory=~/.vim/tmp

5. スワップファイル(.swp)の作り方

出さなくするにせよ、出力場所を変えるにせよ動作確認がしたいものです。
.swpファイルは強制終了時などに残りますが、vimを開いた状態でターミナルのxボタン閉じるをしても残らなかったりします。

なのでkillすることで強制終了する事で.swpを残します。

# vimで適当なファイルを開いたまま別のターミナルでls
$ ls -l
total 32
drwxr-xr-x  4 hoge  hoge    136  1 24 23:55 .
drwxr-xr-x  4 hoge  hoge    136  1 24 17:27 ..
-rw-r--r--  1 hoge  hoge  12288  1 24 23:55 .swp_sample.txt.swp
-rw-r--r--  1 hoge  hoge      9  1 23 12:07 swp_sample.txt

# killするプロセスを知る
$ pstree
~ 省略 ~ 
 | |-+= 00592 hoge /Applications/Utilities/Terminal.app/Contents/MacOS/Terminal -psn_0_45067
 | | |-+= 27293 root login -pfl hoge /bin/bash -c exec -la bash /bin/bash
 | | | \-+= 27294 hoge -bash
 | | |   \--= 34214 hoge vim swp_sample.txt
~ 省略 ~

# この場合は`08663`をkill
$ kill -9 34214

# vimを開いているターミナルをプロセスが終了しているはず
# と、同時に.swpも残りっぱなしになる

おわり

今更な内容でも書く事を大事にしようと思います\(^o^)/

【vim】ジャンプする前のカーソルの位置に戻るjump-motions - <C-o>

はじめに

もうタイトルに書いてるのが全てです

初歩的ですがたまに忘れては、そもそもこの機能の日本語での呼び方もわからず...検索するのも数分...
と何度か繰り返したので自分戒めメモです。

名前

検索するとき出てこないのでこれを気に覚えます。
Jumpjump-motionsというらしいです。

vim help

vim:help jump-motionsと打つとhelpが表示されます。
基本的な事だけコピって貼っておきます。

8. Jumps                                        jump-motions

A "jump" is one of the following commands: "'", "`", "G", "/", "?", "n",
"N", "%", "(", ")", "[[", "]]", "{", "}", ":s", ":tag", "L", "M", "H" and
the commands that start editing a new file.  If you make the cursor "jump"
with one of these commands, the position of the cursor before the jump is
remembered.  You can return to that position with the "''" and "``" command,
unless the line containing that position was changed or deleted.

                                                        CTRL-O
CTRL-O                  Go to [count] Older cursor position in jump list
                        (not a motion command).
                        {not in Vi}
                        {not available without the +jumplist feature}

<Tab>           or                                      CTRL-I <Tab>
CTRL-I                  Go to [count] newer cursor position in jump list
                        (not a motion command).
                        {not in Vi}
                        {not available without the +jumplist feature}

用例

vimでファイルを開いている時、
gg(topへ移動)やG(末尾へ移動)などへ移動(これをジャンプという)した後に、元いた場所に戻りたいことがあります。
ここで<C-o>(ctrl + o)と打つ事でジャンプ元へ戻ります。

終わり

忘れぽさがひどい気がする><

【go】golang環境でFailed parsing input: parser: bad import "syscall" というエラーが出るときのメモ

はじめに

golangを開発していて、go getコマンドなどでライブラリなどを入れた場合にこんなエラーが出ることがあります。

2017/01/16 14:00:33 go-app-builder: Failed parsing input: parser: bad import "syscall" in src/golang.org/x/tools/cmd/heapview/internal/core/mmapfile.go

原因

参考にしたサイトからそのまま引用させて頂きますが、以下のような場合に起こるらしいです。

GAE/Go では syscall や unsafe パッケージのインポートが許されていない。 たとえばプロジェクトルート以下に vendor ディレクトリを作っていて、 その下に置いたサードパーティ製のライブラリがこれら利用不可のパッケージを利用していた場合、 アプリケーションから利用していなくても開発サーバの起動やデプロイができなくなることになる。

go getコマンドでライブラリを入れたり、
自分の場合はvimでgo環境を整えるためにvim-go:GoInstallBinariesを行ったあとに起こりました。
※ direnvでGOPATHを変えてたからなど起こった原因は自分環境のせいではありますが...

対応方法

こちらも参考サイトに書かれていますが、
app.yamlnobuild_filesという項目を追記してbuild対象から外してやる事でエラーがでなくなりました。

nobuild_files:
    - src/gopkg.in
    - src/golang.org
    - src/github.com

参考似させて頂いたサイト

おわり

ちょっとしたことでハマると数時間あっというまですね\(^o^)/

【go】mac vimのGo開発環境を設定するメモ - mac x vim x vundle x go

はじめに

macでGo開発するときにvimの環境を整えるメモです。
vimでこんな感じの事ができるようになればいいやーくらいの感じです。

  • 補完
  • lint
  • 関数定義へジャンプ
  • ドキュメント(GoDocを開く)

アジェンダ

  1. GOPATH確認
  2. Vundleでvim-goの設定&インストール
  3. Vundleでvim-goの依存パッケージのインストール
  4. おもむろに動作確認(:GoFmt、補完、:GoRun)
  5. go-commandsメモ(:GoPath、:GoFmt、:GoDef、:GoDoc、:GoLint)

1. GOPATH確認

GOPATHを念のため確認します。

$ echo $GOPATH
/Users/hoge/.go

$ vim ~/.bashrc
---- vi追記 ----
export GOPATH=$HOME/.go
export PATH=$PATH:/usr/local/opt/go/libexec/bin
export PATH=$PATH:$GOPATH/bin
---------------

2. Vundleでvim-goの設定&インストール

vimvim-goの設定

~/.vimrcにVundleの設定を追記します。

$ vim ~/.vimrc
---- vim追記----
set nocompatible              " be iMproved, required
"filetype off                  " required

set rtp+=~/.vim/bundle/Vundle.vim/
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'

" golangに関して以下2行を追記
Plugin 'fatih/vim-go'
Plugin 'nsf/gocode', {'rtp': 'vim/'}                                                                                                                                                                                                                                    

call vundle#end()            " required
filetype plugin indent on    " required
---------------

vim-goインストール

適当にVimを開いた状態で :PluginInstall コマンドを打って
追記したvim-goとgocodeをインストールします。

特に設定を変えていなければ~/.vim/bundle配下にインストールされた事が確認できます。

$ ls -l ~/.vim/bundle/
total 0
drwxr-xr-x  15 hoge  hoge   510 12 12 01:22 Vundle.vim
drwxr-xr-x  36 hoge  hoge  1224  1 16 15:14 gocode
drwxr-xr-x  13 hoge  hoge   442 12 12 01:25 nerdtree
drwxr-xr-x  23 hoge  hoge   782  1 16 15:14 vim-go

Vundle自体の設定についてはこちらをご参考まで。

3. Vundleでvim-goの依存パッケージのインストール

適当にvimを起動している状態で:GoInstallBinariesを打って依存パッケージをインストールします。
こんなコマンドまで用意されていて便利!!

コマンドを打つとxxx not foundな感じで、入っていない依存パッケージをチェックして勝手にインストールしてくれます。

vim-go: goimports not found. Installing golang.org/x/tools/cmd/goimports to folder /Users/hoge/.go/bin/
vim-go: guru not found. Installing golang.org/x/tools/cmd/guru to folder /Users/hoge/.go/bin/
vim-go: gorename not found. Installing golang.org/x/tools/cmd/gorename to folder /Users/hoge/.go/bin/
vim-go: golint not found. Installing github.com/golang/lint/golint to folder /Users/hoge/.go/bin/
vim-go: godef not found. Installing github.com/rogpeppe/godef to folder /Users/hoge/.go/bin/
vim-go: errcheck not found. Installing github.com/kisielk/errcheck to folder /Users/hoge/.go/bin/
vim-go: gotags not found. Installing github.com/jstemmer/gotags to folder /Users/hoge/.go/bin/
vim-go: asmfmt not found. Installing github.com/klauspost/asmfmt/cmd/asmfmt to folder /Users/hoge/.go/bin/
vim-go: motion not found. Installing github.com/fatih/motion to folder /Users/hoge/.go/bin/
vim-go: gogetdoc not found. Installing github.com/zmb3/gogetdoc to folder /Users/hoge/.go/bin/
vim-go: impl not found. Installing github.com/josharian/impl to folder /Users/hoge/.go/bin/

4. おもむろに動作確認

go-commandsが効く事をためす

適当なディレクトリに適当なgoファイルを作って試してみます。
まずは:GoFmt(整形してくれる君)を試します。

# homeディレクトリに適当なディレクトリ適当なgoファイルを作ってみる
$ pwd
/Users/hoge/

$ mkdir sample
$ touch sample.go

# 適当なインデントで書く
$ vim sample/sample.go
  • 新規作成時のファイル
package sample

import (
           "fmt"
)

func main() {
fmt.Print("test\n")
              fmt.Print("test\n")                                                                                                                                                                                                                                  
}
  • :GoFmt実行時 or :wで保存時に自動整形される
package main                                                                                                                                                                                                                                           

import (
  "fmt"
)

func main() {
  fmt.Print("test\n")
  fmt.Print("test\n")
}                                                                                                                                                                                                                          

補完を試す

fmt.Pまで打ってから<C-x><C-o>(Ctrlを押したままx,o)と打つとこんな感じで補完されます。

  • f:id:tweeeety:20170116232602p:plain
  • f:id:tweeeety:20170116232610p:plain

実行を試す

また、:GoRunと打ってみるとこのファイルを実行できます。
ただprintしているだけですが下記のように表示されますね。

Press ENTER or type command to continue
[No write since last change]
test
test

Press ENTER or type command to continue

5. go-commandsメモ(help、:GoPath、:GoFmt、:GoDef、:GoDoc、:GoLint)

おまけ的にいくつかのgo-commandsを書いておきます。

help

基本的にgo-commandsは以下の2つで探せばいろいろでてきます。 * vim-goリポジトリのREADMEを見る * vim開いてる状態で:help vim-goと打つ

README

https://github.com/fatih/vim-go

:help vim-go

こんな素敵な画面でhelpを見れます

f:id:tweeeety:20170116232649p:plain

以下のgo-commandは、簡単な説明との結果も合わせて貼っておきます。

:GoPath

説明

名前からもわかる通り、vimを開いたままGoPathを表示してくれます。
direnvなどでプロジェクトごとにGOPATHを切り替えてる場合は役立ちます。

:help vim-go 引用
:GoPath [path]
    
    GoPath sets and overrides GOPATH with the given {path}. If no {path} is  
    given it shows the current GOPATH. If "" is given as path, it clears
    current GOPATH which was set with :GoPath and restores GOPATH back
    to the initial value which was sourced when Vim was started.

:GoFmt

説明

ソースをよしなにGo形式にフォーマットしてくれます。

:help vim-go 引用
:GoFmt

    Filter the current Go buffer through gofmt.  It tries to preserve cursor
    position and avoids replacing the buffer with stderr output.

:GoDef

説明

ソース中の任意のwordにカーソルがある状態で:GoDefと打つと定義元のファイルに飛んでくれます。
vim側のコマンドの<C-o>で、元いたファイルに戻れます。便利!

また、:help vim-go引用にも記載されてる通り、
デフォルトでショートカットが割り当てられているのでgdと打つだけでも使えます。

:help vim-go 引用
:GoDef [identifier]
gd
CTRL-]

    Goto declaration/definition for the given [identifier]. If no argument is
    given, it will jump to the declaration under the cursor. By default the
    CTRL-] key and the mapping gd are enabled to invoke :GoDef for the
    identifier under the cursor. See 'g:go_def_mapping_enabled' to disable
    them.

    vim-go also keeps a per-window location stack, roughly analogous to how
    Vim's internal tags functionality works. This is pushed to every time a
    jump is made using the GoDef functionality. In essence, this is a LIFO
    list of file locations you have visited with :GoDef that is retained to
    help you navigate software.

:GoDoc

説明

ソース中の任意のwordにカーソルがある状態で:GoDefと打つと定義元のファイルに飛んでくれます。
vim側のコマンドの<C-o>でもといたファイルに戻れます。便利!

また、:help vim-go引用にデフォルトでショートカットも割り当てられているのでgdと打つだけでも使えます。

:help vim-go 引用
:GoDoc [word]

    Open the relevant GoDoc in split window for either the word[s] passed to
    the command or by default, the word under the cursor.

:GoLint

説明

vimで開いているファイルに対してlint(構文チェック)を通してくれます。
PASSと出ればOK、エラーの場合は表示してくれます。

:help vim-go 引用
:GoLint [packages]

    Run golint for the current Go file, or for given packages.

参考

以下のサイトを参考にさせて頂きました!thx! * VimでGoの開発環境を設定する方法のまとめ * vim-goをインストールしてみた(所要時間:15分) * MACで Go言語の開発環境(Go+Vundle+Vimgo+gocode)セットアップ

おわり

GoDocなんかはローカルサーバ立ち上げてみるのも良いですし、goはいろいろ用意されてて便利ですね!\(^o^)/

【vim】macにvimプラグインマネージャvundleをサクっと入れるメモ

はじめに

新しいPCになったタイミングなので改めてvimにvundle入れるメモです。
と、同時に他の記事に引用したかったので自分記事スニペット用。

ながれ

  1. NeoBundleは?
  2. Vundle.vimのインストール
  3. Vundle.vimの初期設定&反映
  4. pluginインストール
  5. インストールするpluginの指定方法
  6. vundleのコマンド

1. NeoBundleは?

NeoBundleも良かったのですが、しばらくSublimeAtomも使っていて少し経つうちにNeoBundle開発終わっちゃったんですね。。。。><

NeoBundle を利用する前に
NeoBundle を使い始めようとしている方は、VimとNeoVimのプラグインマネージャDein.vim を利用しましょう。NeoBundle の開発は終了しました。

ということで、NeoBundleはVundleベースですして基本に立ち返ってVundleに。

2. Vundle.vimのインストール

~/.vim あたりを指定してcloneしてくればインストールは終わりです。

$ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

インストールすると~/.vimディレクトリ配下に
bundleディレクトリが作成されます。入れたpluginたちもそこに入ります。
vundle自体もpluginなので確認するとVundle.vimというディレクトリが作成されてます。

$ tree ~/.vim/bundle -L 1
/Users/tweeeety/.vim/bundle
└── Vundle.vim

1 directory, 0 files

3. Vundle.vimの初期設定&反映

初期設定

初期設定として~/.vimrcにvundle用の設定をちょこっと追加します。
一旦の最低限であれば下記で良いでしょう。

"
" Vundle.vim
"
set nocompatible              " be iMproved, required
filetype off                  " required

set rtp+=~/.vim/bundle/Vundle.vim/
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'

call vundle#end()            " required
filetype plugin indent on    " required

call vundle#begin()call vundle#end()の間に追加したいpluginを記述していく感じです。

反映

vimを開いている状態で設定ファイルを反映させます。

:source ~/.vimrc

一度閉じて開き直しても反映されるので閉じた場合は不要です。

4. pluginインストール

こちらも簡単です。vimを開いた状態でこれを打ってみましょう。

:PluginInstall

他のpluginも入れてみる

ただし、ここまでの状態だとすでにインストール済みのVundleVim/Vundle.vimが反映されるだけです。
せっかくなのでディレクトリをツリー表示できるプラグインNERDTreeを入れてみます。

.vimrcに下記を追記。:soure ~/.vimrcで設定を読み込んでから:PluginInstallでインストールします。

Plugin 'scrooloose/nerdtree'

しばらく画面が表示されてdoneとでれば終わりです。
f:id:tweeeety:20161212015528p:plain

参考

5. インストールするpluginの指定方法

インストールするプラグインはvimrcに
Plugin 'VundleVim/Vundle.vim' のように指定しましたが置かれている以下の場所によって3つの方法があります。

実際に書くとこんな感じ。

call vundle#begin()

" vim-scripts リポジトリ
Plugin "rails.vim"
 
" github の任意のリポジトリ
Plugin "tpope/vim-fugitive"
 
" github 以外のリポジトリ
Plugin "git://git.wincent.com/command-t.git"

call vundle#end()

これはまんま参考サイトを参考にさせていただきました。thx!!

参考

6. vundleのコマンド

最後はおまけ程度ですがvundleのコマンドです。:PluginInstallのたぐいですね。

コマンド 説明
PluginInstall プラグインのインストール
PluginUpdate プラグインのアップデート
PluginSearch プラグインの検索
PluginClean プラグインの削除。.vimrc上で指定を削除orコメントアウトしてから実行

終わり

しばらくAtom使ってましたがvimvimでいいですよね\(^o^)/