SlideShare a Scribd company logo
1 of 146
Download to read offline
STATELY STATE MACHINES WITH RAGEL
RubyConf 2015
Ian Duggan
GOALS FOR THIS TALK
1. Convince you that Ragel is worth trying.
2. Give you some intui?on about how it works.
3. Show you how to setup a basic parser.
HELLO
My name is Ian Duggan
I PLAY HOCKEY
Several ?mes a week.
I PLAY GUITAR
And banjo. And mandolin. And ukulele. Poorly. I have a fiddle
that's gathering dust.
SOMETIMES I FLY
I LOVE MY CATS
THEY ARE GOOFBALLS
BUT VERY FURRY
AND DOPEY
AND RELAXED
AND FUN
SOFTWARE! FTW!
I'm a soKware dude. I code things. I code the internets and
the googles. I'm also a recovering technology entrepreneur.
I've been in and out of startup ins?tu?ons my en?re life.
CURRENT STATUS
WE’RE HIRING (OF COURSE)
Lots of Ruby.
WE’RE HIRING (OF COURSE)
Lots of Go.
I’M A RUBYIST, SINCE 1.6
I've been using Ruby casually since the 1.6 days, and
professionally for more than a decade.
TODAY IS ABOUT RAGEL
RAGEL IS REALLY COOL
If you don't have it in your bat-belt yet, you need to add it.
Today!
RUBY PROJECTS USING RAGEL
•Mongrel, Unicorn, Puma
•Whitequark
•Mail
•RedCloth
•Hpricot
•Gherkin
h"p://github.com/whitequark/parser/blob/master/lib/parser/lexer.rl
WHAT DOES RAGEL LOOK LIKE?
BUT REGULAR EXPRESSIONS ARE EASY!
Regular expressions consist of constants and operator
symbols that denote sets of strings and opera?ons over
these sets, respec?vely. (from Wikipedia)
RUBY HAS GREAT TOOLS FOR REGULAR
EXPRESSIONS
You can get by with them. You can especially get by with
them in Ruby which draws its heritage from Perl, Sed, and
Awk which made wonderful use of regexps.
IRREGULAR EXPRESSIONS
zarro boogs found
SOMETIMES YOU WANT MORE CONTROL
I posit that this might be some sort of automaton.
FINITE AUTOMATA
• Have states and transi?ons.
• Change state based on sequence of inputs.
• DFA can be in only one state at a ?me.
• NFA can be in more than one state at a ?me.
EQUIVALENCE OF REGULAR EXPRESSIONS,
NFAS, AND DFAS
It is possible to convert freely between
regular expressions, determinis9c finite
automata, and nondeterminis9c finite
automata. Given one, we can convert it to
any of the other forms.
h"p://faculty.ycp.edu/~dhovemey/fall2008/cs340/notes/lecture3.html
THESE ARE ALL STATE MACHINES
State machines are an important tool in computer
programming, and Ragel is a wonderful tool for crea?ng
them.
STATE MACHINES ARE EVERYWHERE
THEY’RE IN YOUR STOPLIGHT
THEY RUN YOUR CPU
THERE ARE EXAMPLES EVERYWHERE
• watch with ?mer
• vending machine
• traffic light
• bar code scanner
• gas pumps
• number classifica?on
THE CAT'S MEOW?
State machines are great for many reasons. They are simple
to understand, and there has been a great deal of research
around finite automata and state machines. With the right
approach they can also produce code that is faster, easier to
maintain, and more correct and thus, more secure.
STILL NOT CONVINCED?
Rather than me trying to convince you that they're useful,
let's just talk about them for a bit and see where we end up.
LET’S GO OVER SOME
VOCABULARY
START STATE
This is the ini?al state of a machine.
(S0)
ACCEPT STATE
In this state, the machine is said to have "accepted" the input.
(double circle)
TRANSITION
Upon consuming a single character, the machine can move
from one state to another.
(labelled arrow)
EPSILON TRANSITION
Allows an automaton to change its state spontaneously, i.e.
without consuming an input symbol.
SIMPLE MACHINES
'a', 'a'*, 'a'+
MORE COMPLEX
'hello'*
Zero or more hellos.
WHAT’S THE BIG DEAL?
They just look like regular expressions.
WHAT IS RAGEL EXACTLY?
Ragel is a finite-state machine compiler with
output support for C, C++, C#, Objec9ve-C, D,
Java, OCaml, Go, and Ruby source code. It
supports the genera9on of table or control flow
driven state machines from regular expressions
and/or state charts and can also build lexical
analysers via the longest-match method. Ragel
specifically targets text parsing and input
valida9on.
h"ps://en.wikipedia.org/wiki/Ragel
STATE MACHINE GENERATION
Ragel supports the genera9on of table or control flow
driven state machines from regular expressions and/or
state charts and can also build lexical analysers via the
longest-match method. A unique feature of Ragel is that
user ac9ons can be associated with arbitrary state
machine transi9ons using operators that are integrated
into the regular expressions. Ragel also supports
visualiza9on of the generated machine via graphviz.
h"ps://en.wikipedia.org/wiki/Ragel
HOW DO YOU PRONOUNCE IT?
• RAY-gull?
• RAY-jul?
• RAH-gull?
• RAH-jul?
LET’S GET IT FROM THE HORSE’S MOUTH
ADRIAN D. THURSTON CREATED RAGEL
h"ps://www.mail-archive.com/ragel-
users@complang.org/msg00344.html
WELL, DARN. I’VE BEEN
PRONOUNCING IT WRONG
FOR QUITE SOME TIME!
RAGEL IS A DSL FOR CREATING STATE
MACHINES
It is espcially useful for parsing protocols and data formats.
(HTTP, XML, JSON, CSS, etc...)
LET’S LOOK AT THE DSL
GENERAL STRUCTURE OF A RAGEL FILE
• Mostly in the host language
• has a .rl extension (simple.rl)
• %% is used for inline statements
• %%{ is used for mul?line statements }%%
NAMING A MACHINE
With named machines, you can spread a
machine's statements across several files or
include common sec?ons.
MACHINE DEFINITION
You define a machine using the equals operator.
This allows it to be referenced later.
MACHINE INSTANTIATION
This causes the actual genera?on of the referenced set of states.
Each instan?a?on generates a dis?nct set of states.
FILE INCLUSION AND IMPORT
You can include and import defini?ons from other files.
These can help you keep things organized. See the manual
for the specific seman?cs of each.
WHITESPACE
Any amount of whitespace can separate tokens.
COMMENTS
LITERALS
Literals are contained in quotes, regexp slashes, or brackets
for groupings.
ESCAPE CHARACTERS
You can escape the end of a line with a  (as in shell
scrip?ng)
HOST LANGUAGE CODE
Braces are used to delimit host language code
NUMBERS
Integers and hexadecimals can be used to refer to numbers
KEYWORDS
CONCATENATION LITERAL
Match on a sequence of lelers.
UNION EXPRESSION
ZERO LENGTH MACHINES
NUMERICAL LITERAL
Produces a two-state machine with one transi?on on the
given value, which can be given in decimal or hexadecimal.
REGULAR EXPRESSION
RANGE EXPRESSION
Matches any character between 'a' and 'z' inclusive.
VARIABLE NAME
Inserts the machine referenced by this name.
BUILTIN MACHINES
BUILDING BLOCKS
We have simple machines now.
Like levers, wedges, wheels, and pulleys.
But let's not stop here.
From simple machines we can make complex machines.
SIMPLE
COMPLEX
ISN’T SHE CUTE?
COMPOSITION
Ragel's DSL allows you to take these simple machines, and
through some basic operators, combine those into bigger
machines, and then combine those into BIGGER machines.
COMPOSITIONAL OPERATORS
UNION
Matches any string in machine one or machine two
UNION EXAMPLE
INTERSECTION
Matches any string that is in both machine one and two.
INTERSECTION EXAMPLE
DIFFERENCE
Matches strings in machine one but not in machine two
DIFFERENCE EXAMPLE
STRONG DIFFERENCE
Matches any string of the first machine that does not have
any string of the second machine as a substring.
Equivalent to:
STRONG DIFFERENCE EXAMPLE
Used to excluded CRLF from a sequence.
The DEF transi?on is taken if no other transi?on can be taken.
CONCATENATION
Matches all the strings in machine one followed by all the
strings in machine two.
CONCATENATION EXAMPLE
KLEENE STAR
Match zero or more repe??ons of the machine it is applied to.
KLEENE STAR EXAMPLE
ONE OR MORE REPETITION
Produces the concatena?on of the machine with the kleene
star of itself. The result will match one or more repe??ons of
the machine.
Equivalent to:
OPTIONAL
Equivalent to:
OPTIONAL EXAMPLE
REPETITION
NEGATION
Matches any string not matched by the given machine.
Equivalent to:
NEGATION EXAMPLE
CHARACTER-LEVEL NEGATION
Equivalent to:
STATE MACHINE MINIMIZATION
• Reduces the number of states through op?miza?on
• Merges equivalent states
• On by default (can be disabled with -n)
USER ACTIONS
Composi?on is definitely cool and useful. But on top of that,
Ragel gives you embedded ac?ons. This is where you take all
the composi?on and really make it sing, on key.
EMBEDDING ACTIONS
Ac?ons can be referenced by name or embedded inline.
TRANSITIONS
Transi?ons come in four classes, and ac?ons can be alached
to any of them.
ENTERING TRANSITION
Embeds an ac?on into all transi?ons leaving the "start state"
FINISHING TRANSITION
Embeds an ac?on into all transi?ons going into a "final state"
ALL TRANSITION
Embeds an ac?on into all transi?ons, regardless of type
(useful for debugging).
LEAVING TRANSITION
Embeds an ac?on into all transi?ons leaving the machine
from a "final state"
EMBEDDING OPERATORS CAN GET FANCY
See the manual for more informa?on on these:
• To-State Ac?ons
• From-State Ac?ons
• EOF Ac?ons
• Global Error Ac?ons (for error recovery)
• Local Error Ac?ons (for error recovery)
NONDETERMINISM
One of the problems you will run into is when the trailing
match of one machine is the same as the leading match of
the next machine. In these cases, the state will be stuck in
the first machine and never transi?on to the next machine.
NONDETERMINISM EXAMPLE
The n in ws will prevent the final n from matching.
The solu?on here is simple: exclude the newline character
from the ws expression.
AMBIGUITY PROBLEMS
Here's an incorrect way to parse C language comments:
The any will prevent the trailing */ from ever matching.
THIS WORKS BUT IT’S UGLY
We have to carefully exclude things to get it to match.
THIS IS GETTING COMPLICATED!
But there’s a solu?on.
Ragel lets you embed priori?es into transi?ons to deal with
ambiguity.
SETTING PRIORITIES MANUALLY
NAMESPACING PRIORITIES
When machines are combined, you can get odd interac?ons
if you don't namespace the priori?es.
GUARDED OPERATIONS
Thinking in priori?es is hard.
Fortunately, Ragel provides some beler mechanisms for us
to use.
These are called “guarded concatena?ons”
FINISH-GUARDED CONCATENATION
A higher priority is then embedded into the transi?ons of the
second machine that enter into a final state.
This is much simpler to visualize and reason about.
ENTRY-GUARDED CONCATENATION
A higher priority is given to the second machine.
Equivalent to:
LEFT-GUARDED CONCATENATION
The leK hand machine has a higher priority.
For stripping leading space:
LONGEST-MATCH KLEENE STAR
This has a higher priority for staying in the machine rather
than wrapping around again.
SCANNERS
Scanners are a common thing to build with Ragel, so it has
special support for them.
SCANNER EXAMPLE
Tokenizing the contents of a header field:
PROTOCOL PARSING
Ragel is well suited for protocol parsing.
Mapping an RFC onto a Ragel specifica?on is prely straight-
forward.
Puma has a good example of this (heritage is the original
mongrel parser by Zed Shaw)
h"ps://github.com/puma/puma/blob/master/ext/puma_h"p11/h"p11_parser_common.rl
STATE CHARTS
Ragel allows you to specify states and transi?ons directly if
you desire extreme customiza?on.
This is like programming in the "assembly" of Ragel.
There are a few new operators for this.
STATE CHART EXAMPLE
Parsing XML CDATA
PARSER MODULARIZATION
PARSING RECURSIVE STRUCTURES
The general trick is to store some context about where
you are in your recursive structure, say in a stack called
@nesMngs, and push/pop to it as appropriate. When it
comes ?me to call fret, you can examine your @nesMngs
and steer the parser as deemed appropriate.
IMPLEMENTING LOOKAHEAD
This is possible. The trick here is to match deeper than you
need, then use fhold to walk the parser back a few
characters.
RAGEL INTERNALS
Ragel uses several variables for state. You can twiddle
them in ac?ons.
Those are the major ones. See the manual for more details.
RAGEL OPERATION (ROUGHLY)
1. Starts in state 0
2. Feed it data, upda?ng p and pe as appropriate
3. Run the %%exec loop
4. Characters move it through a state
5. It consumes p -> pe from data
6. If cs is >= first_final_state (final states are
last) then you have “admiled” the string
RAGEL OPERATION (SCANNERS)
Scanners are a bit more involved, but not that much more.
1. Use a stack to track states
2. Use ts -> te to track where they are in a match
3. Use the stack to backtrack when necessary
4. Keep matching repeatedly un?l we are done
5. Longest match wins
6. It's useful to create helper methods (emit, 

