GAE/J+Slim3の語彙・知識を元にここに解説を書く。 GAE/Goの知識とGo言語の知識が混ぜこぜで書かれているかあまり気にしてはいけない。 以下の調査結果を得るためのテストコードはここに置いた。 EntityにKeyは付属してこない structを定義する時に、そのstructに自分自身のKeyを持たせる方法はない。 EntityにIdまたはNameを自分で定義して、Putする時、Getした後にそこに忘れずにId, Nameを取り出したり移し替えたりして頑張る。 これを自動でやってくれるライブラリがgoonである。 IncompleteKeyはPutした後でも値は変わらない key := datastore.NewIncompleteKey(c, "Test", nil) newKey, err := datastore.Put(c, key, foo) // keyはIncomp
GoのフレームワークginでのBindingとValidationの挙動を調査したので忘れないうちにアウトプットしとく。 環境 Mac:OS X Mavericks Go:v1.4.2 gin:v1.0rc1 Binding&Validationのやり方 type TestForm struct { Name string `json:"name" binding:"required"` Text string `json:"text" binding:"required,max=1000"` } まず、Formを格納する構造体を定義してタグにBinding用の定義とValidation用の定義を書く。 Bindingタグの中に実施するValidationを列挙する。複数ある場合はカンマ区切りで書く。 ※評価は左から順に行い、Errorがあった場合それ以降の評価は行わない ※利用できるVa
encoding/jsonパッケージ GoでJSON形式を扱うには、encoding/jsonパッケージを使用します。 パース処理 JSON形式の文字列をパースするには、あらかじめJSONのデータ構造に合わせて構造体を定義し、Unmarshal関数を使用します。 package main import ( "encoding/json" "fmt" ) type Country struct { Name string `json:"name"` Prefectures []Prefecture `json:"prefectures"` } type Prefecture struct { Name string `json:"name"` Capital string `json:"capital"` Population int `json:"population"` } func m
この記事は Go Advent Calendar 2015 5 日目の記事です。 はじめに Go にはジェネリクスがありませんが、任意の型に対して共通の処理を提供したいことがあります。 例えば ORM ライブラリで User テーブルと Blog テーブルを struct で表す場合を考えてみます。 type User struct { Id int64 Name string Email string } type Blog struct { Id int64 Title string Body string } この 2 つの struct に対して共通の処理、例えば id で検索して結果を返す FindById というメソッドを提供したいとします。 Go は静的型付き言語なので、複数の型を引数に取ったり、複数の型を返すといったメソッドを定義することはできません。 よって、それぞれの型
Chromeでググるときに期間を一年程度にすることがよくあるが、毎回やるのも面倒なのでデフォルトにする方法をググッた。 Chromeの設定を開く Settings > Search > Manage search engines...をクリックする 以下のようなGoogleのエントリがあるのを確認する URLのクエリにtbs=qdr:yを含めたエントリを新規追加してデフォルトにする。もちろんもとのオプションをコピーして加えてもよい 新規タブで検索して過去一年の設定が有効になっているのを確認する そもそもどういうオプションを追加できるのか、は実際の検索画面でいじってURLを眺めればわかる(ドキュメントで保証された機能なのかどうかは調べてない) 「一年以上前の情報は(技術情報やニュースだけでなく全般に)いらないぜ」っていうスタンスは結構ラジカルで実際には不便も発生しそう(重要だが古い情報にリー
基本的なアイデアは、タスクを、 type ContextErrFunc func(ctx context.Context) error という型に統一して、シリアルに実行する、並列に実行する、というのを組み合わせることができるようにする。 package flow import "golang.org/x/net/context" // ContextErrFunc : 処理共通化のためのタスクの定義用 type ContextErrFunc func(ctx context.Context) error // ContextSerial : ContextErrFunc を直列に実行して、エラーが途中で起こったらその時点でエラーを返す func ContextSerial(fs ...ContextErrFunc) ContextErrFunc { return func(ctx con
@laco0416です。GAE/GoのRPCに介入して通信内容を使ってゴニョゴニョするためのライブラリを作ったのでその仕組みとかGAE/GoのRPC覗く上で気をつけなきゃいけないところなどを書きます。 laco0416/aespy 背景 GAE/Goに限らず、AppEngineとその他のGCPのサービス(Datastore, Memcache, UrlFetchなどなど)はRPCによって通信している。RPCはProtocol Buffer(以後pbと略記)という形式でシリアライズされたオブジェクトを用いており、これは簡単にデシリアライズ可能である。しかしGAE/JにはApiProxyとDelegateという仕組みが最初から用意されており、比較的容易にRPCに介入できるが、GAE/GoにはまだAPIが用意されていない。 ところでGAE/GoのDatastoreにはContextを取得できるイ
Go初心者の自分が躓いたのでメモ Go速習会という記事を参考に自分自身で実行していた所躓いた. 本題 たとえば,goのnegroniというWAFでwebアプリケーションを作成しようとしていたとする. ツリー構造は以下の通り. . ├── models │ └── user.go ├── public │ └── index.html └── server.go package main import ( "fmt" "github.com/codegangsta/negroni" "github.com/[username]/[appname]/models" // 自分のパッケージ "net/http" ) func main() { mux := http.NewServeMux() mux.HandleFunc("/", func(w http.ResponseWriter,
あなたの見るべきアニメーションがある。エバート・デゥ・ベイヤーの『ルーシー』だ。しかし、あなたはその作品を容易には見られない。VimeoにもYoutubeにも、彼の個人サイトにも動画はない。 私はあなたに『ルーシー』を見て欲しい。 だけど、やなぎみわの映像作品がDVD化されず、美術館でしか見られないように、ベイヤーのアニメーションも観客による「見る」身体性が作品のテーマに関わるから、インターネットの上にはない。 私は『ルーシー』の良いところをここに書くから、あなたが『ルーシー』を見たい気持ちになり、いつかそれが叶うよう願っている。 図ⅰ 『ルーシー』(9min45sec オランダ/2015) ©Stichting IJssel Producties. ✧ルーシーは400年前を生きたアファール猿人で、骨まるだしの姿をしている。主人公の少年ボウイは、博覧会に出品された彼女に出会う。ルーシーは、
Eureka EngineeringLearn about Eureka’s engineering efforts, product developments and more.
アプリケーションを作る上でデータベースを避けて通ることはできません。その中で最もポピュラーでパワフル(かつ普及している)のはSQLでしょう。 golangでも快適にSQLを操作したい。 このエントリでやること golangでSQLを操作する方法を、「基本(databse/sql)」から、SQLクエリを自動生成する「クエリジェネレータ」、最後に「ORM」という順序で解説します。 ライブラリの特徴などをいくつか抑えていくだけであって、網羅的ではない。雰囲気だけ。 操作方法 基本(database/sql) 標準ライブラリだけを使って頑張る。基本的にSQLを手書きして、変数とのマッピングも手で当てることになる。 sql.(*DB).Exec()を使うと、SQLクエリをそのまま叩ける。プリペアドステートメントはクエリのあとにガシガシ置いていくカンジ。 db, err := sql.Open("sq
最近Goがすっかりメジャーになってきて自分の書けるネタもなくなってきたので今年もやっぱりGAE/Goのハナシです。 GAE(Google App Engine)もGoに負けずもっと盛り上がって欲しいですね(^^; 前置き さて、今回のテーマですが・・ GAE/Goでもgoroutine使おうよ! てハナシです。 GAEの環境は残念ながらGOMAXPROCSが1になっている為1「goroutineを使っても意味がない」と考えている方もいらっしゃるかと思います。 実はうまく使えばとても強力なのです! どういうことかというと、あるgoroutineがAPI呼び出しなどでI/O待ちに入ると、他のgoroutineにスケジュールされます。 つまり、複数のAPI呼び出しをgoroutineを使うことで実質並列化することが可能なのです。 GAEは基本的にたくさんの用意されているサービス(Datastor
Recently Babel 6 was released. One of the main changes in it was performance optimisations. So updating makes big sense. It appeared to be very easy. I use Webpack + Babel for JS files and here is a quick manual for updating: How to update (in short)package.json (npm modules dependencies)Babel 5: “babel”: “^5.0.0”, “babel-core”: “^5.0.0”, “babel-loader”: “^5.0.0”Babel 6: "babel-core": "^6.0.0", "b
最近型ではまることがたびたびあったのでまとめてみました。 主に下記についてまとめています。 型とインターフェース 代入のルール 型の変換 型アサーション reflectパッケージの使い方 インターフェースの実装などについては触れていません。 型とインターフェース 名前を持つ型と名前を持たない型 型には名前のある型(named types)とない型(unnamed types)がある。 代入の可否など名前の有無で動作に違いのあるケースがある。 ざっくりいえば、英数字で表されているものが名前のある型、括弧やアスタリスクなどの記号を使って表されている型が名前のない型 名前のある型 下記のようにtypeを使って宣言されている型は名前のある型。
ES2015でvarやletを使う場面はほとんど無いので、まずconstを使う。constだとダメな場合にはletを使う。 背景 ES2015では、変数を宣言するための文法としてconstとletが導入された。 const foo = 'foo'; let bar = 'bar'; constは再代入できない変数を宣言できる。letは再代入できる変数を宣言できる。 const foo = 'foo'; foo = 'hoge'; // ERROR let bar = 'bar'; bar = 'hoge'; // OK あれ、じゃあvarとletは同じなの?っていうとそうではなく、letやconstはvarとは違って、関数スコープよりも細かなブロック単位のスコープを提供する。例えばconstやletを使うと、if文やfor文などのブロック中でのみ有効な変数を宣言できる。 で、プロジェクトに
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く