Skip to content

Static yaml generator for kodaira #251

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Feb 7, 2018
Merged

Static yaml generator for kodaira #251

merged 4 commits into from
Feb 7, 2018

Conversation

nalabjp
Copy link
Member

@nalabjp nalabjp commented Feb 3, 2018

ref: #190 (comment)

小平の統計情報のスプレッドシートからevent_histories用のyamlを生成するスクリプトを書きました。

https://github.com/gimite/google-drive-ruby/blob/bc8d27b1c4f7369bba6e308525377444c3932364/doc/authorization.md#on-behalf-of-you-command-line-authorization
に従って、Google API用のOAuth2.0の認証情報を生成し、jsonファイルをローカルマシンにダウンロードする必要があります。
jsonファイルが取得できれば bin/rails r scripts/kodaira_ss.rb CONFIG_JSON_FILEで実行可能です。

@nalabjp
Copy link
Member Author

nalabjp commented Feb 3, 2018

OAuth認証が絡むのでひとまず書捨てなスクリプトで書いたんですが、運用はどうしましょうかね🤔
毎週の集計で自動で回すならもうちょっと拡張して組み込まなければなりません。

@yasulab
Copy link
Member

yasulab commented Feb 4, 2018

PRありがとうございます! 😸 これから見ますね 👀

@@ -0,0 +1,51 @@
# For codaira dojo' event histories
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

codaira dojo' event histories

Kodaira's dojo event histories ですかね🤔

end

if ARGV.empty?
puts 'Usage: bin/rails r scripts/kodaira_ss.rb CONFIG_JSON_FILE'
Copy link
Member

@yasulab yasulab Feb 4, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

好みの問題かもしれないませんが、ss は Screen Shot や Same Size などの様々な略語も含んでいるので、sheet の方が判別が付きやすいかもしれないですね🤔

conf = File.expand_path(ARGV[0])
session = GoogleDrive::Session.from_config(conf)
ss = session.spreadsheet_by_key(SPREAD_SHEET_KEY)
ws = ss.worksheets.find { |s| s.title == WORK_SHEET_NAME }
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あー、でも ss を sheet にしちゃうと ws も sheet になっちゃうのか 💦

col = col * 26 + (b - 0x41) # 0x41: 'A'
end
col
end
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

便利メソッドですね! 😸 #228 でも活用できそう🤔💭

@yasulab
Copy link
Member

yasulab commented Feb 4, 2018

OAuth認証が絡むのでひとまず書捨てなスクリプトで書いたんですが、運用はどうしましょうかね🤔

@nalabjp なるほど! とりあえず tmp でyamlファイルを書き出すところまでがスクリプトの役割で、その後のマージなどは手動でやる形ですね🤔 マージはかなり複雑になりそうなので、確かにそこまでスクリプトにやらせないほうが良さそうですね 😸

運用についてですが、例えば static_event_histories ディレクトリを作って、そこにあるyamlファイルを全て読みだすようにするとかどうでしょう? 具体的には、static_event_histories ディレクトリの中にkashiwa_histories_20180201.yamlkodaira_histories_20180204.yamlなどがあり、もし小平の情報を更新したい場合は、scripts/kodaira_ss.rbで出力したyamlファイルをそのまま上書きして運用するみたいなイメージです 💭

}
end

output = File.open("tmp/kodaira_histories_#{Time.zone.now.strftime('%Y%m%d%H%M%S')}.yml", 'w')
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yamlファイルを上書きする方向で運用するのであれば、%Y%m%dまで情報があれば十分かも?

@yasulab
Copy link
Member

yasulab commented Feb 4, 2018

Google API用のOAuth2.0の認証情報を生成し、jsonファイルをローカルマシンにダウンロードする必要があります。

json ファイルだと管理が面倒だったので、以前に calendar2idobata で環境変数から認証するのを試しに作ってたんですよね🤔 coderdojo.jp と同じHeroku環境なんですが、環境変数 -> json (tmp) -> authorize みたいな感じでやると json ファイルを作らなくても動きました 😅 (もっといいやり方もありそうですが 💦)
https://github.com/yasslab/calendar2idobata/blob/master/calendar2idobata.rb#L44-L53

@yasulab
Copy link
Member

yasulab commented Feb 4, 2018