current_buffer, current_match(start, end))
RAGEL STRING EXTRACTION
To pull out the data you care about, while you are parsing, you will do
something like this:
HOST LANGUAGES
Several host languages are available.
CODE STYLES
Ragel uses your .rl code to compute the set of states and transi?ons.
From that, it can generate code in a number of different styles.
CODE STYLES PERFORMANCE
Each of these has different visual organiza?on and
performance characteris?cs. In languages like C, this can boil
down to heavily-op?mized GOTO statements in a single
while loop. It's fast and cpu-cache friendly.
MULTI-LANGUAGE
It's possible to have a single Ragel defini?on that uses import
seman?cs to allow implemen?ng the ac?ons in different
languages using the same parent Ragel file. See the hlp11
parser in puma for details (C and Java)
h"ps://github.com/puma/puma/tree/master/ext/puma_h"p11
RAGEL IN C
It's also possible to prototype in Ruby, then convert it to a C
module for super-speed. Ragel supports several output
formats so you can do this port rather easily.
Again, see mongrel or puma for ideas.
RAGEL DIRECTIVES - INIT
Ini?alizes the data buffer and sets the current state:
RAGEL DIRECTIVES - DATA
Writes out defini?ons of the state and transi?on data:
RAGEL DIRECTIVES - EXEC
Writes out the code that processes the data buffer
using the state and transi?on data:
%%WRITE DATA;
%%WRITE INIT;
%%WRITE EXEC;
INSTALLATION
GENERATING THE RUBY
simple.rl -> simple.rb
VISUALIZATION
You can get a dotviz graph.
CALLING FROM RUBY
To run on a single buffer of String data:
RAGEL PLAYGROUND
I created a tool in Volt to do some basic visualiza?on.
It's definitely a work in progress, but feel free to try it out.
h"ps://github.com/ijcd/ragel_playground
DEMOS
• hello parser
• args parser
• args state chart
TALK TO ME, BABY!
@ijcd
github.com/ijcd
h"ps://github.com/ijcd/ragel_playground
h"ps://github.com/ijcd/rubyconf-2015-ragel
h"p://www.colm.net/open-source/ragel/

