きょこみのーと

技術に関係ないほうのブログ

2016年やること

あけまして

去年の振り返り(続)

年越して改めて2015年振り返りを見直すとかなり雑だったので補足がてら2015年のまとめ書いてから、今年やることを書こうかなと思います。

kyokomi.hatenablog.com

上記見直すと、転職して1年間とにかくGoを書いてLTしたり発表してみたりという感じです。 あとは色々な人と出会った年だったと思います。(転職によって人脈が広がっていく感じですかね)

各分野のスペシャリストや、天才的な若手エンジニアと一緒に仕事できたのも刺激的でした。

他にもユーザーへサービス提供すること、システムを運用することに対する考え方がとてもしっかりした方と一緒に仕事ができたのは、今後の人生を左右するくらい学びありました。

またそういった正論だけでは仕事は成り立たないのだな・・・という闇も同時に見ることができて、激動の1年でした。(自分としては、うまく折り合いをつけていきたい)

2016年やるつもりのこと

  • 今作っている個人開発の放置ゲームを完成させる
    • 脱エターナルする
  • Androidアプリ開発を再開する
    • 1年サーバーやったので、クライアント側もちゃんとできるようにする
  • インフラ周りの知識をつける
    • Dockerは何となく使えるようになったけど、まごころが足りない...
  • Goは引き続きやる
    • まだまだ理解足りてないので、1〜2年は書いていきたいと思っている
  • Scalaそろそろ入門する
    • Goだけじゃなく、固い言語も学んでおきたいので
  • 英語やるぞ...
    • 脱中学英語レベル

ざっくり言うと、 今の方向性でしっかりと地盤を固めつつ個人ゲーム開発の脱エターナルする感じでいきます。

2015年振り返り

毎月最低1記事はブログを書くという自分ルールを達成するため(?)にこの一年を雑に振り返ってみようかと思います。 技術関係ないネタも多めなので、お気をつけ下さいませ・・・

1月

  • ゲーム会社を退職して、ニュースの会社に転職した
  • 仕事でGoを書き始めた

2月

  • 仕事で必死だったのでよく覚えてない
  • 仕事で必要だったのでReactとか触ってた

3月

会社ブログ

Gunosy.go#11を開催し、GunosyのGo現状確認を行いました – Gunosy Tech Blog

スライド

speakerdeck.com

4月

開発合宿主催者のブログ

DevMorning合宿ハッカソンを12人で開催しました!devmorning.wordpress.com

スライド

speakerdeck.com

5月

  • GWにMeetAppというサービスをリリース(前月の合宿で作ったプロトタイプを一応完成させた)
  • [PS4] 新次元ゲイム ネプテューヌVⅡをクリア

MeetAppの構成とか書いたブログ

kyokomi.hatenablog.com

いま見てもコードが雑すぎるのでいずれなんとかしたい・・・

MeetApp

meetapp.tokyo

6月

スライド

speakerdeck.com

speakerdeck.com

BattleHack

とにかくタダで参加できるイベントとは思えない飯とか設備だった。 ただ、インターネッツ不安定なのが結構辛かったのも覚えてる。

f:id:kyokomi:20151226214704p:plain

7月

  • 引っ越した
  • ドラム式洗濯機を買って人生変わった
  • 羊一等まるごと食うイベント
  • ジムに通い始めた(2ヶ月で解約したけど)
  • GitHubの草活が367達成して埋まった(後半すごいのは、仕事がGithub.comなので)
  • github.com/kyokomi/lotteryを作った

kyokomi.hatenablog.com

f:id:kyokomi:20151226221800p:plain

f:id:kyokomi:20151226221802p:plain

8月

  • YAPC2015参加(発表なし)
  • 夏コミに初参加(gregさんの手伝いで参加して、スルっと入れた)
  • 前職の人たちと2015年2回目の沖縄に行った

9月

  • [PSVita] フェイト/ホロウ アタラクシアをクリア
  • ISUCON2015予選敗退(またもや)
  • Unityいよいよ入門した
  • ボードゲームにハマる

10月

11月

  • GAE/Goにハマり始める
  • [PSVita] 激次元タッグ ブラン+ネプテューヌVSゾンビ軍団をクリア

12月

スライド

speakerdeck.com

speakerdeck.com

Advent

qiita.com

qiita.com

おわり

ざっと1年振り返って最後の方は写真も貼らず雑になりましたが、色々やってました。 やろうと思ってたことで実現できなかったことも多いので、来年何するかとかはこれから考えます・・・。

Goのslackbotを改良したのと、プラグイン増やしたので紹介

以前のGoCon 2015 SummerでLTしたkyokomi/slackbotですが、 かなりリニューアルしたので、改めて紹介しようかと思います。

github.com