yamlファイルが出力できることを確認しました! ✅

$ cat tmp/kodaira_histories_20180204151420.yml
---
- dojo_id: 13
  evented_at: 2014/06/01 14:00
  participants: 3
- dojo_id: 13
  evented_at: 2014/06/14 16:00
  participants: 1
- dojo_id: 13
  evented_at: 2014/06/18 15:00
  participants: 2
- dojo_id: 13
  evented_at: 2014/06/29 15:00
  participants: 1
- dojo_id: 13
  evented_at: 2014/07/05 14:30
  participants: 1
- dojo_id: 13
  evented_at: 2014/08/02 14:30
  participants: 0
- dojo_id: 13
  evented_at: 2015/07/09 19:30
  participants: 1
- dojo_id: 13
  evented_at: 2015/07/22 18:30
  participants: 3
- dojo_id: 13
  evented_at: 2015/08/19 18:30
  participants: 2
- dojo_id: 13
  evented_at: 2015/09/09 18:30
  participants: 4
- dojo_id: 13
  evented_at: 2015/09/30 18:30
  participants: 5
- dojo_id: 13
  evented_at: 2015/10/14 18:30
  participants: 3
- dojo_id: 13
  evented_at: 2015/10/28 18:30
  participants: 7
- dojo_id: 13
  evented_at: 2015/11/11 18:30
  participants: 6
- dojo_id: 13
  evented_at: 2015/11/25 18:30
  participants: 4
- dojo_id: 13
  evented_at: 2015/12/09 18:30
  participants: 6
- dojo_id: 13
  evented_at: 2015/12/12 18:30
  participants: 5
- dojo_id: 13
  evented_at: 2015/12/26 13:30
  participants: 3
- dojo_id: 13
  evented_at: 2016/01/13 18:30
  participants: 5
- dojo_id: 13
  evented_at: 2016/01/27 18:30
  participants: 3
- dojo_id: 13
  evented_at: 2016/02/10 18:30
  participants: 6
- dojo_id: 13
  evented_at: 2016/02/24 18:30
  participants: 3
- dojo_id: 13
  evented_at: 2016/03/09 18:30
  participants: 4
- dojo_id: 13
  evented_at: 2016/03/23 18:30
  participants: 7
- dojo_id: 13
  evented_at: 2016/03/27 17:20
  participants: 6
- dojo_id: 13
  evented_at: 2016/04/11 18:30
  participants: 5
- dojo_id: 13
  evented_at: 2016/04/27 18:30
  participants: 6
- dojo_id: 13
  evented_at: 2016/05/11 18:30
  participants: 6
- dojo_id: 13
  evented_at: 2016/05/25 18:30
  participants: 6
- dojo_id: 13
  evented_at: 2016/06/04 13:30
  participants: 3
- dojo_id: 13
  evented_at: 2016/06/15 18:30
  participants: 9
- dojo_id: 13
  evented_at: 2016/06/29 18:30
  participants: 7
- dojo_id: 13
  evented_at: 2016/07/13 18:30
  participants: 6
- dojo_id: 13
  evented_at: 2016/07/27 18:30
  participants: 8
- dojo_id: 13
  evented_at: 2016/08/10 18:30
  participants: 4
- dojo_id: 13
  evented_at: 2016/08/20 14:00
  participants: 4
- dojo_id: 13
  evented_at: 2016/08/31 18:30
  participants: 7
- dojo_id: 13
  evented_at: 2016/09/14 18:30
  participants: 5
- dojo_id: 13
  evented_at: 2016/09/28 18:30
  participants: 3
- dojo_id: 13
  evented_at: 2016/10/12 18:30
  participants: 2
- dojo_id: 13
  evented_at: 2016/10/26 18:30
  participants: 7
- dojo_id: 13
  evented_at: 2016/11/09 18:30
  participants: 10
- dojo_id: 13
  evented_at: 2016/11/30 18:30
  participants: 8
- dojo_id: 13
  evented_at: 2016/12/10 14:15
  participants: 18
- dojo_id: 13
  evented_at: 2016/12/14 18:30
  participants: 11
- dojo_id: 13
  evented_at: 2016/12/21 18:30
  participants: 9
- dojo_id: 13
  evented_at: 2017/01/11 18:30
  participants: 10
