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
1
410
Let's Chat
Ruby and Elixir. An exploration of cross language communication
Garrett Heinlen
September 12, 2017
Tweet
Share
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
60
StudyGroups
gogogarrett
1
88
:gen_fsm meets elixir
gogogarrett
1
370
Intro into Ecto
gogogarrett
2
79
Hopscotch
gogogarrett
1
160
Ember Testing: is it a mirage?
gogogarrett
1
170
Elixir and Phoenix
gogogarrett
0
210
WTF is WF
gogogarrett
1
130
Other Decks in Education
See All in Education
Chapitre_2_-_Partie_3.pdf
bernhardsvt
0
210
Tangible, Embedded and Embodied Interaction - Lecture 7 - Next Generation User Interfaces (4018166FNR)
signer
PRO
0
2k
SJRC 2526
cbtlibrary
1
220
地区危機管理委員会 出前セミナー「ロータリーにおける危機管理」:膳所 和彦 氏(国際ロータリー第2720地区 パストガバナー・日田ロータリークラブ・医療法人恒心会ぜぜ医院 理事長):2720 Japan O.K. ロータリーEクラブ2026年2月16日卓話
2720japanoke
1
600
CoderDojoへようこそ ニンジャ&保護者向け (CoderDojo Guidance for Ninjas&Parents)
coderdojokodaira
1
120
多様なメンター、多様な基準
yasulab
6
20k
国際卓越研究大学計画|Science Tokyo(東京科学大学)
sciencetokyo
PRO
0
49k
SSH公開鍵認証 / 02-b-ssh
kaityo256
PRO
0
110
Postcards
gabrielramirezv
0
160
MySmartSTEAM 2526
cbtlibrary
0
210
演習:Gitの基本操作 / 04-git-basic
kaityo256
PRO
0
350
Data Presentation - Lecture 5 - Information Visualisation (4019538FNR)
signer
PRO
0
3k
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.5k
Statistics for Hackers
jakevdp
799
230k
The Invisible Side of Design
smashingmag
302
51k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.2k
HDC tutorial
michielstock
1
560
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Faster Mobile Websites
deanohume
310
31k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.4k
Leo the Paperboy
mayatellez
4
1.5k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.3k
Darren the Foodie - Storyboard
khoart
PRO
3
2.9k
GraphQLの誤解/rethinking-graphql
sonatard
75
11k
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!