ボクダイモリ

Life is like a Game

メッセージキューについて調べてみた

メッセージキューについて

nsqをいじってみたがいまいちどう役に立つのかよく分からなかったので調べてみた。 一番下の参考文献を一通り読むことでメッセージキューを導入することによる利点は分かると思う。

メッセージキューとは

システム間のメッセージの送信と受信の間を仲介して、送受信されるメッセージを制御するためのシステム。 やっていることはシンプルだが、システムをコンポーネントとして分割し、独立性を高める役割を果たしている。 まず送信側は受信側の状態に関わらずメッセージをキューに送信してしまうことでメッセージをすぐ手放すことができる。 例えば受信側が処理待ちや障害が発生していても、送信側がそれに合わせる必要がない。 受信側も同様、メッセージを処理している最中にメッセージが送られることがない。 メッセージキューがシステム間の仲介をすることで、受信側と送信側の独立性を高められる。

可用性

受信側がメッセージを受け取った時点で、キューにメッセージのコピーが作られる。 コピーはキューが受信側からメッセージを受け取ったという通知をもらうまでは、コピーを削除しない。 そのため、複数台あるうちの受信側のマシンで障害が発生しても、一定時間後に別のマシンがメッセージを受信する ことで処理をやり直すことができる。

拡張性

受信側の処理スピードが間に合わなくなり、キューにメッセージが貯まるようになったとき、キューがそれを検知して 受信側のマシンを増やすという運用にすることができる。 例えばAWSには仮想マシンの台数を増減させるオートスケーリングというサービスがある。

メッセージキューの種類

以下のリンク先でメッセージキューライブラリの紹介がされている。 http://postd.cc/dissecting-message-queues/

各ライブラリのパフォーマンスや導入のしやすさ等を比較したサイト。 1回読んでみたがまだ所々分からないところがある。

まとめ

  • メッセージキューとは送信側と受信側でのメッセージの仲介を行う
  • 送信側と受信側はお互いの状態を気にすることなく、メッセージの送受信ができるためパフォーマンスの劣化を防げる(可用性を上げられる)
  • メッセージキューに一定以上のメッセージが貯まったことをトリガーにして、受信側のマシンを増減させるなどの運用が可能
  • メッセージキューのライブラリは色々ある

参考文献

若手が知らない昔の技術MQ、クラウドではホットだ http://itpro.nikkeibp.co.jp/atcl/watcher/16/110700001/011600017/

分散型メッセージングミドルウェアの詳細比較 http://postd.cc/dissecting-message-queues/

【一人旅】等々力渓谷行ってきた

久々に投稿。

 

最近会社での疲れが溜まってきていたので、リラックスしたくて落ち着けるところとか行きたいなーと思い、色々調べていたら等々力渓谷という所がいいらしい。

最寄駅から1時間ほど。自然が多くて良さそう。

ちょうど会社で休暇をもらっていたので、行ってみました。

 

感想

写真をいくつか撮ったので挙げます。

 

f:id:anrakusan:20170914101639j:image

 

f:id:anrakusan:20170914101648j:image

 

 f:id:anrakusan:20170914101737j:image

 

素晴らしきかな自然!!

片っ端から行けそうな所は全部行った。全部回るのに1時間くらい。

疲れたら途中に喫茶店とかあるのそこで休憩も出来る。

写真で分かる通り川が近くで流れてるせいか気に囲まれてるせいか湿度が高めでちょっと蒸し暑かった。

周りには僕のように1人で来てる人もいれば、カップルもちらほら。

 

たまにこういう自然と触れ合う機会があると、リフレッシュ出来ますね。

いい運動になったし行ってよかった。

疲れたので近くのカフェに寄ってから帰りました。

 

一人旅いい!

一人旅ってした事なかったんですが、今回行ってみていい体験だったので今月またどこかのタイミングでどっか行ってみようと思います。

やっぱり行くなら自然があるとこがいいですね。あと、今回は日帰りで若干物足りない感じがしたので次は1泊2日くらいで観光出来るところを探してみます。

近況

ライブ行ってきました

