タグ

ブックマーク / medium.com/@timakin (19)

  • GAE/Goにおけるコスト最適化 #golang – timakin – Medium

    Go Advent Calendar 2018 2日目の記事です。1日目はtenntennさんの「実装して理解するスライス #golang」でした。 せっかくなので実益に繋がる話を書くべきだと思っておりまして、今回はGoConでGAE/Go 2nd genに対して注目が集まっていたのもあり、「GAE/Goでの運用コスト最適化」について書こうと思います。 (とはいえ、この分野だとGCPUG界隈のsinmetalさんやvvakameさん、apstndbさんあたりが圧倒的に詳しく、僕が書くことに関してはやや恐縮するのですが) どれくらいコストを減らしたかサービスを運営する中で、クライアントからAPIが叩かれるだけでなく、クローラー等による大量のアクセスがある場合、いくら小規模でもかなり費用が可算できます。そしてそれは安いと評判であるGAEでも例外ではありません。 お財布が困窮していたわけではない

    GAE/Goにおけるコスト最適化 #golang – timakin – Medium
    peketamin
    peketamin 2018/12/03
  • GoのAPIのテストにおける共通処理

    GoAPIを書くとき、参考になるユニットテストの話は非常によく見ます。Table Driven Testをしましょうとか、サブテストの実行とか、そのあたりの話はたくさん書かれています。 また、テストキャッシュなども出てきましたので、ユニットテスト周りの機能・ノウハウは充実していると感じてます。 一方で、httptestを使ってテストサーバーを立て、リクエスト/レスポンスの内容を検証する場合、単一のリクエストを検証する程度のサンプルにとどまっていたり、あまり共通でこういう処理を書いてるよ、みたいなノウハウがなく、自前で一から書くとなると非常に腰が重くなります。 事実自分はそういう経験をしました。そういった共通処理は普段internalパッケージの中の、testutilsとしてまとめる、などしています。 今回はGoで上記のようなテストを書く場合、どういう共通処理が必要となったかをテーマとして

    GoのAPIのテストにおける共通処理
    peketamin
    peketamin 2018/10/09
  • 最近、クエリビルダーを使うのがだるい

    クエリビルダーやORMを使うのは基的に良いこと。 特に開発初期とかはレビューの時間も足りず、クソみたいなクエリを書いてしまったりするので、それを防止するためにも、ライブラリでリスクを担保してあげるのは大事なこと。てか大体は慢心によってそういうの使わないって選択すると失敗すると思う。僕は失敗する自信がある。 自分もGoで開発する時、MySQLに対してのクエリを書く場合は、以下のクエリビルダーを使っている。一部ビルダーでJOINが使えなかったり、サブクエリの書き方が特殊だったりするが、それ以外はだいぶライトな実装で満足している。 ただ、最近サービスもすくすく育ち、レビュー体制が堅実になっていく動きの中で、クエリビルダーを使うのがダルくなってきた。 なんでかというと、多分以下の2つの理由でだるい。 サービス規模に応じて諸事情を孕んだ複雑な実装が生まれるが、その複雑さをクエリが吸収してしまい、メ

    最近、クエリビルダーを使うのがだるい
    peketamin
    peketamin 2018/08/02
  • Goのreflectパッケージはいつ使うのか

    Goを書いていて、実際のユースケースに遭遇するまでメリットが実感できないものとして、reflectパッケージが挙げられると思います。 実際のところ、reflectパッケージで取れる情報についてはいろんな記事でまとまっているものの、じゃあそれを使って何ができるんだ、実益があるのかという点を体感する機会は人によりけりです。 よくある説明と違和感「メタプロ的なことができるぜ」「構造体の情報を取得してあれこれできるぜ」という説明を受けることがありました。 ただ、僕的にはいまいちイメージが掴めずにいました。おまけにパフォーマンスに負の影響があるから基的には使わないものとして認識している方が多いと思います。 lestrratさんの少し前の資料とかを見て、そんな感じのイメージでいました。 Goを学習した時に、goroutineとかは利用場面に比較的に早くから遭遇できる一方、reflectパッケージはい

    Goのreflectパッケージはいつ使うのか
    peketamin
    peketamin 2018/04/19
  • プライベートでコードを毎日書き続けて2年以上が過ぎた

    いつの間にか2年間継続してコードを書いていたので、その振り返りです。上のインコは日々僕を応援してくれる二羽のインコのうちの一羽です。この後をボロボロに噛みちぎっていきました。 1年目との違い去年こんなポストを書きました。 このとき、自分はコードを1年継続して書いたわけですが、その後また1年継続してコードを書いていました。 1年目とは「書きたい」と思うものも変わりました。また、習慣を維持する労力も小さくなり、コードを書くことそのもの以外の、登壇などの時間を取れるようになりました。 この1年で新たにやったことツール作成markdownをMediumポストにするCLIツールAWS SSMで管理されたパラメーターを環境変数にInjectするツールGoogle Cloud Platform API向けに使える、goonと同様のDatastoreクライアント基盤作成AWS上にTerraform+An

    プライベートでコードを毎日書き続けて2年以上が過ぎた
    peketamin
    peketamin 2018/02/26
  • プログラミングとUIデザインの境界、およびデザインの環境設定について

    今回言いたいこと・UIデザインとそれを書き起こすプログラミングの乖離は、いくらわかってるつもりでも想定より大きくなる ・工数や実装都合上、泣く泣く見た目を変えざるをえない場合のデザイナーのストレスは、スピード優先で設計がおろそかになったときのエンジニアにかかるストレスより大きいのではないか ・雑にプロトタイプを出していい時代は終わってるのでは?と思うので、デザインを勉強していくべき 「デザインを勉強したい」 学生の頃から、dribbbleやbehance、デザイナーブログをみるのが大好きで、「うわーこんなかっこいいロゴ思いつかないよ、すげー」とか、「フォントの微差によく気を使ってるんだなー」とか、「このサイトの余白は過剰だけど、こっちはいい塩梅だなー」とか、そういうのがかなり気になってしまうタイプでした。 というと聞こえがいいのですが、結果的にエンジニアの道を選んで、UIは実装しながら考え

    プログラミングとUIデザインの境界、およびデザインの環境設定について
  • 2017振り返り

    まとめGunosyに転職したGoにコントリビュートしたDribbbleにデザイナーとして登録できた発表割と多くしたetc転職今年3月に株式会社Gunosyに転職してました。僕が職場楽しいって喧伝するってよっぽどなのでみなさん安心してきてください。 職場ではGo/SwiftエンジニアとしてLUCRAというアプリに立ち上げ期から関わっておりました。あとは技術広報的なところとか、採用に関与してました。 内容としては、Goのサーバーサイドの認証、記事配信、PushなどのメインAPIから、リリースまでのiOSほぼ全体を作りました。

    2017振り返り
    peketamin
    peketamin 2018/01/01
  • Goのパッケージ構成の失敗遍歴と現状確認

    この記事は Gunosy Advent Calendar 2017の5日目の記事です。前回の記事はGunosyのパーソナライズを支える技術 -ワークフロー編-でした。 GoAPIを書くときの問題僕の在籍するGunosyはGoを昔(?)から番採用しておりまして、ノウハウも潤沢に溜まっている企業だと言えます。 しかし、contextの扱いやベストなパッケージ構成、テスト、net/httpでAPIを書くノウハウなどなど、迷うことは多々あります。 これは弊社特有の事情ではなく、Goのサーバーサイドエンジニア全員にとっての問題です。中でも、パッケージ構成をどうすればいいのか(相互参照せずに快適に開発を進められるパッケージ構成とは)を見つけるのは結構難しく、各々のチームにお任せ、という状況です。 今回は上記の問題のうち、パッケージ構成に踏みこんで見たいとおもいます。会社でもよくパッケージ構成をどう

    Goのパッケージ構成の失敗遍歴と現状確認
    peketamin
    peketamin 2017/12/05
    “僕なりに試行錯誤したGoのAPIの失敗遍歴と、現状のパッケージ構成の確認” ありがたいです…mm
  • mercari/datastore実戦投入

    DatastoreについてみなさまGCPをお使いになっているでしょうか。 GCPにはバックエンドのDBとしてCloudSQLというRDBと、NoSQLであるDatastoreというのがあります。 周囲の事例を聞く限りは、マスターデータなど変化が少なかったり、seedデータ的なものを用意しなければならないものをのぞいて、基的にDatastoreを利用している印象です。 また、GAEで開発する場合はinternalなAPIからDatastoreを利用できる一方、GKEなどからは、GCPの外部向けAPIを呼び出すことでデータを送受信します。 さて、自分はいつもGoAPIを書くのがいいよ!と触れ回ってるわけですが、GCP上で開発を進める際には前述の通りDBにはDatastoreを使っています。 このDatastoreですが、そのまま使うと自前でキーを発行する必要があったり、値をキャッシュしたり

    mercari/datastore実戦投入
    peketamin
    peketamin 2017/11/24
  • エンジニアはどのように他のアプリのUXを参考にすべきか

    問題意識エンジニアのタイプを分けるとき、大雑把に「サービス志向」と「技術志向」みたいな分け方をすることが、僕の周りではよくあります。 個人的にはこの分け方は必ずしも良いものとは言えないと思います。少しエンジニアのことをサービスと距離のある人種として捉えてるように感じるからです。 技術志向だからってサービスのことを考えてないということではなく、「よりセキュアな技術を採用する」「効率的で安全なデプロイができるフローを構築する」などなど、技術向上を通じてユーザー体験をよくしよう、としているはずです。 ただ、デザインを良くしたり読み込みスピードを早くしたりなど、「目に見える範囲で改善する施策」を考え、実行しなければ、プロデューサー的な人からすれば「何やってんだろうな〜」と、エンジニアはブラックボックス的な人に見えてしまうこともあると思います。 じゃあ他のアプリをいじってみたりして、サービス勘みたい

    エンジニアはどのように他のアプリのUXを参考にすべきか
    peketamin
    peketamin 2017/11/21
  • Goでサーバーレス動画変換

    概要よくGoogle App Engineに関する記事を書くのですが、今回はAWSです。 APIサーバーでGoを使うことももちろんありますが、他にもgo-apexでLambdaファンクションを書く場面というのもあると思います。 以前go-apexのdeployについての記事を書いたので、それは下記を別途ご覧ください。 今回はElastic Transcoder(動画のエンコーダ)を例にサーバーレスにGoが役立つ実例を紹介します。 やりたいことS3に動画をアップロードするアップロードの通知を元にlambdaが呼ばれるElasticTranscoderを呼ぶエンコード結果をS3に保存するというフローです。今回扱うのは、3の部分です。1,2,4の部分は別途AWSの設定が必要で、個人的にはterraformでやるべきだと思っています。 go-apexでのエンコード処理まずlambdaの中で真っ先に

    peketamin
    peketamin 2017/11/06
  • ARアプリについての雑感

    概要2017iOS11になったのでARアプリをちょくちょくインストールしているが大変楽しい。 出たてなのもあってまだ母数は少ないけど、どれを触ってもダメだなーというのはなく新鮮さに溢れてる。 個人的な興味もそうだけど、自分が今身を置いてる部署も新規事業について考えるところなので、触っておくに越したことはない。 今回ストアにフィーチャーされてないがそれなりに有名なアプリも含めて、アプリの傾向なり体験の問題とかを感じたので、いずれ誰かと話す時用にメモを残す。 個人的な分類既存のアプリは大まかに分類して、 空間計測空間ペイント規定モデルの設置と鑑賞単純なモデル設置だけでない箱庭の設置などの用途でアプリが使用できる。 空間計測AirMeasureとかがこれ。

    ARアプリについての雑感
    peketamin
    peketamin 2017/09/29
  • 「今年は…何か大きめのOSSにコントリビュートしたいですね」

    これはポエム。 先日、晴れてGoにContributeできまして、積年の目標であった「なんか大きめのOSSにコントリビュートする」を達成した。 これは前から当にやってみたかったことで、Issueを立ててはCloseされ、をRubyやらGoやらで何度かやった末のコントリビュート。 割と一個のマイルストーンを経た感じがして、個人的には感慨がある。 OSSにコントリビュートしてみたいそもそも、プログラミング初めてからというもの、「Rubyにpull-req送ってます」とか、言語そのものへのコミットにはかなりの憧れを感じていて、社会人になる前後からというもの、3年前くらいから、何か面談とかで目標を聞かれるたびに、ずっと「技術的には…言語とか有名なソフトウェアへのコミットをしてみたいですね…」と言っていた。 とはいうものの、心理的障壁が高くて、自分のような技術力でできる気がしなかったのと、ソースを

    「今年は…何か大きめのOSSにコントリビュートしたいですね」
    peketamin
    peketamin 2017/08/14
  • AWSで秘密定数を外部に公開せず環境変数として定義するためのGo製ツール、「ssm2env」作った

    ssm2env - Environments injection tool for AWS EC2, with SSM (EC2 Parameter Store). 詳細環境ごとに異なる秘密情報をAPIに渡す際、その管理方法は、twelve-factor appにもある通りデプロイ対象のサーバー内部の環境変数として定義するべき。 ただ、自動化されたデプロイフローでは、どういった手順で秘密情報を渡せばいいか悩むことが多い。 自分が考えた範囲では、 1. AWSのSSMにTerraform経由*1でシークレットな変数を設定 2. APIのデプロイ時にSSMから特定prefixのついたパラメーターを取得 3. パラメーターを全て環境変数として読み込ませる 4. APIが起動する際に秘密情報を定数として環境変数から読み込む*1) 正確にはCircleCIの環境変数設定に事前に入れた状態で、Circ

    AWSで秘密定数を外部に公開せず環境変数として定義するためのGo製ツール、「ssm2env」作った
    peketamin
    peketamin 2017/08/03
  • TDD of Infrastructure as Code on CircleCI 2.0

    概要Docker + Ansible + ServerSpec + CircleCI 2.0でTDDなCIビルドを行う話です。 今僕が在籍している企業では、プロビジョニング周りはAWS OpsWorksで管理されており、Chefのカスタマイズレシピが適用されて、ポンっと環境が構築されます。 個人的にはChefとItamaeの運用はしたことがありますが、OpsWorksを除けばAnsibleの方がStar数も多く活発に使われていそうなのと、どうせならDockerとServerSpecを使ってポータブルなテスト環境を作ってみよう、それをCircleCI2.0で効率的に回そう、と思い立って、やってみました。 ディレクトリ構成. ├── Dockerfile ├── README.md ├── ansible │ ├── ansible.cfg │ ├── ci.yml │ ├── circlec

    TDD of Infrastructure as Code on CircleCI 2.0
    peketamin
    peketamin 2017/06/15
  • kazeburo/choconと、それを支えるnet/httpの実装について

    【資料公開します】AWS Dev Day Tokyo 2017 にて登壇しました/choconの簡単なご紹介 - Mercari Engineering Blog こんにちは。SREの @ kazeburo です。2017年5月31日から6月2日にAWS Summit Tokyo 2017と同時に開催された「AWS Dev Day Tokyo 2017」に登壇しました。 登壇する機会をいただき、ま… 先日、というか昨日、この資料が流れてきまして、Private Networkの外部との通信を効率良く行うためのミドルウェア、choconというproxyサーバーが紹介されていました。SSL, HTTP/2を加味した上での超シンプルで高速なforward proxyサーバー実装という印象です。 使い方やAPIの叩き方は上記のリンクを参考にしていただくとして、やたらマイクロな実装でなぜこうも高速に

    kazeburo/choconと、それを支えるnet/httpの実装について
    peketamin
    peketamin 2017/06/06
  • 継続してコードを書くということ

    この度、githubへの一年間連続コミットを達成していたらしいことを確認しました。途中から平日、仕事の分も混ざっているのですが、プライベートでのコミットは毎日確認していたので、ちゃんと一年間継続できているはずです。 当初はどういうものを開発するのか定まっていなかったり、謎の練習コードばっか産まないか心配だったのですが、継続してコミットを続けていくことで、徐々に目的意識を持ってコードを書くのにも慣れてきました。 そこで、この一年でどういう考えで開発過程をたどってきたか、どういうものを開発してきたか、これからどうしたいかについて書こうと思います。 どういう考えで開発過程をたどってきたか最初は継続性のみを重視1年前と今とでは、コードを書き始める時の意識も少し変わったなと、今は思います。 1年前はどんな形であれ継続できるようにコードを書いて、たまにdotfilesいじったりとか、遅くに会社を出ると

    継続してコードを書くということ
    peketamin
    peketamin 2017/02/16
  • Goで作るDBレプリケーションツール

    gopli - DB replication tool to synchronize data with multi environments written in Golang. ツールの名前はgopli (go replication)で、意図どおりの名前ですね。 これは何tomlで書いた、ssh/db接続用の設定ファイルを元に、特定の環境間でデータを同期させるツールです。今の所MySQLのみ対応で、postgresqlに対応しろと言われたものの、なかなか手が回っていない状況です。 使い方は簡単で、 まず以下のように、 sshでのサーバーへの接続と、MySQLへの接続設定をtomlで書きます。 [database] [database.local] host = "localhost" management_system = "mysql" name = "app_developmen

    peketamin
    peketamin 2016/12/25
  • やっぱブロックチェーンダメっぽい

    デジタル台帳「ブロックチェーン」が支える仮想通貨ビットコインを何百万人にも紹介したステファン・トーマス氏は、心変わりした。 この記事、最初見たとき釣りかと思ったけど、釣りではなく「まあそうだよね」と言う意見だった。 ここで言われてるのは 金融機関の政治問題合意形成コストの2つが課題でブロックチェーンが実戦に不向き的なこと。 1個目は人の問題なので置いとくとして、2個目が散々。 計算にマシンパワーが必要なのと、その結果を全ノードに等しく伝えるのに何日もかかる & その過程で生じた履歴がもし採用されなかったら破棄される可能性もある。 これらの点から「速くて、堅牢な、低コストの取引台帳」なんてものはないの明らかなので、登壇テーマとして用いた身なのを棚に上げながら言うと、すぐさまこの界隈は沈静化してほしい。 ハッシュ値を最も早く生成し、その結果その解答者以外の履歴はあっていようが間違っていようが場

    やっぱブロックチェーンダメっぽい
    peketamin
    peketamin 2016/08/27
  • 1