読者です 読者をやめる 読者になる 読者になる

tweeeetyのぶろぐ的めも

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

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

はじめに

以前、http://tweeeety.hateblo.jp/entry/2015/06/10/214419という記事を書きました。

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^)/

【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ならではの工夫がされている
  • サーバマシンは壊れるもの、ソフトウェアレベルでアプリケーション自体の信頼性や安全性を担保しようという考え
  • 先進的なテクノロジーを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
  • 大量データに対するバッチおよびストリーミング処理を実現するフルマネージドサービス
  • 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を作ることが可能
  • iOSAndroidJavascriptクライアント用のライブラリを自動生成し、フロントエンドと簡単に通信
Translate API
  • 他言語間の翻訳APIサービス
  • Google翻訳と同様の翻訳サービスをAPIとして提供
Prediction API
ネットワーク
ロードバランシング
  • Googleサービスを支えるロードバランサを利用できる
  • ネットワークバランシング
  • HTTP/HTTPSロードバランシングが存在する
    • グローバルロードバランサの機能をもっており、1つのIPでバックエンドリソース全体にアクセス可能
    • ユーザのリクエスト元を認識し、最も近いデータセンタにルーティング
DNS
  • 画面やAPIから設定できるDNSサーバサービス
  • Googleが世界中に展開しているAnycast DNSサーバのネットワークからは、信頼性が高く弾力的で低レイテンシのDNSサービスを得ることが可能
管理
Deployment Manager
  • Compute Engineの環境に各種ミドルウェアまで導入済みのサーバを自動的に立ち上げてくれるサービス
  • WordpressLAMP構成は数クリックで立ち上げ可能
Logging
  • GCEやGAEのログを集約するサービス
  • BigQueryに流しこむことも可能
  • メトリクス設定する事で条件に合致した場合にアラートをあげるMonitoringと連携可能
Monitoring
  • 監視サービス
  • StackDriverというサービスをGCPに統合する形で提供
  • 死活監視、ログ監視、性能監視、ダッシュボードなど様々な監視が可能

他のクラウドとの比較

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

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

GCPの特徴とメリット

グローバルネットワーク
  • 各データセンタはプライベートネットワークで繋がった状態がデフォルト
  • ロードバランサもグローバルで展開可能
  • 帯域品質はyoutubeなどでお墨付き
ライブマイグレーション
  • 物理サーバ間での仮想マシンインスタンスの移動が無停止で行われる
  • クラウド便だの都合によるHW・仮想化はイパバイザ側のメンテナンスによる停止時間が理論上発生しない
ロードバランシング性能
  • 数秒で100万同時アクセスがきてもさばけるレベル
  • グローバルIP1つでリージョン間を跨いだ振り分けが可能
Preemptibleインスタンス
  • 正規料金の3割りで利用できるインスタンス
  • 24時間以内に必ずGoogle側の都合でシャットダウンされる
課金について
性能・コストパフォーマンス
  • 起動が早く性能が安定している(他クラウドと比べて)
運用性・アカウント管理
  • Googleアカウントで行われる
  • GmailGoogle 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)と打つ事でジャンプ元へ戻ります。

終わり

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