- dojo_id: 13
  evented_at: 2017/01/25 18:30
  participants: 10
- dojo_id: 13
  evented_at: 2017/02/08 18:30
  participants: 7
- dojo_id: 13
  evented_at: 2017/02/22 18:30
  participants: 12
- dojo_id: 13
  evented_at: 2017/03/08 18:30
  participants: 10
- dojo_id: 13
  evented_at: 2017/03/20 14:00
  participants: 12
- dojo_id: 13
  evented_at: 2017/03/22 18:30
  participants: 12
- dojo_id: 13
  evented_at: 2017/04/12 18:30
  participants: 12
- dojo_id: 13
  evented_at: 2017/04/16 14:00
  participants: 11
- dojo_id: 13
  evented_at: 2017/04/26 18:30
  participants: 10
- dojo_id: 13
  evented_at: 2017/05/10 18:30
  participants: 9
- dojo_id: 13
  evented_at: 2017/05/26 18:30
  participants: 6
- dojo_id: 13
  evented_at: 2017/06/14 18:30
  participants: 9
- dojo_id: 13
  evented_at: 2017/06/18 13:30
  participants: 2
- dojo_id: 13
  evented_at: 2017/06/28 18:30
  participants: 9
- dojo_id: 13
  evented_at: 2017/07/12 18:30
  participants: 9
- dojo_id: 13
  evented_at: 2017/07/12 18:30
  participants: 9
- dojo_id: 13
  evented_at: 2017/07/22 13:30
  participants: 3
- dojo_id: 13
  evented_at: 2017/08/20 13:30
  participants: 10
- dojo_id: 13
  evented_at: 2017/08/23 18:30
  participants: 3
- dojo_id: 13
  evented_at: 2017/08/30 18:30
  participants: 5
- dojo_id: 13
  evented_at: 2017/09/13 18:30
  participants: 7
- dojo_id: 13
  evented_at: 2017/09/18 13:30
  participants: 6
- dojo_id: 13
  evented_at: 2017/09/27 18:30
  participants: 2
- dojo_id: 13
  evented_at: 2017/10/11 18:30
  participants: 5
- dojo_id: 13
  evented_at: 2017/10/25 18:30
  participants: 5
- dojo_id: 13
  evented_at: 2017/11/08 18:30
  participants: 5
- dojo_id: 13
  evented_at: 2017/11/22 18:30
  participants: 2
- dojo_id: 13
  evented_at: 2017/12/13 18:30
  participants: 6
- dojo_id: 13
  evented_at: 2017/12/27 18:30
  participants: 7
- dojo_id: 13
  evented_at: 2018/01/10 18:30
  participants: 3
- dojo_id: 13
  evented_at: 2018/01/24 18:30
  participants: 3

@nalabjp
Copy link
Member Author

nalabjp commented Feb 4, 2018

oauth認証をjsonファイルにしたのは完全に手運用時の手間削減なので、自動運用するなら環境変数でも良いと思います。(production環境で動かすイメージはなかったので😅)

運用についてですが、例えば static_event_histories ディレクトリを作って

もちろん可能なのですが、
どれくらい今回の様なケースが増えていくのかイメージがなく、
例えばスプレッドシートの列が増えるだけで壊れたりdojoごとにフォーマットが違うので個別にスクリプト書いたり、
というところにどれくらいコストが掛けられるのかっていうあたりが気になっています。
スプレッドシートからのパースとevent_historiesへのinsertまでを自動化するならyamlファイルの生成はなくても良かったりするので、
このあたりの運用の方針というか温度感を確認したいのですがどんな感じでしょうか?😌

@yasulab
Copy link
Member

yasulab commented Feb 5, 2018

運用の方針というか温度感を確認したいのですがどんな感じでしょうか?😌

@nalabjp 運用に割けるリソースはもうほぼ限界に近づいているので、温度感としては、以前のコメントの通り「(手動での運用を前提とする場合は) 価値には繋がりにくいかなぁ」という感じです >< 💦

毎年ぐらいの間隔でも追加できると良さそうですが、とはいえエッジケースな気もするので、優先順位をあげるのもどうかなぁ... というのが正直な気持ちです 😓 (統計情報的にはHighChartsでグラフ化する方が優先度は高そう🤔)
#190 (comment)


どれくらいコストが掛けられるのか

