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
980
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
1
5.5k
DjangoとRailsを使って趣味として政治資金を透明化するプロダクトを作ってる話
free_world21
0
88
Ruby on Rails on Kubernetesってどうなの?
free_world21
0
34
大事なデータを守りたい!ActiveRecord Encryptionと、より安全かつ検索可能な暗号化手法の実装例の紹介
free_world21
0
58
Ruby on Rails と Django を比較してみる
free_world21
1
300
Shinjuku.rb#95:心の技術書紹介
free_world21
1
340
Rails engineを用いたゆるふわモジュラーモノリス のご紹介
free_world21
1
480
『Railsオワコン』と言われる時代に、なぜブルーモ証券はRailsを選ぶのか
free_world21
3
1.5k
東証障害報告書を読み解く
free_world21
0
330
Other Decks in Technology
See All in Technology
MCP Appsを作ってみよう
iwamot
PRO
4
670
2026TECHFRESH畢業分享會 - 原生還是跨平台? App 開發踩坑實錄
line_developers_tw
PRO
0
1.2k
自宅LLMの話
jacopen
1
600
MUSUBI 田中裕一『AIと共に行う「しごとのリデザイン」- スモールバックオフィス編』AI Ops Lab #4
musubi
0
210
入門!AWS Blocks
ysuzuki
1
140
FinOps × AIエージェントで実現する コストインシデントの自動調査
oasis1994liveforever
0
150
AGENTS.mdとSkillsで始めるAIエージェント活用
sonoda_mj
3
220
機械学習を「社会実装」するということ 2026年夏版 / Social Implementation of Machine Learning June 2026 Version
moepy_stats
6
2.4k
2026TECHFRESH畢業分享會 - Lightning Talk - 資料也要 CI/CD? 用 Airbyte 自動化資料同步
line_developers_tw
PRO
0
1.1k
AWS Security Agent といっしょに脅威モデリングをやってみよう
amarelo_n24
0
110
脆弱性対応、どこで線を引くか
rymiyamoto
1
400
新しいUbuntu/GNOMEが使いたいからXからWaylandへ移行頑張ってるの巻 2026-06-20
nobutomurata
0
130
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Amusing Abliteration
ianozsvald
1
200
GraphQLとの向き合い方2022年版
quramy
50
15k
A designer walks into a library…
pauljervisheath
211
24k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.3k
Between Models and Reality
mayunak
4
340
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
390
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
390
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.9k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
62
54k
The Limits of Empathy - UXLibs8
cassininazir
1
360
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
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