昨日の土曜日に豚乙女さんのライブに行ってきました。 場所は渋谷TAKE OFF7 の200人くらい入れそうなライブハウス。 特に豚乙女のファンとかではなかったですが、友人に誘われたのでせっかくなので参加。 こういう盛り上がり激しいライブとかはあまり行ったことが無かったので結構新鮮でした。 曲名は少しだけ知ってたので歌えるところは全力で歌った。 おかげで今も喉がちょっと痛い。 めっちゃ面白かったのでまた行きたいです。

スマートウォッチ使ってみた

最近はこれ付けて生活してる

辞めていく会社の先輩から頂いたので使わせてもらっています。 軽いし身に着けやすいので結構気にってます。

主に腕時計と歩数計の機能を使ってます。 スマートフォンと連携すれば、プッシュ通知をスマートウォッチで見れます。 画面小さくて見にくいですが。 歩数などの統計情報はスマホに専用のアプリを入れることでチェックできるようになるようです。

アニメ

今日の午後はずっとエロ漫画先生っていうアニメ見てました。 友人から勧められたのでamazonビデオで一気見。 エロ漫画先生の所々のシーンがエロい。 それと登場人物たちの夢に対する思いを語られたときとかはじーんと来た。 ただ主人公の男の子がいつの間にかモテているがちょっと謎でした。 きっとそういうことは気にしない方が楽しめるアニメ。

趣味コーディング

最近GolangでWebアプリを作ってます。
今週半ばまでにはサーバ側だけでもちゃんと動くのを作りたい。

他のことで時間取られてあまり進んでいないので、 平日に早起きしてコーディングの時間を作るようにしたいです。

WordPress飽きたのではてなブログに戻ってきました

2ヶ月前くらいにからブログをWordPressに移行して「デザインがリッチなブログを作ろう!」とか「アフィリエイトやってマネタイズしよう!」とか考えていたわけですが、時間が経つにつれブログのデザインだとかアフィリエイトだとかどうでもよくなり当時の決心もあっけなく薄らいでしまったのでとりあえずはてなに戻ってきました。 読んでくれる方々を振り回しているみたいで申し訳ないですが😅

そもそもWordPressを始めようとしたのは知り合いから「ブログやるならWordPressがいい!」というようなアドバイスをもらったのがきっかけなのだけれども、それってきっと配信するコンテンツを限定したりしてマネタイズすることが前提なんじゃないのかなーといまでは思っている。 自分もマネタイズは視野に入れてWordPressを始めたけれども、雑記とかどんどん書きたいし色々な分野で得た知見もアウトプットしていきたいのでがっつりマネタイズ重視ってわけでもないんだよなー。

WordPressでブログを運用したいと考えていた理由は他にもあって自前で用意したサーバ上で動かしてみたいだとか、WordPressを動かすための仕組みも勉強したいというそれなりの理由があったのだけれでも、それも今や達成してしまった。 なので現在ブログをWordPressで運用する理由がない。 まぁ最初から飽きたらやめればいいかーという感じでやってたし、経験にもなったのでよかったのかなと。

はてなぶろぐよりWordPressがいいところといったら、たくさんあるプラグインを入れるだけで簡単にブログをカスタマイズできることと、 ブログのフォントサイズとかもソースコードを書き換えることで細かく変えられるところかなー。 逆に不便だったところとかは記事を書くときのエディタがイケてない。 はてなブログみたいに簡単にMarkdown挿入できたり、codeの挿入もタブが入らなかったりで融通があまり効かない感じ。 なので、特にブログにこだわりがない人ははてなブログでいいと思う。 独自ドメイン持ちたいとかならはてなProに加入すればできるし。

そんなこんなでこれからははてなブログでブログをまったり書いていこうと思います。

ゼルダ ブレスオブザワイルドをクリアしたので感想

先日ゼルダ ブレスオブザワイルドをクリアしました。 海外レビューとかすごく評判が良かったから買ってみたのだけれども、 評判通りの面白さでした。さすがゼルダ。 個人的にはすごくオススメしたいゲームなので良かった点とか感想を書いてみます。

クリアまでの正規ルートがない

