golangでrest api (web framework iris and orm gorm)試してみた

golangのweb frameworkはまだスタンダードが決まってないようで候補はいろいろ

この中で最もパフォーマンスがよいといわれているiris試すことに

ormもいろいろあるようですが全部入りのgormを選択

databaseは前回用意したmysqlで以下のようになりました

package main

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "github.com/kataras/iris"
    "time"
)

func main() {
    connectionString := "user:pass@tcp(xxx.arukascloud.io:0000)/db?charset=utf8&parseTime=True&loc=Local"
    db, err := gorm.Open("mysql", connectionString)
    if err != nil {
        panic(err)
    }
    db.AutoMigrate(&Article{})
    ar := &ArticleResource{db: db}

    iris.Get("/articles", ar.ArticlesList)
    iris.Post("/articles", ar.ArticlePost)
    iris.Get("/articles/:id", ar.ArticlesDetail)

    iris.Listen(":8080")

}

type ArticleResource struct {
    db *gorm.DB
}

type Article struct {
    Id      int64 `gorm:"AUTO_INCREMENT;primary_key"`
    Created int64
    Title   string
    Content string
}

func (ar *ArticleResource) ArticlesList(c *iris.Context) {
    var articles []Article
    ar.db.Order("id").Find(&articles)
    c.JSON(iris.StatusOK, articles)
}

func (ar *ArticleResource) ArticlesDetail(c *iris.Context) {
    id := c.Param("id")
    article := Article{}
    ar.db.First(&article, id)
    c.JSON(iris.StatusOK, article)
}

func (ar *ArticleResource) ArticlePost(c *iris.Context) {
    var json Article
    c.ReadJSON(&json)
    article := Article{
        Created: time.Now().UnixNano(),
        Title:   json.Title,
        Content: json.Content,
    }
    ar.db.Create(&article)
    c.JSON(iris.StatusCreated, article)
}

同じことをrubysinatraでしたらコード量は減るけどパフォーマンスは圧倒的にこちらの方がよいかと

3分でクラウドにmysql開発環境を用意する by arukas cloud docker hosting

windows環境でmysql立ち上げるの面倒だなと思っていたらarukasで簡単に用意できるとのことで試してみた

  1. arukasにアカウント作る
  2. アプリケーション追加ボタンを押して以下の値設定

    項目
    Image mysql
    Instances 1
    Memory 512M
    Port 3306
    ENV MYSQL_DATABASE = db
    MYSQL_ROOT_PASSWORD = rootpass
    MYSQL_PASSWORD = pass
    MYSQL_USER = user
  3. 起動ボタン押す

以上でおしまい。やり方分ってれば1分ぐらい?

あとは以下のようにgolangから接続確認

package main

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

type Product struct {
    gorm.Model
    Code  string
    Price uint
}

func main() {
    db, err := gorm.Open("mysql", "user:pass@tcp(xxx.xxx.arukascloud.io:00000)/db?charset=utf8&parseTime=True&loc=Local")
    if err != nil {
        panic("failed to connect database")
    }

    // Migrate the schema
    db.AutoMigrate(&Product{})

    // Create
    db.Create(&Product{Code: "L1212", Price: 1000})

    // Read
    var product Product
    db.First(&product, 1)                   // find product with id 1
    db.First(&product, "code = ?", "L1212") // find product with code l1212

    // Update - update product's price to 2000
    db.Model(&product).Update("Price", 2000)

    // Delete - delete product
    db.Delete(&product)
}

いや便利ですすごく

参考

おじいちゃんが亡くなった 看取りからお葬式まで

おじいちゃんの看取りからお葬式までを行いました。
両親はまだ健在ですが、初めてだらけのことだったので今後のためにログ残したいと思います。

初看取り

5月10日朝6時におなかが痛いということで救急車で病院に付き添いましたが、
腹部大動脈瘤破裂という診断で運ばれてから6時間後にその病院で亡くなりました。
95歳という高齢だったため、積極的な治療はお勧めできないと医者に言われ、痛みを取るだけの対処でした。
治療方針や病名は、医療系ドラマを見ていたためか、ほとんど意味がわかり、その自分にびっくりしました。
私は孫に当たるのですが、妻も子(私の母)も間に合わないということで私が初めて看取りました。
それも医師が瞳孔をライトで調べるというドラマで見たことのある光景でした。

霊安室

ICUでの医師の死亡確認が済むと病院地下にある霊安室に運ばれ、
病院専属の葬儀社の方がお焼香のセッティングしてくれ、そこで、妻と子を待ちました。
おじいちゃんは生前、ある葬儀社に積み立て金がありそれを使うとのことで、
その葬儀社に連絡し、火葬までその葬儀社に遺体を置いてもらうという段取りになりました。

