SlideShare ist ein Scribd-Unternehmen logo
1 von 134
Downloaden Sie, um offline zu lesen
@tetiana12345678 Kiev Elixir Club 2020
Bite-sized Elixir
@tetiana12345678 Kiev Elixir Club 2020
Who is your customer?
@tetiana12345678 Kiev Elixir Club 2020
What problem are we solving?
@tetiana12345678 Kiev Elixir Club 2020
An interactive quiz…
where teams compete against each other…
answering elixir trivia questions
@tetiana12345678 Kiev Elixir Club 2020
Tetiana Dushenkivska
@tetiana12345678 Kiev Elixir Club 2020
The goal
Goal:
@tetiana12345678 Kiev Elixir Club 2020
The goal
Challenge:Goal:
@tetiana12345678 Kiev Elixir Club 2020
Why not?
@tetiana12345678 Kiev Elixir Club 2020
MVP
Earliest
Testable
Product
@tetiana12345678 Kiev Elixir Club 2020
Where to start?
@tetiana12345678 Kiev Elixir Club 2020
Where to start?
@tetiana12345678 Kiev Elixir Club 2020
Where to start?
@tetiana12345678 Kiev Elixir Club 2020
Where to start?
LiveView
@tetiana12345678 Kiev Elixir Club 2020
Where to start?
LiveView
@tetiana12345678 Kiev Elixir Club 2020
Where to start?
LiveView
@tetiana12345678 Kiev Elixir Club 2020
Where to start?
LiveView
@tetiana12345678 Kiev Elixir Club 2020
OUR
Earliest
Testable
Product
Early release not that impressive…
@tetiana12345678 Kiev Elixir Club 2020
V S
OUR
Earliest
Testable
Product
Early release not that impressive…
@tetiana12345678 Kiev Elixir Club 2020
Agile
@tetiana12345678 Kiev Elixir Club 2020
Agile
iteratively and incrementally
@tetiana12345678 Kiev Elixir Club 2020
Agile
iteratively and incrementally
BITE sizes
@tetiana12345678 Kiev Elixir Club 2020
Agile
iteratively and incrementally
BITE sizesBYTE sizes
@tetiana12345678 Kiev Elixir Club 2020
The grand plan
@tetiana12345678 Kiev Elixir Club 2020
Support multiple quizes
@tetiana12345678 Kiev Elixir Club 2020
Quiz mapping
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/router.ex
scope "/", QuizWeb do
...
live "/:conf_name", ConfLive
end
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
def mount(%{"conf_name" => conf_name}, _, socket) do
state = init_state(conf_name)
{:ok, assign(socket, state)}
end
defp init_state(conf_name) do
conf = Quiz.get_by_url(conf_name)
...
end
@tetiana12345678 Kiev Elixir Club 2020
Complete small feature
@tetiana12345678 Kiev Elixir Club 2020
Complete small feature
@tetiana12345678 Kiev Elixir Club 2020
Complete small feature
@tetiana12345678 Kiev Elixir Club 2020
Quiz appearance
Welcome message Last page message
@tetiana12345678 Kiev Elixir Club 2020
Thinking ahead
@tetiana12345678 Kiev Elixir Club 2020
<%= raw @conf.title %>
quiz_web/templates/quiz.html.leex
@tetiana12345678 Kiev Elixir Club 2020
@tetiana12345678 Kiev Elixir Club 2020
score
instant feedback
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
defp is_correct(answer, correct_answer) do
answer == correct_answer
end
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
defp is_correct(answer, correct_answer) do
answer == correct_answer
end
iex> "hello" == "hello "
false
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
defp is_correct(answer, correct_answer) do
answer == correct_answer
end
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
defp is_correct(answer, correct_answer) do
answer == correct_answer
end
defp strip(answer) do
answer
|> String.downcase()
|> String.trim
end
@tetiana12345678 Kiev Elixir Club 2020
3 attempts
@tetiana12345678 Kiev Elixir Club 2020
skip button
@tetiana12345678 Kiev Elixir Club 2020
progress
@tetiana12345678 Kiev Elixir Club 2020
Feedback from customer
@tetiana12345678 Kiev Elixir Club 2020
Answer?
Feedback from customer
@tetiana12345678 Kiev Elixir Club 2020
Answer? -> show correct
answer
Feedback from customer
@tetiana12345678 Kiev Elixir Club 2020
Answer? -> show correct
answer
String
comparison
Feedback from customer
@tetiana12345678 Kiev Elixir Club 2020
Answer? -> show correct
answer
String
comparison -> ast
Feedback from customer
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
defp is_correct(answer, correct_answer) do
quoted(answer) == quoted(correct_answer)
end
defp quoted(answer) do
answer
|> String.downcase()
|> String.trim()
|> Code.string_to_quoted()
end
@tetiana12345678 Kiev Elixir Club 2020
iex> String.capitalize("hello") == "hello"
false
@tetiana12345678 Kiev Elixir Club 2020
Bug! Bug! Bug!
@tetiana12345678 Kiev Elixir Club 2020
1st release
@tetiana12345678 Kiev Elixir Club 2020
Functionally viable increments
1st release
@tetiana12345678 Kiev Elixir Club 2020
Ship it!
28 - 29 May
Code BEAM V
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
@tetiana12345678 Kiev Elixir Club 2020
Beware of the bear!
@tetiana12345678 Kiev Elixir Club 2020
Too many elixircards
(Alvise) arguable
Most used linter
Feedback
@tetiana12345678 Kiev Elixir Club 2020
Automate!
@tetiana12345678 Kiev Elixir Club 2020
Issues with the code
Hard to follow logic of the game
Does it even work?
@tetiana12345678 Kiev Elixir Club 2020
Readability issue
2 long files conf_live.ex game.ex
state
new state
PUREIMPURE
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
def handle_event("next_card", _, socket) do
updated_game = Game.update_state(socket.assigns.game)
{:noreply, assign(socket, game: updated_game)}
end
@tetiana12345678 Kiev Elixir Club 2020
lib/game.ex
def init_state(conf) do
%Game{
card_index: 1,
number_of_cards: Enum.count(conf.cards),
card: hd(conf.cards),
cards: tl(conf.cards)
}
end
Before
@tetiana12345678 Kiev Elixir Club 2020
lib/game.ex
After
def init_state(conf) do
cards = setup_cards(conf.cards)
%Game{
card_index: 1,
number_of_cards: Enum.count(conf.cards),
card: hd(conf.cards),
cards: tl(conf.cards)
}
end
@tetiana12345678 Kiev Elixir Club 2020
lib/game.ex
After
defp setup_cards(cards) do
add_card_index = fn card, i ->
{Card.update_card(card, %{index: i}), i + 1}
end
{cards, index} = Enum.map_reduce(cards, 1, add_card_index)
cards
end
@tetiana12345678 Kiev Elixir Club 2020
lib/card.ex
After defmodule Quiz.Card do
use Ecto.Schema
import Ecto.Changeset
schema "cards" do
...
field :index, :integer, virtual: true
end
def update_card(card, params) do
card
|> cast(params, [:index])
|> apply_changes()
end
end
@tetiana12345678 Kiev Elixir Club 2020
test/quiz_test.exs
After
@tetiana12345678 Kiev Elixir Club 2020
After
lib/game.ex
def update_state(game) do
%Game{
card_index: game.number_of_cards - Enum.count(game.cards),
card: hd(conf.cards),
cards: tl(conf.cards)
}
end
@tetiana12345678 Kiev Elixir Club 2020
Readability issue
2 long files
index.html.leex
state1.html.leex
state2.html.leex
state3.html.leex
…
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
def render(assigns) do
Phoenix.View.render(QuizWeb.QuizView, "index.html", assigns)
end
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/templates/quiz/index.html.leex
@tetiana12345678 Kiev Elixir Club 2020
Ship it!
18 - 19 June
ElixirConf EU
@tetiana12345678 Kiev Elixir Club 2020
@tetiana12345678 Kiev Elixir Club 2020
High scores board
@tetiana12345678 Kiev Elixir Club 2020
High scores board
Hints
@tetiana12345678 Kiev Elixir Club 2020
Quiz is time based
High scores board
Hints
@tetiana12345678 Kiev Elixir Club 2020
Quiz is time based
High scores board
Hints
45s
@tetiana12345678 Kiev Elixir Club 2020
Quiz is time based
High scores board
Hints
45s
@tetiana12345678 Kiev Elixir Club 2020
Quiz is time based
High scores board
Hints
45s
@tetiana12345678 Kiev Elixir Club 2020
Elixir
@tetiana12345678 Kiev Elixir Club 2020
Elixir
@tetiana12345678 Kiev Elixir Club 2020
Hints
Hint: Expected a String, got Integer
@tetiana12345678 Kiev Elixir Club 2020
Elixir
Integer.parse("34")
=> {34, ""}
@tetiana12345678 Kiev Elixir Club 2020
Elixir
Integer.parse("34")
=> {34, ""}
Integer.parse("three")
=> :error
@tetiana12345678 Kiev Elixir Club 2020
Elixir
Integer.parse("34")
=> {34, ""}
Integer.parse("three")
=> :error
Integer.parse("34.5")
=> {34, ".5"}
@tetiana12345678 Kiev Elixir Club 2020
Elixir
Integer.parse("34.4boom")
{34, ".4boom"}
@tetiana12345678 Kiev Elixir Club 2020
Elixir
def type(input)
input
|> Code.string_to_quoted()
|> get_type()
end
@tetiana12345678 Kiev Elixir Club 2020
Elixir
defp get_type(quoted_value) when is_float(quoted_value), do: "Float"
defp get_type(quoted_value) when is_integer(quoted_value), do: "Integer"
defp get_type(quoted_value) when is_binary(quoted_value), do: "String"
defp get_type(quoted_value) when is_list(quoted_value), do: "List"
defp get_type(quoted_value) when is_boolean(quoted_value), do: "Boolean"
defp get_type(quoted_value) when is_atom(quoted_value), do: "Atom"
def type(input)
input
|> Code.string_to_quoted()
|> get_type()
end
@tetiana12345678 Kiev Elixir Club 2020
Elixir
@tetiana12345678 Kiev Elixir Club 2020
Elixir
{:ok,
@tetiana12345678 Kiev Elixir Club 2020
Elixir
** (SyntaxError) unexpected token: ).
The "{" is missing terminator "}"
{:ok,
@tetiana12345678 Kiev Elixir Club 2020
Elixir
def type(input)
input
|> Code.string_to_quoted()
|> get_type()
rescue
_ -> "Unidentified"
end
@tetiana12345678 Kiev Elixir Club 2020
Quiz is time based
High scores board
Hints
45s
@tetiana12345678 Kiev Elixir Club 2020
@tetiana12345678 Kiev Elixir Club 2020
High score board
@tetiana12345678 Kiev Elixir Club 2020
High score board
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
def mount(%{"conf_name" => conf_name}, socket) do
...
topic = conf_name
if connected?(socket) do
Phoenix.PubSub.subscribe(QuizWeb.PubSub, topic)
end
{:ok, socket}
end
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
def handle_event("email", params, socket) do
add_new_score(socket, params)
{:noreply, socket}
end
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
defp add_new_score(socket, params) do
case Store.Quiz.add_new_score(params) do
{:ok, score} ->
message = {:score_added, score}
topic = socket.assigns.game.conf_name
Phoenix.PubSub.broadcast(QuizWeb.PubSub, topic, message)
_ -> :noop
end
end
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/live/quiz_live.ex
def handle_info({:score_added, score}, socket) do
high_scores =
[score | socket.assigns.high_scores]
|> Enum.sort_by(& &1.score, :asc)
{:noreply, assign(socket, high_scores: high_scores)}
end
@tetiana12345678 Kiev Elixir Club 2020
Feedback time
@tetiana12345678 Kiev Elixir Club 2020
Feedback time
When Erlang was open sourced?
@tetiana12345678 Kiev Elixir Club 2020
Feedback time
When Erlang was open sourced?
Hint: the answer is an Integer.
@tetiana12345678 Kiev Elixir Club 2020
Earliest Usable Product
@tetiana12345678 Kiev Elixir Club 2020
Ship it!
3 - 4 Sept
ElixirConf
@tetiana12345678 Kiev Elixir Club 2020
Hints don’t work
Feedback
@tetiana12345678 Kiev Elixir Club 2020
Think outside the box - hints!
@tetiana12345678 Kiev Elixir Club 2020
Hint 1:
1st half of the answer
Think outside the box - hints!
@tetiana12345678 Kiev Elixir Club 2020
Hint 1:
1st half of the answer
Think outside the box - hints!
Hint 2:
2nd half of the answer
@tetiana12345678 Kiev Elixir Club 2020
An interactive quiz…
where teams compete against each other…
answering elixir trivia questions
@tetiana12345678 Kiev Elixir Club 2020
Ship it!
10 - 11 Sept
Code BEAM STO
@tetiana12345678 Kiev Elixir Club 2020
Feedback
Nice content
@tetiana12345678 Kiev Elixir Club 2020
Improvements - logo setup
@tetiana12345678 Kiev Elixir Club 2020
Improvements - logo setup
@tetiana12345678 Kiev Elixir Club 2020
quiz_web/templates/layout/root.html.leex
<img scr="<%= assigns.game.logo_url %>"/>
@tetiana12345678 Kiev Elixir Club 2020
Ship it!
7 - 8 Oct
Elixir Conf EU
@tetiana12345678 Kiev Elixir Club 2020
Feedback
Lots of likes, loves,
1 meh
@tetiana12345678 Kiev Elixir Club 2020
editor_web/lib/templates/card/card.html.leex
<textarea name="card[meta]" phx-debounce="blur">
<%= {:safe, Jason.encode!(@card.meta)} %>
</textarea>
@tetiana12345678 Kiev Elixir Club 2020
editor/priv/repo/migrations/*add_meta_to_card.exs
defmodule Editor.Repo.Migrations.AddMetaToCard do
use Ecto.Migration
def change do
alter table(:cards) do
add(:meta, :map)
end
end
end
@tetiana12345678 Kiev Elixir Club 2020
editor/lib/card.ex
defmodule Editor.Card do
...
@derive {Jason.Encoder, only: [:meta]}
schema "cards" do
...
embeds_one(:meta, Editor.CardMeta, on_replace: :delete)
end
def changeset(card, params) do
params_with_meta = Map.update!(params, "meta", &Jason.decode!/1)
card
|> cast(params_with_meta, @fields)
|> cast_embed(:meta)
...
end
end
@tetiana12345678 Kiev Elixir Club 2020
editor/lib/card_meta.ex
defmodule Editor.CardMeta do
use Ecto.Schema
import Ecto.Changeset
@fields ~w(style hints)a
@derive {Jason.Encoder, only: @fields}
@primary_key false
embedded_schema do
field :style, :string
field :hints, {:array, :string}, default: []
end
def changeset(schema, params) do
cast(schema, params, @fields)
end
end
@tetiana12345678 Kiev Elixir Club 2020
editor/lib/card_meta.ex
defmodule Editor.CardMeta do
use Ecto.Schema
import Ecto.Changeset
@fields ~w(style class hints)a
@derive {Jason.Encoder, only: @fields}
@primary_key false
embedded_schema do
field :style :class, :string, default: ""
field :hints, {:array, :string}, default: []
end
def changeset(schema, params) do
cast(schema, params, @fields)
end
end
@tetiana12345678 Kiev Elixir Club 2020
editor_web/assets/css/app.css
@tetiana12345678 Kiev Elixir Club 2020
editor_web/lib/templates/card.html.leex
<tr class="<%= Phoenix.HTML.raw(@card.meta.class) %>">
@tetiana12345678 Kiev Elixir Club 2020
Ship it!
5 - 6 Nov
Code Mesh
@tetiana12345678 Kiev Elixir Club 2020
Earliest Lovable Product
@tetiana12345678 Kiev Elixir Club 2020
Ship it!
19 Nov
Elixir Club
@tetiana12345678 Kiev Elixir Club 2020
Quiz
quiz.elixircards.co.uk/elixir_kiev_club
@tetiana12345678 Kiev Elixir Club 2020
Feedback
not intuitive when
answer is wrong
???
@tetiana12345678 Kiev Elixir Club 2020
Summary
@tetiana12345678 Kiev Elixir Club 2020
Summary
@tetiana12345678 Kiev Elixir Club 2020
Summary
Who is
your
customer?
@tetiana12345678 Kiev Elixir Club 2020
Summary
Who is
your
customer?
What problem
are you
solving?
@tetiana12345678 Kiev Elixir Club 2020
Summary
Who is
your
customer?
What problem
are you
solving?
Earliest
Testable
Product
@tetiana12345678 Kiev Elixir Club 2020
Summary
Who is
your
customer?
What problem
are you
solving?
Earliest
Testable
Product
Feedback
@tetiana12345678 Kiev Elixir Club 2020
Summary
Who is
your
customer?
What problem
are you
solving?
Earliest
Testable
Product
Small releasable
iterations of
complete features
Feedback

Weitere ähnliche Inhalte

Mehr von Elixir Club

Mehr von Elixir Club (20)

Promo Phx4RailsDevs - Volodya Sveredyuk
Promo Phx4RailsDevs - Volodya SveredyukPromo Phx4RailsDevs - Volodya Sveredyuk
Promo Phx4RailsDevs - Volodya Sveredyuk
 
Web of today — Alexander Khokhlov
Web of today —  Alexander KhokhlovWeb of today —  Alexander Khokhlov
Web of today — Alexander Khokhlov
 
ElixirConf Eu 2018, what was it like? – Eugene Pirogov
ElixirConf Eu 2018, what was it like? – Eugene PirogovElixirConf Eu 2018, what was it like? – Eugene Pirogov
ElixirConf Eu 2018, what was it like? – Eugene Pirogov
 
Implementing GraphQL API in Elixir – Victor Deryagin
Implementing GraphQL API in Elixir – Victor DeryaginImplementing GraphQL API in Elixir – Victor Deryagin
Implementing GraphQL API in Elixir – Victor Deryagin
 
WebPerformance: Why and How? – Stefan Wintermeyer
WebPerformance: Why and How? – Stefan WintermeyerWebPerformance: Why and How? – Stefan Wintermeyer
WebPerformance: Why and How? – Stefan Wintermeyer
 
GenServer in Action – Yurii Bodarev
GenServer in Action – Yurii Bodarev   GenServer in Action – Yurii Bodarev
GenServer in Action – Yurii Bodarev
 
Russian Doll Paradox: Elixir Web without Phoenix - Alex Rozumii
Russian Doll Paradox: Elixir Web without Phoenix - Alex RozumiiRussian Doll Paradox: Elixir Web without Phoenix - Alex Rozumii
Russian Doll Paradox: Elixir Web without Phoenix - Alex Rozumii
 
Practical Fault Tolerance in Elixir - Alexei Sholik
Practical Fault Tolerance in Elixir - Alexei SholikPractical Fault Tolerance in Elixir - Alexei Sholik
Practical Fault Tolerance in Elixir - Alexei Sholik
 
Phoenix and beyond: Things we do with Elixir - Alexander Khokhlov
Phoenix and beyond: Things we do with Elixir - Alexander KhokhlovPhoenix and beyond: Things we do with Elixir - Alexander Khokhlov
Phoenix and beyond: Things we do with Elixir - Alexander Khokhlov
 
Monads are just monoids in the category of endofunctors - Ike Kurghinyan
Monads are just monoids in the category of endofunctors - Ike KurghinyanMonads are just monoids in the category of endofunctors - Ike Kurghinyan
Monads are just monoids in the category of endofunctors - Ike Kurghinyan
 
Craft effective API with GraphQL and Absinthe - Ihor Katkov
Craft effective API with GraphQL and Absinthe - Ihor KatkovCraft effective API with GraphQL and Absinthe - Ihor Katkov
Craft effective API with GraphQL and Absinthe - Ihor Katkov
 
Elixir in a service of government - Alex Troush
Elixir in a service of government - Alex TroushElixir in a service of government - Alex Troush
Elixir in a service of government - Alex Troush
 
Pattern matching in Elixir by example - Alexander Khokhlov
Pattern matching in Elixir by example - Alexander KhokhlovPattern matching in Elixir by example - Alexander Khokhlov
Pattern matching in Elixir by example - Alexander Khokhlov
 
Ecto and Phoenix: Doing web with Elixir - Yurii Bodarev
Ecto and Phoenix: Doing web with Elixir - Yurii BodarevEcto and Phoenix: Doing web with Elixir - Yurii Bodarev
Ecto and Phoenix: Doing web with Elixir - Yurii Bodarev
 
Handling external APIs with Elixir - Alex Rozumii
Handling external APIs with Elixir - Alex RozumiiHandling external APIs with Elixir - Alex Rozumii
Handling external APIs with Elixir - Alex Rozumii
 
Public Elixir in a service of government - Alex Troush
Public Elixir in a service of government - Alex TroushPublic Elixir in a service of government - Alex Troush
Public Elixir in a service of government - Alex Troush
 
How I did create Telegram bot - Roman Senin
How I did create Telegram bot - Roman SeninHow I did create Telegram bot - Roman Senin
How I did create Telegram bot - Roman Senin
 
Designing scalable application: from umbrella project to distributed system -...
Designing scalable application: from umbrella project to distributed system -...Designing scalable application: from umbrella project to distributed system -...
Designing scalable application: from umbrella project to distributed system -...
 
Deploying Elixir/Phoenix with Distillery - Yaroslav Martsynuyk
Deploying Elixir/Phoenix with Distillery - Yaroslav MartsynuykDeploying Elixir/Phoenix with Distillery - Yaroslav Martsynuyk
Deploying Elixir/Phoenix with Distillery - Yaroslav Martsynuyk
 
Deploying Elixir application - Alexey Osipenko
Deploying Elixir application - Alexey OsipenkoDeploying Elixir application - Alexey Osipenko
Deploying Elixir application - Alexey Osipenko
 

Kürzlich hochgeladen

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Kürzlich hochgeladen (20)

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...
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
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...
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
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
 
Tech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdfTech Trends Report 2024 Future Today Institute.pdf
Tech Trends Report 2024 Future Today Institute.pdf
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
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
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
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...
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
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
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
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
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 

Bite-sized Elixir (ENG) - Tetiana Dushenkivska | Elixir Club Evening 4 Online