More Related Content

Similar to RubyConf 2015 - Stately State Machines with Ragel - Ian Duggan

Regular Expression to Non-Deterministic Finite Automata Converter
Regular Expression to Non-Deterministic Finite Automata ConverterRegular Expression to Non-Deterministic Finite Automata Converter
Regular Expression to Non-Deterministic Finite Automata ConverterIRJET Journal
 
ReDoS - Regular Expession Denial of Service
ReDoS - Regular Expession Denial of ServiceReDoS - Regular Expession Denial of Service
ReDoS - Regular Expession Denial of ServiceFrancesco Lacerenza
 
Loop in C Properties & Applications
Loop in C Properties & ApplicationsLoop in C Properties & Applications
Loop in C Properties & ApplicationsEmroz Sardar
 
C# language basics (Visual Studio)
C# language basics (Visual Studio) C# language basics (Visual Studio)
C# language basics (Visual Studio) rnkhan
 
C# language basics (Visual studio)
C# language basics (Visual studio)C# language basics (Visual studio)
C# language basics (Visual studio)rnkhan
 
JavaScript: Core Part
JavaScript: Core PartJavaScript: Core Part
JavaScript: Core Part維佋 唐
 
Functional Programming for OO Programmers (part 1)
Functional Programming for OO Programmers (part 1)Functional Programming for OO Programmers (part 1)
Functional Programming for OO Programmers (part 1)Calvin Cheng
 
