仕事中の問題と解決メモ。

最近はPythonとGoogle Cloud Platformがメイン。株式会社ビズオーシャンで企画と開発運用、データ活用とか。 http://mstdn.bizocean.co.jp/@uyamazak https://github.com/uyamazak/

Google Cloud Pub/SubのPythonクライアントがメモリリークするので調査して解決?

oceanusのpubsubからデータを受け取り処理を行うrevelationで、pubusbをRedisからGoogle Cloud Pub/Subにしたところ、メモリリークが発生した。データはbizoceanのイベントログが送られてきて、一つ数KB、~10メッセージ/秒が来る。起動時は50MBだけど1時間…

Dockerのコンテナ数が増えてきたのでdocker composeを導入した

自社の低予算ビッグデータ基盤oceanusのローカル環境での起動をdocker-composeを使ってできるようにした。GitHub - uyamazak/oceanus: Save all data to Google BigQuery. Fast and row cost using Docker and Kubernetes on GCPこれまでは、それぞれのコン…

新しい技術の習得がつらい人とつらくない人の違いを考える

一応、WEB系エンジニア的な仕事をし始めて9年ぐらいになる。よく周りの人にそういう仕事をしていると話をすると「新しい技術についていくのは大変でしょ?」と言われるし、そういう仕事をしている人の口から聞こえてくることもある。でも個人的には、全然つ…

東銀座でビズオーシャン勉強会参加者募集 Dockerとかビッグデータとか

ビズオーシャンで技術力向上と伝える力の強化のために社外の人も交えた勉強会をやりたいと思っています。希望者はコメントください。 場所 株式会社ビズオーシャン〒104-0045 東京都中央区築地4丁目1−17 銀座大野ビル8階「混ざる」が自己成長の鍵!株式…

Django&Python3で一時ディレクトリだけで複数ファイルのZIP圧縮を済ませる

Djangoでフォームで受け取った複数のファイルを、パスワード付きZIPで固めてmodelに保存したかった。Pythonの標準モジュールzipfileではpass付きを展開はできても、作成はできないのでpyminizipを使う。ファイル名と、中身を別々に渡せれば一時ファイルでも…

mastodonのアップデート時にrails assets:precompileが、Compiling webpacker assets で止まる

