SlideShare a Scribd company logo
Writing an Editor in Elixir
today we’re gonna edit like it’s 1999
Just how are you
planning to bore me?
Why do this? Why???
Ok, get on with it
then.
(I only have to sit here for 45 minutes)
My story?
(the details of my life are quite inconsequential)
Initial release in 1974
Computer user since
1979
(core gamer, dude)
1. BLOAD SUPERINV
2. <press play on tape>
3. <wait 10 minutes>
4. BRUN SUPERINV
(something like that — I was 5 in 1979)
5. PLAY SPACE INVADERS!
Coding since 1982


10 PRINT “IAN ”
20 GOTO 10
Editing since 1993
(when I met my first love, Emacs)
Future roadmap?
(destination unknown)
So why not write an
editor?
(‘cause we need more of those…)
What makes an editor
successful?
Why do some come and
go while others persist?
Why do neckbeards
cling to 1970s tech?
(or does it cling to them?)
Why do hipsters insist on
editing through 20 layers
of abstraction?
(css goes well with a latte, and I’ve got 16 cores man)
In the beginning…
ED
ED
(still the best on a teletype…)
vi
(also created in 1976…)
vim
update in 1991
Smalltalk
(go wild man)
The GUI Era
“You’re Welcome”
— Java
Intellij / Eclipse /
Netbeans
(‘cause I like editing through a peephole)
"Modern" Editors
(yeah, man… air quotes)
TextMate
(because I’m smart enough to know that
Notepad is inadequate)
Sublime
(for when you need a break from broken Emacs)
Atom
“I use Atom cause I like mediocre editors”
— ElixirConf2017 Trainer
Please, what’s wrong with my
Atom?
(the whole point for me is it should just work)
Some of this may
have offended you
(and that’s an important clue)
It’s because, as programmers,
we often have a deep, personal
relationship with our editor.
(we’ve spent more time with it than anyone else!)
It’s about power and
productivity.
(sometimes a delicate balance)
So again, why do
this?
I love Emacs, but things
have been rough lately..
Maybe it’s a syntax
thing
And, as a hacker, I want
to write my own.. :)
And we have this great
language that is
simultaneously a perfect
and a terrible choice for
this.
Great because…
High level
Easy to develop in
Great for orchestration
Durability through OTP
Code reloading
Terrible because…
Mainly because the GUI ecosystem is
pretty limited
That just hasn’t been Erlang’s or
Elixir’s strength
I have arrows in my back to prove
this!!!
But we can fix this!
Let’s invent on
principle.
(or rather, in this case, shamelessly steal!)
A nice correspondence
Emacs Emx
C core Rust core
Elisp Elixir
Dynamic typing Dynamic typing
Code reloading Code reloading
Eval Eval
DSLs DSLs
Mutable Immutability
Beachballs Concurrency
Foundational Features
Programmable

Composable

Introspectable
Basic Design
Rust for low-level
(where necessary)

Back-end

(Elixir)

Front-ends
(text, GUIs)
Core / Back-end
Sessions:
have multiple buffers
shared or not
Buffers:
text, files, etc
rust-backed for performance (maybe?)
Event-maps:
map input actions to state transformations
Front-ends and
Sessions
Sessions
Front-ends
Buffers
defprotocol for multiple implementations:

• Sting-based
• Elixir “ropes”
• Rust “ropes”
Buffers
Buffers
Buffers
Buffers
Event-maps
Can be code or data
Stateless
Allows for easy code-
reloading
Key-code parsing
Key-code parsing
Ropes
Ropes
Basically a string as a
binary tree
Balancable
Ropes
Index(i): character at i, (log N)
Concat(S1, S2): concatenate two ropes, O(1) (or O(log N))
Split (i, S): split into two ropes O(log N)
Insert(i, S’): insert string at i O(log N)
Delete(i, j): delete the substring Ci..Cj, O(log N)
Report(i, j): output the string Ci..Cj, O(j + log N)
Elixir Ropes
I updated a library
Thank you @copenhas on github.
I did a PR.
Can I publish it to hex.pm?
Rust Ropes
In development.
Makes use of Ropes from the Xi
project.
Will integrate as Rustler resource
object.
Front-end
terminal 

(tty_sl, others)
Wx