Chapter 2: Introduction to Bash Scripting
Chapter 2: Introduction to Bash ScriptingChapter 2: Introduction to Bash Scripting
Chapter 2: Introduction to Bash Scriptingazzamhadeel89
 
States, state graphs and transition testing
States, state graphs and transition testingStates, state graphs and transition testing
States, state graphs and transition testinggeethawilliam
 
States, state graphs and transition testing
States, state graphs and transition testingStates, state graphs and transition testing
States, state graphs and transition testingABHISHEK KUMAR
 
advancedzplmacroprogramming_081820.pptx
advancedzplmacroprogramming_081820.pptxadvancedzplmacroprogramming_081820.pptx
advancedzplmacroprogramming_081820.pptxssuser6a1dbf
 

Similar to RubyConf 2015 - Stately State Machines with Ragel - Ian Duggan (20)

Regular Expression to Non-Deterministic Finite Automata Converter
Regular Expression to Non-Deterministic Finite Automata ConverterRegular Expression to Non-Deterministic Finite Automata Converter
Regular Expression to Non-Deterministic Finite Automata Converter
 
ReDoS - Regular Expession Denial of Service
ReDoS - Regular Expession Denial of ServiceReDoS - Regular Expession Denial of Service
ReDoS - Regular Expession Denial of Service
 
