Golang errcheck による defer 警告対応

概要

このようなコードを書いていると errcheck を実行した場合、 defer f.Close() と指摘されてしまいます。

1
2
3
4
5
6
7
8
9
10
func hoge() error {
...
f, err := os.Open(fpath)
if err != nil {
return err
}

defer f.Close()
...
}

f.Close() は返り値が error であり、その error の返り値をチェックしていない、という警告です。

続きを読む
Golang で関数のデフォルト引数を指定する

Go+Revelフレームワーク 非同期でS3へ画像リサイズ/アップロード

備忘録です。

概要

AWS 向けの go ライブラリが乱立していて
どれ使ったらいい?という感じだったので
本家の launchpad.net/goamz/aws を利用して
実装することにしました。

Controller

  • app/controllers/img.go

Component

画像アップロード部分を component 化しました。

  • app/utility/aws.go

Views

  • Views/Img/Index.html
  • public/js/ajax.js
  • public/js/jquery.uploadThumbs.js
peco 小技シリーズ  〜多段ssh + peco, ghq + peco + atom〜

peco 小技シリーズ 〜多段ssh + peco, ghq + peco + atom〜

概要

本当に小技です。
が、割と使ってみると作業時間の短縮となって便利という声を頂き
peco 関連でよく使うものを記事にしました。

peco インストール

1
macOS %$ brew install peco

ssh ログインする Host を検索して選択

前提条件として ~/.ssh/config で接続ホストを管理しています。

上記を ~/.bashrc などに貼り付けて source ~/.bashrc すれば使えます ♪

1
2
3
4
5
6
7
macOS %$ git clone https://gist.github.com/kenzo0107/06b3b1e202f36b70815cfe0207292a66
macOS %$ cd 06b3b1e202f36b70815cfe0207292a66
macOS %$ cat peco-sshconfig-ssh.sh >> ~/.bashrc
macOS %$ source ~/.bashrc

// sshc 実行!
macOS %$ sshc

上記の様に順調に進むと候補がリストされます。
モザイクしかなくすいません (>_<)

ghq で管理している repository を検索して選択し atom で開く

こちらも同様、

1
2
3
4
5
6
7
macOS %$ git clone https://gist.github.com/kenzo0107/e460e31ae2478341cc7a39859ad7fefd
macOS %$ cd e460e31ae2478341cc7a39859ad7fefd
macOS %$ cat peco-git-atom.sh >> ~/.bashrc
macOS %$ source ~/.bashrc

// opg 実行!
macOS %$ opg

他にも様々な箇所で peco を利用させて頂いてます。
こんな peco の使い所あるよーという方、是非教えてください ♪

参照

zsh ですが dotfile をまとめてます。

標準的な Golang インストール方法

標準的な Golang インストール方法

概要

Golang オフィシャルサイトに書かれているそのままです。

他 Golang 関連記事説明の為に、また、備忘録として記述します。

環境

  • CentOS Linux release 7.3.1611 (Core)

手順

Golang Official - Downloads から環境に合わせ
最新バージョンをインストールすることをお勧めします。

  • ソースからビルド
1
2
3
$ cd /usr/local/src
$ sudo wget https://storage.googleapis.com/golang/go1.7.5.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.7.5.linux-amd64.tar.gz
  • PATH 設定
1
2
3
4
5
6
7
8
$ sudo cat << 'EOF' | sudo tee /etc/profile.d/golang.sh
export GOPATH=$HOME/go
export PATH=$PATH:/usr/local/go/bin
EOF

$ sudo cp /etc/profile.d/golang.sh /etc/profile.d/golang.csh

$ source /etc/profile
  • 確認
1
2
3
$ go version

go version go1.7.5 linux/amd64

以上で Golang のインストール完了です。

リモートサーバとローカルサーバとの差分のあるファイル情報を取得するツール作ってみた

リモートサーバとローカルサーバとの差分のあるファイル情報を取得するツール作ってみた

概要

リモートサーバとローカルサーバとの差分のあるファイル情報を取得するツールを Golang で作成しました。