初葬儀社

葬儀社の車で遺体を霊安室から葬儀社まで運び、お焼香をした後、お葬式の段取りをしました。
50万円の積立金でおさめようとすべてのオプションを安い金額のものにと指定したにもかかわらず、
5万円オーバー&段取り2時間という最低な段取りで(葬儀社の方がぽんこつ極まりなかった)、
なんとかお葬式は5月15日午後1時に決まりました。
この時、5月10日夕方6時、ジェットコースターのような一日でした。

初お骨持ち

5月15日午後1時、火葬場に親族8人のみ集まり、葬儀社の方のナビで葬儀社から運ばれた遺体の棺に花を入れ最後のお別れをしました。
焼かれて出てきた骨の説明などを受け、箸で骨を骨壷に入れ、お骨をおじいちゃんの家まで持ち帰りました。
途中、お骨が意外と重いので地面に下ろそうとしたら父親に止められ、下ろしちゃいけない物と初めて知りました。

残されたおばあちゃんが高齢なので、おじいちゃんが亡くなったことに対する手続き全般を私がすることになったので、それもログとして残したいと思います。

conohaのObject Storage Service触ってみた

今、個人サービスはさくらvps使ってるんですが、conohaに替えようとサイト見てたら
conohaのapi触るとクーポンもらえるとのことでgoの勉強を兼ねてライブラリ書いてみた
とりあえず一番使いそうなObject Storage Serviceのライブラリ
pdevty/conohaswift · GitHub
amazon s3のように独自ドメイン使えないっぽいけど
前面にリバースプロキシ立てれば静的webサイト運用できそう
参考
ConoHa API index
OpenStack API Documentation
Amazon S3による静的Webサイトホスティング
ConoHaオブジェクトストレージ(OpenStack Swift)でWEB公開した超長いURLを短くする方法 - Qiita

polymerに入門してみた

自分のサイトをマテリアルデザインmaterial designで作り直したいと思い
cssフレームワークを探していたらpolymerにたどり着いた
公式サイトのチュートリアル
Getting the starter project - Polymer
をこなして
中の人っぽいのyoutube動画
robdodson/polycasts · GitHub
見て雰囲気つかんで
動画見ながら
Introducing the Polymer Designer tool - YouTube
デザインツール使ってみた
Designer
現時点でバージョンが0.5で重たいとか仕様が変わるとかあるみたいだけど
とりあえず使ってみようと思う

参考
Real-Time Apps with Polymer and Firebase - YouTube
Polymer Polytechnic Codelabs
Introducing the Polymer Designer tool - YouTube
Polymer Polytechnic Speaker Deck - YouTube
robdodson/polycasts · GitHub
Polymer コードラボに参加しました(資料まとめ) - dackdive's blog

golangのwebアプリをherokuにデプロイ①

このスクリーンキャスト通りでいけます。
GopherCasts
ファイルを3つ用意して
lesson10/main.go

package main

import (
	"flag"
	"log"
	"net/http"
)

func main() {
	port := flag.String("port", "8080", "HTTP Port to listen on")
	flag.Parse()

	log.Println("Starting Server on", *port)
	http.HandleFunc("/", handler)
	log.Fatal(http.ListenAndServe(":"+*port, nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
	w.Write([]byte("Hello World!"))
}

lesson10/.godir

lesson10

lesson10/Procfile

web: lesson10 -port=$PORT

あとはherokuにgit pushするだけ

git init
git add -A
git commit -m "initial commit"
heroku create -b https://github.com/kr/heroku-buildpack-go.git
git push heroku master
heroku open

・・・動かず
heroku logsコマンドでログを確認すると

no web processes running

とのことで
herokuのweb dashboardでdynoを確認すると0だったので1にすると
うごいたー

参考
GopherCasts
Getting Started with Go on Heroku
GoアプリをHerokuにデプロイする - MOL

hugoでブログ①ローカル環境構築

環境は前回で作成済みなので
まずは公式ドキュメント通りにhugoをインストール・・・けどうまくいかず
windows用のバイナリーダウンロードすることに
Releases · spf13/hugo · GitHub
落としたhugo.exeをパスの通っているGOPATH/binに置いて

mkdir /path/to/site
cd /path/to/site
hugo new site .

テーマはこれに決めてたので
vjeantet/hugo-theme-casper · GitHub

mkdir themes
cd themes
git clone https://github.com/vjeantet/hugo-theme-casper casper

あとは最初の記事を書いてサーバー起動しhttp://localhost:1313/にアクセス

hugo new post/first.md
hugo server --theme=casper --buildDrafts --watch

いけたー簡単

参考
spf13/hugo · GitHub
Hugo Quickstart Guide