SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Downloaden Sie, um offline zu lesen
RUSTなNATSのCLIENT
を作ってみたRUST 1.0 RELEASE記念祝賀LT会MAY 2015
@WALLYQS
ABOUT ME
Name: Wally (ワリ)
Twitter:
Github:
From Mexico :)
https://twitter.com/wallyqs
https://github.com/wallyqs
Moving to San Francisco next week!
WHAT IS NATS
What is NATS?
Message bus written by Derek Collison (Apcera)
Written in Go
Great performance!
website: https://nats.io/
GREEEEEAT PERFORMANCE
Source: http://bravenewgeek.com/dissecting-message-
queues/
HOW TO WRITE A NATS CLIENT?
What we need
Basic parser of the protocol
Networking I/O
Concurrency
Callbacks
WE CAN DO THIS WITH RUST!
What we need
[X]Basic parser of the protocol
[X]Concurrency
[X]Networking I/O
[X]Callbacks
HOW IT LOOKS?
fnmain(){
letmutnats=Client::new("192.168.0.2:4222");
letmutopts=HashMap::new();
opts.insert("user","hoge");
opts.insert("pass","fuga");
matchnats.connect(&mutopts){
Ok(())=>println!("Successfullyconnected!"),
Err(e)=>println!("Failed!{}",e)
}
let(tx,rx)=channel();
nats.subscribe("workers.double",
Box::new(move|msg|{
lettx=tx.clone();
letm=msg.trim();
letn=m.parse::<u64>().unwrap();
letresult=n*2;
println!("{}x2={}",m,result);
tx.send("DONE!");
}));
//Subscriptionshoulddoublethenumber
nats.publish("workers.double","20".to_string());
//Stopwhendone
letdone=rx.recv().unwrap();
println!("Status:{}",done);
}
IMPLEMENTING IT!
PARSER
NATS 101
Very simple, plain text protocol:
CONNECT
INFO
SUB
UNSUB
PUB
MSG
SIMPLE PROTOCOL
//Protocol
constCONNECT:&'staticstr="CONNECT";
constINFO: &'staticstr="INFO";
constPING: &'staticstr="PINGrn";
constPONG: &'staticstr="PONGrn";
constPUB: &'staticstr="PUB";
constSUB: &'staticstr="SUB";
constUNSUB: &'staticstr="UNSUB";
constMSG: &'staticstr="MSG";
constOK: &'staticstr="+OKrn";
constERR: &'staticstr="-ERR";
constCR_LF: &'staticstr="rn";
constSPC: &'staticstr="";
HOW TO IMPLEMENT THIS?
Thread, loop and match combo:
thread::spawn(move||{
loop{
//...
letmutproto=line.splitn(2,"");
letnats_op=proto.nth(0);
matchnats_op{
Some(INFO)=>{},
Some(PING)=>{},
Some(PONG)=>{},
Some(MSG) =>{},
Some(OK) =>{},
Some(ERR) =>println!("Errorintheprotocol:{}",line),
Some(_) =>println!("UnknownProtocol:{}",line),
None =>println!("NoProtocol:{}",line),
}
}
};
NETWORKING IO
usestd::io::BufRead;
usestd::io::BufStream;
usestd::net::TcpStream;
fnmain(){
letstream =TcpStream::connect("demo.nats.io:4222").unwrap();
letmutnats_io=BufStream::new(stream);
letmutline=String::new();
letresult=nats_io.read_line(&mutline);
println!("Gotthis:{}",line);
}
MAKING IT CURRENT
Meet Arc<Mutex<T>>>
usestd::io::BufRead;
usestd::io::BufStream;
usestd::net::TcpStream;
usestd::sync::{Arc,Mutex};
fnmain(){
letstream =TcpStream::connect("demo.nats.io:4222").unwrap();
letmutnats_io=BufStream::new(stream);
letmutio=Arc::new(Mutex::new(nats_io));
//Andeachtimewewanttouseit
letmutcloned_nats_io=self.io.clone();
letmutborrowed_io=cloned_nats_io.try_lock().unwrap();
letmutline=String::new();
letresult=borrowed_io.read_line(&mutline);
println!("Gotthis:{}",line);
}
CALLBACKS
(This was the hardest part…)
How to dispatch the subscription callbacks?
usestd::collections::HashMap;
usestd::sync::{Arc,Mutex};
usestd::thread;
pubstructCallbackStore{
cid:u8,
cbs:Arc<Mutex<HashMap<u8,Box<Fn(&str)+Send>>>>
}
CALLBACKSTORE IMPLEMENTATION
implCallbackStore{
pubfnnew()->CallbackStore{
returnCallbackStore{
cid:1,
cbs:Arc::new(Mutex::new(HashMap::new())),
};
}
pubfnadd_callback(&mutself,cccb:Box<Fn(&str)+Send>){
self.cid+=1;
let_cbs=self.cbs.clone();
letmutcbs =_cbs.try_lock().unwrap();
cbs.insert(self.cid,cccb);
}
}
DISPATCHER LOOP
pubfndispatcher_loop(cstore:Arc<Mutex<HashMap<u8,Box<Fn(&str)+Send>>>>)
{
thread::spawn(move||{
loop{
thread::sleep_ms(500);
println!("Dispatchingthecallbacks...");
letmutccbs=cstore.clone();
letmutcbs=ccbs.try_lock().unwrap();
//Getthefirstcallback
letcb2=cbs.get(&2).unwrap();
cb2("helloworld");
//Getthefirstcallback
letcb3=cbs.get(&3).unwrap();
cb3("helloworld!!!!!!!!!");
//Howmanycallbacks?
println!("Currently:{}callbacks",cbs.len());
}
});
}
DISPATCH!
Store callbacks by putting them in a Box:
fnmain(){
println!("Storingsomecallbacks...");
letmutstore=CallbackStore::new();
store.add_callback(Box::new(|msg|{
println!("Yougotit!Thisisit:{}",msg);
}));
store.add_callback(Box::new(|msg|{
println!("Andthisis:{}",msg);
}));
dispatcher_loop(store.cbs.clone());
thread::sleep_ms(1000);
}
SOURCE
https://github.com/wallyqs/rust-nats
(まだまだいまいちですが…)
DEMO
RUSTのハマったところ
READING BYTES
Didn't grok this part…
//TODO:Figureouthowtofetchexactnumberofbytesfromthestream
// also,deadlock
pubfnread_message_payload(msg_size:u64,eio:Arc<Mutex<BufStream<TcpStr
eam>>>)->String{
println!("Willtrytoreadthenextline.....");
letmutnats_io=eio.clone();
letmutio=nats_io.try_lock().unwrap();
letmutpayload=String::new();
//TODO:FigureouthowtogetNbytes
//letresult=io.take(msg_size);
//letresult=io.read_line(&mutpayload).unwrap();
println!("Readthemessage!");
returnpayload;
}
GETTING FAMILIAR WITH THE BORROW CHECKER
へええ
//SendconnectfirstbyprocessingINFO
letline={
letmutl=String::new();
letmutnats_io=self.io.clone();
letmutio=nats_io.try_lock().unwrap();
letresult=io.read_line(&mutl).unwrap();
//Returntheline
l
};
//releasedthelockhere,wooooot!
UNDERSTANDING CONCURRENCY
この部分を理解するのにだいぶ時間かかったわ~
pubstructClient{
io:Arc<Mutex<BufStream<TcpStream>>>,
options: HashMap<&'staticstr,&'staticstr>,
ssid:u8,
subs:Arc<Mutex<HashMap<u8,Box<Fn(&str)+Send>>>>,//TODO:needsclient
too
}
OVERUSING TRY_LOCK
Good for prototyping…
実は今のクライアントめっちゃcrashする..
letmutio=nats_io.try_lock().unwrap();
THANKS
ご静聴ありがとうございます!

Weitere ähnliche Inhalte

Andere mochten auch

Publiczne Gimnazjum w Zaborze/English
Publiczne Gimnazjum w Zaborze/EnglishPubliczne Gimnazjum w Zaborze/English
Publiczne Gimnazjum w Zaborze/English
agatawaltrowska
 
Catálogo casual collectives
Catálogo casual collectives Catálogo casual collectives
Catálogo casual collectives
Ortus Fitness
 
Fiestas infantiles de nelita
Fiestas infantiles de nelitaFiestas infantiles de nelita
Fiestas infantiles de nelita
MarianelaCV
 
Publiczne Gimnazjum w Zaborze rok szkolny 20112012
Publiczne Gimnazjum w Zaborze rok szkolny 20112012Publiczne Gimnazjum w Zaborze rok szkolny 20112012
Publiczne Gimnazjum w Zaborze rok szkolny 20112012
agatawaltrowska
 

Andere mochten auch (19)

elixirを使ったゲームサーバ
elixirを使ったゲームサーバelixirを使ったゲームサーバ
elixirを使ったゲームサーバ
 
Publiczne Gimnazjum w Zaborze/English
Publiczne Gimnazjum w Zaborze/EnglishPubliczne Gimnazjum w Zaborze/English
Publiczne Gimnazjum w Zaborze/English
 
TAT Tourism Journal 1/2013 & 4/2012 (2555-2556)
TAT Tourism Journal 1/2013 & 4/2012 (2555-2556)TAT Tourism Journal 1/2013 & 4/2012 (2555-2556)
TAT Tourism Journal 1/2013 & 4/2012 (2555-2556)
 
Catálogo casual collectives
Catálogo casual collectives Catálogo casual collectives
Catálogo casual collectives
 
Polish inventor
Polish inventorPolish inventor
Polish inventor
 
Question papers
Question papersQuestion papers
Question papers
 
ข้อบังคับ ของ นิติบุคคลอาคารชุด ลุมพินี พาร์ค ริเวอร์ไซด์-พระราม 3
ข้อบังคับ ของ นิติบุคคลอาคารชุด ลุมพินี พาร์ค ริเวอร์ไซด์-พระราม 3ข้อบังคับ ของ นิติบุคคลอาคารชุด ลุมพินี พาร์ค ริเวอร์ไซด์-พระราม 3
ข้อบังคับ ของ นิติบุคคลอาคารชุด ลุมพินี พาร์ค ริเวอร์ไซด์-พระราม 3
 
Fiestas infantiles de nelita
Fiestas infantiles de nelitaFiestas infantiles de nelita
Fiestas infantiles de nelita
 
[Cruise Marketing] Targeting Cruise Audiences on Social Media
[Cruise Marketing] Targeting Cruise Audiences on Social Media[Cruise Marketing] Targeting Cruise Audiences on Social Media
[Cruise Marketing] Targeting Cruise Audiences on Social Media
 
Belleza al limite
Belleza al limiteBelleza al limite
Belleza al limite
 
ระดับประถมศึกษา หลักสูตรการเรียนรู้ด้านการท่องเที่ยว
ระดับประถมศึกษา หลักสูตรการเรียนรู้ด้านการท่องเที่ยวระดับประถมศึกษา หลักสูตรการเรียนรู้ด้านการท่องเที่ยว
ระดับประถมศึกษา หลักสูตรการเรียนรู้ด้านการท่องเที่ยว
 
Badalona
BadalonaBadalona
Badalona
 
Dish stories
Dish storiesDish stories
Dish stories
 
Activity6 project
Activity6 projectActivity6 project
Activity6 project
 
eTwinning w Publicznym Gimnazjum w Zaborze
eTwinning w Publicznym Gimnazjum w ZaborzeeTwinning w Publicznym Gimnazjum w Zaborze
eTwinning w Publicznym Gimnazjum w Zaborze
 
Publiczne Gimnazjum w Zaborze rok szkolny 20112012
Publiczne Gimnazjum w Zaborze rok szkolny 20112012Publiczne Gimnazjum w Zaborze rok szkolny 20112012
Publiczne Gimnazjum w Zaborze rok szkolny 20112012
 
Gunpla Navigation Catalog 2013
Gunpla Navigation Catalog 2013Gunpla Navigation Catalog 2013
Gunpla Navigation Catalog 2013
 
Catálogo momentum
Catálogo momentumCatálogo momentum
Catálogo momentum
 
How to optimise your social media campaigns
How to optimise your social media campaignsHow to optimise your social media campaigns
How to optimise your social media campaigns
 

Ähnlich wie RustなNATSのClientを作ってみた

Ähnlich wie RustなNATSのClientを作ってみた (20)

HTML5 WebSocket: The New Network Stack for the Web
HTML5 WebSocket: The New Network Stack for the WebHTML5 WebSocket: The New Network Stack for the Web
HTML5 WebSocket: The New Network Stack for the Web
 
How (Docker) Community changed my life
How (Docker) Community changed my lifeHow (Docker) Community changed my life
How (Docker) Community changed my life
 
DevOOPS: Attacks and Defenses for DevOps Toolchains
DevOOPS: Attacks and Defenses for DevOps ToolchainsDevOOPS: Attacks and Defenses for DevOps Toolchains
DevOOPS: Attacks and Defenses for DevOps Toolchains
 
Athens IoT meetup #7 - Create the Internet of your Things - Laurent Ellerbach...
Athens IoT meetup #7 - Create the Internet of your Things - Laurent Ellerbach...Athens IoT meetup #7 - Create the Internet of your Things - Laurent Ellerbach...
Athens IoT meetup #7 - Create the Internet of your Things - Laurent Ellerbach...
 
CDK 2.0: Docker, Kubernetes, And OSE On Your Desk (Langdon White)
CDK 2.0: Docker, Kubernetes, And OSE On Your Desk (Langdon White)CDK 2.0: Docker, Kubernetes, And OSE On Your Desk (Langdon White)
CDK 2.0: Docker, Kubernetes, And OSE On Your Desk (Langdon White)
 
Docker for Java Developers
Docker for Java DevelopersDocker for Java Developers
Docker for Java Developers
 
Automating linux network performance testing
Automating linux network performance testingAutomating linux network performance testing
Automating linux network performance testing
 
Intro to WebSockets
Intro to WebSocketsIntro to WebSockets
Intro to WebSockets
 
(C)NodeJS
(C)NodeJS(C)NodeJS
(C)NodeJS
 
Microservices: 5 things I wish I'd known - Vincent Kok - Codemotion Amsterdam...
Microservices: 5 things I wish I'd known - Vincent Kok - Codemotion Amsterdam...Microservices: 5 things I wish I'd known - Vincent Kok - Codemotion Amsterdam...
Microservices: 5 things I wish I'd known - Vincent Kok - Codemotion Amsterdam...
 
Microservices 5 things i wish i'd known code motion
Microservices 5 things i wish i'd known   code motionMicroservices 5 things i wish i'd known   code motion
Microservices 5 things i wish i'd known code motion
 
Vincent Kok - Microservices 5 things I wish I'd known - Codemotion Milan 2017
Vincent Kok - Microservices 5 things I wish I'd known - Codemotion Milan 2017Vincent Kok - Microservices 5 things I wish I'd known - Codemotion Milan 2017
Vincent Kok - Microservices 5 things I wish I'd known - Codemotion Milan 2017
 
Microservices: 5 Things I Wish I'd Known - Code Motion Milan 2017
Microservices: 5 Things I Wish I'd Known - Code Motion Milan 2017Microservices: 5 Things I Wish I'd Known - Code Motion Milan 2017
Microservices: 5 Things I Wish I'd Known - Code Motion Milan 2017
 
Nginx for Fun & Performance - Philipp Krenn - Codemotion Rome 2015
Nginx for Fun & Performance - Philipp Krenn - Codemotion Rome 2015Nginx for Fun & Performance - Philipp Krenn - Codemotion Rome 2015
Nginx for Fun & Performance - Philipp Krenn - Codemotion Rome 2015
 
HTTP2 is Here!
HTTP2 is Here!HTTP2 is Here!
HTTP2 is Here!
 
Kansas City DC/OS Meetup December 2016
Kansas City DC/OS Meetup December 2016Kansas City DC/OS Meetup December 2016
Kansas City DC/OS Meetup December 2016
 
Anton Moldovan "Building an efficient replication system for thousands of ter...
Anton Moldovan "Building an efficient replication system for thousands of ter...Anton Moldovan "Building an efficient replication system for thousands of ter...
Anton Moldovan "Building an efficient replication system for thousands of ter...
 
Need to-know patterns building microservices - java one
Need to-know patterns building microservices - java oneNeed to-know patterns building microservices - java one
Need to-know patterns building microservices - java one
 
Node js introduction
Node js introductionNode js introduction
Node js introduction
 
Ajaxworld March 2008 - Jeff Haynie Keynote - Appcelerator
Ajaxworld March 2008 - Jeff Haynie Keynote - AppceleratorAjaxworld March 2008 - Jeff Haynie Keynote - Appcelerator
Ajaxworld March 2008 - Jeff Haynie Keynote - Appcelerator
 

Mehr von wallyqs

Mehr von wallyqs (13)

GoSF: Decoupling Services from IP networks with NATS
GoSF: Decoupling Services from IP networks with NATSGoSF: Decoupling Services from IP networks with NATS
GoSF: Decoupling Services from IP networks with NATS
 
OSCON: Building Cloud Native Apps with NATS
OSCON:  Building Cloud Native Apps with NATSOSCON:  Building Cloud Native Apps with NATS
OSCON: Building Cloud Native Apps with NATS
 
SF Python Meetup - Introduction to NATS Messaging with Python3
SF Python Meetup - Introduction to NATS Messaging with Python3SF Python Meetup - Introduction to NATS Messaging with Python3
SF Python Meetup - Introduction to NATS Messaging with Python3
 
Connect Everything with NATS - Cloud Expo Europe
Connect Everything with NATS - Cloud Expo EuropeConnect Everything with NATS - Cloud Expo Europe
Connect Everything with NATS - Cloud Expo Europe
 
KubeCon NA 2018 - NATS Deep Dive: The Evolution of NATS
KubeCon NA 2018 - NATS Deep Dive: The Evolution of NATSKubeCon NA 2018 - NATS Deep Dive: The Evolution of NATS
KubeCon NA 2018 - NATS Deep Dive: The Evolution of NATS
 
NATS for Rubyists - Tokyo Rubyist Meetup
NATS for Rubyists - Tokyo Rubyist MeetupNATS for Rubyists - Tokyo Rubyist Meetup
NATS for Rubyists - Tokyo Rubyist Meetup
 
KubeConEU - NATS Deep Dive
KubeConEU - NATS Deep DiveKubeConEU - NATS Deep Dive
KubeConEU - NATS Deep Dive
 
NATS: Simple, Secure and Scalable Messaging For the Cloud Native Era
NATS: Simple, Secure and Scalable Messaging For the Cloud Native EraNATS: Simple, Secure and Scalable Messaging For the Cloud Native Era
NATS: Simple, Secure and Scalable Messaging For the Cloud Native Era
 
GopherCon 2017 - Writing Networking Clients in Go: The Design & Implementati...
GopherCon 2017 -  Writing Networking Clients in Go: The Design & Implementati...GopherCon 2017 -  Writing Networking Clients in Go: The Design & Implementati...
GopherCon 2017 - Writing Networking Clients in Go: The Design & Implementati...
 
GopherFest 2017 - Adding Context to NATS
GopherFest 2017 -  Adding Context to NATSGopherFest 2017 -  Adding Context to NATS
GopherFest 2017 - Adding Context to NATS
 
NATS + Docker meetup talk Oct - 2016
NATS + Docker meetup talk Oct - 2016NATS + Docker meetup talk Oct - 2016
NATS + Docker meetup talk Oct - 2016
 
The Zen of High Performance Messaging with NATS (Strange Loop 2016)
The Zen of High Performance Messaging with NATS (Strange Loop 2016)The Zen of High Performance Messaging with NATS (Strange Loop 2016)
The Zen of High Performance Messaging with NATS (Strange Loop 2016)
 
サルでもわかるMesos schedulerの作り方
サルでもわかるMesos schedulerの作り方サルでもわかるMesos schedulerの作り方
サルでもわかるMesos schedulerの作り方
 

Kürzlich hochgeladen

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Kürzlich hochgeladen (20)

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...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
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
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
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
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
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...
 
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
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
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...
 

RustなNATSのClientを作ってみた