(:wx provided by OTP)
Electron
(just kidding, but why not, help me add it?)
Exui
(maybe? Boyd and I are already talking)
BEAM/OTP is 500k lines
of C code and 2.4 M lines
of Erlang code!
Atom / Electron is
scary?
Front-end protocol
Connect to backend, receive a session
Send input events (keys, mouse, etc.)
Receive output events, render
(sound familiar anyone?)
escript
mix.exs
mix.exs
escript
GenServer
escript
erl start options
—no-input
(don’t read input)
—no-shell
(don’t start the erl shell)
GenServer
escript
escript
IO.Ansi
IO.Ansi didn’t have cursor
movement stuff
Emx.Ansi
Maybe it should be core?
But there were some
issues
You can't have erlang shell or IEx
with it (terminal ownership conflict)

I couldn't get IEx —remsh working
wth it (even with elixir, mix, iex, etc
running)…
(someone please help?)
Maybe a port?
Do what IEx does?
IEx replaces the erlang shell
erl … -user Elixir.IEx.CLI
The erlang shell
There’s a great explanation of how it works here:
https://ferd.ca/repl-a-bit-more-and-less-than-that.html
I’ll summarize it quickly
“Old” shell
“New” shell
IO Protocol
Phoenix uses this during code
reload.
Basically send/receive bytes/
characters as messages.
Enables remote
shells
Replace tty_sl?
Let erlang think it’s in control
of the terminal.
We’ll secretly control the
terminal.
Run our back-end as
a port-driver?
It can own the terminal and
provide the shell.
This is really a variation of the
other ideas.
Use a pty?
We’ll can start erlang with a pty
so it thinks it owns the terminal.
This has the benefit of letting us
do other-language front-ends
that run a backend over the pty.
Remember this guy?
We can fake it with a pty
We can fake it with a pty
Rust-based PTY
Front-end
TODO: show termion code.
But why another node?
My old friend, telnet
The name stands for
"teletype network”
Basically “terminal over network”
This is a prototype, so start simply.
Eventually this should be SSH.
My old friend, telnet
Ranch Telnet
GenServer1
Ranch Telnet
Telnet.SessionHandler
Ranch Telnet
Telnet.SessionHandler
Let’s try connecting
telnet <my_ip_here> 5555
Wx
If you want to do cross-platform GUI work, your
options are really limited
They fall into a few basic categories:

Looks native on the platform (lowest common
denominator, WX)
Looks the same everywhere (consistency of
implementation over consistency of look)
:wx erlang module
:wx.observer
:wx.demo
:wx erlang module
:wx.wx_object
How to wrap the
constants
But this is tedious
So I wrote a library.
And then I found this post ! :)
WxWidgets
code wrapping
helpers for records and
constants
adapt for elixir idioms
Very basic, still needs
work
:wx wraps WxWindows directly… so…
All the arguments are in the wrong
order!
Makes fluid interfaces hard
Also needs docs
I think I will find some way to
wrap and import the docs from
WxWindows and attach them
to the right methods
Code wrapping
Code wrapping
Tell me if there’s a better way, but I
think macros might obscure too much…
use WxObject
And voila!
wx_const(:FOO)
WxObjectServer
Supervising
(YMMV, not sure how well this works yet…)
Let’s try it out.
TIL
(please learn from my mistakes)
Don’t spend days fighting
with regexs, use a parser.
(you are clearly using the wrong tool)
Combine is great, but
it still needs laziness.
Lazy Parsing in Combine
Do not name your
top-level module Wx
(you’ll spend hours wondering why things don’t
work — I still don’t know why)
Codez
https://github.com/ijcd/wx_widgets
https://github.com/ijcd/ropex
https://github.com/ijcd/emx
(available soon)

More Related Content

What's hot

Practical Puppet: Systems Building Systems
Practical Puppet: Systems Building SystemsPractical Puppet: Systems Building Systems
Practical Puppet: Systems Building Systems
Andrew Shafer
 
Ruby Programming Introduction
Ruby Programming IntroductionRuby Programming Introduction
Ruby Programming Introduction
Anthony Brown
 
Culerity - Headless full stack testing for JavaScript
Culerity - Headless full stack testing for JavaScriptCulerity - Headless full stack testing for JavaScript
Culerity - Headless full stack testing for JavaScript
Thilo Utke
 
Twisted
TwistedTwisted
Ruby
RubyRuby
Kotlin L → ∞
Kotlin L → ∞Kotlin L → ∞
Kotlin L → ∞
Abdellah SELASSI
 
Ruby Loves Dot Net
Ruby Loves Dot NetRuby Loves Dot Net
Ruby Loves Dot Net
Ivan Porto Carrero
 
