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
Kiro IDEのドキュメントを全部読んだので地味だけどちょっと嬉しい機能を紹介する
khmoryz
0
210
顧客の言葉を、そのまま信じない勇気
yamatai1212
1
370
SREチームをどう作り、どう育てるか ― Findy横断SREのマネジメント
rvirus0817
0
360
10Xにおける品質保証活動の全体像と改善 #no_more_wait_for_test
nihonbuson
PRO
2
340
AIエージェントに必要なのはデータではなく文脈だった/ai-agent-context-graph-mybest
jonnojun
1
250
Oracle Cloud Observability and Management Platform - OCI 運用監視サービス概要 -
oracle4engineer
PRO
2
14k
外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night
soudai
PRO
12
5.6k
Amazon Bedrock Knowledge Basesチャンキング解説!
aoinoguchi
0
170
Bill One急成長の舞台裏 開発組織が直面した失敗と教訓
sansantech
PRO
2
410
Greatest Disaster Hits in Web Performance
guaca
0
300
制約が導く迷わない設計 〜 信頼性と運用性を両立するマイナンバー管理システムの実践 〜
bwkw
3
1.1k
StrandsとNeptuneを使ってナレッジグラフを構築する
yakumo
1
130
Featured
See All Featured
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
260
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
410
Reality Check: Gamification 10 Years Later
codingconduct
0
2k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
180
GraphQLとの向き合い方2022年版
quramy
50
14k
How to train your dragon (web standard)
notwaldorf
97
6.5k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
140
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Making Projects Easy
brettharned
120
6.6k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.7k
RailsConf 2023
tenderlove
30
1.3k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
110
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