運用が手動になるか自動になるかがポイントになると思っていて、基本的には「自動化できない場合は価値に繋げにくい」という前提で動くとよいのかなと考えています。例えばこちらの件については、運用できれば価値には繋がると思いますが、僕以外に誰か運用してくれる人を見つける必要があるので、実運用に繋げるのは厳しいのかなぁと考えています🤔💭 (とりあえず今回出力した yaml ファイルを static_event_histories.yaml に追記するぐらい? 継続的に運用するのは厳しそう 😓 )

一方で、今回のスクリプトは例えば #228 で活用できそうなので、抽象化したり似たような書き捨てのスクリプトが増えていえば、別のシーンの自動化で役に立ちそうかなとも感じています! 🔧🤖✨

今回のスクリプトは使い回せる場所も多くて (自動化できそうな場所がありそうで) 良いかなと感じていますが、ただ運用側の実情としては、ほとんどの場面において次の図式が成り立つといった状況です 😭 💦

運用コストを下げるスクリプト or 運用コストは変わらず価値が出せるスクリプト > 価値は出せるが運用コストも上がるスクリプト

なので全体的には、左式のスクリプトの優先順位を高めに、右式のスクリプトは後回しにしていくと良いのかなと考えています! 😸

@yasulab
Copy link
Member

yasulab commented Feb 7, 2018

一旦はこれで動くので、マージしちゃいますね ;)
他の Dojo も収集するかどうかは、後日再検討しましょう! 👍

@yasulab yasulab merged commit e48699e into master Feb 7, 2018
@yasulab yasulab deleted the kodaira-ss branch February 7, 2018 02:10
@yasulab
Copy link
Member

yasulab commented Feb 7, 2018

@nalabjp 今手元で確認したんですが、static_event_histories.yaml経由で集計した CoderDojo 小平 (dojo_id: 13) の情報がDBに反映されていないかも...? 💦 どこかのタイミングで @nalabjp さんの方でも確認してもらえると助かります 🙏

╭─○ yasulab ‹2.4.2› ~/coderdojo.jp
╰─○ rake statistics:aggregation
Aggregate for 2018/01/29~2018/02/04
2018/01/29~2018/02/04のイベント履歴の集計を行いました

╭─○ yasulab ‹2.4.2› ~/coderdojo.jp
╰─○ rails runner 'p EventHistory.select{|e| e.dojo_id == 13}.count'
0

@nalabjp
Copy link
Member Author

nalabjp commented Feb 7, 2018

🙈(見ておきます!)

@nalabjp
Copy link
Member Author

nalabjp commented Feb 7, 2018

@yasulab

static_event_histories.yaml経由で集計した CoderDojo 小平 (dojo_id: 13) の情報がDBに反映されていないかも...?

dojo = dojos_hash[e['dojo_id'].to_i]
next unless dojo

ここでdojo_idが対象のものであるかどうかをチェックしているので、
db/dojos.ymlのdojo_id: 13が正しく設定されていないといけないですね。
- dojo_id: 13
name: connpass
group_id: 2396
# https://coderdojokodaira-ninja.connpass.com/event/ もあるが2017/06~のみ
url: https://coderdojo-kodaira.connpass.com/

正しくはこうでしょうか。

- dojo_id: 13
  name: static_yaml
  group_id:
  url:

あと、取り込む前にEventHistory.where(dojo_id: 13).destroy_allとかしておく必要がありそうですね。
別途確認の上、対応しておきますね😌

@nalabjp
Copy link
Member Author

nalabjp commented Feb 7, 2018

取り込む前にEventHistory.where(dojo_id: 13).destroy_allとかしておく必要がありそう

irb(main):001:0> EventHistory.where(dojo_id: 13).count
D, [2018-02-08T02:31:17.584523 #4] DEBUG -- :    (1.6ms)  SELECT COUNT(*) FROM "event_histories" WHERE "event_histories"."dojo_id" = $1  [["dojo_id", 13]]
=> 51

本番には既存レコードがありますね。
db/dojo_event_services.yamlの修正を取り込む前に手動でこの51件を消すことにしましょうか。

@yasulab
Copy link
Member

yasulab commented Feb 9, 2018

あー、忘れてました 💦 確かに決しておいた方が良いと思います! 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants