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
Ruby Systems Programming
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Andy Delcambre
March 08, 2013
Programming
1.2k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Ruby Systems Programming
From Ruby on Ales 2013
Andy Delcambre
March 08, 2013
More Decks by Andy Delcambre
See All by Andy Delcambre
Git and GitHub at YAPC:Asia
adelcambre
1
3.4k
Git, GitHub, Etc
adelcambre
3
270
Systems Programming - SoCoded 2013
adelcambre
2
210
Debugging Production Service Oriented Systems
adelcambre
3
460
Ruby, Rails and Engine Yard - Úll
adelcambre
1
350
SFRuby Nov 2011 - Release Early and Release Often
adelcambre
2
99
Release early and Release often
adelcambre
2
560
Other Decks in Programming
See All in Programming
思考垂れ流し開発 ~音声入力 × AIエージェント × 開発ハーネスによる試行錯誤~
npostring
0
830
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
120
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
380
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
360
[PyCon KR 2026] More Variants, More Diversity for AI Accelerators
achimnol
0
130
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
170
自分的「カンファレンスの楽しみ方」
syumai
0
190
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
110
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
120
バグを直したら useEffect が消えた
colorful12
3
840
FastAPI の並行処理モデルを完全に理解する
hoto17296
9
3.8k
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
528
40k
So, you think you're a good person
axbom
PRO
2
2.1k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
230
The World Runs on Bad Software
bkeepers
PRO
72
12k
Ethics towards AI in product and experience design
skipperchong
2
360
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Statistics for Hackers
jakevdp
799
230k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
9.2k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
580
Evolving SEO for Evolving Search Engines
ryanjones
0
280
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
660
Git: the NoSQL Database
bkeepers
PRO
432
67k
Transcript
Ruby Systems Programming Andy delcambre Monday, March 11, 13
@adelcambre sounds like welcome Andy Delcambre Monday, March 11, 13
Monday, March 11, 13
gist Monday, March 11, 13
Monday, March 11, 13
diploma goes here Monday, March 11, 13
Delcambre Software Monday, March 11, 13
CS 333 Operating systems CS 494 Networking Monday, March 11,
13
Monday, March 11, 13
Ruby Systems Programming Monday, March 11, 13
“operate and control the computer hardware and to provide a
platform for running application software” http://en.wikipedia.org/wiki/System_software Monday, March 11, 13
User Mode Kernel Mode Monday, March 11, 13
User Mode Monday, March 11, 13
User Mode Math Monday, March 11, 13
User Mode Math Access Memory* Monday, March 11, 13
Kernel Mode Monday, March 11, 13
Kernel Mode Anything Monday, March 11, 13
Kernel Mode Anything Everything Monday, March 11, 13
User Mode Kernel Mode Monday, March 11, 13
User Mode Kernel Mode Your Program System Calls Monday, March
11, 13
Obligatory Jessica Monday, March 11, 13
$ strace -p <server pid> Monday, March 11, 13
Monday, March 11, 13
120,602 Calls One Request Monday, March 11, 13
linux$ wc -l syscall_table.S 326 Monday, March 11, 13
mov!eax, 5 mov!ebx, path mov!ecx, flags int!80h open(path, flags) Monday,
March 11, 13
linux$ cat syscall_table.S | grep -c sys_ni_syscal 65 Monday, March
11, 13
linux$ cat syscall_table.S | grep -c sys_ni_syscal 65 “Not Implemented”
Monday, March 11, 13
Monday, March 11, 13
1980 1970 1960 1990 Multics Unix (Unics) BSD BSD 4.2
TCP/IP Monday, March 11, 13
BSD Sockets Monday, March 11, 13
•socket() •bind() •listen() •accept() •send() and recv() •close() Monday, March
11, 13
TCP Client Server SYN SYN/ACK Data ACK Data/ACK FIN ACK
FIN ACK ACK Monday, March 11, 13
TCP Client Server SYN SYN/ACK Data ACK Data/ACK FIN ACK
FIN ACK ACK Monday, March 11, 13
TCP Client Server SYN SYN/ACK Data ACK Data/ACK FIN ACK
FIN ACK ACK Monday, March 11, 13
TCP Client Server SYN SYN/ACK Data ACK Data/ACK FIN ACK
FIN ACK ACK Monday, March 11, 13
$ lsof -p 34866 -a -i COMMAND PID TYPE NODE
NAME ruby 34866 IPv4 TCP 127.0.0.1:80 (LISTEN) ruby 34866 IPv4 TCP 127.0.0.1:80->127.0.0.1:61898 (ESTABLISHED) Monday, March 11, 13
HTTP Request GET /index.html HTTP/1.1 User-Agent: curl/7.24.0 Host: www.google.com Accept:
*/* Monday, March 11, 13
HTTP Response HTTP/1.1 200 OK Date: Tue, 05 Mar 2013
23:03:52 GMT Cache-Control: private, max-age=0 Content-Type: text/html Server: gws Transfer-Encoding: chunked <data> Monday, March 11, 13
There Will be Code Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end Require the socket lib Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end Some constants for later Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end socket = Socket.new(:INET, :STREAM) Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end socket.listen(5) Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end while client_socket = socket.accept[0] Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end path = client_socket.recv(1024).split[1] Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end path = client_socket.recv(1024).split[1] GET /index.html HTTP/1.1 Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end filename = File.expand_path("../#{path}", __FILE__) Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end if File.file?(filename) Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) OK = "HTTP/1.1 200 OK\n" Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end client_socket.send(NOT_FOUND, 0) Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end client_socket.send(NOT_FOUND, 0) NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found" Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end client_socket.close Monday, March 11, 13
require 'socket' NOT_FOUND = "HTTP/1.1 404 Not Found\nContent-Length: 9\n\nNot Found"
OK = "HTTP/1.1 200 OK\n" socket = Socket.new(:INET, :STREAM) sockaddr = Socket.sockaddr_in(11080, '127.0.0.1') socket.bind(sockaddr) socket.listen(5) while client_socket = socket.accept[0] path = client_socket.recv(1024).split[1] filename = File.expand_path("../#{path}", __FILE__) if File.file?(filename) contents = File.read(filename) client_socket.send(OK, 0) client_socket.send("Content-Length: #{contents.size}\n\n", 0) client_socket.send("#{contents}", 0) else client_socket.send(NOT_FOUND, 0) end client_socket.close end Monday, March 11, 13
def new_ipv6_server(addr, port, opt) opt.key?(:ipv6only) or return Kgio::TCPServer.new(addr, port) defined?(IPV6_V6ONLY)
or abort "Socket::IPV6_V6ONLY not defined, upgrade Ruby and/or your OS" sock = Socket.new(AF_INET6, SOCK_STREAM, 0) sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, opt[:ipv6only] ? 1 : 0) sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) sock.bind(Socket.pack_sockaddr_in(port, addr)) IO_PURGATORY << sock Kgio::TCPServer.for_fd(sock.fileno) end ret = IO.select(l, nil, SELF_PIPE, @timeout) and ready = ret[0] Unicorn Monday, March 11, 13
def new_ipv6_server(addr, port, opt) opt.key?(:ipv6only) or return Kgio::TCPServer.new(addr, port) defined?(IPV6_V6ONLY)
or abort "Socket::IPV6_V6ONLY not defined, upgrade Ruby and/or your OS" sock = Socket.new(AF_INET6, SOCK_STREAM, 0) sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, opt[:ipv6only] ? 1 : 0) sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) sock.bind(Socket.pack_sockaddr_in(port, addr)) IO_PURGATORY << sock Kgio::TCPServer.for_fd(sock.fileno) end ret = IO.select(l, nil, SELF_PIPE, @timeout) and ready = ret[0] Unicorn sock = Socket.new(AF_INET6, SOCK_STREAM, 0) Monday, March 11, 13
def new_ipv6_server(addr, port, opt) opt.key?(:ipv6only) or return Kgio::TCPServer.new(addr, port) defined?(IPV6_V6ONLY)
or abort "Socket::IPV6_V6ONLY not defined, upgrade Ruby and/or your OS" sock = Socket.new(AF_INET6, SOCK_STREAM, 0) sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, opt[:ipv6only] ? 1 : 0) sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) sock.bind(Socket.pack_sockaddr_in(port, addr)) IO_PURGATORY << sock Kgio::TCPServer.for_fd(sock.fileno) end ret = IO.select(l, nil, SELF_PIPE, @timeout) and ready = ret[0] Unicorn sock.bind( Socket.pack_sockaddr_in(port, addr)) Monday, March 11, 13
def new_ipv6_server(addr, port, opt) opt.key?(:ipv6only) or return Kgio::TCPServer.new(addr, port) defined?(IPV6_V6ONLY)
or abort "Socket::IPV6_V6ONLY not defined, upgrade Ruby and/or your OS" sock = Socket.new(AF_INET6, SOCK_STREAM, 0) sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, opt[:ipv6only] ? 1 : 0) sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) sock.bind(Socket.pack_sockaddr_in(port, addr)) IO_PURGATORY << sock Kgio::TCPServer.for_fd(sock.fileno) end ret = IO.select(l, nil, SELF_PIPE, @timeout) and ready = ret[0] Unicorn IO.select(l, nil, SELF_PIPE, @timeout) Monday, March 11, 13
Thanks! @adelcambre Monday, March 11, 13