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
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
260
Systems Programming - SoCoded 2013
adelcambre
2
200
Debugging Production Service Oriented Systems
adelcambre
3
450
Ruby, Rails and Engine Yard - Úll
adelcambre
1
340
SFRuby Nov 2011 - Release Early and Release Often
adelcambre
2
97
Release early and Release often
adelcambre
2
560
Other Decks in Programming
See All in Programming
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
160
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
430
yield再入門 #phpcon
o0h
PRO
0
830
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
1.4k
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
170
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
310
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
900
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
7.1k
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
100
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
560
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
290
その節約、円になってますか?
isamumumu
0
500
Featured
See All Featured
Discover your Explorer Soul
emna__ayadi
2
1.2k
Become a Pro
speakerdeck
PRO
31
6k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
190
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
Making Projects Easy
brettharned
120
6.7k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
500
Designing for humans not robots
tammielis
254
26k
Paper Plane
katiecoart
PRO
2
52k
Being A Developer After 40
akosma
91
590k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
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