Programming-in-C
Programming-in-CProgramming-in-C
Programming-in-C
 
22 Jop Oct 08
22 Jop Oct 0822 Jop Oct 08
22 Jop Oct 08
 
Loop in C Properties & Applications
Loop in C Properties & ApplicationsLoop in C Properties & Applications
Loop in C Properties & Applications
 
Programming in Arduino (Part 2)
Programming in Arduino  (Part 2)Programming in Arduino  (Part 2)
Programming in Arduino (Part 2)
 
C# language basics (Visual Studio)
C# language basics (Visual Studio) C# language basics (Visual Studio)
C# language basics (Visual Studio)
 
C# language basics (Visual studio)
C# language basics (Visual studio)C# language basics (Visual studio)
C# language basics (Visual studio)
 
Core java
Core javaCore java
Core java
 
JavaScript: Core Part
JavaScript: Core PartJavaScript: Core Part
JavaScript: Core Part
 
Loops
LoopsLoops
Loops
 
Functional Programming for OO Programmers (part 1)
Functional Programming for OO Programmers (part 1)Functional Programming for OO Programmers (part 1)
Functional Programming for OO Programmers (part 1)
 
Chapter 2: Introduction to Bash Scripting
Chapter 2: Introduction to Bash ScriptingChapter 2: Introduction to Bash Scripting
Chapter 2: Introduction to Bash Scripting
 
States, state graphs and transition testing
States, state graphs and transition testingStates, state graphs and transition testing
States, state graphs and transition testing
 
States, state graphs and transition testing
States, state graphs and transition testingStates, state graphs and transition testing
States, state graphs and transition testing
 
Cursors.ppt
Cursors.pptCursors.ppt
Cursors.ppt
 
advancedzplmacroprogramming_081820.pptx
advancedzplmacroprogramming_081820.pptxadvancedzplmacroprogramming_081820.pptx
advancedzplmacroprogramming_081820.pptx
 
phases of compiler
phases of compilerphases of compiler
phases of compiler
 
C Language Presentation.pptx
C Language Presentation.pptxC Language Presentation.pptx
C Language Presentation.pptx
 
Programming in C
Programming in CProgramming in C
Programming in C
 

