SlideShare a Scribd company logo
Kazuhiro Yoshida
ThinReports 再び 9 April 2014!
at Hamamatsu.rb #38
振り返り
思えば2年前...
!
前回は少し投げやり感があった...
※投げやり感があった
 労基署の監査でやりたくない仕事の後始末に追われていた
今回は寝ても覚めてもコーディング
❖ 明確な目的
❖ 現実逃避
❖ たのしいRuby!
前回は
「帳票出力」
!
ThinReports + Ruby on Rails
今回は
「帳票出力」
!
ThinReports + sinatra
なぜRailsじゃないのか?
❖ 勝手にファイルが作られる
❖ ルール?規則?つーか俺がルール!
❖ PerlでCGI.pmで作ってた頃がたのしかった♪
で、 sinatra いいんじゃない!
開発の流れ
1. 現状の作業をエクセルにて可能なかぎり
自動化
2. それをRubyでコーディングしてコンソー
ルアプリにする
3. さらにそれをsinatraでWEBアプリにする
目標:作業時間の短縮
15分 を 15秒に
開発イメージ
受注オーダーファイル
.xls
帳票作成プログラム
pdicard.rb
thinreports
sinatra
require 'spreadsheet'!
require 'sequel'!
require 'thinreports'
コントローラー
pdicard_controller.rb
テンプレート
upload.haml
%html!
%body!
%h1 PDi Card Generate!
%form(method="post" enctype='multipart/form-data') !
%input(type='file' name='myfile') !
%br!
%input(type='submit' value='Upload!')
require 'rubygems'!
require 'sinatra'!
require 'haml'!
require 'pp'!
require './pdicard'!
require 'tempfile'!
require 'sinatra/reloader'
.pdf
ファイルアップロード画面とコード
%html!
%body!
%h1 PDi Card Generate!
%form(method="post"
enctype='multipart/form-data') !
%input(type='file' name='myfile') !
%br!
%input(type='submit' value='Upload!')
#!/usr/bin/ruby!
# encoding:utf-8!
require 'spreadsheet'!
require 'sequel'!
require 'thinreports'!
require 'pp'!
!
class ItemTB!
DB = Sequel.sqlite!
DB.create_table :items do!
primary_key :id!
String :item_no!
String :item_name!
String :code_of_customer!
String :line_code_of_production!
end!
DataSet = DB[:items] # Create a dataset!
!
book = Spreadsheet.open("品目マスター.xls")!
sheet = book.worksheet(0)!
ThinReportエディターとコード
report = ThinReports::Report.create do |r|!
r.use_layout 'inspections.tlf', :default => true!
r.start_new_page #:layout => 'inspections.tlf'!
until (label_data.empty?) do!
read_as_col(label_data, 2) do |data_row_array|!
r.page.list(:list).add_row do |row|!
# Set details!
data_row_array.each_with_index do |col_array, _index|!
row.item(Symbol_table[_index][0]).value(col_array[:item_no
row.item(Symbol_table[_index][1]).value(col_array[:date_del
row.item(Symbol_table[_index][2]).value(col_array[:time_de
row.item(Symbol_table[_index][3]).value(col_array[:quantity
row.item(Symbol_table[_index][4]).value(col_array[:quantity
row.item(Symbol_table[_index][5]).value(col_array[:inspectio
row.item(Symbol_table[_index][6]).value(col_array[:line_cod
row.item(Symbol_table[_index][7]).value(col_array[:line_nam
row.item(Symbol_table[_index][8]).value(col_array[:code_of_
row.item(Symbol_table[_index][9]).value(col_array[:order_no
end!
end!
end!
end!
!
r.use_layout 'inspections_list.tlf', :id => :list_all!
r.start_new_page :layout => :list_all!
orders.DB.fetch("select * from orders where line_code_of_produc
or line_code_of_production is null", '42%') do |data_row|!
r.page.list(:list).add_row do |row|!
row.item(:item_no).value(data_row[:item_no])!
row.item(:date_delivery).value(data_row[:date_delivery])!
row.item(:time_delivery).value(data_row[:time_delivery])!
出力帳票とコード
r.use_layout 'inspections_list.tlf', :id => :list_all!
r.start_new_page :layout => :list_all!
orders.DB.fetch("select * from orders where line_code_of_productio
or line_code_of_production is null", '42%') do |data_row|!
r.page.list(:list).add_row do |row|!
row.item(:item_no).value(data_row[:item_no])!
row.item(:date_delivery).value(data_row[:date_delivery])!
row.item(:time_delivery).value(data_row[:time_delivery])!
row.item(:quantity_of_order).value(data_row[:quantity_of_order
row.item(:quantity_of_order_sum).value(data_row[:quantity_of_
row.item(:inspection_as_standard).value(data_row[:inspection_a
row.item(:line_code_of_customer_delivery).value(data_row[:line
row.item(:line_name_of_customer_delivery).value(data_row[:lin
#row.item(:code_of_customer).value(data_row[:code_of_custom
row.item(:order_no).value(data_row[:order_no])!
end!
end!
end!
report.generate!
report = ThinReports::Report.create do |r|!
r.use_layout 'inspections.tlf', :default => true!
r.start_new_page #:layout => 'inspections.tlf'!
until (label_data.empty?) do!
read_as_col(label_data, 2) do |data_row_array|!
r.page.list(:list).add_row do |row|!
# Set details!
data_row_array.each_with_index do |col_array, _index|!
row.item(Symbol_table[_index][0]).value(col_array[:item_no])
row.item(Symbol_table[_index][1]).value(col_array[:date_deliv
row.item(Symbol_table[_index][2]).value(col_array[:time_deliv
結果
受注オーダー
ファイル
.xls
.pdf
「現状」
.doc
差し込み印刷
.xls
差し込みデータ
作成
「改善後」
受注オーダー
ファイル
.xls 帳票作成
プログラム
PDFファイル
出力
目標作業時間
15分 -> 15秒
達成
課題
1. PDFをインラインで表示したい(今はダ
ウンロードさせている)
2. ドキュメントが少ないので問題解決に時
間がかかる
3. 基本的にたのしすぎて家族と会話が少な
くなる
“Rubyで世界を変える!”
今後もRubyで寝食を忘れて
作業改善に取り組んでいく!
その後…
1. PDFをインラインで表示したい
headers["Content-Type"] = "application/pdf"!
headers["Content-Disposition"] = "inline;filename=pdicard.pdf"
解決!!

More Related Content

What's hot

ET2016 小さなRubyボード GR-CITRUSの紹介
ET2016 小さなRubyボード GR-CITRUSの紹介ET2016 小さなRubyボード GR-CITRUSの紹介
ET2016 小さなRubyボード GR-CITRUSの紹介
三七男 山本
 
RubySeminar16_Analyze
RubySeminar16_AnalyzeRubySeminar16_Analyze
RubySeminar16_Analyze
sady_nitro
 
Ruby with My Life
Ruby with My LifeRuby with My Life
Ruby with My Life
Hiroshi SHIBATA
 
出会い駆動コミュニティー
出会い駆動コミュニティー出会い駆動コミュニティー
出会い駆動コミュニティー
yoku0825
 
JRubyで作るapiサーバー
JRubyで作るapiサーバーJRubyで作るapiサーバー
JRubyで作るapiサーバー
Yamamoto Kazuhisa
 
20190910 rpalt
20190910 rpalt20190910 rpalt
20190910 rpalt
Hironari Ono
 
Nendo At Kansai Ruby Kaigi03
Nendo At Kansai Ruby Kaigi03Nendo At Kansai Ruby Kaigi03
Nendo At Kansai Ruby Kaigi03
Kiyoka Nishiyama
 
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Mrubyについて   第16回 岡山ruby, ruby on rails勉強会Mrubyについて   第16回 岡山ruby, ruby on rails勉強会
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Masaya Konishi
 
Ruby関西76 gr citrusの使い方#2
Ruby関西76 gr citrusの使い方#2Ruby関西76 gr citrusの使い方#2
Ruby関西76 gr citrusの使い方#2
三七男 山本
 
Happy Life Hacking Ruby on Rails
Happy Life Hacking Ruby on RailsHappy Life Hacking Ruby on Rails
Happy Life Hacking Ruby on Rails
Koichiro Ohba
 
Building Static Website With Github And Jekyll
Building Static Website With Github And JekyllBuilding Static Website With Github And Jekyll
Building Static Website With Github And JekyllYoji Shidara
 
Rubymotion
RubymotionRubymotion
Rubymotionjewel12
 
ET2016展示パネル
ET2016展示パネルET2016展示パネル
ET2016展示パネル
三七男 山本
 
ランダムにおちるfeature_system spec対策rspec-retry_ex の 紹介
ランダムにおちるfeature_system spec対策rspec-retry_ex の 紹介ランダムにおちるfeature_system spec対策rspec-retry_ex の 紹介
ランダムにおちるfeature_system spec対策rspec-retry_ex の 紹介
Yuya Taki
 
なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営を同時にやった話なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営を同時にやった話
ota42y
 
[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来Masahiro Nishimi
 
よちよち.rbで知ったコミュニティの素晴らしさ
よちよち.rbで知ったコミュニティの素晴らしさよちよち.rbで知ったコミュニティの素晴らしさ
よちよち.rbで知ったコミュニティの素晴らしさbonbon0605
 
よちよち.rbで知ったコミュニティの素晴らしさ
よちよち.rbで知ったコミュニティの素晴らしさよちよち.rbで知ったコミュニティの素晴らしさ
よちよち.rbで知ったコミュニティの素晴らしさshinyaogasawara
 
GC黄金時代
GC黄金時代GC黄金時代
GC黄金時代
Narihiro Nakamura
 
やさしいGemパッチの作り方
やさしいGemパッチの作り方やさしいGemパッチの作り方
やさしいGemパッチの作り方
Maki Toshio
 

What's hot (20)

ET2016 小さなRubyボード GR-CITRUSの紹介
ET2016 小さなRubyボード GR-CITRUSの紹介ET2016 小さなRubyボード GR-CITRUSの紹介
ET2016 小さなRubyボード GR-CITRUSの紹介
 
RubySeminar16_Analyze
RubySeminar16_AnalyzeRubySeminar16_Analyze
RubySeminar16_Analyze
 
Ruby with My Life
Ruby with My LifeRuby with My Life
Ruby with My Life
 
出会い駆動コミュニティー
出会い駆動コミュニティー出会い駆動コミュニティー
出会い駆動コミュニティー
 
JRubyで作るapiサーバー
JRubyで作るapiサーバーJRubyで作るapiサーバー
JRubyで作るapiサーバー
 
20190910 rpalt
20190910 rpalt20190910 rpalt
20190910 rpalt
 
Nendo At Kansai Ruby Kaigi03
Nendo At Kansai Ruby Kaigi03Nendo At Kansai Ruby Kaigi03
Nendo At Kansai Ruby Kaigi03
 
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Mrubyについて   第16回 岡山ruby, ruby on rails勉強会Mrubyについて   第16回 岡山ruby, ruby on rails勉強会
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
 
Ruby関西76 gr citrusの使い方#2
Ruby関西76 gr citrusの使い方#2Ruby関西76 gr citrusの使い方#2
Ruby関西76 gr citrusの使い方#2
 
Happy Life Hacking Ruby on Rails
Happy Life Hacking Ruby on RailsHappy Life Hacking Ruby on Rails
Happy Life Hacking Ruby on Rails
 
Building Static Website With Github And Jekyll
Building Static Website With Github And JekyllBuilding Static Website With Github And Jekyll
Building Static Website With Github And Jekyll
 
Rubymotion
RubymotionRubymotion
Rubymotion
 
ET2016展示パネル
ET2016展示パネルET2016展示パネル
ET2016展示パネル
 
ランダムにおちるfeature_system spec対策rspec-retry_ex の 紹介
ランダムにおちるfeature_system spec対策rspec-retry_ex の 紹介ランダムにおちるfeature_system spec対策rspec-retry_ex の 紹介
ランダムにおちるfeature_system spec対策rspec-retry_ex の 紹介
 
なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営を同時にやった話なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営を同時にやった話
 
[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来[RubyMotion LT] nitronに見るiosアプリ開発の未来
[RubyMotion LT] nitronに見るiosアプリ開発の未来
 
よちよち.rbで知ったコミュニティの素晴らしさ
よちよち.rbで知ったコミュニティの素晴らしさよちよち.rbで知ったコミュニティの素晴らしさ
よちよち.rbで知ったコミュニティの素晴らしさ
 
よちよち.rbで知ったコミュニティの素晴らしさ
よちよち.rbで知ったコミュニティの素晴らしさよちよち.rbで知ったコミュニティの素晴らしさ
よちよち.rbで知ったコミュニティの素晴らしさ
 
GC黄金時代
GC黄金時代GC黄金時代
GC黄金時代
 
やさしいGemパッチの作り方
やさしいGemパッチの作り方やさしいGemパッチの作り方
やさしいGemパッチの作り方
 

Similar to Thin reports再び

Jupyter x rise
Jupyter x riseJupyter x rise
Jupyter x rise
Shingo Tawada
 
Yapc2012ltthon
Yapc2012ltthonYapc2012ltthon
Yapc2012ltthon
Junya Murabe
 
るりまの1/nはMatsue.rbでできています。
るりまの1/nはMatsue.rbでできています。るりまの1/nはMatsue.rbでできています。
るりまの1/nはMatsue.rbでできています。Sho Hashimoto
 
桐島、Rubyやめるってよ
桐島、Rubyやめるってよ桐島、Rubyやめるってよ
桐島、Rubyやめるってよ
Narihiro Nakamura
 
Perlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyPerlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyazuma satoshi
 
Sinatraの紹介
Sinatraの紹介Sinatraの紹介
Sinatraの紹介longkey1
 
Raspberry pi最新情報アップデート&いろいろ比較
Raspberry pi最新情報アップデート&いろいろ比較Raspberry pi最新情報アップデート&いろいろ比較
Raspberry pi最新情報アップデート&いろいろ比較
Masafumi Ohta
 
Github pagesでRPubsにサヨナラ!
Github pagesでRPubsにサヨナラ!Github pagesでRPubsにサヨナラ!
Github pagesでRPubsにサヨナラ!
yutannihilation
 
Yokohama.vim
Yokohama.vimYokohama.vim
Yokohama.vim
gu4
 
Rails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱いRails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱い
ota42y
 
Sinatra Pattern 20130415
Sinatra Pattern 20130415Sinatra Pattern 20130415
Sinatra Pattern 20130415Naotoshi Seo
 

Similar to Thin reports再び (11)

Jupyter x rise
Jupyter x riseJupyter x rise
Jupyter x rise
 
Yapc2012ltthon
Yapc2012ltthonYapc2012ltthon
Yapc2012ltthon
 
るりまの1/nはMatsue.rbでできています。
るりまの1/nはMatsue.rbでできています。るりまの1/nはMatsue.rbでできています。
るりまの1/nはMatsue.rbでできています。
 
桐島、Rubyやめるってよ
桐島、Rubyやめるってよ桐島、Rubyやめるってよ
桐島、Rubyやめるってよ
 
Perlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobodyPerlbeginnes 9 lt_ytnobody
Perlbeginnes 9 lt_ytnobody
 
Sinatraの紹介
Sinatraの紹介Sinatraの紹介
Sinatraの紹介
 
Raspberry pi最新情報アップデート&いろいろ比較
Raspberry pi最新情報アップデート&いろいろ比較Raspberry pi最新情報アップデート&いろいろ比較
Raspberry pi最新情報アップデート&いろいろ比較
 
Github pagesでRPubsにサヨナラ!
Github pagesでRPubsにサヨナラ!Github pagesでRPubsにサヨナラ!
Github pagesでRPubsにサヨナラ!
 
Yokohama.vim
Yokohama.vimYokohama.vim
Yokohama.vim
 
Rails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱いRails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱い
 
Sinatra Pattern 20130415
Sinatra Pattern 20130415Sinatra Pattern 20130415
Sinatra Pattern 20130415
 

Recently uploaded

シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Eventシグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
K Kinzal
 
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
You&I
 
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdfクラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
TatsuyaHanayama
 
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdfCO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
yamamotominami
 
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer EventSolanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
K Kinzal
 
NIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしようNIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしよう
You&I
 

Recently uploaded (6)

シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Eventシグネチャで始めるRustプログラミング - Superteam Japan Developer Event
シグネチャで始めるRustプログラミング - Superteam Japan Developer Event
 
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
アジャイルの30年(Tree Decades of Agileというブログ記事に関する要約)
 
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdfクラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
クラウドネイティブにおけるセキュアなソフトウェア・サプライ・チェーンの考え方とベストプラクティス.pdf
 
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdfCO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
CO2排出量見える化・削減・報告クラウド「アスエネ」サービス紹介_Saleshub.pdf
 
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer EventSolanaで始めるRustプログラミング - Superteam Japan Developer Event
Solanaで始めるRustプログラミング - Superteam Japan Developer Event
 
NIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしようNIST Cybersecurity Framework 2.0の変更点整理をしよう
NIST Cybersecurity Framework 2.0の変更点整理をしよう
 

Thin reports再び