Pythonでgoogle-cloud-bigqueryを使用してLegacy SQLを実行する

google-cloud-bigquery はデフォルトでStandard SQLを使用することになっているため、Legacy SQLを使用する場合は明示的に指定する必要がある。

github.com

さっとソースを読んでみたところ、QueryJobConfigというのを使うといいらしい。

サンプル

from google.cloud import bigquery

if __name__ == '__main__':
    client = bigquery.Client.from_service_account_json('./credentials.json')

    query = 'SELECT * FROM [project:dataset.table]'
    config = bigquery.QueryJobConfig()
    config.use_legacy_sql = True

    rows = client.query(query, job_config=config).result()
    for row in rows:
        print(row)

歴史があるサービスだとLegacy SQLを使うこともあるので覚えておく。

Google BigQuery

Google BigQuery

React Nativeで買い物リストアプリを作ってiOS/Androidで動作させた

やりたかったこと

React Nativeに入門するも、Hello Worldより先になかなか進まなかったので、小さな物でもいいのである程度使えるアプリを作ってみることにした。

お題としてTODOリストのような一般的な物を作ることにしたため、どう実装するかはさておいて、機能については悩みどころがなかったのはよかったと思う。

何を作ろう?どんな機能が必要だろう?から考えてしまうとなかなか進まないので、おきまりの物を作ろうと割り切った。

スクリーンショット

見た目はiOS/Androidもほぼ同じ。

iOS

iOSに合わせてレイアウトした。

f:id:ariarijp:20171107131645p:plain

Android

上に若干余白があるが、本来はプラットフォーム別に調整できるところをサボっているだけ。

f:id:ariarijp:20171107133404p:plain

リポジトリ

この記事を書いた時点ではREADMEすら書いてないけど、React Nativeの環境ができていれば、 git clone して cd して npm i の後に react-native run-ios とかやれば動くはず。

github.com

主に使ったコンポーネント/API

悩んだところ

コンポーネントの分割粒度

今回は作りきることが目的だったのでざっくり分けたが、ネイティブもReactも経験が少ないので筋のいい分け方が知りたい。

FlatListの扱いに悩んだ

アイテムが追加されても、FlatListをスクロールするまで新しいアイテムが再描画されなかった。

extraDataというpropを設定し、その値も合わせて更新することで再描画してくれるようになったが、extraDataに配列を渡しても変更を検出してくれないようなので、数値などの値にする必要があるようだ。今回は表示対象のアイテムを保持する配列の長さをextraDataとして使用した。

stackoverflow.com

thisの扱い

必要に応じてbindを使って解決したが、bindを使わずにスマートにかけるのであればその方法を知りたい。

developer.mozilla.org

まとめ

  • ある程度JavaScriptが書ければ簡単なアプリは作れる
  • 小さい規模であれば、差異をほぼ気にせずにクロスプラットフォーム対応できた
  • 検索して得られる情報も増えていきたので、エラーや予期しない挙動があってもなんとか解決できる状況になってきた
  • 環境構築やシミュレーターでの動作確認に躓くと厳しそう。その場合はネイティブの知識が必要になりそうな気がする

個人的にはもうちょっとJavaScriptとその周辺エコシステムを学んだら、もうちょっと気分良くかけるかも。

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

初めてのJavaScript 第3版 ―ES2015以降の最新ウェブ開発

Pythonのリストを決まったサイズで分割するときはmore-itertoolsのchunkedを使う

いつも忘れては同じこと調べてるのでメモ。

More Itertools — more-itertools 3.2.0 documentation

pipでインストールして

$ pip install more-itertools

こんな感じで使うと

from more_itertools import chunked

if __name__ == '__main__':
    items = range(28)
    print(list(chunked(items, 10)))

こんな結果になる。

$ python main.py
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27]]

これで忘れても大丈夫。

入門 Python 3

入門 Python 3

標準入力をとりあえずSlackに通知するhouを作った

ぼんやりとみんGoを眺めていたら、horensoみたいに賢くなくていいから、標準入力をそのままSlackに投げるCLIツールが自分用にあったらいいような気がしてきた。

github.com

そこで作ったのがこれ。horenso(報・連・相)でいうところの「報」しかやらないのでhouという名前。

以下の記事のことも頭の片隅にあったかもしれないけど、nofify_slackのほうが対ISUCONを意識されてるっぽいし実戦的だと思う。くらべてhouはもっと雑。

medium.com

使い方

READMEの通り。オプションで色々渡せるようにしてはあるけど、無くてもいいねって感じのオプションばかり。ついついオプションを増やしたくなってしまう悪い癖がどうも抜けない。

$ export SLACK_API_TOKEN=YOUR_SLACK_API_TOKEN
$ w | hou -channel hello

環境変数にSlackのトークンを入れて、何らかの標準入力を受け取って -channel で指定されたSlackのチャンネルにメッセージを投げる。

メッセージの受信イメージはこんな感じ。

f:id:ariarijp:20170925224302p:plain

せっかく作ったので、ちょっとしたバッチを crontab に設定したときの動作確認とか、VMなどでちょっと重めのバッチを回しているときの完了通知とかに使おうかなと思っているところ。

余談

「ゆとりの法則 - 誰も書かなかったプロジェクト管理の誤解」読んでない気がするし、マーケットプレイスで送料込み500円ちょっとだったのでとりあえず買ってみた。

原題は「Slack: Getting Past Burnout, Busywork, and the Myth of Total Efficiency」らしい。

ゆとりの法則 ? 誰も書かなかったプロジェクト管理の誤解

ゆとりの法則 ? 誰も書かなかったプロジェクト管理の誤解

crontabを多少読みやすくするcrontocを作った

個人的に欲しくなったので作った。crontab(CRON TABle)を読むためのツールなので、crontoc(CRON Table Of Contents)という名前。

github.com

導入方法などはREADMEのとおり。

使い方

crontab -lを見やすくするツールなのでどこで動かしてもいいけど、個人的には「あのサーバー、直近で動くバッチってなんだっけ」というのをサクッと確認したくて作ったので、sshコマンドでcrontab -lを実行し、その結果を標準入力として渡すと良い。

$ ssh remote-server crontab -l | crontoc
Next: 2017-09-19 23:33:00 +0900 JST # * * * * * vmstat >> /tmp/vmstat.log
Next: 2017-09-20 00:10:00 +0900 JST # 10 0 * * * df -h >> /tmp/df.log
Next: 2017-09-20 00:00:00 +0900 JST # */5 0 * * * free >> /tmp/free.log
Next: 2017-10-01 10:00:00 +0900 JST # 0 10 1 * * date >> /tmp/date.log

TODO

  • 毎分や毎時実行されるジョブは直近の1行しかでないので、「n分以内に実行される」みたいなオプションがあってもいい
  • 毎分や毎時実行されるジョブはわかりやすくするため、出力時に色を変えてもいいかも

まとめ

ちょっとしたツールを書くのはやっぱりGoが便利。

会社のどこかにあると思われるみんGoを明日の昼休みちょっとに読み直そうと思った。

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

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