読者です 読者をやめる 読者になる 読者になる

peroon's diary

game programmer

unity particle sprite sheet randomly

f:id:peroon:20160818185006p:plain

f:id:peroon:20160818185034p:plain

f:id:peroon:20160818185102p:plain

ポイントは、Particle System > Texture Sheet Animation > Whole Sheet > Frame Over Timeが右端のドロップボックスから0, 1, 2, 3からrandomly selectedする設定を選べることでした。

読書「言葉の技術」

  • もう1歩深く考えれば人に届く言葉になる

たとえばゲームでも、かわいいアイドルの3Dモデルを出すだけではなくて、それを通してプレイヤーが疑似体験するのは何か考えることで、人に届くゲームになるのだろう。話は変わるけど、柔道や筋トレをしている人もがむしゃらにやってるわけではなくて、上に行く人は知識もあるし考えている。もう1歩踏みこむ。

  • 考える術
  • 考えていなくてもそれっぽい言葉は発せる i.e.「今回はお越しいただき〜
  • すばらしい考えが一瞬でひらめくほど僕らは天才ではない

面接でも1度考えたことの中から光るものを話さないと、その場で考えているとスピードも質も足りないことを思い出した。

  • みんなに送ると(CC)、当たり障りのない言葉になる i.e. 有意義でした

目の前の1人に届く言葉を。

  • 書く行為が手軽に、軽くなっている
  • かわいい、たのしい、うける

「楽しかったです」と書いたことを思い出した。もう一歩。たとえば誰かに話しかけるとき、相手が思うのは「なんで話しかけてきたんだろう?」だろうから、まずそこを曖昧にしないで伝えることがよさそう。

  • 映画でも、何が面白いのか、何がイマイチか「言葉にする」
  • 膨大な資料や意見をとりこむほど均一化する

「自分の言葉で話す」

  • 気の利いた言葉より、一歩深く考えた言葉
  • 「商品・企業」「ターゲット」「競合」「時代・社会」
  • 「年賀状は、贈り物だと思う」
  • 「昨日まで世界になかったものを」
  • 「もったいない!」(Bluray
  • 「言いたいことより、言われたいこと」
  • 人は相対的に選択するから、競合を考える
  • 「つくろう」(日立)
  • 批評では何も生まれない
  • オールナイトニッポン、まだつづいています」(ターゲットが見えている)
  • ゆるい言葉は考えがゆるい
  • 言葉の強さ
  • 直感をひもといて思考の筋道を確かめる
  • しつこく考えた人の勝ち
  • 何を競合と設定するかが大切

私の場合、他のゲーム会社、他のゲームしか競合と考えがちだが、娯楽の競合はYoutube, Instagramなどなど、もっとある。

  • コピーっぽい言葉よりも、伝わる言葉。具体的な観察している言葉
  • 「テレビの笑いじゃもの足りない人へ」(ラジオ)
  • 「声だけで面白いヤツが、本当に面白い」(ラジオ)
  • 思いついたところで満足せず、そこから普遍をさがす
  • 伝えたい相手を観察する
  • 「宣言する」(スケール)「提案する」(具体性)「描写する」(観察)「挑発する」(説得力)
  • 出てきた言葉を逆算することで思考プロセスを真似できる

「なんであの人はこうできたのだろう?」と考えてみる

  • いいことを書こうとしない
  • ホンネ
  • ブレてもいい。考えを改めれる素直さ
  • 昨日の自分より賢いのだから考えも変わる
  • 以前の自分からの自由
  • (震災)感情的な言葉より、正確な言葉
  • 「考えよう。答えはある」(ヘーベルハウス
  • 自分を見つめる
  • not 我々は but 私は
  • 自分ごと
  • コミュニケーションの主体は受け手

伝える、ではなく、伝わるかどうか。まとめると「楽しかったです」ではなく「〜〜が楽しかったです」と言うことで具体的にして自分の気持ちを含めて伝えていきたい。

思いつくものではない。考えるものである。言葉の技術

思いつくものではない。考えるものである。言葉の技術

Go+echoにURLパラメータでユーザIDを入れてMongoDBから引く

URLパラメータでidを取得したが、その型がstringなのでintに変換してからFindする必要があった。http://localhost:1323/users/id/2 このようにアクセスするとIDに従ったユーザの名前が表示できる。

package main

import (
    // サーバ系
    "net/http"
    "github.com/labstack/echo"
    "github.com/labstack/echo/engine/standard"

    // mongo系
    "fmt"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"

    // 型
    "strconv"
    //"reflect"
)

// ユーザクラス
type User struct {
    Name  string `bson:"name"`
    Id int `bson:"id"`
}

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })

    // :id, :name に値が入っていないとNot Foundになる
    e.GET("/users/id/:id", func(c echo.Context) error {

      // 数値に変換する必要あり
      var id int
      id, _ = strconv.Atoi(c.Param("id"))

      //idでDBを引く
      session, _ := mgo.Dial("mongodb://localhost")
        defer session.Close()
      db := session.DB("mydb")

        // id指定でユーザ取得
        var results []User
        fmt.Println(id)    
        db.C("users").Find(bson.M{"id": id}).All(&results)
         
        fmt.Println("Results of one user: ", results)
        fmt.Println(len(results))    

        if len(results) == 0 {
            return c.String(http.StatusOK, "No user")
        }else{
            name := results[0].Name
            return c.String(http.StatusOK, "Hello, " + name)
        }
    })

    e.POST("/user", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, POST user")
    })

    // ポート
    e.Run(standard.New(":1323"))
}