どんなツールか 3 行まとめ

  1. ローカルワークスペースを元にリモートサーバからディレクトリと拡張子指定し実行ディレクトリ上にファイルをダウンロード
  2. ローカルのワークスペースから実行ディレクトリ上にファイルをコピー
  3. 1,2 で取得したファイルから差分をチェック

利用想定ケース

  • リモートファイルサーバとローカルワークスペースの同期状況が不明瞭である場合

この 1 点のみです。
整備されたデプロイ環境では発生しにくいケースです。

ですが意外と多いです。

それはこんなケース

  • 担当者が退職して引き継がれていない (>_<)
  • ちょっとしたツールだし Git 管理してなかった (>_<)
  • 別の業者さんがサーバにアクセスでき、勝手に編集することがある (>_<)

上記のケースに当たる案件にたまたま担当してしまって
デグレった、バグったとならない為に個人的に作ってました。

補足

デフォルトの対象拡張子は php,tpl,js,css,html を対象としています。
会社で PHP プロジェクトを扱うことが多いので m(_ _)m

あとがき

元々 Python で書いてましたが Go にしたところ
4~5 倍程度パフォーマンスアップしました!

並行処理についても
Python も multiprocessing がありますが
書き易さは Go かなと思いました。

ちなみに

実装に当たってこちら拝読させていただきました。
基礎的な Go 言語の構文や環境構築、
Semaphore を意識した設計はとても参考になりました。

Golang 簡易パフォーマンス測定

概要

簡易的なパフォーマンス測定覚書です。
よく使うので備忘録的に保存。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main

import (
"fmt"
"runtime"
"time"
)

func main() {
// CPU数
cpus := runtime.NumCPU()

// 開始時メモリ
var startMemory runtime.MemStats
runtime.ReadMemStats(&startMemory)

// 開始時間
start := time.Now()


// do something


// 経過時間
elapsed := time.Since(start)

// 終了時メモリ
var endMemory runtime.MemStats
runtime.ReadMemStats(&endMemory)

fmt.Printf("実行時間: %f 秒 \n", elapsed.Seconds())
fmt.Printf("CPU: %d \n", cpus)
fmt.Printf("Memory All: %f MB \n", float64(endMemory.Alloc-startMemory.Alloc)/float64(1024*1024))
}
CentOS7用 Revel(Golang)フレームワークの起動スクリプト 書いてみた。

CentOS7用 Revel(Golang)フレームワークの起動スクリプト 書いてみた。

起動スクリプト作成

まず成果物から

1
# vim /usr/lib/systemd/system/revel.service
1
2
3
4
5
6
7
8
9
10
[Unit]
Description=RevelBuildScript
After=nginx.service mysqld.service

[Service]
Type=simple
ExecStart=/bin/bash /var/golang/run.sh

[Install]
WantedBy=multi-user.target

※After … 上記では nginx と mysqld 起動後に revel を起動させるという設定です。

※ExecStart … /bin/bash /var/golang/run.sh については
以前の記事でローカルビルドによる
デプロイ方法を採用しているというお話をしましたが
その際に作成される run.sh のパスを指しています。

起動設定

1
# systemctl enable revel.service

起動

1
# systemctl start revel.service

停止

1
# systemctl start revel.service

以上です。

導入経緯

AWS での運用をしていると検証環境は
検証時のみに利用し余計なコストは掛けたくないものです。

なので、しょっ中、起動・停止を繰り返します。

Revel フレームワークは起動スクリプトが標準装備されていない為
インスタンス起動時に手動で起動する手間が発生していました。

その為、デザインの修正でもシステムさんお願いします〜というような依頼があり
相互に手間が発生していたのでその解決として作成しました。

現在は Slack 経由で hubot から Jenkins ジョブを実行させ
Revel の乗ってる AWS インスタンスの起動・停止できるようにしています。

ip も ElasticIP は使用せず、No-IP を利用して Public IP が変更されても
同ドメインでアクセスできるようにしています。

こちらもインスタンス起動時にドメイン管理している No-ip へ Public IP を通知し
動的にドメインと IP を紐付けるようにしています。

http://www.noip.com/

極力費用を抑えた、AWS における検証環境構築の参考にもしていただければと思います。

以上です。

※ 検証環境 はローカル開発環境と異なり、あくまで本番デプロイ前の検証用という認識です。