フルGCPで運用している社内用インスタンス( http://mstdn.bizocean.co.jp )でオリジナルイラストができたのでアップデートしようとしたら、 Binary found at /mastodon/node_modules/node-sass/vendor/linux_musl-x64-48/binding.node Testing binary Binar…

Google App Engine + Django +Cloud SQLで社内用短縮URLサービスを作った

データ基盤のoceanusで、Google App Engineを使った短縮URLサービスを追加した。脳内でもんもんと設計をし、手を動かし始めてから完成まで3日ぐらい。ソースコードは下記。github.com公開しているけど、短縮URLの作成画面は社内の人間のみで、ログイン必須。…

Mastodonで/public以下の静的ファイルの画像やjs等が表示されない時

GCPで動かしている自社社員用インスタンス( https://mstdn.bizocean.co.jp )のバージョンアップ時にはまった nginx等を使わずrailsのサーバーで画像も返すときは、下記の環境変数を追加する必要があった。 RAILS_SERVE_STATIC_FILES "true" railsのサーバー…

gcloudコマンドで複数の設定の切り替え

いろいろ作ってると、GCPのプロジェクトが増えてきて、切り替えとかが面倒になる。 gcloud init を打つと、設定ファイル(configuration)が出てきて、切り替えと再認証(Switch to and re-initialize existing configuration)は出来るけど、切り替えだけの…

Google Container Engineで自社用Mastodon立てた

いろいろと勉強になりそうなので勢いで立てた。詳細は今度記事にする。Mastodonを構築、運用できてるってだけである程度の技術アピールになる気もするので、エンジニアがいる会社のブランディングなんかにも使えるのではないかと思った。mstdn.bizocean.co.j…

Googleアナリティクス プレミアム(360)のコストが高すぎるなら自分で作ればいい

jsタグを貼るだけで無料で高度なアクセス解析ができるGoogle Analyticsはもはやデファクトスタンダード。でも、個人を特定できるような生ログは無料版では手に入れられず、自社の会員IDと結びつけたり、特定の人の行動を追ったりすることは出来ない。そこで…

2017年4月版 oceanusサーバー構成図

自社で開発・運用しているビッグデータ基盤oceanusがいろいろ変わったので構成図をアップデートした。 前回と比べて一番大きいのはGOPUBサーバーの追加。一人でやってるのに大規模な感じになってきたけど、GKEで動かしているのでデプロイや運用は楽ちん。git…

新しく追加されたdatalabコマンドでGCE上で動かすCLOUD DATALABを使う

Googleに改造されたJupyterであるCLOUD DATALABが、少しまではDockerイメージで配布されてて、ローカルで使ってたけど、Google Cloud SDKにそのままdatalabというコマンドが追加されて、Compute Engine上で動かすのがデファクトになったっぽい。 ローカルマ…

Google Container Engineでdeploymentとserviceをコピーするために設定を出力する

Google Container Engineで運用しているアプリケーションをそろそろ東京リージョンに移そうと思った。これまで、 kubectl get service -o yaml kubectl get deployment -o yaml で出力されるyamlは手作業で必要な項目消したり、書き換えていたりしてから、ku…

GKEでPODが立ち上がらなくなったときの調査方法

Google CONTAINER ENGINE(以下GKE)ではreplicasの値で簡単にPODを増やせる。 https://cloud.google.com/container-engine/cloud.google.com でも、なぜかStatusがPendingのままのPODが出るときがある。※kcはkubectlのエイリアス % kc get po NAME READY STAT…

Go言語でgRPCのエラーと戦って負ける

以前の記事からGo言語でサーバーアプリを自分で書き始めて、エラーハンドリングが必要になった。 エラーについては下記記事が参考になった。 qiita.com この記事のように自分で作ったエラーならいいんだけど、大抵は外部のライブラリのエラーではまる。Cloud…

Docker環境でGoogle Cloud APIへの認証を行う

よく忘れるのでメモ。ググって出てくるページだと gcloud auth application-default loginしろとか、コマンドが出てくるけどDockerだといろいろ面倒なので、鍵ファイルを用いた認証がしたい。 GCPのコンソールから「IAMと管理」→「サービスアカウントを作成…

Go言語でGoogle Cloud PUB/SUBへの高速HTTPS中継サーバーを作る

以前から本を買ったり気になっていたGo言語だけど、書き慣れてないし変更が多いと大変なので、使い所がなくPythonで全部済ましてしまっていた。 でも以前、Google Cloud PUB/SUBを使おうとした時、通信がHTTPSなのでレスポンスが遅く、WEBアプリ側から直接は…

Googleのslack競合「Hangouts Chat」に期待

弊社ではG Suiteを使っているので、Googleがslackっぽいの出してくれればと思ってましたが、やってくれるようです。 www.itmedia.co.jp slackは今も使ってますが、たくさんメッセージを使うのには有料プランが必要なので、月額がかかってしまいます。G Suite…

kubectlでimageの変更をコマンドラインで行う

Google Container Engineでのデプロイは、今までは kubectl edit deploy {name}でエディタを開き、手でimageの値を書き換えていたけど、面倒になったので自動化を考えた。マスターのバージョンは1.4.8。editではなくpatchというコマンドがあった。kubectl pa…

Google Container Engineでtype=LoadBalancerでexposeすると、毎月2000円~程度かかるので注意

GKEを使っていて、利用料金を見ていたら、作った覚えのないロードバランサーの金額が入っていた。 Compute Engine Network Load Balancing: Forwarding Rule Minimum Service Charge in Japan: 672 時間 [Currency conversion: USD to JPY using rate 115.1]…

Docker + Pythonで設定ファイルを環境変数によって切り替える

oceanusではPythonで書いたアプリケーションをDockerで動かしています。Dockerを使ったアプリケーションでは、コンテナごとに変わる可能性がある変数は、DockerfileでENVを使って、環境変数にセットして、プログラム側でそれを読み込んで使えます。しかし、P…

Google Cloud Datalabに任意のパッケージをインストールする

自社では基本的にBigQueryにデータをぶちこんでいるので、データ解析や、機械学習にはJupyterのGoogleカスタマイズ版であるDatalabを使っています。cloud.google.com基本的な使い方はJupyter(IPython)と一緒です。IPythonデータサイエンスクックブック ―対…

大規模分散型リレーショナルデータベースGoogle Cloud Spanner来た

以前からGoogleのセミナーなどでは話題に上がっていた、分散RDBがついに公開されました。これまでトランザクションが必要なDBは分散するのが難しく、注文が集中するECや、ゲームなどでは、RDBがボトルネックになっていましたが、もしCloud Spannerが期待通り…

Word2Vecを使って行動履歴から関連商品やおすすめ商品を出す

bizoceanで集めたデータを使って何かできないかを考えていたら、少し前に話題になったWord2Vecを使って書式のダウンロード履歴を文章として入力すれば、近いベクトルの書式、つまり関連性の高い書式が出せるのでは?と思い試してみた。おすすめ、レコメンド…

Python3でipaddressモジュールを使って、IPアドレス認証を行う

本番環境のWEBアプリケーションで、デバッグ情報を表示させる際、サーバー情報なども全部さらけだすので、最低限IP認証だけ行いたいと思った。IPアドレスの文字列比較なら簡単だけど、できればネットワークアドレス(192.168.0.0/24等)で許可できると便利。…

データ解析インターンの予定を立ててみる

以前の記事でインターン募集をしていましたが、1件応募があり、採用の方向で進んでいるので、ざっくり今後のスケジュールを立ててみる 前提条件いろいろ 対象 大学2年生マーケティングに興味があり、データ分析、プログラミングのインターンを探していた。プ…

CeleryでWokerとbeatを同時起動する

タスクキューイングができるCeleryを使っているけど、一部認証が1時間で切れる箇所があり、期限切れの前に定期的に再認証を行う処理が必要になった。そのため、Celeryでcron的なことができるbeat機能を使った。Periodic Tasks Periodic Tasks — Celery 4.0.2…

RedisのlistとpubsubとRabbitMQを使い分けを考える

2017年1月現在、ビッグデータ処理プロジェクトoceanusは下記のようなデータの流れをしています。 GEK上でDockerを使ってアプリケーションを構成していますが、Redisのリスト型、pubsub型に加えて、最近RabbitMQも使い始めたので、どう使い分けしているかを整…

KubernetesがServiceのIPなどを勝手に環境変数に入れてくれてる

ビッグデータ処理のプロジェクトoceanusで、セットした覚えのない環境変数がセットされており、それがたまたまコンテナで使っている変数名と同じだったため、原因の特定に時間がかかってしまった。 RabiitMQを使うことになって、それを使うコンテナには、RAB…

Pythonでリトライ処理を考える

ビッグデータ処理のために作ってるoceanusでは、受け取ったデータをRedis、BigQuery、Google SpreadSheet、SendGrid(メール)など外部に送ることが多く、残念ながら外部とのやりとりはコントロールできない不確定要素が多い。そのため、いろんなところでリ…

Dockerのイメージから過去のソースコード等を救出する

DockerとGKE(Google Container Engine)を開発に使うようになってから、gitだけでなく、Dockerのイメージもバージョンで保存されるようになった。ソースコードを変更後、動作確認のためにDockerイメージをビルドし直すことが多いので、頻度としては、gitへ…

【復旧済み】github落ちてる

https://github.com/こんなん出た unicornなのは、Rubyのアプリケーションサーバー(正確にはRackWebサーバ?)のunicornのデフォルトエラー画面なのだろうか。もはやインフラとなってるGithubクラスのサービスがこういうの出すとは以外だったGitHub実践入門 ~…

KubernetesでThe edited file had a syntax error: unable to decode "edited-file": [pos 907]: json: expect char '"' but got char '5'

Google Container Engine上のKubernetesで、kubectl edit deploy でyamlをいじっていたら、ポート番号の指定でエラーになった The edited file had a syntax error: unable to decode "edited-file": [pos 907]: json: expect char '"' but got char '5' 該…

Go言語によるPython実装Grumpyで世界がGoogleに染まっていくところまで妄想した

opensource.googleblog.comGoogleのGo言語によるPython実装「Grumpy」が公開され話題になっています。github.comwww.itmedia.co.jp news.mynavi.jp codezine.jp Go言語は入門書を一つ買って、ちょっと触っている程度だけど、実行速度、並列処理のしやすさ、…

Google Container Engineで本番運用したらfluentd-cloud-loggingのメモリ消費量が一番多かった

なるべくサーバー代を抑えるために、速度重視のフレームワーク使ったり(Python3 + Falcon + Nginx)、メモリリークと戦ったり、メモリに溜め込まないように書いてるけど、勝手にログを集めてくれるGoogle仕様のfluentdが一番メモリを食っていた。アプリケー…

DcokerでERAlchemyを使ってPostgreSQLのER図を書き出す

現在のアプリのデータベースのER図を作る必要があったので、検索した所、ERAlchemyというのがあることを知った。ちなみにPostgresqlを使ってる。GitHub - Alexis-benoist/eralchemy: Entity Relation Diagrams generation tool こういう一時的な用途で、自分…

gcloud dockerコマンドのWARNING: The '--' argument must be specified between gcloud specific args on the left and DOCKER_ARGS on the right

GoogleのContainer Repositoryにアップする際、エラーメッセージが出るようになって、しばらくそのまま使ってたけど直し方がわかった。 WARNING: The '--' argument must be specified between gcloud specific args on the left and DOCKER_ARGS on the rig…

大規模開発って何が大規模なのか

私はいわゆるSIerで働いた経験が無いけど、開発の話で大規模開発とか、求人で大規模経験など、「大規模」という言葉をよく耳にする。何が大規模なのか少し考えてみた。 ○ 機能の数 bizoceanではフレームワークにSymfony2を使っているけど、これも他のPHPフレ…

Docker+Kubernetesの使用メモリ確認方法

メモリ使用量は起動できるコンテナ数、費用にも関わってくるので大事。確認方法をまとめます。 Docker docker statsコマンドで確認できる $ sudo docker stats {CONTAINER ID}こんな感じで表示される CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK…

Google翻訳はチョムスキーの生成文法を作り出したのか

jp.techcrunch.com コンピューターは、言語間の翻訳に自分が用いる概念(共有される意味概念)を表現する独自の内部的言語を開発したのではないのか? この記事を読んで、生成文法を思い浮かべた。詳しくは下記参照だけど、私が大学で一番印象に残ってる理論…

pythonで作ったプロセスのメモリ肥大化の原因調査から解決まで

Dockerで作っているoceanusでは、WEBサーバーだけでなく、Pythonで書いた常時稼働プロセスをいくつか動かしている。GitHub - uyamazak/oceanus: Save all data to Google BigQuery. Fast and row cost using Docker and Kubernetes on GCP r2bq Redis to Big…

リトライ間隔の重要性

この記事を読んで、定期的な同期時や、エラーからの復帰時のリトライで負荷の増大や偏りが出てしまうことを知る。自業自得のDDosって文言にちょっと釣られたけど読んでみて納得。googlecloudplatform-japan.blogspot.jp 早速リトライ時の以下の条件でスリー…

GCPでログの内容によってアラートを送信する設定方法

oceanusでは、Google Cloud Platform(GCP)のGoogle Container Engine(GKE)を使っていますが、これらを使うとほぼ何も設定せずに、アプリ側で標準出力へのエラーを出すだけで、Google側でログを集めてくれます。サーバーを増やすごとにそれぞれにfluentd…

Pythonでタイムアウト処理

oceanusで作っているプロセスで、ログも何も吐かずに停止してしまうものがあり、タイムアウト処理を追加しようと思った。 環境はLinuxでpython3.5検索したらデコレータ形式で簡単に使える下記を見つけたqiita.com github.com pipからインストール可能 pip in…

Pythonで重複してログが出力されるとき

本番運用しながら絶賛開発中のoceanusで、本格的にログの必要性を感じ、ログレベルを分けながら使ってみている。この記事を読んでloggerとloggingの違いをなんとなく感じ取ってqiita.com フォーマットは統一したいので、こんな感じの共通で使える関数を作り …

エンジニア立ち居振舞い:なるべく作らない

お題「エンジニア立ち居振舞い」何かを作るのがエンジニアの仕事だけど、作らないことも大事。これまで9年ぐらい自社サービスをメインに開発、運用をしてきて、メンテナンスや引き継ぎの大変さを思い知った。特に昔の自分が作ったものに対して。 営業やお客…

AWSではなく、GCPを選んだ5つの理由

いわゆるクラウドサービスで、一番先に進み、ユーザー数も多いのはAmazon Web Service(AWS)だ。でも私は新規サービスにはGoogle Cloud Platform(GCP)を選んだ。AWSがいいのか、GCPがいいのか、人と話していてよく聞かれるし、悩んでいる人も多いと思うの…

GCP東京リージョン(asia-northeast1)をGKEで使ってみるための事前調査

2016年11月8日からGoogle Cloud Platformの 東京リージョン(asia-northeast1)が一般公開されました。早速、現在台湾(asia-east1)で動かしているGoogle Container Engine(GKE)を移すためにちょっと違いを調べてみた。cloud.google.com スペック 東京はCPUが…

BigQuery障害 2016/11/09

復旧 日本時間13:07頃に復旧したもよう。 Google BigQuery Incident #18022BigQuery Streaming API failingIncident began at 2016-11-08 16:25 and ended at 2016-11-08 20:07 (all times are US/Pacific).DATE TIME DESCRIPTION Nov 08, 2016 20:21 The is…