mgo.v2でGoからMongoDBにつないでSELECTする

導入方法 https://gopkg.in/mgo.v2

データは事前に下記のように入っているとする

> db.users.find()
{ "_id" : ObjectId("57a08bcd665449ed6ba92517"), "name" : "あいう", "id" : 2 }
{ "_id" : ObjectId("57a08bd8665449ed6ba92518"), "name" : "かきく", "id" : 1 }
package main

import (
    "fmt"
    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

type User struct {
    Name  string        `bson:"name"`
    Id int `bson:"id"`
}

func main() {
    session, _ := mgo.Dial("mongodb://localhost")
    defer session.Close()
    db := session.DB("mydb")

    // 全ユーザ取得
    // var results []User
    // db.C("users").Find(nil).All(&results)
    // fmt.Println("Results All: ", results) 

    // id指定でユーザ取得
    var results []User
    db.C("users").Find(bson.M{"id": 1}).All(&results)
    fmt.Println("Results of one user: ", results)    
}

Golang + echoでAPIサーバを書いてみる

go get github.com/labstack/echo

したら$GOPATH/srcに入る

src/server.goに

ここのserver.goを書いて

go run src/server.go

で実行。http://localhost:1323ChromeからアクセスしてHello Worldが表示された。APIのURLを追加してみよう。

package main

import (
    "net/http"
    "github.com/labstack/echo"
    "github.com/labstack/echo/engine/standard"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    e.GET("/user", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, user")
    })
    e.Run(standard.New(":1323"))
}

と書き足して、server.goを一度切ってから再実行し、http://localhost:1323/userにアクセス。Hello userが表示された。次はPOSTをしてみよう

package main

import (
    "net/http"
    "github.com/labstack/echo"
    "github.com/labstack/echo/engine/standard"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, World!")
    })
    e.GET("/user", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, user")
    })
    e.POST("/user", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello, POST user")
    })
    e.Run(standard.New(":1323"))
}

書き足してserver.goを再起動し、Chrome ExtensionのPosterなどからPOSTでhttp://localhost:1323/userにアクセスするとHello POST userが表示された

DBと連携させたい。Mongo入れてみよう

brew install mongodb

273MBとか出てたのでサイズは大きい そしてインストール自体にも時間がかかる 10分くらい待ってやっと終わった!と思ったら

Error: Permission denied - /usr/local/var

ここのAnswerの2コマンドを入力。

再度brew installしたら、ビルドは再利用されたのだろう、すぐインストールが完了した

mongoと入力するとバージョンが表示された。Terminalで

sudo mongod

と入力。動いている様子

Terminalの別タブで

mongo

と入力するとクライアント側としてつながった。

> show dbs
local  0.078GB
> db
test
> use mydb
switched to db mydb

保存してみよう

> db.users.save({name:"あいう"})
WriteResult({ "nInserted" : 1 })
> db.users.save({name:"かきく"})
WriteResult({ "nInserted" : 1 })
> db.users.find()
{ "_id" : ObjectId("57a08bcd665449ed6ba92517"), "name" : "あいう" }
{ "_id" : ObjectId("57a08bd8665449ed6ba92518"), "name" : "かきく" }

mydb.usersに2件保存された状態。これをGoからアクセスしたい。Goからmongoに繋ぐパッケージを入れよう

