SlideShare a Scribd company logo
1 of 56
Download to read offline
PYTHON REFACTORING
WITH ROPE AND TRAAD
Austin Bingham
Sixty North AS
0
HELLO!
PYTHON IS
EVERYWHERE!
WHAT IS ROPE?
A PYTHON LIBRARY FOR DOING
PYTHON REFACTORINGS
ROPE HAS POWERFUL IDE-
ORIENTED FEATURES
Code completion
Finding definitions and occurrences
Organizing imports
Looking up docstrings
ELEMENTS OF ROPE
PROJECT
Represents the files and directories containing code that rope
will manipulate.
Projectis the root object in rope
CREATE A PROJECT
fromrope.base.projectimportProject
project=Project('project_dir')
RESOURCES
The files and directories in the project
server=project.get_resource('traad/server.py')
print(server.name,
server.path,
server.is_folder())
c1=project.get_resource('').get_children()[0]
print(c1.name,
c1.path,
c1.is_folder())
WALK PROJECT RESOURCES
defget_all_resources(proj):
todo=['']
whiletodo:
res_path=todo[0]
todo=todo[1:]
res=proj.get_resource(res_path)
yield(res.path,res.is_folder())
ifres.is_folder():
todo.extend((child.pathforchildinres.get_children()))
Project.get_resource(path)finds a resource at a
relative path
Resource.get_children()returns an iterable over
children
MANAGE PREFERENCES
prefsis a dict-like container of settings and preferences.
forpinproject.prefs.prefs:
print(project.prefs.get(p))
prefsare stored in a file called .ropeproject/config.py
at the project's root directory.
ANATOMY OF A
REFACTORING
CREATE THE REFACTORING
OBJECT
fromrope.refactor.renameimportRename
ren=Rename(project,
project.get_resource('traad/state.py'),
offset=42)
This can fail if rope can't perform the refactoring
The refactoring is only partially bound
CALCULATE ACTUAL CHANGES
changes=ren.get_changes('TacoCopter')
print(changes.description)
print(changes.get_changed_resources())
changesrepresents a fully bound change
EXECUTE THE CHANGES
project.do(changes)
After this the changes are actually performed.
THE FULL PROCESS
fromrope.base.projectimportProject
fromrope.refactor.renameimportRename
#Createtheproject
proj=Project('.')
#Createthepartially-boundrefactoring
ren=Rename(project,
project.get_resource('traad/state.py'),
offset=42)
#Calculatethechangesforafully-specifiedrenaming
change=ren.get_changes('TacoCopter')
#Performthechanges
project.do(changes())
HISTORY
HISTORYOBJECT
Project.historymanages the history of changes that have
been made.
Also remembers what has been undone as well as change
dependencies.
UNDOING CHANGES
Undo the most recent changes
project.history.undo()
Or select more distance changes to undo
change=project.history.undo_list[3]
project.history.undo(change)
This will undo all dependent changes.
REDOING CHANGES
You can redo changes that you've previously undone.
change=project.history.redo_list[-2]
project.history.redo(change)
MULTI-PROJECT
REFACTORING
THE MULTI-PROJECT
REFACTORING CLASS
First create a MultiProjectRefactoringinstance.
fromrope.refactorimportmultiproject
mpr=multiproject.MultiProjectRefactoring(
Rename,#typeofrefactoringtoperform
[other_project1,other_project2,other_project3])
Then call that with your main project and the refactoring
initializer arguments
ref=mpr(main_project,
some_resource,
offset=1337)
CREATE AND PERFORM THE CHANGE
#Rememberthat`ref`isarenamingoperation
changes=ref.get_all_changes(
"EnterpriseProxyManagerImplementationFactoryFactory")
multiproject.perform(changes)
NON-REFACTORING
TOOLS
NOT INTENDED FOR
"MANUAL" OPERATION
WHAT IS TRAAD?
tråd - svært tynn snor av fibrer av silke, ull, el. f eks av metall
WHAT IS TRAAD?
thread
TRAAD IS…
An HTTP+JSON server for driving rope
TRAAD IS…
Various clients for driving the server
WHY TRAAD?
SIMPLER INTEGRATION WITH
EDITORS
Every corner of the programming universe knows how to speak
HTTP+JSON
HTTP IS (WAY) MORE THAN FAST
ENOUGH FOR THIS WORK
The volume of data is low, and the response time only needs to
be good enough for humans
SUPPORT FOR MULTIPLE PYTHON
VERSIONS
The client has zero depenencies on the version of Python that
traad is using
PROPER LEVEL OF ABSTRACTION
The problem domain of traad is Python refactoring, not Python
integration with other languages.
TRAAD ARCHITECTURE
Low-ceremony (sorta), powerful, and well-documented
PYKKA FOR MANAGING
CONCURRENCY
OVERALL ARCHITECTURE
TASK STATE
{
1:{'status':'pending',
'description':'RenamingFOOtoBAR',
'changed_resources':[...]},
2:{'status':'failure'},
3:{'status':'success',
'calltip':'uuid1(node=None,clock_seq=None)'}
}
Simple mapping of task-ids to dicts
State is an actor and thus threadsafe. Multiple asynchronous
tasks could be accessing it at any time.
ASYNCHRONOUS OPERATIONS
SYNCHRONOUS OPERATIONS
ASYCHRONOUS VS.
SYNCHRONOUS
Asynchronous
Rename
Extract
Organize imports
Synchronous
Find definition
Get history
Calltip
EMACS
The emacs lisp for renaming looks like this
;Startsnewtraadserveronthespecifieddirectory
(traad-open"~/projects/roid_rage")
;Renameswhateverisathepoint(i.e.underthecursor)
(traad-rename"RagingRoid")
And the HTTP message looks like this
POST/refactor/renameHTTP/1.1
User-Agent:curl/7.30.0
Host:127.0.0.1:65172
Accept:*/*
Accept-Encoding:deflate,gzip
Content-Type:application/json
Content-Length:104
{"name":"RagingRoid",
"path":"/Users/sixtynorth/projects/roid_rage/roid_rage/roid.py",
"offset":102}
WHAT KIND OF A
KEYNOTE IS THIS?
ROPE AND TRAAD ONLY EXIST
BECAUSE OF CURIOUS
DEVELOPERS
IT CAN SEEM HOPELESS TO START
A PROJECT LIKE THIS
FIND THE NICHE THAT REALLY
INTERESTS YOU AND FILL IT
THERE IS NO FAME AND FORTUNE
IN THIS KIND OF DEVELOPMENT
BUT IT IS IMMENSELY SATISFYING
AND ENJOYABLE
YOU WILL LEARN A GREAT DEAL
AND YOU REALLY WILL BE
HELPING OTHERS
IT'S UP TO YOU, AND YOU CAN DO
IT!
SUPPORT ROPE AND TRAAD
The success of rope and traad depend on users and developers
like you!
LINKS
Rope -
Traad -
Pykka -
Bottle -
http://rope.sourceforge.net/
http://github.com/abingham/traad
http://www.pykka.org/
http://bottlepy.org/
http://github.com/abingham/traad_rope_presentation
Austin Bingham. Python Refactoring. PyCon Belarus

More Related Content

What's hot

Replication Internals: The Life of a Write
Replication Internals: The Life of a WriteReplication Internals: The Life of a Write
Replication Internals: The Life of a Write
MongoDB
 
syslog-ng: from log collection to processing and information extraction
syslog-ng: from log collection to processing and information extractionsyslog-ng: from log collection to processing and information extraction
syslog-ng: from log collection to processing and information extraction
BalaBit
 
0.5mln packets per second with Erlang
0.5mln packets per second with Erlang0.5mln packets per second with Erlang
0.5mln packets per second with Erlang
Maxim Kharchenko
 
SCaLE 2016 - syslog-ng: From Raw Data to Big Data
SCaLE 2016 - syslog-ng: From Raw Data to Big DataSCaLE 2016 - syslog-ng: From Raw Data to Big Data
SCaLE 2016 - syslog-ng: From Raw Data to Big Data
BalaBit
 
State of the art logging
State of the art loggingState of the art logging
State of the art logging
BalaBit
 
JSON-RPC Proxy Generation with PHP 5
JSON-RPC Proxy Generation with PHP 5JSON-RPC Proxy Generation with PHP 5
JSON-RPC Proxy Generation with PHP 5
Stephan Schmidt
 

What's hot (20)

Optimizing Erlang Code for Speed
Optimizing Erlang Code for SpeedOptimizing Erlang Code for Speed
Optimizing Erlang Code for Speed
 
Replication Internals: The Life of a Write
Replication Internals: The Life of a WriteReplication Internals: The Life of a Write
Replication Internals: The Life of a Write
 
Dive into Fluentd plugin v0.12
Dive into Fluentd plugin v0.12Dive into Fluentd plugin v0.12
Dive into Fluentd plugin v0.12
 
Go. Why it goes
Go. Why it goesGo. Why it goes
Go. Why it goes
 
Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11Mixing C++ & Python II: Pybind11
Mixing C++ & Python II: Pybind11
 
Lua and its Ecosystem
Lua and its EcosystemLua and its Ecosystem
Lua and its Ecosystem
 
FOSDEM 2017 - RTC Services With Lua and Kamailio
FOSDEM 2017 - RTC Services With Lua and KamailioFOSDEM 2017 - RTC Services With Lua and Kamailio
FOSDEM 2017 - RTC Services With Lua and Kamailio
 
syslog-ng: from log collection to processing and information extraction
syslog-ng: from log collection to processing and information extractionsyslog-ng: from log collection to processing and information extraction
syslog-ng: from log collection to processing and information extraction
 
0.5mln packets per second with Erlang
0.5mln packets per second with Erlang0.5mln packets per second with Erlang
0.5mln packets per second with Erlang
 
Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014Fluentd Hacking Guide at RubyKaigi 2014
Fluentd Hacking Guide at RubyKaigi 2014
 
Python to scala
Python to scalaPython to scala
Python to scala
 
SCaLE 2016 - syslog-ng: From Raw Data to Big Data
SCaLE 2016 - syslog-ng: From Raw Data to Big DataSCaLE 2016 - syslog-ng: From Raw Data to Big Data
SCaLE 2016 - syslog-ng: From Raw Data to Big Data
 
Fluentd - Set Up Once, Collect More
Fluentd - Set Up Once, Collect MoreFluentd - Set Up Once, Collect More
Fluentd - Set Up Once, Collect More
 
Java Full Throttle
Java Full ThrottleJava Full Throttle
Java Full Throttle
 
0.5mln packets per second with Erlang
0.5mln packets per second with Erlang0.5mln packets per second with Erlang
0.5mln packets per second with Erlang
 
Everybody Polyglot! - Cross-Language RPC with Erlang
Everybody Polyglot! - Cross-Language RPC with ErlangEverybody Polyglot! - Cross-Language RPC with Erlang
Everybody Polyglot! - Cross-Language RPC with Erlang
 
gRPC
gRPCgRPC
gRPC
 
State of the art logging
State of the art loggingState of the art logging
State of the art logging
 
JSON-RPC Proxy Generation with PHP 5
JSON-RPC Proxy Generation with PHP 5JSON-RPC Proxy Generation with PHP 5
JSON-RPC Proxy Generation with PHP 5
 
LOADays 2015 - syslog-ng - from log collection to processing and infomation e...
LOADays 2015 - syslog-ng - from log collection to processing and infomation e...LOADays 2015 - syslog-ng - from log collection to processing and infomation e...
LOADays 2015 - syslog-ng - from log collection to processing and infomation e...
 

Similar to Austin Bingham. Python Refactoring. PyCon Belarus

An Overview Of Python With Functional Programming
An Overview Of Python With Functional ProgrammingAn Overview Of Python With Functional Programming
An Overview Of Python With Functional Programming
Adam Getchell
 
Search Lucene
Search LuceneSearch Lucene
Search Lucene
Jeremy Coates
 

Similar to Austin Bingham. Python Refactoring. PyCon Belarus (20)

Hack Like It's 2013 (The Workshop)
Hack Like It's 2013 (The Workshop)Hack Like It's 2013 (The Workshop)
Hack Like It's 2013 (The Workshop)
 
Webinar about Spring Data Neo4j 4
Webinar about Spring Data Neo4j 4Webinar about Spring Data Neo4j 4
Webinar about Spring Data Neo4j 4
 
Language-agnostic data analysis workflows and reproducible research
Language-agnostic data analysis workflows and reproducible researchLanguage-agnostic data analysis workflows and reproducible research
Language-agnostic data analysis workflows and reproducible research
 
Apache Spark Workshop, Apr. 2016, Euangelos Linardos
Apache Spark Workshop, Apr. 2016, Euangelos LinardosApache Spark Workshop, Apr. 2016, Euangelos Linardos
Apache Spark Workshop, Apr. 2016, Euangelos Linardos
 
Jump Start into Apache® Spark™ and Databricks
Jump Start into Apache® Spark™ and DatabricksJump Start into Apache® Spark™ and Databricks
Jump Start into Apache® Spark™ and Databricks
 
Big Data Processing with .NET and Spark (SQLBits 2020)
Big Data Processing with .NET and Spark (SQLBits 2020)Big Data Processing with .NET and Spark (SQLBits 2020)
Big Data Processing with .NET and Spark (SQLBits 2020)
 
An Overview Of Python With Functional Programming
An Overview Of Python With Functional ProgrammingAn Overview Of Python With Functional Programming
An Overview Of Python With Functional Programming
 
Scala for Everything: From Frontend to Backend Applications - Scala Matsuri 2020
Scala for Everything: From Frontend to Backend Applications - Scala Matsuri 2020Scala for Everything: From Frontend to Backend Applications - Scala Matsuri 2020
Scala for Everything: From Frontend to Backend Applications - Scala Matsuri 2020
 
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
 
Python Streaming Pipelines on Flink - Beam Meetup at Lyft 2019
Python Streaming Pipelines on Flink - Beam Meetup at Lyft 2019Python Streaming Pipelines on Flink - Beam Meetup at Lyft 2019
Python Streaming Pipelines on Flink - Beam Meetup at Lyft 2019
 
Build Large-Scale Data Analytics and AI Pipeline Using RayDP
Build Large-Scale Data Analytics and AI Pipeline Using RayDPBuild Large-Scale Data Analytics and AI Pipeline Using RayDP
Build Large-Scale Data Analytics and AI Pipeline Using RayDP
 
When RegEx is not enough
When RegEx is not enoughWhen RegEx is not enough
When RegEx is not enough
 
Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...
Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...
Object Graph Mapping with Spring Data Neo4j 3 - Nicki Watt & Michael Hunger @...
 
CocoaConf: The Language of Mobile Software is APIs
CocoaConf: The Language of Mobile Software is APIsCocoaConf: The Language of Mobile Software is APIs
CocoaConf: The Language of Mobile Software is APIs
 
Search Lucene
Search LuceneSearch Lucene
Search Lucene
 
Get your instance by name integration of nova, neutron and designate
Get your instance by name  integration of nova, neutron and designateGet your instance by name  integration of nova, neutron and designate
Get your instance by name integration of nova, neutron and designate
 
node.js: Javascript's in your backend
node.js: Javascript's in your backendnode.js: Javascript's in your backend
node.js: Javascript's in your backend
 
Building scalable and language independent java services using apache thrift
Building scalable and language independent java services using apache thriftBuilding scalable and language independent java services using apache thrift
Building scalable and language independent java services using apache thrift
 
Using Netconf/Yang with OpenDalight
Using Netconf/Yang with OpenDalightUsing Netconf/Yang with OpenDalight
Using Netconf/Yang with OpenDalight
 
Flink internals web
Flink internals web Flink internals web
Flink internals web
 

More from Alina Dolgikh

No sql unsuccessful_story. Владимир Зеленкевич
No sql unsuccessful_story. Владимир ЗеленкевичNo sql unsuccessful_story. Владимир Зеленкевич
No sql unsuccessful_story. Владимир Зеленкевич
Alina Dolgikh
 
Startup belarus pres_khamiankova
Startup belarus pres_khamiankovaStartup belarus pres_khamiankova
Startup belarus pres_khamiankova
Alina Dolgikh
 

More from Alina Dolgikh (20)

Reactive streams. Slava Schmidt
Reactive streams. Slava SchmidtReactive streams. Slava Schmidt
Reactive streams. Slava Schmidt
 
Scala for the doubters. Максим Клыга
Scala for the doubters. Максим КлыгаScala for the doubters. Максим Клыга
Scala for the doubters. Максим Клыга
 
Orm на no sql через jpa. Павел Вейник
Orm на no sql через jpa. Павел ВейникOrm на no sql через jpa. Павел Вейник
Orm на no sql через jpa. Павел Вейник
 
No sql unsuccessful_story. Владимир Зеленкевич
No sql unsuccessful_story. Владимир ЗеленкевичNo sql unsuccessful_story. Владимир Зеленкевич
No sql unsuccessful_story. Владимир Зеленкевич
 
Java Concurrency in Practice
Java Concurrency in PracticeJava Concurrency in Practice
Java Concurrency in Practice
 
Appium + selenide comaqa.by. Антон Семенченко
Appium + selenide comaqa.by. Антон СеменченкоAppium + selenide comaqa.by. Антон Семенченко
Appium + selenide comaqa.by. Антон Семенченко
 
Cracking android app. Мокиенко Сергей
Cracking android app. Мокиенко СергейCracking android app. Мокиенко Сергей
Cracking android app. Мокиенко Сергей
 
David Mertz. Type Annotations. PyCon Belarus 2015
David Mertz. Type Annotations. PyCon Belarus 2015David Mertz. Type Annotations. PyCon Belarus 2015
David Mertz. Type Annotations. PyCon Belarus 2015
 
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
 
Кирилл Борисов. Code style_checking_v2. PyCon Belarus 2015
Кирилл Борисов. Code style_checking_v2. PyCon Belarus 2015Кирилл Борисов. Code style_checking_v2. PyCon Belarus 2015
Кирилл Борисов. Code style_checking_v2. PyCon Belarus 2015
 
Володимир Гоцик. Getting maximum of python, django with postgres 9.4. PyCon B...
Володимир Гоцик. Getting maximum of python, django with postgres 9.4. PyCon B...Володимир Гоцик. Getting maximum of python, django with postgres 9.4. PyCon B...
Володимир Гоцик. Getting maximum of python, django with postgres 9.4. PyCon B...
 
Андрей Солдатенко. Разработка высокопроизводительныx функциональных тестов д...
Андрей Солдатенко. Разработка высокопроизводительныx функциональных тестов д...Андрей Солдатенко. Разработка высокопроизводительныx функциональных тестов д...
Андрей Солдатенко. Разработка высокопроизводительныx функциональных тестов д...
 
Austin Bingham. Transducers in Python. PyCon Belarus
Austin Bingham. Transducers in Python. PyCon BelarusAustin Bingham. Transducers in Python. PyCon Belarus
Austin Bingham. Transducers in Python. PyCon Belarus
 
Denis Lebedev. Non functional swift.
Denis Lebedev. Non functional swift.Denis Lebedev. Non functional swift.
Denis Lebedev. Non functional swift.
 
Максим Лапшин. Erlang production
Максим Лапшин. Erlang productionМаксим Лапшин. Erlang production
Максим Лапшин. Erlang production
 
Максим Харченко. Erlang lincx
Максим Харченко. Erlang lincxМаксим Харченко. Erlang lincx
Максим Харченко. Erlang lincx
 
Пиар в стартапе: извлекаем максимум пользы. Алексей Лартей
Пиар в стартапе: извлекаем максимум пользы. Алексей ЛартейПиар в стартапе: извлекаем максимум пользы. Алексей Лартей
Пиар в стартапе: извлекаем максимум пользы. Алексей Лартей
 
Подготовка проекта к первому раунду инвестиций. Дмитрий Поляков
Подготовка проекта к первому раунду инвестиций. Дмитрий ПоляковПодготовка проекта к первому раунду инвестиций. Дмитрий Поляков
Подготовка проекта к первому раунду инвестиций. Дмитрий Поляков
 
Как составлять правильный тизер для инвесторов? Никита Рогозин
Как составлять правильный тизер для инвесторов? Никита РогозинКак составлять правильный тизер для инвесторов? Никита Рогозин
Как составлять правильный тизер для инвесторов? Никита Рогозин
 
Startup belarus pres_khamiankova
Startup belarus pres_khamiankovaStartup belarus pres_khamiankova
Startup belarus pres_khamiankova
 

Recently uploaded

Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Recently uploaded (20)

Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 

Austin Bingham. Python Refactoring. PyCon Belarus