大きな変更点

  • x/net/contextの依存をやめた
    • 魔法みたいになんでも出てくる感じで分かりづらかったので
  • importするだけの実装をやめた
    • importする順番をきにしたり、魔法っぽい感じがわかりずらかったので
  • プラグインhelp() stringメソッドの実装を強制した
    • systemコマンドっぽいのでhelpをまとめて出せるようにしたかった

実装例はこんな感じ。

package main

import (
    "flag"
    "net/http"
    "os"

    "github.com/kyokomi/slackbot"
    "github.com/kyokomi/slackbot/plugins"
    "github.com/kyokomi/slackbot/plugins/echo"
)

func main() {
    var token string
    flag.StringVar(&token, "token", os.Getenv("SLACK_BOT_TOKEN"), "SlackのBotToken")
    flag.Parse()

    bot, err := slackbot.NewBotContext(token)
    if err != nil {
        panic(err)
    }

    // pluginを追加する

    bot.AddPlugin("echo", echo.NewPlugin())

    // joinしてる部屋全部のeventが来るので注意

    bot.Run(func(event plugins.BotEvent) {
        if event.ChannelName() == "#general" {
            event.Reply("起きた")
        }
    })

    // herokuとかで起動する用

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("OK"))
    })
    http.ListenAndServe(":8000", nil)
}

追加したプラグイン

sysstdプラグイン

  • システム系のプラグイン。基本的にbotContext作るときに強制的にAddPluginしてる
  • Timezone周りの設定や、help表示、linux commandの実行などができる
  • <@bot_name> <command> でcommandの所には、 helpとかtimezoneとかcommand ls -alとか入力する

f:id:kyokomi:20151124205205p:plain

コハエース画像プラグイン

  • kohaというキーワードで雑に反応する
  • 経験値先生が放出したLINEスタンプになるはずだった画像を表示する
  • 先月のブログで雑に紹介済みなので割愛

f:id:kyokomi:20151124205213p:plain

google画像プラグイン

  • <キーワード> image meGoogle画像検索APIで検索した画像を適当に表示する
  • cxとAPIKeyの指定が必要

f:id:kyokomi:20151124205219p:plain

あかりプラグイン

  • <キーワード> 大好きに反応して、わぁいxxxx あかりxxxx大好きをする

f:id:kyokomi:20151124205227p:plain

Twitterでお気に入りした画像をランダムで返すGAE/Goアプリをつくった

ランダムで返す部分が雑にキャッシュしてるのはご愛嬌・・・

https://koha-api.appspot.com/v1/api/image

画像はこちらを利用させていただきました。(経験値先生最高です!さっちん絵がほしかった・・・)

注意!!!営利目的でのご利用はやめてくださいね!!!

お気に入りは適当にアカウント作って作りました。

twitter.com

GAE/Goの実装の方ですが、かなり雑ですが以下になります。

github.com

使い方はREADME.mdに書きましたが、 環境変数だけで一応どのアカウントにも対応できるようにしてます。

需要があれば、もうちょっとなんとかします!

主な使い方ですが、LGTMとかみたいな感じにAPIクライアント作ってしまえばいいかと思います。 自分はGo製のSlackbotでAPIクライアントを実装しました。

github.com

シルバーウィークにいよいよUnity入門した

はじめに

最近Goばかり書いてるのですが、今作ろうとしてるゲームをCocos2d-xで作るのは流石にもう辛いので、コレを期にUnity入門することにしました。

シルバーウィークの月〜水の3日間でサクッと1冊本読み切ってExampleを2,3個作るとこまでやりましたので、その所感とか。

準備したもの

細かいミスだけど、正誤表あるので先に見ておくと良いです。 今の最新版のUnity5.2で挫折しないで最後までいけたので、すごいと思います。 自分みたいなガチ入門者向けかと。

正誤表はこちら => http://www.socym.co.jp/support/s-967#ttlWrong

LOGICOOL ワイヤレストラックボール M570t

LOGICOOL ワイヤレストラックボール M570t

トラックパッド派なんだけど、流石に三次元の動きをトラックパッドで操作するの限界を感じて以前Unity挫折したので先に買っておいた。 買ってよかった・・・普通のマウスでも良かったかもしれないけどUnityで全然使えました。

環境

  • Unityv5.2.0f3

はるか昔にUnity4になる前に触った頃に比べてサクサク動いてる気もするし、色々わかりやすくなった。 買った書籍がよかったのかもしれないけど、ストレスはほとんどなかった。

あと、マウス買ってよかった。以前にMacのタッチパッドでUnity操作しようとしたの無謀だった。 クリックしたまま引っ張るとか、回すとかかなりのテクニックがいるのでおとなしくマウスにしよう。

トラックボールだとマウス移動自体がないので場所も取らなくて楽だった。