Recently uploaded

Effective Strategies for Wix's Scaling challenges - GeeCon
Effective Strategies for Wix's Scaling challenges - GeeConEffective Strategies for Wix's Scaling challenges - GeeCon
Effective Strategies for Wix's Scaling challenges - GeeConNatan Silnitsky
 
Test Automation Design Patterns_ A Comprehensive Guide.pdf
Test Automation Design Patterns_ A Comprehensive Guide.pdfTest Automation Design Patterns_ A Comprehensive Guide.pdf
Test Automation Design Patterns_ A Comprehensive Guide.pdfkalichargn70th171
 
Workshop - Architecting Innovative Graph Applications- GraphSummit Milan
Workshop -  Architecting Innovative Graph Applications- GraphSummit MilanWorkshop -  Architecting Innovative Graph Applications- GraphSummit Milan
Workshop - Architecting Innovative Graph Applications- GraphSummit MilanNeo4j
 
[GRCPP] Introduction to concepts (C++20)
[GRCPP] Introduction to concepts (C++20)[GRCPP] Introduction to concepts (C++20)
[GRCPP] Introduction to concepts (C++20)Dimitrios Platis
 
Automate your OpenSIPS config tests - OpenSIPS Summit 2024
Automate your OpenSIPS config tests - OpenSIPS Summit 2024Automate your OpenSIPS config tests - OpenSIPS Summit 2024
Automate your OpenSIPS config tests - OpenSIPS Summit 2024Andreas Granig
 
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024SimonedeGijt
 
OpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCAOpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCAShane Coughlan
 
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024MulesoftMunichMeetup
 
Auto Affiliate AI Earns First Commission in 3 Hours..pdf
Auto Affiliate  AI Earns First Commission in 3 Hours..pdfAuto Affiliate  AI Earns First Commission in 3 Hours..pdf
Auto Affiliate AI Earns First Commission in 3 Hours..pdfSelfMade bd
 
UNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale Ibrida
UNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale IbridaUNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale Ibrida
UNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale IbridaNeo4j
 
BusinessGPT - Security and Governance for Generative AI
BusinessGPT  - Security and Governance for Generative AIBusinessGPT  - Security and Governance for Generative AI
BusinessGPT - Security and Governance for Generative AIAGATSoftware
 
Workshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit Milan
Workshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit MilanWorkshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit Milan
Workshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit MilanNeo4j
 
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-CloudAlluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-CloudAlluxio, Inc.
 
Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...
Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...
Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...drm1699
 
Encryption Recap: A Refresher on Key Concepts
Encryption Recap: A Refresher on Key ConceptsEncryption Recap: A Refresher on Key Concepts
Encryption Recap: A Refresher on Key Conceptsthomashtkim
 

Recently uploaded (20)

Effective Strategies for Wix's Scaling challenges - GeeCon
Effective Strategies for Wix's Scaling challenges - GeeConEffective Strategies for Wix's Scaling challenges - GeeCon
Effective Strategies for Wix's Scaling challenges - GeeCon
 
Test Automation Design Patterns_ A Comprehensive Guide.pdf
Test Automation Design Patterns_ A Comprehensive Guide.pdfTest Automation Design Patterns_ A Comprehensive Guide.pdf
Test Automation Design Patterns_ A Comprehensive Guide.pdf
 
Workshop - Architecting Innovative Graph Applications- GraphSummit Milan
Workshop -  Architecting Innovative Graph Applications- GraphSummit MilanWorkshop -  Architecting Innovative Graph Applications- GraphSummit Milan
Workshop - Architecting Innovative Graph Applications- GraphSummit Milan
 
[GRCPP] Introduction to concepts (C++20)
[GRCPP] Introduction to concepts (C++20)[GRCPP] Introduction to concepts (C++20)
[GRCPP] Introduction to concepts (C++20)
 
