Slide 1

Slide 1 text

ࡶʹͭ͘Δ
 KPIπʔϧͷεεϝ 2015/03/28 Minami.rb ࠷ॳͰ࠷ޙͷLTେձ

Slide 2

Slide 2 text

ࢲ͸…. • @1syo • Rails Programmer • Yokohama.rb • 2012 Ruby kaja award winner • MinatoRubyKaig01 organizer • TDDBC Yokohama TA

Slide 3

Slide 3 text

MinatoRubyKaigi02

Slide 4

Slide 4 text

ͨͿΜ9݄, 10݄

Slide 5

Slide 5 text

KPIπʔϧͱ͸ʁ • Ϣʔβʔ਺.. • ച্… • ೔࣍ɺ݄࣍ɺྦྷܭ.. • Έ͍ͨͳΞϨ..

Slide 6

Slide 6 text

։ൃͷ࣮৘… • ϦϦʔε௚ޙ͔Βඞཁ • ཁ͕݅;ΜΘΓ͍ͯ͠Δ • ޻ظͱ͔ͳ͍

Slide 7

Slide 7 text

Ͳ͔͜ͰखΛൈ͔ͳ͍ͱਏ͍

Slide 8

Slide 8 text

਺ࣈͷਖ਼֬͞ > ࢖͍উख

Slide 9

Slide 9 text

άϥϑ = ࢮ

Slide 10

Slide 10 text

ͪΐͬͱલͷ΍ͭ

Slide 11

Slide 11 text

#! /bin/sh! host=localhost! database=db! user=dbuser! password=password! ! from_date=`date --date '1 days ago' +\%Y-\%m-\%d`! to_date=`date +\%Y-\%m-\%d`! ! [email protected]! [email protected]! subject=counter! bound=`date +"%Y%m%d%H%M%S"`! filename="filename_$from_date.csv"! ! sql="SELECT * FROM users WHERE created_at BETWEEN $from_date AND $to_date"! result=`mysql -u$user -p$password -h$host $database - e"$sql" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\r\n//g'`!

Slide 12

Slide 12 text

/usr/sbin/sendmail -t -i <<__MAIL__! From: "$from" ! To: "$to"! Subject: "$subject"! MIME-Version: 1.0! Content-Type: multipart/mixed; boundary=\"---------"$bound"\"! ! -----------"$bound"! Content-Type: Text/Plain; charset=ISO-2022-JP! Content-Transfer-Encoding: 7bit! ! Now: "$from_date"! ! --! `hostname`! "$from"! ! -----------"$bound"! Content-Type: application/octet-stream! name="$filename"! Content-Transfer-Encoding: base64! Content-Disposition: attachment;! filename="$filename"! ! `echo -e "$result" | base64`! ! -----------"$bound"--! __MAIL__

Slide 13

Slide 13 text

֓ཁ • mysqlίϚϯυͰSQLΛୟ͍ͯ • ݁ՌΛawkͰCSVʹͯ͠ • mailͷఴ෇ϑΝΠϧʹͯ͠ૹ৴

Slide 14

Slide 14 text

͋ͱ͸ΤΫηϧઌੜཔΉʂ

Slide 15

Slide 15 text

ૂ͍ • SQLͰਖ਼֬ͳ਺ࣈΛग़͢ͷʹઐ೦͍ͨ͠ • ΈΜͳେ޷͖ΤΫηϧઌੜͷݞʹ৐Γ͍ͨ • ؒҧ͍Λࢦఠ͞ΕͨΒ௚͙ʹमਖ਼͍ͨ͠

Slide 16

Slide 16 text

Α͍఺ • SQLͰΞΫηεͰ͖Ε͹େ఍ूܭͰ͖Δ • ৔߹ʹΑͬͯ͸shellΛۦ࢖ͯ͠ϑΝΠϧ΋ू ܭͰ͖Δ • େྔੜ࢈͠΍͍͢

Slide 17

Slide 17 text

ѱ͍఺ • sendmail͕࢖͑ͳ͍ͱͳ͍ͱख٧·Γ • ʮʓʓ͞Μ΋ݟ͍ͨʯ͕݁ߏ໘౗ • ूܭ݁Ռ͕෼ࢄ

Slide 18

Slide 18 text

࠷ۙͷ΍ͭ

Slide 19

Slide 19 text

module KPI! module Summary! class SalesReport! def client! @client ||= Mysql2::Client.new(! host: Settings.kpi.database.host,! database: Settings.kpi.database.xxxxxxx,! username: config['username'],! password: config['password']! )! end! ! ! ### தུ ####! def collect! sql = <<-__SQL__! select *! from (#লུ...) salse_reports! where placed_at >= '#{start_at}'! and placed_at < '#{end_at}'! order by placed_at! __SQL__! client.query(sql)! end! ! def rows! @rows ||= collect.map { |row| row.values }! end! ! def save! spreadsheet = KPI::GoogleDrive::Collection.new.spreadsheet(@start_at)! sheet = spreadsheet.worksheet(:sales_report, rows)! sheet.clear! sheet.save! end! end! end! end

Slide 20

Slide 20 text

֓ཁ • msql2 ͰSQLୟ͍ͯ • ݁ՌΛRubyͰΰχϣΰχϣͯ͠ • GoogleDriveʹอଘ͢Δ

Slide 21

Slide 21 text

͋ͱ͸GoogleઌੜཔΉʂ

Slide 22

Slide 22 text

ྑ͍఺ • sendmail͕͍Βͳ͍ • ݖݶ෇༩͕ΤϯυϢʔβʔͰ΋Ͱ͖Δ • ूܭ݁Ռͷू໿͕Ͱ͖Δ • APIܦ༝Ͱ࠶ར༻΋Ͱ͖Δ • GoogleDocsͷ͍͢͝ػೳͷԸܙΛड͚ΕΔ

Slide 23

Slide 23 text

ѱ͍఺ • OAuthͷ։ൃ໘౗ • refresh_tokenʹ༗ޮظݶ͕͋Δ • ηϧͷܗࣜࢦఆʹบ͕͋Δ

Slide 24

Slide 24 text

GoogleDocsͷ͍͢͝ػೳ

Slide 25

Slide 25 text

QUERYؔ਺ =QUERY(A2:E6,"select count(A) where B > 5”) ूܭʹඞཁͳதؒσʔλΛGoogleDocsʹొ࿥ ͢Ε͹͋ͱ͸ˢͰରԠͰ͖ΔΑ͏ʹͳͬͨ

Slide 26

Slide 26 text

DEMO

Slide 27

Slide 27 text

ࡶʹߦ͜͏!