Editorやばい

  • Xamarin Studio: 日本語入力できるけど、日本語変換後の入力がスルーされることがあり結構ストレスだが、軽さや補完など平均点は維持してるのでコレに決めた

困ったこと

「変換が」を入力したつもりが「変換あ」になる

「変換」の時点でEnterをして確定してから「が」を入力すればいいのだが、「変換」の確定を「g」の入力でやる癖がもう抜けなくて辛い。(これ文章で説明してわかるのかな・・・)

他にも試したEditorたち

  • MonoDevelop: まだ日本語入力できなくて消耗してるので没
  • ReSharper: JetBrains製品好きとしては・・・と思ったがまさかのMac版なくて/(^o^)\
  • VisualStudioCode: 一番ナウい感じなんだけど、Unity5.2での補完のきかせ方が分からず挫折
  • MonoDevelop: 惜しい所まできていたが、Unityちゃんの描画のためか重くなり没

色々教わったこと・学んだこと

こんな感じでやってた

  • まず章を1つざーっと目を通す
  • 何作るかと何するかをざっくり把握してから、実際にExample作成の手を動かす
  • とにかく作りきる
  • 気が向いたら、ちょこっと改造する

こんな感じにキャラをUnityちゃんにしてみたり。

本読みながら、ポチポチ入力してくのもいいけど、結局図の方ばっかりみちゃって説明読み飛ばしちゃう気がする・・・(図だけで十分作れてしまうのもすごい)

なので、ざっと1回読んでから戻って作って行く感じでやっていくと、頭の中で整理もできて丁度良かったです。

C#なんとなく書ける

なんとなく書けるの良くない。もうちょいUnity自体の理解が深まったら、改めてC#も入門する。

(学生の時になんとなくC#書いてたから、軽く8年ぶりくらいか・・・)

所感

ようやくUnity入門してスタートに立てた感じ。Asset周りがなんか有料ばっかでゾッとしてるんだけど、まあ基本的な機能は揃ってるので、しばらくは手抜きしない方向でいこう・・・(素材周り以外は)

UnityちゃんかわいいよUnityちゃんかわいいよ

GitHubのREADME.mdに貼ったBadgeが更新されない時

なんかRefreshするタイミングとかミスすると更新されないときがあるので、手動でなんとかする方法。

こんなとき↓

f:id:kyokomi:20150823220925p:plain

↑のBadgeの画像URLをコピペして、こうする

$ curl -X PURGE https://camo.githubusercontent.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{"status": "ok", "id": "xxx-xxxxxxxxxx-xx"}

そして、ブラウザを更新すると反映される。

f:id:kyokomi:20150823221033p:plain

参考

Aggressive image caching breaks image badges · Issue #224 · github/markup · GitHub

Goでlotteryという抽選ライブラリを作った

単なるmath/randのラッパーですが。

もしかしたら他にも似たようなやつあるかもしれませんが、見つからなかったので作りました。

github.com

指定した確率

20%の確率で〜みたいな処理をしたいときです。

lot := lottery.New(rand.New(rand.NewSource(time.Now().UnixNano())))

if lot.Lot(20) {
    // 20%の時の処理
}

抽選リストから1件抽選

以下のような複数の抽選対象から1件だけ抽選するときのinterfaceもあります。

  • A: 10%
  • B: 20%
  • C: 30%
  • D: 40%

Prob() intというインターフェースを実装すればOKです。

type DropItem struct {
    ItemName string
    DropProb int
}

func (d DropItem) Prob() int {
    return d.DropProb
}

var _ lottery.Interface = (*DropItem)(nil)

抽選はこんな感じにやる。

lot := lottery.New(rand.New(rand.NewSource(time.Now().UnixNano())))

// 抽選対象リスト
dropItems := []lottery.Interface{
    DropItem{ItemName: "エリクサ", DropProb: 10},      // 10%
    DropItem{ItemName: "エーテル", DropProb: 20},      // 20%
    DropItem{ItemName: "ポーション", DropProb: 30},    // 30%
    DropItem{ItemName: "ハズレ", DropProb: 40},       // 40%
}

// 抽選
lotIdx := lot.Lots(dropItems...)
if lotIdx == -1 {
    // errorです(抽選リストの指定ミスかと)
}

// 抽選結果のItem
dropItem := dropItems[lotIdx].(DropItem)

以下のテストコードも参考にしていただければと。

lottery/lottery_test.go at 2c0264f14a47bf1be830ae12d2c84a90ce9f1ffa · kyokomi/lottery · GitHub

200万回実行した結果は以下になります。

f:id:kyokomi:20150726150526p:plain

2015/07/26 15:51 追記

@tenntenn さんが「袋の中に球が3種類入っていてそれを順次取り出して行く」ような使い方を見つけてくれたので、紹介させていただきます。

ありがとうございます!