Melnytskyi Artem "A Little About the Bugs in the Code"
Melnytskyi Artem "A Little About the Bugs in the Code"Melnytskyi Artem "A Little About the Bugs in the Code"
Melnytskyi Artem "A Little About the Bugs in the Code"
LogeekNightUkraine
 
Elixir for rubysts
Elixir for rubystsElixir for rubysts
Elixir for rubysts
Danni Friedland
 
introduction to server-side scripting
introduction to server-side scriptingintroduction to server-side scripting
introduction to server-side scripting
Amirul Shafeeq
 
Actors and Threads
Actors and ThreadsActors and Threads
Actors and Threads
mperham
 
Melnytskyi Artem "A Little About the Bugs in the Code"
Melnytskyi Artem "A Little About the Bugs in the Code" Melnytskyi Artem "A Little About the Bugs in the Code"
Melnytskyi Artem "A Little About the Bugs in the Code"
LogeekNightUkraine
 
Using Erlang on the RaspberryPi to interact with the physical world
Using Erlang on the RaspberryPi to interact with the physical worldUsing Erlang on the RaspberryPi to interact with the physical world
Using Erlang on the RaspberryPi to interact with the physical world
Brian Chamberlain
 
Ruby Presentation
Ruby Presentation Ruby Presentation
Ruby Presentation
platico_dev
 
Async and Parallel F#
Async and Parallel F#Async and Parallel F#
Async and Parallel F#
mattpodwysocki
 

What's hot (15)

Practical Puppet: Systems Building Systems
Practical Puppet: Systems Building SystemsPractical Puppet: Systems Building Systems
Practical Puppet: Systems Building Systems
 
Ruby Programming Introduction
Ruby Programming IntroductionRuby Programming Introduction
Ruby Programming Introduction
 
Culerity - Headless full stack testing for JavaScript
Culerity - Headless full stack testing for JavaScriptCulerity - Headless full stack testing for JavaScript
Culerity - Headless full stack testing for JavaScript
 
Twisted
TwistedTwisted
Twisted
 
Ruby
RubyRuby
Ruby
 
Kotlin L → ∞
Kotlin L → ∞Kotlin L → ∞
Kotlin L → ∞
 
Ruby Loves Dot Net
Ruby Loves Dot NetRuby Loves Dot Net
Ruby Loves Dot Net
 
Melnytskyi Artem "A Little About the Bugs in the Code"
Melnytskyi Artem "A Little About the Bugs in the Code"Melnytskyi Artem "A Little About the Bugs in the Code"
Melnytskyi Artem "A Little About the Bugs in the Code"
 
Elixir for rubysts
Elixir for rubystsElixir for rubysts
Elixir for rubysts
 
introduction to server-side scripting
introduction to server-side scriptingintroduction to server-side scripting
introduction to server-side scripting
 
Actors and Threads
Actors and ThreadsActors and Threads
Actors and Threads
 
Melnytskyi Artem "A Little About the Bugs in the Code"
Melnytskyi Artem "A Little About the Bugs in the Code" Melnytskyi Artem "A Little About the Bugs in the Code"
Melnytskyi Artem "A Little About the Bugs in the Code"
 
Using Erlang on the RaspberryPi to interact with the physical world
Using Erlang on the RaspberryPi to interact with the physical worldUsing Erlang on the RaspberryPi to interact with the physical world
Using Erlang on the RaspberryPi to interact with the physical world
 
Ruby Presentation
Ruby Presentation Ruby Presentation
Ruby Presentation
 
Async and Parallel F#
Async and Parallel F#Async and Parallel F#
Async and Parallel F#
 

Similar to ElixirConf 2017 - Writing an Editor in Elixir - Ian Duggan

Bugs from Outer Space | while42 SF #6
Bugs from Outer Space | while42 SF #6Bugs from Outer Space | while42 SF #6
Bugs from Outer Space | while42 SF #6
While42
 
Killer Bugs From Outer Space
Killer Bugs From Outer SpaceKiller Bugs From Outer Space
Killer Bugs From Outer Space
Jérôme Petazzoni
 
The Holistic Programmer
The Holistic ProgrammerThe Holistic Programmer
The Holistic Programmer
Adam Keys
 
Os Keysholistic
Os KeysholisticOs Keysholistic
Os Keysholistic
oscon2007
 
Peyton jones-2011-parallel haskell-the_future
Peyton jones-2011-parallel haskell-the_futurePeyton jones-2011-parallel haskell-the_future
Peyton jones-2011-parallel haskell-the_future
Takayuki Muranushi
 
