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
Let's Chat
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Garrett Heinlen
September 12, 2017
Education
420
1
Share
Let's Chat
Ruby and Elixir. An exploration of cross language communication
Garrett Heinlen
September 12, 2017
More Decks by Garrett Heinlen
See All by Garrett Heinlen
Event Sourcing: Don't want to miss a thing
gogogarrett
0
120
Lets Program - A practical guide
gogogarrett
0
62
StudyGroups
gogogarrett
1
90
:gen_fsm meets elixir
gogogarrett
1
370
Intro into Ecto
gogogarrett
2
82
Hopscotch
gogogarrett
1
160
Ember Testing: is it a mirage?
gogogarrett
1
180
Elixir and Phoenix
gogogarrett
0
210
WTF is WF
gogogarrett
1
130
Other Decks in Education
See All in Education
Google Antigravity エージェント・フ ァーストな開発パラダイムへの招待
mickey_kubo
1
130
モブ社員がモブエンジニアを名乗って得られたこと_20260413
masakiokuda
4
450
2026年度春学期 統計学 第3回 クロス集計と感度・特異度,データの可視化 (2026. 4. 23)
akiraasano
PRO
0
110
From Participation to Outcomes
territorium
PRO
0
440
タイムマシンのつくりかた
nomizone
4
1.3k
小学校5,6年生向けキャリア教育 大人になるまでの道
sat
PRO
8
3.5k
Gluon Recruit Deck
gluon
0
170
勝手にCULTIBASE で広げよう、探究の輪! - CULTIVAL 2026
hiroc_sk
1
160
Interactive Tabletops and Surfaces - Lecture 5 - Next Generation User Interfaces (4018166FNR)
signer
PRO
1
2.1k
Data Physicalisation - Lecture 9 - Next Generation User Interfaces (4018166FNR)
signer
PRO
1
900
「機械学習と因果推論」入門 ② 回帰分析から因果分析へ
masakat0
0
620
勾配ブースティングと決定木の話 / gradient boosting and decision trees
kaityo256
PRO
5
1.1k
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Fireside Chat
paigeccino
42
3.9k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
Everyday Curiosity
cassininazir
0
200
Color Theory Basics | Prateek | Gurzu
gurzu
0
290
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
110
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
Skip the Path - Find Your Career Trail
mkilby
1
110
We Are The Robots
honzajavorek
0
220
Transcript
Let's Chat Ruby and Elixir. An exploration of cross language
communication
Hey, I'm Garre!
None
None
I work for Blake Education
We teach children
None
We use Ruby && Elixir
Why did we move? — really fast — immutable data
— parallel / concurrent — easy to isolate complexity into applications (microservices w/o http) — encourages better design — shiny — does your taxes — #1 hacker news
Agenda — Refresher on Ruby — Explain Redis — Explore
Sidekiq — Introduce Elixir — Demo — Recap
Refresher on Ruby
Ruby - Hash We use keys to unlock values
Ruby - Hash ! ! " # ! " $
! " %
Ruby - Hash ! my_house ! door_1 " # shower
! door_2 " $ living_room ! door_3 " % bedroom
Ruby - Hash my_house = { door_1: "shower", door_2: "living_room",
door_3: "bedroom", }
Ruby - Hash person = { name: "Garrett", age: 27,
hearthstone_rank: 3, fav_things: [] } person[:hearthstone_rank] # => 3 person[:fav_things] << "gummy bears" # => ["gummy bears"]
Ruby - Array An Array is a list of items
in order
Ruby - Array ! " # $ %
Ruby - Array
Ruby - Array a = [] # => [] a
<< "abc" # => ["abc"] a # => ["abc"] a.pop # => "abc" a # => []
Ruby - Array a = [] # => [] a.push("abc")
# => ["abc"] a # => ["abc"] a.pop # => "abc" a # => []
Ruby - Array Appending to a list x << y
x.push(y)
Ruby - Array Pulling items off a list x.pop(y)
Ruby - Array Push && Pop x.push(y) x.pop(y)
None
PushPop
Well, that's Ruby.
Explain Redis
Redis is a hash in the cloud.
$redis = {} # setter $redis[:thought] = "Where's the Elixir
already?" # getter $redis[:thought] # => "Where's the Elixir already?" # setter $redis[:drinks] << "little creatures" $redis[:drinks] << "150 lashes" # getter $redis[:drinks] # => ["little creatures", "150 lashes"]
$ redis-cli set thought "Where's the Elixir already?" get thought
# => "Where's the Elixir already?" rpush drinks "little creatures" rpush drinks "150 lashes" lrange drinks 0 -1 # => 1) "little creatures" # => 2) "150 lashes" lpop drinks # => "little creatures"
Redis Desktop Manager
Explore Sidekiq
Sidekiq framework for background job processing
Why do I need a Sidekiq
¯\(ϑ)/¯
Common Use cases — Emails — Expensive computation — Imagine
Processing — Reports — Etc..
None
Sidekiq is built on 3 parts — Client — push
jobs into redis — Redis — store the jobs — Server — process the jobs
Client MyWorker.perform_async({abc: "123", simple_as: "drm"}) Redis rpush queue:default "{\"class\":\"MyWorker\",\"args\":[{\"abc\":\"123\",\"simple_as\":\"drm\"], \"retry\":true,\"queue\":\"default\",
\"jid\":\"f03cd72fef59bfbbf4098890\", \"created_at\":1503728661.8513222,\"enqueued_at\":1503728661.851379}" Server class MyWorker include Sidekiq::Worker def perform(hash) puts hash.inspect # => {abc: "123", simple_as: "drm"} end end
Client class SomethingSingularOrPluarl < BigBaseController def create MyWorker.perform_async(superfriend_params) head :created
end private def superfriend_params params.permit! # {abc: "123", simple_as: "drm"} end end
Redis
Server class MyWorker include Sidekiq::Worker def perform(hash) puts hash.inspect #
=> {abc: "123", simple_as: "drm"} end end
Lets Chat, A practical application
Sidekiq - how does it work? # clients rpush "redis:jobs"
{assignee: "Audience Member", task: "Greet your neighbour"} rpush "redis:jobs" {assignee: "Audience Member", task: "Take a drink"} rpush "redis:jobs" {assignee: "Audience Member", task: "Heckle louder"} rpush "redis:jobs" {assignee: "Audience Member", task: "Do Garrett's Taxes"} # sidekiq while true job = lpop "redis:jobs" if job AudienceMember.perform(job) end end
None
Well, thats Sidekiq.
Introduce Elixir
Elixir can act as the Server.
Exq job processing library compatible with Sidekiq for Elixir
Configure Exq config :exq, host: "localhost", port: 6379, namespace: "",
concurrency: 10, queues: ["default"], poll_timeout: 200
Ruby Sidekiq Server class MyWorker include Sidekiq::Worker def perform(hash) puts
hash.inspect # => {abc: "123", simple_as: "drm"} end end
Elixir Sidekiq Server defmodule MyWorker do def perform(map) do IO.inspect(map)
# => %{abc: "123", simple_as: "drm"} end end
Demo Time !
None
Recap — Redis is a Hash — We push jobs
into a list — We pull jobs off the list — We can process the jobs with Ruby or Elixir — Exq is the Elixir Sidekiq
Thanks @gogogarre!