Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
railsとserverless技術で鉄道アプリを作った話〜なぜ僕はrubyでバイナリをパース...
Search
free_world21
March 19, 2020
Technology
960
1
Share
railsとserverless技術で鉄道アプリを作った話〜なぜ僕はrubyでバイナリをパースしたのか〜
2020.03.19 銀座Rails#19@リモート開催時に使用したスライドです。
公開用のため一部修正してあります。
free_world21
March 19, 2020
More Decks by free_world21
See All by free_world21
RubyとGoでゼロから作る証券システム: 高信頼性が求められるシステムのコードの外側にある設計と運用のリアル
free_world21
0
440
DjangoとRailsを使って趣味として政治資金を透明化するプロダクトを作ってる話
free_world21
0
82
Ruby on Rails on Kubernetesってどうなの?
free_world21
0
30
大事なデータを守りたい!ActiveRecord Encryptionと、より安全かつ検索可能な暗号化手法の実装例の紹介
free_world21
0
52
Ruby on Rails と Django を比較してみる
free_world21
1
290
Shinjuku.rb#95:心の技術書紹介
free_world21
1
320
Rails engineを用いたゆるふわモジュラーモノリス のご紹介
free_world21
1
460
『Railsオワコン』と言われる時代に、なぜブルーモ証券はRailsを選ぶのか
free_world21
3
1.5k
東証障害報告書を読み解く
free_world21
0
300
Other Decks in Technology
See All in Technology
Zero-Downtime Migration: Moving a Massive, Historic iOS App from CocoaPods to SPM and Tuist without Stopping Feature Delivery
kagemiku
0
240
Hello UUID
mimifuwacc
0
140
2026年に相応しい 最先端プラグインホストの設計<del>と実装</del>
atsushieno
0
120
自分のハンドルは自分で握れ! ― 自分のケイパビリティを増やし、メンバーのケイパビリティ獲得を支援する ― / Take the wheel yourself
takaking22
1
510
終盤で崩壊させないAI駆動開発
j5ik2o
2
2.1k
会社紹介資料 / Sansan Company Profile
sansan33
PRO
17
410k
幾億の壁を超えて/Beyond Countless Walls(JP)
ikuodanaka
0
130
Azure Static Web Apps の自動ビルドがタイムアウトしやすくなった状況に対応した件/global-azure2026
thara0402
0
250
BigQuery × dbtでコスト削減した話
rightcode
0
140
NgRx SignalStore: The Power of Extensibility
rainerhahnekamp
0
230
今年60歳のおっさんCBになる
kentapapa
2
390
2026年度新卒技術研修 サイバーエージェントのデータベース 活用事例とパフォーマンス調査入門
cyberagentdevelopers
PRO
8
8.5k
Featured
See All Featured
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
330
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
430
Chasing Engaging Ingredients in Design
codingconduct
0
170
Claude Code のすすめ
schroneko
67
220k
Navigating Team Friction
lara
192
16k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
220
How to Ace a Technical Interview
jacobian
281
24k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
240
Designing Powerful Visuals for Engaging Learning
tmiket
1
340
How to Talk to Developers About Accessibility
jct
2
170
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
53k
Transcript
RAILSとSERVERLESS技術で 鉄道アプリを作った話 なぜ僕はRUBYでバイナリをパースしたのか 2020.03.19 銀座Rails#19 @free_world21
▪ ⼩林 ノエル(36) ▪ 職業︓ソフトウェアエンジニア – フリーランス – エメラダ株式会社 (emerada.co.jp)
執⾏役員 ▪ 2008: フリーランスエンジニアとして独⽴ – flash/C#/rails/iOS/Androidなどなど ▪ 2009: ⼤学院修了(情報理⼯学修⼠) ▪ 2009: IPA未踏事業に採択される ▪ 2016: エメラダ株式会社に参画 ▪ 2018: 同社執⾏役員 ▪ 〜現在: フリーランス&会社員として活動中 ▪ 趣味︓世界のコワーキングスペースめぐり (ワーケーション︖) @free_world21 ANA B777-300 NH11 THE FARM@NY nomad works@NY CARR WORKPLACE@Chicago
エメラダ株式会社 ▪ 2016年創業 ▪ ⾦融分野で3業種の登録をし、1業種は廃業 クラウドファンディング形式で 個⼈投資家が未上場のベンチャーに 投資できるサービス 2017年11⽉リリース *2019年10⽉事業譲渡
*証券業を廃業 2018年5⽉リリース 成⻑中⼩企業を中⼼に 累計10億円を融資実⾏ 成⻑中⼩企業向け オンラインレンディング サービス 銀⾏と中⼩企業を結ぶ 資⾦繰り管理&モニタリング サービス 2019年5⽉リリース 地銀&信⾦を中⼼に数⼗⾏(庫)に 導⼊済み emerada-bank.com emerada-marketplace.com
エメラダ株式会社 ▪ 2016年創業 ▪ ⾦融分野で3業種の登録をし、1業種は廃業 クラウドファンディング形式で 個⼈投資家が未上場のベンチャーに 投資できるサービス 2017年11⽉リリース *2019年10⽉事業譲渡
*証券業を廃業 2018年5⽉リリース 成⻑中⼩企業を中⼼に 累計10億円を融資実⾏ 成⻑中⼩企業向け オンラインレンディング サービス 銀⾏と中⼩企業を結ぶ 資⾦繰り管理&モニタリング サービス 2019年5⽉リリース 地銀&信⾦を中⼼に数⼗⾏(庫)に 導⼊済み emerada-bank.com emerada-marketplace.com 2020年 AI財務分析サービス リリース予定 *エンジニア絶賛募集中︕︕ **お気軽にお声がけください
今回は鉄道アプリ開発の はなし
鉄道システムの雑な説明 TTC(Total Trafic Control) PTC(Programed Trafic Control)
TTC(Total Trafic Control) PTC(Programed Trafic Control) TID(Traffic Information Display) TID
server TID client 鉄道システムの雑な説明
TTC(Total Trafic Control) PTC(Programed Trafic Control) TID(Traffic Information Display) TID
server client 鉄道システムの雑な説明 ⽬的 スマホアプリとして 表⽰したい︕ *スクショは既存アプリの例
TTC(Total Trafic Control) PTC(Programed Trafic Control) TID(Traffic Information Display) TID
server client 鉄道システムの雑な説明 バイナリ形式の データでやり取り client ⽬的 スマホアプリとして 表⽰したい︕ ここもやっぱり バイナリ *スクショは既存アプリの例
考案されたアーキテクチャ TID server TID clientもどき VPN Amazon VPC Amazon S3
Bucket JSONに変換 client ア プ リ に 配 信 *スクショは既存アプリの例
プロジェクト苦労話 ▪ 導⼊されていたTIDシステムは1990年代後半に設計されたもの – 仕様書の created_at が1998年 ▪ システム(仕様書)はIE4(当時の最新ブラウザ)を前提に設計されていた ▪
めちゃくちゃステートフルな設計 – クライアント側はまず初期状態データをもらい、その後は差分データをもらう ような仕様 – 通信回線が貧弱だった時代。1ビットも無駄にできない。 ▪ データはTCP/UDPソケット経由 – ︓「HTTP︖そんな軟派なプロトコルなんぞ信じられん」 ▪ 何故かもらえないサンプルデータ – エンジニア︓「どうやって開発しろと・・・」 – どうやって⼿に⼊れたかは⼝頭でのみ説明
Let’s parse binary data with Ruby
Array#pack, String#unpack ▪ String#unpack: バイナリデータを読み込んで⼈間が扱いやすい形にする ▪ Array#pack: ⼈間が扱い安い形をバイナリデータにする content =
File.read('./binary_data/input.data’) # 先頭1バイトを16進数として読み出し、10進数に変換 content[0].unpack("H*")[0].to_i(16) # 先頭2バイトを16進数として読み出し、10進数に変換 content[0..1].unpack("H*")[0].to_i(16) # 先頭4バイトを16進数として読み出し、10進数に変換 content[0..3].unpack("H*")[0].to_i(16)
Array#pack, String#unpack ▪ String#unpack: バイナリデータを読み込んで⼈間が扱いやすい形にする ▪ Array#pack: ⼈間が扱い安い形をバイナリデータにする content =
File.read('./binary_data/input.data’) # 先頭1バイトを16進数として読み出し、10進数に変換 content[0].unpack("H*")[0].to_i(16) # 先頭2バイトを16進数として読み出し、10進数に変換 content[0..1].unpack("H*")[0].to_i(16) # 先頭4バイトを16進数として読み出し、10進数に変換 content[0..3].unpack("H*")[0].to_i(16) "\xF0\xE1\u000F\u001E" ["f0e10f1e"] 4041281310
Array#pack, String#unpack ▪ String#unpack: バイナリデータを読み込んで⼈間が扱いやすい形にする ▪ Array#pack: ⼈間が扱い安い形をバイナリデータにする File.open("./binary_data/output.data", 'w+')
do |f| # 10進数を16進数に変換し、バイナリとして書き出す f.write [123.to_s(16)].pack("H*") # "E2 BB B0 F1"をバイナリとして書き出す f.write ["e2bbb0f1"].pack("H*") # "10110110" = \xB6 という2進数をバイナリとして書き出す decimal_number = "10110110".to_i(2) # いちど10進数にする f.write [decimal_number.to_s(16)].pack("H*") end
Maskをしたい時 "11101010" ▪ 例︓1バイトの中で真ん中4ビットが⾞両数(6両編成、8両編成、10両編成) 0xEA
Maskをしたい時 "11101010" ▪ 例︓1バイトの中で真ん中4ビットが⾞両数(6両編成、8両編成、10両編成) 0xEA ”00111100" & ”00101000" || 0x3c
0x28
Maskをしたい時 "11101010" ▪ 例︓1バイトの中で真ん中4ビットが⾞両数(6両編成、8両編成、10両編成) 0xEA ”00111100" & ”00101000" || 0x3c
0x28 mask_number = 0x3c # 0xea は実際はどこかから読み出される値 result = 0xea & mask_number # 2ビット右シフト num_of_car = result >> 2 => 10
Maskをしたい時 "11101010" ▪ 例︓1バイトの中で真ん中4ビットが⾞両数(6両編成、8両編成、10両編成) 0xEA ”00111100" & ”00101000" || 0x3c
0x28 0xea.to_s(2)[2..5].to_i(2) => 10 ⽂字列操作のほうが楽だったりする
余談︓rubyでソケット通信 ▪ TIDサーバは社内からしかアクセスできない ▪ しかし開発者は⼿元で開発したい – 常駐ぜったいしたくないマン ▪ Wi◦◦◦◦arkで通信の内容を解析 ▪
開発者が⼿元で動く疑似TIDサーバを実装 ▪ 疑似TIDサーバを相⼿に、列⾞情報のやりとりをするプログラムを実装 ▪ 本物のTIDサーバとつながったのはリリース3⽇前 assign_port_server = TCPServer.new('0.0.0.0', 21000) client = assign_port_server.accept req = client.recv(1) client.send ['00'].pack('H*'), 0 socket = TCPClient.new('0.0.0.0', 21000) socket.puts “hello, tcp server” Server Client
アプリからのアクセスはS3のみ ▪ AmazonS3は超優秀なWebサーバ – S3内のファイルはHTTP(S)でアクセス可能 ▪ iOS/Android両⽅対応しなければなかかったので、アプリ画⾯の多くはWebView ▪ Railsで列⾞在線位置画⾯の haml/JS/CSS
をコーディング ▪ hamlはActionView::Baseを使ってHTMLにレンダリングしてS3にデプロイ ▪ assets:precompileしたjs/cssをS3にデプロイ ▪ TIDサーバとやりとりするTIDクライアントもどきもrails内に実装 renderer = ActionView::Base.new("#{Rails.root}/app/views/") html = renderer.render ( template: "#{line_name}/index.html.haml", layout: ‘layouts/application.html.haml’)
実際のアーキテクチャ TID server TID clientもどき VPN Amazon VPC Amazon S3
Bucket JSONに変換 CI/CDでデプロイ アプリに配信 HTML内 のJSが 取 得 *スクショは既存アプリの例
まとめ ▪ 鉄道システムについて雑に説明しました ▪ Rubyでバイナリをパースする⽅法を紹介しました ▪ ServerlessにHTML/JS/CSS, JSONを配信する仕組みをご紹介しました ▪ 次回
– Rails with Serverlessについてもっとくわしく︖ – Railsとkubernetesについて︖ https://github.com/f-world21/binary_sample