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

GAE/Go で LINE Bot を作ってみた

LINE Bot Trial に登録してから、何にも試してもいなかったので LINE Bot を作ってみた。とりあえず echo bot から。

LINE Bot Trial についてはググってください(今は登録できるのかな)。

Go で書きたい & 簡単に管理したいってことで GAE/Go でやってみました。 参考にしたのはこれ。

qiita.com

普通に大量のメッセージが来た時に捌けないので(遊びだから捌く必要はないが)、 callback を受けた時には、メッセージ送信まで行わず、タスクキューにキューを積んでそれでメッセージ送信などを行った。このフローは基本的に鉄則です。

qiita.com

そこまでネットで調べたりだが実装では詰まることはほとんどなかった(LINE の API を叩くのは SDK を使った)。

唯一あったのは http の default client じゃダメだってこと。

下記がコード

gist.github.com

ISUCON6 に参加して負けてきた。

去年同様 gacharion と一緒に ISUCON6 に参加してきました(土曜日)。

担当的には、アプリ 自分で、インフラ gacharion って感じです。 結果は全然ダメで、 最高で約 7K しかでなかった。

最終的なコードはこんな感じ。

github.com

やったこと

  • html の base の継承とか element をやめて一枚のファイルにした。
  • keyword のリストとってくるところで、 filesort するし、コード見ても keyword のリストしか入らないじゃんと思い、 distinct(keyword) にした(最終的には最長マッチが先にするための order by だったのに気づいてやめた)
  • isutar の isuda への統合。
  • star はオンメモリのみ(永続化なし)で行けるなと思い(initialize で truncate しているので)、オンメモリでやった。
  • htmlify のキャッシュ(メモリもあまりすぎているしと思って、結構雑)
  • キーワードをオンメモリ
  • 正規表現をキーワードのリストで回して replace に置き換える

考えたこと

  • htmlify の結果を DB に保存して使えばいけると思ったが、キーワード追加した時にどうするかの案が思いつかずやめ
  • initialize で全てのエントリに対して htmlify をかけてキャッシュをきかせる(5 秒じゃ無理だと思い、 goroutine でやる。ずっと CPU 100 % で張り付いてしまうのでやめた)
  • 差分で置換をすれば早くなると思ったが、キーワード追加のことを考えると無理となってやめた

ほとんどの時間、 htmlify でどうすればいいかを考えていたりしたがいい案が思いつかずにタイムアップ。

自分もずっと htmlify のことだけで、他の案を考えなかったので、何も指示も出せず gacharion がすることがほとんど何もすることができなかった気がする(やっぱり何かまとめ役が必要な気がする)。

キーワード追加の対応を諦め、事前キャッシュとかしていれば 10K は行けたのかなと思ったりはした(それでも普通に敗退だけど)。

strings.Replacer について知っておけばもうちょっとマシな感じにはなったかもしれない。

予選通過の人のやっていたことを見ると、やっていることや考えていたことは間違ってはいない感じがしたので良かったかなと思ったりはしている。その対応の精度とか深さとかは全然相手になるレベルではないけど。

面白い問題で楽しめたので良かった。

また来年もあったら参加したい。

運営の皆様お疲れ様でした。

みんなの Go

Go 好きならみんな読むだろう「みんなの Go」を読んだのでざっと感想を。

みんなのGo言語[現場で使える実践テクニック]

みんなのGo言語[現場で使える実践テクニック]

目次

  • 第1章 Goによるチーム開発のはじめ方とコードを書く上での心得
  • 第2章 マルチプラットフォームで動作する社内ツールのつくり方Windows
  • 第3章 実用的なアプリケーションを作るために
  • 第4章 コマンドラインツールを作る
  • 第5章 The Dark Arts Of Reflection
  • 第6章 Goのテストに関するツールセット

読んでみた感想ですが、やっぱり現場で使っている人の知見が詰まっていて為になるなと思いました。