ゼルダのゲームコンセプトにはまさに「自由」という言葉がぴったりなのですが、ストーリーの進行自体も自由です。 ゲームが始まってからラスボス倒すまでのルートにほぼ制限がありません。 今回もダンジョン的なフィールドがいくつかあるのですが、どのダンジョンから攻略してもいいし攻略しないで ラスボスに挑んでもいい。 ストーリーを進めている間に具体的な指針が決まっているという時の方が珍しいくらいです。 正直言うと最初どこに向かっていけばよいか分からず何していいか分からなくなったり😅 自由にどこに向かったっていいという点で僕以外にも困っちゃう人もいるかもしれませんね😁

それでも自分で行動指針を立てて行けるところから進めていくのは面白かったですね。 今までのゼルダにはなかった良いポイントだと思います。

グラフィックがきれいで見てて飽きない

普段時間が取れない中、クリアまで続いたのはフィールドがきれいだったのが大きかった。 他のオープンワールドだとただ広いフィールドをずっと走ってるみたいな感じになるけども、 ゼルダは周りの景色を見ながら目的地を進んでいくのが楽しかった。

色々な場所へワープができるので、移動はしやすい

オープンワールドなので移動時間が多くなりそうではあるけども、ワープが出来るポイントがいくつかあるので 移動に時間がかかるようなことはあまりない印象。 目的地に向かう際もワープ地点から他のワープできるポイントを開拓しながら進めていく感じ。 マップをどんどん開拓していくのもゼルダの面白味の一つではあると思う。

キャラクターが個性的で面白い

ゼルダの作品って結構個性的(変な?)キャラクターが多いですよね。 僕はそういうところ好きなんですが。 個人的にお気に入りなのはポックリンとサクラダ。 サクラダのシャキーンとか結構好き。詳しくは動画とか見てもらえれば。

武器は基本使い捨て

武器や盾などには耐久度があって、壊れてはどっかで武器を拾いながら進めていくのですが これがすごくオープンワールドのゲームにマッチしていると感じた。 馬もその辺で拾って(なかなかいないけど)移動手段にできる。 必要な物は都度現地調達していくのが冒険をしているみたいでリアルに感じた。

敵がものすごく強い

ザコ敵の集落みたいなのが至る所にあって、そいつらが結構強い。 防具が弱いと普通に一撃で倒される。 なので頭を筋肉にした状態で挑むと勝つのが難しいのだけども、いくつか戦いを有利に進めるためのオブジェクトが 置いてあったりするのでそれを上手く使いながら戦うことが重要になる。 こうしてある程度戦術的な動きを考えていくのが個人的にはとても面白かった。

アクション要素が多彩

ゼルダのアクション要素で特にお気に入りなので以下の3つ

  • 特に空中で弓を構えると時間がとまる
  • 相手の攻撃に合わせて回避行動をとるとラッシュと呼ばれる連続攻撃ができる
  • 盾を使ってパリィができる

回避→ラッシュとパリィはよく使ってた。成功すると気持ちいい。

まとめ

  • トーリー進行が自由
  • グラフィックが綺麗でフィールド探索が捗る
  • キャラクターが個性的
  • アクションが多彩で面白い

Gin + gormで簡単なWebアプリを作ってみた

自分でサービスを立ち上げたかったので、Go言語で簡単なWebアプリを作ってみた。

https://github.com/anraku/gin-sample

Go言語を選んだのは今一番気になっている言語だから

WebフレームワークはどれがいいのかよくわからなかったのでとりあえずGinを選択。

理由は速度が早そうだから(Martiniという同じWebフレームワークの40倍早いらしい)

 

あとはデータベースも使いたかったのでORMのライブラリもxormとgormを使ってみた。

最初はxormがいいような気がしたが、ドキュメントがあまり整備されていない印象。

また、実際にデータベースアクセスの処理が間違っていた時どのようなSQL文が発行されたのかが

分からずトラブルシューティングが難しいと感じた。

それにgithubの更新が少ないのも気になる。。

 

最終的にはgormの方を選択。ドキュメントもわかりやすく、ちょっとしたCRUDは1行程度でシンプルに書ける。

以下gormのドキュメント

http://jinzhu.me/gorm/

 

全体的に黒いデザインなのもいいね!

Webアプリの概要

とりあえずGinとgormを使って簡単にCRUDができるアプリを作ってみた。

アプリはGOPATHの配下に配置する前提です。

