muzigram

山椒は小粒でもピリリと辛い

2016/09/30

LineBot動かしてみた #golang #linebot #heroku

始まり


  • LineさんのStreaming APIが公開されたようです。
  • とりあえずやれ(JUST DO IT)動かすぞの精神で動かします。 
  • 今回はGoとHerokuを使います

 JUST DO IT!!!!


今回はGoとHerokuを使います。理由は以下
 コードとりあえずGithubに。(と言っても、SDKに入ってたエコーをherokuに上げるように修正したのみ。
  https://github.com/mogeta/lbot

手順、および詰まった箇所等


  • そもそも、どこから登録すんだ?
  • channel_secret?channel_token?どこだ?ってなるので、素直に動画見たほうが良い。
  • webhookに指定するURLはhttps必須。とりあえず試す場合、herokuやLet's Encryptに頼ることになるかな?
  • IPのホワイトリスト指定。起動して、対話するとこんな感じでログが出てる。ひとまず動かすだけなので、指定されたアドレスをさくっと登録しときましょうねー。
linebot: APIError 403 Access to this API denied due to the following reason: Your ip address [<ipアドレス>] is not allowed to access this API. Please add your IP to the IP whitelist in the developer center.

herokuで起動の手順


  • herokuにユーザー登録。
  • herokuツールベルトのインストール
  • 後は各自、コマンドライン上でコマンド打っていく
  • 大体公式の手順書に従う感じでやれば問題ない、Goの場合はここ
  • heroku create 
    • >これだけでサーバーが立ち上がる、URLとgitリポジトリが示される
    • >デプロイしたいアプリがあるディレクトリでかつ、git initしとくとherokuというリモートを追加してくれる。
    • >というかgit initしてなくて、コマンドが動かんぞ?ってやってた。
  • herokuにgit push
  • 環境変数を指定。
    • >herokuのページから立ち上げたサーバーのSettings->Config Variables
    • >CHANNEL_SECRET
    • >CHANNEL_TOKEN
    • >それぞれLineの管理ページから取ってきましょう

動かしてみた

動いたーやったー。特に感動はないけど。
たまに反応してないのはホワイトリストに登録してないアドレスから来てるからっぽい。知識とheroku力が足りてないのでとりあえずスルーしてる。


終わりに

 優勝賞金1,000万円の「LINE BOT AWARDS」があるらしいのでなんか作ってみようぜ。つーことですね。

参考URL
https://github.com/line/line-bot-sdk-go
https://developers.line.me/

2016/09/29

サービスを作りたいエンジニアってなんだろうなー。リアルウォンテッドリーに行ってきた。

リアルウォンテッドリーに参加してきましたよっと。
お酒も入ってるけど、一気に書かないとブログ書かないなと思ったので。
(エンジニアという表記がブレてるなーと思ったけど、大体ITのエンジニア、いわゆるWeb系プログラムを書いたりする人と思ってください)
あ、コーヒー、めっちゃうまかったです。↓
 自分のような緊張しいには面接の場よりも数段カジュアルに仕事や技術のことが聞けたのでだいぶありがたい集まりでした。(それでも緊張してかなりしどろもどろ感もあったけど)

 どういうエンジニアを求めていますか?という質問をすると、多くの企業で「サービスを作りたいエンジニア」もしくはそれに準じたニュアンスをもらった。自分はどちらかと言えば、技術を追求して価値を高めるエンジニアではなく、今ある状況、使える技術においてどのように最大利益を追求するか?というエンジニアだと自負しているのでこの点に関してはだいぶ心強いなと思った。(ちなみに、自分と仕事をしたことがあるエンジニアや同僚に聞きたいんだけど、この点ってニュアンス合ってます?技術を追求する方のエンジニアって思われてる?)

 余談)前職ではベトナムのエンジニアと協業でゲームを製作していたのだけれど、エンジニアとしての仕事よりも、ゲームの仕組みづくりやどうやったら広告を見てもらえるか、ユーザーが続けたいと思うモチベーションはなにか。どうやってゲームが遷移するのか。みたいなのを考えてることが多かったなーなどとつくづく。一年かけて、結局3,4回フルスクラッチで作り直してポシャったんだけど。)

 ところで「サービスを作りたいエンジニア」ってなんだろう。という根本的な疑問が湧いてきている。思いつく限り、適当に羅列していく。

  • 企画から参加し、意見を出せるエンジニア
  • 改善案を提案出来る。
  • 自分ごとのように考える。
