SlideShare une entreprise Scribd logo
1  sur  75
Télécharger pour lire hors ligne
Testing Embedded Systems
With Cucumber
Ian Dees • @undees
CukeUp! NYC 2013
Plenty of Ruby, but...
There will be C
There will be C++
There will be C#
http://pragprog.com/
titles/dhwcr
discount code:
CucumberIanDees
The Embedded
Continuum
almost a
computer
chip and
some ROM
Simple devices
No Ruby, no Cucumber
Gray Code
A simple system to test
Feature: Gray Code
Scenario Outline: Counter
When I press the button
Then the LEDs should read "<leds>"
Examples:
| leds |
| ..O |
| .OO |
| .O. |
| OO. |
| OOO |
| O.O |
| O.. |
| ... |
Arduino
void loop() {
button.update();
bool buttonPressed = button.risingEdge();
if (buttonPressed) {
counter = (counter + 1) % ENTRIES;
updateLeds();
}
delay(50);
}
Drive code directly
void loop() {
button.update();
bool buttonPressed = button.risingEdge();
if (buttonPressed) {
counter = (counter + 1) % ENTRIES;
updateLeds();
}
delay(50);
}
void loop() {
button.update();
bool buttonPressed = button.risingEdge();
if (buttonPressed) {
counter = (counter + 1) % ENTRIES;
updateLeds();
}
delay(50);
}
static bool isFakeButtonPressed;
class Bounce {
public:
// ...
bool risingEdge() {
bool result = isFakeButtonPressed;
isFakeButtonPressed = false;
return result;
}
};
extern "C" void press() {
isFakeButtonPressed = true;
}
const char* leds() {
static char buf[LEDS + 1] = {0};
for (int i = 0; i < LEDS; ++i) {
buf[i] = STATES[counter][i] == HIGH ?
'O' :
'.';
}
return buf;
}
https://github.com/ffi/ffi
FFI
require 'ffi'
module Arduino
extend FFI::Library
ffi_lib 'graycode'
attach_function :press, [], :void
attach_function :leds, [], :string
attach_function :setup, [], :void
attach_function :loop, [], :void
end
When /^I press the button$/ do
Arduino.press
Arduino.loop
end
Then /^the LEDs should read "(.*?)"$/ do
|leds|
expect(Arduino.leds).to eq(leds)
end
Cucumber Wire Protocol
Cucumber-CPP
https://github.com/cucumber/cucumber-cpp
host: localhost
port: 3902
features/step_definitions/cucumber.wire
When /^I press the button$/ do
Arduino.press
Arduino.loop
end
Then /^the LEDs should read "(.*?)"$/ do
|expected|
expect(Arduino.leds).to eq(expected)
end
WHEN("^I press the button$") {
press();
loop();
}
THEN("^the LEDs should read "(.*?)"$") {
REGEX_PARAM(string, expected);
BOOST_CHECK_EQUAL(leds(), expected);
}
Bespoke wire server
http://www.2600.com/code/212/listener.c
listen/accept/read/write
while(fgets(buf,sizeof buf,rStream)) {
respond_to_cucumber(wStream, buf);
}
step_matches
invoke
Two messages
Then the LEDs should read "..O"
➡
["step_matches",
{"name_to_match":
"the LEDs should read"}]
➡
["success",
[{"id":"1",
"args":[{"val":"..O",
"pos":"22"}]}]]
json spirit
http://www.codeproject.com/KB/recipes/
JSON_Spirit.aspx
extern "C" void respond_to_cucumber(
FILE* stream,
const char* message) {
string s = message;
Value v;
read(s, v);
Array& a = v.get_array();
string type = a[0].get_str();
// handle Cucumber message types
report_success(stream);
}
if (type == "step_matches") {
string name = step_name(v);
if (name == "I press the button") {
report_success(stream);
return;
} else if (...)
// ...
}
}
if (type == "step_matches") {
string name = step_name(v);
if (name == "I press the button") {
report_success(stream);
return;
} else if (...)
// ...
}
}
if (type == "step_matches") {
string name = step_name(v);
if (...) {
// ...
} else if (name.find("the LEDs") == 0)
const int START = 22;
string leds = name.substr(START, 3);
report_match(leds, START, stream);
return;
}
}
Then the LEDs should read "..O"
➡
["invoke",
{"id":"1",
"args":["..O"]}]
➡
["success", []]
if (type == "invoke") {
string id = step_id(v);
if (id == "0") {
press();
loop();
} else if (id == "1") {
// ...
}
}
}
if (type == "invoke") {
string id = step_id(v);
if (id == "0") {
press();
loop();
} else if (id == "1") {
// ...
}
}
}
if (type == "invoke") {
string id = step_id(v);
if (id == "0") {
// ...
} else if (id == "1") {
string expected = step_leds(v);
if (expected != leds()) {
report_failure("LEDs", stream);
return;
}
}
}
https://github.com/hparra/ruby-serialport
Serial
void loop() {
button.update();
bool buttonPressed = button.risingEdge();
if (buttonPressed) {
counter = (counter + 1) % ENTRIES;
updateLeds();
}
delay(50);
}
void loop() {
button.update();
bool buttonPressed = button.risingEdge();
if ( buttonPressed ) {
counter = (counter + 1) % ENTRIES;
updateLeds();
delay(50);
}
void loop() {
button.update();
bool buttonPressed = button.risingEdge();
int command = (Serial.available() > 0 ?
Serial.read() :
-1);
if (isIncrement(buttonPressed, command)) {
counter = (counter + 1) % ENTRIES;
updateLeds();
} else if (isQuery(command)) {
Serial.write(leds());
Serial.write('n');
}
delay(50);
}
void loop() {
button.update();
bool buttonPressed = button.risingEdge();
int command = (Serial.available() > 0 ?
Serial.read() :
-1);
if (isIncrement(buttonPressed, command)) {
counter = (counter + 1) % ENTRIES;
updateLeds();
} else if (isQuery(command)) {
Serial.write(leds());
Serial.write('n');
}
delay(50);
}
void loop() {
button.update();
bool buttonPressed = button.risingEdge();
int command = (Serial.available() > 0 ?
Serial.read() :
-1);
if (isIncrement(buttonPressed, command)) {
counter = (counter + 1) % ENTRIES;
updateLeds();
} else if (isQuery(command)) {
Serial.write(leds());
Serial.write('n');
}
delay(50);
}
void loop() {
button.update();
bool buttonPressed = button.risingEdge();
int command = (Serial.available() > 0 ?
Serial.read() :
-1);
if (isIncrement(buttonPressed, command)) {
counter = (counter + 1) % ENTRIES;
updateLeds();
} else if (isQuery(command)) {
Serial.write(leds());
Serial.write('n');
}
delay(50);
}
require 'serialport'
module Arduino
@@port = SerialPort.open 2, 9600
at_exit { @@port.close }
def self.press
@@port.write '+'
end
def self.leds
@@port.write '?'
@@port.read.strip
end
end
Ruby, C#, SpecFlow, Cucumber
Almost a computer
Feature: Calculator
Scenario: Add two numbers
When I multiply 2 and 3
Then I should get 6
Run Cucumber directly
rsync -av --delete . remote1:test_path
ssh remote1 'cd test_path && cucumber'
Drive the GUI
TestStack White
https://github.com/TestStack/White
namespace Calc.Spec
{
[Binding]
public class CalculatorSteps
{
private Window window;
[Before]
public void Before()
{
Application application =
Application.Launch("calc.exe");
window =
application.GetWindow(
"Calculator",
InitializeOption.NoCache);
}
// ...
}
}
namespace Calc.Spec
{
[Binding]
public class CalculatorSteps
{
private Window window;
[Before]
public void Before()
{
Application application =
Application.Launch("calc.exe");
window =
application.GetWindow(
"Calculator",
InitializeOption.NoCache);
}
// ...
}
}
namespace Calc.Spec
{
[Binding]
public class CalculatorSteps
{
private Window window;
[Before]
public void Before()
{
Application application =
Application.Launch("calc.exe");
window =
application.GetWindow(
"Calculator",
InitializeOption.NoCache);
}
// ...
}
}
[When(@"I multiply (.*) and (.*)")]
public void WhenIMultiply(string a, string b)
{
window.Keyboard.Enter(a + "*" + b + "=");
}
[Then(@"I should get (.*)")]
public void ThenIShouldGet(string expected)
{
window.Get<Label>(expected);
}
Give your app an API
Mongoose web server
int main()
{
struct mg_context *ctx = mg_start();
mg_set_option(ctx, "ports", "33333");
mg_set_uri_callback(ctx, "/",
&show_index, 0);
mg_set_uri_callback(ctx, "/multiply",
&multiply, 0);
mg_set_uri_callback(ctx, "/result",
&get_result, 0);
getchar();
mg_stop(ctx);
return 0;
}
int main()
{
struct mg_context *ctx = mg_start();
mg_set_option(ctx, "ports", "33333");
mg_set_uri_callback(ctx, "/",
&show_index, 0);
mg_set_uri_callback(ctx, "/multiply",
&multiply, 0);
mg_set_uri_callback(ctx, "/result",
&get_result, 0);
getchar();
mg_stop(ctx);
return 0;
}
static void multiply(
struct mg_connection *conn,
const struct mg_request_info *request_info,
void *user_data)
{
char *ap = mg_get_var(conn, "multiplier");
char *bp = mg_get_var(conn, "multiplicand");
int a = atol(ap);
int b = atol(bp);
result = a * b;
mg_printf(conn,
"HTTP/1.1 200 OKrn
Content-Type: text/plainrnrn");
mg_free(multiplier_s);
mg_free(multiplicand_s);
}
static void multiply(
struct mg_connection *conn,
const struct mg_request_info *request_info,
void *user_data)
{
char *ap = mg_get_var(conn, "multiplier");
char *bp = mg_get_var(conn, "multiplicand");
int a = atol(ap);
int b = atol(bp);
result = a * b;
mg_printf(conn,
"HTTP/1.1 200 OKrn
Content-Type: text/plainrnrn");
mg_free(multiplier_s);
mg_free(multiplicand_s);
}
static void multiply(
struct mg_connection *conn,
const struct mg_request_info *request_info,
void *user_data)
{
char *ap = mg_get_var(conn, "multiplier");
char *bp = mg_get_var(conn, "multiplicand");
int a = atol(ap);
int b = atol(bp);
result = a * b;
mg_printf(conn,
"HTTP/1.1 200 OKrn
Content-Type: text/plainrnrn");
mg_free(multiplier_s);
mg_free(multiplicand_s);
}
static void multiply(
struct mg_connection *conn,
const struct mg_request_info *request_info,
void *user_data)
{
char *ap = mg_get_var(conn, "multiplier");
char *bp = mg_get_var(conn, "multiplicand");
int a = atol(ap);
int b = atol(bp);
result = a * b;
mg_printf(conn,
"HTTP/1.1 200 OKrn
Content-Type: text/plainrnrn");
mg_free(multiplier_s);
mg_free(multiplicand_s);
}
static void get_result(
struct mg_connection *conn,
const struct mg_request_info *request_info,
void *user_data)
{
mg_printf(conn,
"HTTP/1.1 200 OKrn
Content-Type: text/plainrnrn%d",
result);
}
https://github.com/jnunemaker/httparty
HTTParty
When(/^I multiply (d+) and (d+)$/) do |a, b|
Calculator.multiply a, b
end
Then(/^I should get (d+)$/) do |n|
expect(Calculator.result).to eq(n.to_i)
end
require 'httparty'
class Calculator
include HTTParty
base_uri 'localhost:33333'
def self.multiply(a, b)
get "/multiply?multiplier=#{a}
&multiplicand=#{b}"
end
def self.result
get("/result").to_i
end
end
(because tl;dr is passé)
In summary:
Have source? Device Technique
yes simple Direct
yes simple Serial
yes medium
Cucumber Wire
Protocol
yes powerful Custom TCP
no powerful GUI
Thank you
https://github.com/undees/cukeup

Contenu connexe

Plus de Skills Matter

Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applicationsSkills Matter
 
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmScala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmSkills Matter
 
Oscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimOscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimSkills Matter
 
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Skills Matter
 
Cukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlCukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlSkills Matter
 
Cukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsCukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsSkills Matter
 
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Skills Matter
 
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Skills Matter
 
Progressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldProgressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldSkills Matter
 
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Skills Matter
 
Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Skills Matter
 
A poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingA poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingSkills Matter
 
Russ miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveRuss miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveSkills Matter
 
Simon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSimon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSkills Matter
 
I went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tI went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tSkills Matter
 

Plus de Skills Matter (20)

Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applications
 
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmScala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
 
Oscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimOscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheim
 
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
 
Cukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlCukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberl
 
Cukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsCukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.js
 
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
 
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
 
Progressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldProgressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source world
 
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
 
Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#
 
A poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingA poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testing
 
Russ miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveRuss miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-dive
 
Serendipity-neo4j
Serendipity-neo4jSerendipity-neo4j
Serendipity-neo4j
 
Simon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSimon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelism
 
Plug 20110217
Plug   20110217Plug   20110217
Plug 20110217
 
Lug presentation
Lug presentationLug presentation
Lug presentation
 
I went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tI went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_t
 
Plug saiku
Plug   saikuPlug   saiku
Plug saiku
 
Huguk lily
Huguk lilyHuguk lily
Huguk lily
 

Dernier

Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
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 FresherRemote DBA Services
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdflior mazor
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
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 Takeoffsammart93
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 

Dernier (20)

Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
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
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
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
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 

Cukeup nyc ian dees on testing embedded systems with cucumber