フロントの方はドットインストールの何かの入門で作ったコードを使いました。

また、Ginを使う際は以下のコマンドを実行してGinをインストールする必要がある。

go get github.com/gin-gonic/gin

main.go

func main() {
    router := gin.Default()
    router.LoadHTMLGlob("templates/*") // 事前にテンプレートをロード

    // トップページ
    router.GET("/index", func(c *gin.Context) {
        // データを処理する
        ctrl := controllers.NewPost()
        result := ctrl.GetAllPost()
        // テンプレートを使って、値を置き換えてHTMLレスポンスを応答
        c.HTML(http.StatusOK, "index.tmpl", gin.H{
            "posts": result,
        })
    })
}

最初にrouterを定義してHTMLテンプレートのロードを行う

router.GET("/index", func(c *gin.Context)で/indexへのGETアクセスを処理するための メソッドを作成している。

ctrl := controllers.NewPost()はModelのメソッドにアクセスするためのstructを返し、

result := ctrl.GetAllPost()でデータベースにアクセスし、値を取得している。

 

最後にindex.tmplをレスポンスとして返し、"posts"という名前のパラメータに取得したresultをセットする。

Controller

Controllerは基本データベースから値を取得し、必要であればデータの加工を行ってから 呼び出し元に返すというような実装が良いでしょう。 今回作ったのは簡単なCRUDしかないので、データベースから受け取った値をそのまま呼び出し元に返しています。

以下、Controllerの全文です。

package controllers

import (
    "../models"
)

// Post Model
type Post struct {
}

// Post Modelを返す
func NewPost() Post {
    return Post{}
}

// idに合致する記事の情報を返す
func (c Post) GetId(n int) interface{} {
    repo := models.NewPostRepository()
    post := repo.GetByPostID(n)
    return post
}

// 全記事の情報
func (c Post) GetAllPost() interface{} {
    repo := models.NewPostRepository()
    posts := repo.GetAllPost()
    return posts
}

// 全記事の件名
func (c Post) GetAllHeader() interface{} {
    repo := models.NewPostRepository()
    posts := repo.GetAllHeader()
    return posts
}

// 記事を投稿
func (c Post) CreatePost(header string, body string, author string) bool {
    repo := models.NewPostRepository()
    ok := repo.CreatePost(header, body, author)
    return ok
}

// 記事を更新
func (c Post) UpdatePost(id int, header string, body string) interface{} {
    repo := models.NewPostRepository()
    ok := repo.UpdatePost(id, header, body)
    return ok
}

// 記事を削除
func (c Post) DeletePost(n int) interface{} {
    repo := models.NewPostRepository()
    result := repo.DeletePost(n)
    return result
}

Model

gormを使う際は以下のライブラリをgo getして、importする必要がある

"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"

gormを利用するために以下のようにgormのオブジェクトとデータベースを初期化

var db *gorm.DB

func init() {
  conn, err := gorm.Open("mysql", 
    "root:password@/gin_sample?charset=utf8&parseTime=True&loc=Local")
  if err != nil {
    panic(err)
  }
  db = conn
  //DB Migrate
  if !db.HasTable("posts") {
    db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&Post{})
  }
}

gorm.DBのオブジェクトをグローバル変数で保持するようにして、実行時にDBへ接続するようにする。 init()はアプリの実行時に呼ばれる。

gormでは

db.Set("gorm:table_options", "ENGINE=InnoDB").AutoMigrate(&Post{})

のようにDBのマイグレーションを行える。 マイグレーションのコードも書いておけば開発時にテーブル定義をいちいち自分で作る必要がない。 Insertする処理も一緒に書いておくともっと楽ができるだろう。

マイグレーションは定義したstructをAutoMigrateの引数に渡すことで、それに対応するテーブルの作成を行う。 今回定義したstructは以下の通り

// 投稿情報の構造体
type Post struct {
    ID     int            `gorm:"AUTO_INCREMENT;primary_key"`
    Header string         `gorm:"not null;size:255"`
    Body   string         `gorm:"not null;size:13000"`
    Author string         `gorm:"not null;size:30"`
    CreatedAt time.Time   `gorm:"not null"`
}

