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
1
940
railsとserverless技術で鉄道アプリを作った話〜なぜ僕はrubyでバイナリをパースしたのか〜
2020.03.19 銀座Rails#19@リモート開催時に使用したスライドです。
公開用のため一部修正してあります。
free_world21
March 19, 2020
Tweet
Share
More Decks by free_world21
See All by free_world21
DjangoとRailsを使って趣味として政治資金を透明化するプロダクトを作ってる話
free_world21
0
76
Ruby on Rails on Kubernetesってどうなの?
free_world21
0
25
大事なデータを守りたい!ActiveRecord Encryptionと、より安全かつ検索可能な暗号化手法の実装例の紹介
free_world21
0
45
Ruby on Rails と Django を比較してみる
free_world21
1
280
Shinjuku.rb#95:心の技術書紹介
free_world21
1
300
Rails engineを用いたゆるふわモジュラーモノリス のご紹介
free_world21
1
450
『Railsオワコン』と言われる時代に、なぜブルーモ証券はRailsを選ぶのか
free_world21
3
1.5k
東証障害報告書を読み解く
free_world21
0
290
Ruby/Railsの勉強会のおかげでブルーモ証券起業した
free_world21
2
510
Other Decks in Technology
See All in Technology
予期せぬコストの急増を障害のように扱う――「コスト版ポストモーテム」の導入とその後の改善
muziyoshiz
1
2.1k
配列に見る bash と zsh の違い
kazzpapa3
3
170
猫でもわかるKiro CLI(セキュリティ編)
kentapapa
0
130
私たち準委任PdEは2つのプロダクトに挑戦する ~ソフトウェア、開発支援という”二重”のプロダクトエンジニアリングの実践~ / 20260212 Naoki Takahashi
shift_evolve
PRO
2
210
20260208_第66回 コンピュータビジョン勉強会
keiichiito1978
0
200
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
93k
旅先で iPad + Neovim で iOS 開発・執筆した話
zozotech
PRO
0
100
1,000 にも届く AWS Organizations 組織のポリシー運用をちゃんとしたい、という話
kazzpapa3
0
190
ファインディの横断SREがTakumi byGMOと取り組む、セキュリティと開発スピードの両立
rvirus0817
1
1.7k
SREじゃなかった僕らがenablingを通じて「SRE実践者」になるまでのリアル / SRE Kaigi 2026
aeonpeople
6
2.6k
顧客の言葉を、そのまま信じない勇気
yamatai1212
1
370
プロダクト成長を支える開発基盤とスケールに伴う課題
yuu26
4
1.4k
Featured
See All Featured
エンジニアに許された特別な時間の終わり
watany
106
230k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.1k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
Believing is Seeing
oripsolob
1
59
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
180
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
750
Git: the NoSQL Database
bkeepers
PRO
432
66k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
1.9k
Navigating Team Friction
lara
192
16k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
440
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