Jekyll2020-10-07T16:29:15+00:00https://poznajazure.pl/blog/feed.xmlPoznaj Azure - blogZestaw artykułów i pomysłów, które omawiamy w ramach inicjatywy "Poznaj Azure"Poznaj AzureLiga Mistrzów i brakujący element2020-10-07T13:34:30+00:002020-10-07T13:34:30+00:00https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-brakujacy-element<p>Artykuł jest częścią, większej całości. W serii znajdują się:</p>
<ul>
<li>Część 1 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-konta-uzytkownikow/">Liga Mistrzów i konta użytkowników</a></li>
<li>Część 2 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-7-sposobow-na-hosting/">Liga Mistrzów i 7 sposobów na hosting</a></li>
<li>Część 3 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-bazy-danych/">Liga Mistrzów i bazy danych</a></li>
<li>Część 4 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-brakujacy-element/">Liga Mistrzów i brakujący element</a></li>
<li>Część 5 - Liga Mistrzów i diagnostyka - TODO</li>
</ul>
<div>
<script src="https://f.convertkit.com/ckjs/ck.5.js"></script>
<form action="https://app.convertkit.com/forms/1689392/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="1689392" data-uid="d2e88d98d6" data-format="inline" data-version="5" data-options="{"settings":{"after_subscribe":{"action":"redirect","success_message":"Success! Now check your email to confirm your subscription.","redirect_url":"https://poznajAzure.pl/confirmSubscription.html"},"analytics":{"google":null,"facebook":null,"segment":null,"pinterest":null},"modal":{"trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"powered_by":{"show":true,"url":"https://convertkit.com?utm_source=dynamic&utm_medium=referral&utm_campaign=poweredby&utm_content=form"},"recaptcha":{"enabled":false},"return_visitor":{"action":"show","custom_content":""},"slide_in":{"display_in":"bottom_right","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"sticky_bar":{"display_in":"top","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15}},"version":"5"}" min-width="400 500 600 700 800" style="background-color: rgb(255, 255, 255); border-radius: 6px">
<div class="formkit-background" style="opacity: 0.3"></div>
<div data-style="minimal">
<div class="formkit-header" data-element="header" style="color: rgb(77, 77, 77); font-size: 20px; font-weight: 700">
<h1>Nie chcesz czekać?</h1>
</div>
<ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul>
<div data-element="fields" data-stacked="true" class="seva-fields formkit-fields">
<div class="formkit-field">
<input class="formkit-input" name="email_address" aria-label="Twój email" placeholder="Twój email" required="" type="email" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<div class="formkit-field">
<input class="formkit-input" aria-label="Imię lub nick" name="fields[first_name]" placeholder="Imię lub nick" type="text" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<button data-element="submit" class="formkit-submit formkit-submit" style="
color: rgb(255, 255, 255);
background-color: rgb(22, 119, 190);
border-radius: 24px;
font-weight: 700;
">
<div class="formkit-spinner">
<div></div>
<div></div>
<div></div>
</div>
<span>Zapisz się</span>
</button>
</div>
<div class="formkit-guarantee" data-element="guarantee" style="color: rgb(77, 77, 77); font-size: 13px; font-weight: 400">
<p>
<span style="color: rgb(59, 59, 59)">Polityka prywatności - </span><a href="https://poznajazure.pl/policy.html" target="_blank" rel="noopener noreferrer">więcej</a>​
</p>
</div>
</div>
<style>
.formkit-form[data-uid="d2e88d98d6"] * {
box-sizing: border-box;
}
.formkit-form[data-uid="d2e88d98d6"] {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.formkit-form[data-uid="d2e88d98d6"] legend {
border: none;
font-size: inherit;
margin-bottom: 10px;
padding: 0;
position: relative;
display: table;
}
.formkit-form[data-uid="d2e88d98d6"] fieldset {
border: 0;
padding: 0.01em 0 0 0;
margin: 0;
min-width: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
body:not(:-moz-handler-blocked)
fieldset {
display: table-cell;
}
.formkit-form[data-uid="d2e88d98d6"] h1,
.formkit-form[data-uid="d2e88d98d6"] h2,
.formkit-form[data-uid="d2e88d98d6"] h3,
.formkit-form[data-uid="d2e88d98d6"] h4,
.formkit-form[data-uid="d2e88d98d6"] h5,
.formkit-form[data-uid="d2e88d98d6"] h6 {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="d2e88d98d6"] p {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="d2e88d98d6"] ol:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] ul:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] blockquote:not([template-default]) {
text-align: left;
}
.formkit-form[data-uid="d2e88d98d6"] p:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] hr:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] blockquote:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] ol:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] ul:not([template-default]) {
color: inherit;
font-style: initial;
}
.formkit-form[data-uid="d2e88d98d6"] .ordered-list,
.formkit-form[data-uid="d2e88d98d6"] .unordered-list {
list-style-position: outside !important;
padding-left: 0.5em;
}
.formkit-form[data-uid="d2e88d98d6"] .list-item {
padding-left: 0;
}
.formkit-form[data-uid="d2e88d98d6"][data-format="modal"] {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"][data-format="slide in"] {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"][data-format="sticky bar"] {
display: none;
}
.formkit-sticky-bar
.formkit-form[data-uid="d2e88d98d6"][data-format="sticky bar"] {
display: block;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input,
.formkit-form[data-uid="d2e88d98d6"] .formkit-select,
.formkit-form[data-uid="d2e88d98d6"] .formkit-checkboxes {
width: 100%;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit {
border: 0;
border-radius: 5px;
color: #ffffff;
cursor: pointer;
display: inline-block;
text-align: center;
font-size: 15px;
font-weight: 500;
cursor: pointer;
margin-bottom: 15px;
overflow: hidden;
padding: 0;
position: relative;
vertical-align: middle;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:hover,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:hover,
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:focus,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:focus {
outline: none;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:hover > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:hover > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:focus > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:focus > span {
background-color: rgba(0, 0, 0, 0.1);
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit > span {
display: block;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
padding: 12px 24px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input {
background: #ffffff;
font-size: 15px;
padding: 12px;
border: 1px solid #e3e3e3;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
line-height: 1.4;
margin: 0;
-webkit-transition: border-color ease-out 300ms;
transition: border-color ease-out 300ms;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input:focus {
outline: none;
border-color: #1677be;
-webkit-transition: border-color ease 300ms;
transition: border-color ease 300ms;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-input::-webkit-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input::-moz-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-input:-ms-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input::placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="dropdown"] {
position: relative;
display: inline-block;
width: 100%;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="dropdown"]::before {
content: "";
top: calc(50% - 2.5px);
right: 10px;
position: absolute;
pointer-events: none;
border-color: #4f4f4f transparent transparent transparent;
border-style: solid;
border-width: 6px 6px 0 6px;
height: 0;
width: 0;
z-index: 999;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="dropdown"] select {
height: auto;
width: 100%;
cursor: pointer;
color: #333333;
line-height: 1.4;
margin-bottom: 0;
padding: 0 6px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
font-size: 15px;
padding: 12px;
padding-right: 25px;
border: 1px solid #e3e3e3;
background: #ffffff;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="dropdown"]
select:focus {
outline: none;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="checkboxes"] {
text-align: left;
margin: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"] {
margin-bottom: 10px;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
* {
cursor: pointer;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]:last-of-type {
margin-bottom: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"] {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]
+ label::after {
content: none;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::after {
border-color: #ffffff;
content: "";
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::before {
background: #10bf7a;
border-color: #10bf7a;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label {
position: relative;
display: inline-block;
padding-left: 28px;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before,
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
position: absolute;
content: "";
display: inline-block;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before {
height: 16px;
width: 16px;
border: 1px solid #e3e3e3;
background: #ffffff;
left: 0px;
top: 3px;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
height: 4px;
width: 8px;
border-left: 2px solid #4d4d4d;
border-bottom: 2px solid #4d4d4d;
-webkit-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
transform: rotate(-45deg);
left: 4px;
top: 8px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert {
background: #f9fafb;
border: 1px solid #e3e3e3;
border-radius: 5px;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
list-style: none;
margin: 25px auto;
padding: 12px;
text-align: center;
width: 100%;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert:empty {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert-success {
background: #d3fbeb;
border-color: #10bf7a;
color: #0c905c;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert-error {
background: #fde8e2;
border-color: #f2643b;
color: #ea4110;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
height: 0px;
width: 0px;
margin: 0 auto;
position: absolute;
top: 0;
left: 0;
right: 0;
width: 0px;
overflow: hidden;
text-align: center;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner > div {
margin: auto;
width: 12px;
height: 12px;
background-color: #fff;
opacity: 0.3;
border-radius: 100%;
display: inline-block;
-webkit-animation: formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6-
1.4s infinite ease-in-out both;
animation: formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6- 1.4s
infinite ease-in-out both;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner > div:nth-child(1) {
-webkit-animation-delay: -0.32s;
animation-delay: -0.32s;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner > div:nth-child(2) {
-webkit-animation-delay: -0.16s;
animation-delay: -0.16s;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-submit[data-active]
.formkit-spinner {
opacity: 1;
height: 100%;
width: 50px;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-submit[data-active]
.formkit-spinner
~ span {
opacity: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit-container {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
width: 100%;
z-index: 5;
margin: 10px 0;
position: relative;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit-container[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-powered-by-convertkit {
-webkit-align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
background-color: #ffffff;
border: 1px solid #dce1e5;
border-radius: 4px;
color: #373f45;
cursor: pointer;
display: block;
height: 36px;
margin: 0 auto;
opacity: 0.95;
padding: 0;
-webkit-text-decoration: none;
text-decoration: none;
text-indent: 100%;
-webkit-transition: ease-in-out all 200ms;
transition: ease-in-out all 200ms;
white-space: nowrap;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
width: 190px;
background-repeat: no-repeat;
background-position: center;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='162' height='20' viewBox='0 0 162 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M83.0561 15.2457C86.675 15.2457 89.4722 12.5154 89.4722 9.14749C89.4722 5.99211 86.8443 4.06563 85.1038 4.06563C82.6801 4.06563 80.7373 5.76407 80.4605 8.28551C80.4092 8.75244 80.0387 9.14403 79.5686 9.14069C78.7871 9.13509 77.6507 9.12841 76.9314 9.13092C76.6217 9.13199 76.3658 8.88106 76.381 8.57196C76.4895 6.38513 77.2218 4.3404 78.618 2.76974C80.1695 1.02445 82.4289 0 85.1038 0C89.5979 0 93.8406 4.07791 93.8406 9.14749C93.8406 14.7608 89.1832 19.3113 83.1517 19.3113C78.8502 19.3113 74.5179 16.5041 73.0053 12.5795C72.9999 12.565 72.9986 12.5492 73.0015 12.534C73.0218 12.4179 73.0617 12.3118 73.1011 12.2074C73.1583 12.0555 73.2143 11.907 73.2062 11.7359L73.18 11.1892C73.174 11.0569 73.2075 10.9258 73.2764 10.8127C73.3452 10.6995 73.4463 10.6094 73.5666 10.554L73.7852 10.4523C73.9077 10.3957 74.0148 10.3105 74.0976 10.204C74.1803 10.0974 74.2363 9.97252 74.2608 9.83983C74.3341 9.43894 74.6865 9.14749 75.0979 9.14749C75.7404 9.14749 76.299 9.57412 76.5088 10.1806C77.5188 13.1 79.1245 15.2457 83.0561 15.2457Z' fill='%23373F45'/%3E%3Cpath d='M155.758 6.91365C155.028 6.91365 154.804 6.47916 154.804 5.98857C154.804 5.46997 154.986 5.06348 155.758 5.06348C156.53 5.06348 156.712 5.46997 156.712 5.98857C156.712 6.47905 156.516 6.91365 155.758 6.91365ZM142.441 12.9304V9.32833L141.415 9.32323V8.90392C141.415 8.44719 141.786 8.07758 142.244 8.07986L142.441 8.08095V6.55306L144.082 6.09057V8.08073H145.569V8.50416C145.569 8.61242 145.548 8.71961 145.506 8.81961C145.465 8.91961 145.404 9.01047 145.328 9.08699C145.251 9.16351 145.16 9.2242 145.06 9.26559C144.96 9.30698 144.853 9.32826 144.745 9.32822H144.082V12.7201C144.082 13.2423 144.378 13.4256 144.76 13.4887C145.209 13.5629 145.583 13.888 145.583 14.343V14.9626C144.029 14.9626 142.441 14.8942 142.441 12.9304Z' fill='%23373F45'/%3E%3Cpath d='M110.058 7.92554C108.417 7.88344 106.396 8.92062 106.396 11.5137C106.396 14.0646 108.417 15.0738 110.058 15.0318C111.742 15.0738 113.748 14.0646 113.748 11.5137C113.748 8.92062 111.742 7.88344 110.058 7.92554ZM110.07 13.7586C108.878 13.7586 108.032 12.8905 108.032 11.461C108.032 10.1013 108.878 9.20569 110.071 9.20569C111.263 9.20569 112.101 10.0995 112.101 11.459C112.101 12.8887 111.263 13.7586 110.07 13.7586Z' fill='%23373F45'/%3E%3Cpath d='M118.06 7.94098C119.491 7.94098 120.978 8.33337 120.978 11.1366V14.893H120.063C119.608 14.893 119.238 14.524 119.238 14.0689V10.9965C119.238 9.66506 118.747 9.16047 117.891 9.16047C117.414 9.16047 116.797 9.52486 116.502 9.81915V14.069C116.502 14.1773 116.481 14.2845 116.44 14.3845C116.398 14.4845 116.337 14.5753 116.261 14.6519C116.184 14.7284 116.093 14.7891 115.993 14.8305C115.893 14.8719 115.786 14.8931 115.678 14.8931H114.847V8.10918H115.773C115.932 8.10914 116.087 8.16315 116.212 8.26242C116.337 8.36168 116.424 8.50033 116.46 8.65577C116.881 8.19328 117.428 7.94098 118.06 7.94098ZM122.854 8.09713C123.024 8.09708 123.19 8.1496 123.329 8.2475C123.468 8.34541 123.574 8.48391 123.631 8.64405L125.133 12.8486L126.635 8.64415C126.692 8.48402 126.798 8.34551 126.937 8.2476C127.076 8.1497 127.242 8.09718 127.412 8.09724H128.598L126.152 14.3567C126.091 14.5112 125.986 14.6439 125.849 14.7374C125.711 14.831 125.549 14.881 125.383 14.8809H124.333L121.668 8.09713H122.854Z' fill='%23373F45'/%3E%3Cpath d='M135.085 14.5514C134.566 14.7616 133.513 15.0416 132.418 15.0416C130.496 15.0416 129.024 13.9345 129.024 11.4396C129.024 9.19701 130.451 7.99792 132.191 7.99792C134.338 7.99792 135.254 9.4378 135.158 11.3979C135.139 11.8029 134.786 12.0983 134.38 12.0983H130.679C130.763 13.1916 131.562 13.7662 132.615 13.7662C133.028 13.7662 133.462 13.7452 133.983 13.6481C134.535 13.545 135.085 13.9375 135.085 14.4985V14.5514ZM133.673 10.949C133.785 9.87621 133.061 9.28752 132.191 9.28752C131.321 9.28752 130.734 9.93979 130.679 10.9489L133.673 10.949Z' fill='%23373F45'/%3E%3Cpath d='M137.345 8.11122C137.497 8.11118 137.645 8.16229 137.765 8.25635C137.884 8.35041 137.969 8.48197 138.005 8.62993C138.566 8.20932 139.268 7.94303 139.759 7.94303C139.801 7.94303 140.068 7.94303 140.489 7.99913V8.7265C140.489 9.11748 140.15 9.4147 139.759 9.4147C139.31 9.4147 138.651 9.5829 138.131 9.8773V14.8951H136.462V8.11112L137.345 8.11122ZM156.6 14.0508V8.09104H155.769C155.314 8.09104 154.944 8.45999 154.944 8.9151V14.8748H155.775C156.23 14.8748 156.6 14.5058 156.6 14.0508ZM158.857 12.9447V9.34254H157.749V8.91912C157.749 8.46401 158.118 8.09506 158.574 8.09506H158.857V6.56739L160.499 6.10479V8.09506H161.986V8.51848C161.986 8.97359 161.617 9.34254 161.161 9.34254H160.499V12.7345C160.499 13.2566 160.795 13.44 161.177 13.503C161.626 13.5774 162 13.9024 162 14.3574V14.977C160.446 14.977 158.857 14.9086 158.857 12.9447ZM98.1929 10.1124C98.2033 6.94046 100.598 5.16809 102.895 5.16809C104.171 5.16809 105.342 5.44285 106.304 6.12953L105.914 6.6631C105.654 7.02011 105.16 7.16194 104.749 6.99949C104.169 6.7702 103.622 6.7218 103.215 6.7218C101.335 6.7218 99.9169 7.92849 99.9068 10.1123C99.9169 12.2959 101.335 13.5201 103.215 13.5201C103.622 13.5201 104.169 13.4717 104.749 13.2424C105.16 13.0799 105.654 13.2046 105.914 13.5615L106.304 14.0952C105.342 14.7819 104.171 15.0566 102.895 15.0566C100.598 15.0566 98.2033 13.2842 98.1929 10.1124ZM147.619 5.21768C148.074 5.21768 148.444 5.58663 148.444 6.04174V9.81968L151.82 5.58131C151.897 5.47733 151.997 5.39282 152.112 5.3346C152.227 5.27638 152.355 5.24607 152.484 5.24611H153.984L150.166 10.0615L153.984 14.8749H152.484C152.355 14.8749 152.227 14.8446 152.112 14.7864C151.997 14.7281 151.897 14.6436 151.82 14.5397L148.444 10.3025V14.0508C148.444 14.5059 148.074 14.8749 147.619 14.8749H146.746V5.21768H147.619Z' fill='%23373F45'/%3E%3Cpath d='M0.773438 6.5752H2.68066C3.56543 6.5752 4.2041 6.7041 4.59668 6.96191C4.99219 7.21973 5.18994 7.62695 5.18994 8.18359C5.18994 8.55859 5.09326 8.87061 4.8999 9.11963C4.70654 9.36865 4.42822 9.52539 4.06494 9.58984V9.63379C4.51611 9.71875 4.84717 9.88721 5.05811 10.1392C5.27197 10.3882 5.37891 10.7266 5.37891 11.1543C5.37891 11.7314 5.17676 12.1841 4.77246 12.5122C4.37109 12.8374 3.81152 13 3.09375 13H0.773438V6.5752ZM1.82373 9.22949H2.83447C3.27393 9.22949 3.59473 9.16064 3.79688 9.02295C3.99902 8.88232 4.1001 8.64502 4.1001 8.31104C4.1001 8.00928 3.99023 7.79102 3.77051 7.65625C3.55371 7.52148 3.20801 7.4541 2.7334 7.4541H1.82373V9.22949ZM1.82373 10.082V12.1167H2.93994C3.37939 12.1167 3.71045 12.0332 3.93311 11.8662C4.15869 11.6963 4.27148 11.4297 4.27148 11.0664C4.27148 10.7324 4.15723 10.4849 3.92871 10.3237C3.7002 10.1626 3.35303 10.082 2.88721 10.082H1.82373Z' fill='%23373F45'/%3E%3Cpath d='M13.011 6.5752V10.7324C13.011 11.207 12.9084 11.623 12.7034 11.9805C12.5012 12.335 12.2068 12.6089 11.8201 12.8022C11.4363 12.9927 10.9763 13.0879 10.4402 13.0879C9.6433 13.0879 9.02368 12.877 8.5813 12.4551C8.13892 12.0332 7.91772 11.4531 7.91772 10.7148V6.5752H8.9724V10.6401C8.9724 11.1704 9.09546 11.5615 9.34155 11.8135C9.58765 12.0654 9.96557 12.1914 10.4753 12.1914C11.4656 12.1914 11.9607 11.6714 11.9607 10.6313V6.5752H13.011Z' fill='%23373F45'/%3E%3Cpath d='M15.9146 13V6.5752H16.9649V13H15.9146Z' fill='%23373F45'/%3E%3Cpath d='M19.9255 13V6.5752H20.9758V12.0991H23.696V13H19.9255Z' fill='%23373F45'/%3E%3Cpath d='M28.2828 13H27.2325V7.47607H25.3428V6.5752H30.1724V7.47607H28.2828V13Z' fill='%23373F45'/%3E%3Cpath d='M41.9472 13H40.8046L39.7148 9.16796C39.6679 9.00097 39.6093 8.76074 39.539 8.44727C39.4687 8.13086 39.4262 7.91113 39.4116 7.78809C39.3823 7.97559 39.3339 8.21875 39.2665 8.51758C39.2021 8.81641 39.1479 9.03905 39.1039 9.18554L38.0405 13H36.8979L36.0673 9.7832L35.2236 6.5752H36.2958L37.2143 10.3193C37.3578 10.9199 37.4604 11.4502 37.5219 11.9102C37.5541 11.6611 37.6025 11.3828 37.6669 11.0752C37.7314 10.7676 37.79 10.5186 37.8427 10.3281L38.8886 6.5752H39.9301L41.0024 10.3457C41.1049 10.6943 41.2133 11.2158 41.3276 11.9102C41.3715 11.4912 41.477 10.958 41.644 10.3105L42.558 6.5752H43.6215L41.9472 13Z' fill='%23373F45'/%3E%3Cpath d='M45.7957 13V6.5752H46.846V13H45.7957Z' fill='%23373F45'/%3E%3Cpath d='M52.0258 13H50.9755V7.47607H49.0859V6.5752H53.9155V7.47607H52.0258V13Z' fill='%23373F45'/%3E%3Cpath d='M61.2312 13H60.1765V10.104H57.2146V13H56.1643V6.5752H57.2146V9.20312H60.1765V6.5752H61.2312V13Z' fill='%23373F45'/%3E%3C/svg%3E");
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-powered-by-convertkit:hover,
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit:focus {
background-color: #ffffff;
-webkit-transform: scale(1.025) perspective(1px);
-ms-transform: scale(1.025) perspective(1px);
transform: scale(1.025) perspective(1px);
opacity: 1;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit[data-variant="dark"],
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit[data-variant="light"] {
background-color: transparent;
border-color: transparent;
width: 166px;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit[data-variant="light"] {
color: #ffffff;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='162' height='20' viewBox='0 0 162 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M83.0561 15.2457C86.675 15.2457 89.4722 12.5154 89.4722 9.14749C89.4722 5.99211 86.8443 4.06563 85.1038 4.06563C82.6801 4.06563 80.7373 5.76407 80.4605 8.28551C80.4092 8.75244 80.0387 9.14403 79.5686 9.14069C78.7871 9.13509 77.6507 9.12841 76.9314 9.13092C76.6217 9.13199 76.3658 8.88106 76.381 8.57196C76.4895 6.38513 77.2218 4.3404 78.618 2.76974C80.1695 1.02445 82.4289 0 85.1038 0C89.5979 0 93.8406 4.07791 93.8406 9.14749C93.8406 14.7608 89.1832 19.3113 83.1517 19.3113C78.8502 19.3113 74.5179 16.5041 73.0053 12.5795C72.9999 12.565 72.9986 12.5492 73.0015 12.534C73.0218 12.4179 73.0617 12.3118 73.1011 12.2074C73.1583 12.0555 73.2143 11.907 73.2062 11.7359L73.18 11.1892C73.174 11.0569 73.2075 10.9258 73.2764 10.8127C73.3452 10.6995 73.4463 10.6094 73.5666 10.554L73.7852 10.4523C73.9077 10.3957 74.0148 10.3105 74.0976 10.204C74.1803 10.0974 74.2363 9.97252 74.2608 9.83983C74.3341 9.43894 74.6865 9.14749 75.0979 9.14749C75.7404 9.14749 76.299 9.57412 76.5088 10.1806C77.5188 13.1 79.1245 15.2457 83.0561 15.2457Z' fill='white'/%3E%3Cpath d='M155.758 6.91365C155.028 6.91365 154.804 6.47916 154.804 5.98857C154.804 5.46997 154.986 5.06348 155.758 5.06348C156.53 5.06348 156.712 5.46997 156.712 5.98857C156.712 6.47905 156.516 6.91365 155.758 6.91365ZM142.441 12.9304V9.32833L141.415 9.32323V8.90392C141.415 8.44719 141.786 8.07758 142.244 8.07986L142.441 8.08095V6.55306L144.082 6.09057V8.08073H145.569V8.50416C145.569 8.61242 145.548 8.71961 145.506 8.81961C145.465 8.91961 145.404 9.01047 145.328 9.08699C145.251 9.16351 145.16 9.2242 145.06 9.26559C144.96 9.30698 144.853 9.32826 144.745 9.32822H144.082V12.7201C144.082 13.2423 144.378 13.4256 144.76 13.4887C145.209 13.5629 145.583 13.888 145.583 14.343V14.9626C144.029 14.9626 142.441 14.8942 142.441 12.9304Z' fill='white'/%3E%3Cpath d='M110.058 7.92554C108.417 7.88344 106.396 8.92062 106.396 11.5137C106.396 14.0646 108.417 15.0738 110.058 15.0318C111.742 15.0738 113.748 14.0646 113.748 11.5137C113.748 8.92062 111.742 7.88344 110.058 7.92554ZM110.07 13.7586C108.878 13.7586 108.032 12.8905 108.032 11.461C108.032 10.1013 108.878 9.20569 110.071 9.20569C111.263 9.20569 112.101 10.0995 112.101 11.459C112.101 12.8887 111.263 13.7586 110.07 13.7586Z' fill='white'/%3E%3Cpath d='M118.06 7.94098C119.491 7.94098 120.978 8.33337 120.978 11.1366V14.893H120.063C119.608 14.893 119.238 14.524 119.238 14.0689V10.9965C119.238 9.66506 118.747 9.16047 117.891 9.16047C117.414 9.16047 116.797 9.52486 116.502 9.81915V14.069C116.502 14.1773 116.481 14.2845 116.44 14.3845C116.398 14.4845 116.337 14.5753 116.261 14.6519C116.184 14.7284 116.093 14.7891 115.993 14.8305C115.893 14.8719 115.786 14.8931 115.678 14.8931H114.847V8.10918H115.773C115.932 8.10914 116.087 8.16315 116.212 8.26242C116.337 8.36168 116.424 8.50033 116.46 8.65577C116.881 8.19328 117.428 7.94098 118.06 7.94098ZM122.854 8.09713C123.024 8.09708 123.19 8.1496 123.329 8.2475C123.468 8.34541 123.574 8.48391 123.631 8.64405L125.133 12.8486L126.635 8.64415C126.692 8.48402 126.798 8.34551 126.937 8.2476C127.076 8.1497 127.242 8.09718 127.412 8.09724H128.598L126.152 14.3567C126.091 14.5112 125.986 14.6439 125.849 14.7374C125.711 14.831 125.549 14.881 125.383 14.8809H124.333L121.668 8.09713H122.854Z' fill='white'/%3E%3Cpath d='M135.085 14.5514C134.566 14.7616 133.513 15.0416 132.418 15.0416C130.496 15.0416 129.024 13.9345 129.024 11.4396C129.024 9.19701 130.451 7.99792 132.191 7.99792C134.338 7.99792 135.254 9.4378 135.158 11.3979C135.139 11.8029 134.786 12.0983 134.38 12.0983H130.679C130.763 13.1916 131.562 13.7662 132.615 13.7662C133.028 13.7662 133.462 13.7452 133.983 13.6481C134.535 13.545 135.085 13.9375 135.085 14.4985V14.5514ZM133.673 10.949C133.785 9.87621 133.061 9.28752 132.191 9.28752C131.321 9.28752 130.734 9.93979 130.679 10.9489L133.673 10.949Z' fill='white'/%3E%3Cpath d='M137.345 8.11122C137.497 8.11118 137.645 8.16229 137.765 8.25635C137.884 8.35041 137.969 8.48197 138.005 8.62993C138.566 8.20932 139.268 7.94303 139.759 7.94303C139.801 7.94303 140.068 7.94303 140.489 7.99913V8.7265C140.489 9.11748 140.15 9.4147 139.759 9.4147C139.31 9.4147 138.651 9.5829 138.131 9.8773V14.8951H136.462V8.11112L137.345 8.11122ZM156.6 14.0508V8.09104H155.769C155.314 8.09104 154.944 8.45999 154.944 8.9151V14.8748H155.775C156.23 14.8748 156.6 14.5058 156.6 14.0508ZM158.857 12.9447V9.34254H157.749V8.91912C157.749 8.46401 158.118 8.09506 158.574 8.09506H158.857V6.56739L160.499 6.10479V8.09506H161.986V8.51848C161.986 8.97359 161.617 9.34254 161.161 9.34254H160.499V12.7345C160.499 13.2566 160.795 13.44 161.177 13.503C161.626 13.5774 162 13.9024 162 14.3574V14.977C160.446 14.977 158.857 14.9086 158.857 12.9447ZM98.1929 10.1124C98.2033 6.94046 100.598 5.16809 102.895 5.16809C104.171 5.16809 105.342 5.44285 106.304 6.12953L105.914 6.6631C105.654 7.02011 105.16 7.16194 104.749 6.99949C104.169 6.7702 103.622 6.7218 103.215 6.7218C101.335 6.7218 99.9169 7.92849 99.9068 10.1123C99.9169 12.2959 101.335 13.5201 103.215 13.5201C103.622 13.5201 104.169 13.4717 104.749 13.2424C105.16 13.0799 105.654 13.2046 105.914 13.5615L106.304 14.0952C105.342 14.7819 104.171 15.0566 102.895 15.0566C100.598 15.0566 98.2033 13.2842 98.1929 10.1124ZM147.619 5.21768C148.074 5.21768 148.444 5.58663 148.444 6.04174V9.81968L151.82 5.58131C151.897 5.47733 151.997 5.39282 152.112 5.3346C152.227 5.27638 152.355 5.24607 152.484 5.24611H153.984L150.166 10.0615L153.984 14.8749H152.484C152.355 14.8749 152.227 14.8446 152.112 14.7864C151.997 14.7281 151.897 14.6436 151.82 14.5397L148.444 10.3025V14.0508C148.444 14.5059 148.074 14.8749 147.619 14.8749H146.746V5.21768H147.619Z' fill='white'/%3E%3Cpath d='M0.773438 6.5752H2.68066C3.56543 6.5752 4.2041 6.7041 4.59668 6.96191C4.99219 7.21973 5.18994 7.62695 5.18994 8.18359C5.18994 8.55859 5.09326 8.87061 4.8999 9.11963C4.70654 9.36865 4.42822 9.52539 4.06494 9.58984V9.63379C4.51611 9.71875 4.84717 9.88721 5.05811 10.1392C5.27197 10.3882 5.37891 10.7266 5.37891 11.1543C5.37891 11.7314 5.17676 12.1841 4.77246 12.5122C4.37109 12.8374 3.81152 13 3.09375 13H0.773438V6.5752ZM1.82373 9.22949H2.83447C3.27393 9.22949 3.59473 9.16064 3.79688 9.02295C3.99902 8.88232 4.1001 8.64502 4.1001 8.31104C4.1001 8.00928 3.99023 7.79102 3.77051 7.65625C3.55371 7.52148 3.20801 7.4541 2.7334 7.4541H1.82373V9.22949ZM1.82373 10.082V12.1167H2.93994C3.37939 12.1167 3.71045 12.0332 3.93311 11.8662C4.15869 11.6963 4.27148 11.4297 4.27148 11.0664C4.27148 10.7324 4.15723 10.4849 3.92871 10.3237C3.7002 10.1626 3.35303 10.082 2.88721 10.082H1.82373Z' fill='white'/%3E%3Cpath d='M13.011 6.5752V10.7324C13.011 11.207 12.9084 11.623 12.7034 11.9805C12.5012 12.335 12.2068 12.6089 11.8201 12.8022C11.4363 12.9927 10.9763 13.0879 10.4402 13.0879C9.6433 13.0879 9.02368 12.877 8.5813 12.4551C8.13892 12.0332 7.91772 11.4531 7.91772 10.7148V6.5752H8.9724V10.6401C8.9724 11.1704 9.09546 11.5615 9.34155 11.8135C9.58765 12.0654 9.96557 12.1914 10.4753 12.1914C11.4656 12.1914 11.9607 11.6714 11.9607 10.6313V6.5752H13.011Z' fill='white'/%3E%3Cpath d='M15.9146 13V6.5752H16.9649V13H15.9146Z' fill='white'/%3E%3Cpath d='M19.9255 13V6.5752H20.9758V12.0991H23.696V13H19.9255Z' fill='white'/%3E%3Cpath d='M28.2828 13H27.2325V7.47607H25.3428V6.5752H30.1724V7.47607H28.2828V13Z' fill='white'/%3E%3Cpath d='M41.9472 13H40.8046L39.7148 9.16796C39.6679 9.00097 39.6093 8.76074 39.539 8.44727C39.4687 8.13086 39.4262 7.91113 39.4116 7.78809C39.3823 7.97559 39.3339 8.21875 39.2665 8.51758C39.2021 8.81641 39.1479 9.03905 39.1039 9.18554L38.0405 13H36.8979L36.0673 9.7832L35.2236 6.5752H36.2958L37.2143 10.3193C37.3578 10.9199 37.4604 11.4502 37.5219 11.9102C37.5541 11.6611 37.6025 11.3828 37.6669 11.0752C37.7314 10.7676 37.79 10.5186 37.8427 10.3281L38.8886 6.5752H39.9301L41.0024 10.3457C41.1049 10.6943 41.2133 11.2158 41.3276 11.9102C41.3715 11.4912 41.477 10.958 41.644 10.3105L42.558 6.5752H43.6215L41.9472 13Z' fill='white'/%3E%3Cpath d='M45.7957 13V6.5752H46.846V13H45.7957Z' fill='white'/%3E%3Cpath d='M52.0258 13H50.9755V7.47607H49.0859V6.5752H53.9155V7.47607H52.0258V13Z' fill='white'/%3E%3Cpath d='M61.2312 13H60.1765V10.104H57.2146V13H56.1643V6.5752H57.2146V9.20312H60.1765V6.5752H61.2312V13Z' fill='white'/%3E%3C/svg%3E");
}
@-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
@keyframes formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
.formkit-form[data-uid="d2e88d98d6"] blockquote {
padding: 10px 20px;
margin: 0 0 20px;
border-left: 5px solid #e1e1e1;
}
.formkit-form[data-uid="d2e88d98d6"] {
border: 1px solid #e3e3e3;
max-width: 700px;
position: relative;
overflow: hidden;
margin: 0px 0px 15px 0;
padding: 5px 15px 5px 15px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-background {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: cover;
background-position: center;
opacity: 0.3;
}
.formkit-form[data-uid="d2e88d98d6"] [data-style="minimal"] {
width: 100%;
position: relative;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-header {
margin: 0 0 0 0;
text-align: center;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-subheader {
margin: 18px 0;
text-align: center;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-guarantee {
font-size: 13px;
margin: 0;
text-align: center;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-guarantee > p {
margin: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit-container {
margin-bottom: 0;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-fields {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
margin: 0 auto 0 auto;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-field {
min-width: 220px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-field,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit {
margin: 0 0 15px 0;
-webkit-flex: 1 0 100%;
-ms-flex: 1 0 100%;
flex: 1 0 100%;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"] {
margin-left: -5px;
margin-right: -5px;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-field,
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-submit {
margin: 0 5px 15px 5px;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-field {
-webkit-flex: 100 1 auto;
-ms-flex: 100 1 auto;
flex: 100 1 auto;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-submit {
-webkit-flex: 1 1 auto;
-ms-flex: 1 1 auto;
flex: 1 1 auto;
}
</style>
</form>
</div>
<p>Nadszedł ten piękny dzień, że już prawie wszystkie ważne decyzje za nami. Mamy wybraną bazę danych, hosting i wiemy jak będziemy obsługiwać konta użytkowników.</p>
<p>No dobrze, ale czy czegoś brakuje? Jedną z częstych odpowiedzi, przy tego typu aplikacji, jest Content Delivery Network (CDN), który umożliwia nam przyspieszenie i odciążenie naszych serwerów. Dodatkowo warto zwrócić uwagę na obsługę HTTP2. Od kilku ładnych lat jest to już standard, a jednak bardzo często twórcy stron internetowych o nim zapominają.</p>
<p>Ale dlaczego się nad tym pochylamy? Chodzi o szybkość działania z perspektywy użytkownika. Kilkanaście lat temu (bodajże w 2007) Steve Sounders stworzył listę 14 zasad, którą powinna spełniać strona internetowa, żeby była szybka:</p>
<ul>
<li>Rule 1 - Make Fewer HTTP Requests</li>
<li>Rule 2 - Use a Content Delivery Network</li>
<li>Rule 3 - Add an Expires Header</li>
<li>Rule 4 - Gzip Components</li>
<li>Rule 5 - Put Stylesheets at the Top</li>
<li>Rule 6 - Put Scripts at the Bottom</li>
<li>Rule 7 - Avoid CSS Expressions</li>
<li>Rule 8 - Make JavaScript and CSS External</li>
<li>Rule 9 - Reduce DNS Lookups</li>
<li>Rule 10 - Minify JavaScript</li>
<li>Rule 11 - Avoid Redirects</li>
<li>Rule 12 - Remove Duplicate Scripts</li>
<li>Rule 13 - Configure ETags</li>
<li>Rule 14 - Make AJAX Cacheable</li>
</ul>
<p>Każdy kto optymalizował swoją stronę internetową wcześniej czy później na jakąś formę tej listy trafił, albo używał narzędzia, które na niej bazuje.</p>
<p>Jeżeli masz ochotę to możesz posłuchać 15 minut mojej prezentacji z 2017 roku jak ma się HTTP/2 do powyższej listy. Link prowadzi do odpowiedniego fragmentu: <a href="https://youtu.be/S6y81TMr_lA?t=678">https://youtu.be/S6y81TMr_lA?t=678</a>. Jeżeli ciekawi Cię historia protokołu HTTP to zapraszam od początku <a href="https://youtu.be/S6y81TMr_lA">https://youtu.be/S6y81TMr_lA</a>, bo całość trwa 29 minut.</p>
<p>Jak nie masz ochoty oglądać 😅 to podpowiem, że niektóre elementy lekko się przedawniły, ale większość została 😁</p>
<p>To jednak nie wszystko. Musimy jeszcze w dzisiejszych czasach zapanować nad certyfikatem SSL, zoptymalizować tak zwany “First Contentful Paint” (jeżeli pojęcie nie jest Ci znane to polecam <a href="https://web.dev/first-contentful-paint/">https://web.dev/first-contentful-paint/</a>).</p>
<p>Dużo roboty prawda? Prawda! Szacując z grubego palca to dodatkowe 3 miesiące pracy 😜A jak bym powiedział, że istnieje narzędzie które może to zrobić za nas? I jeszcze dodałbym, że to co potrzebujemy da się ogarnąć za $0. Serio za 🆓, nie zgubiłem nigdzie po drodze 1 z przodu.</p>
<p>Narzędzie o którym mowa to Cloudflare. Tutaj pewnie nastąpi rozczarowanie, bo to nie jest usługa Azure. No ale jak to się mówi nie można mieć wszystkiego 😂</p>
<p>Cloudflare ogarnie nam::</p>
<ul>
<li>HTTP/2</li>
<li>GZip</li>
<li>DNS</li>
<li>Certyfikat (domyślnie Let’s Encrypt, ale można wgrać własny)</li>
<li>Cache na różne sposóby</li>
<li>CDN bo proxy jest na całym świecie</li>
</ul>
<p>A jak to się ma do powyższej listy Steva Sounders? Naprawdę nieźle:</p>
<ul>
<li>Rule 1 - Make Fewer HTTP Requests - ✅- Wprowadza i wymusza HTTP2, więc ilość request ma mniejsze - znaczenie</li>
<li>Rule 2 - Use a Content Delivery Network - ✅- Tym właśnie jest Cloudflare</li>
<li>Rule 3 - Add an Expires Header - ✅- Jak najbardziej tak, dzięki temu zapewniony jest cache</li>
<li>Rule 4 - Gzip Components - ✅- Oczywiście, że tak :)</li>
<li>Rule 5 - Put Stylesheets at the Top - ⚠️- To zależy już od nas jako twórców strony, acz HTTP2 + nowoczesne przeglądarki potrafią nas częściowo uratować 😜</li>
<li>Rule 6 - Put Scripts at the Bottom - ⚠️- Jak wyżej</li>
<li>Rule 7 - Avoid CSS Expressions - ❌- Niestety nie</li>
<li>Rule 8 - Make JavaScript and CSS External - ❌- Też nie</li>
<li>Rule 9 - Reduce DNS Lookups - ✅- Jak najbardziej tak, no chyba że się sami ręcznie postaramy i dodamy - 3 dodatkowe redirect 😜</li>
<li>Rule 10 - Minify JavaScript - ✅- Cloudflare jak najbardziej obsługuje ten punkt</li>
<li>Rule 11 - Avoid Redirects - ✅/⚠️- To zależy, bo Cloudflare zapamiętuje część za nas, ale można się postarać …</li>
<li>Rule 12 - Remove Duplicate Scripts - ✅/⚠️- Nie wszystko</li>
<li>Rule 13 - Configure ETags - ✅- Tak bo zależy od tego poprawny cache.</li>
<li>Rule 14 - Make AJAX Cacheable - ❌- Niestety nie, bo linki zależą od nas, acz jak mówiłem w prezentacji w dzisiejszych czasach nie ma to aż takiego znaczenia.</li>
</ul>
<p>Czyli między 7 a 9 na 14 punktów załatwia nam zewnętrzna usługa. Ładny wynik, prawda? A do tego mamy jeszcze dodatkowe bonusy jak na przykład certyfikat SSL.</p>
<p>Rezultat jest taki, że strona poznajAzure.pl, która jak wiecie jest w 100% statyczna i stoi na Github Page ładuje się 16% szybciej. W płatnym planie dostajemy jeszcze więcej fajnych opcji, ale już te w darmowym robią mega wrażenie.</p>
<p>To by było na tyle na dziś. A co z pracą domową? Jeżeli masz ochotę to proponuję zastanowić się jak wystawić Azure Static Web page z własną domeną i certyfikatem SSL nie używając do tego Cloudflare. Podpowiedzi można szukać w tym wątku: <a href="https://threadreaderapp.com/thread/1277618337753845760.html">https://threadreaderapp.com/thread/1277618337753845760.html</a></p>
<p>Jeżeli niechcesz czekać to następne zapraszam do zapisania się poniżej😁</p>
<script src="https://f.convertkit.com/ckjs/ck.5.js"></script>
<form action="https://app.convertkit.com/forms/1684572/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="1684572" data-uid="cea5d3079d" data-format="inline" data-version="5" data-options="{"settings":{"after_subscribe":{"action":"redirect","success_message":"Success! Now check your email to confirm your subscription.","redirect_url":"https://poznajAzure.pl/confirmSubscription.html"},"analytics":{"google":null,"facebook":null,"segment":null,"pinterest":null},"modal":{"trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"powered_by":{"show":true,"url":"https://convertkit.com?utm_source=dynamic&utm_medium=referral&utm_campaign=poweredby&utm_content=form"},"recaptcha":{"enabled":false},"return_visitor":{"action":"show","custom_content":""},"slide_in":{"display_in":"bottom_right","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"sticky_bar":{"display_in":"top","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15}},"version":"5"}" min-width="400 500 600 700 800" style="background-color: rgb(255, 255, 255); border-radius: 6px">
<div data-style="full">
<div data-element="column" class="formkit-column" style="background-color: rgb(249, 250, 251)">
<div class="formkit-background" style="opacity: 0.3"></div>
<div class="formkit-header" data-element="header" style="color: rgb(77, 77, 77); font-size: 20px; font-weight: 700">
<h1>Jeżeli interesuje Cię</h1>
</div>
<div class="formkit-subheader" data-element="subheader" style="color: rgb(104, 104, 104); font-size: 15px">
<span>- budowa i hostowanie aplikacji w Azure</span>
<p style="margin-bottom: 0px;">- HA usług</p>
<p style="margin-bottom: 0px;">- wydajność i obsługa baz danych, by było dobrze i tanio</p>
<p style="margin-bottom: 0px;">- diagnostyka i logowanie</p>
<p style="margin-bottom: 0px;">- szybkie wdrażanie i testowanie</p>
<p style="margin-bottom: 0px;"><strong>to trafiłeś idealnie, bo nas też!</strong></p>
</div>
</div>
<div data-element="column" class="formkit-column">
<ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul>
<div data-element="fields" class="seva-fields formkit-fields">
<div class="formkit-field">
<input class="formkit-input" name="email_address" aria-label="Twój email" placeholder="Twój email" required="" type="email" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<div class="formkit-field">
<input class="formkit-input" aria-label="Imię lub nick" name="fields[first_name]" placeholder="Imię lub nick" type="text" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<button data-element="submit" class="formkit-submit formkit-submit" style="
color: rgb(255, 255, 255);
background-color: rgb(22, 119, 190);
border-radius: 24px;
font-weight: 700;
">
<div class="formkit-spinner">
<div></div>
<div></div>
<div></div>
</div>
<span>Subscribe</span>
</button>
</div>
<div class="formkit-guarantee" data-element="guarantee" style="color: rgb(77, 77, 77); font-size: 13px; font-weight: 400">
<p>
<span style="color: rgb(59, 59, 59)">Polityka prywatności - </span><a href="https://poznajazure.pl/policy.html" target="_blank" rel="noopener noreferrer">więcej</a>
</p>
</div>
</div>
</div>
<style>
.formkit-form[data-uid="cea5d3079d"] * {
box-sizing: border-box;
}
.formkit-form[data-uid="cea5d3079d"] {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.formkit-form[data-uid="cea5d3079d"] legend {
border: none;
font-size: inherit;
margin-bottom: 10px;
padding: 0;
position: relative;
display: table;
}
.formkit-form[data-uid="cea5d3079d"] fieldset {
border: 0;
padding: 0.01em 0 0 0;
margin: 0;
min-width: 0;
}
.formkit-form[data-uid="cea5d3079d"]
body:not(:-moz-handler-blocked)
fieldset {
display: table-cell;
}
.formkit-form[data-uid="cea5d3079d"] h1,
.formkit-form[data-uid="cea5d3079d"] h2,
.formkit-form[data-uid="cea5d3079d"] h3,
.formkit-form[data-uid="cea5d3079d"] h4,
.formkit-form[data-uid="cea5d3079d"] h5,
.formkit-form[data-uid="cea5d3079d"] h6 {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="cea5d3079d"] p {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="cea5d3079d"] ol:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] ul:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] blockquote:not([template-default]) {
text-align: left;
}
.formkit-form[data-uid="cea5d3079d"] p:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] hr:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] blockquote:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] ol:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] ul:not([template-default]) {
color: inherit;
font-style: initial;
}
.formkit-form[data-uid="cea5d3079d"] .ordered-list,
.formkit-form[data-uid="cea5d3079d"] .unordered-list {
list-style-position: outside !important;
padding-left: 1em;
}
.formkit-form[data-uid="cea5d3079d"] .list-item {
padding-left: 0;
}
.formkit-form[data-uid="cea5d3079d"][data-format="modal"] {
display: none;
}
.formkit-form[data-uid="cea5d3079d"][data-format="slide in"] {
display: none;
}
.formkit-form[data-uid="cea5d3079d"][data-format="sticky bar"] {
display: none;
}
.formkit-sticky-bar
.formkit-form[data-uid="cea5d3079d"][data-format="sticky bar"] {
display: block;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input,
.formkit-form[data-uid="cea5d3079d"] .formkit-select,
.formkit-form[data-uid="cea5d3079d"] .formkit-checkboxes {
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit {
border: 0;
border-radius: 5px;
color: #ffffff;
cursor: pointer;
display: inline-block;
text-align: center;
font-size: 15px;
font-weight: 500;
cursor: pointer;
margin-bottom: 15px;
overflow: hidden;
padding: 0;
position: relative;
vertical-align: middle;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button:hover,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:hover,
.formkit-form[data-uid="cea5d3079d"] .formkit-button:focus,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:focus {
outline: none;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button:hover > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:hover > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-button:focus > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:focus > span {
background-color: rgba(0, 0, 0, 0.1);
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit > span {
display: block;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
padding: 12px 24px;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input {
background: #ffffff;
font-size: 15px;
padding: 12px;
border: 1px solid #e3e3e3;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
line-height: 1.4;
margin: 0;
-webkit-transition: border-color ease-out 300ms;
transition: border-color ease-out 300ms;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input:focus {
outline: none;
border-color: #1677be;
-webkit-transition: border-color ease 300ms;
transition: border-color ease 300ms;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-input::-webkit-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input::-moz-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input:-ms-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input::placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"] {
position: relative;
display: inline-block;
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"]::before {
content: "";
top: calc(50% - 2.5px);
right: 10px;
position: absolute;
pointer-events: none;
border-color: #4f4f4f transparent transparent transparent;
border-style: solid;
border-width: 6px 6px 0 6px;
height: 0;
width: 0;
z-index: 999;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"] select {
height: auto;
width: 100%;
cursor: pointer;
color: #333333;
line-height: 1.4;
margin-bottom: 0;
padding: 0 6px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
font-size: 15px;
padding: 12px;
padding-right: 25px;
border: 1px solid #e3e3e3;
background: #ffffff;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"] select:focus {
outline: none;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="checkboxes"] {
text-align: left;
margin: 0;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"] {
margin-bottom: 10px;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
* {
cursor: pointer;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]:last-of-type {
margin-bottom: 0;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"] {
display: none;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]
+ label::after {
content: none;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::after {
border-color: #ffffff;
content: "";
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::before {
background: #10bf7a;
border-color: #10bf7a;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label {
position: relative;
display: inline-block;
padding-left: 28px;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before,
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
position: absolute;
content: "";
display: inline-block;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before {
height: 16px;
width: 16px;
border: 1px solid #e3e3e3;
background: #ffffff;
left: 0px;
top: 3px;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
height: 4px;
width: 8px;
border-left: 2px solid #4d4d4d;
border-bottom: 2px solid #4d4d4d;
-webkit-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
transform: rotate(-45deg);
left: 4px;
top: 8px;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert {
background: #f9fafb;
border: 1px solid #e3e3e3;
border-radius: 5px;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
list-style: none;
margin: 25px auto;
padding: 12px;
text-align: center;
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert:empty {
display: none;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert-success {
background: #d3fbeb;
border-color: #10bf7a;
color: #0c905c;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert-error {
background: #fde8e2;
border-color: #f2643b;
color: #ea4110;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
height: 0px;
width: 0px;
margin: 0 auto;
position: absolute;
top: 0;
left: 0;
right: 0;
width: 0px;
overflow: hidden;
text-align: center;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner > div {
margin: auto;
width: 12px;
height: 12px;
background-color: #fff;
opacity: 0.3;
border-radius: 100%;
display: inline-block;
-webkit-animation: formkit-bouncedelay-formkit-form-data-uid-cea5d3079d-
1.4s infinite ease-in-out both;
animation: formkit-bouncedelay-formkit-form-data-uid-cea5d3079d- 1.4s
infinite ease-in-out both;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner > div:nth-child(1) {
-webkit-animation-delay: -0.32s;
animation-delay: -0.32s;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner > div:nth-child(2) {
-webkit-animation-delay: -0.16s;
animation-delay: -0.16s;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-submit[data-active]
.formkit-spinner {
opacity: 1;
height: 100%;
width: 50px;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-submit[data-active]
.formkit-spinner
~ span {
opacity: 0;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit-container {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
width: 100%;
z-index: 5;
margin: 10px 0;
position: relative;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit-container[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-powered-by-convertkit {
-webkit-align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
background-color: #ffffff;
border: 1px solid #dce1e5;
border-radius: 4px;
color: #373f45;
cursor: pointer;
display: block;
height: 36px;
margin: 0 auto;
opacity: 0.95;
padding: 0;
-webkit-text-decoration: none;
text-decoration: none;
text-indent: 100%;
-webkit-transition: ease-in-out all 200ms;
transition: ease-in-out all 200ms;
white-space: nowrap;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
width: 190px;
background-repeat: no-repeat;
background-position: center;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-powered-by-convertkit:hover,
.formkit-form[data-uid="cea5d3079d"] .formkit-powered-by-convertkit:focus {
background-color: #ffffff;
-webkit-transform: scale(1.025) perspective(1px);
-ms-transform: scale(1.025) perspective(1px);
transform: scale(1.025) perspective(1px);
opacity: 1;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit[data-variant="dark"],
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit[data-variant="light"] {
background-color: transparent;
border-color: transparent;
width: 166px;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit[data-variant="light"] {
color: #ffffff;
}
@-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-cea5d3079d- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
@keyframes formkit-bouncedelay-formkit-form-data-uid-cea5d3079d- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
.formkit-form[data-uid="cea5d3079d"] blockquote {
padding: 10px 20px;
margin: 0 0 20px;
border-left: 5px solid #e1e1e1;
}
.formkit-form[data-uid="cea5d3079d"] {
box-shadow: 0 2px 15px 0 rgba(210, 214, 220, 0.5);
max-width: 700px;
overflow: hidden;
}
.formkit-form[data-uid="cea5d3079d"] [data-style="full"] {
width: 100%;
display: block;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-header {
margin-top: 0;
margin-bottom: 20px;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-subheader {
margin: 15px 0;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-column {
padding: 20px;
position: relative;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-column:nth-child(2) {
border-top: 1px solid #e9ecef;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-background {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: cover;
background-position: center;
opacity: 0.5;
z-index: 1;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-header,
.formkit-form[data-uid="cea5d3079d"] .formkit-subheader,
.formkit-form[data-uid="cea5d3079d"] .formkit-image {
z-index: 2;
position: relative;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-field {
margin: 0 0 15px 0;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit {
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-guarantee {
font-size: 13px;
margin: 0 0 15px 0;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-guarantee > p {
margin: 0;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit-container {
margin-bottom: 0;
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"] [data-style="full"],
.formkit-form[data-uid="cea5d3079d"][min-width~="700"] [data-style="full"],
.formkit-form[data-uid="cea5d3079d"][min-width~="800"] [data-style="full"] {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"] .formkit-submit,
.formkit-form[data-uid="cea5d3079d"][min-width~="700"] .formkit-submit,
.formkit-form[data-uid="cea5d3079d"][min-width~="800"] .formkit-submit {
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"] .formkit-column,
.formkit-form[data-uid="cea5d3079d"][min-width~="700"] .formkit-column,
.formkit-form[data-uid="cea5d3079d"][min-width~="800"] .formkit-column {
padding: 0px;
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"]
.formkit-column:nth-child(2),
.formkit-form[data-uid="cea5d3079d"][min-width~="700"]
.formkit-column:nth-child(2),
.formkit-form[data-uid="cea5d3079d"][min-width~="800"]
.formkit-column:nth-child(2) {
border-top: none;
}
</style>
</form>Poznaj AzureArtykuł jest częścią, większej całości. W serii znajdują się: Część 1 - Liga Mistrzów i konta użytkowników Część 2 - Liga Mistrzów i 7 sposobów na hosting Część 3 - Liga Mistrzów i bazy danych Część 4 - Liga Mistrzów i brakujący element Część 5 - Liga Mistrzów i diagnostyka - TODO Nie chcesz czekać? Zapisz się Polityka prywatności - więcej​Liga Mistrzów i bazy danych2020-09-26T06:33:00+00:002020-09-26T06:33:00+00:00https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-bazy-danych<p>Artykuł jest częścią, większej całości. W serii znajdują się:</p>
<ul>
<li>Część 1 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-konta-uzytkownikow/">Liga Mistrzów i konta użytkowników</a></li>
<li>Część 2 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-7-sposobow-na-hosting/">Liga Mistrzów i 7 sposobów na hosting</a></li>
<li>Część 3 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-bazy-danych/">Liga Mistrzów i bazy danych</a></li>
<li>Część 4 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-brakujacy-element/">Liga Mistrzów i brakujący element</a></li>
<li>Część 5 - Liga Mistrzów i diagnostyka - TODO</li>
</ul>
<div>
<script src="https://f.convertkit.com/ckjs/ck.5.js"></script>
<form action="https://app.convertkit.com/forms/1689392/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="1689392" data-uid="d2e88d98d6" data-format="inline" data-version="5" data-options="{"settings":{"after_subscribe":{"action":"redirect","success_message":"Success! Now check your email to confirm your subscription.","redirect_url":"https://poznajAzure.pl/confirmSubscription.html"},"analytics":{"google":null,"facebook":null,"segment":null,"pinterest":null},"modal":{"trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"powered_by":{"show":true,"url":"https://convertkit.com?utm_source=dynamic&utm_medium=referral&utm_campaign=poweredby&utm_content=form"},"recaptcha":{"enabled":false},"return_visitor":{"action":"show","custom_content":""},"slide_in":{"display_in":"bottom_right","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"sticky_bar":{"display_in":"top","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15}},"version":"5"}" min-width="400 500 600 700 800" style="background-color: rgb(255, 255, 255); border-radius: 6px">
<div class="formkit-background" style="opacity: 0.3"></div>
<div data-style="minimal">
<div class="formkit-header" data-element="header" style="color: rgb(77, 77, 77); font-size: 20px; font-weight: 700">
<h1>Nie chcesz czekać?</h1>
</div>
<ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul>
<div data-element="fields" data-stacked="true" class="seva-fields formkit-fields">
<div class="formkit-field">
<input class="formkit-input" name="email_address" aria-label="Twój email" placeholder="Twój email" required="" type="email" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<div class="formkit-field">
<input class="formkit-input" aria-label="Imię lub nick" name="fields[first_name]" placeholder="Imię lub nick" type="text" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<button data-element="submit" class="formkit-submit formkit-submit" style="
color: rgb(255, 255, 255);
background-color: rgb(22, 119, 190);
border-radius: 24px;
font-weight: 700;
">
<div class="formkit-spinner">
<div></div>
<div></div>
<div></div>
</div>
<span>Zapisz się</span>
</button>
</div>
<div class="formkit-guarantee" data-element="guarantee" style="color: rgb(77, 77, 77); font-size: 13px; font-weight: 400">
<p>
<span style="color: rgb(59, 59, 59)">Polityka prywatności - </span><a href="https://poznajazure.pl/policy.html" target="_blank" rel="noopener noreferrer">więcej</a>​
</p>
</div>
</div>
<style>
.formkit-form[data-uid="d2e88d98d6"] * {
box-sizing: border-box;
}
.formkit-form[data-uid="d2e88d98d6"] {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.formkit-form[data-uid="d2e88d98d6"] legend {
border: none;
font-size: inherit;
margin-bottom: 10px;
padding: 0;
position: relative;
display: table;
}
.formkit-form[data-uid="d2e88d98d6"] fieldset {
border: 0;
padding: 0.01em 0 0 0;
margin: 0;
min-width: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
body:not(:-moz-handler-blocked)
fieldset {
display: table-cell;
}
.formkit-form[data-uid="d2e88d98d6"] h1,
.formkit-form[data-uid="d2e88d98d6"] h2,
.formkit-form[data-uid="d2e88d98d6"] h3,
.formkit-form[data-uid="d2e88d98d6"] h4,
.formkit-form[data-uid="d2e88d98d6"] h5,
.formkit-form[data-uid="d2e88d98d6"] h6 {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="d2e88d98d6"] p {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="d2e88d98d6"] ol:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] ul:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] blockquote:not([template-default]) {
text-align: left;
}
.formkit-form[data-uid="d2e88d98d6"] p:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] hr:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] blockquote:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] ol:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] ul:not([template-default]) {
color: inherit;
font-style: initial;
}
.formkit-form[data-uid="d2e88d98d6"] .ordered-list,
.formkit-form[data-uid="d2e88d98d6"] .unordered-list {
list-style-position: outside !important;
padding-left: 0.5em;
}
.formkit-form[data-uid="d2e88d98d6"] .list-item {
padding-left: 0;
}
.formkit-form[data-uid="d2e88d98d6"][data-format="modal"] {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"][data-format="slide in"] {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"][data-format="sticky bar"] {
display: none;
}
.formkit-sticky-bar
.formkit-form[data-uid="d2e88d98d6"][data-format="sticky bar"] {
display: block;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input,
.formkit-form[data-uid="d2e88d98d6"] .formkit-select,
.formkit-form[data-uid="d2e88d98d6"] .formkit-checkboxes {
width: 100%;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit {
border: 0;
border-radius: 5px;
color: #ffffff;
cursor: pointer;
display: inline-block;
text-align: center;
font-size: 15px;
font-weight: 500;
cursor: pointer;
margin-bottom: 15px;
overflow: hidden;
padding: 0;
position: relative;
vertical-align: middle;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:hover,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:hover,
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:focus,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:focus {
outline: none;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:hover > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:hover > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:focus > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:focus > span {
background-color: rgba(0, 0, 0, 0.1);
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit > span {
display: block;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
padding: 12px 24px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input {
background: #ffffff;
font-size: 15px;
padding: 12px;
border: 1px solid #e3e3e3;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
line-height: 1.4;
margin: 0;
-webkit-transition: border-color ease-out 300ms;
transition: border-color ease-out 300ms;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input:focus {
outline: none;
border-color: #1677be;
-webkit-transition: border-color ease 300ms;
transition: border-color ease 300ms;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-input::-webkit-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input::-moz-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-input:-ms-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input::placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="dropdown"] {
position: relative;
display: inline-block;
width: 100%;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="dropdown"]::before {
content: "";
top: calc(50% - 2.5px);
right: 10px;
position: absolute;
pointer-events: none;
border-color: #4f4f4f transparent transparent transparent;
border-style: solid;
border-width: 6px 6px 0 6px;
height: 0;
width: 0;
z-index: 999;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="dropdown"] select {
height: auto;
width: 100%;
cursor: pointer;
color: #333333;
line-height: 1.4;
margin-bottom: 0;
padding: 0 6px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
font-size: 15px;
padding: 12px;
padding-right: 25px;
border: 1px solid #e3e3e3;
background: #ffffff;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="dropdown"]
select:focus {
outline: none;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="checkboxes"] {
text-align: left;
margin: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"] {
margin-bottom: 10px;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
* {
cursor: pointer;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]:last-of-type {
margin-bottom: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"] {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]
+ label::after {
content: none;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::after {
border-color: #ffffff;
content: "";
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::before {
background: #10bf7a;
border-color: #10bf7a;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label {
position: relative;
display: inline-block;
padding-left: 28px;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before,
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
position: absolute;
content: "";
display: inline-block;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before {
height: 16px;
width: 16px;
border: 1px solid #e3e3e3;
background: #ffffff;
left: 0px;
top: 3px;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
height: 4px;
width: 8px;
border-left: 2px solid #4d4d4d;
border-bottom: 2px solid #4d4d4d;
-webkit-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
transform: rotate(-45deg);
left: 4px;
top: 8px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert {
background: #f9fafb;
border: 1px solid #e3e3e3;
border-radius: 5px;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
list-style: none;
margin: 25px auto;
padding: 12px;
text-align: center;
width: 100%;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert:empty {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert-success {
background: #d3fbeb;
border-color: #10bf7a;
color: #0c905c;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert-error {
background: #fde8e2;
border-color: #f2643b;
color: #ea4110;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
height: 0px;
width: 0px;
margin: 0 auto;
position: absolute;
top: 0;
left: 0;
right: 0;
width: 0px;
overflow: hidden;
text-align: center;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner > div {
margin: auto;
width: 12px;
height: 12px;
background-color: #fff;
opacity: 0.3;
border-radius: 100%;
display: inline-block;
-webkit-animation: formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6-
1.4s infinite ease-in-out both;
animation: formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6- 1.4s
infinite ease-in-out both;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner > div:nth-child(1) {
-webkit-animation-delay: -0.32s;
animation-delay: -0.32s;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner > div:nth-child(2) {
-webkit-animation-delay: -0.16s;
animation-delay: -0.16s;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-submit[data-active]
.formkit-spinner {
opacity: 1;
height: 100%;
width: 50px;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-submit[data-active]
.formkit-spinner
~ span {
opacity: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit-container {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
width: 100%;
z-index: 5;
margin: 10px 0;
position: relative;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit-container[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-powered-by-convertkit {
-webkit-align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
background-color: #ffffff;
border: 1px solid #dce1e5;
border-radius: 4px;
color: #373f45;
cursor: pointer;
display: block;
height: 36px;
margin: 0 auto;
opacity: 0.95;
padding: 0;
-webkit-text-decoration: none;
text-decoration: none;
text-indent: 100%;
-webkit-transition: ease-in-out all 200ms;
transition: ease-in-out all 200ms;
white-space: nowrap;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
width: 190px;
background-repeat: no-repeat;
background-position: center;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='162' height='20' viewBox='0 0 162 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M83.0561 15.2457C86.675 15.2457 89.4722 12.5154 89.4722 9.14749C89.4722 5.99211 86.8443 4.06563 85.1038 4.06563C82.6801 4.06563 80.7373 5.76407 80.4605 8.28551C80.4092 8.75244 80.0387 9.14403 79.5686 9.14069C78.7871 9.13509 77.6507 9.12841 76.9314 9.13092C76.6217 9.13199 76.3658 8.88106 76.381 8.57196C76.4895 6.38513 77.2218 4.3404 78.618 2.76974C80.1695 1.02445 82.4289 0 85.1038 0C89.5979 0 93.8406 4.07791 93.8406 9.14749C93.8406 14.7608 89.1832 19.3113 83.1517 19.3113C78.8502 19.3113 74.5179 16.5041 73.0053 12.5795C72.9999 12.565 72.9986 12.5492 73.0015 12.534C73.0218 12.4179 73.0617 12.3118 73.1011 12.2074C73.1583 12.0555 73.2143 11.907 73.2062 11.7359L73.18 11.1892C73.174 11.0569 73.2075 10.9258 73.2764 10.8127C73.3452 10.6995 73.4463 10.6094 73.5666 10.554L73.7852 10.4523C73.9077 10.3957 74.0148 10.3105 74.0976 10.204C74.1803 10.0974 74.2363 9.97252 74.2608 9.83983C74.3341 9.43894 74.6865 9.14749 75.0979 9.14749C75.7404 9.14749 76.299 9.57412 76.5088 10.1806C77.5188 13.1 79.1245 15.2457 83.0561 15.2457Z' fill='%23373F45'/%3E%3Cpath d='M155.758 6.91365C155.028 6.91365 154.804 6.47916 154.804 5.98857C154.804 5.46997 154.986 5.06348 155.758 5.06348C156.53 5.06348 156.712 5.46997 156.712 5.98857C156.712 6.47905 156.516 6.91365 155.758 6.91365ZM142.441 12.9304V9.32833L141.415 9.32323V8.90392C141.415 8.44719 141.786 8.07758 142.244 8.07986L142.441 8.08095V6.55306L144.082 6.09057V8.08073H145.569V8.50416C145.569 8.61242 145.548 8.71961 145.506 8.81961C145.465 8.91961 145.404 9.01047 145.328 9.08699C145.251 9.16351 145.16 9.2242 145.06 9.26559C144.96 9.30698 144.853 9.32826 144.745 9.32822H144.082V12.7201C144.082 13.2423 144.378 13.4256 144.76 13.4887C145.209 13.5629 145.583 13.888 145.583 14.343V14.9626C144.029 14.9626 142.441 14.8942 142.441 12.9304Z' fill='%23373F45'/%3E%3Cpath d='M110.058 7.92554C108.417 7.88344 106.396 8.92062 106.396 11.5137C106.396 14.0646 108.417 15.0738 110.058 15.0318C111.742 15.0738 113.748 14.0646 113.748 11.5137C113.748 8.92062 111.742 7.88344 110.058 7.92554ZM110.07 13.7586C108.878 13.7586 108.032 12.8905 108.032 11.461C108.032 10.1013 108.878 9.20569 110.071 9.20569C111.263 9.20569 112.101 10.0995 112.101 11.459C112.101 12.8887 111.263 13.7586 110.07 13.7586Z' fill='%23373F45'/%3E%3Cpath d='M118.06 7.94098C119.491 7.94098 120.978 8.33337 120.978 11.1366V14.893H120.063C119.608 14.893 119.238 14.524 119.238 14.0689V10.9965C119.238 9.66506 118.747 9.16047 117.891 9.16047C117.414 9.16047 116.797 9.52486 116.502 9.81915V14.069C116.502 14.1773 116.481 14.2845 116.44 14.3845C116.398 14.4845 116.337 14.5753 116.261 14.6519C116.184 14.7284 116.093 14.7891 115.993 14.8305C115.893 14.8719 115.786 14.8931 115.678 14.8931H114.847V8.10918H115.773C115.932 8.10914 116.087 8.16315 116.212 8.26242C116.337 8.36168 116.424 8.50033 116.46 8.65577C116.881 8.19328 117.428 7.94098 118.06 7.94098ZM122.854 8.09713C123.024 8.09708 123.19 8.1496 123.329 8.2475C123.468 8.34541 123.574 8.48391 123.631 8.64405L125.133 12.8486L126.635 8.64415C126.692 8.48402 126.798 8.34551 126.937 8.2476C127.076 8.1497 127.242 8.09718 127.412 8.09724H128.598L126.152 14.3567C126.091 14.5112 125.986 14.6439 125.849 14.7374C125.711 14.831 125.549 14.881 125.383 14.8809H124.333L121.668 8.09713H122.854Z' fill='%23373F45'/%3E%3Cpath d='M135.085 14.5514C134.566 14.7616 133.513 15.0416 132.418 15.0416C130.496 15.0416 129.024 13.9345 129.024 11.4396C129.024 9.19701 130.451 7.99792 132.191 7.99792C134.338 7.99792 135.254 9.4378 135.158 11.3979C135.139 11.8029 134.786 12.0983 134.38 12.0983H130.679C130.763 13.1916 131.562 13.7662 132.615 13.7662C133.028 13.7662 133.462 13.7452 133.983 13.6481C134.535 13.545 135.085 13.9375 135.085 14.4985V14.5514ZM133.673 10.949C133.785 9.87621 133.061 9.28752 132.191 9.28752C131.321 9.28752 130.734 9.93979 130.679 10.9489L133.673 10.949Z' fill='%23373F45'/%3E%3Cpath d='M137.345 8.11122C137.497 8.11118 137.645 8.16229 137.765 8.25635C137.884 8.35041 137.969 8.48197 138.005 8.62993C138.566 8.20932 139.268 7.94303 139.759 7.94303C139.801 7.94303 140.068 7.94303 140.489 7.99913V8.7265C140.489 9.11748 140.15 9.4147 139.759 9.4147C139.31 9.4147 138.651 9.5829 138.131 9.8773V14.8951H136.462V8.11112L137.345 8.11122ZM156.6 14.0508V8.09104H155.769C155.314 8.09104 154.944 8.45999 154.944 8.9151V14.8748H155.775C156.23 14.8748 156.6 14.5058 156.6 14.0508ZM158.857 12.9447V9.34254H157.749V8.91912C157.749 8.46401 158.118 8.09506 158.574 8.09506H158.857V6.56739L160.499 6.10479V8.09506H161.986V8.51848C161.986 8.97359 161.617 9.34254 161.161 9.34254H160.499V12.7345C160.499 13.2566 160.795 13.44 161.177 13.503C161.626 13.5774 162 13.9024 162 14.3574V14.977C160.446 14.977 158.857 14.9086 158.857 12.9447ZM98.1929 10.1124C98.2033 6.94046 100.598 5.16809 102.895 5.16809C104.171 5.16809 105.342 5.44285 106.304 6.12953L105.914 6.6631C105.654 7.02011 105.16 7.16194 104.749 6.99949C104.169 6.7702 103.622 6.7218 103.215 6.7218C101.335 6.7218 99.9169 7.92849 99.9068 10.1123C99.9169 12.2959 101.335 13.5201 103.215 13.5201C103.622 13.5201 104.169 13.4717 104.749 13.2424C105.16 13.0799 105.654 13.2046 105.914 13.5615L106.304 14.0952C105.342 14.7819 104.171 15.0566 102.895 15.0566C100.598 15.0566 98.2033 13.2842 98.1929 10.1124ZM147.619 5.21768C148.074 5.21768 148.444 5.58663 148.444 6.04174V9.81968L151.82 5.58131C151.897 5.47733 151.997 5.39282 152.112 5.3346C152.227 5.27638 152.355 5.24607 152.484 5.24611H153.984L150.166 10.0615L153.984 14.8749H152.484C152.355 14.8749 152.227 14.8446 152.112 14.7864C151.997 14.7281 151.897 14.6436 151.82 14.5397L148.444 10.3025V14.0508C148.444 14.5059 148.074 14.8749 147.619 14.8749H146.746V5.21768H147.619Z' fill='%23373F45'/%3E%3Cpath d='M0.773438 6.5752H2.68066C3.56543 6.5752 4.2041 6.7041 4.59668 6.96191C4.99219 7.21973 5.18994 7.62695 5.18994 8.18359C5.18994 8.55859 5.09326 8.87061 4.8999 9.11963C4.70654 9.36865 4.42822 9.52539 4.06494 9.58984V9.63379C4.51611 9.71875 4.84717 9.88721 5.05811 10.1392C5.27197 10.3882 5.37891 10.7266 5.37891 11.1543C5.37891 11.7314 5.17676 12.1841 4.77246 12.5122C4.37109 12.8374 3.81152 13 3.09375 13H0.773438V6.5752ZM1.82373 9.22949H2.83447C3.27393 9.22949 3.59473 9.16064 3.79688 9.02295C3.99902 8.88232 4.1001 8.64502 4.1001 8.31104C4.1001 8.00928 3.99023 7.79102 3.77051 7.65625C3.55371 7.52148 3.20801 7.4541 2.7334 7.4541H1.82373V9.22949ZM1.82373 10.082V12.1167H2.93994C3.37939 12.1167 3.71045 12.0332 3.93311 11.8662C4.15869 11.6963 4.27148 11.4297 4.27148 11.0664C4.27148 10.7324 4.15723 10.4849 3.92871 10.3237C3.7002 10.1626 3.35303 10.082 2.88721 10.082H1.82373Z' fill='%23373F45'/%3E%3Cpath d='M13.011 6.5752V10.7324C13.011 11.207 12.9084 11.623 12.7034 11.9805C12.5012 12.335 12.2068 12.6089 11.8201 12.8022C11.4363 12.9927 10.9763 13.0879 10.4402 13.0879C9.6433 13.0879 9.02368 12.877 8.5813 12.4551C8.13892 12.0332 7.91772 11.4531 7.91772 10.7148V6.5752H8.9724V10.6401C8.9724 11.1704 9.09546 11.5615 9.34155 11.8135C9.58765 12.0654 9.96557 12.1914 10.4753 12.1914C11.4656 12.1914 11.9607 11.6714 11.9607 10.6313V6.5752H13.011Z' fill='%23373F45'/%3E%3Cpath d='M15.9146 13V6.5752H16.9649V13H15.9146Z' fill='%23373F45'/%3E%3Cpath d='M19.9255 13V6.5752H20.9758V12.0991H23.696V13H19.9255Z' fill='%23373F45'/%3E%3Cpath d='M28.2828 13H27.2325V7.47607H25.3428V6.5752H30.1724V7.47607H28.2828V13Z' fill='%23373F45'/%3E%3Cpath d='M41.9472 13H40.8046L39.7148 9.16796C39.6679 9.00097 39.6093 8.76074 39.539 8.44727C39.4687 8.13086 39.4262 7.91113 39.4116 7.78809C39.3823 7.97559 39.3339 8.21875 39.2665 8.51758C39.2021 8.81641 39.1479 9.03905 39.1039 9.18554L38.0405 13H36.8979L36.0673 9.7832L35.2236 6.5752H36.2958L37.2143 10.3193C37.3578 10.9199 37.4604 11.4502 37.5219 11.9102C37.5541 11.6611 37.6025 11.3828 37.6669 11.0752C37.7314 10.7676 37.79 10.5186 37.8427 10.3281L38.8886 6.5752H39.9301L41.0024 10.3457C41.1049 10.6943 41.2133 11.2158 41.3276 11.9102C41.3715 11.4912 41.477 10.958 41.644 10.3105L42.558 6.5752H43.6215L41.9472 13Z' fill='%23373F45'/%3E%3Cpath d='M45.7957 13V6.5752H46.846V13H45.7957Z' fill='%23373F45'/%3E%3Cpath d='M52.0258 13H50.9755V7.47607H49.0859V6.5752H53.9155V7.47607H52.0258V13Z' fill='%23373F45'/%3E%3Cpath d='M61.2312 13H60.1765V10.104H57.2146V13H56.1643V6.5752H57.2146V9.20312H60.1765V6.5752H61.2312V13Z' fill='%23373F45'/%3E%3C/svg%3E");
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-powered-by-convertkit:hover,
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit:focus {
background-color: #ffffff;
-webkit-transform: scale(1.025) perspective(1px);
-ms-transform: scale(1.025) perspective(1px);
transform: scale(1.025) perspective(1px);
opacity: 1;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit[data-variant="dark"],
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit[data-variant="light"] {
background-color: transparent;
border-color: transparent;
width: 166px;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit[data-variant="light"] {
color: #ffffff;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='162' height='20' viewBox='0 0 162 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M83.0561 15.2457C86.675 15.2457 89.4722 12.5154 89.4722 9.14749C89.4722 5.99211 86.8443 4.06563 85.1038 4.06563C82.6801 4.06563 80.7373 5.76407 80.4605 8.28551C80.4092 8.75244 80.0387 9.14403 79.5686 9.14069C78.7871 9.13509 77.6507 9.12841 76.9314 9.13092C76.6217 9.13199 76.3658 8.88106 76.381 8.57196C76.4895 6.38513 77.2218 4.3404 78.618 2.76974C80.1695 1.02445 82.4289 0 85.1038 0C89.5979 0 93.8406 4.07791 93.8406 9.14749C93.8406 14.7608 89.1832 19.3113 83.1517 19.3113C78.8502 19.3113 74.5179 16.5041 73.0053 12.5795C72.9999 12.565 72.9986 12.5492 73.0015 12.534C73.0218 12.4179 73.0617 12.3118 73.1011 12.2074C73.1583 12.0555 73.2143 11.907 73.2062 11.7359L73.18 11.1892C73.174 11.0569 73.2075 10.9258 73.2764 10.8127C73.3452 10.6995 73.4463 10.6094 73.5666 10.554L73.7852 10.4523C73.9077 10.3957 74.0148 10.3105 74.0976 10.204C74.1803 10.0974 74.2363 9.97252 74.2608 9.83983C74.3341 9.43894 74.6865 9.14749 75.0979 9.14749C75.7404 9.14749 76.299 9.57412 76.5088 10.1806C77.5188 13.1 79.1245 15.2457 83.0561 15.2457Z' fill='white'/%3E%3Cpath d='M155.758 6.91365C155.028 6.91365 154.804 6.47916 154.804 5.98857C154.804 5.46997 154.986 5.06348 155.758 5.06348C156.53 5.06348 156.712 5.46997 156.712 5.98857C156.712 6.47905 156.516 6.91365 155.758 6.91365ZM142.441 12.9304V9.32833L141.415 9.32323V8.90392C141.415 8.44719 141.786 8.07758 142.244 8.07986L142.441 8.08095V6.55306L144.082 6.09057V8.08073H145.569V8.50416C145.569 8.61242 145.548 8.71961 145.506 8.81961C145.465 8.91961 145.404 9.01047 145.328 9.08699C145.251 9.16351 145.16 9.2242 145.06 9.26559C144.96 9.30698 144.853 9.32826 144.745 9.32822H144.082V12.7201C144.082 13.2423 144.378 13.4256 144.76 13.4887C145.209 13.5629 145.583 13.888 145.583 14.343V14.9626C144.029 14.9626 142.441 14.8942 142.441 12.9304Z' fill='white'/%3E%3Cpath d='M110.058 7.92554C108.417 7.88344 106.396 8.92062 106.396 11.5137C106.396 14.0646 108.417 15.0738 110.058 15.0318C111.742 15.0738 113.748 14.0646 113.748 11.5137C113.748 8.92062 111.742 7.88344 110.058 7.92554ZM110.07 13.7586C108.878 13.7586 108.032 12.8905 108.032 11.461C108.032 10.1013 108.878 9.20569 110.071 9.20569C111.263 9.20569 112.101 10.0995 112.101 11.459C112.101 12.8887 111.263 13.7586 110.07 13.7586Z' fill='white'/%3E%3Cpath d='M118.06 7.94098C119.491 7.94098 120.978 8.33337 120.978 11.1366V14.893H120.063C119.608 14.893 119.238 14.524 119.238 14.0689V10.9965C119.238 9.66506 118.747 9.16047 117.891 9.16047C117.414 9.16047 116.797 9.52486 116.502 9.81915V14.069C116.502 14.1773 116.481 14.2845 116.44 14.3845C116.398 14.4845 116.337 14.5753 116.261 14.6519C116.184 14.7284 116.093 14.7891 115.993 14.8305C115.893 14.8719 115.786 14.8931 115.678 14.8931H114.847V8.10918H115.773C115.932 8.10914 116.087 8.16315 116.212 8.26242C116.337 8.36168 116.424 8.50033 116.46 8.65577C116.881 8.19328 117.428 7.94098 118.06 7.94098ZM122.854 8.09713C123.024 8.09708 123.19 8.1496 123.329 8.2475C123.468 8.34541 123.574 8.48391 123.631 8.64405L125.133 12.8486L126.635 8.64415C126.692 8.48402 126.798 8.34551 126.937 8.2476C127.076 8.1497 127.242 8.09718 127.412 8.09724H128.598L126.152 14.3567C126.091 14.5112 125.986 14.6439 125.849 14.7374C125.711 14.831 125.549 14.881 125.383 14.8809H124.333L121.668 8.09713H122.854Z' fill='white'/%3E%3Cpath d='M135.085 14.5514C134.566 14.7616 133.513 15.0416 132.418 15.0416C130.496 15.0416 129.024 13.9345 129.024 11.4396C129.024 9.19701 130.451 7.99792 132.191 7.99792C134.338 7.99792 135.254 9.4378 135.158 11.3979C135.139 11.8029 134.786 12.0983 134.38 12.0983H130.679C130.763 13.1916 131.562 13.7662 132.615 13.7662C133.028 13.7662 133.462 13.7452 133.983 13.6481C134.535 13.545 135.085 13.9375 135.085 14.4985V14.5514ZM133.673 10.949C133.785 9.87621 133.061 9.28752 132.191 9.28752C131.321 9.28752 130.734 9.93979 130.679 10.9489L133.673 10.949Z' fill='white'/%3E%3Cpath d='M137.345 8.11122C137.497 8.11118 137.645 8.16229 137.765 8.25635C137.884 8.35041 137.969 8.48197 138.005 8.62993C138.566 8.20932 139.268 7.94303 139.759 7.94303C139.801 7.94303 140.068 7.94303 140.489 7.99913V8.7265C140.489 9.11748 140.15 9.4147 139.759 9.4147C139.31 9.4147 138.651 9.5829 138.131 9.8773V14.8951H136.462V8.11112L137.345 8.11122ZM156.6 14.0508V8.09104H155.769C155.314 8.09104 154.944 8.45999 154.944 8.9151V14.8748H155.775C156.23 14.8748 156.6 14.5058 156.6 14.0508ZM158.857 12.9447V9.34254H157.749V8.91912C157.749 8.46401 158.118 8.09506 158.574 8.09506H158.857V6.56739L160.499 6.10479V8.09506H161.986V8.51848C161.986 8.97359 161.617 9.34254 161.161 9.34254H160.499V12.7345C160.499 13.2566 160.795 13.44 161.177 13.503C161.626 13.5774 162 13.9024 162 14.3574V14.977C160.446 14.977 158.857 14.9086 158.857 12.9447ZM98.1929 10.1124C98.2033 6.94046 100.598 5.16809 102.895 5.16809C104.171 5.16809 105.342 5.44285 106.304 6.12953L105.914 6.6631C105.654 7.02011 105.16 7.16194 104.749 6.99949C104.169 6.7702 103.622 6.7218 103.215 6.7218C101.335 6.7218 99.9169 7.92849 99.9068 10.1123C99.9169 12.2959 101.335 13.5201 103.215 13.5201C103.622 13.5201 104.169 13.4717 104.749 13.2424C105.16 13.0799 105.654 13.2046 105.914 13.5615L106.304 14.0952C105.342 14.7819 104.171 15.0566 102.895 15.0566C100.598 15.0566 98.2033 13.2842 98.1929 10.1124ZM147.619 5.21768C148.074 5.21768 148.444 5.58663 148.444 6.04174V9.81968L151.82 5.58131C151.897 5.47733 151.997 5.39282 152.112 5.3346C152.227 5.27638 152.355 5.24607 152.484 5.24611H153.984L150.166 10.0615L153.984 14.8749H152.484C152.355 14.8749 152.227 14.8446 152.112 14.7864C151.997 14.7281 151.897 14.6436 151.82 14.5397L148.444 10.3025V14.0508C148.444 14.5059 148.074 14.8749 147.619 14.8749H146.746V5.21768H147.619Z' fill='white'/%3E%3Cpath d='M0.773438 6.5752H2.68066C3.56543 6.5752 4.2041 6.7041 4.59668 6.96191C4.99219 7.21973 5.18994 7.62695 5.18994 8.18359C5.18994 8.55859 5.09326 8.87061 4.8999 9.11963C4.70654 9.36865 4.42822 9.52539 4.06494 9.58984V9.63379C4.51611 9.71875 4.84717 9.88721 5.05811 10.1392C5.27197 10.3882 5.37891 10.7266 5.37891 11.1543C5.37891 11.7314 5.17676 12.1841 4.77246 12.5122C4.37109 12.8374 3.81152 13 3.09375 13H0.773438V6.5752ZM1.82373 9.22949H2.83447C3.27393 9.22949 3.59473 9.16064 3.79688 9.02295C3.99902 8.88232 4.1001 8.64502 4.1001 8.31104C4.1001 8.00928 3.99023 7.79102 3.77051 7.65625C3.55371 7.52148 3.20801 7.4541 2.7334 7.4541H1.82373V9.22949ZM1.82373 10.082V12.1167H2.93994C3.37939 12.1167 3.71045 12.0332 3.93311 11.8662C4.15869 11.6963 4.27148 11.4297 4.27148 11.0664C4.27148 10.7324 4.15723 10.4849 3.92871 10.3237C3.7002 10.1626 3.35303 10.082 2.88721 10.082H1.82373Z' fill='white'/%3E%3Cpath d='M13.011 6.5752V10.7324C13.011 11.207 12.9084 11.623 12.7034 11.9805C12.5012 12.335 12.2068 12.6089 11.8201 12.8022C11.4363 12.9927 10.9763 13.0879 10.4402 13.0879C9.6433 13.0879 9.02368 12.877 8.5813 12.4551C8.13892 12.0332 7.91772 11.4531 7.91772 10.7148V6.5752H8.9724V10.6401C8.9724 11.1704 9.09546 11.5615 9.34155 11.8135C9.58765 12.0654 9.96557 12.1914 10.4753 12.1914C11.4656 12.1914 11.9607 11.6714 11.9607 10.6313V6.5752H13.011Z' fill='white'/%3E%3Cpath d='M15.9146 13V6.5752H16.9649V13H15.9146Z' fill='white'/%3E%3Cpath d='M19.9255 13V6.5752H20.9758V12.0991H23.696V13H19.9255Z' fill='white'/%3E%3Cpath d='M28.2828 13H27.2325V7.47607H25.3428V6.5752H30.1724V7.47607H28.2828V13Z' fill='white'/%3E%3Cpath d='M41.9472 13H40.8046L39.7148 9.16796C39.6679 9.00097 39.6093 8.76074 39.539 8.44727C39.4687 8.13086 39.4262 7.91113 39.4116 7.78809C39.3823 7.97559 39.3339 8.21875 39.2665 8.51758C39.2021 8.81641 39.1479 9.03905 39.1039 9.18554L38.0405 13H36.8979L36.0673 9.7832L35.2236 6.5752H36.2958L37.2143 10.3193C37.3578 10.9199 37.4604 11.4502 37.5219 11.9102C37.5541 11.6611 37.6025 11.3828 37.6669 11.0752C37.7314 10.7676 37.79 10.5186 37.8427 10.3281L38.8886 6.5752H39.9301L41.0024 10.3457C41.1049 10.6943 41.2133 11.2158 41.3276 11.9102C41.3715 11.4912 41.477 10.958 41.644 10.3105L42.558 6.5752H43.6215L41.9472 13Z' fill='white'/%3E%3Cpath d='M45.7957 13V6.5752H46.846V13H45.7957Z' fill='white'/%3E%3Cpath d='M52.0258 13H50.9755V7.47607H49.0859V6.5752H53.9155V7.47607H52.0258V13Z' fill='white'/%3E%3Cpath d='M61.2312 13H60.1765V10.104H57.2146V13H56.1643V6.5752H57.2146V9.20312H60.1765V6.5752H61.2312V13Z' fill='white'/%3E%3C/svg%3E");
}
@-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
@keyframes formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
.formkit-form[data-uid="d2e88d98d6"] blockquote {
padding: 10px 20px;
margin: 0 0 20px;
border-left: 5px solid #e1e1e1;
}
.formkit-form[data-uid="d2e88d98d6"] {
border: 1px solid #e3e3e3;
max-width: 700px;
position: relative;
overflow: hidden;
margin: 0px 0px 15px 0;
padding: 5px 15px 5px 15px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-background {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: cover;
background-position: center;
opacity: 0.3;
}
.formkit-form[data-uid="d2e88d98d6"] [data-style="minimal"] {
width: 100%;
position: relative;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-header {
margin: 0 0 0 0;
text-align: center;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-subheader {
margin: 18px 0;
text-align: center;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-guarantee {
font-size: 13px;
margin: 0;
text-align: center;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-guarantee > p {
margin: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit-container {
margin-bottom: 0;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-fields {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
margin: 0 auto 0 auto;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-field {
min-width: 220px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-field,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit {
margin: 0 0 15px 0;
-webkit-flex: 1 0 100%;
-ms-flex: 1 0 100%;
flex: 1 0 100%;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"] {
margin-left: -5px;
margin-right: -5px;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-field,
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-submit {
margin: 0 5px 15px 5px;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-field {
-webkit-flex: 100 1 auto;
-ms-flex: 100 1 auto;
flex: 100 1 auto;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-submit {
-webkit-flex: 1 1 auto;
-ms-flex: 1 1 auto;
flex: 1 1 auto;
}
</style>
</form>
</div>
<h2 id="gdzie-trzymać-dane">Gdzie trzymać dane?</h2>
<p>Tematem dzisiejszego odcinka są bazy danych. Tak jak poprzednio, zamiast gotowego rozwiązania skupię się bardziej na możliwościach, a nie konkretnym wyborze.
Ponieważ aplikacja dla Ligii Mistrzów jest projektem typu greenfield to całe szczęście nie musimy nic migrować, a jedynie zastanowić się, gdzie chcielibyśmy mieć dane. Jest oczywiście jeden problem w <a href="https://poznajazure.pl/champions-league/">specyfikacji</a>.</p>
<p>Mamy tam 3 dość istotne punkty:</p>
<ul>
<li>Ważnym wydarzeniem będzie losowanie na żywo i sprawdzanie wyników przez uczestników</li>
<li>Mogą być różne sposoby zdobycia biletów: quizy, losowania, inne - to się jeszcze dogada 🤦♂️</li>
<li>Aplikacja musi działać już za miesiąc, ma obsłużyć tegoroczne finały i może przyszłe</li>
</ul>
<p>Czyli mówiąc wprost:</p>
<ul>
<li>Wydajność bazy musi być zmienna w czasie</li>
<li>Nie do końca wiemy co w niej będzie :)</li>
<li>Spora część danych będzie do odczytu i cache powinien sprawować się nieźle (są wyniki, albo nie ma wyników)
Jak do tego podejść? Od bardzo dawna mamy dwie szkoły baz danych SQL i NoSQL. Część z Was może zakrzyknąć: jak to? Od dawna? Przecież NoSQL to ten wiek. Niby tak, niby nie. Sam termin został użyty przez Carlo Strozziego w 1998 roku jako nazwa dla lekkiej relacyjnej bazy open source Strozzi NoSQL. Tutaj zaczynamy trochę wchodzić w filozofię i zastanawiać się, która baza jest jaka. I czy termin NoSQL, nie powinien zostać przekształcony w NoREL (od “not relational”), ale to na pewno już dyskusja nie na ten email. Jedyna uwaga na koniec: bazy nierelacyjne mają swoje korzenie już w latach 60 XX wieku, więc ciężko je uznać za coś nowego :)</li>
</ul>
<h2 id="opcje">Opcje…</h2>
<p>A jak to wygląda w Azure? Możemy zdecydować się na 4 opcje, acz sprowadzają się do dwóch powyższych:</p>
<ul>
<li>Postawić coś swojego na VM’kach. Da się? No ba!</li>
<li>Użyć Cosmos DB. Dzięki temu mamy od razu bazę “global scale” z kilkoma różnymi API dostępowymi, czyli: SQL (format natywny), MongoDB, Cassanda, Gremlin, key-value czy etcd. To ostatnie jest jeszcze w private preview.</li>
<li>Użyć SQL. I tu znowu cała gama rozwiązań, czyli: Azure SQL (prawie identyczny z SQL Server 2019), PostgreSQL, MySQL czy MariaDB</li>
<li>Zwykły Azure Storage o ile wystarczy nam plikowa baza danych, lub prosty key-value.
No dobra to kilka przemyśleń na każdy z powyższych punktów</li>
</ul>
<h2 id="postawić-coś-swojego-na-vmkach-da-się-no-ba">Postawić coś swojego na VM’kach. Da się? No ba!</h2>
<p>Własna baza to niekoniecznie jest zły pomysł, ale trzeba spełnić 2 warunki. Oba, a nie tylko jeden z nich💡. Po pierwsze wiedzieć, dlaczego wybrana usługa PaaS nie spełni naszych wymogów. Znam kilku specjalistów, którzy potrafią SQL Server wyciągnąć więcej na bardzo konkretnych VM. Robią wtedy bardzo konkretne zastosowania obliczeniowe.
Po drugie musimy umieć taką bazą zarządzać zarówno pod względem backup jak i security. I teraz bardzo ważny punkt: mieć specjalistów do tego na pokładzie. Jeżeli decydujemy się na taki krok, to poszukiwanie nagle na rynku specjalisty jest strzałem w kolano, bo dużo ich nie ma. Przy okazji jak doszliśmy tak daleko, to jak przeszliśmy przez punkt pierwszy 🤪.
Jeżeli chodzi o projekt “Liga Mistrzów”, to wątpię abyśmy spełniali pierwszy warunek, więc całe szczęście nad drugim nie musimy rozmyślać. Czas nagli, szkoda energii.</p>
<h2 id="zwykły-azure-storage-o-ile-wystarczy-nam-plikowa-baza-danych-lub-prosty-key-value">Zwykły Azure Storage o ile wystarczy nam plikowa baza danych, lub prosty key-value</h2>
<p>Zwykły Azure Storage też prawdopodobnie nie spełni naszych wymagań, bo wymaga dużo czasu na jej projektowanie, tak by nasza aplikacja potrafiła działać tylko na zapytaniach po kluczu. Jest też limit na maksymalną liczbę operacji, więc skalowanie jest utrudnione. Szczególnie, że po osiągnięciu maksa, jedynym sposobem jest migracja na Cosmos DB. Nie da się dorzucić po prostu dolarów do pieca.</p>
<p>W tym miejscu może zaświtać Ci pytanie: po co omawiamy tą opcję? Najlepszą odpowiedzią jest wpis na blogu Troy Hunt, który <a href="https://haveibeenpwned.com/">https://haveibeenpwned.com/</a> oparł na Azure Storage. Dzięki temu jak sam pisze: In other words, if I want 100GB of storage and I want to hit it 10 million times, it’ll cost me $8 a month. Nic innego w Azure nie da Wam takiej ilości danych za tak małe pieniądze. Polecam zerknąć na artykuł: <a href="https://www.troyhunt.com/working-with-154-million-records-on/">Working with 154 million records on Azure Table Storage</a>, ale tak jak napisałem wyżej wymaga to bardzo dobrego zaprojektowania naszej aplikacji.</p>
<h2 id="użyć-cosmos-db-dzięki-temu-mamy-od-razu-bazę-global-scale-z-kilkoma-różnymi-api-dostępowymi-czyli-sql-format-natywny-mongodb-cassanda-gremlin-key-value-czy-etcd-to-ostatnie-jest-jeszcze-w-private-preview">Użyć Cosmos DB. Dzięki temu mamy od razu bazę “global scale” z kilkoma różnymi API dostępowymi, czyli: SQL (format natywny), MongoDB, Cassanda, Gremlin, key-value czy etcd. To ostatnie jest jeszcze w private preview.</h2>
<p>Cosmos jest TĄ bazą, w którą większość programistów chce wejść, gdy tylko zaczynają zabawę z Azure. Kilka różnych API, szybkie skalowanie, wiele możliwości. Ochów i achów nie ma końca. Bądźmy jednak szczerzy, nie jest jednak ona pozbawiona wad.</p>
<p>Po pierwsze przy braku połączenia wiedzy z doświadczeniem, łatwo zapłacić naprawdę grube pieniądze. Mamy tu idealny przykład zależności na ile można wycenić doświadczenie. Konsekwencją jest brak używania Cosmos w wielu organizacjach, gdyż wszyscy boją się kosztów. (Uwaga prywatna: Ponieważ ja mam już to doświadczenie, a firmom zdarzyło się zapłacić za moją naukę to jestem w stanie pokazać, że potrafi być ona tańsza niż Azure SQL).</p>
<p>Drugą wadą Cosmosa jest brak “prostego” backup. Nie da się zrobić kopii bezpieczeństwa, bez własnego lub znalezionego na GitHub narzędzia. Niedługo całe szczęście ta wada powinna zniknąć, gdyż w tej chwili trwają pracę nad “point in time restore”, ale są one w statusie “in development” (<a href="https://azure.microsoft.com/en-us/updates/pointintimerestore-pitr-for-azure-cosmos-db/">więcej</a>). Czy Twoja organizacja jest gotowa żyć bez opcji backup? Nie wiem 😁.</p>
<p>Ostatnią sprawą jest praca na lokalnej maszynie. Jedyny emulator da się uruchomić Windows, albo w Windows Container, co sprowadza się do tego samego. Czyli na Linux i Mac nie szans pracy przez połączenia sieciowego. Oczywiście gdy zdecydujemy się na na przykład na API MongoDB w wersji Cosmos to lokalnie możemy pracować na lokalnej wersji Mongo. Podobnie będzie z Casandra. Dla natywnego formatu nie ma już niestety takiej opcji.</p>
<h2 id="użyć-sql-i-tu-znowu-cała-gama-rozwiązań-czyli-azure-sql-prawie-identyczny-z-sql-server-2019-postgresql-mysql-czy-mariadb">Użyć SQL. I tu znowu cała gama rozwiązań, czyli: Azure SQL (prawie identyczny z SQL Server 2019), PostgreSQL, MySQL czy MariaDB</h2>
<p>Ostatnia opcja to Azure Database w różnych odmianach. Oczywiście najbardziej “wspieranym” jest Azure SQL, ale pozostałe też dają radę, więc zależy to od umiejętności w zespole. Jest to klasyczny SQL, więc mamy od razu ORMy i wsparcie narzędziowe. Do tego łatwo postawić sobie odpowiednik na laptopie i pracować nawet w pociągu. Jest też backup.</p>
<p>Dodatkowym plusem jest zarządzanie przez DTU, czyli dajemy maksymalną moc naszej bazie. Należy zastanowić się jak dużo nam tej mocy potrzeba. Na przykład portal <a href="dotnetomaniak.pl">https://dotnetomaniak.pl</a> chodzi z dużym zapasem na 10 DTU (około €8) i gdyby nie wdrożenia to mógłby nawet na 5 DTU (około €4). Przy projektowaniu nowego systemu opcja idealna, ponieważ będziemy musieli tak projektować aplikację, żeby się zmieścić w limitach.</p>
<p>Są też oczywiście wady, które wynikają z niedoskonałości ORM i budowaniu czasami zapytań bardzo drogich. Trzeba więc uważać. Do tego skalowanie nie jest “instant”, potrafi ono trwać naprawdę długie minuty. Czasem szybciej, czasem wolniej, ale wiadomo że gorzej będzie wtedy kiedy najbardziej będziemy tego potrzebować. To nieoficjalne prawo Murphy’ego.</p>
<p>Jeszcze jedna uwaga o Azure SQL. Są dwa modele opłat: vCore i DTU. Jak wybierzesz vCore to możesz się przestraszyć. Wolę o tym uprzedzić z góry, bo już kilka razu się spotkałem z opinią, że SQL w Azure to kosztuje krocie 😁</p>
<h2 id="na-koniec">Na koniec…</h2>
<p>Czas na podsumowanie. Jak zwykle opisałem analizę i nie przedstawiłem jasnej odpowiedzi. Decyzja należy do Ciebie, bo tabliczka na drzwiach “Azure Ninja” zobowiązuje.</p>
<p>Jeżeli temat Cię zainteresował i chcesz wiedzieć co będzie dalej to dołącz do nas na używając poniższego formularza:</p>
<script src="https://f.convertkit.com/ckjs/ck.5.js"></script>
<form action="https://app.convertkit.com/forms/1684572/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="1684572" data-uid="cea5d3079d" data-format="inline" data-version="5" data-options="{"settings":{"after_subscribe":{"action":"redirect","success_message":"Success! Now check your email to confirm your subscription.","redirect_url":"https://poznajAzure.pl/confirmSubscription.html"},"analytics":{"google":null,"facebook":null,"segment":null,"pinterest":null},"modal":{"trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"powered_by":{"show":true,"url":"https://convertkit.com?utm_source=dynamic&utm_medium=referral&utm_campaign=poweredby&utm_content=form"},"recaptcha":{"enabled":false},"return_visitor":{"action":"show","custom_content":""},"slide_in":{"display_in":"bottom_right","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"sticky_bar":{"display_in":"top","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15}},"version":"5"}" min-width="400 500 600 700 800" style="background-color: rgb(255, 255, 255); border-radius: 6px">
<div data-style="full">
<div data-element="column" class="formkit-column" style="background-color: rgb(249, 250, 251)">
<div class="formkit-background" style="opacity: 0.3"></div>
<div class="formkit-header" data-element="header" style="color: rgb(77, 77, 77); font-size: 20px; font-weight: 700">
<h1>Jeżeli interesuje Cię</h1>
</div>
<div class="formkit-subheader" data-element="subheader" style="color: rgb(104, 104, 104); font-size: 15px">
<span>- budowa i hostowanie aplikacji w Azure</span>
<p style="margin-bottom: 0px;">- HA usług</p>
<p style="margin-bottom: 0px;">- wydajność i obsługa baz danych, by było dobrze i tanio</p>
<p style="margin-bottom: 0px;">- diagnostyka i logowanie</p>
<p style="margin-bottom: 0px;">- szybkie wdrażanie i testowanie</p>
<p style="margin-bottom: 0px;"><strong>to trafiłeś idealnie, bo nas też!</strong></p>
</div>
</div>
<div data-element="column" class="formkit-column">
<ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul>
<div data-element="fields" class="seva-fields formkit-fields">
<div class="formkit-field">
<input class="formkit-input" name="email_address" aria-label="Twój email" placeholder="Twój email" required="" type="email" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<div class="formkit-field">
<input class="formkit-input" aria-label="Imię lub nick" name="fields[first_name]" placeholder="Imię lub nick" type="text" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<button data-element="submit" class="formkit-submit formkit-submit" style="
color: rgb(255, 255, 255);
background-color: rgb(22, 119, 190);
border-radius: 24px;
font-weight: 700;
">
<div class="formkit-spinner">
<div></div>
<div></div>
<div></div>
</div>
<span>Subscribe</span>
</button>
</div>
<div class="formkit-guarantee" data-element="guarantee" style="color: rgb(77, 77, 77); font-size: 13px; font-weight: 400">
<p>
<span style="color: rgb(59, 59, 59)">Polityka prywatności - </span><a href="https://poznajazure.pl/policy.html" target="_blank" rel="noopener noreferrer">więcej</a>
</p>
</div>
</div>
</div>
<style>
.formkit-form[data-uid="cea5d3079d"] * {
box-sizing: border-box;
}
.formkit-form[data-uid="cea5d3079d"] {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.formkit-form[data-uid="cea5d3079d"] legend {
border: none;
font-size: inherit;
margin-bottom: 10px;
padding: 0;
position: relative;
display: table;
}
.formkit-form[data-uid="cea5d3079d"] fieldset {
border: 0;
padding: 0.01em 0 0 0;
margin: 0;
min-width: 0;
}
.formkit-form[data-uid="cea5d3079d"]
body:not(:-moz-handler-blocked)
fieldset {
display: table-cell;
}
.formkit-form[data-uid="cea5d3079d"] h1,
.formkit-form[data-uid="cea5d3079d"] h2,
.formkit-form[data-uid="cea5d3079d"] h3,
.formkit-form[data-uid="cea5d3079d"] h4,
.formkit-form[data-uid="cea5d3079d"] h5,
.formkit-form[data-uid="cea5d3079d"] h6 {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="cea5d3079d"] p {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="cea5d3079d"] ol:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] ul:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] blockquote:not([template-default]) {
text-align: left;
}
.formkit-form[data-uid="cea5d3079d"] p:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] hr:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] blockquote:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] ol:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] ul:not([template-default]) {
color: inherit;
font-style: initial;
}
.formkit-form[data-uid="cea5d3079d"] .ordered-list,
.formkit-form[data-uid="cea5d3079d"] .unordered-list {
list-style-position: outside !important;
padding-left: 1em;
}
.formkit-form[data-uid="cea5d3079d"] .list-item {
padding-left: 0;
}
.formkit-form[data-uid="cea5d3079d"][data-format="modal"] {
display: none;
}
.formkit-form[data-uid="cea5d3079d"][data-format="slide in"] {
display: none;
}
.formkit-form[data-uid="cea5d3079d"][data-format="sticky bar"] {
display: none;
}
.formkit-sticky-bar
.formkit-form[data-uid="cea5d3079d"][data-format="sticky bar"] {
display: block;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input,
.formkit-form[data-uid="cea5d3079d"] .formkit-select,
.formkit-form[data-uid="cea5d3079d"] .formkit-checkboxes {
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit {
border: 0;
border-radius: 5px;
color: #ffffff;
cursor: pointer;
display: inline-block;
text-align: center;
font-size: 15px;
font-weight: 500;
cursor: pointer;
margin-bottom: 15px;
overflow: hidden;
padding: 0;
position: relative;
vertical-align: middle;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button:hover,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:hover,
.formkit-form[data-uid="cea5d3079d"] .formkit-button:focus,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:focus {
outline: none;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button:hover > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:hover > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-button:focus > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:focus > span {
background-color: rgba(0, 0, 0, 0.1);
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit > span {
display: block;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
padding: 12px 24px;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input {
background: #ffffff;
font-size: 15px;
padding: 12px;
border: 1px solid #e3e3e3;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
line-height: 1.4;
margin: 0;
-webkit-transition: border-color ease-out 300ms;
transition: border-color ease-out 300ms;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input:focus {
outline: none;
border-color: #1677be;
-webkit-transition: border-color ease 300ms;
transition: border-color ease 300ms;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-input::-webkit-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input::-moz-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input:-ms-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input::placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"] {
position: relative;
display: inline-block;
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"]::before {
content: "";
top: calc(50% - 2.5px);
right: 10px;
position: absolute;
pointer-events: none;
border-color: #4f4f4f transparent transparent transparent;
border-style: solid;
border-width: 6px 6px 0 6px;
height: 0;
width: 0;
z-index: 999;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"] select {
height: auto;
width: 100%;
cursor: pointer;
color: #333333;
line-height: 1.4;
margin-bottom: 0;
padding: 0 6px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
font-size: 15px;
padding: 12px;
padding-right: 25px;
border: 1px solid #e3e3e3;
background: #ffffff;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"] select:focus {
outline: none;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="checkboxes"] {
text-align: left;
margin: 0;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"] {
margin-bottom: 10px;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
* {
cursor: pointer;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]:last-of-type {
margin-bottom: 0;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"] {
display: none;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]
+ label::after {
content: none;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::after {
border-color: #ffffff;
content: "";
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::before {
background: #10bf7a;
border-color: #10bf7a;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label {
position: relative;
display: inline-block;
padding-left: 28px;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before,
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
position: absolute;
content: "";
display: inline-block;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before {
height: 16px;
width: 16px;
border: 1px solid #e3e3e3;
background: #ffffff;
left: 0px;
top: 3px;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
height: 4px;
width: 8px;
border-left: 2px solid #4d4d4d;
border-bottom: 2px solid #4d4d4d;
-webkit-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
transform: rotate(-45deg);
left: 4px;
top: 8px;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert {
background: #f9fafb;
border: 1px solid #e3e3e3;
border-radius: 5px;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
list-style: none;
margin: 25px auto;
padding: 12px;
text-align: center;
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert:empty {
display: none;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert-success {
background: #d3fbeb;
border-color: #10bf7a;
color: #0c905c;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert-error {
background: #fde8e2;
border-color: #f2643b;
color: #ea4110;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
height: 0px;
width: 0px;
margin: 0 auto;
position: absolute;
top: 0;
left: 0;
right: 0;
width: 0px;
overflow: hidden;
text-align: center;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner > div {
margin: auto;
width: 12px;
height: 12px;
background-color: #fff;
opacity: 0.3;
border-radius: 100%;
display: inline-block;
-webkit-animation: formkit-bouncedelay-formkit-form-data-uid-cea5d3079d-
1.4s infinite ease-in-out both;
animation: formkit-bouncedelay-formkit-form-data-uid-cea5d3079d- 1.4s
infinite ease-in-out both;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner > div:nth-child(1) {
-webkit-animation-delay: -0.32s;
animation-delay: -0.32s;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner > div:nth-child(2) {
-webkit-animation-delay: -0.16s;
animation-delay: -0.16s;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-submit[data-active]
.formkit-spinner {
opacity: 1;
height: 100%;
width: 50px;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-submit[data-active]
.formkit-spinner
~ span {
opacity: 0;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit-container {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
width: 100%;
z-index: 5;
margin: 10px 0;
position: relative;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit-container[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-powered-by-convertkit {
-webkit-align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
background-color: #ffffff;
border: 1px solid #dce1e5;
border-radius: 4px;
color: #373f45;
cursor: pointer;
display: block;
height: 36px;
margin: 0 auto;
opacity: 0.95;
padding: 0;
-webkit-text-decoration: none;
text-decoration: none;
text-indent: 100%;
-webkit-transition: ease-in-out all 200ms;
transition: ease-in-out all 200ms;
white-space: nowrap;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
width: 190px;
background-repeat: no-repeat;
background-position: center;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-powered-by-convertkit:hover,
.formkit-form[data-uid="cea5d3079d"] .formkit-powered-by-convertkit:focus {
background-color: #ffffff;
-webkit-transform: scale(1.025) perspective(1px);
-ms-transform: scale(1.025) perspective(1px);
transform: scale(1.025) perspective(1px);
opacity: 1;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit[data-variant="dark"],
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit[data-variant="light"] {
background-color: transparent;
border-color: transparent;
width: 166px;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit[data-variant="light"] {
color: #ffffff;
}
@-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-cea5d3079d- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
@keyframes formkit-bouncedelay-formkit-form-data-uid-cea5d3079d- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
.formkit-form[data-uid="cea5d3079d"] blockquote {
padding: 10px 20px;
margin: 0 0 20px;
border-left: 5px solid #e1e1e1;
}
.formkit-form[data-uid="cea5d3079d"] {
box-shadow: 0 2px 15px 0 rgba(210, 214, 220, 0.5);
max-width: 700px;
overflow: hidden;
}
.formkit-form[data-uid="cea5d3079d"] [data-style="full"] {
width: 100%;
display: block;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-header {
margin-top: 0;
margin-bottom: 20px;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-subheader {
margin: 15px 0;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-column {
padding: 20px;
position: relative;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-column:nth-child(2) {
border-top: 1px solid #e9ecef;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-background {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: cover;
background-position: center;
opacity: 0.5;
z-index: 1;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-header,
.formkit-form[data-uid="cea5d3079d"] .formkit-subheader,
.formkit-form[data-uid="cea5d3079d"] .formkit-image {
z-index: 2;
position: relative;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-field {
margin: 0 0 15px 0;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit {
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-guarantee {
font-size: 13px;
margin: 0 0 15px 0;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-guarantee > p {
margin: 0;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit-container {
margin-bottom: 0;
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"] [data-style="full"],
.formkit-form[data-uid="cea5d3079d"][min-width~="700"] [data-style="full"],
.formkit-form[data-uid="cea5d3079d"][min-width~="800"] [data-style="full"] {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"] .formkit-submit,
.formkit-form[data-uid="cea5d3079d"][min-width~="700"] .formkit-submit,
.formkit-form[data-uid="cea5d3079d"][min-width~="800"] .formkit-submit {
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"] .formkit-column,
.formkit-form[data-uid="cea5d3079d"][min-width~="700"] .formkit-column,
.formkit-form[data-uid="cea5d3079d"][min-width~="800"] .formkit-column {
padding: 0px;
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"]
.formkit-column:nth-child(2),
.formkit-form[data-uid="cea5d3079d"][min-width~="700"]
.formkit-column:nth-child(2),
.formkit-form[data-uid="cea5d3079d"][min-width~="800"]
.formkit-column:nth-child(2) {
border-top: none;
}
</style>
</form>Poznaj AzureArtykuł jest częścią, większej całości. W serii znajdują się: Część 1 - Liga Mistrzów i konta użytkowników Część 2 - Liga Mistrzów i 7 sposobów na hosting Część 3 - Liga Mistrzów i bazy danych Część 4 - Liga Mistrzów i brakujący element Część 5 - Liga Mistrzów i diagnostyka - TODO Nie chcesz czekać? Zapisz się Polityka prywatności - więcej​Liga Mistrzów i 7 sposobów na hosting!2020-09-22T13:34:30+00:002020-09-22T13:34:30+00:00https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-7-sposobow-na-hosting<p>Artykuł jest częścią, większej całości. W serii znajdują się:</p>
<ul>
<li>Część 1 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-konta-uzytkownikow/">Liga Mistrzów i konta użytkowników</a></li>
<li>Część 2 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-7-sposobow-na-hosting/">Liga Mistrzów i 7 sposobów na hosting</a></li>
<li>Część 3 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-bazy-danych/">Liga Mistrzów i bazy danych</a></li>
<li>Część 4 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-brakujacy-element/">Liga Mistrzów i brakujący element</a></li>
<li>Część 5 - Liga Mistrzów i diagnostyka - TODO</li>
</ul>
<div>
<script src="https://f.convertkit.com/ckjs/ck.5.js"></script>
<form action="https://app.convertkit.com/forms/1689392/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="1689392" data-uid="d2e88d98d6" data-format="inline" data-version="5" data-options="{"settings":{"after_subscribe":{"action":"redirect","success_message":"Success! Now check your email to confirm your subscription.","redirect_url":"https://poznajAzure.pl/confirmSubscription.html"},"analytics":{"google":null,"facebook":null,"segment":null,"pinterest":null},"modal":{"trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"powered_by":{"show":true,"url":"https://convertkit.com?utm_source=dynamic&utm_medium=referral&utm_campaign=poweredby&utm_content=form"},"recaptcha":{"enabled":false},"return_visitor":{"action":"show","custom_content":""},"slide_in":{"display_in":"bottom_right","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"sticky_bar":{"display_in":"top","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15}},"version":"5"}" min-width="400 500 600 700 800" style="background-color: rgb(255, 255, 255); border-radius: 6px">
<div class="formkit-background" style="opacity: 0.3"></div>
<div data-style="minimal">
<div class="formkit-header" data-element="header" style="color: rgb(77, 77, 77); font-size: 20px; font-weight: 700">
<h1>Nie chcesz czekać?</h1>
</div>
<ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul>
<div data-element="fields" data-stacked="true" class="seva-fields formkit-fields">
<div class="formkit-field">
<input class="formkit-input" name="email_address" aria-label="Twój email" placeholder="Twój email" required="" type="email" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<div class="formkit-field">
<input class="formkit-input" aria-label="Imię lub nick" name="fields[first_name]" placeholder="Imię lub nick" type="text" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<button data-element="submit" class="formkit-submit formkit-submit" style="
color: rgb(255, 255, 255);
background-color: rgb(22, 119, 190);
border-radius: 24px;
font-weight: 700;
">
<div class="formkit-spinner">
<div></div>
<div></div>
<div></div>
</div>
<span>Zapisz się</span>
</button>
</div>
<div class="formkit-guarantee" data-element="guarantee" style="color: rgb(77, 77, 77); font-size: 13px; font-weight: 400">
<p>
<span style="color: rgb(59, 59, 59)">Polityka prywatności - </span><a href="https://poznajazure.pl/policy.html" target="_blank" rel="noopener noreferrer">więcej</a>​
</p>
</div>
</div>
<style>
.formkit-form[data-uid="d2e88d98d6"] * {
box-sizing: border-box;
}
.formkit-form[data-uid="d2e88d98d6"] {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.formkit-form[data-uid="d2e88d98d6"] legend {
border: none;
font-size: inherit;
margin-bottom: 10px;
padding: 0;
position: relative;
display: table;
}
.formkit-form[data-uid="d2e88d98d6"] fieldset {
border: 0;
padding: 0.01em 0 0 0;
margin: 0;
min-width: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
body:not(:-moz-handler-blocked)
fieldset {
display: table-cell;
}
.formkit-form[data-uid="d2e88d98d6"] h1,
.formkit-form[data-uid="d2e88d98d6"] h2,
.formkit-form[data-uid="d2e88d98d6"] h3,
.formkit-form[data-uid="d2e88d98d6"] h4,
.formkit-form[data-uid="d2e88d98d6"] h5,
.formkit-form[data-uid="d2e88d98d6"] h6 {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="d2e88d98d6"] p {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="d2e88d98d6"] ol:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] ul:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] blockquote:not([template-default]) {
text-align: left;
}
.formkit-form[data-uid="d2e88d98d6"] p:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] hr:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] blockquote:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] ol:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] ul:not([template-default]) {
color: inherit;
font-style: initial;
}
.formkit-form[data-uid="d2e88d98d6"] .ordered-list,
.formkit-form[data-uid="d2e88d98d6"] .unordered-list {
list-style-position: outside !important;
padding-left: 0.5em;
}
.formkit-form[data-uid="d2e88d98d6"] .list-item {
padding-left: 0;
}
.formkit-form[data-uid="d2e88d98d6"][data-format="modal"] {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"][data-format="slide in"] {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"][data-format="sticky bar"] {
display: none;
}
.formkit-sticky-bar
.formkit-form[data-uid="d2e88d98d6"][data-format="sticky bar"] {
display: block;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input,
.formkit-form[data-uid="d2e88d98d6"] .formkit-select,
.formkit-form[data-uid="d2e88d98d6"] .formkit-checkboxes {
width: 100%;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit {
border: 0;
border-radius: 5px;
color: #ffffff;
cursor: pointer;
display: inline-block;
text-align: center;
font-size: 15px;
font-weight: 500;
cursor: pointer;
margin-bottom: 15px;
overflow: hidden;
padding: 0;
position: relative;
vertical-align: middle;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:hover,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:hover,
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:focus,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:focus {
outline: none;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:hover > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:hover > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:focus > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:focus > span {
background-color: rgba(0, 0, 0, 0.1);
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit > span {
display: block;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
padding: 12px 24px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input {
background: #ffffff;
font-size: 15px;
padding: 12px;
border: 1px solid #e3e3e3;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
line-height: 1.4;
margin: 0;
-webkit-transition: border-color ease-out 300ms;
transition: border-color ease-out 300ms;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input:focus {
outline: none;
border-color: #1677be;
-webkit-transition: border-color ease 300ms;
transition: border-color ease 300ms;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-input::-webkit-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input::-moz-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-input:-ms-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input::placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="dropdown"] {
position: relative;
display: inline-block;
width: 100%;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="dropdown"]::before {
content: "";
top: calc(50% - 2.5px);
right: 10px;
position: absolute;
pointer-events: none;
border-color: #4f4f4f transparent transparent transparent;
border-style: solid;
border-width: 6px 6px 0 6px;
height: 0;
width: 0;
z-index: 999;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="dropdown"] select {
height: auto;
width: 100%;
cursor: pointer;
color: #333333;
line-height: 1.4;
margin-bottom: 0;
padding: 0 6px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
font-size: 15px;
padding: 12px;
padding-right: 25px;
border: 1px solid #e3e3e3;
background: #ffffff;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="dropdown"]
select:focus {
outline: none;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="checkboxes"] {
text-align: left;
margin: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"] {
margin-bottom: 10px;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
* {
cursor: pointer;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]:last-of-type {
margin-bottom: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"] {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]
+ label::after {
content: none;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::after {
border-color: #ffffff;
content: "";
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::before {
background: #10bf7a;
border-color: #10bf7a;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label {
position: relative;
display: inline-block;
padding-left: 28px;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before,
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
position: absolute;
content: "";
display: inline-block;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before {
height: 16px;
width: 16px;
border: 1px solid #e3e3e3;
background: #ffffff;
left: 0px;
top: 3px;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
height: 4px;
width: 8px;
border-left: 2px solid #4d4d4d;
border-bottom: 2px solid #4d4d4d;
-webkit-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
transform: rotate(-45deg);
left: 4px;
top: 8px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert {
background: #f9fafb;
border: 1px solid #e3e3e3;
border-radius: 5px;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
list-style: none;
margin: 25px auto;
padding: 12px;
text-align: center;
width: 100%;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert:empty {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert-success {
background: #d3fbeb;
border-color: #10bf7a;
color: #0c905c;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert-error {
background: #fde8e2;
border-color: #f2643b;
color: #ea4110;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
height: 0px;
width: 0px;
margin: 0 auto;
position: absolute;
top: 0;
left: 0;
right: 0;
width: 0px;
overflow: hidden;
text-align: center;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner > div {
margin: auto;
width: 12px;
height: 12px;
background-color: #fff;
opacity: 0.3;
border-radius: 100%;
display: inline-block;
-webkit-animation: formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6-
1.4s infinite ease-in-out both;
animation: formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6- 1.4s
infinite ease-in-out both;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner > div:nth-child(1) {
-webkit-animation-delay: -0.32s;
animation-delay: -0.32s;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner > div:nth-child(2) {
-webkit-animation-delay: -0.16s;
animation-delay: -0.16s;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-submit[data-active]
.formkit-spinner {
opacity: 1;
height: 100%;
width: 50px;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-submit[data-active]
.formkit-spinner
~ span {
opacity: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit-container {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
width: 100%;
z-index: 5;
margin: 10px 0;
position: relative;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit-container[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-powered-by-convertkit {
-webkit-align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
background-color: #ffffff;
border: 1px solid #dce1e5;
border-radius: 4px;
color: #373f45;
cursor: pointer;
display: block;
height: 36px;
margin: 0 auto;
opacity: 0.95;
padding: 0;
-webkit-text-decoration: none;
text-decoration: none;
text-indent: 100%;
-webkit-transition: ease-in-out all 200ms;
transition: ease-in-out all 200ms;
white-space: nowrap;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
width: 190px;
background-repeat: no-repeat;
background-position: center;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='162' height='20' viewBox='0 0 162 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M83.0561 15.2457C86.675 15.2457 89.4722 12.5154 89.4722 9.14749C89.4722 5.99211 86.8443 4.06563 85.1038 4.06563C82.6801 4.06563 80.7373 5.76407 80.4605 8.28551C80.4092 8.75244 80.0387 9.14403 79.5686 9.14069C78.7871 9.13509 77.6507 9.12841 76.9314 9.13092C76.6217 9.13199 76.3658 8.88106 76.381 8.57196C76.4895 6.38513 77.2218 4.3404 78.618 2.76974C80.1695 1.02445 82.4289 0 85.1038 0C89.5979 0 93.8406 4.07791 93.8406 9.14749C93.8406 14.7608 89.1832 19.3113 83.1517 19.3113C78.8502 19.3113 74.5179 16.5041 73.0053 12.5795C72.9999 12.565 72.9986 12.5492 73.0015 12.534C73.0218 12.4179 73.0617 12.3118 73.1011 12.2074C73.1583 12.0555 73.2143 11.907 73.2062 11.7359L73.18 11.1892C73.174 11.0569 73.2075 10.9258 73.2764 10.8127C73.3452 10.6995 73.4463 10.6094 73.5666 10.554L73.7852 10.4523C73.9077 10.3957 74.0148 10.3105 74.0976 10.204C74.1803 10.0974 74.2363 9.97252 74.2608 9.83983C74.3341 9.43894 74.6865 9.14749 75.0979 9.14749C75.7404 9.14749 76.299 9.57412 76.5088 10.1806C77.5188 13.1 79.1245 15.2457 83.0561 15.2457Z' fill='%23373F45'/%3E%3Cpath d='M155.758 6.91365C155.028 6.91365 154.804 6.47916 154.804 5.98857C154.804 5.46997 154.986 5.06348 155.758 5.06348C156.53 5.06348 156.712 5.46997 156.712 5.98857C156.712 6.47905 156.516 6.91365 155.758 6.91365ZM142.441 12.9304V9.32833L141.415 9.32323V8.90392C141.415 8.44719 141.786 8.07758 142.244 8.07986L142.441 8.08095V6.55306L144.082 6.09057V8.08073H145.569V8.50416C145.569 8.61242 145.548 8.71961 145.506 8.81961C145.465 8.91961 145.404 9.01047 145.328 9.08699C145.251 9.16351 145.16 9.2242 145.06 9.26559C144.96 9.30698 144.853 9.32826 144.745 9.32822H144.082V12.7201C144.082 13.2423 144.378 13.4256 144.76 13.4887C145.209 13.5629 145.583 13.888 145.583 14.343V14.9626C144.029 14.9626 142.441 14.8942 142.441 12.9304Z' fill='%23373F45'/%3E%3Cpath d='M110.058 7.92554C108.417 7.88344 106.396 8.92062 106.396 11.5137C106.396 14.0646 108.417 15.0738 110.058 15.0318C111.742 15.0738 113.748 14.0646 113.748 11.5137C113.748 8.92062 111.742 7.88344 110.058 7.92554ZM110.07 13.7586C108.878 13.7586 108.032 12.8905 108.032 11.461C108.032 10.1013 108.878 9.20569 110.071 9.20569C111.263 9.20569 112.101 10.0995 112.101 11.459C112.101 12.8887 111.263 13.7586 110.07 13.7586Z' fill='%23373F45'/%3E%3Cpath d='M118.06 7.94098C119.491 7.94098 120.978 8.33337 120.978 11.1366V14.893H120.063C119.608 14.893 119.238 14.524 119.238 14.0689V10.9965C119.238 9.66506 118.747 9.16047 117.891 9.16047C117.414 9.16047 116.797 9.52486 116.502 9.81915V14.069C116.502 14.1773 116.481 14.2845 116.44 14.3845C116.398 14.4845 116.337 14.5753 116.261 14.6519C116.184 14.7284 116.093 14.7891 115.993 14.8305C115.893 14.8719 115.786 14.8931 115.678 14.8931H114.847V8.10918H115.773C115.932 8.10914 116.087 8.16315 116.212 8.26242C116.337 8.36168 116.424 8.50033 116.46 8.65577C116.881 8.19328 117.428 7.94098 118.06 7.94098ZM122.854 8.09713C123.024 8.09708 123.19 8.1496 123.329 8.2475C123.468 8.34541 123.574 8.48391 123.631 8.64405L125.133 12.8486L126.635 8.64415C126.692 8.48402 126.798 8.34551 126.937 8.2476C127.076 8.1497 127.242 8.09718 127.412 8.09724H128.598L126.152 14.3567C126.091 14.5112 125.986 14.6439 125.849 14.7374C125.711 14.831 125.549 14.881 125.383 14.8809H124.333L121.668 8.09713H122.854Z' fill='%23373F45'/%3E%3Cpath d='M135.085 14.5514C134.566 14.7616 133.513 15.0416 132.418 15.0416C130.496 15.0416 129.024 13.9345 129.024 11.4396C129.024 9.19701 130.451 7.99792 132.191 7.99792C134.338 7.99792 135.254 9.4378 135.158 11.3979C135.139 11.8029 134.786 12.0983 134.38 12.0983H130.679C130.763 13.1916 131.562 13.7662 132.615 13.7662C133.028 13.7662 133.462 13.7452 133.983 13.6481C134.535 13.545 135.085 13.9375 135.085 14.4985V14.5514ZM133.673 10.949C133.785 9.87621 133.061 9.28752 132.191 9.28752C131.321 9.28752 130.734 9.93979 130.679 10.9489L133.673 10.949Z' fill='%23373F45'/%3E%3Cpath d='M137.345 8.11122C137.497 8.11118 137.645 8.16229 137.765 8.25635C137.884 8.35041 137.969 8.48197 138.005 8.62993C138.566 8.20932 139.268 7.94303 139.759 7.94303C139.801 7.94303 140.068 7.94303 140.489 7.99913V8.7265C140.489 9.11748 140.15 9.4147 139.759 9.4147C139.31 9.4147 138.651 9.5829 138.131 9.8773V14.8951H136.462V8.11112L137.345 8.11122ZM156.6 14.0508V8.09104H155.769C155.314 8.09104 154.944 8.45999 154.944 8.9151V14.8748H155.775C156.23 14.8748 156.6 14.5058 156.6 14.0508ZM158.857 12.9447V9.34254H157.749V8.91912C157.749 8.46401 158.118 8.09506 158.574 8.09506H158.857V6.56739L160.499 6.10479V8.09506H161.986V8.51848C161.986 8.97359 161.617 9.34254 161.161 9.34254H160.499V12.7345C160.499 13.2566 160.795 13.44 161.177 13.503C161.626 13.5774 162 13.9024 162 14.3574V14.977C160.446 14.977 158.857 14.9086 158.857 12.9447ZM98.1929 10.1124C98.2033 6.94046 100.598 5.16809 102.895 5.16809C104.171 5.16809 105.342 5.44285 106.304 6.12953L105.914 6.6631C105.654 7.02011 105.16 7.16194 104.749 6.99949C104.169 6.7702 103.622 6.7218 103.215 6.7218C101.335 6.7218 99.9169 7.92849 99.9068 10.1123C99.9169 12.2959 101.335 13.5201 103.215 13.5201C103.622 13.5201 104.169 13.4717 104.749 13.2424C105.16 13.0799 105.654 13.2046 105.914 13.5615L106.304 14.0952C105.342 14.7819 104.171 15.0566 102.895 15.0566C100.598 15.0566 98.2033 13.2842 98.1929 10.1124ZM147.619 5.21768C148.074 5.21768 148.444 5.58663 148.444 6.04174V9.81968L151.82 5.58131C151.897 5.47733 151.997 5.39282 152.112 5.3346C152.227 5.27638 152.355 5.24607 152.484 5.24611H153.984L150.166 10.0615L153.984 14.8749H152.484C152.355 14.8749 152.227 14.8446 152.112 14.7864C151.997 14.7281 151.897 14.6436 151.82 14.5397L148.444 10.3025V14.0508C148.444 14.5059 148.074 14.8749 147.619 14.8749H146.746V5.21768H147.619Z' fill='%23373F45'/%3E%3Cpath d='M0.773438 6.5752H2.68066C3.56543 6.5752 4.2041 6.7041 4.59668 6.96191C4.99219 7.21973 5.18994 7.62695 5.18994 8.18359C5.18994 8.55859 5.09326 8.87061 4.8999 9.11963C4.70654 9.36865 4.42822 9.52539 4.06494 9.58984V9.63379C4.51611 9.71875 4.84717 9.88721 5.05811 10.1392C5.27197 10.3882 5.37891 10.7266 5.37891 11.1543C5.37891 11.7314 5.17676 12.1841 4.77246 12.5122C4.37109 12.8374 3.81152 13 3.09375 13H0.773438V6.5752ZM1.82373 9.22949H2.83447C3.27393 9.22949 3.59473 9.16064 3.79688 9.02295C3.99902 8.88232 4.1001 8.64502 4.1001 8.31104C4.1001 8.00928 3.99023 7.79102 3.77051 7.65625C3.55371 7.52148 3.20801 7.4541 2.7334 7.4541H1.82373V9.22949ZM1.82373 10.082V12.1167H2.93994C3.37939 12.1167 3.71045 12.0332 3.93311 11.8662C4.15869 11.6963 4.27148 11.4297 4.27148 11.0664C4.27148 10.7324 4.15723 10.4849 3.92871 10.3237C3.7002 10.1626 3.35303 10.082 2.88721 10.082H1.82373Z' fill='%23373F45'/%3E%3Cpath d='M13.011 6.5752V10.7324C13.011 11.207 12.9084 11.623 12.7034 11.9805C12.5012 12.335 12.2068 12.6089 11.8201 12.8022C11.4363 12.9927 10.9763 13.0879 10.4402 13.0879C9.6433 13.0879 9.02368 12.877 8.5813 12.4551C8.13892 12.0332 7.91772 11.4531 7.91772 10.7148V6.5752H8.9724V10.6401C8.9724 11.1704 9.09546 11.5615 9.34155 11.8135C9.58765 12.0654 9.96557 12.1914 10.4753 12.1914C11.4656 12.1914 11.9607 11.6714 11.9607 10.6313V6.5752H13.011Z' fill='%23373F45'/%3E%3Cpath d='M15.9146 13V6.5752H16.9649V13H15.9146Z' fill='%23373F45'/%3E%3Cpath d='M19.9255 13V6.5752H20.9758V12.0991H23.696V13H19.9255Z' fill='%23373F45'/%3E%3Cpath d='M28.2828 13H27.2325V7.47607H25.3428V6.5752H30.1724V7.47607H28.2828V13Z' fill='%23373F45'/%3E%3Cpath d='M41.9472 13H40.8046L39.7148 9.16796C39.6679 9.00097 39.6093 8.76074 39.539 8.44727C39.4687 8.13086 39.4262 7.91113 39.4116 7.78809C39.3823 7.97559 39.3339 8.21875 39.2665 8.51758C39.2021 8.81641 39.1479 9.03905 39.1039 9.18554L38.0405 13H36.8979L36.0673 9.7832L35.2236 6.5752H36.2958L37.2143 10.3193C37.3578 10.9199 37.4604 11.4502 37.5219 11.9102C37.5541 11.6611 37.6025 11.3828 37.6669 11.0752C37.7314 10.7676 37.79 10.5186 37.8427 10.3281L38.8886 6.5752H39.9301L41.0024 10.3457C41.1049 10.6943 41.2133 11.2158 41.3276 11.9102C41.3715 11.4912 41.477 10.958 41.644 10.3105L42.558 6.5752H43.6215L41.9472 13Z' fill='%23373F45'/%3E%3Cpath d='M45.7957 13V6.5752H46.846V13H45.7957Z' fill='%23373F45'/%3E%3Cpath d='M52.0258 13H50.9755V7.47607H49.0859V6.5752H53.9155V7.47607H52.0258V13Z' fill='%23373F45'/%3E%3Cpath d='M61.2312 13H60.1765V10.104H57.2146V13H56.1643V6.5752H57.2146V9.20312H60.1765V6.5752H61.2312V13Z' fill='%23373F45'/%3E%3C/svg%3E");
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-powered-by-convertkit:hover,
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit:focus {
background-color: #ffffff;
-webkit-transform: scale(1.025) perspective(1px);
-ms-transform: scale(1.025) perspective(1px);
transform: scale(1.025) perspective(1px);
opacity: 1;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit[data-variant="dark"],
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit[data-variant="light"] {
background-color: transparent;
border-color: transparent;
width: 166px;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit[data-variant="light"] {
color: #ffffff;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='162' height='20' viewBox='0 0 162 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M83.0561 15.2457C86.675 15.2457 89.4722 12.5154 89.4722 9.14749C89.4722 5.99211 86.8443 4.06563 85.1038 4.06563C82.6801 4.06563 80.7373 5.76407 80.4605 8.28551C80.4092 8.75244 80.0387 9.14403 79.5686 9.14069C78.7871 9.13509 77.6507 9.12841 76.9314 9.13092C76.6217 9.13199 76.3658 8.88106 76.381 8.57196C76.4895 6.38513 77.2218 4.3404 78.618 2.76974C80.1695 1.02445 82.4289 0 85.1038 0C89.5979 0 93.8406 4.07791 93.8406 9.14749C93.8406 14.7608 89.1832 19.3113 83.1517 19.3113C78.8502 19.3113 74.5179 16.5041 73.0053 12.5795C72.9999 12.565 72.9986 12.5492 73.0015 12.534C73.0218 12.4179 73.0617 12.3118 73.1011 12.2074C73.1583 12.0555 73.2143 11.907 73.2062 11.7359L73.18 11.1892C73.174 11.0569 73.2075 10.9258 73.2764 10.8127C73.3452 10.6995 73.4463 10.6094 73.5666 10.554L73.7852 10.4523C73.9077 10.3957 74.0148 10.3105 74.0976 10.204C74.1803 10.0974 74.2363 9.97252 74.2608 9.83983C74.3341 9.43894 74.6865 9.14749 75.0979 9.14749C75.7404 9.14749 76.299 9.57412 76.5088 10.1806C77.5188 13.1 79.1245 15.2457 83.0561 15.2457Z' fill='white'/%3E%3Cpath d='M155.758 6.91365C155.028 6.91365 154.804 6.47916 154.804 5.98857C154.804 5.46997 154.986 5.06348 155.758 5.06348C156.53 5.06348 156.712 5.46997 156.712 5.98857C156.712 6.47905 156.516 6.91365 155.758 6.91365ZM142.441 12.9304V9.32833L141.415 9.32323V8.90392C141.415 8.44719 141.786 8.07758 142.244 8.07986L142.441 8.08095V6.55306L144.082 6.09057V8.08073H145.569V8.50416C145.569 8.61242 145.548 8.71961 145.506 8.81961C145.465 8.91961 145.404 9.01047 145.328 9.08699C145.251 9.16351 145.16 9.2242 145.06 9.26559C144.96 9.30698 144.853 9.32826 144.745 9.32822H144.082V12.7201C144.082 13.2423 144.378 13.4256 144.76 13.4887C145.209 13.5629 145.583 13.888 145.583 14.343V14.9626C144.029 14.9626 142.441 14.8942 142.441 12.9304Z' fill='white'/%3E%3Cpath d='M110.058 7.92554C108.417 7.88344 106.396 8.92062 106.396 11.5137C106.396 14.0646 108.417 15.0738 110.058 15.0318C111.742 15.0738 113.748 14.0646 113.748 11.5137C113.748 8.92062 111.742 7.88344 110.058 7.92554ZM110.07 13.7586C108.878 13.7586 108.032 12.8905 108.032 11.461C108.032 10.1013 108.878 9.20569 110.071 9.20569C111.263 9.20569 112.101 10.0995 112.101 11.459C112.101 12.8887 111.263 13.7586 110.07 13.7586Z' fill='white'/%3E%3Cpath d='M118.06 7.94098C119.491 7.94098 120.978 8.33337 120.978 11.1366V14.893H120.063C119.608 14.893 119.238 14.524 119.238 14.0689V10.9965C119.238 9.66506 118.747 9.16047 117.891 9.16047C117.414 9.16047 116.797 9.52486 116.502 9.81915V14.069C116.502 14.1773 116.481 14.2845 116.44 14.3845C116.398 14.4845 116.337 14.5753 116.261 14.6519C116.184 14.7284 116.093 14.7891 115.993 14.8305C115.893 14.8719 115.786 14.8931 115.678 14.8931H114.847V8.10918H115.773C115.932 8.10914 116.087 8.16315 116.212 8.26242C116.337 8.36168 116.424 8.50033 116.46 8.65577C116.881 8.19328 117.428 7.94098 118.06 7.94098ZM122.854 8.09713C123.024 8.09708 123.19 8.1496 123.329 8.2475C123.468 8.34541 123.574 8.48391 123.631 8.64405L125.133 12.8486L126.635 8.64415C126.692 8.48402 126.798 8.34551 126.937 8.2476C127.076 8.1497 127.242 8.09718 127.412 8.09724H128.598L126.152 14.3567C126.091 14.5112 125.986 14.6439 125.849 14.7374C125.711 14.831 125.549 14.881 125.383 14.8809H124.333L121.668 8.09713H122.854Z' fill='white'/%3E%3Cpath d='M135.085 14.5514C134.566 14.7616 133.513 15.0416 132.418 15.0416C130.496 15.0416 129.024 13.9345 129.024 11.4396C129.024 9.19701 130.451 7.99792 132.191 7.99792C134.338 7.99792 135.254 9.4378 135.158 11.3979C135.139 11.8029 134.786 12.0983 134.38 12.0983H130.679C130.763 13.1916 131.562 13.7662 132.615 13.7662C133.028 13.7662 133.462 13.7452 133.983 13.6481C134.535 13.545 135.085 13.9375 135.085 14.4985V14.5514ZM133.673 10.949C133.785 9.87621 133.061 9.28752 132.191 9.28752C131.321 9.28752 130.734 9.93979 130.679 10.9489L133.673 10.949Z' fill='white'/%3E%3Cpath d='M137.345 8.11122C137.497 8.11118 137.645 8.16229 137.765 8.25635C137.884 8.35041 137.969 8.48197 138.005 8.62993C138.566 8.20932 139.268 7.94303 139.759 7.94303C139.801 7.94303 140.068 7.94303 140.489 7.99913V8.7265C140.489 9.11748 140.15 9.4147 139.759 9.4147C139.31 9.4147 138.651 9.5829 138.131 9.8773V14.8951H136.462V8.11112L137.345 8.11122ZM156.6 14.0508V8.09104H155.769C155.314 8.09104 154.944 8.45999 154.944 8.9151V14.8748H155.775C156.23 14.8748 156.6 14.5058 156.6 14.0508ZM158.857 12.9447V9.34254H157.749V8.91912C157.749 8.46401 158.118 8.09506 158.574 8.09506H158.857V6.56739L160.499 6.10479V8.09506H161.986V8.51848C161.986 8.97359 161.617 9.34254 161.161 9.34254H160.499V12.7345C160.499 13.2566 160.795 13.44 161.177 13.503C161.626 13.5774 162 13.9024 162 14.3574V14.977C160.446 14.977 158.857 14.9086 158.857 12.9447ZM98.1929 10.1124C98.2033 6.94046 100.598 5.16809 102.895 5.16809C104.171 5.16809 105.342 5.44285 106.304 6.12953L105.914 6.6631C105.654 7.02011 105.16 7.16194 104.749 6.99949C104.169 6.7702 103.622 6.7218 103.215 6.7218C101.335 6.7218 99.9169 7.92849 99.9068 10.1123C99.9169 12.2959 101.335 13.5201 103.215 13.5201C103.622 13.5201 104.169 13.4717 104.749 13.2424C105.16 13.0799 105.654 13.2046 105.914 13.5615L106.304 14.0952C105.342 14.7819 104.171 15.0566 102.895 15.0566C100.598 15.0566 98.2033 13.2842 98.1929 10.1124ZM147.619 5.21768C148.074 5.21768 148.444 5.58663 148.444 6.04174V9.81968L151.82 5.58131C151.897 5.47733 151.997 5.39282 152.112 5.3346C152.227 5.27638 152.355 5.24607 152.484 5.24611H153.984L150.166 10.0615L153.984 14.8749H152.484C152.355 14.8749 152.227 14.8446 152.112 14.7864C151.997 14.7281 151.897 14.6436 151.82 14.5397L148.444 10.3025V14.0508C148.444 14.5059 148.074 14.8749 147.619 14.8749H146.746V5.21768H147.619Z' fill='white'/%3E%3Cpath d='M0.773438 6.5752H2.68066C3.56543 6.5752 4.2041 6.7041 4.59668 6.96191C4.99219 7.21973 5.18994 7.62695 5.18994 8.18359C5.18994 8.55859 5.09326 8.87061 4.8999 9.11963C4.70654 9.36865 4.42822 9.52539 4.06494 9.58984V9.63379C4.51611 9.71875 4.84717 9.88721 5.05811 10.1392C5.27197 10.3882 5.37891 10.7266 5.37891 11.1543C5.37891 11.7314 5.17676 12.1841 4.77246 12.5122C4.37109 12.8374 3.81152 13 3.09375 13H0.773438V6.5752ZM1.82373 9.22949H2.83447C3.27393 9.22949 3.59473 9.16064 3.79688 9.02295C3.99902 8.88232 4.1001 8.64502 4.1001 8.31104C4.1001 8.00928 3.99023 7.79102 3.77051 7.65625C3.55371 7.52148 3.20801 7.4541 2.7334 7.4541H1.82373V9.22949ZM1.82373 10.082V12.1167H2.93994C3.37939 12.1167 3.71045 12.0332 3.93311 11.8662C4.15869 11.6963 4.27148 11.4297 4.27148 11.0664C4.27148 10.7324 4.15723 10.4849 3.92871 10.3237C3.7002 10.1626 3.35303 10.082 2.88721 10.082H1.82373Z' fill='white'/%3E%3Cpath d='M13.011 6.5752V10.7324C13.011 11.207 12.9084 11.623 12.7034 11.9805C12.5012 12.335 12.2068 12.6089 11.8201 12.8022C11.4363 12.9927 10.9763 13.0879 10.4402 13.0879C9.6433 13.0879 9.02368 12.877 8.5813 12.4551C8.13892 12.0332 7.91772 11.4531 7.91772 10.7148V6.5752H8.9724V10.6401C8.9724 11.1704 9.09546 11.5615 9.34155 11.8135C9.58765 12.0654 9.96557 12.1914 10.4753 12.1914C11.4656 12.1914 11.9607 11.6714 11.9607 10.6313V6.5752H13.011Z' fill='white'/%3E%3Cpath d='M15.9146 13V6.5752H16.9649V13H15.9146Z' fill='white'/%3E%3Cpath d='M19.9255 13V6.5752H20.9758V12.0991H23.696V13H19.9255Z' fill='white'/%3E%3Cpath d='M28.2828 13H27.2325V7.47607H25.3428V6.5752H30.1724V7.47607H28.2828V13Z' fill='white'/%3E%3Cpath d='M41.9472 13H40.8046L39.7148 9.16796C39.6679 9.00097 39.6093 8.76074 39.539 8.44727C39.4687 8.13086 39.4262 7.91113 39.4116 7.78809C39.3823 7.97559 39.3339 8.21875 39.2665 8.51758C39.2021 8.81641 39.1479 9.03905 39.1039 9.18554L38.0405 13H36.8979L36.0673 9.7832L35.2236 6.5752H36.2958L37.2143 10.3193C37.3578 10.9199 37.4604 11.4502 37.5219 11.9102C37.5541 11.6611 37.6025 11.3828 37.6669 11.0752C37.7314 10.7676 37.79 10.5186 37.8427 10.3281L38.8886 6.5752H39.9301L41.0024 10.3457C41.1049 10.6943 41.2133 11.2158 41.3276 11.9102C41.3715 11.4912 41.477 10.958 41.644 10.3105L42.558 6.5752H43.6215L41.9472 13Z' fill='white'/%3E%3Cpath d='M45.7957 13V6.5752H46.846V13H45.7957Z' fill='white'/%3E%3Cpath d='M52.0258 13H50.9755V7.47607H49.0859V6.5752H53.9155V7.47607H52.0258V13Z' fill='white'/%3E%3Cpath d='M61.2312 13H60.1765V10.104H57.2146V13H56.1643V6.5752H57.2146V9.20312H60.1765V6.5752H61.2312V13Z' fill='white'/%3E%3C/svg%3E");
}
@-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
@keyframes formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
.formkit-form[data-uid="d2e88d98d6"] blockquote {
padding: 10px 20px;
margin: 0 0 20px;
border-left: 5px solid #e1e1e1;
}
.formkit-form[data-uid="d2e88d98d6"] {
border: 1px solid #e3e3e3;
max-width: 700px;
position: relative;
overflow: hidden;
margin: 0px 0px 15px 0;
padding: 5px 15px 5px 15px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-background {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: cover;
background-position: center;
opacity: 0.3;
}
.formkit-form[data-uid="d2e88d98d6"] [data-style="minimal"] {
width: 100%;
position: relative;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-header {
margin: 0 0 0 0;
text-align: center;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-subheader {
margin: 18px 0;
text-align: center;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-guarantee {
font-size: 13px;
margin: 0;
text-align: center;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-guarantee > p {
margin: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit-container {
margin-bottom: 0;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-fields {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
margin: 0 auto 0 auto;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-field {
min-width: 220px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-field,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit {
margin: 0 0 15px 0;
-webkit-flex: 1 0 100%;
-ms-flex: 1 0 100%;
flex: 1 0 100%;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"] {
margin-left: -5px;
margin-right: -5px;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-field,
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-submit {
margin: 0 5px 15px 5px;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-field {
-webkit-flex: 100 1 auto;
-ms-flex: 100 1 auto;
flex: 100 1 auto;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-submit {
-webkit-flex: 1 1 auto;
-ms-flex: 1 1 auto;
flex: 1 1 auto;
}
</style>
</form>
</div>
<p>Dzisiaj o hostingu naszej aplikacji. Ogarnęliśmy już bazę użytkowników (patrz lista artykułów), feature są jeszcze in-progress, bo “to się jeszcze dogada 🤦♂️” (patrz <a href="https://poznajazure.pl/champions-league/">specyfikacja</a>), to warto wspomnieć, jak możemy “postawić” naszą aplikację, tak by chociaż makiety UI dało się serwować. Sposobów jest naprawdę dużo i pewnie każdy może być “idealny” dla Ciebie.</p>
<h2 id="poznajmy-naszych-kandydatów">Poznajmy naszych kandydatów</h2>
<p>Zacznijmy od na 100% nie pełnej listy:</p>
<ul>
<li>Azure Storage + Azure CDN + … - idealne na statyczne strony, acz zrobienie i użycie certyfikatu dla własnej domeny tak banalne nie jest. Szczególnie, gdy chcemy przyspieszyć całość, używając Azure CDN. Ostatnio mierzył się z tym Tomasz Onyszko i efekt jego pracy dostępny jest na Twitter i w <a href="https://threadreaderapp.com/thread/1277618337753845760.html">Thread Reader App</a>. Przy okazji jak przejrzysz wątki poboczne, to zobaczysz inne propozycje, które znacząco ułatwiają taką konfigurację.</li>
<li>Azure Functions - wiadomo serverless, najnowsza miłość wszystkich. No dobra już nie taka “nowa”, ale nadal “brak” serwerów korci. Czy się da? No pewnie! Czy to najlepsza opcja? Tutaj klasyczna odpowiedź konsultanta, czyli “to zależy”. Moim zadaniem nie jest najlepszy sposób na hosting całej aplikacji. Ale już np: w połączeniu ze statyczna stroną da się zrobić całkiem fajne combo. Zarządzanie nim nie będzie już jednak takie proste. A CI/CD będzie interesującym wyzwaniem 😜</li>
<li>Azure SignalR + static web page + X - jak nie jesteś ze świata dotnet to małe wyjaśnienie. SignalR aktywne umożliwia “wypychanie” wiadomości do zarejestrowanych klientów na stronach w JavaScript. Czyli server-push. W wersji Azure nie musisz prawie o niczym myśleć, tylko zapłacić 😊 No dobra to jest małe oszustwo, bo coś musi się łączyć do tego Azure SignalR, żeby “dawać” mu dane do wypchnięcia. Może być to aplikacja w dotnet/NodeJS/Java/itd, czy też Azure Function. Czyli pomysł sam w sobie może i dobry, ale wymaga jeszcze większego kombinowania niż Azure Function, a problem sprowadza się do hostingu 😁</li>
<li>Virtual Machine - Windows z IIS lub Linux z Nginx. Można? Można. Dla wielu osób najbardziej naturalny wybór. Powiem więcej. Bardzo dużo deweloperów od tego rozwiązania zaczyna, bo są do niego przyzwyczajeni. Nie po to mamy jednak chmurę, żeby używać czystych VM prawda? Szczególnie że taką maszynę trzeba zabezpieczyć samemu, a to już nie jest taka prosta sprawa. Szczególnie za pierwszym razem 🤪</li>
<li>Azure Container Instances - nareszcie opcja z kontenerami. W teorii najprostszy sposób na wystawienie kontenera. który coś liczy, a potem jego “archiwizacja”. Czy będzie to pasowało dla strony chodzącej 24/7? Dobre pytanie prawda 🤔</li>
<li>Azure Kubernetes Service (AKS) - a co jak już hostować to po bandzie i statyczne na razie pliki dajemy na K8s. Wygląda to trochę jak armata na muchę, ale kto co lubi. Jest jednak hype, buzzwords i inne takie 🤪</li>
<li>Azure Web App w 3 odmianach, czyli wersja Windows, Linux oraz Docker (nawet z Docker Compose) - najbardziej klasyczne rozwiązanie do hostingu pojedynczej aplikacji. Aktualnie wspiera całkiem spory zestaw technologii wspieranych “natywnie” (m.in: dotnet, Java, Python, Ruby), a do tego mamy jeszcze Docker, więc możemy użyć wszystkiego 😊</li>
</ul>
<h2 id="czas-na-rosyjską-ruletkę">Czas na rosyjską ruletkę</h2>
<p>Teraz czas na usunięcie części opcji, czyli proces decyzyjny. Kolejność losowa:</p>
<ul>
<li>Static web page to raczej nie będzie, więc Azure Storage odpada. Acz cennikowo wyszłoby super 😁</li>
<li>Azure SignalR, jak zauważyłeś na pewno, sam w sobie nic nie daje. Oczywiście bardzo dobrze potrafi rozszerzyć istniejącą funkcjonalność o komunikacje od serwera do klienta, ale i tak potrzebujemy magicznej różdżki, która te dane wyprodukuje 🎩</li>
<li>Virtual machine - zupełnie nie. Tak jak pisałem to naturalny wybór, ale długofalowo ciężki w utrzymaniu. Jeżeli nie masz bardzo konkretnego powodu do użycia VMki (np: GPU) to ciężko w chmurze ten wybór uzasadnić. Oczywiście zarówno Ty jak i ja znamy firmy, w których to będzie jedyna opcja nie wymagająca załatwiania papierów w milionie departamentów☹️</li>
<li>Serverless, czyli Azure Function, korci prawda? Wszyscy o tym mówią, każdy chciałby spróbować, itd. Pamiętasz jednak wymagania? To ma być dla Ligii Mistrzów. Jak nie masz doświadczenia w serverless, to moim zdaniem nie jest to najlepszy, projekt, żeby zacząć, a dział PR może tego nie przeżyć 😏. Do tego dochodzi ustalenie kosztów dla zamawiającego. Z jednej strony super, bo w modelu hostowania serverless, jesteśmy wstanie podać dokładną kwotę per jedna sesja. Jednak ciężko to wyliczyć, nie mając dużego doświadczenia.</li>
<li>Co do Azure Container Instances to jest takie powiedzenie: “jeśli coś jest głupie ale działa, to wcale nie jest głupie”. Pewnie je słyszałeś. Głupie jest to powiedzenie i tyle 🤪 A na poważnie: zerknij w cennik (pamiętaj o ilości środowisk), poszukaj jak zrobić własną domenę i sam podejmij decyzję, czy jest to sposób w który chcesz wdrażać aplikację. Dodatkowa rada: pamiętaj o wdrożeniach typu “zero-downtime”</li>
<li>AKS to armata. Jak będą mikroserwisy na pewno warto wrócić do tematu, ale to chyba nie ten moment. Chyba, że naprawdę znamy k8s i do tego chcemy za pomocą np: KEDA załatwić sprawne autoskalowanie, czyli prawdopodobne w aplikacji nagłe skoki użycia (np: losowanie biletów, albo słynny tweet męża autorki “health plan by ann”). Do tego, żeby sprawnie operować Kubernetes, to trzeba go znać i to naprawdę nieźle. Czas nas bardzo goni, więc musisz podjąć decyzję czy “stać” Cię na inwestycję w tym momencie.</li>
<li>Azure Web Apps - niby pasuje idealne, ale tanio nie jest. Za 3.5GB RAM w wersji standard, która dodaje nam deployment slot, umożliwiające wdrażanie aplikacji bez przerw dla klientów trzeba zapłacić miesięcznie prawie 550 zł. Dużo prawda?</li>
</ul>
<p>No to co nam zostało? No właśnie, wszystkie opcje wykluczyłem, nic nie zostało i tu właśnie wkraczasz Ty, czyli “the Azure ninja”, ubrany cały na biało! Pamiętasz swoją plakietkę na drzwiach? No właśnie. Czas działać i pisać! Zachęcam Cię do sprawdzenia chociaż jeden z powyższych opcji. Ja już napisałem kilka plusów i minusów, ale ciekawi jesteśmy Twojej opinii.
Zapraszamy Cię do nas na listę mailingową (poniżej zapisy) i na Gitter, gdzie omawiamy dalsze części, czyli na <a href="https://poznajazure.pl/">https://poznajazure.pl/</a></p>
<script src="https://f.convertkit.com/ckjs/ck.5.js"></script>
<form action="https://app.convertkit.com/forms/1684572/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="1684572" data-uid="cea5d3079d" data-format="inline" data-version="5" data-options="{"settings":{"after_subscribe":{"action":"redirect","success_message":"Success! Now check your email to confirm your subscription.","redirect_url":"https://poznajAzure.pl/confirmSubscription.html"},"analytics":{"google":null,"facebook":null,"segment":null,"pinterest":null},"modal":{"trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"powered_by":{"show":true,"url":"https://convertkit.com?utm_source=dynamic&utm_medium=referral&utm_campaign=poweredby&utm_content=form"},"recaptcha":{"enabled":false},"return_visitor":{"action":"show","custom_content":""},"slide_in":{"display_in":"bottom_right","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"sticky_bar":{"display_in":"top","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15}},"version":"5"}" min-width="400 500 600 700 800" style="background-color: rgb(255, 255, 255); border-radius: 6px">
<div data-style="full">
<div data-element="column" class="formkit-column" style="background-color: rgb(249, 250, 251)">
<div class="formkit-background" style="opacity: 0.3"></div>
<div class="formkit-header" data-element="header" style="color: rgb(77, 77, 77); font-size: 20px; font-weight: 700">
<h1>Jeżeli interesuje Cię</h1>
</div>
<div class="formkit-subheader" data-element="subheader" style="color: rgb(104, 104, 104); font-size: 15px">
<span>- budowa i hostowanie aplikacji w Azure</span>
<p style="margin-bottom: 0px;">- HA usług</p>
<p style="margin-bottom: 0px;">- wydajność i obsługa baz danych, by było dobrze i tanio</p>
<p style="margin-bottom: 0px;">- diagnostyka i logowanie</p>
<p style="margin-bottom: 0px;">- szybkie wdrażanie i testowanie</p>
<p style="margin-bottom: 0px;"><strong>to trafiłeś idealnie, bo nas też!</strong></p>
</div>
</div>
<div data-element="column" class="formkit-column">
<ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul>
<div data-element="fields" class="seva-fields formkit-fields">
<div class="formkit-field">
<input class="formkit-input" name="email_address" aria-label="Twój email" placeholder="Twój email" required="" type="email" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<div class="formkit-field">
<input class="formkit-input" aria-label="Imię lub nick" name="fields[first_name]" placeholder="Imię lub nick" type="text" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<button data-element="submit" class="formkit-submit formkit-submit" style="
color: rgb(255, 255, 255);
background-color: rgb(22, 119, 190);
border-radius: 24px;
font-weight: 700;
">
<div class="formkit-spinner">
<div></div>
<div></div>
<div></div>
</div>
<span>Subscribe</span>
</button>
</div>
<div class="formkit-guarantee" data-element="guarantee" style="color: rgb(77, 77, 77); font-size: 13px; font-weight: 400">
<p>
<span style="color: rgb(59, 59, 59)">Polityka prywatności - </span><a href="https://poznajazure.pl/policy.html" target="_blank" rel="noopener noreferrer">więcej</a>
</p>
</div>
</div>
</div>
<style>
.formkit-form[data-uid="cea5d3079d"] * {
box-sizing: border-box;
}
.formkit-form[data-uid="cea5d3079d"] {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.formkit-form[data-uid="cea5d3079d"] legend {
border: none;
font-size: inherit;
margin-bottom: 10px;
padding: 0;
position: relative;
display: table;
}
.formkit-form[data-uid="cea5d3079d"] fieldset {
border: 0;
padding: 0.01em 0 0 0;
margin: 0;
min-width: 0;
}
.formkit-form[data-uid="cea5d3079d"]
body:not(:-moz-handler-blocked)
fieldset {
display: table-cell;
}
.formkit-form[data-uid="cea5d3079d"] h1,
.formkit-form[data-uid="cea5d3079d"] h2,
.formkit-form[data-uid="cea5d3079d"] h3,
.formkit-form[data-uid="cea5d3079d"] h4,
.formkit-form[data-uid="cea5d3079d"] h5,
.formkit-form[data-uid="cea5d3079d"] h6 {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="cea5d3079d"] p {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="cea5d3079d"] ol:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] ul:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] blockquote:not([template-default]) {
text-align: left;
}
.formkit-form[data-uid="cea5d3079d"] p:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] hr:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] blockquote:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] ol:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] ul:not([template-default]) {
color: inherit;
font-style: initial;
}
.formkit-form[data-uid="cea5d3079d"] .ordered-list,
.formkit-form[data-uid="cea5d3079d"] .unordered-list {
list-style-position: outside !important;
padding-left: 1em;
}
.formkit-form[data-uid="cea5d3079d"] .list-item {
padding-left: 0;
}
.formkit-form[data-uid="cea5d3079d"][data-format="modal"] {
display: none;
}
.formkit-form[data-uid="cea5d3079d"][data-format="slide in"] {
display: none;
}
.formkit-form[data-uid="cea5d3079d"][data-format="sticky bar"] {
display: none;
}
.formkit-sticky-bar
.formkit-form[data-uid="cea5d3079d"][data-format="sticky bar"] {
display: block;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input,
.formkit-form[data-uid="cea5d3079d"] .formkit-select,
.formkit-form[data-uid="cea5d3079d"] .formkit-checkboxes {
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit {
border: 0;
border-radius: 5px;
color: #ffffff;
cursor: pointer;
display: inline-block;
text-align: center;
font-size: 15px;
font-weight: 500;
cursor: pointer;
margin-bottom: 15px;
overflow: hidden;
padding: 0;
position: relative;
vertical-align: middle;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button:hover,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:hover,
.formkit-form[data-uid="cea5d3079d"] .formkit-button:focus,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:focus {
outline: none;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button:hover > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:hover > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-button:focus > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:focus > span {
background-color: rgba(0, 0, 0, 0.1);
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit > span {
display: block;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
padding: 12px 24px;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input {
background: #ffffff;
font-size: 15px;
padding: 12px;
border: 1px solid #e3e3e3;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
line-height: 1.4;
margin: 0;
-webkit-transition: border-color ease-out 300ms;
transition: border-color ease-out 300ms;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input:focus {
outline: none;
border-color: #1677be;
-webkit-transition: border-color ease 300ms;
transition: border-color ease 300ms;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-input::-webkit-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input::-moz-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input:-ms-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input::placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"] {
position: relative;
display: inline-block;
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"]::before {
content: "";
top: calc(50% - 2.5px);
right: 10px;
position: absolute;
pointer-events: none;
border-color: #4f4f4f transparent transparent transparent;
border-style: solid;
border-width: 6px 6px 0 6px;
height: 0;
width: 0;
z-index: 999;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"] select {
height: auto;
width: 100%;
cursor: pointer;
color: #333333;
line-height: 1.4;
margin-bottom: 0;
padding: 0 6px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
font-size: 15px;
padding: 12px;
padding-right: 25px;
border: 1px solid #e3e3e3;
background: #ffffff;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"] select:focus {
outline: none;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="checkboxes"] {
text-align: left;
margin: 0;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"] {
margin-bottom: 10px;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
* {
cursor: pointer;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]:last-of-type {
margin-bottom: 0;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"] {
display: none;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]
+ label::after {
content: none;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::after {
border-color: #ffffff;
content: "";
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::before {
background: #10bf7a;
border-color: #10bf7a;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label {
position: relative;
display: inline-block;
padding-left: 28px;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before,
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
position: absolute;
content: "";
display: inline-block;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before {
height: 16px;
width: 16px;
border: 1px solid #e3e3e3;
background: #ffffff;
left: 0px;
top: 3px;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
height: 4px;
width: 8px;
border-left: 2px solid #4d4d4d;
border-bottom: 2px solid #4d4d4d;
-webkit-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
transform: rotate(-45deg);
left: 4px;
top: 8px;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert {
background: #f9fafb;
border: 1px solid #e3e3e3;
border-radius: 5px;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
list-style: none;
margin: 25px auto;
padding: 12px;
text-align: center;
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert:empty {
display: none;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert-success {
background: #d3fbeb;
border-color: #10bf7a;
color: #0c905c;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert-error {
background: #fde8e2;
border-color: #f2643b;
color: #ea4110;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
height: 0px;
width: 0px;
margin: 0 auto;
position: absolute;
top: 0;
left: 0;
right: 0;
width: 0px;
overflow: hidden;
text-align: center;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner > div {
margin: auto;
width: 12px;
height: 12px;
background-color: #fff;
opacity: 0.3;
border-radius: 100%;
display: inline-block;
-webkit-animation: formkit-bouncedelay-formkit-form-data-uid-cea5d3079d-
1.4s infinite ease-in-out both;
animation: formkit-bouncedelay-formkit-form-data-uid-cea5d3079d- 1.4s
infinite ease-in-out both;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner > div:nth-child(1) {
-webkit-animation-delay: -0.32s;
animation-delay: -0.32s;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner > div:nth-child(2) {
-webkit-animation-delay: -0.16s;
animation-delay: -0.16s;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-submit[data-active]
.formkit-spinner {
opacity: 1;
height: 100%;
width: 50px;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-submit[data-active]
.formkit-spinner
~ span {
opacity: 0;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit-container {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
width: 100%;
z-index: 5;
margin: 10px 0;
position: relative;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit-container[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-powered-by-convertkit {
-webkit-align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
background-color: #ffffff;
border: 1px solid #dce1e5;
border-radius: 4px;
color: #373f45;
cursor: pointer;
display: block;
height: 36px;
margin: 0 auto;
opacity: 0.95;
padding: 0;
-webkit-text-decoration: none;
text-decoration: none;
text-indent: 100%;
-webkit-transition: ease-in-out all 200ms;
transition: ease-in-out all 200ms;
white-space: nowrap;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
width: 190px;
background-repeat: no-repeat;
background-position: center;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-powered-by-convertkit:hover,
.formkit-form[data-uid="cea5d3079d"] .formkit-powered-by-convertkit:focus {
background-color: #ffffff;
-webkit-transform: scale(1.025) perspective(1px);
-ms-transform: scale(1.025) perspective(1px);
transform: scale(1.025) perspective(1px);
opacity: 1;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit[data-variant="dark"],
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit[data-variant="light"] {
background-color: transparent;
border-color: transparent;
width: 166px;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit[data-variant="light"] {
color: #ffffff;
}
@-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-cea5d3079d- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
@keyframes formkit-bouncedelay-formkit-form-data-uid-cea5d3079d- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
.formkit-form[data-uid="cea5d3079d"] blockquote {
padding: 10px 20px;
margin: 0 0 20px;
border-left: 5px solid #e1e1e1;
}
.formkit-form[data-uid="cea5d3079d"] {
box-shadow: 0 2px 15px 0 rgba(210, 214, 220, 0.5);
max-width: 700px;
overflow: hidden;
}
.formkit-form[data-uid="cea5d3079d"] [data-style="full"] {
width: 100%;
display: block;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-header {
margin-top: 0;
margin-bottom: 20px;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-subheader {
margin: 15px 0;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-column {
padding: 20px;
position: relative;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-column:nth-child(2) {
border-top: 1px solid #e9ecef;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-background {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: cover;
background-position: center;
opacity: 0.5;
z-index: 1;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-header,
.formkit-form[data-uid="cea5d3079d"] .formkit-subheader,
.formkit-form[data-uid="cea5d3079d"] .formkit-image {
z-index: 2;
position: relative;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-field {
margin: 0 0 15px 0;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit {
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-guarantee {
font-size: 13px;
margin: 0 0 15px 0;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-guarantee > p {
margin: 0;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit-container {
margin-bottom: 0;
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"] [data-style="full"],
.formkit-form[data-uid="cea5d3079d"][min-width~="700"] [data-style="full"],
.formkit-form[data-uid="cea5d3079d"][min-width~="800"] [data-style="full"] {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"] .formkit-submit,
.formkit-form[data-uid="cea5d3079d"][min-width~="700"] .formkit-submit,
.formkit-form[data-uid="cea5d3079d"][min-width~="800"] .formkit-submit {
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"] .formkit-column,
.formkit-form[data-uid="cea5d3079d"][min-width~="700"] .formkit-column,
.formkit-form[data-uid="cea5d3079d"][min-width~="800"] .formkit-column {
padding: 0px;
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"]
.formkit-column:nth-child(2),
.formkit-form[data-uid="cea5d3079d"][min-width~="700"]
.formkit-column:nth-child(2),
.formkit-form[data-uid="cea5d3079d"][min-width~="800"]
.formkit-column:nth-child(2) {
border-top: none;
}
</style>
</form>Poznaj AzureArtykuł jest częścią, większej całości. W serii znajdują się: Część 1 - Liga Mistrzów i konta użytkowników Część 2 - Liga Mistrzów i 7 sposobów na hosting Część 3 - Liga Mistrzów i bazy danych Część 4 - Liga Mistrzów i brakujący element Część 5 - Liga Mistrzów i diagnostyka - TODO Nie chcesz czekać? Zapisz się Polityka prywatności - więcej​Liga Mistrzów i konta użytkowników!2020-09-21T13:34:30+00:002020-09-21T13:34:30+00:00https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-konta-uzytkownikow<p>Wyobraź sobie następującą sytuację. Pracujesz sobie w pewnej firmie i na drzwiach masz tabliczkę (do wyboru): “senior architekt”, “główny projektant” albo po prostu “Ten-Którego-Imienia-Nie-Wolno-Wymawiać” 😉. Przybiega do Ciebie szef wszystkich szefów, czyli jak wiadomo Krzysztof Jarzyna ze Szczecina i zaczyna monolog z następującym tekstem: “Nasi handlowcy odnieśli wczoraj ZAJE…ISTY sukces. Robimy apkę dla do losowania biletów na finały Ligi Mistrzów!”. Ty patrzysz nerwowo w kalendarz, szybko wrzucasz w Google potwierdzenie terminu i już wiesz - mamy tylko miesiąc na dostarczenie aplikacji.</p>
<h2 id="wymagania">Wymagania</h2>
<p>Co udało się zebrać naszym “specjalistom” od sprzedaży:</p>
<ul>
<li>Docelowa ilość użytkowników to 5k-50k no chyba, że mąż Anny Lewandowskiej z “healthy plan by ann” zrobi retweet to może być więcej</li>
<li>Ważnym wydarzeniem będzie losowanie na żywo i sprawdzanie wyników przez uczestników</li>
<li>Mogą być różne sposoby zdobycia biletów: quizy, losowania, inne - to się jeszcze dogada 🤦♂️🤦♀️</li>
<li>Aplikacja musi działać już za miesiąc, ma obsłużyć tegoroczne finały i może przyszłe</li>
<li>Bardzo ważny jest podany z góry koszt utrzymania aplikacji.</li>
</ul>
<p>W tym miejscu pozwolę sobie na krótką listę elementów do uwzględnienia:</p>
<ul>
<li>Hosting - pamiętaj o tym, że cena robi różnicę, musi się skalować i prawie na raz mogą wejść wszyscy użytkownicy (moment losowania). Do tego dochodzi HA!</li>
<li>Bazę danych - musi obsługiwać skoki w użyciu (patrz punkt wyżej)</li>
<li>Dane użytkowników, to BARDZO wrażliwa część. Część z nich może chcieć mieć MFA!</li>
<li>SPA czy nie-SPA to też może mieć znaczenie 😁</li>
</ul>
<h2 id="tlwr">TL;WR;</h2>
<p>Powyższe zadanie jest częścią inicjatywy Poznaj Azure, a poniżej masz pierwszą część rozwiązania dotyczącej bazy pod konta użytkowników. Aktualnie do naszych czytelników poszło już 8 maili, które dostaniesz pod zapisaniu się.</p>
<p>Kolejne części są publikowane raz na dwa tygodnie, tak byś Ty miał szansę zastanowić się nad rozwiązaniem, a także byśmy wspólnie mieli czas na dyskusje na Gitter.</p>
<p>Aktualnie ukazały się:</p>
<ul>
<li>Część 1 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-konta-uzytkownikow/">Liga Mistrzów i konta użytkowników</a></li>
<li>Część 2 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-7-sposobow-na-hosting/">Liga Mistrzów i 7 sposobów na hosting</a></li>
<li>Część 3 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-bazy-danych/">Liga Mistrzów i bazy danych</a></li>
<li>Część 4 - <a href="https://poznajazure.pl/blog/champions-league/liga-mistrzow-i-brakujacy-element/">Liga Mistrzów i brakujący element</a></li>
<li>Część 5 - Liga Mistrzów i diagnostyka - TODO</li>
</ul>
<p>Wystarczy zapisać się poniżej, na <a href="https://poznajazure.pl/">https://poznajazure.pl/</a>, albo na samym dole jak skończysz czytać 😁</p>
<div>
<script src="https://f.convertkit.com/ckjs/ck.5.js"></script>
<form action="https://app.convertkit.com/forms/1689392/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="1689392" data-uid="d2e88d98d6" data-format="inline" data-version="5" data-options="{"settings":{"after_subscribe":{"action":"redirect","success_message":"Success! Now check your email to confirm your subscription.","redirect_url":"https://poznajAzure.pl/confirmSubscription.html"},"analytics":{"google":null,"facebook":null,"segment":null,"pinterest":null},"modal":{"trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"powered_by":{"show":true,"url":"https://convertkit.com?utm_source=dynamic&utm_medium=referral&utm_campaign=poweredby&utm_content=form"},"recaptcha":{"enabled":false},"return_visitor":{"action":"show","custom_content":""},"slide_in":{"display_in":"bottom_right","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"sticky_bar":{"display_in":"top","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15}},"version":"5"}" min-width="400 500 600 700 800" style="background-color: rgb(255, 255, 255); border-radius: 6px">
<div class="formkit-background" style="opacity: 0.3"></div>
<div data-style="minimal">
<div class="formkit-header" data-element="header" style="color: rgb(77, 77, 77); font-size: 20px; font-weight: 700">
<h1>Nie chcesz czekać?</h1>
</div>
<ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul>
<div data-element="fields" data-stacked="true" class="seva-fields formkit-fields">
<div class="formkit-field">
<input class="formkit-input" name="email_address" aria-label="Twój email" placeholder="Twój email" required="" type="email" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<div class="formkit-field">
<input class="formkit-input" aria-label="Imię lub nick" name="fields[first_name]" placeholder="Imię lub nick" type="text" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<button data-element="submit" class="formkit-submit formkit-submit" style="
color: rgb(255, 255, 255);
background-color: rgb(22, 119, 190);
border-radius: 24px;
font-weight: 700;
">
<div class="formkit-spinner">
<div></div>
<div></div>
<div></div>
</div>
<span>Zapisz się</span>
</button>
</div>
<div class="formkit-guarantee" data-element="guarantee" style="color: rgb(77, 77, 77); font-size: 13px; font-weight: 400">
<p>
<span style="color: rgb(59, 59, 59)">Polityka prywatności - </span><a href="https://poznajazure.pl/policy.html" target="_blank" rel="noopener noreferrer">więcej</a>​
</p>
</div>
</div>
<style>
.formkit-form[data-uid="d2e88d98d6"] * {
box-sizing: border-box;
}
.formkit-form[data-uid="d2e88d98d6"] {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.formkit-form[data-uid="d2e88d98d6"] legend {
border: none;
font-size: inherit;
margin-bottom: 10px;
padding: 0;
position: relative;
display: table;
}
.formkit-form[data-uid="d2e88d98d6"] fieldset {
border: 0;
padding: 0.01em 0 0 0;
margin: 0;
min-width: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
body:not(:-moz-handler-blocked)
fieldset {
display: table-cell;
}
.formkit-form[data-uid="d2e88d98d6"] h1,
.formkit-form[data-uid="d2e88d98d6"] h2,
.formkit-form[data-uid="d2e88d98d6"] h3,
.formkit-form[data-uid="d2e88d98d6"] h4,
.formkit-form[data-uid="d2e88d98d6"] h5,
.formkit-form[data-uid="d2e88d98d6"] h6 {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="d2e88d98d6"] p {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="d2e88d98d6"] ol:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] ul:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] blockquote:not([template-default]) {
text-align: left;
}
.formkit-form[data-uid="d2e88d98d6"] p:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] hr:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] blockquote:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] ol:not([template-default]),
.formkit-form[data-uid="d2e88d98d6"] ul:not([template-default]) {
color: inherit;
font-style: initial;
}
.formkit-form[data-uid="d2e88d98d6"] .ordered-list,
.formkit-form[data-uid="d2e88d98d6"] .unordered-list {
list-style-position: outside !important;
padding-left: 0.5em;
}
.formkit-form[data-uid="d2e88d98d6"] .list-item {
padding-left: 0;
}
.formkit-form[data-uid="d2e88d98d6"][data-format="modal"] {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"][data-format="slide in"] {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"][data-format="sticky bar"] {
display: none;
}
.formkit-sticky-bar
.formkit-form[data-uid="d2e88d98d6"][data-format="sticky bar"] {
display: block;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input,
.formkit-form[data-uid="d2e88d98d6"] .formkit-select,
.formkit-form[data-uid="d2e88d98d6"] .formkit-checkboxes {
width: 100%;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit {
border: 0;
border-radius: 5px;
color: #ffffff;
cursor: pointer;
display: inline-block;
text-align: center;
font-size: 15px;
font-weight: 500;
cursor: pointer;
margin-bottom: 15px;
overflow: hidden;
padding: 0;
position: relative;
vertical-align: middle;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:hover,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:hover,
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:focus,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:focus {
outline: none;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:hover > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:hover > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-button:focus > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit:focus > span {
background-color: rgba(0, 0, 0, 0.1);
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-button > span,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit > span {
display: block;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
padding: 12px 24px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input {
background: #ffffff;
font-size: 15px;
padding: 12px;
border: 1px solid #e3e3e3;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
line-height: 1.4;
margin: 0;
-webkit-transition: border-color ease-out 300ms;
transition: border-color ease-out 300ms;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input:focus {
outline: none;
border-color: #1677be;
-webkit-transition: border-color ease 300ms;
transition: border-color ease 300ms;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-input::-webkit-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input::-moz-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-input:-ms-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-input::placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="dropdown"] {
position: relative;
display: inline-block;
width: 100%;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="dropdown"]::before {
content: "";
top: calc(50% - 2.5px);
right: 10px;
position: absolute;
pointer-events: none;
border-color: #4f4f4f transparent transparent transparent;
border-style: solid;
border-width: 6px 6px 0 6px;
height: 0;
width: 0;
z-index: 999;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="dropdown"] select {
height: auto;
width: 100%;
cursor: pointer;
color: #333333;
line-height: 1.4;
margin-bottom: 0;
padding: 0 6px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
font-size: 15px;
padding: 12px;
padding-right: 25px;
border: 1px solid #e3e3e3;
background: #ffffff;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="dropdown"]
select:focus {
outline: none;
}
.formkit-form[data-uid="d2e88d98d6"] [data-group="checkboxes"] {
text-align: left;
margin: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"] {
margin-bottom: 10px;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
* {
cursor: pointer;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]:last-of-type {
margin-bottom: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"] {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]
+ label::after {
content: none;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::after {
border-color: #ffffff;
content: "";
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::before {
background: #10bf7a;
border-color: #10bf7a;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label {
position: relative;
display: inline-block;
padding-left: 28px;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before,
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
position: absolute;
content: "";
display: inline-block;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before {
height: 16px;
width: 16px;
border: 1px solid #e3e3e3;
background: #ffffff;
left: 0px;
top: 3px;
}
.formkit-form[data-uid="d2e88d98d6"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
height: 4px;
width: 8px;
border-left: 2px solid #4d4d4d;
border-bottom: 2px solid #4d4d4d;
-webkit-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
transform: rotate(-45deg);
left: 4px;
top: 8px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert {
background: #f9fafb;
border: 1px solid #e3e3e3;
border-radius: 5px;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
list-style: none;
margin: 25px auto;
padding: 12px;
text-align: center;
width: 100%;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert:empty {
display: none;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert-success {
background: #d3fbeb;
border-color: #10bf7a;
color: #0c905c;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-alert-error {
background: #fde8e2;
border-color: #f2643b;
color: #ea4110;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
height: 0px;
width: 0px;
margin: 0 auto;
position: absolute;
top: 0;
left: 0;
right: 0;
width: 0px;
overflow: hidden;
text-align: center;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner > div {
margin: auto;
width: 12px;
height: 12px;
background-color: #fff;
opacity: 0.3;
border-radius: 100%;
display: inline-block;
-webkit-animation: formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6-
1.4s infinite ease-in-out both;
animation: formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6- 1.4s
infinite ease-in-out both;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner > div:nth-child(1) {
-webkit-animation-delay: -0.32s;
animation-delay: -0.32s;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-spinner > div:nth-child(2) {
-webkit-animation-delay: -0.16s;
animation-delay: -0.16s;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-submit[data-active]
.formkit-spinner {
opacity: 1;
height: 100%;
width: 50px;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-submit[data-active]
.formkit-spinner
~ span {
opacity: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit-container {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
width: 100%;
z-index: 5;
margin: 10px 0;
position: relative;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit-container[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-powered-by-convertkit {
-webkit-align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
background-color: #ffffff;
border: 1px solid #dce1e5;
border-radius: 4px;
color: #373f45;
cursor: pointer;
display: block;
height: 36px;
margin: 0 auto;
opacity: 0.95;
padding: 0;
-webkit-text-decoration: none;
text-decoration: none;
text-indent: 100%;
-webkit-transition: ease-in-out all 200ms;
transition: ease-in-out all 200ms;
white-space: nowrap;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
width: 190px;
background-repeat: no-repeat;
background-position: center;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='162' height='20' viewBox='0 0 162 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M83.0561 15.2457C86.675 15.2457 89.4722 12.5154 89.4722 9.14749C89.4722 5.99211 86.8443 4.06563 85.1038 4.06563C82.6801 4.06563 80.7373 5.76407 80.4605 8.28551C80.4092 8.75244 80.0387 9.14403 79.5686 9.14069C78.7871 9.13509 77.6507 9.12841 76.9314 9.13092C76.6217 9.13199 76.3658 8.88106 76.381 8.57196C76.4895 6.38513 77.2218 4.3404 78.618 2.76974C80.1695 1.02445 82.4289 0 85.1038 0C89.5979 0 93.8406 4.07791 93.8406 9.14749C93.8406 14.7608 89.1832 19.3113 83.1517 19.3113C78.8502 19.3113 74.5179 16.5041 73.0053 12.5795C72.9999 12.565 72.9986 12.5492 73.0015 12.534C73.0218 12.4179 73.0617 12.3118 73.1011 12.2074C73.1583 12.0555 73.2143 11.907 73.2062 11.7359L73.18 11.1892C73.174 11.0569 73.2075 10.9258 73.2764 10.8127C73.3452 10.6995 73.4463 10.6094 73.5666 10.554L73.7852 10.4523C73.9077 10.3957 74.0148 10.3105 74.0976 10.204C74.1803 10.0974 74.2363 9.97252 74.2608 9.83983C74.3341 9.43894 74.6865 9.14749 75.0979 9.14749C75.7404 9.14749 76.299 9.57412 76.5088 10.1806C77.5188 13.1 79.1245 15.2457 83.0561 15.2457Z' fill='%23373F45'/%3E%3Cpath d='M155.758 6.91365C155.028 6.91365 154.804 6.47916 154.804 5.98857C154.804 5.46997 154.986 5.06348 155.758 5.06348C156.53 5.06348 156.712 5.46997 156.712 5.98857C156.712 6.47905 156.516 6.91365 155.758 6.91365ZM142.441 12.9304V9.32833L141.415 9.32323V8.90392C141.415 8.44719 141.786 8.07758 142.244 8.07986L142.441 8.08095V6.55306L144.082 6.09057V8.08073H145.569V8.50416C145.569 8.61242 145.548 8.71961 145.506 8.81961C145.465 8.91961 145.404 9.01047 145.328 9.08699C145.251 9.16351 145.16 9.2242 145.06 9.26559C144.96 9.30698 144.853 9.32826 144.745 9.32822H144.082V12.7201C144.082 13.2423 144.378 13.4256 144.76 13.4887C145.209 13.5629 145.583 13.888 145.583 14.343V14.9626C144.029 14.9626 142.441 14.8942 142.441 12.9304Z' fill='%23373F45'/%3E%3Cpath d='M110.058 7.92554C108.417 7.88344 106.396 8.92062 106.396 11.5137C106.396 14.0646 108.417 15.0738 110.058 15.0318C111.742 15.0738 113.748 14.0646 113.748 11.5137C113.748 8.92062 111.742 7.88344 110.058 7.92554ZM110.07 13.7586C108.878 13.7586 108.032 12.8905 108.032 11.461C108.032 10.1013 108.878 9.20569 110.071 9.20569C111.263 9.20569 112.101 10.0995 112.101 11.459C112.101 12.8887 111.263 13.7586 110.07 13.7586Z' fill='%23373F45'/%3E%3Cpath d='M118.06 7.94098C119.491 7.94098 120.978 8.33337 120.978 11.1366V14.893H120.063C119.608 14.893 119.238 14.524 119.238 14.0689V10.9965C119.238 9.66506 118.747 9.16047 117.891 9.16047C117.414 9.16047 116.797 9.52486 116.502 9.81915V14.069C116.502 14.1773 116.481 14.2845 116.44 14.3845C116.398 14.4845 116.337 14.5753 116.261 14.6519C116.184 14.7284 116.093 14.7891 115.993 14.8305C115.893 14.8719 115.786 14.8931 115.678 14.8931H114.847V8.10918H115.773C115.932 8.10914 116.087 8.16315 116.212 8.26242C116.337 8.36168 116.424 8.50033 116.46 8.65577C116.881 8.19328 117.428 7.94098 118.06 7.94098ZM122.854 8.09713C123.024 8.09708 123.19 8.1496 123.329 8.2475C123.468 8.34541 123.574 8.48391 123.631 8.64405L125.133 12.8486L126.635 8.64415C126.692 8.48402 126.798 8.34551 126.937 8.2476C127.076 8.1497 127.242 8.09718 127.412 8.09724H128.598L126.152 14.3567C126.091 14.5112 125.986 14.6439 125.849 14.7374C125.711 14.831 125.549 14.881 125.383 14.8809H124.333L121.668 8.09713H122.854Z' fill='%23373F45'/%3E%3Cpath d='M135.085 14.5514C134.566 14.7616 133.513 15.0416 132.418 15.0416C130.496 15.0416 129.024 13.9345 129.024 11.4396C129.024 9.19701 130.451 7.99792 132.191 7.99792C134.338 7.99792 135.254 9.4378 135.158 11.3979C135.139 11.8029 134.786 12.0983 134.38 12.0983H130.679C130.763 13.1916 131.562 13.7662 132.615 13.7662C133.028 13.7662 133.462 13.7452 133.983 13.6481C134.535 13.545 135.085 13.9375 135.085 14.4985V14.5514ZM133.673 10.949C133.785 9.87621 133.061 9.28752 132.191 9.28752C131.321 9.28752 130.734 9.93979 130.679 10.9489L133.673 10.949Z' fill='%23373F45'/%3E%3Cpath d='M137.345 8.11122C137.497 8.11118 137.645 8.16229 137.765 8.25635C137.884 8.35041 137.969 8.48197 138.005 8.62993C138.566 8.20932 139.268 7.94303 139.759 7.94303C139.801 7.94303 140.068 7.94303 140.489 7.99913V8.7265C140.489 9.11748 140.15 9.4147 139.759 9.4147C139.31 9.4147 138.651 9.5829 138.131 9.8773V14.8951H136.462V8.11112L137.345 8.11122ZM156.6 14.0508V8.09104H155.769C155.314 8.09104 154.944 8.45999 154.944 8.9151V14.8748H155.775C156.23 14.8748 156.6 14.5058 156.6 14.0508ZM158.857 12.9447V9.34254H157.749V8.91912C157.749 8.46401 158.118 8.09506 158.574 8.09506H158.857V6.56739L160.499 6.10479V8.09506H161.986V8.51848C161.986 8.97359 161.617 9.34254 161.161 9.34254H160.499V12.7345C160.499 13.2566 160.795 13.44 161.177 13.503C161.626 13.5774 162 13.9024 162 14.3574V14.977C160.446 14.977 158.857 14.9086 158.857 12.9447ZM98.1929 10.1124C98.2033 6.94046 100.598 5.16809 102.895 5.16809C104.171 5.16809 105.342 5.44285 106.304 6.12953L105.914 6.6631C105.654 7.02011 105.16 7.16194 104.749 6.99949C104.169 6.7702 103.622 6.7218 103.215 6.7218C101.335 6.7218 99.9169 7.92849 99.9068 10.1123C99.9169 12.2959 101.335 13.5201 103.215 13.5201C103.622 13.5201 104.169 13.4717 104.749 13.2424C105.16 13.0799 105.654 13.2046 105.914 13.5615L106.304 14.0952C105.342 14.7819 104.171 15.0566 102.895 15.0566C100.598 15.0566 98.2033 13.2842 98.1929 10.1124ZM147.619 5.21768C148.074 5.21768 148.444 5.58663 148.444 6.04174V9.81968L151.82 5.58131C151.897 5.47733 151.997 5.39282 152.112 5.3346C152.227 5.27638 152.355 5.24607 152.484 5.24611H153.984L150.166 10.0615L153.984 14.8749H152.484C152.355 14.8749 152.227 14.8446 152.112 14.7864C151.997 14.7281 151.897 14.6436 151.82 14.5397L148.444 10.3025V14.0508C148.444 14.5059 148.074 14.8749 147.619 14.8749H146.746V5.21768H147.619Z' fill='%23373F45'/%3E%3Cpath d='M0.773438 6.5752H2.68066C3.56543 6.5752 4.2041 6.7041 4.59668 6.96191C4.99219 7.21973 5.18994 7.62695 5.18994 8.18359C5.18994 8.55859 5.09326 8.87061 4.8999 9.11963C4.70654 9.36865 4.42822 9.52539 4.06494 9.58984V9.63379C4.51611 9.71875 4.84717 9.88721 5.05811 10.1392C5.27197 10.3882 5.37891 10.7266 5.37891 11.1543C5.37891 11.7314 5.17676 12.1841 4.77246 12.5122C4.37109 12.8374 3.81152 13 3.09375 13H0.773438V6.5752ZM1.82373 9.22949H2.83447C3.27393 9.22949 3.59473 9.16064 3.79688 9.02295C3.99902 8.88232 4.1001 8.64502 4.1001 8.31104C4.1001 8.00928 3.99023 7.79102 3.77051 7.65625C3.55371 7.52148 3.20801 7.4541 2.7334 7.4541H1.82373V9.22949ZM1.82373 10.082V12.1167H2.93994C3.37939 12.1167 3.71045 12.0332 3.93311 11.8662C4.15869 11.6963 4.27148 11.4297 4.27148 11.0664C4.27148 10.7324 4.15723 10.4849 3.92871 10.3237C3.7002 10.1626 3.35303 10.082 2.88721 10.082H1.82373Z' fill='%23373F45'/%3E%3Cpath d='M13.011 6.5752V10.7324C13.011 11.207 12.9084 11.623 12.7034 11.9805C12.5012 12.335 12.2068 12.6089 11.8201 12.8022C11.4363 12.9927 10.9763 13.0879 10.4402 13.0879C9.6433 13.0879 9.02368 12.877 8.5813 12.4551C8.13892 12.0332 7.91772 11.4531 7.91772 10.7148V6.5752H8.9724V10.6401C8.9724 11.1704 9.09546 11.5615 9.34155 11.8135C9.58765 12.0654 9.96557 12.1914 10.4753 12.1914C11.4656 12.1914 11.9607 11.6714 11.9607 10.6313V6.5752H13.011Z' fill='%23373F45'/%3E%3Cpath d='M15.9146 13V6.5752H16.9649V13H15.9146Z' fill='%23373F45'/%3E%3Cpath d='M19.9255 13V6.5752H20.9758V12.0991H23.696V13H19.9255Z' fill='%23373F45'/%3E%3Cpath d='M28.2828 13H27.2325V7.47607H25.3428V6.5752H30.1724V7.47607H28.2828V13Z' fill='%23373F45'/%3E%3Cpath d='M41.9472 13H40.8046L39.7148 9.16796C39.6679 9.00097 39.6093 8.76074 39.539 8.44727C39.4687 8.13086 39.4262 7.91113 39.4116 7.78809C39.3823 7.97559 39.3339 8.21875 39.2665 8.51758C39.2021 8.81641 39.1479 9.03905 39.1039 9.18554L38.0405 13H36.8979L36.0673 9.7832L35.2236 6.5752H36.2958L37.2143 10.3193C37.3578 10.9199 37.4604 11.4502 37.5219 11.9102C37.5541 11.6611 37.6025 11.3828 37.6669 11.0752C37.7314 10.7676 37.79 10.5186 37.8427 10.3281L38.8886 6.5752H39.9301L41.0024 10.3457C41.1049 10.6943 41.2133 11.2158 41.3276 11.9102C41.3715 11.4912 41.477 10.958 41.644 10.3105L42.558 6.5752H43.6215L41.9472 13Z' fill='%23373F45'/%3E%3Cpath d='M45.7957 13V6.5752H46.846V13H45.7957Z' fill='%23373F45'/%3E%3Cpath d='M52.0258 13H50.9755V7.47607H49.0859V6.5752H53.9155V7.47607H52.0258V13Z' fill='%23373F45'/%3E%3Cpath d='M61.2312 13H60.1765V10.104H57.2146V13H56.1643V6.5752H57.2146V9.20312H60.1765V6.5752H61.2312V13Z' fill='%23373F45'/%3E%3C/svg%3E");
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-powered-by-convertkit:hover,
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit:focus {
background-color: #ffffff;
-webkit-transform: scale(1.025) perspective(1px);
-ms-transform: scale(1.025) perspective(1px);
transform: scale(1.025) perspective(1px);
opacity: 1;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit[data-variant="dark"],
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit[data-variant="light"] {
background-color: transparent;
border-color: transparent;
width: 166px;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit[data-variant="light"] {
color: #ffffff;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='162' height='20' viewBox='0 0 162 20' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M83.0561 15.2457C86.675 15.2457 89.4722 12.5154 89.4722 9.14749C89.4722 5.99211 86.8443 4.06563 85.1038 4.06563C82.6801 4.06563 80.7373 5.76407 80.4605 8.28551C80.4092 8.75244 80.0387 9.14403 79.5686 9.14069C78.7871 9.13509 77.6507 9.12841 76.9314 9.13092C76.6217 9.13199 76.3658 8.88106 76.381 8.57196C76.4895 6.38513 77.2218 4.3404 78.618 2.76974C80.1695 1.02445 82.4289 0 85.1038 0C89.5979 0 93.8406 4.07791 93.8406 9.14749C93.8406 14.7608 89.1832 19.3113 83.1517 19.3113C78.8502 19.3113 74.5179 16.5041 73.0053 12.5795C72.9999 12.565 72.9986 12.5492 73.0015 12.534C73.0218 12.4179 73.0617 12.3118 73.1011 12.2074C73.1583 12.0555 73.2143 11.907 73.2062 11.7359L73.18 11.1892C73.174 11.0569 73.2075 10.9258 73.2764 10.8127C73.3452 10.6995 73.4463 10.6094 73.5666 10.554L73.7852 10.4523C73.9077 10.3957 74.0148 10.3105 74.0976 10.204C74.1803 10.0974 74.2363 9.97252 74.2608 9.83983C74.3341 9.43894 74.6865 9.14749 75.0979 9.14749C75.7404 9.14749 76.299 9.57412 76.5088 10.1806C77.5188 13.1 79.1245 15.2457 83.0561 15.2457Z' fill='white'/%3E%3Cpath d='M155.758 6.91365C155.028 6.91365 154.804 6.47916 154.804 5.98857C154.804 5.46997 154.986 5.06348 155.758 5.06348C156.53 5.06348 156.712 5.46997 156.712 5.98857C156.712 6.47905 156.516 6.91365 155.758 6.91365ZM142.441 12.9304V9.32833L141.415 9.32323V8.90392C141.415 8.44719 141.786 8.07758 142.244 8.07986L142.441 8.08095V6.55306L144.082 6.09057V8.08073H145.569V8.50416C145.569 8.61242 145.548 8.71961 145.506 8.81961C145.465 8.91961 145.404 9.01047 145.328 9.08699C145.251 9.16351 145.16 9.2242 145.06 9.26559C144.96 9.30698 144.853 9.32826 144.745 9.32822H144.082V12.7201C144.082 13.2423 144.378 13.4256 144.76 13.4887C145.209 13.5629 145.583 13.888 145.583 14.343V14.9626C144.029 14.9626 142.441 14.8942 142.441 12.9304Z' fill='white'/%3E%3Cpath d='M110.058 7.92554C108.417 7.88344 106.396 8.92062 106.396 11.5137C106.396 14.0646 108.417 15.0738 110.058 15.0318C111.742 15.0738 113.748 14.0646 113.748 11.5137C113.748 8.92062 111.742 7.88344 110.058 7.92554ZM110.07 13.7586C108.878 13.7586 108.032 12.8905 108.032 11.461C108.032 10.1013 108.878 9.20569 110.071 9.20569C111.263 9.20569 112.101 10.0995 112.101 11.459C112.101 12.8887 111.263 13.7586 110.07 13.7586Z' fill='white'/%3E%3Cpath d='M118.06 7.94098C119.491 7.94098 120.978 8.33337 120.978 11.1366V14.893H120.063C119.608 14.893 119.238 14.524 119.238 14.0689V10.9965C119.238 9.66506 118.747 9.16047 117.891 9.16047C117.414 9.16047 116.797 9.52486 116.502 9.81915V14.069C116.502 14.1773 116.481 14.2845 116.44 14.3845C116.398 14.4845 116.337 14.5753 116.261 14.6519C116.184 14.7284 116.093 14.7891 115.993 14.8305C115.893 14.8719 115.786 14.8931 115.678 14.8931H114.847V8.10918H115.773C115.932 8.10914 116.087 8.16315 116.212 8.26242C116.337 8.36168 116.424 8.50033 116.46 8.65577C116.881 8.19328 117.428 7.94098 118.06 7.94098ZM122.854 8.09713C123.024 8.09708 123.19 8.1496 123.329 8.2475C123.468 8.34541 123.574 8.48391 123.631 8.64405L125.133 12.8486L126.635 8.64415C126.692 8.48402 126.798 8.34551 126.937 8.2476C127.076 8.1497 127.242 8.09718 127.412 8.09724H128.598L126.152 14.3567C126.091 14.5112 125.986 14.6439 125.849 14.7374C125.711 14.831 125.549 14.881 125.383 14.8809H124.333L121.668 8.09713H122.854Z' fill='white'/%3E%3Cpath d='M135.085 14.5514C134.566 14.7616 133.513 15.0416 132.418 15.0416C130.496 15.0416 129.024 13.9345 129.024 11.4396C129.024 9.19701 130.451 7.99792 132.191 7.99792C134.338 7.99792 135.254 9.4378 135.158 11.3979C135.139 11.8029 134.786 12.0983 134.38 12.0983H130.679C130.763 13.1916 131.562 13.7662 132.615 13.7662C133.028 13.7662 133.462 13.7452 133.983 13.6481C134.535 13.545 135.085 13.9375 135.085 14.4985V14.5514ZM133.673 10.949C133.785 9.87621 133.061 9.28752 132.191 9.28752C131.321 9.28752 130.734 9.93979 130.679 10.9489L133.673 10.949Z' fill='white'/%3E%3Cpath d='M137.345 8.11122C137.497 8.11118 137.645 8.16229 137.765 8.25635C137.884 8.35041 137.969 8.48197 138.005 8.62993C138.566 8.20932 139.268 7.94303 139.759 7.94303C139.801 7.94303 140.068 7.94303 140.489 7.99913V8.7265C140.489 9.11748 140.15 9.4147 139.759 9.4147C139.31 9.4147 138.651 9.5829 138.131 9.8773V14.8951H136.462V8.11112L137.345 8.11122ZM156.6 14.0508V8.09104H155.769C155.314 8.09104 154.944 8.45999 154.944 8.9151V14.8748H155.775C156.23 14.8748 156.6 14.5058 156.6 14.0508ZM158.857 12.9447V9.34254H157.749V8.91912C157.749 8.46401 158.118 8.09506 158.574 8.09506H158.857V6.56739L160.499 6.10479V8.09506H161.986V8.51848C161.986 8.97359 161.617 9.34254 161.161 9.34254H160.499V12.7345C160.499 13.2566 160.795 13.44 161.177 13.503C161.626 13.5774 162 13.9024 162 14.3574V14.977C160.446 14.977 158.857 14.9086 158.857 12.9447ZM98.1929 10.1124C98.2033 6.94046 100.598 5.16809 102.895 5.16809C104.171 5.16809 105.342 5.44285 106.304 6.12953L105.914 6.6631C105.654 7.02011 105.16 7.16194 104.749 6.99949C104.169 6.7702 103.622 6.7218 103.215 6.7218C101.335 6.7218 99.9169 7.92849 99.9068 10.1123C99.9169 12.2959 101.335 13.5201 103.215 13.5201C103.622 13.5201 104.169 13.4717 104.749 13.2424C105.16 13.0799 105.654 13.2046 105.914 13.5615L106.304 14.0952C105.342 14.7819 104.171 15.0566 102.895 15.0566C100.598 15.0566 98.2033 13.2842 98.1929 10.1124ZM147.619 5.21768C148.074 5.21768 148.444 5.58663 148.444 6.04174V9.81968L151.82 5.58131C151.897 5.47733 151.997 5.39282 152.112 5.3346C152.227 5.27638 152.355 5.24607 152.484 5.24611H153.984L150.166 10.0615L153.984 14.8749H152.484C152.355 14.8749 152.227 14.8446 152.112 14.7864C151.997 14.7281 151.897 14.6436 151.82 14.5397L148.444 10.3025V14.0508C148.444 14.5059 148.074 14.8749 147.619 14.8749H146.746V5.21768H147.619Z' fill='white'/%3E%3Cpath d='M0.773438 6.5752H2.68066C3.56543 6.5752 4.2041 6.7041 4.59668 6.96191C4.99219 7.21973 5.18994 7.62695 5.18994 8.18359C5.18994 8.55859 5.09326 8.87061 4.8999 9.11963C4.70654 9.36865 4.42822 9.52539 4.06494 9.58984V9.63379C4.51611 9.71875 4.84717 9.88721 5.05811 10.1392C5.27197 10.3882 5.37891 10.7266 5.37891 11.1543C5.37891 11.7314 5.17676 12.1841 4.77246 12.5122C4.37109 12.8374 3.81152 13 3.09375 13H0.773438V6.5752ZM1.82373 9.22949H2.83447C3.27393 9.22949 3.59473 9.16064 3.79688 9.02295C3.99902 8.88232 4.1001 8.64502 4.1001 8.31104C4.1001 8.00928 3.99023 7.79102 3.77051 7.65625C3.55371 7.52148 3.20801 7.4541 2.7334 7.4541H1.82373V9.22949ZM1.82373 10.082V12.1167H2.93994C3.37939 12.1167 3.71045 12.0332 3.93311 11.8662C4.15869 11.6963 4.27148 11.4297 4.27148 11.0664C4.27148 10.7324 4.15723 10.4849 3.92871 10.3237C3.7002 10.1626 3.35303 10.082 2.88721 10.082H1.82373Z' fill='white'/%3E%3Cpath d='M13.011 6.5752V10.7324C13.011 11.207 12.9084 11.623 12.7034 11.9805C12.5012 12.335 12.2068 12.6089 11.8201 12.8022C11.4363 12.9927 10.9763 13.0879 10.4402 13.0879C9.6433 13.0879 9.02368 12.877 8.5813 12.4551C8.13892 12.0332 7.91772 11.4531 7.91772 10.7148V6.5752H8.9724V10.6401C8.9724 11.1704 9.09546 11.5615 9.34155 11.8135C9.58765 12.0654 9.96557 12.1914 10.4753 12.1914C11.4656 12.1914 11.9607 11.6714 11.9607 10.6313V6.5752H13.011Z' fill='white'/%3E%3Cpath d='M15.9146 13V6.5752H16.9649V13H15.9146Z' fill='white'/%3E%3Cpath d='M19.9255 13V6.5752H20.9758V12.0991H23.696V13H19.9255Z' fill='white'/%3E%3Cpath d='M28.2828 13H27.2325V7.47607H25.3428V6.5752H30.1724V7.47607H28.2828V13Z' fill='white'/%3E%3Cpath d='M41.9472 13H40.8046L39.7148 9.16796C39.6679 9.00097 39.6093 8.76074 39.539 8.44727C39.4687 8.13086 39.4262 7.91113 39.4116 7.78809C39.3823 7.97559 39.3339 8.21875 39.2665 8.51758C39.2021 8.81641 39.1479 9.03905 39.1039 9.18554L38.0405 13H36.8979L36.0673 9.7832L35.2236 6.5752H36.2958L37.2143 10.3193C37.3578 10.9199 37.4604 11.4502 37.5219 11.9102C37.5541 11.6611 37.6025 11.3828 37.6669 11.0752C37.7314 10.7676 37.79 10.5186 37.8427 10.3281L38.8886 6.5752H39.9301L41.0024 10.3457C41.1049 10.6943 41.2133 11.2158 41.3276 11.9102C41.3715 11.4912 41.477 10.958 41.644 10.3105L42.558 6.5752H43.6215L41.9472 13Z' fill='white'/%3E%3Cpath d='M45.7957 13V6.5752H46.846V13H45.7957Z' fill='white'/%3E%3Cpath d='M52.0258 13H50.9755V7.47607H49.0859V6.5752H53.9155V7.47607H52.0258V13Z' fill='white'/%3E%3Cpath d='M61.2312 13H60.1765V10.104H57.2146V13H56.1643V6.5752H57.2146V9.20312H60.1765V6.5752H61.2312V13Z' fill='white'/%3E%3C/svg%3E");
}
@-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
@keyframes formkit-bouncedelay-formkit-form-data-uid-d2e88d98d6- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
.formkit-form[data-uid="d2e88d98d6"] blockquote {
padding: 10px 20px;
margin: 0 0 20px;
border-left: 5px solid #e1e1e1;
}
.formkit-form[data-uid="d2e88d98d6"] {
border: 1px solid #e3e3e3;
max-width: 700px;
position: relative;
overflow: hidden;
margin: 0px 0px 15px 0;
padding: 5px 15px 5px 15px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-background {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: cover;
background-position: center;
opacity: 0.3;
}
.formkit-form[data-uid="d2e88d98d6"] [data-style="minimal"] {
width: 100%;
position: relative;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-header {
margin: 0 0 0 0;
text-align: center;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-subheader {
margin: 18px 0;
text-align: center;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-guarantee {
font-size: 13px;
margin: 0;
text-align: center;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-guarantee > p {
margin: 0;
}
.formkit-form[data-uid="d2e88d98d6"]
.formkit-powered-by-convertkit-container {
margin-bottom: 0;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-fields {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
margin: 0 auto 0 auto;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-field {
min-width: 220px;
}
.formkit-form[data-uid="d2e88d98d6"] .formkit-field,
.formkit-form[data-uid="d2e88d98d6"] .formkit-submit {
margin: 0 0 15px 0;
-webkit-flex: 1 0 100%;
-ms-flex: 1 0 100%;
flex: 1 0 100%;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"] {
margin-left: -5px;
margin-right: -5px;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-field,
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-submit {
margin: 0 5px 15px 5px;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-field {
-webkit-flex: 100 1 auto;
-ms-flex: 100 1 auto;
flex: 100 1 auto;
}
.formkit-form[data-uid="d2e88d98d6"][min-width~="600"]
.formkit-fields[data-stacked="false"]
.formkit-submit {
-webkit-flex: 1 1 auto;
-ms-flex: 1 1 auto;
flex: 1 1 auto;
}
</style>
</form>
</div>
<p>A teraz zapraszam Cię do propozycji rozwiązań, bo prostych odpowiedzi to u nas nie ma 😇</p>
<h2 id="konta-użytkowników">Konta użytkowników</h2>
<h3 id="bez-chmury">Bez chmury</h3>
<p>Jakbym cofnął się wstecz kilka lat to powiedziałbym, że to najprostsze zadanie we wszechświecie. Bierzemy swoją ulubioną technologię (u mnie wtedy na 100% byłby to .NET Framework), dokładamy bazę danych i robimy zgodnie z tutorialem. Jak patrzę na to dziś, wybór nie jest taki zły, bo przynajmniej uniknąłbym tych dwóch problemów:</p>
<ul>
<li>Przechowywanie haseł w base64 (<a href="https://security.stackexchange.com/questions/194646/is-it-okay-to-save-passwords-as-base64-strings-with-no-other-hashing-or-encrypti#:~:text=Base64%20is%20not%20an%20encryption,storing%20it%20without%20any%20encoding">ciekawa dyskusja</a>)</li>
<li>SQL Injection, ponieważ .NET Framework mnie przed tym zabezpiecza</li>
</ul>
<p>Ale czy ochroniłbym wystarczająco dobrze swoich użytkowników? Szczególnie przed wyciekiem bazy danych. To już niestety zależy już od bardzo wielu czynników 😁</p>
<p>Sytuacja jest analogiczna w Java, Python, PHP czy NodeJS.</p>
<h3 id="opcje-do-wyboru-nie-tylko-azure-czyli-niekompletna-lista">Opcje do wyboru (nie tylko Azure), czyli niekompletna lista</h3>
<p>Oczywiście na pewno kojarzysz robienie bazy użytkowników bardziej “ręcznie” i mówiąc szczerze ja też. Trochę wody jednak w rzekach upłynęło, ja stałem się mądrzejszy, więc dzisiaj podszedłbym do tego zadania trochę inaczej. Po pierwsze zobaczmy co jest dostępne na rynku do zarządzania użytkownikami (lista na 100% niekompletna):</p>
<ul>
<li>Active Directory, OpenLDAP, itd. - narzędzia idealnie sprawdzające się wewnątrz firmy “skalibrowane” pod zarządzanie użytkownikami i urządzeniami wpiętymi w sieć. Jestem przekonany, że byłeś, jesteś i będziesz członkiem jakiegoś drzewa podczas zatrudnienia w firmach. Do tego istnieją oczywiście rozszerzenia jak ADFS czy DEX, które pomagają nam zapanować nad bardziej skomplikowaną strukturą. I trzeba sobie powiedzieć szczerze, wewnątrz firmy trudno znaleźć lepsze narzędzia. A kiedy potrzeba coś szytego na miarę rozszerzamy istniejące usługi o dodatkowe komponenty zarządzania uprawnieniami, grupami, czy dynamicznymi dostępami. Podsumowując “młot” do bardzo konkretnego zastosowania i nie pasujący raczej do naszych potrzeb.</li>
<li>Rozwiązania gotowe do zainstalowania i modyfikacji jak na przykład Keycloak czy Identity Server 4. Osobiście korzystałem z Identity Server i powiem szczerze, że jest to kompletne rozwiązanie, w którym ciężko coś “zepsuć”, ale własne doświadczenie mówi mi: “da się”. Wsparcie zarówno OpenID Connect jaki OAuth 2.0 zapewnia nam w zasadzie dowolność technologii, którą użyjemy w innych częściach aplikacji, a open source pozwala nam mieć nadzieję, na bardzo szybkie wykrywanie ewentualnych błędów.</li>
<li>Rozwiązania SaaS jak na przykład Auth0, Userbase czy Azure B2C. Dzięki nim nie musimy przejmować się dodatkami jak na przykład integracja z <a href="https://haveibeenpwned.com/">Have I Been Pwned</a> czy <a href="https://fidoalliance.org/fido2/">FIDO2</a> . Oczywiście czasem są one niezgodne z wizją “biznesową”, bo nie da się czegoś zrobić. Bardzo często to “nie da się” jest najlepszą możliwą opcją ochrony dla naszych użytkowników.</li>
</ul>
<h3 id="kryteria-eliminacji">Kryteria eliminacji</h3>
<p>No dobrze to co powinniśmy wybrać? Jest kilka aspektów, które wziąłbym pod uwagę:</p>
<ul>
<li>Cena danego rozwiązania i jego ewentualne skalowanie (czytaj: jak cena zależy od ilości użytkowników)</li>
<li>Łatwość implementacji i dostosowania do naszych potrzeb (czytaj: czy da się wgrać swojego CSS 🤪)</li>
<li>Łatwość migracji, a w zasadzie ucieczki z danego rozwiązania</li>
<li>Łatwość administracji danym rozwiązaniem.</li>
</ul>
<h3 id="kto-odpadnie-pierwszy">Kto odpadnie pierwszy?</h3>
<p>W sumie to już to napisałem przy okazji prezentacji rozwiązania. W tym przypadku rezygnuje z Active Directory czy OpenLDAP. Bądźmy szczerzy to jest użycie armaty na muchę, albo próba wciśnięcia kwadratowego klocka do okrągłego otworu. Wiadomo da się, szczególnie jak ma się pilnik. Po pierwsze goni nas czas, a po drugie to nie do końca do tego służy.</p>
<h3 id="moje-czyli-">Moje czyli …</h3>
<p>Drugim punktem do odstrzału jest własne rozwiązanie. Tak wiem, że ciężko się rezygnuje z własnego pomysłu, ale będzie po prostu bezpieczniej. Serio? Myślę, że tak, poprawna implementacja resetu hasła, FIDO2, logowania za pomocą magic link, czy zwykłego MFA nie jest prosta, nie mówiąc już o logowaniu przez GitHub do łatwych nie należy. Oczywiście są gotowe rozwiązania, miliony NPMów, PyPIów, paczek Maven, NuGet czy PHP. Tylko zarządzanie tym nie jest proste. Oczywiście tutaj musi paść istotne stwierdzenie! Baza haseł i logowanie nie jest kluczowym elementem aplikacji do losowania biletów na Ligę Mistrzów. W przypadku banku powyższy mógłby okazać się zupełnie nietrafiony, bo obowiązują jakieś tam regulacje prawne.</p>
<h3 id="ostatnie-dwa-i-algorytm-decyzyjny">Ostatnie dwa i algorytm decyzyjny</h3>
<p>Zostały dwa. Przyznam szczerze, że ze względu na historię projektową w moim własnym życiu pojawiał się w tym miejscu Identity Server 4. Kilku znajomych, do których napisałem w tym temacie, napisało Keycloak, bo bliżej im do świata Java. Rozwiązania dość podobne w swej idei, dające możliwość rozwoju, zastąpienia czy zmiany pewnych elementów (przykład dodatkowego problemu: Dlaczego w bankowej aplikacji wystarczy PIN 4-cyfrowy i jest to wystarczająco bezpieczne, a hasło musi już mieć co najmniej 8 znaków zawierających małe, duże litery i jeszcze cyfry lub znaki specjalne?). Podział dla mnie jest prosty i sprowadza się do odpowiedzi na poniższy schemat:</p>
<ul>
<li>Jeżeli musimy móc przenieść się z hostingu A, na hosting B -> to Identity Server, Keycloak lub coś podobnego</li>
<li>Jeżeli wiemy, że będziemy robić jakiś custom -> to jak wyżej</li>
<li>Jeżeli doszliśmy tutaj i cena w zależności od przewidywanej liczby użytkowników jest akceptowalna oraz mamy zaufanie do wybranej opcji to bierzemy SaaS.</li>
</ul>
<h3 id="zaufanie-to-podstawa">Zaufanie to podstawa</h3>
<p>W przypadku opisywanej aplikacji SaaS jest wydaje się spoko. Szczególnie, że dochodzi nam obsługa botnet, ataków DDoS czy nagłego wzrostu użycia. Sprawdźmy jednak ostatni punkt. Jeżeli chodzi o zaufanie to z wymienionych przeze mnie opcji ufam dwóm: Auth0 oraz Azure B2C. Dlaczego? Bo w obu przypadkach są rzeczywiste rozwiązania na dużą skalę wraz z opisami. Dla Auth0 znajdziecie je pod adresem <a href="https://auth0.com/customers/">https://auth0.com/customers/</a>. Dla Azure B2C trzeba użyć wyszukiwarki na stronie i mamy też <a href="https://customers.microsoft.com/en-us/search?sq=%22Azure%20Active%20Directory%20B2C%22&ff=&p=2&so=story_publish_date%20desc">pokaźną kolekcję</a>. W mojej punktacji wygrywa tutaj Azure B2C z jednego powodu. Między innymi zaufał im Real Madryt (<a href="https://customers.microsoft.com/en-us/story/real-madrid">więcej</a>), więc w piłce nożnej mają już doświadczenie 😂</p>
<h3 id="funcjonalności-i-cena">Funcjonalności i cena</h3>
<p>Druga kwestia do porównania to oczywiście funkcjonalności. Czy da się osadzić własny CSS? Czy mają wsparcie dla logowania z GitHub? Czy da się użyć FIDO2? Czy…? Na to pytanie nie będę wstanie odpowiedzieć, ale na 99% oba spełnią wymagania aplikacji do losowania biletów. Dlaczego? Bo to ludziom zależy, żeby wygrać bilet, więc pewnie będą gotowi się chwilę pomęczyć. Tutaj zadanie dla Ciebie do zastanowienia: jakie funkcjonalności uważasz za niezbędne. Ten proces myślowy i spojrzenie na Azure B2C, Auth0 czy inne umożliwi Ci podjęcie decyzji.</p>
<p>No to na sam koniec pozostała cena. Zakładaliśmy od 5 tysięcy użytkowników do jednego miliona. Czyli mówiąc wprost, totalnie nie wiadomo ile i wyjdzie to w praniu. Prosty przelicznik (stan na dzisiaj) mówi mi, że Auth0 to $1138 na miesiąc za 50 tysięcy użytkowników, a powyżej mam się skontaktować z departamentem sprzedaży. W Azure B2C jest w tej chwili rozliczanie za aktywnego użytkownika w danym miesiącu, czyli Monthly Active Users (MAU) i pierwsze 50 tysięcy jest gratis. Oczywiście zero jest lepsze niż $1138, ale spójrzmy jak jest dalej. Przykładowe wyliczenie ze strony dla 100k jest następujące:</p>
<p>(50,000 MAUs x €0 (Free tier)) + (50,000 MAUs x €0.0047) = €231.908. Do tego płacimy jeszcze za MFA za pomocą SMS lub telefon: €0.026.</p>
<h3 id="łyżka-dziegciu">Łyżka dziegciu</h3>
<p>Które wybrać? Ciężko powiedzieć, acz na pierwszy rzut oka Azure B2C wydaje się tańsze😁, szczególnie że za nieaktywnych użytkowników w danym miesiącu nic nie płacimy. Kluczowe będą jednak jak zawsze drobiazgi. Dla aplikacji Liga Mistrzów, Azure B2C wydaje się dobrym wyborem. Jest tylko jedno ALE. Brak wsparcia dla własnych domen. Tak serio w Azure B2C nadal nie ma wsparcia dla własnych domeni pracują nad tym od 2017 roku (<a href="https://feedback.azure.com/forums/169401-azure-active-directory/suggestions/15334317-customer-owned-domains">więcej</a>).</p>
<p>Oczywiście kiedy naprawdę robilibyśmy aplikację dla FIFA, która miałaby szansę stać się hitem, to jestem przekonany, że Microsoft poszedłby nam na ustępstwo i tak jak dla kilku dużych firm (np: Subway czy wspomniany Real Madryt) zacząłby wspierać naszą domenę. W innym wypadku gdy własna domena do logowania to “must have” kierujemy swój wzrok w na Auth0 i pewnie piszemy do “sales dept.” 😁</p>
<h2 id="podsumowanie">Podsumowanie</h2>
<p>Na sam koniec sprawa nie jest prosta i najlepszą odpowiedzią jest standardowa odpowiedź konsultanta, czyli “to zależy”. Czynników, które należy wziąć pod uwagę jest cała masa. Nikt nie mówił, że to proste. Z chęcią przeczytam Twoje zdanie poniżej, albo na Gitter. Zapraszam Cię też do zapisania się do naszej inicjatywy poniżej, gdzie będę miał szansę dosłać Ci pozostałe części naszej układanki.</p>
<script src="https://f.convertkit.com/ckjs/ck.5.js"></script>
<form action="https://app.convertkit.com/forms/1684572/subscriptions" class="seva-form formkit-form" method="post" data-sv-form="1684572" data-uid="cea5d3079d" data-format="inline" data-version="5" data-options="{"settings":{"after_subscribe":{"action":"redirect","success_message":"Success! Now check your email to confirm your subscription.","redirect_url":"https://poznajAzure.pl/confirmSubscription.html"},"analytics":{"google":null,"facebook":null,"segment":null,"pinterest":null},"modal":{"trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"powered_by":{"show":true,"url":"https://convertkit.com?utm_source=dynamic&utm_medium=referral&utm_campaign=poweredby&utm_content=form"},"recaptcha":{"enabled":false},"return_visitor":{"action":"show","custom_content":""},"slide_in":{"display_in":"bottom_right","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15},"sticky_bar":{"display_in":"top","trigger":"timer","scroll_percentage":null,"timer":5,"devices":"all","show_once_every":15}},"version":"5"}" min-width="400 500 600 700 800" style="background-color: rgb(255, 255, 255); border-radius: 6px">
<div data-style="full">
<div data-element="column" class="formkit-column" style="background-color: rgb(249, 250, 251)">
<div class="formkit-background" style="opacity: 0.3"></div>
<div class="formkit-header" data-element="header" style="color: rgb(77, 77, 77); font-size: 20px; font-weight: 700">
<h1>Jeżeli interesuje Cię</h1>
</div>
<div class="formkit-subheader" data-element="subheader" style="color: rgb(104, 104, 104); font-size: 15px">
<span>- budowa i hostowanie aplikacji w Azure</span>
<p style="margin-bottom: 0px;">- HA usług</p>
<p style="margin-bottom: 0px;">- wydajność i obsługa baz danych, by było dobrze i tanio</p>
<p style="margin-bottom: 0px;">- diagnostyka i logowanie</p>
<p style="margin-bottom: 0px;">- szybkie wdrażanie i testowanie</p>
<p style="margin-bottom: 0px;"><strong>to trafiłeś idealnie, bo nas też!</strong></p>
</div>
</div>
<div data-element="column" class="formkit-column">
<ul class="formkit-alert formkit-alert-error" data-element="errors" data-group="alert"></ul>
<div data-element="fields" class="seva-fields formkit-fields">
<div class="formkit-field">
<input class="formkit-input" name="email_address" aria-label="Twój email" placeholder="Twój email" required="" type="email" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<div class="formkit-field">
<input class="formkit-input" aria-label="Imię lub nick" name="fields[first_name]" placeholder="Imię lub nick" type="text" style="
color: rgb(0, 0, 0);
border-color: rgb(227, 227, 227);
border-radius: 4px;
font-weight: 400;
" />
</div>
<button data-element="submit" class="formkit-submit formkit-submit" style="
color: rgb(255, 255, 255);
background-color: rgb(22, 119, 190);
border-radius: 24px;
font-weight: 700;
">
<div class="formkit-spinner">
<div></div>
<div></div>
<div></div>
</div>
<span>Subscribe</span>
</button>
</div>
<div class="formkit-guarantee" data-element="guarantee" style="color: rgb(77, 77, 77); font-size: 13px; font-weight: 400">
<p>
<span style="color: rgb(59, 59, 59)">Polityka prywatności - </span><a href="https://poznajazure.pl/policy.html" target="_blank" rel="noopener noreferrer">więcej</a>
</p>
</div>
</div>
</div>
<style>
.formkit-form[data-uid="cea5d3079d"] * {
box-sizing: border-box;
}
.formkit-form[data-uid="cea5d3079d"] {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.formkit-form[data-uid="cea5d3079d"] legend {
border: none;
font-size: inherit;
margin-bottom: 10px;
padding: 0;
position: relative;
display: table;
}
.formkit-form[data-uid="cea5d3079d"] fieldset {
border: 0;
padding: 0.01em 0 0 0;
margin: 0;
min-width: 0;
}
.formkit-form[data-uid="cea5d3079d"]
body:not(:-moz-handler-blocked)
fieldset {
display: table-cell;
}
.formkit-form[data-uid="cea5d3079d"] h1,
.formkit-form[data-uid="cea5d3079d"] h2,
.formkit-form[data-uid="cea5d3079d"] h3,
.formkit-form[data-uid="cea5d3079d"] h4,
.formkit-form[data-uid="cea5d3079d"] h5,
.formkit-form[data-uid="cea5d3079d"] h6 {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="cea5d3079d"] p {
color: inherit;
font-size: inherit;
font-weight: inherit;
}
.formkit-form[data-uid="cea5d3079d"] ol:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] ul:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] blockquote:not([template-default]) {
text-align: left;
}
.formkit-form[data-uid="cea5d3079d"] p:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] hr:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] blockquote:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] ol:not([template-default]),
.formkit-form[data-uid="cea5d3079d"] ul:not([template-default]) {
color: inherit;
font-style: initial;
}
.formkit-form[data-uid="cea5d3079d"] .ordered-list,
.formkit-form[data-uid="cea5d3079d"] .unordered-list {
list-style-position: outside !important;
padding-left: 1em;
}
.formkit-form[data-uid="cea5d3079d"] .list-item {
padding-left: 0;
}
.formkit-form[data-uid="cea5d3079d"][data-format="modal"] {
display: none;
}
.formkit-form[data-uid="cea5d3079d"][data-format="slide in"] {
display: none;
}
.formkit-form[data-uid="cea5d3079d"][data-format="sticky bar"] {
display: none;
}
.formkit-sticky-bar
.formkit-form[data-uid="cea5d3079d"][data-format="sticky bar"] {
display: block;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input,
.formkit-form[data-uid="cea5d3079d"] .formkit-select,
.formkit-form[data-uid="cea5d3079d"] .formkit-checkboxes {
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit {
border: 0;
border-radius: 5px;
color: #ffffff;
cursor: pointer;
display: inline-block;
text-align: center;
font-size: 15px;
font-weight: 500;
cursor: pointer;
margin-bottom: 15px;
overflow: hidden;
padding: 0;
position: relative;
vertical-align: middle;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button:hover,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:hover,
.formkit-form[data-uid="cea5d3079d"] .formkit-button:focus,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:focus {
outline: none;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button:hover > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:hover > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-button:focus > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit:focus > span {
background-color: rgba(0, 0, 0, 0.1);
}
.formkit-form[data-uid="cea5d3079d"] .formkit-button > span,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit > span {
display: block;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
padding: 12px 24px;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input {
background: #ffffff;
font-size: 15px;
padding: 12px;
border: 1px solid #e3e3e3;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
line-height: 1.4;
margin: 0;
-webkit-transition: border-color ease-out 300ms;
transition: border-color ease-out 300ms;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input:focus {
outline: none;
border-color: #1677be;
-webkit-transition: border-color ease 300ms;
transition: border-color ease 300ms;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-input::-webkit-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input::-moz-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input:-ms-input-placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input::placeholder {
color: inherit;
opacity: 0.8;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"] {
position: relative;
display: inline-block;
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"]::before {
content: "";
top: calc(50% - 2.5px);
right: 10px;
position: absolute;
pointer-events: none;
border-color: #4f4f4f transparent transparent transparent;
border-style: solid;
border-width: 6px 6px 0 6px;
height: 0;
width: 0;
z-index: 999;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"] select {
height: auto;
width: 100%;
cursor: pointer;
color: #333333;
line-height: 1.4;
margin-bottom: 0;
padding: 0 6px;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
font-size: 15px;
padding: 12px;
padding-right: 25px;
border: 1px solid #e3e3e3;
background: #ffffff;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="dropdown"] select:focus {
outline: none;
}
.formkit-form[data-uid="cea5d3079d"] [data-group="checkboxes"] {
text-align: left;
margin: 0;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"] {
margin-bottom: 10px;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
* {
cursor: pointer;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]:last-of-type {
margin-bottom: 0;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"] {
display: none;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]
+ label::after {
content: none;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::after {
border-color: #ffffff;
content: "";
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
input[type="checkbox"]:checked
+ label::before {
background: #10bf7a;
border-color: #10bf7a;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label {
position: relative;
display: inline-block;
padding-left: 28px;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before,
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
position: absolute;
content: "";
display: inline-block;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::before {
height: 16px;
width: 16px;
border: 1px solid #e3e3e3;
background: #ffffff;
left: 0px;
top: 3px;
}
.formkit-form[data-uid="cea5d3079d"]
[data-group="checkboxes"]
[data-group="checkbox"]
label::after {
height: 4px;
width: 8px;
border-left: 2px solid #4d4d4d;
border-bottom: 2px solid #4d4d4d;
-webkit-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
transform: rotate(-45deg);
left: 4px;
top: 8px;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert {
background: #f9fafb;
border: 1px solid #e3e3e3;
border-radius: 5px;
-webkit-flex: 1 0 auto;
-ms-flex: 1 0 auto;
flex: 1 0 auto;
list-style: none;
margin: 25px auto;
padding: 12px;
text-align: center;
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert:empty {
display: none;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert-success {
background: #d3fbeb;
border-color: #10bf7a;
color: #0c905c;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-alert-error {
background: #fde8e2;
border-color: #f2643b;
color: #ea4110;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
height: 0px;
width: 0px;
margin: 0 auto;
position: absolute;
top: 0;
left: 0;
right: 0;
width: 0px;
overflow: hidden;
text-align: center;
-webkit-transition: all 300ms ease-in-out;
transition: all 300ms ease-in-out;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner > div {
margin: auto;
width: 12px;
height: 12px;
background-color: #fff;
opacity: 0.3;
border-radius: 100%;
display: inline-block;
-webkit-animation: formkit-bouncedelay-formkit-form-data-uid-cea5d3079d-
1.4s infinite ease-in-out both;
animation: formkit-bouncedelay-formkit-form-data-uid-cea5d3079d- 1.4s
infinite ease-in-out both;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner > div:nth-child(1) {
-webkit-animation-delay: -0.32s;
animation-delay: -0.32s;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-spinner > div:nth-child(2) {
-webkit-animation-delay: -0.16s;
animation-delay: -0.16s;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-submit[data-active]
.formkit-spinner {
opacity: 1;
height: 100%;
width: 50px;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-submit[data-active]
.formkit-spinner
~ span {
opacity: 0;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit-container {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
width: 100%;
z-index: 5;
margin: 10px 0;
position: relative;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit-container[data-active="false"] {
opacity: 0.35;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-powered-by-convertkit {
-webkit-align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
background-color: #ffffff;
border: 1px solid #dce1e5;
border-radius: 4px;
color: #373f45;
cursor: pointer;
display: block;
height: 36px;
margin: 0 auto;
opacity: 0.95;
padding: 0;
-webkit-text-decoration: none;
text-decoration: none;
text-indent: 100%;
-webkit-transition: ease-in-out all 200ms;
transition: ease-in-out all 200ms;
white-space: nowrap;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
width: 190px;
background-repeat: no-repeat;
background-position: center;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-powered-by-convertkit:hover,
.formkit-form[data-uid="cea5d3079d"] .formkit-powered-by-convertkit:focus {
background-color: #ffffff;
-webkit-transform: scale(1.025) perspective(1px);
-ms-transform: scale(1.025) perspective(1px);
transform: scale(1.025) perspective(1px);
opacity: 1;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit[data-variant="dark"],
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit[data-variant="light"] {
background-color: transparent;
border-color: transparent;
width: 166px;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit[data-variant="light"] {
color: #ffffff;
}
@-webkit-keyframes formkit-bouncedelay-formkit-form-data-uid-cea5d3079d- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
@keyframes formkit-bouncedelay-formkit-form-data-uid-cea5d3079d- {
0%,
80%,
100% {
-webkit-transform: scale(0);
-ms-transform: scale(0);
transform: scale(0);
}
40% {
-webkit-transform: scale(1);
-ms-transform: scale(1);
transform: scale(1);
}
}
.formkit-form[data-uid="cea5d3079d"] blockquote {
padding: 10px 20px;
margin: 0 0 20px;
border-left: 5px solid #e1e1e1;
}
.formkit-form[data-uid="cea5d3079d"] {
box-shadow: 0 2px 15px 0 rgba(210, 214, 220, 0.5);
max-width: 700px;
overflow: hidden;
}
.formkit-form[data-uid="cea5d3079d"] [data-style="full"] {
width: 100%;
display: block;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-header {
margin-top: 0;
margin-bottom: 20px;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-subheader {
margin: 15px 0;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-column {
padding: 20px;
position: relative;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-column:nth-child(2) {
border-top: 1px solid #e9ecef;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-background {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-size: cover;
background-position: center;
opacity: 0.5;
z-index: 1;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-header,
.formkit-form[data-uid="cea5d3079d"] .formkit-subheader,
.formkit-form[data-uid="cea5d3079d"] .formkit-image {
z-index: 2;
position: relative;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-field {
margin: 0 0 15px 0;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-input,
.formkit-form[data-uid="cea5d3079d"] .formkit-submit {
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-guarantee {
font-size: 13px;
margin: 0 0 15px 0;
}
.formkit-form[data-uid="cea5d3079d"] .formkit-guarantee > p {
margin: 0;
}
.formkit-form[data-uid="cea5d3079d"]
.formkit-powered-by-convertkit-container {
margin-bottom: 0;
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"] [data-style="full"],
.formkit-form[data-uid="cea5d3079d"][min-width~="700"] [data-style="full"],
.formkit-form[data-uid="cea5d3079d"][min-width~="800"] [data-style="full"] {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"] .formkit-submit,
.formkit-form[data-uid="cea5d3079d"][min-width~="700"] .formkit-submit,
.formkit-form[data-uid="cea5d3079d"][min-width~="800"] .formkit-submit {
width: 100%;
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"] .formkit-column,
.formkit-form[data-uid="cea5d3079d"][min-width~="700"] .formkit-column,
.formkit-form[data-uid="cea5d3079d"][min-width~="800"] .formkit-column {
padding: 0px;
}
.formkit-form[data-uid="cea5d3079d"][min-width~="600"]
.formkit-column:nth-child(2),
.formkit-form[data-uid="cea5d3079d"][min-width~="700"]
.formkit-column:nth-child(2),
.formkit-form[data-uid="cea5d3079d"][min-width~="800"]
.formkit-column:nth-child(2) {
border-top: none;
}
</style>
</form>Poznaj AzureWyobraź sobie następującą sytuację. Pracujesz sobie w pewnej firmie i na drzwiach masz tabliczkę (do wyboru): “senior architekt”, “główny projektant” albo po prostu “Ten-Którego-Imienia-Nie-Wolno-Wymawiać” 😉. Przybiega do Ciebie szef wszystkich szefów, czyli jak wiadomo Krzysztof Jarzyna ze Szczecina i zaczyna monolog z następującym tekstem: “Nasi handlowcy odnieśli wczoraj ZAJE…ISTY sukces. Robimy apkę dla do losowania biletów na finały Ligi Mistrzów!”. Ty patrzysz nerwowo w kalendarz, szybko wrzucasz w Google potwierdzenie terminu i już wiesz - mamy tylko miesiąc na dostarczenie aplikacji.