うーん、もうちょい具体例を出したいな。どういうのがいいだろう。自分はゲーム業界畑だったのでそちら側に流れがちになるけど。
  • どのタイミングで動画広告だす?それってユーザーがみたくなる?、じゃあこのタイミングで(ry
  • この数字が撃破したモンスターだと伝わるように魂的なエフェクト載せません?
  • PCとかスマホとかゲームのビュー複数持つならサーバー側APIにしてSAPに挑戦してみます?
一方でサービスを作るITエンジニアとして自分が弱いなーと感じる部分
  • 金になるコンテンツを企画する。金を払いたくなる機能
  • データ分析に基づく提案
技術に基づく提案っていうのがアプローチとしては一番かっこいいんだろうな。なかなか、過去のキャリアでそういうのって言えてないな。

 でもそれって今では割りと普通のプログラマ、エンジニアなんじゃないかなーという気もする。(業界にもよる?)。Web寄りの会社なんかだとアジャイル、スクラム。といった単語が浸透して、タスクも「プログラムの機能一つ」という状態から「ユーザーストーリーの完成」という状態になってきて、「プログラムや機能を作って終わり」ではなく「サービスとしてユーザーに使ってもらう」「金を産んで完成」という形になってきたんだなと。

ーーーーー区切り線ーーーーーー

 なんでこんな支離滅裂な文章書いたかっていうと、自分は「サービスを作りたいエンジニア」だと思っているけどそれを、転職時アピールとして「なぜならこういうことをやってきたし、これからもこういうことをやりたいと思っている」にどうやって昇華させようか、という悩みに直面したから。

 今までは「ゲームを楽しむ人を増やしたい、だから誰でも手に取れる携帯ゲームを俺はやるんだ」とか「世の中がどんどん便利になって、豊かになっていくのなら、最後に求められるのはゲームだろ」って思うところがあってゲームをやってきたけど、ソーシャルゲームやガチャ、課金システムに対して、うまく折り合いがつけられない。

 ゲームじゃない業界にもいた事あるし、そもそもパチンコ、パチスロの仕事をしてた時はゲームじゃねえよなぁ。と思ってたので他業種でも全然構わないとは思ってるけど、外から見た人は自分を「サービスを作りたいエンジニア」としてちゃんと評価してもらえるのか。という疑問もある。


まとめじゃないまとめ
  • サービスを作りたいエンジニアとしての自負はあるけど難しいね。
  • Go言語の仕事してみたいけど、Rubyおおいねー。(白目
  • 元ゲーム業界です。って人多いなー。スマートフォンゲーム一段落感
  • どのジャンルのエンジニアも募集してます。のお互いの難しさ
  • 自分のような浅く広くなんでもやってました的なエンジニアの難しさ。
 リアルウォンテッドリーはどんなスタートアップがあるのか?とか話気軽に聞いてみたいなーってフェーズの方はかなりおすすめな感じがしました。ありがとうございました。今、暇なんで職やら仕事は募集中です。

2016/09/25

GoとDockerのお勉強 #golang #docker

始まり

ISUCONの敗北から、もう少し体系的にWebサービスの作成を学ばなければ。と思い始めたので唐突にDockerから始める。Dockerについて、ガッツリ説明するというよりかは、自分の知識の再確認。メモの用途が強い記事。

一言まとめ

という流れ。

環境など


Goのバージョン
go version
go version go1.7.1 darwin/amd64
Macの環境
sw_vers
ProductName: Mac OS X
ProductVersion: 10.11.6
BuildVersion: 15G1004
Docker周り
docker -v
Docker version 1.12.1, build 6f9534c
docker-machine -v
docker-machine version 0.8.1, build 41b3b25
docker-compose -v
docker-compose version 1.8.0, build f3628c7
VirtualBox バージョン 5.1.6 r110634 (Qt5.5.1)

インストールはここから、Docker for Macを選択。
https://docs.docker.com/engine/installation/mac/

公式の導入記事

https://blog.golang.org/docker


  • サンプルをgo get
  • Dockerfileを書いてあるとおりに書き換える

# Start from a Debian image with the latest version of Go installed
# and a workspace (GOPATH) configured at /go.
FROM golang
# Copy the local package files to the container's workspace.
ADD . /go/src/github.com/golang/example/outyet
# Build the outyet command inside the container.
# (You may fetch or manage dependencies here,
# either manually or with a tool like "godep".)
RUN go install github.com/golang/example/outyet
# Run the outyet command by default when the container starts.
ENTRYPOINT /go/bin/outyet
# Document that the service listens on port 8080.
EXPOSE 8080

とこのようなことをやっているよ。なんだけど、onbuildというDockerfileを使うと以下の様に出来るぞ!と書かれている。(書き換えたのは一体…(まぁ、こんな動作するんやで。と。)

FROM golang:onbuild
EXPOSE 8080
ONBUILD
ってなんやねん。
http://docs.docker.jp/engine/reference/builder.html?highlight=onbuild#onbuild
イメージ構築時に実行される命令なんかを記述する。なるほど?
 Goの環境を作った際、「実行するコードをコピー」「ビルド」「インストール」
なんかを予めonbuildしとくことで毎回専用のDockerfile作ってーとかやらずにアプリ用の設定に集中出来るってことか。と解釈。go-wrapperにその辺、まとめてある。

おもむろに、docker-machine

Dockerを動かす環境を自分のPCやAWS、指定のVPC等に用意できる。
docker-machine create --driver virtualbox local
上記コマンドだと、VirtualBox上に環境を構築、localって名前をつける。
docker-machine ls
NAME             ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
local            -        virtualbox   Running   tcp://192.168.99.100:2376           v1.12.1
上記コマンド: docker-machine ls
にて作成した環境の一覧等が見れる。
docker-machine env local
eval $(docker-machine env local)
envでその環境を動かすための環境変数一覧等が表示される。なお、そのコマンドをevalすることによってその一覧を適用出来るようになっている。

ビルドする!

docker build -t outyet .

  • 現在位置のDockerfileの内容でビルドする
  • タグ名はoutyet 

実行する!

docker run --publish 6060:8080 --name test --rm outyet

  • dockerの8080を6060で受け付ける。
  • 名前はtest
  • 終わったらイメージを削除
  • outyetを実行するよ!

これ、どこで確認できんの!?

docker-machine lsした際にURLが表示されているので、http://そのアドレス
でアクセス。

あ、表示されてますね。やったぜ!

まとめ。
  • Goに公式のDockerfileがある。onbuildを利用すると、Dockerfileの記述を減らせる。
  • docker-machineでdockerを動かす環境を構築
  • docker-machine lsで作成した環境一覧表示
  • docker-machine envで動作させる為の環境変数一覧

次はdocker-composeと、VPS環境での実行辺りを




2016/09/19

ISUCONにてGoの正規表現で爆死 #ISUCON #golang

概要

基本的には表題の通りです。惨敗。

http://isucon.net/に参加してました。
メンツは去年と同じく自分、@ayumu83s@roro0000
チーム名は「瞬殺の美学」集まったときにみてたナショジオが由来。瞬殺どころか
問題にじわじわなぶり殺しだったわ。
選択した言語はGo。
なるべく一週間に一回、「ざつもく会」と称して復習をしてました。
去年は初参加で準備もそんなにできなかったため、自分は無能感を否めない感じでした。
今年は今無職なうでど暇(いや、面接なんかはしてましたけど)なのでサーバーサイドでのGoを色々キャッチアップする猶予があり、やってやるぞ!という気でいました。(仕事のご相談があればご連絡くださいてへぺろ)

問題について

 一応説明しておくと、http://anond.hatelabo.jp/のようなサービスをいい感じにスピードアップしろ。という問題が出題されてました。Go言語を選択した我々は

reg.ReplaceAllStringFunc(content, func(kw string) string {})

特定のキーワード(そこそこたくさんある)を文章内に見つけたらそれをリンクつけた形に変換する。をどうやって改善するかに失敗し、failした形になります。

当日の流れ

時間は曖昧です。

9:30くらいに集合

  • 朝、くっそ眠いけど自分は家だったので比較的気楽、@ayumu83s @roro0000はおつかれさまです。
  • HOOOOOO!!!!とか言いながら無理やりテンション上げてました。

10:00

  • 開始、順調にインスタンス立てる。@roro0000の下準備が光る。
  • $GOROOT、$GOPATHでガッチャガッチャする。今時$GOROOT???と自分も混乱する。
  • @ayumu83sが$PATHを書き換えて無事死亡。戦犯ポイントを稼ぐ
  • @ayumu83sがリアルな方の仕事に巻き込まれる。土曜デプロイ乙

12:00

  • 毎回regexpのやつ生成してるのあからさまにだめじゃね?
  • キーワードとハッシュのリストもとりあえず持っとくか
とか、毎回やる必要のない作業をinitに持っていく作業をする。
反省点としてはここが大きい。この時点でもっと細かく計測作業をするべきだった。
推測するな 計測せよ

13:00

ココらへんでお昼を食べたりしながら、「一回細かく速度を取ってみてどういうデータが入ったときどこが遅くなるの?」をやろうと相談。

@ayumu83sがisudaとisuterの統合作業、UNIXドメインソケット、グローバル化した変数に追加処理等の実装をごりごり入れる。

15:00

「ビスマルク級戦艦」だったかなにかの説明がめっちゃ長くて、これを処理するのに10秒程かかってる。ということが判明。ハッシュをリンクタグに変換する工程は早かったので
どちらにしても正規表現のところをどうにかしないとアカン。

@roro0000氏が「。とか改行コード」みたいなのでパラレルに処理できないっすか?というのでそのコードを書き始める。こんなのー>https://play.golang.org/p/TeFPJ325Pu

17:00

この辺から、やはりGoの正規表現は絶望的に遅いのでどうにかしなければ
という風潮になった記憶。

strings.contains & strings.replaceに切り替えて
0だったスコアが280点とかになる。しかし、Fail。うーんマジカ。。。。。

ちなみにこの処理だとハッシュに変換したもののなかの数字をもう一回ハッシュにして死ぬ。という罠が出てきます。

17:50

strings.replacerだったのでは?ということに気づく。
  • あー、見てた!見てたのに
  • 正規表現遅いってのは知ってたのになぜ目をそらした
  • 辛い
  • もういい、とりあえずこの処理にしてページ/ が早くなるかだけ見るぞ

18:20

ページ/が早くなったのをみて無事死亡

感想

観測
遅いものは遅い、Goの正規表現
正確な知識

正確には観測の単位が大きすぎたなーと。
関数内のどの処理にどのデータが入ったときにだめなの?まで追っていれば正規表現をどうする?にもっと早く至れたのかなと。

あと、正規表現は重い。というのは知っていたのにそこから目をそらし続けていたかなと思ってます。(適切な処理を思いつかなかったというのもありますが)

正確な知識。けっこう限られた時間で作業をしていたのに「これでいいと思うんだけど、あれ?どうだったかな?」となってググったり、確認する。という作業で時間を取られちゃいました。いや、そこはこうだよ。とか断言できる断言力が足りないなと感じました。
(上の正規表現もそうですね。遅いと思ってたけど、遅いから変えないとダメだ!と)

去年よりは自分は戦えた(ポイントアップに貢献できた)と思っていますが、いかんせん
スコアがPASSしなかったし、予選突破のボーダーラインにも絡めなかったので勉強不足でですね。次回開催があればリベンジしたい。

主催、協賛の方々、ありがとうございました。
@ayumu83s@roro0000次こそ予選突破しましょう。

2016/09/16

Firebase と Androidで認証、ストレージ、データベース #firebase

始まり

飲み屋で今日のメニューとかを通知出来るアプリがあると良いんだけど。
と相談されたのでFirebaseでいっちょやってみるか。とやってみました。
結論から言うと、コードラボをやりましょう。認証、データベースへの登録、表示等の扱い方を理解することができます。

やったこと

  • カメラを起動して、データを登録するAdminアプリとDBから一覧を表示するサポーターアプリの2つを作成。
  • アカウント認証 ->Googleアカウントで認証
  • 写真をとってFirebase Storageに保存。
  • 上で保存した画像のURLを取得。
  • タイトルや値段を設定してFirebase Databaseに保存
  • Databaseから一覧を取得して表示、画像のURLを取得して表示する。

スクリーンショット


ドキュメント、参考URL等


DBの書き込み権限を抑止する。

今回は、adminアプリ側で認証した人だけが書き込めれば良いので以下のようなルールを設定ユーザーUIDユーザー登録後、Authのページから参照できます。
{ "rules": { ".read": true, ".write": "auth.uid == 'ユーザー UID'" } }

各種機能のコード断片

ソースコードの断片等

storageへの保存
ディレクトリを作成しときましょう。(直下に上がると管理が…
gs://<your-storage-url>/new_dir/みたいな感じ。
https://gist.github.com/mogeta/d8abda24799d407673af3c7f908e927f ---- ----

databaseへの反映
事前にテーブルを用意する必要がなく、DTOを指定するとそのままの形でデータが突っ込まれる。これすげーな。
あらかじめ、DBのURL設計はしといたほうが良さげ。
カラム?の追加が発生した場合はそういうプログラムを毎回書くことになるのかな。

consoleからはこんな形でデータを確認出来る。


https://gist.github.com/mogeta/c4c1ec6e3e7efc1accc8fced8c10c2f7 ---- ----

感想

  • 小規模のアプリだったらFirebaseの無料アカウントでなんとかなるなーという感じ。
  • Push機能もあるのでお昼のメニューを更新したら全員に通知とか、今日は休むよ!みたいなのも実現できるでしょう。
  • FirebaseRecyclerAdapterがめっちゃ楽。Firebaseの更新がリアルタイムで反映されます。
  • コードラボで勉強が捗りそう。