
Outline
こんにちは。僕です。最近は Vue.js で SPA、Go言語で APIサーバーを実装しています。ここで意識するのはフロントエンドとバックエンドの分離です。分離させたい理由は二つ。
- アプリ化の際や、今後、他のサービスと連携させるためにも、バックエンドはAPIサーバーに徹したい。
- Vue.jsで開発中にオートリロードしたい(Vue.jsをビルドして出来たファイルをGo言語でserveする形にすると、毎回ビルドするのが面倒)
しかし、これをやろうとすると認証どうするの問題が付いてきます。APIサーバ、フロントの両方をセキュアにしようとするとそれだけで時間取られます。そこで使うのが認証基盤である Firebase Authentication です。これを使うと爆速で認証が作れます。そう、爆速です。Vue.js + Firebase の 解説記事はめちゃくちゃありますが、そこで返ってくるJWT を使ったAPIサーバーでの認証はあまり記事になかったので、今回はそこも含めたセキュアなWEBアプリケーションの実装をハンズオン形式で紹介します。タイトル通り、フロントエンドは Vue.js、バックエンドは Go言語、認証基盤として Firebase を使います。
御託はいいからコード見せろという方はこちらへどうぞ
https://github.com/po3rin/vue-golang-fireauth
今回使う技術の概要
Vue.js
Vue.jsは現在、非常に人気のあるJavaScriptフレームワークです。GitHubでのstarはjQuery、Reactを抑え、現在最も注目されているJSフレームワークです。導入のし易さや、軽量感、学習コストが少ないことを売りにしている。
Vue.jsの入門記事を前に作ったので、初めて触る人はこちらも参考にしてみてください。
VueCLIからVue.js入門①【VueCLIで出てくるファイルを概要図で理解】
Go言語
フロントエンド畑で育った僕が、なぜサーバーサイドにGo言語を選ぶかというと、主に以下の理由
- 構文 & 型システムがシンプル。動的言語しかやってこなかった僕でもすんなり受け入れてくれた。
- 並列処理が書きやすい。JavaScriptで苦戦した非同期処理が難なく書ける。
- 標準パッケージのサポートが強力。コードのフォーマットも自動でやってくれる。
とにかく開発者に無駄なことをさせないという気迫がすごい。ゆえに書いてて、読んでて気持ち良い。
Firebase
FirebaseはMBaas(mobile backend as a service)と呼ばれるものの一種で,オンラインでサインアップするだけでサーバのセットアップやメンテナンスに煩わされることなく使い始めることができ,リアルタイム同期型データベースやユーザ認証等の様々な機能が使えます。趣味で開発する規模であればだいたい無料で使えます。
JWT
JWT(Json Web Token)と書いてジョットと読むらしい。このトークンを使ってクライアント&サーバー間で認証できる。
特徴としては、
- 発行者が鍵を使ってJSONを署名し、トークンとして使う。
- JSONなので任意の情報を含めることができる(ユーザー名など)。
- 発行者は鍵を使ってトークンの検証を行う為、改竄を検知できる。
上記の特徴から、僕が特にメリットに感じた点は「ステートレス」という点。サーバ側にセッションストアを持たなくても検証ができる。
JWTは以下のフォーマットに従った文字列です。
{base64エンコードしたhead1er}.{base64エンコードしたclaims}.{署名}
実際にこちらのサイトでJWTのエンコード、デコードが試せる。
https://jwt.io/
JWTをGo言語で解説した記事を前に作ったので、JWTの解説についてはこちらを参考にしてください。
Go言語で理解するJWT認証 実装ハンズオン
実装するアーキテクチャ
サインアップはフロント側で行います。サインアップしたアカウントでサインインすると Firebase から JWT が返却されます。このJWTを使ってAPIサーバーにアクセスします。図にすると下記のような形になります。
Vue.jsでSPAを作る
必要なインストール
Vue.jsの開発環境を整えるためにvue-cliを使います。そのためnode.jsをインストールしておいてください。インストールされているか下記で確認しましょう。
$ node -v
v9.5.0
$ npm -v
v5.6.0
Vueアプリケーションの雛形作成
vue-cli
をインストールしましょう
$ npm install -g vue-cli
これでVueアプリケーションの雛形が作成できます。早速任意の場所で下記を実行。test-vueの部分はプロジェクト名&ディレクトリ名になります。
$ vue init webpack test-vue
いろいろ聞かれますが、お好みで設定を変えれます。全部EnterでもOKです。実行が終わったら下記を実行し、雛形を確認してみましょう。
$ cd test-vue
$ npm run dev
最終的にコマンドに出ているURLにブラウザからアクセスしてみてください。Vueアプリケーションの土台ができています。
まずは認証なしSPAを作る
src/component/HelloWorld
を認証後のマイページにすることを想定していきます。そのためにSigninページ、Signupページを追加で作ります。
まずはAPIを叩くために、Promise ベースの HTTPクライアントである axios を導入します。
$ npm install axios --save
これを使って、APIサーバーからデータを受け取って表示するマイページを作成します。
では早速、src/components/HelloWorld.vue
を編集します。
<template>
<div class='hello'>
<h1>{{ msg }}</h1>
<h2>Essential Links</h2>
<button @click="apiPublic">public</button>
<button @click="apiPrivate">private</button>
</div>
</template>
<script>
import axios from 'axios'
export default {
name: 'HelloWorld',
data () {
return {
msg: 'Welcome to Your Vue.js App'
}
},
methods: {
apiPublic: async function () {
let res = await axios.get('http://localhost:8000/public')
this.msg = res.data
},
apiPrivate: async function () {
let res = await axios.get('http://localhost:8000/private')
this.msg = res.data
}
}
}
</script>
<!-- Add 'scoped' attribute to limit CSS to this component only -->
<style scoped>
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
button {
margin: 10px 0;
padding: 10px;
}
</style>
下のようになります
今はAPIを叩くボタンを押しても、まだAPIサーバーを作ってないのでブラウザのconsole上でエラーが出るはずです。
そして、src/components/Signup.vue
とsrc/components/Signin.vue
を作成します。
まずはsrc/components/Signup.vue
から作成します。
<template>
<div class="signup">
<h2>Sign up</h2>
<input type="text" placeholder="Username" v-model="email">
<input type="password" placeholder="Password" v-model="password">
<button>Register</button>
<p>Do you have an account?
<router-link to="/signin">sign in now!!</router-link>
</p>
</div>
</template>
<script>
export default {
name: 'Signup',
data () {
return {
email: '',
password: ''
}
}
}
</script>
<style scoped>
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
.signup {
margin-top: 20px;
display: flex;
flex-flow: column nowrap;
justify-content: center;
align-items: center
}
input {
margin: 10px 0;
padding: 10px;
}
button {
margin: 10px 0;
padding: 10px;
}
</style>
下のようになっているはず。Signupページへ遷移するリンクはつけていないので localhost:8080/#/signup
のようなURLでブラウザから直接見てみましょう。(※後ほど説明するルーティングを記述後にアクセスしないとアクセスできません)
まだサインアップはできません。後程つけていきます。
次は、src/components/Signin.vue
の作成です。
<template>
<div class="signin">
<h2>Sign in</h2>
<input type="text" placeholder="email" v-model="email">
<input type="password" placeholder="Password" v-model="password">
<button>Signin</button>
<p>You don't have an account?
<router-link to="/signup">create account now!!</router-link>
</p>
</div>
</template>
<script>
export default {
name: 'Signin',
data: function () {
return {
email: '',
password: ''
}
}
}
</script>
<style scoped>
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
.signin {
margin-top: 20px;
display: flex;
flex-flow: column nowrap;
justify-content: center;
align-items: center
}
input {
margin: 10px 0;
padding: 10px;
}
button {
margin: 10px 0;
padding: 10px;
}
</style>
そしてこうなります。localhost:8080/#/signin
のようなURLでブラウザから直接見てみましょう。(※後ほど説明するルーティングを記述後にアクセスしないとアクセスできません)
実際に動くサインイン機能は後程実装します。
最後に、作成したページへのルーティングを設定します。src/router/index.js
を編集します。
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import Signup from '@/components/Signup'
import Signin from '@/components/Signin'
Vue.use(Router)
export default new Router({
routes: [
{
path: '*',
redirect: 'signin'
},
{
path: '/',
name: 'HelloWorld',
component: HelloWorld
},
{
path: '/signup',
name: 'Signup',
component: Signup
},
{
path: '/signin',
name: 'Signin',
component: Signin
}
]
})
これでサインアップ用、サインイン用、マイページの3ページができました。
では早速APIサーバーの実装に入りましょう。
Vue.jsから叩くAPIサーバーをGo言語で実装する
簡易なHTTPサーバー実装
認証なしの簡易APIサーバーを作ります。今回は軽量なウェブツールキット gorilla/mux
を使いましょう。(go get github.com/gorilla/mux
でインストールします)
まずは、main.go
を作成します。
package main
import (
"log"
"net/http"
"github.com/gorilla/mux"
)
func public(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello public!\n"))
}
func private(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello private!\n"))
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/public", public)
r.HandleFunc("/private", private)
log.Fatal(http.ListenAndServe(":8000", r))
}
実際にAPIが叩けるか terminal 等から確認しましょう。
$ go run main.go
$ curl localhost:8000/public
hello public!
$ curl localhost:8000/private
hello private!
いいですね!簡単にHTTPサーバーをかけました。ただし、Vue.js からはまだ叩けません。CORSのエラーが出ます。サーバー側でCORSの設定をする必要があります。
CORSの設定
main関数の中を編集します。私はlocalhost:8080を設定していますが、各自、Vue.jsが立ち上がっているIPアドレス + ポート番号を設定してください。更に今回は HTTP Repuest の Header に Authorizationヘッダーをつけるので、これも許可します。
関数の最後の行でCORSを設定してます。CORSを設定するhandlers
は github.com/gorilla/handlers
を使っているのでこちらもimportしておきましょう。
// ...
import (
// ...
"github.com/gorilla/handlers"
)
// ...
func main() {
allowedOrigins := handlers.AllowedOrigins([]string{"http://localhost:8080"})
allowedMethods := handlers.AllowedMethods([]string{"GET", "POST", "DELETE", "PUT"})
allowedHeaders := handlers.AllowedHeaders([]string{"Authorization"})
r := mux.NewRouter()
r.HandleFunc("/public", public)
r.HandleFunc("/private", private)
log.Fatal(http.ListenAndServe(":8000", handlers.CORS(allowedOrigins, allowedMethods, allowedHeaders)(r)))
}
これで簡易的ですがAPIサーバーが出来ました。Vue.jsからAPIを叩いて画面の表示が変わることを確認しましょう。
Firebase Authentication を使って認証機能を追加する
では本題の認証をつけていきましょう。まずは上の形を目指します。
Firebase を設定
https://firebase.google.com から初めます。
コンソールに入り、プロジェクトを新規作成します。
ウェブアプリにFirebaseを追加する をクリックします。
プロジェクトでFirebaseを使うために必要な設定項目が表示されるのでこれをコピーしておきます。
そして今回の実装例としてメールアドレスでの認証を行うので、Authenticationの メール/パスワード を有効にします。もちろんGoogleアカウント認証や、GitHub認証もここから設定できます。これでメールアドレスとパスワードによる認証の準備が出来ました。
Vue.js で Firebase を使うためのモジュールもここで install しておきましょう。
$ npm install firebase --save
src/main.js
に先ほどの設定を組み込みます。下記を自分の設定に書き換えてください。
// ...
import firebase from 'firebase'
Vue.config.productionTip = false
const config = {
apiKey: 'YOUR_KEY',
authDomain: 'YOUR_DOMAIN.firebaseapp.com',
databaseURL: 'YOUR_DOMAIN.firebaseio.com',
projectId: 'YOUR_ID',
storageBucket: 'YOUR_BUCKET_ID.appspot.com',
messagingSenderId: 'YOUR_SENDER_ID'
}
firebase.initializeApp(config)
// ... Vueインスタンス作成 省略
これでFirebaseをVue.jsで使う準備が出来ました。
サインアップ機能
早速 Signup 機能をつけていきましょう。Signup.vue を書き換えます。button
タグにイベントと、SignUpメソッドを追加しています。
<template>
<div class="signup">
<h2>Sign up</h2>
<input type="text" placeholder="Username" v-model="email">
<input type="password" placeholder="Password" v-model="password">
<button @click="signUp">Register</button>
<p>Do you have an account?
<router-link to="/signin">sign in now!!</router-link>
</p>
</div>
</template>
<script>
import firebase from 'firebase'
export default {
name: 'Signup',
data () {
return {
email: '',
password: ''
}
},
methods: {
signUp: function () {
firebase.auth().createUserWithEmailAndPassword(this.email, this.password).then(res => {
console.log('Create account: ', res.user.email)
}).catch(error => {
console.log(error.message)
})
}
}
}
</script>
<!-- css省略 -->
入力のあったメアドとパスワードをcreateUserWithEmailAndPassword()
でFirebaseに送ってユーザーを作成しています。あとはこのアカウントでログインできる処理を追加します。
サインイン機能
先ほどサインアップしたアカウントでログインできるようにします。Signin.vue
を書き換えます。button
タグにイベントと、signIn
メソッドを追加します。
<template>
<div class="signin">
<h2>Sign in</h2>
<input type="text" placeholder="email" v-model="email">
<input type="password" placeholder="Password" v-model="password">
<button @click="signIn">Signin</button>
<p>You don't have an account?
<router-link to="/signup">create account now!!</router-link>
</p>
</div>
</template>
<script>
import firebase from 'firebase'
export default {
name: 'Signin',
data: function () {
return {
email: '',
password: ''
}
},
methods: {
signIn: function () {
firebase.auth().signInWithEmailAndPassword(this.email, this.password).then(res => {
localStorage.setItem('jwt', res.user.qa)
this.$router.push('/')
}, err => {
alert(err.message)
})
}
}
}
</script>
<!-- css省略 -->
ここでのポイントはログイン時に返ってきたユーザー情報から、サーバーでの認証に使うJWT(res.user.qa)をローカルストレージに保管している点です。これを使って後ほどAPIサーバーの認証を突破します。ログインした後は “/” に遷移させます。
サインアウト機能
サインアウト機能も簡単です。firebase.auth().signOut()
を実行するだけです。この時に /signin にリダイレクトするようにしておきます。また、JWTもローカルストレージから削除します。また、せっかくのマイページなので、ユーザーのメアドを表示するようにしておきましょう。firebase.auth().currentUser.email
で取得できます。
<template>
<div class='hello'>
<h1>Hello {{ name }}!!</h1>
<h1>{{ msg }}</h1>
<h2>Essential Links</h2>
<button @click="signOut">Sign out</button>
<button @click="apiPublic">public</button>
<button @click="apiPrivate">private</button>
</div>
</template>
<script>
import axios from 'axios'
import firebase from 'firebase'
export default {
name: 'HelloWorld',
data () {
return {
msg: 'Welcome to Your Vue.js App',
name: firebase.auth().currentUser.email
}
},
methods: {
signOut: function () {
firebase.auth().signOut().then(() => {
localStorage.removeItem('jwt')
this.$router.push('/signin')
})
},
apiPublic: async function () {
let res = await axios.get('http://localhost:8000/public')
this.msg = res.data
},
apiPrivate: async function () {
let res = await axios.get('http://localhost:8000/private')
this.msg = res.data
}
}
}
</script>
<!-- css省略 -->
vue-router で認証済みか確認
このままではログインしてなくてもURL直打ちでマイページに入れてしまいます。なので、認証が必要なルーターにログイン済みか確認するコードを追加する必要があります。src/router/index.js
を編集しましょう。
// ...
import firebase from 'firebase'
// ...
let router = new Router({
routes: [
{
path: '*',
redirect: 'signin'
},
{
path: '/',
name: 'HelloWorld',
component: HelloWorld,
meta: { requiresAuth: true }
},
{
path: '/signup',
name: 'Signup',
component: Signup
},
{
path: '/signin',
name: 'Signin',
component: Signin
}
]
})
// router.beforeEach()を追加
router.beforeEach((to, from, next) => {
let currentUser = firebase.auth().currentUser
let requiresAuth = to.matched.some(record => record.meta.requiresAuth)
if (requiresAuth && !currentUser) next('signin')
else if (!requiresAuth && currentUser) next()
else next()
})
export default router
大事なのは'/'
のみに設定したmeta: { requiresAuth: true }
です。これで、このrouteに認証が必要かを判断します。
firebase.auth().currentUser
で現在ログインしているユーザーを返します。これでログインしていない場合は、/signin にリダイレクトされるようになりました。
Vue.jsのライフサイクルに合うようにFirebaseを初期化する
Vue.jsでFirebase Authentication を使う際の最大のポイントはここになると思います。ここまでの実装ではログインした後でも、ブラウザを更新したら /signin にリダイレクトされてしまいます。
理由としては、先ほど実装したbeforeEach
が Firebase が初期化される前に実行されるので、アプリケーションの最初のロード時にfirebase.auth().currentUser
が null
を返してしまう為です。
これを回避するためにonAuthStateChanged
を使います。これはユーザーの認証状況が変更されたら実行されるオブザーバーです。現在のユーザを取得したときにAuthオブジェクトが初期化などの中間状態にならないようにすることができます。これでVueインスタンス作成のコードを包むことで、Firebase の初期化後に Vueインスタンスが作成されるようになります。src/main.js
を編集しましょう!
// ...
let app
// ...
firebase.auth().onAuthStateChanged(user => {
/* eslint-disable no-new */
if (!app) {
new Vue({
el: '#app',
router,
components: { App },
template: '<App/>'
})
}
})
// ...
これでログイン後にブラウザ更新しても /signin にリダイレクトされなくなりました。
APIサーバーをJWT認証でセキュアにする
いよいよ最終段階。最初に見せた上のような形まで持って行きます。
APIサーバーは現状、誰でも叩けるようになっています。アプリケーションとしては Vue.js でサインインに成功した人だけが API を叩けるようにしたいところです。そこで使うのが JWT です。先ほど、ローカルストレージに保存した JWT を使ってサインイン済みのユーザーか検証します。
Firebase Admin SDK Go セットアップの準備
Go言語で Firebase を使うための設定をしていきます。まずは Firebase Admin SDK Go を使えるように設定していきます。まずは必要なパッケージを読み込み
$ go get -u firebase.google.com/go
$ go get -u google.golang.org/api/option
サービスアカウントの認証情報が含まれる JSON ファイル をGo言語で読み込んでFirebaseのセットアップが完了します!
このJSONファイルは Firebase Console または Google Cloud Consoleで取得可能です。僕は Cloud Platform Console で取得しました。
【Firebase Consoleの場合】
– プロジェクトの設定ページの [サービス アカウント] タブに移動し、[サービス アカウント] タブの [Firebase Admin SDK] セクション下部にある [新しい秘密鍵を生成] ボタンをクリックします。
【Cloud Platform Consolの場合】
– [IAM と管理] > [サービス アカウント] にアクセスします。そして、新しい秘密鍵を生成し、ローカルに JSON ファイルを保存します
さらに詳しいセットアップのやり方は公式ドキュメント「サーバーに Firebase Admin SDK を追加する」へ
https://firebase.google.com/docs/admin/setup?authuser=0
JWT を Go言語 + Firebase で検証
JWTを検証するミドルウェアを作成します。このミドルウェアでハンドラーをラップしてあげれば、ラップした全てのAPIに検証機能がつきます。
先ほど作成した鍵ファイルへのパスは環境変数で読み込み、下記のコードでセットアップします。Go言語での環境変数はos.Getenv("環境変数名")
で読み込めます。
import (
// ...
firebase "firebase.google.com/go"
"google.golang.org/api/option"
)
func authMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// Firebase SDK のセットアップ
opt := option.WithCredentialsFile(os.Getenv("CREDENTIALS"))
app, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
fmt.Printf("error: %v\n", err)
os.Exit(1)
}
auth, err := app.Auth(context.Background())
if err != nil {
fmt.Printf("error: %v\n", err)
os.Exit(1)
}
// クライアントから送られてきた JWT 取得
authHeader := r.Header.Get("Authorization")
idToken := strings.Replace(authHeader, "Bearer ", "", 1)
// JWT の検証
token, err := auth.VerifyIDToken(context.Background(), idToken)
if err != nil {
// JWT が無効なら Handler に進まず別処理
fmt.Printf("error verifying ID token: %v\n", err)
w.WriteHeader(http.StatusUnauthorized)
w.Write([]byte("error verifying ID token\n"))
return
}
log.Printf("Verified ID token: %v\n", token)
next.ServeHTTP(w, r)
}
}
// ...
verifyIDToken()
で JWT の検証を Firebase で行なっています。エラーハンドリング等は分かりやすさの為に簡易化していますが、これでミドルウェアは完成です。こいつでprivateハンドラーをラップします。
func main() {
// ...
r.HandleFunc("/private", authMiddleware(private))
// ...
}
これで有効なJWTをもつ人だけが /private からデータをもらうことができるようになりました。 実際にAPIをterminalから叩いて見ましょう
$ go run main.go
$ curl localhost:8000/public
hello public!
$ curl localhost:8000/private
error verifying ID token
JWT をサーバーに送ってないので /private だけ求めていた’hello private!’が返ってきませんでした。Vue.js側で JWT をHeaderに入れてHTTPリクエストするメソッドを実装しましょう。HelloWorld.vue の apiPrivate
関数を編集します。
// ...
apiPrivate: async function () {
let res = await axios.get('http://localhost:8000/private', {
headers: {'Authorization': `Bearer ${localStorage.getItem('jwt')}`}
})
this.msg = res.data
}
// ...
ここでは axiosで Authorization Headerをつけています。ローカルストレージに保管してあるJWTをサーバーに送って検証してもらいます。ここまできたらprivateボタンを推して、データが返ってくるか確認して見ましょう。
これで Vue.js + Go言語 + Firebase で認証付きWEBアプリケーションが完成しました!
まとめ
Vue.js + Go言語 + Firebase を使って簡単に認証付きWEBアプリケーションができました。クライアントとサーバーが分離しているので、他のマイクロサービスと連携させるのも楽だと思います。ここからユーザーごとにMySQL等でデータを持たせたい場合は、JWT の中の sub を uidとして保存し、ユーザーを識別する形も取れるようです。これからはこれをベースにガンガン開発できます。 もし詰まった箇所があればコメント欄で教えてください!
参考記事
Firebase Authentication 日本語ドキュメント
Vue 2 + Firebase: How to build a Vue app with Firebase authentication system in 15 minutes
Vue.js + Firebase を使って爆速でユーザ認証を実装する
遂にFirebase Admin SDK Goが登場!
Goで始めるMiddleware
- Golangでの日付のフォーマット指定の方法について
- revelでHello World
- golang の net/http で basic auth
- AWS SDK for Go を使ってS3にファイルをアップロードする
- Goでスレッドセーフなシングルトン
- GolangでSHA-256ハッシュ
- もう目移り。ちょっち迷っている
- テーブルのカラムの値をnullかゼロ値かを判別する
- Go 言語に関するブックマーク
- Goでオブジェクト指向っぽく書く
- Revel templatesを使ったサンプルアプリケーション
- GoでRabbitMQに接続してみる
- CrystalとGoでHTTPサーバのベンチマーク
- Go言語のtestで、json apiのレスポンス検証を行う
- Chefのコマンド一発でサービスを作れる状態へ(CentOS6.6)
- gopherだからgoでgopherしよう
- Go Conference 2015 summer
- gbを知ったのでgojiを使ったWEBアプリケーションプロジェクトを管理してみた
- 「Docker」と新コンテナランタイム「rkt」をサクっと比較してみる
- 開発者から見た UNIX 哲学とコマンドラインツールと Go言語
- Go言語でAmazon Linux AMI向けのビルド
- SpheroをGo言語から制御して遊んでみた
- AWSでnginx+golangが動く環境を作る
- GoのBuild Constraintsに関するメモ
- Go言語(Go-Json-Rest)でAPIサーバーを立てるときのCORS設定 (Basic認証機能付きも)
- 「連結されたgzipを1行ずつ見る」をgolangでやったらハマった
- Goでwebサーバー作るときに考えたこと
- ginのBindingとValidationについての調査メモ
- iOSアプリのライセンス一覧のplistを半自動生成して設定画面にキレイに表示するプログラムをGo言語で作った
- Goのfor rangeで思った値が取れなかった話
- GoのWEBアプリケーション運用について
- Go言語(Go-Json-Rest)のCORSでのハマり。Safariだけでハマった話。
- deploy the MVMs of gae / go
- GolangでAPIを叩く
- Goji のアプリケーションサーバーを Circus で管理する
- 画像処理で写真をアニメ風に変換する
- gvmでgoをバージョン指定で簡単インストール
- golang の進捗どうですか
- Sensuでネットワーク監視やってみた
- Web Frameworkとして検討する言語とフレームワーク
- Golangで簡単にログを吐くことを考える
- Golangで簡単に一時ファイルを吐くことを考える
- go install時にno install location for directory ○○○ outside GOPATHのエラーが出る件について
- BigQuery の課金仕様と注意点をまとめてみた(2015-07 時点)
- 社内リポジトリのサブディレクトリをgo getするにはrepo名に.gitをつける
- gomobileでiOS用のライブラリをビルドするまで
- Gobotを使ってみよう
- Golangで、ResponseWriterを使ってHTTPレスポンスを組み立てる際にハマったこと
- Go の expvar パッケージを使ってアプリケーションのメトリクスを公開する
- Golang開発環境 3分クッキング
- ipから都市情報を取得する
- 文章を非可逆圧縮して容量削減を図る
- 多重起動を禁止する
- Create,NewFile,Open,OpenFileの違い
- Goで64bitと32bitの実行ファイルを同一Windows機で作成するために講じたこと
- やはり俺のgolangがCPUを一つしか使わないのはまちがっている。
- Windowsでtail -f
- x/net/context の実装パターン
- Git.io 短縮 URL を golang コードで取得してみる
- 任意のコマンドをWebサーバー化する
- はじめての Go 言語 (on Windows) その10
- Go言語でCSVの読み書き(sjis、euc、utf8対応)
- Go言語の文字列、バイト、ルーンと文字(翻訳)
- Golangのgormで、PrimaryKeyにUUIDを使う
- tcnksm/gcli を使った golang によるコマンドライン・ツール開発について
- Go言語でプロセス間同期処理
- Golangのgormで、カスタマイズしたtime.Timeに差し変える
- Go言語は空文字に対してstrings.splitを掛けると1要素の配列を返す
- goを1.5にアップデートして1.4とベンチを取る
- runtime.Caller(1)をなめて扱ったら危険かもしれない
- GoでCLIツール作るのに便利そうなパッケージを集めてみました
- Go Mockでインタフェースのモックを作ってテストする #golang
- Goのchannelの送受信用の型について
- そろそろ真面目に Golang 開発環境について考える — GOPATH 汚染問題
- 【Go】 go fmt でコード整形
- Golang による文字エンコーディング変換
- CircleCIでService Account使ってGAE/goへdeployする
- Javaばかり書いている僕がGo言語の勉強で参考になったサイトまとめ
- Go言語の作業ディレクトリをドキュメントに従って作り直してみた
- Go言語のドキュメントに従って簡単なライブラリとテストコードを作ってみた
- 文章からダジャレのみを抜き出すコマンドを作ってみた
- Go言語の自作パッケージに説明をつけてみる その2
- Go言語 http POSTする際のContent-Type
- 【Go】import 書き方まとめ
- go言語でベンチマーク
- Goでビルドバージョン情報を参照できるようにする(Go1.5)
- Golang の文字列連結はどちらが速い?
- そろそろ真面目に Golang 開発環境について考える — Internal Packages と Vendoring
- GoとRedisでアンテナサイトを作ってみた
- Goのバッチで統計を取得するAPIを用意しておくと便利
- Go言語の練習でTODOコマンドを作ってみた
- golangでhttpを監視するscriptを書いて結果をslackにpostする
- Mithril+golang Gin を試す
- モンティ・ホール問題をGoでやってみる
- Go言語でDIを試す
- 文中の人名をイニシャルに変換して匿名化をはかる
- golang+kocha で Web アプリケーションを作ってみて
- Docker の WebUI 作りました
- Alfred Qiita WorkflowをGoで書き直した
- gbでginをrunする
- Go言語版word2vecを作ってみた
- aws-sdk-goを使ってGoからAWS SQSを使う
- 楽ができるGolangのライブラリ達
- コンソールでGithubのReadme.mdを取得するコマンドを作ってみた
- char2vecを作ってみた
- 【Go】print系関数の違い
- Go言語のChannelは送信時にもブロックする
- Goのforとgoroutineでやりがちなミスとたった一つの冴えたgo vetと
- Dockerで独自レポジトリからgo getするお
- goからiOSまで一人でアプリ開発をしてたらいつの間にかマインクラフトエンジニアになった話
- Go 1.5をRaspberry Pi 2で使う
- Goで作ったプログラムでシグナルを受け取る
- 【Go】fmt.Print とビルトイン関数の print の違い
- cgoでMacのスリープログを勝手にとって作業時間の可視化してみた
- GAE/GoのRPCにフックするライブラリaespyを作った
- struct にアノテーションつけてたら go vet . すべき
- Goで多重連想配列
- AppEngine/PythonでDjangaeを試した
- gopherjs + electron テスト
- ISUCON5予選でスコア34000を出す方法
- Go言語の練習用にTwitterのOAuth認証をフルスクラッチしてみた
- Go言語でBigQueryのクエリを実行してみる
- GolangとPEGで作る言語処理系 vol.1
- Go(goquery)でQiitaのスクレイピングライブラリをつくった
- GoでJSONとYAMLを相互変換するツールを作った
- golangでスクレイピングをする準備
- Goroutine の同時実行数を制限する
- github でホストされている go アプリを fork して PR する時には、まず go get から始めよう
- Go言語のflagパッケージより便利というoptargを使ってみる
- Go言語の開発環境セットアップ
- PHP、Node.js、Go のミドルウェアに関する調査
- golangでnestしたstructの初期化がツライ
- go言語のslice操作をまとめてみた(shiftしたりpushしたり)
- sliceのシャッフル
- golangでi18n
- Go言語でチャネルとselect
- GoのEnumイディオム
- Go速習会
- Golangで自分自身で定義したパッケージをインポートする方法あれこれ
- RPG ツクール MV のゲームをブラウザ上でテストする
- ブラウザ上で動作する[開発|実行|チュートリアル|デモ]環境を作成できるCodePicnic
- 今後イケそうなデスクトップGUIフレームワーク
- おい、peco もいいけど fzf 使えよ
- Goで外部コマンドをパイプして実行する
- [Go] ビルドツール gb を使ってみた
- Go言語で簡単にHTTPリクエストを送ってJSONをパースするサンプル
- Go1.5でHTTP2サーバーとクライアント
- GoでXMLをパースする
- [Go] HerokuにRevelでつくったアプリをデプロイする
- [golang] struct の初期化で missing type in composite literal が出た場合の対処
- RubyからGoの関数をつかう → はやい
- UnixListener.Closeでソケットファイルが消えて困っている
- Goフレームワークのパフォーマンス比較
- Goでお手軽に行列の積を爆速並列計算
- Go で UTF-8 の文字列を扱う
- GroovyからGoの関数を使う→はやい
- loggingについて話そう
- GO 1.5 と C++ を SWIG でブリッジさせる方法
- golangでシグナルを拾ってgracefulにgoroutineを停めたい・改
- PHP から Go の関数を呼び出す
- goでDotenvを使用する
- golangでImageMagickを触りたい
- Go でパラメタライズドテストをする
- まだAWSのみに頼って生きてるの?複数のクラウド利用で、大幅コストダウンした話
- 【緩募】Golangでスライスの型のキャストをする方法が知りたい
- ATOM で Go
- GoでJsonファイルを読み込んで構造体として扱う。
- Go付属のツールでオレオレ証明書を生成する
- オブジェクト指向言語としてGolangをやろうとするとハマること
- オブジェクト指向言語としてGolangをやろうとするとハマる点を整理してみる
- “Swift” vs “Swift その2” (vs Go) 戦力比較
- 全くの素人がISUCON5本戦に参加しました
- GoのGUIライブラリshinyを試す #golang
- Goで連鎖性かつスタック指向の言語を実装する
- Tour of Go (Go言語基礎文法最速マスター)日本語版を更新しました #golang
- GoのChannelを使いこなせるようになるための手引
- Go http.RoundTripper 実装ガイド
- Go言語でRedshiftとつなぐ(というかただのPostgreSQL)
- Go言語で REST API + マイクロサービス
- すごく長い行を読む場合の注意点
- golang.org/x/net/websocketの使い方とkuiperbelt
- soracom-sdk-go ベータ版でいろいろ試す
- Google App Engineのリージョン別レイテンシ
- Zaif取引所(Bitcoin/Monacoin)のAPIをGolangから使う
- Goでフィルタコマンドを怠惰に書く
- goのmgoでfindするときの処理
- GolangのOpenGL事情(WebGLも含むよ)
- lazyなGoやリスト演算なGoについて
- Go と reflect と generate
- AWS SDK for Go の基本とRoute53へのHostedZone作成とレコード作成
- Go+Webアプリケーション+CircleCIで静的解析・テスト・バイナリリリースを効率良く行なう
- 外部APIを使うController用のTest Doubleライブラリを書いた
- Exifの回転情報をピクセル情報に反映する
- Go を レンタルサーバーで動かす方法
- GoでHTTP負荷テストフレームワークをつくった
- 1行もGo書いたこと無いけどGo Conference Winter 2015に参加したので資料をまとめた
- 簡易リバースプロキシ「ichigo」でWebアプリ開発が捗る話
- glide – パッケージ管理のお困りの方へ –
- Golangで静的ファイルをバイナリに含めるライブラリを書いてみた
- GoからBLE制御でPLAYBULB Candleの操作をしてみる
- Goのjson.Decoderの使い方
- Go言語でバイトニックソート実装してみた
- Go言語入門 パッケージの作成、便利ツール、interfaceとは。
- PythonのABC – 抽象クラスとダック・タイピング
- 初心者がごるーちんでハマるところ
- GoのMemcacheパッケージ比較
- Go開発向けVim設定
- Go言語に1日で入門したときの頭の使い方の話
- go の regexp が遅いと知らずに regexp で form に fillinするモジュールを書いた
- GoとDockerとMicroservices 最初の一歩
- OS XのネイティブHypervisorを使うxhyveと、ネイティブDockerを立ち上げるdocker-machine-driver-xhyveを作った話
- 手間をかけずに形態素解析を Elasticsearch Service (on AWS) で用意する
- Goで型を挿げ替え可能なデータ構造ライブラリを作る
- Go Web Frameworks 比較
- golangでgitのサブコマンドを作ろう
- golangでrecoverしたときの戻り値
- GAE/GoでSlackの’/’(スラッシュ)コマンドサーバーを立てる
- Goでのシリアル通信でハマった事
- go-swaggerの紹介
- gomobileで日本語フォントを扱ってみる
- Vim で引き籠る
- flag 並にシンプルでより強力な CLI パーサ kingpin の紹介
- GoでGitHub通知をデスクトップ通知として取得するアプリを書いた
- Go言語でRICOH THETA API v2を叩いてみた
- GoでBLEセンサーデータをBeamする
- GunosyでのGoパッケージ構成の歴史
- Packer プラグインの書き方(Provisionerを例に)
- Goでパケットキャプチャを実践してみる
- プロダクト開発でのGoのテストとモック活用事例
- vimでGoのシンタックスチェックをquickrun+vimprocで非同期に行う
- GAE/Goでもgoroutine使おうぜ!というハナシ
- ChromebookでGo!(ChromebookでGo言語を楽しんでみる)
- 本物の golang を… 本物の Gopher を、お見せしますよ。
- コネクションプールのチューニング
- Go、Scala、Clojureで開発する3社が集結!!
- GoとAlefとLimbo
- sidekiq用のmackerelプラグイン書きました
- Goだからこそ許される3つの作法
- Go言語で実現するフォースの覚醒 (Gobotで脳波をなんとかする)
- GoでShared Libraryをビルドしてみた(簡単ドキュメント指向DB)
- はてブ ホットエントリーを一覧表示してくれるCLIツールを書いた
- GoでHTTPサーバを立てる
- 最速という噂のFlatbuffersの速度のヒミツと、導入方法の紹介(Go)
- Go言語でサーボモータをキュイキュイ動かす
- emacsでGoの環境構築をやる
- z.shをGoで書き換え(ようとしてい)る話とGoの学びかた
- GoLearnについて
- GAE/GoとGojiの組み合わせでテストを書く
- Goで3Dモデル変換してプレビュー
- slackのログをAWS(DynamoDB)にためて、検索できるようにした
- vscode-go/READMEとdelve/Buildingの日本語訳
- あるとちょっと便利なコマンドラインツール3つ
- Concurrencyについてm9(^Д^)プギャーられないための基礎知識
- ターミナル画面を勝手に共有して他人の作業を覗いてみる
- Go最後の秘宝「GUI」を探しに行く
- [golang]RevelでCSRFの対策
- Goで小さなScheme、Gigueを実装しました
- Google Cloud Monitoringのカスタムメトリクスを使ってTask Queueを監視したいズラ๑◉ﻌ◉๑
- 気楽にDynamoDBを使おう
- gonp〜Goによるdiffのアルゴリズム実装〜
- Kami – process monitor. inspired by god.rb
- nanogui.goの進捗を記録するスレ
- Goでデーモンを作るにはどうするのが良い?
- IntelliJ で Go ファイル保存時に整形する
- Go + QML + QChart.js で素敵なチャートを表示する
- GoでRESTfulなWebアプリを作りたい (go-restfulを触ってみる)
- importによってパッケージを拡張する方法(プラグイン)
- golang で AB x CD / E – F * G * H = 2016 になる全パターン洗い出し
- go 1.6でhttp.Clientが自動的にhttp/2を使わないようにする方法
- ゲームにおける正しいアイテムドロップ抽選実装
- go-redis/redis のクライアントが PubSub で共用できることを確認した
- 値渡し、ポインタ渡し、参照渡しの違い
- golang coreutils 探しメモ
- 重みをつけてランダムに何か出したい
- iOSエンジニアがGoを使ってみての所感
- CLIのWebsocketクライアントを作ってみた
- GoでhttpリクエストにHostを設定するにはreq.Headerではなくreq.Hostを使う
- Goで帳票をPDFに作成するライブラリ。 請求書などの複雑なフォーマットにも対応
- Web Application周りのテスト方法
- はじめてのGo言語 – インストール〜nginx導入まで –
- Go言語でstructをmapに変換する
- ユニットテストが書きやすい設計〜自家製モックを添えて〜
- Go言語でMongoDB使う ②埋め込みとの相性
- go testの並列(-cpuと-parallel)がなんの事だったか忘れた時のメモ #golang
- database/sql の Rows.Scan で不要なカラムデータを読み捨てる
- Go で簡単に Excelを作成するライブラリ。 色、罫線、網掛けを事前定義済
- 複雑なPDFをテキストファイルから生成。Windows,Mac,Linuxの実行ファイルなので、どの言語でも使用可能
- GoのgRPCでRemote IPを取得する方法
- 複雑なExcelをテキストファイルから生成。Windows,Mac,Linuxの実行ファイルなので、どの言語でも使用可能
- Go 1.6 でポインタをcgoの関数へ渡す際の注意点
- Go1.6でポインタをcgoの関数へ渡す際に発生するcgoCheckPointerを回避する方法
- go言語でゲーム
- 複数のgroutineが連携する通信オブジェクトの設計方針
- GoでANSIエスケープコードを扱うライブラリを作った(色付け・カーソル移動等)
- CentOS6.5にGoをインストールする
- Go で “broken pipe” を無視したい僕達がハマる罠
- iOSアプリの新規レビューを通知してくれるSlack Button Appを作った~手順と申請手続き
- Go で interface {} の中身がポインタならその参照先を取得する
- Go1.6の新機能
- golangの AriticleExtractor “GoOse” を試してみる
- [翻訳+α] Go言語の設定ファイルライブラリ Viper
- net/httpでポート443のHTTPSサーバーを立ち上げるまで
- テキストをカジュアルに暗号化したい
- GolangのGin/bindataでシングルバイナリを試してみた(+React)
- Ruby,Golang,ES2015比較チートシート
- 概観からGoのWebFrameworkを選ぶ(2016/02)
- Go の DB アクセス用のパッケージを作った
- golangの静的解析,カバレッジ解析,バイナリリリースをCircleCIで簡単に整える
- 異なる環境間で private network を構築して接続する
- vim-go-ideでさくっとGolang開発を始める
- ひとりぼっちのサービス開発における技術選択の遷移と戦略
- Golangでparserをつくって、SQLを解析してみよう!
- [golang]GoでbitFlyerのAPIへアクセスしてみた
- Goのfor文で関数のリストを作ろうとして嵌った話
- golang コーディングテストで使うメソッド・テクニックまとめ
- Go のバッファ付きチャネル close の挙動
- Golang: nil Pointer Receiverの話
- 企業動向にアンテナを張るためにQiita Organizationのキュレーションサイトを作った。
- 何も考えずMac上のGit diffでExcelの差分を見れるようにする
- Go言語でプリント文デバッグするときのTips
- HomebrewでGo 1.6を入れる
- ElectronのスタンドアロンMacアプリに無理やりGoのHTTPサーバーを仕込む
- golangでcrontabからドキュメントを作成するコマンドラインツール crondocを作った
- ファイルベースのQiitaクライアントqiitactlを作った話
- Google App Engine SDK for Goを使ってGAE上でアプリを動かすまで
- goroutine 使い方まとめ
- Go言語でGoogle Cloud Vision APIを使う
- GolangでPostgreSQLのJSONデータ型を読み書きする
- Go言語の可変長配列(slice)を使う上での注意
- Go言語で作った実行ファイルを小さくしよう!
- goでスクレイピングするのにgoquery + bluemonday が最強な件
- Go 1.6 templateパッケージ新機能
- go言語でhttpモックサーバを作る方法(2016/02時点)
- RaspberryPi1(2とzeroも)で動かすgolang製アプリをクロスコンパイル(onMac)
- GoでSpreadsheetを操作するパッケージを作った
- VisualStudioCodeでGAE/Goの環境設定
- Golang開発環境構築 in MAC
- GoでGCEからGCSにファイルを書き込む/読み込む
- 10分で終わるGo言語の開発環境構築
- Go言語のスクレイピング系ライブラリまとめ
- vagrant、ansibleでgoの開発環境を構築してみた(所要時間:15分)
- Go+goqueryでGithubRankingにWebスクレイピングを試みる
- Ginの Middleware と HandlerFunc でデータの受け渡し
- vim-goをインストールしてみた(所要時間:15分)
- GoogleAppEngine/Goのインストールから使いやすくするとこまでをさくっと 後編
- ざっくりGoの文法まとめ
- Dockerのbusybox内でgolangのtimeを使ったらエラーになった
- Golangで外部コマンドを実行する方法まとめ
- golangでlogを標準出力とテキストファイルの2箇所の出力する
- ズンドコキヨシまとめ
- Go製のData Shipper Platform「Beats」が良さそうなので紹介してみる
- Go の echo ってWebサーバーでサクッと REST しちゃう
- Go 言語 1つの構造体に複数の validation を適応する
- SensorBeeとは何か?
- あえて aws-sdk-go で dynamoDB を使うときの基本操作
- WebRTCの勉強でむりやりGo使ってみた!
- gometalinter で楽々 lint
- Golangで標準入力がパイプで渡されたものか判定する
- Goのプログラムでどういうリクエストを飛ばしているのか見たい
- Go言語をyumで入れる
- [2016年3月時点]Mac用Electronバイナリに署名してApp Storeにアップするためのメモ
- microservicesの調査に向けて〜Golang製のzipking tracerのgo-kitを利用してみる
- GAE/Go 旧appengineパッケージから新appengineパッケージ(google.golang.org/appengine)への移行ガイド
- nginx+circus+gojiによるgolang webアプリケーションの動作環境構築
- GoでJSONの一部分を利用者が定義した構造体に読み込める便利な手法を見つけた
- CentOSにGo言語をインストール
- sliceの重複チェックを高速化
- go言語初心者が図を書きながらgoroutineやgo channelを理解する(Part1)
- Golang GinでReact.jsのサーバサイドレンダリングを試してみた
- 大谷翔平の打席になったら自動でチャンネルを変える
- CSV から構造化された JSON を生成するツールを Go で作った
- コードレビューに大事な褒め言葉
- 2016年から始める Google App Engine for Go
- 【取得できた!!】IntelliJ IDEAのオープンソースライセンスでUltimate版を無料で使いたい!
- Golang (heroku) で LINE Bot 作ってみる
- GAE/GoでLINE Bot Trial
- LINE BOT をgoで作ってみたよ
- ゴルーチンで発生したエラーの返し方
- cgoを使ったCとGoのリンクの裏側 (1)
- [2016年春版] 静的サイトジェネレーターHugo導入Tips ①インストールとサイトの初期作成
- atomicパッケージが必要な理由と使い方
- go言語初心者が図を書きながらgoroutineやgo channelを理解する(Part2)
- Google App Engine for GoでOAuth2による認証を用意する
- Facebook Bot API + Go でオウム作ってみた
- go言語でのマイクロサービスフレームワークの雑な比較メモ
- Go でコメントアウトせずに素早く複数行スキップさせる
- Angular2 Tour of Heroes with Golang (w/o npm)
- GAE/Go urlfetch.ClientでGetしたらタイムアウトエラー「urlfetch: DEADLINE_EXCEEDED」の解決方法
- phonyでテスト用データを超絶簡単に作る
- Go言語のHello Worldを3分で試す
- Go Conference 2016 Spring
- GoのWebフレームワークのGoji (goji.io) をGAEで動かす
- Go製のフレームワークechoを使ってJSONを返すWebサーバーを作り、GoogleAppEngineで動かす
- Golangで、テニスの大会のエントリーページから、大会情報をクローリングしてくるサンプル
- Arukas.io CLI、まだ β なのに便利だった
- あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた
- Goでのログ出力に標準logとcologを使う
- jsonpbはencoding/jsonより5倍遅い
- 他言語から来た人がGoを使い始めてすぐハマったこととその答え
- echoのAPIサーバ実装とエラーハンドリングの落とし穴
- ディープラーニングで「顔が似ているAV女優を教えてくれるbot」を構築
- [golang]GoのSDKで手軽にLINE BOT APIを試してみた
- 「Go言語によるWebアプリケーション開発」でハマったところ
- インタフェースを埋込む #golang
- Go言語のエラーハンドリングについて
- 愛が生まれた
- なんで愛が生まれるのか
- Goで値が文字列のJSONを構造体にパースする
- GolangのフレームワークEchoの話とHelloWorldサンプルを読み解くだけ
- UnityのネイティブプラグインをGoで書く #golang #unity
- Go製WAFのuconを触ってみた
- Terraform for さくらのクラウド
- Negroni + Gorilla/Muxで簡単なサーバーアプリケーション作る
- Goフレームワーク vs PHPフレームワーク
- Go言語で東京メトロAPIを叩く
- Cloud9でGAE/Goの環境構築
- GAE/Goで形態素解析してみた
- MySQLでのトランザクション処理をGolang+dbrで実現してゆく話
- コマンドラインからググれてもいいと思ったので作った
- Kubernetes の Go API クライアントライブラリを使って Kubernetes を直接操作する
- cgoを使ったCとGoのリンクの裏側 (2)
- Terraform for さくらのクラウド スタートガイド(第1回)
- Go言語のエラーハンドリングについて ~panic編~
- Lambda with Apex: Terraformを使った管理
- Amazon Linux に GoLang をインストールし、NginxのWebサーバを構築 & 簡単なHTTPレスポンスを受けるまで
- Gin(Golang)におけるHTMLテンプレート記述方法
- Amazon Linux に GoLang (1.5) をインストール & Gin、MongoDB (3.2) を導入し、APIサーバ を10分で作る
- Go言語の並行処理デザインパターン by Rob Pike 前編
- Go言語の並行処理デザインパターン by Rob Pike 後編
- go1.7 の気になるところを試した
- contextの使い方
- Windows に インストーラを使って GoLang を インストールするときの注意点
- HUGOで作れるCMSっぽいパーツ:関連記事・目次・JSON-LDなど
- Goのjson.Unmarshalで値にJSONのnumber、string両方の可能性がある場合
- GAE/Go+WebPushAPI+FCMでPush通知
- Hugoで新規記事を作成するときのTips的なメモ
- Go + WebDriver でブラウザ操作を自動化する
- Goでjqっぽくinterface{}の中を探索する
- go+ginでローカルで作ったWebアプリをGoogleAppEngineに載せる時に注意することまとめ
- Go+gin+dbrでセッション管理(ログイン・ログアウト)をする話+HTMLテンプレートにセッション情報を埋め込んで制御する
- Apexを使ってGoでlambdaを動かす
- labstack/echoの2.0がreleaseされてたのでAppEngineで動かしてみる
- Go+gin on GAEでBlobstoreを使ってCloudStorageにファイルをアップする話(公式ドキュメント解説を添えて)
- golangでURLをパース
- Goでパスワード入力を読み取る(Windows/Mac/Linux対応)
- Go言語による高速な接尾辞配列の実装(SA-ISの実装)
- Go で作ったゲームを Android/iOS 対応させた話 (1)
- UnityのセーブデータをGoogleAppEngine/Go(with Datastore)に保存したり読み込んだりする話
- ターミナルでスライドを再生するコマンド『pera』を作った。
- Docker Compose で Go の開発環境をサクッと作る
- GoogleスプレッドシートでGopherを描く with Go
- GAE/Go+ginでHTTPリクエストも含めてEnd to Endなテストをする話
- Github on BigQueryを使ってgoでよく使われるpackageを調べる
- Go製のフレームワークechoをHerokuで動かす
- Crystal 言語の 2016年を振り返ってみて
- Go でコードカバレッジを取得する
- 高速でダウンロードできるツールを Go で実装した。
- goでmicroserviceをつくる
- GoでGitHub Issuesのビューアを作った
- goimportsのスキャン対象から特定ディレクトリを除外する
- NHK番組表API を使ってアニメの音楽番組をslackに通知する
- (比較的)標準化をした Vuls/VulsRepo の導入
- NATSについて調べて動作を試してみた
- golang で Evernote のノートを Jekyll 用の HTML に書き出すツールを書いた
- 集合知で各言語、ライブラリ、フレームワーク、DB、アーキテクチャの適材適所をみんなでまとめたら面白いんじゃないか?
- goroutine と channel を使った並行処理のパターン
- Filebeatで複数行を扱うMultiline設定まとめ
- あなたのWebサービスでLDAPユーザ認証を実現するgo-ldapc
- golangで設定記述にTOMLを使う
- Termuxでお手軽ポケットlinux開発環境(例えばnvim+golangが手元に)
- Ubuntu 16.04 に GoLang 1.6 と Gin Web Framework をインストールし、HTMLテンプレートを読み込むまで
- Gin Web Framework と GORM を使って簡単なウェブアプリを作ってみる
- マイクロサービスのフレームワークまとめ [不定期更新](2017/02/25更新)
- WindowsのDLLをGoで作る
- Google Sheets API v4 と サービスアカウントと Go でスプレッドシートを操作する
- textqlが超便利
- CLI作成支援パッケージ Cobra を使い、Go 言語でコマンドラインツールを作ってみる
- データのバージョン管理が可能な分散データベースNomsをさわってみる
- Windows 使いの為の GAE/Go 開発環境構築
- go言語のwebフレームワークechoとpythonのwebフレームワークflaskの速度を比較してみた
- MacでGo開発環境構築
- golangの関数をまとめてみた。
- Go言語でサーバのGraceful Shutdown
- golang メソッドについてまとめてみた。
- #golang CodeReviewComments 日本語翻訳
- IntelliJ CE + Delve で Go 言語のデバッグ環境構築(Mac)
- golangではスタックとヒープを気にする必要が無い
- Go 言語で Websocket を使ったアプリケーションをつくる
- Google App Engine for Go のローカルサーバでデバッグをする #golang #GAE
- Go言語でランダムな文字列を生成する方法の比較
- Heroku への Go 言語製アプリケーションのデプロイと依存パッケージ管理方法の比較
- Docker for Macで開発環境がほんとに早くなったのか?(心の中のモヤ×100がモヤ×99になった)
- GoでAWS SDKを叩くCLIツールを作ってリリースするまでの流れ(aws-sdk-go+cobra+viper+gox+ghr)
- GAE/Goで本番のDatastoreをローカル環境に持ってくる 2016
- golang.org/x/time/rateで速度制限を行う
- インタフェースは型名を公開しなくても実装できる #golang
- ChatGopsで本物のGopherを、すぐそばに…
- 終了したことを他の複数のゴルーチンに伝えるのにチャネルのcloseを使う #golang
- Go で WebSocket を簡単に扱えるパッケージを作った
- else ifにも代入文が書ける #golang
- fmt.Formatterを実装して%vや%+vをカスタマイズしたり、%3🍺みたいな書式をつくってみよう #golang
- Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ
- Go言語+Ginで相関項目チェックを実装する(テストコード含む)
- golangで部分文字列を取り出す
- Golang + Echo + MySQL まとめ
- Macでjupyter XXX (iruby, R, nodes, go) インストール
- logmon-goで簡単ログ監視
- Go 言語で JWT を使って認証と認可を低コストに
- Docker+AlpineLinux3.4+Go1.7+Nginxでfreshを使って自動ビルドする開発環境を作る
- Go 言語で Excel ファイル内の文字列を自力で置換する
- golangのioutilべしべし叩いてみた
- Golangのbundleコマンド
- Travis CI から複数ファイルを GitHub Releases にアップロードする
- gRPCを使った簡易的なマイクロサービスを作ってみた
- 競技プログラミングで使うGo言語基礎
- Go 言語 reflect チートシート
- 自宅の使用電力を見える化してみた
- Go WEBフレームワークEchoでmiddlewareを自作する
- gocsvを使ってラクにCSVファイルをつくる
- 全く新しい銀行を1から作るために必要な技術 (Monzo公式ブログより)
- Go 1.7のホスト名前解決の仕様変更
- LINE Developer Trialを GAE/Go で始める #linedevday
- スクレイピング結果をJSONで返すAPIをGAE/Goで作る。
- DatastoreからGetした時に余計なPropertyがある場合エラーになるが無視してもいい
- GoでSlackへ通知してみた
- golangでunix domain socket経由で通信するechoサーバーを書いてみた
- golangにgoto文が存在する理由
- [検証中]更新のあったファイルだけgo testを走らせテストを高速化する #golang #gae
- LINE NotifyをGoで送る #golang #linedevday
- golangで書くunix domain socketを使ったserver/clientのサンプルコード
- Goのpathとfilepathでは動作が異なる Windowsでも正しくパスを扱う
- tmux 上でバッテリーの残量が一目でわかるコマンドを Go で作った
- GoのJSON API ServerでゆるふわJSON responseを返す方法
- GAE/Go で公開鍵暗号を使う JWT 認証サーバーを作った
- Golangでエラー時にスタックトレースを表示する
- Golangでinterface{}を使ったJSONのパース
- Go言語でTodoistのCLIクライアントを作ってみた
- HerokuとGoでLINEの Messaging API環境を作ってみた
- Go のバイナリには -ldflags ‘-w -s’ でコンパイルしてもたくさんパスが埋め込まれていた
- 独自のfmt.Formatterを実装する
- Golang製DBマイグレーションツールgoose + MySQLを試してみた
- Go(golang)+HerokuでLINE Messaging APIに触れてみたよ!
- TwitterはGoでゴー。
- Go+GAE+Cloud Datastoreで簡単なREST APIを構築
- Firebase Realtime Database を Rest API と Golang でいじってみる
- Go言語でハマったNつのこと
- Go言語でJSONに泣かないためのコーディングパターン
- Firebase Notifications からメッセージを送ってみる iOS10版
- GAE/Go (echoフレームワーク)で Line Message API 使って Bot を作る。
- testeratorを使ってgae/goのunit testを高速化する
- Go で Neo Cowsay を作った
- context.Contextでリクエストスコープな値を持ち回す
- echoのv3にアップデートした時に修正した箇所
- オレオレGo入門2016
- 初心者が2016のプログラミングで思うこと
- Go言語でJSONの生成を構造体無しでJavaScript並に簡単に生成できる方法
- JSONをインタラクティブに掘り下げるコマンド jid
- go get しようとしたら SSL protocol error エラーが出るとき
- Go言語でS3にアップロードする時速度制限をかける
- PHPerに贈る、GoでWebサーバー開発環境構築
- GoでのWebアプリケーションの組み立て方
- GolangでGetWildの’89バージョンを演奏する
- boto3からaws-sdk-goにしただけでCPU使用率が75%->10%になった
- GoでSSHサーバにラインエディタが欲しいなら golang.org/x/crypto/ssh/terminal
- Golangでテストしやすいコードをかく
- 冷蔵庫の余った食材からレシピを提案するボットをリリースしました
- 新しく入ったReverse Binding機能を使ってPure GoでAndroidアプリを作ってみる #golang #gomobile
- 社内のバックエンド開発にgRPCを導入してみた
- PocketCHIPでGoのGUIアプリを動かしてみる
- 早明浦ダムの貯水率を見れるコマンド作った
- gojaを使ってGoでJavaScriptの実行を試してみた
- go言語のデバッガ(delveとgdb)とcore dump
- APIライブラリをgo-json(改)で楽に実装する
- VisualStudioCodeでGo言語開発環境を作ってみた
- Echoはver.3で結局のところ何が変わったのか?
- Go言語でファイルアップロードを使ってみる
- macの初期ターミナルでも画像を表示したい
- go-bindataで実行バイナリにWeb UIをバンドルする〜slackboardの場合〜
- 実践的なGAE/Goの構成について #golang #gcpja
- Go!プリンセスプリキュアのGo言語実装「GoPrecure」
- init関数のふしぎ #golang
- Goの構造体の研究
- Goを学びたての人が誤解しがちなtypeと構造体について #golang
- RubyistがGoに入門してDBマイグレーションツールを作った
- Goで真面目にコレクション操作ライブラリを作ってみた
- GoからCのライブラリを呼ぶ
- gorenameをライブラリとして使う #golang
- GitHubで自動生成コードをDiffに表示しない方法
- CとGolangの境界
- LINEBOT SDK GOを使って月曜日のたわわBOTを作った。
- git管理ファイルを透過的に暗号化するgit用フィルタを作った
- GetWildの信号強度を解析し、音の大きさを可視化する
- 秒間500件以上のLOGフローアーキテクチャ
- Go でツール書くときの Makefile 晒す
- GolangでKey-Valueリソースのキャッシュと分散合意によるコミットをする
- GAE/Go で巨大な Zip を扱う
- golangの開発で使っている色々
- Hacker Newsを一覧表示してくれるCLIツールを書いた
- Golangのconst識別子iotaの紹介
- Go言語をMacにインストールしてみる(goenv + direnv + glide)

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。