-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.html
550 lines (404 loc) · 26.7 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>Bart Jansen - Software Engineer at Microsoft</title>
<meta name="HandheldFriendly" content="True" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="apple-touch-icon" sizes="57x57" href="/assets/img/favicons/apple-touch-icon-57x57.png?v=1138f1bfa3">
<link rel="apple-touch-icon" sizes="60x60" href="/assets/img/favicons/apple-touch-icon-60x60.png?v=1138f1bfa3">
<link rel="apple-touch-icon" sizes="72x72" href="/assets/img/favicons/apple-touch-icon-72x72.png?v=1138f1bfa3">
<link rel="apple-touch-icon" sizes="76x76" href="/assets/img/favicons/apple-touch-icon-76x76.png?v=1138f1bfa3">
<link rel="apple-touch-icon" sizes="114x114" href="/assets/img/favicons/apple-touch-icon-114x114.png?v=1138f1bfa3">
<link rel="apple-touch-icon" sizes="120x120" href="/assets/img/favicons/apple-touch-icon-120x120.png?v=1138f1bfa3">
<link rel="apple-touch-icon" sizes="144x144" href="/assets/img/favicons/apple-touch-icon-144x144.png?v=1138f1bfa3">
<link rel="apple-touch-icon" sizes="152x152" href="/assets/img/favicons/apple-touch-icon-152x152.png?v=1138f1bfa3">
<link rel="apple-touch-icon" sizes="180x180" href="/assets/img/favicons/apple-touch-icon-180x180.png?v=1138f1bfa3">
<link rel="icon" type="image/png" href="/assets/img/favicons/favicon-32x32.png?v=1138f1bfa3" sizes="32x32">
<link rel="icon" type="image/png" href="/assets/img/favicons/android-chrome-192x192.png?v=1138f1bfa3" sizes="192x192">
<link rel="icon" type="image/png" href="/assets/img/favicons/favicon-96x96.png?v=1138f1bfa3" sizes="96x96">
<link rel="icon" type="image/png" href="/assets/img/favicons/favicon-16x16.png?v=1138f1bfa3" sizes="16x16">
<link rel="manifest" href="/assets/img/favicons/manifest.json?v=1138f1bfa3">
<link rel="mask-icon" href="/assets/img/favicons/safari-pinned-tab.svg?v=1138f1bfa3" color="#5bbad5">
<link rel="shortcut icon" href="https://blog.bart.je/content/images/size/w256h256/2024/05/favicon-194x194.png">
<meta name="msapplication-TileColor" content="#da532c">
<meta name="msapplication-TileImage" content="/assets/img/favicons/mstile-144x144.png?v=1138f1bfa3">
<meta name="msapplication-config" content="/assets/img/favicons/browserconfig.xml?v=1138f1bfa3">
<meta name="theme-color" content="#ffffff">
<link rel="stylesheet" type="text/css" href="/assets/css/screen.css?v=1138f1bfa3" />
<link rel="stylesheet" type="text/css" href="/assets/css/custom.css?v=1138f1bfa3" />
<link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Merriweather:300,700,700italic,300italic|Open+Sans:700,400" />
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<link rel="stylesheet" type="text/css" href="/assets/css/prism.css?v=1138f1bfa3" />
<link rel="stylesheet" type="text/css" href="/assets/css/rrssb.css?v=1138f1bfa3" />
<meta name="description" content="Explore Bart Jansen's insights on Azure and cloud technologies, from Managed Identity with Databricks to Kubernetes Autoscaling and Terraform deployments. Delve into a software engineer's journey from AWS to Azure, innovative chatbot development, GPT experiments and more.">
<link rel="icon" href="https://blog.bart.je/content/images/size/w256h256/2024/05/favicon-194x194.png" type="image/png">
<link rel="canonical" href="https://blog.bart.je/">
<meta name="referrer" content="no-referrer-when-downgrade">
<link rel="next" href="https://blog.bart.je/page/2/">
<meta property="og:site_name" content="Bart Jansen">
<meta property="og:type" content="website">
<meta property="og:title" content="Bart Jansen">
<meta property="og:description" content="Software Engineer at Microsoft">
<meta property="og:url" content="https://blog.bart.je/">
<meta property="og:image" content="https://blog.bart.je/content/images/2021/07/newprofilepic-1.png">
<meta property="article:publisher" content="https://www.facebook.com/bartj">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Bart Jansen">
<meta name="twitter:description" content="Software Engineer at Microsoft">
<meta name="twitter:url" content="https://blog.bart.je/">
<meta name="twitter:image" content="https://blog.bart.je/content/images/2021/07/newprofilepic.png">
<meta name="twitter:site" content="@bartjansn">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="1200">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"publisher": {
"@type": "Organization",
"name": "Bart Jansen",
"url": "https://blog.bart.je/",
"logo": {
"@type": "ImageObject",
"url": "https://blog.bart.je/content/images/2024/05/profilepictest.jpg",
"width": 60,
"height": 60
}
},
"url": "https://blog.bart.je/",
"image": {
"@type": "ImageObject",
"url": "https://blog.bart.je/content/images/2023/10/bg.jpg",
"width": 1200,
"height": 750
},
"mainEntityOfPage": "https://blog.bart.je/",
"description": "Explore Bart Jansen's insights on Azure and cloud technologies, from Managed Identity with Databricks to Kubernetes Autoscaling and Terraform deployments. Delve into a software engineer's journey from AWS to Azure, innovative chatbot development, GPT experiments and more."
}
</script>
<meta name="generator" content="Ghost 5.85">
<link rel="alternate" type="application/rss+xml" title="Bart Jansen" href="https://blog.bart.je/rss/">
<script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.37/umd/portal.min.js" data-i18n="false" data-ghost="https://blog.bart.je/" data-key="eea4b713fe9c8879c6eba1396b" data-api="https://blog.bart.je/ghost/api/content/" crossorigin="anonymous"></script><style id="gh-members-styles">.gh-post-upgrade-cta-content,
.gh-post-upgrade-cta {
display: flex;
flex-direction: column;
align-items: center;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
text-align: center;
width: 100%;
color: #ffffff;
font-size: 16px;
}
.gh-post-upgrade-cta-content {
border-radius: 8px;
padding: 40px 4vw;
}
.gh-post-upgrade-cta h2 {
color: #ffffff;
font-size: 28px;
letter-spacing: -0.2px;
margin: 0;
padding: 0;
}
.gh-post-upgrade-cta p {
margin: 20px 0 0;
padding: 0;
}
.gh-post-upgrade-cta small {
font-size: 16px;
letter-spacing: -0.2px;
}
.gh-post-upgrade-cta a {
color: #ffffff;
cursor: pointer;
font-weight: 500;
box-shadow: none;
text-decoration: underline;
}
.gh-post-upgrade-cta a:hover {
color: #ffffff;
opacity: 0.8;
box-shadow: none;
text-decoration: underline;
}
.gh-post-upgrade-cta a.gh-btn {
display: block;
background: #ffffff;
text-decoration: none;
margin: 28px 0 0;
padding: 8px 18px;
border-radius: 4px;
font-size: 16px;
font-weight: 600;
}
.gh-post-upgrade-cta a.gh-btn:hover {
opacity: 0.92;
}</style>
<script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.1/umd/sodo-search.min.js" data-key="eea4b713fe9c8879c6eba1396b" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.1/umd/main.css" data-sodo-search="https://blog.bart.je/" crossorigin="anonymous"></script>
<link href="https://blog.bart.je/webmentions/receive/" rel="webmention">
<script defer src="/public/cards.min.js?v=1138f1bfa3"></script>
<link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=1138f1bfa3">
<script defer src="/public/member-attribution.min.js?v=1138f1bfa3"></script>
<script>
var disqus_shortname = 'bartjansen'
var social_link = {
'home': 'https://bart.je',
'twitter': 'https://twitter.com/bartjansn',
'linkedin': 'https://www.linkedin.com/in/bajansen/',
'github': 'https://github.com/bart-jansen',
'rss':'https://blog.bart.je/rss/'
// you can add more icons
}
</script><style>:root {--ghost-accent-color: #ecc24a;}</style>
</head>
<body class="home-template">
<div class="site-wrapper">
<header class="main-header " style="background-image: url(https://blog.bart.je/content/images/2023/10/bg.jpg)">
<div class="vertical">
<div class="main-header-content inner">
<div class="blog-logo">
<img src="https://blog.bart.je/content/images/2024/05/profilepictest.jpg" alt="Bart Jansen" />
</div>
<h1 class="page-title">Bart Jansen</h1>
<h2 class="page-description">Software Engineer at Microsoft</h2>
<div class="menu">
<ul>
<li class="nav-home nav-current" role="presentation"><a href="https://blog.bart.je/">Home</a></li>
</ul>
</div>
<div>
<ul class="social_link">
</ul>
</div>
</div>
</div>
<a class="scroll-down icon-arrow-left" href="#content" data-offset="-45"><span class="hidden">Scroll Down</span></a>
</header>
<main id="content" class="content" role="main">
<div class="extra-pagination inner">
<nav class="pagination">
<span class="page-number">Page 1 of 2</span>
<a class="older-posts" href="/page/2/">Older Posts <span aria-hidden="true">→</span></a>
</nav>
</div>
<article class="post tag-dapr tag-azure-ai-search tag-search-ingest tag-scalability tag-ingestion tag-search-index tag-kubernetes tag-rate-limits tag-distributed-ingest">
<header class="post-header">
<h2 class="post-title"><a href="/distributing-search-ingest-with-dapr/">Distributing your Search Ingest pipeline using Dapr</a></h2>
</header>
<section class="post-excerpt">
<p>In the ever-evolving landscape of cloud-native applications, the need for scalable and resilient architectures has never been more critical. Traditional monolithic systems often fall short when it comes to handling large volumes of data and complex workflows. Enter Dapr: Distributed Application Runtime, a powerful framework that helps you build highly scalable and resilient microservices architecture. In this blog post, we'll explore how you can leverage Dapr to distribute your search ingest pip <a class="read-more" href="/distributing-search-ingest-with-dapr/">»</a></p>
</section>
<footer class="post-meta">
<a href="/author/bart/" class="static-avatar author-profile-image">Bart Jansen</a>
<time class="post-date" datetime="2024-06-14">14 June 2024</time>
<span class="reading-time post-date">4 min read</span>
</footer>
</article>
<article class="post tag-ghost-tag tag-blog tag-github tag-github-pages tag-docker">
<header class="post-header">
<h2 class="post-title"><a href="/hosting-your-own-ghost-blog-with-github-pages/">From Zero to Blog Hero: Hosting your own blog for free with Ghost and GitHub Pages</a></h2>
</header>
<section class="post-excerpt">
<p>I often get the question: how do you manage your blog? Do you pay anything for hosting your blog? Do you have some sort of markdown interpreter? How about Search Engine Optimizations, can your blog posts be found online using Google? The short respective answers: Completely managed through a self-hosted Ghost instance, completely free, with rich editor and out of the box search engine optimizations.
So, how does it work? Let's start with a list of requirements:
* Running Ghost locally via Doc <a class="read-more" href="/hosting-your-own-ghost-blog-with-github-pages/">»</a></p>
</section>
<footer class="post-meta">
<a href="/author/bart/" class="static-avatar author-profile-image">Bart Jansen</a>
<time class="post-date" datetime="2024-05-12">12 May 2024</time>
<span class="reading-time post-date">3 min read</span>
</footer>
</article>
<article class="post tag-azure-ai-search tag-push tag-pull tag-indexers tag-search-index tag-vector-search tag-ingestion">
<header class="post-header">
<h2 class="post-title"><a href="/optimizing-azure-ai-search-push-vs-pull/">Optimizing Azure AI Search: Comparing Push and Pull approaches with performance recommendations</a></h2>
</header>
<section class="post-excerpt">
<p>The Azure Search Index can be populated in two different ways. You can either directly push data into the index via the REST API/SDK (left image), or leverage the built-in Azure Search Indexer, which pulls data from a chosen DataSource and adds them to a specified index (right image)
Choosing between the pull and push models depends on the requirements you have. Do you care most about how fast your data gets indexed, or is security your top priority? Maybe you need the flexibility to work with <a class="read-more" href="/optimizing-azure-ai-search-push-vs-pull/">»</a></p>
</section>
<footer class="post-meta">
<a href="/author/bart/" class="static-avatar author-profile-image">Bart Jansen</a>
<time class="post-date" datetime="2024-05-06">06 May 2024</time>
<span class="reading-time post-date">4 min read</span>
</footer>
</article>
<article class="post tag-ingestion tag-rag tag-retrievel-augmented-generation tag-azure-cognitive-search tag-form-recognizer tag-python tag-search-index tag-azure-openai tag-embeddings tag-azure-ai-search no-image">
<header class="post-header">
<h2 class="post-title"><a href="/transforming-pdf-chaos-clarity-azure-cognitive-search-rag/">Transforming PDF Chaos into clarity: Add PDF Insights with Azure AI Search & RAG</a></h2>
</header>
<section class="post-excerpt">
<p>A great way to add insights to your unstructured PDFs is by ingesting them into an Azure AI Search Index and adding an LLM on top, also known as the RAG pattern as described in: Enhancing Your Data with Azure: Unlocking Insights through Retrieval-Augmented Generation.
This blog posts shows various code snippets, on how to achieve these different steps using Python. The first bit is to setup and populate the Search Index, and the last sections show how to query the search index and enrich the da <a class="read-more" href="/transforming-pdf-chaos-clarity-azure-cognitive-search-rag/">»</a></p>
</section>
<footer class="post-meta">
<a href="/author/bart/" class="static-avatar author-profile-image">Bart Jansen</a>
<time class="post-date" datetime="2023-11-13">13 November 2023</time>
<span class="reading-time post-date">5 min read</span>
</footer>
</article>
<article class="post tag-llm tag-azure-openai tag-embeddings tag-vector-search tag-azure-cognitive-search tag-rag tag-retrievel-augmented-generation">
<header class="post-header">
<h2 class="post-title"><a href="/enhancing-data-azure-insights-retrieval-augmented-generation/">Enhancing Your Data with Azure: Unlocking Insights through Retrieval-Augmented Generation</a></h2>
</header>
<section class="post-excerpt">
<p>In the rapidly evolving world of data analytics and AI, new frameworks are popping up every day to enhance the way we interact with and understand our data. One of the most exciting developments is the integration of tailor-made Large Language Models (LLM) into business processes. These models, like Azure OpenAI's GPT-4, are transforming how companies get insights from their data. In this post, we'll dive into how you can leverage Retrieval-Augmented Generation (RAG) using Azure OpenAI and Azure <a class="read-more" href="/enhancing-data-azure-insights-retrieval-augmented-generation/">»</a></p>
</section>
<footer class="post-meta">
<a href="/author/bart/" class="static-avatar author-profile-image">Bart Jansen</a>
<time class="post-date" datetime="2023-11-08">08 November 2023</time>
<span class="reading-time post-date">2 min read</span>
</footer>
</article>
<article class="post tag-chatgpt tag-openai tag-azure tag-azure-openai">
<header class="post-header">
<h2 class="post-title"><a href="/host-your-own-chatgpt-instance-azure-openai/">Host your own ChatGPT instance using Azure OpenAI</a></h2>
</header>
<section class="post-excerpt">
<p>It’s 2023, everyone is playing around with ChatGPT on OpenAI and a new and improved version of GPT is being released every couple of months with lots of new improvements which make you even more effective.
The problem with these new models is that they’re only available for customers with OpenAI plus subscriptions, setting you back $20 each month (excluding tax). Instead of using OpenAI’s version, you can also setup your own gpt-4 instance on Azure OpenAI .
Great! But what’s in it for me?
* <a class="read-more" href="/host-your-own-chatgpt-instance-azure-openai/">»</a></p>
</section>
<footer class="post-meta">
<a href="/author/bart/" class="static-avatar author-profile-image">Bart Jansen</a>
<time class="post-date" datetime="2023-10-31">31 October 2023</time>
<span class="reading-time post-date">2 min read</span>
</footer>
</article>
<article class="post tag-managed-identity tag-databricks tag-rbac tag-terraform no-image">
<header class="post-header">
<h2 class="post-title"><a href="/using-a-managed-identity-with-databricks-to-run-notebooks-through-a-web-app/">Using a Managed Identity with Databricks to Run Notebooks Through a Web App</a></h2>
</header>
<section class="post-excerpt">
<p>Databricks is great for processing data, and out of the box comes with 'Jobs' to automate and schedule notebooks. If you want more control over these triggers, customize the notebook parameters or have your own orchestrator, you could also trigger these notebook runs via another resource, such as a Web App. We can use the Web App's managed identity to run Databricks notebooks. This is a powerful way to automate and secure your data processing workflows, and it's surprisingly easy to set up.
Wh <a class="read-more" href="/using-a-managed-identity-with-databricks-to-run-notebooks-through-a-web-app/">»</a></p>
</section>
<footer class="post-meta">
<a href="/author/bart/" class="static-avatar author-profile-image">Bart Jansen</a>
<time class="post-date" datetime="2023-10-18">18 October 2023</time>
<span class="reading-time post-date">4 min read</span>
</footer>
</article>
<article class="post tag-azure tag-keda tag-aks tag-autoscaling tag-kubernetes tag-helm">
<header class="post-header">
<h2 class="post-title"><a href="/adding-keda-aks-cluster/">Adding Event-driven Autoscaling to your Kubernetes Cluster</a></h2>
</header>
<section class="post-excerpt">
<p>Azure Kubernetes Service (AKS) comes with a Cluster Autoscaler (CA) that can automatically add nodes to the node pool based on the load of the cluster (based on CPU/memory usage). KEDA is active on the pod-level and uses Horizontal Pod Autoscaling (HPA) to dynamically add additional pods based on the configured scaler. CA and KEDA therefore go hand-in-hand when managing dynamic workloads on an AKS cluster since they scale on different dimensions, based on different rules, as shown below:
Overv <a class="read-more" href="/adding-keda-aks-cluster/">»</a></p>
</section>
<footer class="post-meta">
<a href="/author/bart/" class="static-avatar author-profile-image">Bart Jansen</a>
<time class="post-date" datetime="2021-07-13">13 July 2021</time>
<span class="reading-time post-date">4 min read</span>
</footer>
</article>
<article class="post tag-azure tag-aks tag-terraform tag-application-gateway tag-azure-container-registry tag-azure-key-vault tag-pod-identity">
<header class="post-header">
<h2 class="post-title"><a href="/deploying-a-fully-configured-aks-cluster-in-azure-using-terraform/">Deploying a fully configured AKS cluster in Azure using Terraform</a></h2>
</header>
<section class="post-excerpt">
<p>Setting up an Azure Kubernetes Service (AKS) using Terraform, is fairly easy. Setting up a full-fledged AKS cluster that can read images from Azure Container Registry (ACR), fetch secrets from Azure Key Vault using Pod Identity while all traffic is routed via an AKS managed Application Gateway is much harder.
To save others from all the trouble I encountered while creating this one-click-deployment, I've published a GitHub repository that serves as a boilerplate for the scenario described above <a class="read-more" href="/deploying-a-fully-configured-aks-cluster-in-azure-using-terraform/">»</a></p>
</section>
<footer class="post-meta">
<a href="/author/bart/" class="static-avatar author-profile-image">Bart Jansen</a>
<time class="post-date" datetime="2021-03-23">23 March 2021</time>
<span class="reading-time post-date">5 min read</span>
</footer>
</article>
<article class="post tag-chat-bot tag-luis tag-azure tag-azure-bot-framework">
<header class="post-header">
<h2 class="post-title"><a href="/how-do-you-pimp-your-festival-with-a-chat-bot/">How do you pimp your festival? With a chat bot!</a></h2>
</header>
<section class="post-excerpt">
<p>Last week, we teamed up with 20 different developers for a hackathon to create a chat bot for the Eurosonic Noorderslag festival. Eurosonic Noorderslag is an annual festival for new and upcoming artists with over 40,000 attendees. The purpose of our bot is to provide the attendees with near real-time answers to everything related to the festival. Together with these developers we built a fully functioning bot using the Azure Bot Framework.
In this blog I'll briefly introduce the technology we h <a class="read-more" href="/how-do-you-pimp-your-festival-with-a-chat-bot/">»</a></p>
</section>
<footer class="post-meta">
<a href="/author/bart/" class="static-avatar author-profile-image">Bart Jansen</a>
<time class="post-date" datetime="2017-01-26">26 January 2017</time>
<span class="reading-time post-date">3 min read</span>
</footer>
</article>
<nav class="pagination">
<span class="page-number">Page 1 of 2</span>
<a class="older-posts" href="/page/2/">Older Posts <span aria-hidden="true">→</span></a>
</nav>
</main>
<footer class="site-footer clearfix">
<section class="copyright"><a href="https://blog.bart.je">Bart Jansen</a> © 2024</section>
<section class="poweredby">Proudly published with <a href="https://ghost.org">Ghost</a></section>
</footer>
</div>
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="/assets/js/jquery.fitvids.js?v=1138f1bfa3"></script>
<script type="text/javascript" src="/assets/js/index.js?v=1138f1bfa3"></script>
<script type="text/javascript" src="/assets/js/prism.js?v=1138f1bfa3"></script>
<script type="text/javascript" src="/assets/js/rrssb.min.js?v=1138f1bfa3"></script>
<script type="text/javascript">
jQuery(document).ready(function($) {
$('.rrssb-buttons').rrssb({
// required:
title: '',
url: '',
// optional:
description: '',
// emailBody: 'Usually email body is just the description + url, but you can customize it if you want'
});
});
</script>
<script>
// TO ACTIVATE ADD var ga_id = "your_ga_id" to ghost code injection header
if (window.ga_id) {
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', window.ga_id, 'auto');
ga('require', 'linkid', 'linkid.js');
ga('send', 'pageview');
}
</script>
<script>
if(window.social_link){
var url_regexp = /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
$.each(window.social_link,function(type, url){
if(typeof url ==="string" && url_regexp.test(url)){
$('<li>').append($('<a>',{
html: '<i class="fa fa-'+type+'"></i>',
title: type,
href: url,
target: "_blank"
})
).appendTo('.social_link');
}
})
}
</script>
<script>
var images = document.querySelectorAll('.kg-gallery-image img');
images.forEach(function (image) {
var container = image.closest('.kg-gallery-image');
var width = image.attributes.width.value;
var height = image.attributes.height.value;
var ratio = width / height;
container.style.flex = ratio + ' 1 0%';
image.onclick = function() {
var win = window.open(image.src, '_blank');
win.focus();
};
});
var otherImages = document.querySelectorAll('img.kg-image');
otherImages.forEach(function(image) {
image.onclick = function() {
var win = window.open(image.src, '_blank');
win.focus();
};
});
</script>
</body>
</html>