自分も普段書いていたりしているので知っていることも多かったですが、さらに知識を深めることができたかなと思います。 特に5 章の部分は、基本的に reflect を使うことがなかったので、ほとんど知らないことだらけでした。 今後自分が実際使うことは少ないと思いますが、ライブラリとかになると使っているところもある気がするので、読むときには役立つ気がします。

詰まったときに、見返すと解決できたりするので、手元には置いておきたくなる本です。

Web アプリケーションとかの話(DB のコネクションとかセッションとか)があったりするともっといいなとは思いました(それだけで一冊できますが)。

AWS SNS を使用して FCM 経由で Push Notification

これから Android に対して Push 通知を行おうとした場合、 Google Cloud Message (GCM) ではなく、 Firebase Cloud Message (FCM) を使用すると思います。

AWS SNS を使用する場合、少しだけ GCM の場合と違うので、そのメモ。

FCM の場合の AWS SNS 設定は GCM で設定して大丈夫です。

AWS SNS のコンソールから Push 通知を行う場合、 GCM の JSON 形式は以下のようになると思います。

{
    "GCM": {
        "data": {
            "message": "Push!!!"
        }
    }
}

これだと、 Push は来るが、クライアント側でエラーが出ました(たまたまでははず)。 下記の場合だと、正常に動作しました。

{
    "GCM": {
        "notification": {
            "text": "Push!!!"
        }
    }
}

これに書いてある通りにやったらできました。

stackoverflow.com

pythonのTestでテストケースの動的追加

チェック処理は同じでデータが違うときなどにいちいちtest_aaa、test_bbbと定義するのがめんどくさい時に以下のようにすると楽になる話。

from unittest import TestCase

import requests


class Test(TestCase):
    pass


for user_id in xrange(1, 10):
    def wrapper(user_id):
        def f(self):
            response = requests.get('/users/{}'.format(user_id))
            self.assertEqual(response.status_code, 200)
        return f

    setattr(Test, 'test_user_{}'.format(user_id), wrapper(user_id))

DockerでWebサーバコンテナを作る時に気をつけること

単純にイメージを作ってしまった時に、これはまずいと思ったのでその時対処した時のメモ。

基本的にDockerでWebサーバのコンテナを作成するときに、ソースなどをADDをすると思います。 何も気にせずにADDをしてしまうと、イメージのVirtual Sizeが大きくなりすぎてしまいます。 なので.dockerignoreを使用して余計なファイルはコンテナ上には入れないようにします。 .gitとかはいらないと思うので基本的には省いたほうがいいのかなって思ったりします。

dockerfile内で、git pull github.com/xxxx/web.gitみたいにソースの最新を落としてくるような操作はやめたほうがいいのかなって思ったりしますね。ライブラリとかはいいとは思います。 画像だらけでアプリの.gitが肥大しているものだとちょっとやめたほうがいいかなと思ったりします。

.git*

いらないものを次々減らして行ったら下記のようになりました。 でも1.91GBある。。。

REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
<none>                   <none>              23180c065f92        5 minutes ago        1.91 GB
<none>              <none>              5a62078ba01c        9 minutes ago        4.558 GB
python              2.7                 d833e0b23482        20 hours ago         747.9 MB

Webエンジニアの教科書を読んだ

Webエンジニアの教科書

Webエンジニアの教科書

  • CHAPTER-01 Webエンジニアについて
  • CHAPTER-02 Ruby on Railsでの開発
  • CHAPTER-03 PHPでの開発
  • CHAPTER-04 NoSQLデータベース
  • CHAPTER-05 フロントエンドの実装
  • CHAPTER-06 ログについて
  • CHAPTER-07 データの可視化について
  • CHAPTER-08 環境構築の自動化
  • CHAPTER-09 便利な外部サービス

Webエンジニアの教科書を読んだので少し感想を。

本の対象者が経験2〜3年の人なっているが、幅広い層に有益と思える本でした。

最近のモダンな技術の情報が幅広く載っており一冊である程度は補える。 自分はほとんど知っている内容だったが、良い復習ができたと思っています。

分野が幅広い分、一つ一つはそこまで深くはないので、 これをベースとして自分が進むべき分野を深く知っていくのがいいのかなといいと思います。