Abortion Clinic In Stanger ](+27832195400*)[ 🏥 Safe Abortion Pills In Stanger...
Abortion Clinic In Stanger ](+27832195400*)[ 🏥 Safe Abortion Pills In Stanger...Abortion Clinic In Stanger ](+27832195400*)[ 🏥 Safe Abortion Pills In Stanger...
Abortion Clinic In Stanger ](+27832195400*)[ 🏥 Safe Abortion Pills In Stanger...
 
Automate your OpenSIPS config tests - OpenSIPS Summit 2024
Automate your OpenSIPS config tests - OpenSIPS Summit 2024Automate your OpenSIPS config tests - OpenSIPS Summit 2024
Automate your OpenSIPS config tests - OpenSIPS Summit 2024
 
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
Wired_2.0_CREATE YOUR ULTIMATE LEARNING ENVIRONMENT_JCON_16052024
 
OpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCAOpenChain Webinar: AboutCode and Beyond - End-to-End SCA
OpenChain Webinar: AboutCode and Beyond - End-to-End SCA
 
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
Anypoint Code Builder - Munich MuleSoft Meetup - 16th May 2024
 
Abortion Clinic In Pongola ](+27832195400*)[ 🏥 Safe Abortion Pills In Pongola...
Abortion Clinic In Pongola ](+27832195400*)[ 🏥 Safe Abortion Pills In Pongola...Abortion Clinic In Pongola ](+27832195400*)[ 🏥 Safe Abortion Pills In Pongola...
Abortion Clinic In Pongola ](+27832195400*)[ 🏥 Safe Abortion Pills In Pongola...
 
Abortion Clinic In Pretoria ](+27832195400*)[ 🏥 Safe Abortion Pills in Pretor...
Abortion Clinic In Pretoria ](+27832195400*)[ 🏥 Safe Abortion Pills in Pretor...Abortion Clinic In Pretoria ](+27832195400*)[ 🏥 Safe Abortion Pills in Pretor...
Abortion Clinic In Pretoria ](+27832195400*)[ 🏥 Safe Abortion Pills in Pretor...
 
Auto Affiliate AI Earns First Commission in 3 Hours..pdf
Auto Affiliate  AI Earns First Commission in 3 Hours..pdfAuto Affiliate  AI Earns First Commission in 3 Hours..pdf
Auto Affiliate AI Earns First Commission in 3 Hours..pdf
 
Abortion Pill Prices Mthatha (@](+27832195400*)[ 🏥 Women's Abortion Clinic In...
Abortion Pill Prices Mthatha (@](+27832195400*)[ 🏥 Women's Abortion Clinic In...Abortion Pill Prices Mthatha (@](+27832195400*)[ 🏥 Women's Abortion Clinic In...
Abortion Pill Prices Mthatha (@](+27832195400*)[ 🏥 Women's Abortion Clinic In...
 
UNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale Ibrida
UNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale IbridaUNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale Ibrida
UNI DI NAPOLI FEDERICO II - Il ruolo dei grafi nell'AI Conversazionale Ibrida
 
BusinessGPT - Security and Governance for Generative AI
BusinessGPT  - Security and Governance for Generative AIBusinessGPT  - Security and Governance for Generative AI
BusinessGPT - Security and Governance for Generative AI
 
Workshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit Milan
Workshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit MilanWorkshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit Milan
Workshop: Enabling GenAI Breakthroughs with Knowledge Graphs - GraphSummit Milan
 
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-CloudAlluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
Alluxio Monthly Webinar | Simplify Data Access for AI in Multi-Cloud
 
Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...
Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...
Abortion Pills For Sale WhatsApp[[+27737758557]] In Birch Acres, Abortion Pil...
 
Encryption Recap: A Refresher on Key Concepts
Encryption Recap: A Refresher on Key ConceptsEncryption Recap: A Refresher on Key Concepts
Encryption Recap: A Refresher on Key Concepts
 
Abortion Clinic In Johannesburg ](+27832195400*)[ 🏥 Safe Abortion Pills in Jo...
Abortion Clinic In Johannesburg ](+27832195400*)[ 🏥 Safe Abortion Pills in Jo...Abortion Clinic In Johannesburg ](+27832195400*)[ 🏥 Safe Abortion Pills in Jo...
Abortion Clinic In Johannesburg ](+27832195400*)[ 🏥 Safe Abortion Pills in Jo...
 

RubyConf 2015 - Stately State Machines with Ragel - Ian Duggan