export GOPATH=$HOME/gowork
go get gopkg.in/mgo.v2

とりあえず先ほど挿入したデータとは無関係に、サンプルを実行してみよう

package main

import (
    "fmt"
    mgo "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

// Personに共通なものはここにまとめたいですよね
type Person struct {
    ID    bson.ObjectId `bson:"_id"`
    Name  string        `bson:"name"`
    Level int           `bson:"level"`
}

func (p *Person) Greet() string {
    return fmt.Sprintf("My name is %s.", p.Name)
}

// 派生したstructもつくりたいですよね
type Admin struct {
    Person
    Password    string   `bson:"password"`
    Permissions []string `bson:"permissions"`
}

func main() {
    session, _ := mgo.Dial("mongodb://localhost/test")
    defer session.Close()
    db := session.DB("mydb")

    admin := &Admin{
        Person{
            bson.NewObjectId(),
            "otiai10",
            10,
        },
        "hoge",
        []string{"write", "read"},
    }

    db.C("people").Insert(admin)
}

問題なく実行されて、mydb.peopleというCollectionが増えたし、データも入っていた。先ほど挿入したusersの中身も取得したい

package main

import (
    "fmt"
    mgo "gopkg.in/mgo.v2"
    //"gopkg.in/mgo.v2/bson"
)

type User struct {
    Name  string        `bson:"name"`
}

func main() {
    session, _ := mgo.Dial("mongodb://localhost/test")
    defer session.Close()
    db := session.DB("mydb")

    var results []User
    db.C("users").Find(nil).All(&results)
    fmt.Println("Results All: ", results)
}

こう書いて、go run connect.goで実行すると、取得できた。

Results All:  [{あいう} {かきく}]

POSTでuserIdを指定して、指定したユーザを取得するまでできれば、結構良さそう。それは後日 →追記:書きました

peroon.hatenablog.com

Goでバッチ処理。system()など叩いてみた

DL https://golang.org/dl/

package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

を保存して

go run hello.go

としたら実行できた。ruby hello.rb と同じ感じ。systemさえ叩ければいいかなと思い

package main

import "fmt"
import "os/exec"

func main() {
out, err := exec.Command("ls").Output()
fmt.Println(out) // 数値が出力される
fmt.Println(string(out)) // lsの結果が文字列で出力される
fmt.Println(err) // nil
}

これでsystem()は実行できた。GUIは決定版がないようなので、保留。一連のコマンド処理の自動化だとRubyの方が記述量が少なくて楽という印象。APIサーバ作るとかだとGoがいいんだろう。

blog.amedama.jp

その後に上記記事の「自作のプロジェクトを GitHub で管理する」まで読んだ。バイナリ化、パッケージ化して別コードから使う、テスト用コードまで理解した。

JSON ServerでダミーのAPIサーバをローカルに立ててみた

npmのためにnode jsを入れる https://nodejs.org/en/download/

Qiitaを参考に、http://qiita.com/yhikishima/items/46860ffc48913182a3ee

sudo npm install -g json-server

json.dbに書くJSONをここから確保 http://json.org/example.html json lintも通ることを確認

http://localhost:3000/Chromeからアクセスすると、動いてるよーという表示 http://localhost:3000/glossary にアクセスすると、JSONが表示

POSTでデータ保存できるらしい

curl -X POST http://localhost:3000/glossary -d title=fugafuga

やってみると、json.dbの値が書き換わった http://localhost:3000/glossary で返ってくるJSONも書き換わった後のものになる

curl -X POST http://localhost:3000/glossary -d aaa=bbb

としても書き換わる

curl -X POST http://localhost:3000/new -d aaa=bbb

としたらnewでJSON取得できると思ったけどできなかった。空が返ってくる {}

db.jsonを見てみると

{
  "glossary": {
    "aaa": "bbb"
  }
}

となっている。ここにnewがないから保存されなかったのか。

{
  "glossary": {
    "aaa": "bbb"
  },
  "new":{
    "ccc": "ddd"  
  }, 
  "xxx":{
    "yyy": "zzz"  
  }
}

こんな感じにエディタで追記すると、watchされているのでサーバは生きたまま反映される。ただしJSONの文法が違うとQuitされるので、事前にlintでチェックしておくといい

これでダミーの固定JSONを返すローカルのAPIサーバは立てることができた。次はDBとつなげてみたい。