Simon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSimon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelism
Skills Matter
 
Introduction to Docker (and a bit more) at LSPE meetup Sunnyvale
Introduction to Docker (and a bit more) at LSPE meetup SunnyvaleIntroduction to Docker (and a bit more) at LSPE meetup Sunnyvale
Introduction to Docker (and a bit more) at LSPE meetup Sunnyvale
Jérôme Petazzoni
 
What is Elm and Why Should I Care?
What is Elm and Why Should I Care?What is Elm and Why Should I Care?
What is Elm and Why Should I Care?
Claudio D'Alicandro
 
Gabriele Santomaggio - Inside Elixir/Erlang - Codemotion Milan 2018
Gabriele Santomaggio - Inside Elixir/Erlang - Codemotion Milan 2018Gabriele Santomaggio - Inside Elixir/Erlang - Codemotion Milan 2018
Gabriele Santomaggio - Inside Elixir/Erlang - Codemotion Milan 2018
Codemotion
 
x86 & PE
x86 & PEx86 & PE
x86 & PE
Ange Albertini
 
Character sets and iconv
Character sets and iconvCharacter sets and iconv
Character sets and iconv
Daniel_Rhodes
 
What does OOP stand for?
What does OOP stand for?What does OOP stand for?
What does OOP stand for?
Colin Riley
 
An introduction to erlang
An introduction to erlangAn introduction to erlang
An introduction to erlang
Mirko Bonadei
 
Erlang, an overview
Erlang, an overviewErlang, an overview
Erlang, an overview
Patrick Huesler
 
Lab4 scripts
Lab4 scriptsLab4 scripts
Lab4 scripts
quantumleaf
 
Computer Science Architecture Lesson.pptx
Computer Science Architecture Lesson.pptxComputer Science Architecture Lesson.pptx
Computer Science Architecture Lesson.pptx
EdmondLabule2
 
Infrastructure as code might be literally impossible part 2
Infrastructure as code might be literally impossible part 2Infrastructure as code might be literally impossible part 2
Infrastructure as code might be literally impossible part 2
ice799
 
Boo Manifesto
Boo ManifestoBoo Manifesto
Boo Manifesto
hu hans
 
Unmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/InvokeUnmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/Invoke
Dmitri Nesteruk
 
Sheffield_R_ July meeting - Interacting with R - IDEs, Git and workflow
Sheffield_R_ July meeting - Interacting with R - IDEs, Git and workflowSheffield_R_ July meeting - Interacting with R - IDEs, Git and workflow
Sheffield_R_ July meeting - Interacting with R - IDEs, Git and workflow
Paul Richards
 

Similar to ElixirConf 2017 - Writing an Editor in Elixir - Ian Duggan (20)

Bugs from Outer Space | while42 SF #6
Bugs from Outer Space | while42 SF #6Bugs from Outer Space | while42 SF #6
Bugs from Outer Space | while42 SF #6
 
Killer Bugs From Outer Space
Killer Bugs From Outer SpaceKiller Bugs From Outer Space
Killer Bugs From Outer Space
 
The Holistic Programmer
The Holistic ProgrammerThe Holistic Programmer
The Holistic Programmer
 
Os Keysholistic
Os KeysholisticOs Keysholistic
Os Keysholistic
 
Peyton jones-2011-parallel haskell-the_future
Peyton jones-2011-parallel haskell-the_futurePeyton jones-2011-parallel haskell-the_future
Peyton jones-2011-parallel haskell-the_future
 
Simon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSimon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelism
 
Introduction to Docker (and a bit more) at LSPE meetup Sunnyvale
Introduction to Docker (and a bit more) at LSPE meetup SunnyvaleIntroduction to Docker (and a bit more) at LSPE meetup Sunnyvale
Introduction to Docker (and a bit more) at LSPE meetup Sunnyvale
 
What is Elm and Why Should I Care?
What is Elm and Why Should I Care?What is Elm and Why Should I Care?
What is Elm and Why Should I Care?
 
Gabriele Santomaggio - Inside Elixir/Erlang - Codemotion Milan 2018
Gabriele Santomaggio - Inside Elixir/Erlang - Codemotion Milan 2018Gabriele Santomaggio - Inside Elixir/Erlang - Codemotion Milan 2018
Gabriele Santomaggio - Inside Elixir/Erlang - Codemotion Milan 2018
 
x86 & PE
x86 & PEx86 & PE
x86 & PE
 
Character sets and iconv
Character sets and iconvCharacter sets and iconv
Character sets and iconv
 