上記のstructをマイグレーションすることで「posts」というテーブルが作成される。 最後にCRUDの処理をざっと記載する。

// idに合致する記事を取得
func (m PostRepository) GetByPostID(id int) *Post {
    var post Post
    db.Where(Post{ID: id}).Find(&post)
    return &post
}

// 記事を全検索
func (m PostRepository) GetAllPost() []Post {
    var post []Post
    db.Select("*").Find(&post)
    return post
}

// 記事を投稿する
func (m PostRepository) CreatePost(header string, body string, author string) bool {
    post := Post {
        Header: header,
        Body:   body,
    }
    db.Create(&post)
    return true
}

// 記事の件名と本文を更新する
func (m PostRepository) UpdatePost(id int, header string, body string) interface{} {
    post := Post{ID: id}
    db.Model(&post).Updates(map[string]interface{}{
        "Header":header, 
        "Body":  body,
        })
    return true
}

// 記事を削除する
func (m PostRepository) DeletePost(id int) interface{} {
    post := Post{ID: id}
    db.Delete(post)
    return nil
}

まとめ

Gin + gormで割りとすぐにWebアプリが作れた(簡単なものだけど)

ORMライブラリの使い勝手としてはxormよりもgormの方が若干 CRUDの処理がシンプルに書ける印象。

ドキュメントも分かりやすく、CRUDが簡単に実装できたので 好きになりました。

 

また、テーブル名が構造体の名前に依存する(Post構造体にはpostsというテーブルが紐づく)ので、

テーブル名には気をつける必要がある。

 

Gin + gormは思ってたよりも記述量が少なく、記述もシンプルなので

個人的にはWebアプリを作る時にGoを使うという選択肢はありなように感じました。

Nintendo Switchをやってみてよかった事

Nintendo Switchをプレイし始めて1ヶ月くらい経ったので感想を書いてみる。

 

Nintendo Switchのいいところ

 

Switchを買った時はただゼルダがやりたくて買った感じなので、ハード的には全く興味がなかったが

いざプレイしてみるとハードとして優れたものであることを実感できた。

 

 

Switchについて調べればわかることだけども、今回のハードも任天堂らしく画期的な仕様になっていて、それが現代のコンテクストにしっかりマッチしていると感じた。

 

 

そのように感じたNintendo Switchの特徴的な点をいくつか挙げてみる。

 

 

据え置き機でもあり携帯機でもある

 

Switch本体にはディスプレイが付いていて左右にコントローラーが付いたような作りになっており、パッと見大きい携帯機というような感じ。

ゲーム画面は外部出力することができ、左右のコントローラーは自由に着脱できる。

自分は普段家でプレイする時はコントローラーを外して、外部ディスプレイに出力してプレイをしている。

 

 

Switchをプレイして気に入った点は、いつでも開始でき、いつでも終了できること。

本体の電源ボタンを1回押せばスリープになるので、いつもこのように操作している。

例えるとiPadの電源ボタンを押してスリープしたり解除したりするのと似ているのでお手軽だ。

 

 

本体自体もあまり大きくはないので出先にも持っていけると思う(自分はやったことない)。

なので、仕事をしているような忙しい人もプレイしやすいと思うのでゲームが好きな方にはぜひオススメしたい。

 

 

コントローラーが軽く扱いやすい

 

自分は基本コントローラは外してプレイしているのだが、持ってみると本当に軽い。

また、コントローラーが2つに別れるところがSwitchの特徴の1つであるが、これが個人的には

プレイのしやすさに繋がっていると感じている。

 

 

どういうことかというと通常のコントローラーであれば両手の位置が固定されるが、Switchの場合は両手の位置が自由になる。

例えば両肘を椅子の肘掛けに置きながらプレイするということも可能だ。

自分はいつもこのスタイルでやっている。

 

 

面白いゲームタイトルがある

 

てゆうかゼルダがある。それだけで買う価値があると思っている。

オープンワールド嫌いという方もぜひやってみてほしい。オープンワールドに対する価値観が変わるかもしれない。

 

 

まとめ

  • Switchは気軽にプレイしやすいので忙しい人にもオススメ
  • コントローラー軽いし2つに別れてたりするがそれがいい
  • ゼルダ最高