What does OOP stand for?
What does OOP stand for?What does OOP stand for?
What does OOP stand for?
 
An introduction to erlang
An introduction to erlangAn introduction to erlang
An introduction to erlang
 
Erlang, an overview
Erlang, an overviewErlang, an overview
Erlang, an overview
 
Lab4 scripts
Lab4 scriptsLab4 scripts
Lab4 scripts
 
Computer Science Architecture Lesson.pptx
Computer Science Architecture Lesson.pptxComputer Science Architecture Lesson.pptx
Computer Science Architecture Lesson.pptx
 
Infrastructure as code might be literally impossible part 2
Infrastructure as code might be literally impossible part 2Infrastructure as code might be literally impossible part 2
Infrastructure as code might be literally impossible part 2
 
Boo Manifesto
Boo ManifestoBoo Manifesto
Boo Manifesto
 
Unmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/InvokeUnmanaged Parallelization via P/Invoke
Unmanaged Parallelization via P/Invoke
 
Sheffield_R_ July meeting - Interacting with R - IDEs, Git and workflow
Sheffield_R_ July meeting - Interacting with R - IDEs, Git and workflowSheffield_R_ July meeting - Interacting with R - IDEs, Git and workflow
Sheffield_R_ July meeting - Interacting with R - IDEs, Git and workflow
 

Recently uploaded

GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
Neo4j
 
How to write a program in any programming language
How to write a program in any programming languageHow to write a program in any programming language
How to write a program in any programming language
Rakesh Kumar R
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Neo4j
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Łukasz Chruściel
 
SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024
Hironori Washizaki
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
Fermin Galan
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
mz5nrf0n
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
Philip Schwarz
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
Boni García
 
Empowering Growth with Best Software Development Company in Noida - Deuglo
Empowering Growth with Best Software  Development Company in Noida - DeugloEmpowering Growth with Best Software  Development Company in Noida - Deuglo
Empowering Growth with Best Software Development Company in Noida - Deuglo
Deuglo Infosystem Pvt Ltd
 
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, FactsALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
Green Software Development
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
Aftab Hussain
 
E-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet DynamicsE-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet Dynamics
Hornet Dynamics
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CDKuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
rodomar2
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
Hornet Dynamics
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
Aftab Hussain
 
Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...
Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...
Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...
kalichargn70th171
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
Łukasz Chruściel
 
DDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systemsDDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systems
Gerardo Pardo-Castellote
 

Recently uploaded (20)

GraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph TechnologyGraphSummit Paris - The art of the possible with Graph Technology
GraphSummit Paris - The art of the possible with Graph Technology
 
How to write a program in any programming language
How to write a program in any programming languageHow to write a program in any programming language
How to write a program in any programming language
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
 
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️Need for Speed: Removing speed bumps from your Symfony projects ⚡️
Need for Speed: Removing speed bumps from your Symfony projects ⚡️
 
SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024
 
Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604Orion Context Broker introduction 20240604
Orion Context Broker introduction 20240604
 
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
原版定制美国纽约州立大学奥尔巴尼分校毕业证学位证书原版一模一样
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
 
APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)APIs for Browser Automation (MoT Meetup 2024)
APIs for Browser Automation (MoT Meetup 2024)
 
Empowering Growth with Best Software Development Company in Noida - Deuglo
Empowering Growth with Best Software  Development Company in Noida - DeugloEmpowering Growth with Best Software  Development Company in Noida - Deuglo
Empowering Growth with Best Software Development Company in Noida - Deuglo
 
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, FactsALGIT - Assembly Line for Green IT - Numbers, Data, Facts
ALGIT - Assembly Line for Green IT - Numbers, Data, Facts
 
Graspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code AnalysisGraspan: A Big Data System for Big Code Analysis
Graspan: A Big Data System for Big Code Analysis
 
E-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet DynamicsE-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet Dynamics
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CDKuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
KuberTENes Birthday Bash Guadalajara - Introducción a Argo CD
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
 
Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...
Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...
Why Mobile App Regression Testing is Critical for Sustained Success_ A Detail...
 
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf2024 eCommerceDays Toulouse - Sylius 2.0.pdf
2024 eCommerceDays Toulouse - Sylius 2.0.pdf
 
DDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systemsDDS-Security 1.2 - What's New? Stronger security for long-running systems
DDS-Security 1.2 - What's New? Stronger security for long-running systems
 

ElixirConf 2017 - Writing an Editor in Elixir - Ian Duggan