-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfeed.xml
542 lines (358 loc) · 47.3 KB
/
feed.xml
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
<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.2">Jekyll</generator><link href="https://www.shreyasmm.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.shreyasmm.com/" rel="alternate" type="text/html" /><updated>2023-06-19T11:04:12+00:00</updated><id>https://www.shreyasmm.com/feed.xml</id><title type="html">Shreyas M M</title><subtitle>My Everyday Discoveries</subtitle><author><name>Shreyas M M</name></author><entry><title type="html">Cost-Cutting Strategies for Developers</title><link href="https://www.shreyasmm.com/cost-cutting-strategies-for-developers" rel="alternate" type="text/html" title="Cost-Cutting Strategies for Developers" /><published>2023-06-18T18:18:06+00:00</published><updated>2023-06-18T18:18:06+00:00</updated><id>https://www.shreyasmm.com/cost-cutting-strategies-for-developers</id><content type="html" xml:base="https://www.shreyasmm.com/cost-cutting-strategies-for-developers"><![CDATA[<p><img src="/assets/images/cost.jpg" alt="Cost-Cutting Strategies for Developers" /></p>
<p>The Theme of this year is <strong>Cost Cutting</strong>, In the pursuit of cost-cutting, developers and DevOps engineers play a crucial role in identifying and implementing strategies that optimize resource usage and reduce expenses. This article explores powerful cost-saving measures, including leveraging AWS Graviton processors, adopting containerization and orchestration, optimizing program performance, and fostering a cost-conscious culture within development and DevOps teams.</p>
<ol>
<li>
<p>Leveraging AWS Graviton: AWS Graviton arm64 processors offer exceptional price-performance ratios, making them an excellent choice for cost-conscious organizations. Key considerations include:</p>
<p>Broad Compute Service Support: AWS has extended Graviton support to all major compute services, including EC2, EKS, ECS, RDS, Redshift, and more. Check out the <a href="https://github.com/aws/aws-graviton-getting-started/blob/main/managed_services.md">complete list</a> for details. Make use of Graviton EC2 instances and consider rewriting code to run in Lambda Graviton arm64 environments for enhanced cost efficiency.</p>
<p>Third-Generation Graviton Processors: The latest generation of Graviton processors offers improved performance and cost savings. Stay up-to-date with AWS announcements and evaluate how the third-generation processors can benefit your workloads.</p>
<p>Multi-Architecture Support: Leverage the added support for multi-architecture (arm64) images in AWS Elastic Container Registry (ECR). This allows you to optimize resource usage by utilizing Graviton processors when working with containerized applications.</p>
</li>
<li>
<p>Containerization and Orchestration: Containerization offers significant cost-cutting advantages by optimizing resource allocation, scalability, and deployment efficiency. Consider the following steps:</p>
<p>Utilize Docker and Kubernetes: Adopt containerization platforms like Docker and container orchestration tools such as Kubernetes to efficiently manage computing resources. These tools enable streamlined deployment and scaling of applications, resulting in reduced infrastructure costs.</p>
<p>Embrace Serverless (Lambda): Identify underutilized resources and transition appropriate workloads to serverless architectures using AWS Lambda. By leveraging serverless computing, you pay only for the actual execution time, eliminating the need for continuous infrastructure maintenance.</p>
</li>
<li>
<p>Performance Optimization: Optimizing program performance can lead to significant cost savings. Consider the following steps:</p>
<p>Multi-Core Aware Programs: Write code that utilizes multiple CPUs present in the environment. Utilize concurrency features like Python’s <code class="language-plaintext highlighter-rouge">multiprocessing</code> library to execute tasks across multiple cores, improving execution times and optimizing resource utilization.</p>
<p>Switch to Efficient Programming Languages: Consider migrating to programming languages like Rust and Go, known for their memory efficiency and performance. These languages can help reduce resource consumption, resulting in lower operational costs.</p>
</li>
<li>
<p>Fostering a Cost-Conscious Culture: Promote a cost-conscious mindset within development and DevOps teams to enhance cost optimization efforts. Encourage the following:</p>
<p>Regular Code Reviews: Review code regularly to identify areas for optimization, reduce resource consumption, and enhance overall efficiency.</p>
<p>Team Collaboration: Facilitate collaboration between development, operations, and finance teams to align on cost-saving initiatives and share responsibility for optimizing resource usage.</p>
</li>
</ol>
<p>Conclusion: In the pursuit of cost-cutting, developers and DevOps engineers have numerous opportunities to optimize resource usage and reduce expenses. By leveraging AWS Graviton processors, adopting containerization and orchestration, optimizing program performance, and fostering a cost-conscious culture, organizations can achieve significant cost savings while maintaining operational excellence in today’s competitive landscape.</p>
<h2 id="references">References</h2>
<ol>
<li><a href="https://aws.amazon.com/ec2/graviton/">https://aws.amazon.com/ec2/graviton/</a></li>
<li><a href="https://aws.amazon.com/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/">https://aws.amazon.com/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/</a></li>
<li><a href="https://docs.python.org/3/library/multiprocessing.html">https://docs.python.org/3/library/multiprocessing.html</a></li>
<li><a href="https://aws.plainenglish.io/aws-lambda-now-supports-arm64-graviton2-a-win-for-our-planet-b8d4b86a8427">https://aws.plainenglish.io/aws-lambda-now-supports-arm64-graviton2-a-win-for-our-planet-b8d4b86a8427</a></li>
<li><a href="https://aws.amazon.com/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/">https://aws.amazon.com/blogs/aws/aws-lambda-functions-powered-by-aws-graviton2-processor-run-your-functions-on-arm-and-get-up-to-34-better-price-performance/</a></li>
<li><a href="https://aws.amazon.com/blogs/compute/migrating-aws-lambda-functions-to-arm-based-aws-graviton2-processors/">https://aws.amazon.com/blogs/compute/migrating-aws-lambda-functions-to-arm-based-aws-graviton2-processors/</a></li>
</ol>]]></content><author><name>Shreyas M M</name></author><category term="server" /><category term="aws" /><category term="programming" /><category term="cloud" /><category term="aws" /><category term="graviton" /><summary type="html"><![CDATA[Cost-Cutting Strategies for Developers and DevOps Engineers in 2023]]></summary></entry><entry><title type="html">Securing Web Applications with AWS ALB Authentication and OKTA OIDC</title><link href="https://www.shreyasmm.com/securing-web-applications-with-aws-elb-and-okta" rel="alternate" type="text/html" title="Securing Web Applications with AWS ALB Authentication and OKTA OIDC" /><published>2019-04-08T05:02:06+00:00</published><updated>2019-04-08T05:02:06+00:00</updated><id>https://www.shreyasmm.com/securing-web-applications-with-aws-elb</id><content type="html" xml:base="https://www.shreyasmm.com/securing-web-applications-with-aws-elb-and-okta"><![CDATA[<p><img src="/assets/images/okta.jpg" alt="AWS ELB Authentication with OKTA" />
<strong>Contents</strong></p>
<ul>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#assumptions">Assumptions</a></li>
<li><a href="#configuring-okta">Configuring OKTA</a></li>
<li><a href="#configuring-aws-application-load-balancer">Configuring AWS Application Load Balancer</a></li>
<li><a href="#shortcomings">Shortcomings</a></li>
<li><a href="#resources">Resources</a></li>
</ul>
<h2 id="introduction">Introduction</h2>
<p>AWS Elastic Load Balancer Service has introduced Builtin Authentication which supports any third party OIDC (<a href="https://openid.net/connect/">Open ID Connect</a>) Identity provider or <a href="https://aws.amazon.com/cognito/">AWS Cognito</a>.</p>
<p>Many organizations use centralized identity servers like <a href="https://www.okta.com">OKTA</a>, <a href="https://azure.microsoft.com/en-in/services/active-directory/">Azure Active Directory</a>, <a href="https://auth0.com/">Auth0</a>, and <a href="https://www.onelogin.com/">Onelogin</a> to secure there complete cloud solutions.</p>
<p>Now with this support we can use same OIDC identity providers with less effort to provide Authentication to Web Apps and Web Pages which are behind the AWS ALB (Applcation Loadbalancer). It also helps to take off the load of authentication of users form web application. In this article i will be showing how we can use AWS ALB builtin authentication with OKTA OIDC.</p>
<h2 id="assumptions">Assumptions</h2>
<p>OKTA Organization URL → <code class="language-plaintext highlighter-rouge">https://dev-267174.okta.com</code><br />
ALB Endpoint → <code class="language-plaintext highlighter-rouge">https://www.alb-okta-test.com</code><br />
Architecture<br />
<img src="/assets/images/okta1.jpg" alt="AWS OKTA Arch" /></p>
<h2 id="configuring-okta">Configuring OKTA</h2>
<p>Create a new OKTA Developer Account. We will be creating a new Client Application from Applications → Add Applications. Select the Application Platform as WEB
<img src="/assets/images/okta2.png" alt="AWS ELB Authentication with OKTA" /></p>
<p>Give Application label → Any Name<br />
Login redirect URIs → <code class="language-plaintext highlighter-rouge">https://www.alb-okta-test.com/oauth2/idpresponse</code><br />
Initiate login URI → <code class="language-plaintext highlighter-rouge">https://www.alb-okta-test.com</code><br />
Group assignments → Everyone or Any Specific Group<br />
Grant type allowed → Authorization Code only
Once Created Note down the Client Credentials → Client ID & Client Secret</p>
<p><img src="/assets/images/okta3.png" alt="AWS ELB Authentication with OKTA" />
And in Assignments make sure you have atleast one User assigned to login.</p>
<p>Goto API → Authorization Servers, Get your Issuer URI from there.<br />
<img src="/assets/images/okta4.png" alt="AWS ELB Authentication with OKTA" /></p>
<p><strong>Now all your Endpoints will be</strong><br />
Issuer Endpoint → <code class="language-plaintext highlighter-rouge">https://dev-267174.okta.com/oauth2/default</code><br />
Authorization Endpoint → <code class="language-plaintext highlighter-rouge">https://dev-267174.okta.com/oauth2/default/v1/authorize</code><br />
Token Endpoint → <code class="language-plaintext highlighter-rouge">https://dev-267174.okta.com/oauth2/default/v1/token</code><br />
User Info Endpoint → <code class="language-plaintext highlighter-rouge">https://dev-267174.okta.com/oauth2/default/v1/userinfo</code><br />
Client ID & Client Secret → Get from the OKTA Client Application.</p>
<h2 id="configuring-aws-application-load-balancer">Configuring AWS Application Load Balancer</h2>
<p>Assuming that Load Balancers, Target Groups and EC2 Instances have properly configured. Goto Amazon EC2 → Load Balancers → Select required ALB → Click on Listeners TAB → Select HTTPS → Click on Edit. You will be Redirected to Listener Pages
<img src="/assets/images/okta5.png" alt="AWS ELB Authentication with OKTA" />
Click on Add Action → Select Authenticate.<br />
<strong>Under Authenticate</strong><br />
Authenticate → OIDC<br />
Issuer Endpoint → <code class="language-plaintext highlighter-rouge">https://dev-267174.okta.com/oauth2/default</code><br />
Authorization Endpoint → <code class="language-plaintext highlighter-rouge">https://dev-267174.okta.com/oauth2/default/v1/authorize</code><br />
Token Endpoint → <code class="language-plaintext highlighter-rouge">https://dev-267174.okta.com/oauth2/default/v1/token</code><br />
User Info Endpoint → <code class="language-plaintext highlighter-rouge">https://dev-267174.okta.com/oauth2/default/v1/userinfo</code><br />
Client ID & Client Secret → Get it from your OKTA Client Application.<br />
<img src="/assets/images/okta6.png" alt="AWS ELB Authentication with OKTA" />
<strong>Under Advanced Settings</strong><br />
Session cookie name → <code class="language-plaintext highlighter-rouge">AWSELBAuthSessionCookie</code><br />
Session timeout → <code class="language-plaintext highlighter-rouge">300</code><br />
Scope → <code class="language-plaintext highlighter-rouge">openid profile</code><br />
Action on unauthenticated request → <code class="language-plaintext highlighter-rouge">Authenticate (client reattempt)</code><br />
<img src="/assets/images/okta7.png" alt="AWS ELB Authentication with OKTA" />
Now Click Save or Update. Visit <code class="language-plaintext highlighter-rouge">https://www.alb-okta-test.com</code> or your Load Balancer URL which will be redirected to OKTA Sign in Page
<img src="/assets/images/okta8.png" alt="AWS ELB Authentication with OKTA" />
Once Logged in You will able to view the site and AWS ALB Session Cookie is Set.
<img src="/assets/images/okta9.png" alt="AWS ELB Authentication with OKTA" /></p>
<h2 id="shortcomings">Shortcomings</h2>
<p>When an application needs to log out an authenticated user, it should set the expiration time of the authentication session cookie (AWSELBAuthSessionCookie) to -1 and redirect the client to the IdP (OKTA ) logout endpoint which is</p>
<p><code class="language-plaintext highlighter-rouge">GET https://dev-267174.okta.com/oauth2/default/v1/logout?id_token_hint=${id_token}</code></p>
<p>Since we do not have the id_token to make this request because the id_token was give to AWS ALB, we cannot see this in browser also, AWS ALB internally gets the id_token and sets the session cookie.
One way to overcome this is set short session timeout like 300 seconds in loadbalancer configuration. <a href="https://docs.aws.amazon.com/elasticloadbalancing/latest/application/listener-authenticate-users.html#authentication-logout-timeout">Refer here</a></p>
<h2 id="resources">Resources</h2>
<ol>
<li><a href="https://docs.aws.amazon.com/elasticloadbalancing/latest/application/listener-authenticate-users.html">https://docs.aws.amazon.com/elasticloadbalancing/latest/application/listener-authenticate-users.html</a></li>
<li><a href="https://connect2id.com/learn/openid-connect">https://connect2id.com/learn/openid-connect</a></li>
<li><a href="https://developer.okta.com/docs/api/resources/oidc">https://developer.okta.com/docs/api/resources/oidc</a></li>
</ol>]]></content><author><name>Shreyas M M</name></author><category term="server" /><category term="aws" /><category term="cloud" /><category term="okta" /><category term="aws" /><summary type="html"><![CDATA[Authenticating AWS ELB with OKTA OIDC]]></summary></entry><entry><title type="html">Tomcat Log Rotation, Compression, Encryption (GDPR Compliance) and Copy to AWS S3</title><link href="https://www.shreyasmm.com/tomcat-log-rotation-compression-encryption-gdpr-compliance-and-copy-to-aws-s3" rel="alternate" type="text/html" title="Tomcat Log Rotation, Compression, Encryption (GDPR Compliance) and Copy to AWS S3" /><published>2018-09-26T11:02:06+00:00</published><updated>2018-09-26T11:02:06+00:00</updated><id>https://www.shreyasmm.com/tomcat-log-rotation-compression-encryption-gdpr-compliance-and-copy-to-aws-s3</id><content type="html" xml:base="https://www.shreyasmm.com/tomcat-log-rotation-compression-encryption-gdpr-compliance-and-copy-to-aws-s3"><![CDATA[<p><img src="/assets/images/tomcat-log-rotation.jpg" alt="Tomcat Log Rotation" /></p>
<p>In production environment the logs of applications are important, we need to store them for compliance reasons and make sure that the log files dont fill up the disk space. Since the EU GDPR Privacy law has been passed, the log files need to be encrypted.</p>
<p>In Linux we have a beautiful log management utility logrotate, which is run regularly to rotate the logs files of apt, dpkg, cups-daemon, rsyslog, ufw etc. configuration of these logs are found in <code class="language-plaintext highlighter-rouge">/etc/logrotate.d</code></p>
<p>I am running Tomcat 9 and CATALINA_HOME=/opt/tomcat. You can install Tomcat 9 from <a href="/">here</a>. Tomcat rotates the logs by itself in a default setup. which is configured in <code class="language-plaintext highlighter-rouge">/opt/tomcat/conf/logging.properties</code> file. we need explicitly configure tomcat to not to rotate the log files like catalina.out itself, since we will be rotating and compressing them using system logrotate utility.</p>
<p>Add this lines to <code class="language-plaintext highlighter-rouge">/opt/tomcat/conf/logging.properties</code></p>
<noscript><pre>400: Invalid request</pre></noscript>
<script src="https://gist.github.com/f2579a891905442906167c7d77a99198.js"> </script>
<p>I have added one line to each log entry <code class="language-plaintext highlighter-rouge">org.apache.juli.AsyncFileHandler.rotatable = false</code> to stop rotation of logs by tomcat, Once this is done tomcat will not rotate the logs by itself.</p>
<h4 id="logrotate-and-compression">Logrotate and Compression</h4>
<p>create a new file at <code class="language-plaintext highlighter-rouge">/etc/logrotate.d/tomcat</code></p>
<noscript><pre>400: Invalid request</pre></noscript>
<script src="https://gist.github.com/ec043a956c9d56580217f4824392ffc3.js"> </script>
<p><code class="language-plaintext highlighter-rouge">compress</code> – compress the log files
<code class="language-plaintext highlighter-rouge">compresscmd</code> – command used for Compression, gzip
<code class="language-plaintext highlighter-rouge">compressoptions</code> – options for compression command, Gzip Compression level 1-9
<code class="language-plaintext highlighter-rouge">compressext</code> – extention of compressed file</p>
<p>its just going to do <code class="language-plaintext highlighter-rouge">gzip -9 filename</code> , which compresses the file.</p>
<p><code class="language-plaintext highlighter-rouge">dateext</code>
<code class="language-plaintext highlighter-rouge">dateformat -%Y-%m-%d-%s</code>
these lines add date extention to the rotated log file in the format <code class="language-plaintext highlighter-rouge">catalina.out-2018-09-21-1537501441</code></p>
<p><code class="language-plaintext highlighter-rouge">nomail</code> tells not mail the log files</p>
<p><code class="language-plaintext highlighter-rouge">copytruncate</code> – copies the log file to new file and truncates the log file to zero bytes.</p>
<p><code class="language-plaintext highlighter-rouge">daily</code> – rotates the log file daily</p>
<p><code class="language-plaintext highlighter-rouge">rotate 10</code> – keep the 10 past rotated logs</p>
<p><code class="language-plaintext highlighter-rouge">notifempty</code> – do not rotate the log if it is empty</p>
<p><code class="language-plaintext highlighter-rouge">missingok</code> – if the file is missing its ok</p>
<p><code class="language-plaintext highlighter-rouge">create 0644 tomcat tomcat</code> – create the log file with these permissions, ignored if copy truncate is used.</p>
<p><code class="language-plaintext highlighter-rouge">postrotate</code> – command to run after the log rotation.</p>
<p>Here we are running the a custom Bash command to encrypt and move the log files to AWS S3</p>
<h4 id="encryption-and-copying-to-aws-s3">Encryption and Copying to AWS S3</h4>
<p>Create a Bash Shell Script <code class="language-plaintext highlighter-rouge">vim /usr/share/encrypt</code></p>
<noscript><pre>400: Invalid request</pre></noscript>
<script src="https://gist.github.com/64dac1afc1274878e1aa9a3ce1fac6ef.js"> </script>
<p>Give it execute permissions</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">chmod</span> +x /usr/share/encrypt
</code></pre></div></div>
<p>This script will encrypt the file with .gz which are compressed files and accept the two arguments location of gz files and Encryption key</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>encrypt /opt/tomcat/log /data/key
</code></pre></div></div>
<p>Key is needed to encrypt and decrypt the file</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cat</span> /data/key
Big3secret
</code></pre></div></div>
<p>Encrypt command will get list of files in given location and if the file has .gz extention the it will encrypt it with gpg (GNU Privacy Guard), move all the encrypted files which has .gpg extention to aws s3 bucket and once uploaded it will delete the encrypted file from that location. For copying the encrypted logs to S3 make sure that the ec2 instance has write to S3 IAM Access Role assigned to it.</p>
<p>For Decryption of files</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gpg <span class="nt">--batch</span> <span class="nt">--passphrase-file</span> /data/mykey <span class="nt">-d</span> catalina.out-2018-09-21-1537501441.gz.gpg <span class="o">></span> catalina.out-2018-09-21-1537501441.gz
</code></pre></div></div>]]></content><author><name>Shreyas M M</name></author><category term="server" /><category term="aws" /><category term="cloud" /><category term="gdpr" /><category term="linux" /><category term="logrotation" /><category term="tomcat" /><summary type="html"><![CDATA[Tomcat server log rotation and encrypting logs, copying logs to AWS S3.]]></summary></entry><entry><title type="html">How to Install Tomcat</title><link href="https://www.shreyasmm.com/how-to-install-tomcat" rel="alternate" type="text/html" title="How to Install Tomcat" /><published>2018-09-25T11:02:06+00:00</published><updated>2018-09-25T11:02:06+00:00</updated><id>https://www.shreyasmm.com/how-to-install-tomcat</id><content type="html" xml:base="https://www.shreyasmm.com/how-to-install-tomcat"><![CDATA[<p><img src="/assets/images/install-tomcat.jpg" alt="How to Install Tomcat" /></p>
<p>Tomcat is web server and servlet container which is used to run java applications, i will be showing the steps to install tomcat and java in an production system. i will be installing Tomcat 9 and OpenJDK 1.8 (Java 8). Most Steps are common for Redhat and Debian based systems.</p>
<h4 id="java-8-installation">Java 8 Installation</h4>
<p>For Redhat based Distribution</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yum <span class="nb">install </span>java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel.x86_64
</code></pre></div></div>
<p>For Debian and Ubuntu based Distribution</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt <span class="nb">install </span>openjdk-8-jdk
</code></pre></div></div>
<p>Get the Java Installed Version</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>java <span class="nt">-version</span>
openjdk version <span class="s2">"1.8.0_181"</span>
OpenJDK Runtime Environment <span class="o">(</span>build 1.8.0_181-b13<span class="o">)</span>
OpenJDK 64-Bit Server VM <span class="o">(</span>build 25.181-b13, mixed mode<span class="o">)</span>
</code></pre></div></div>
<p>We need to set JAVA_HOME environment variable so run and get the JAVA_HOME Path</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>update-alternatives <span class="nt">--config</span> java
</code></pre></div></div>
<p>Edit file <code class="language-plaintext highlighter-rouge">vim /etc/environment</code> add JAVA_HOME environment variable</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">JAVA_HOME</span><span class="o">=</span><span class="s2">"/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-1.b15.el7_2.x86_64/jre"</span>
</code></pre></div></div>
<p>Logout and Login, run <code class="language-plaintext highlighter-rouge">env</code>, Check for JAVA_HOME in the output.</p>
<h4 id="tomcat-9-installation">Tomcat 9 Installation</h4>
<p>Create a tomcat group</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>groupadd tomcat
</code></pre></div></div>
<p>Create a tomcat user with /opt/tomcat as its home directory</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> <span class="nt">-p</span> /opt/tomcat
useradd <span class="nt">-s</span> /bin/false <span class="nt">-g</span> tomcat <span class="nt">-d</span> /opt/tomcat tomcat
</code></pre></div></div>
<p>Change working directory and download the latest tomcat from <a href="https://tomcat.apache.org">tomcat website</a></p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd</span> /opt
wget http://mirrors.wuchna.com/apachemirror/tomcat/tomcat-9/v9.0.12/bin/apache-tomcat-9.0.12.tar.gz
</code></pre></div></div>
<p>Extract the Tomcat archive</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">tar</span> <span class="nt">-xzvf</span> apache-tomcat-9.0.12.tar.gz
</code></pre></div></div>
<p>Move Contents to <code class="language-plaintext highlighter-rouge">/opt/tomcat</code></p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mv </span>apache-tomcat/<span class="k">*</span> /opt/tomcat
</code></pre></div></div>
<p>Change ownership and user to tomcat</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">chown</span> <span class="nt">-R</span> tomcat:tomcat /opt/tomcat
</code></pre></div></div>
<p>Create Systemd Service for Tomcat Service</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>vim /etc/systemd/system/tomcat.service
</code></pre></div></div>
<noscript><pre>400: Invalid request</pre></noscript>
<script src="https://gist.github.com/a3b4986605aa6c2a0b930ac11ada8ae0.js"> </script>
<p>Reload systemd manager configuration.</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl daemon-reload
</code></pre></div></div>
<p>Start Tomcat Process.</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl start tomcat
</code></pre></div></div>
<p>Enable Tomcat to Start at System Boot.</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl <span class="nb">enable </span>tomcat
</code></pre></div></div>
<p>Run <code class="language-plaintext highlighter-rouge">netstat -plntu</code> and check port 8080 is in LISTEN State by a java program. Now open <code class="language-plaintext highlighter-rouge">http://server-ip-addres:8080</code> you should see tomcat homepage</p>
<p>Configure Tomcat Manager Users</p>
<noscript><pre>400: Invalid request</pre></noscript>
<script src="https://gist.github.com/8654a629ec28798e944cf36eff9985c5.js"> </script>
<p>Restart Tomcat Process.</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl restart tomcat
</code></pre></div></div>
<p>Make sure all the Files in <code class="language-plaintext highlighter-rouge">/opt/tomcat</code> belong to Tomcat user and group, Run this Command whenever you new deploy WAR in <code class="language-plaintext highlighter-rouge">/opt/tomcat/webapps</code></p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">chown</span> <span class="nt">-R</span> tomcat:tomcat /opt/tomcat
</code></pre></div></div>]]></content><author><name>Shreyas M M</name></author><category term="server" /><category term="cloud" /><category term="linux" /><category term="tomcat" /><summary type="html"><![CDATA[Installing Java, Tomcat and Tomcat server configuration.]]></summary></entry><entry><title type="html">How to Install Nodejs on Ubuntu</title><link href="https://www.shreyasmm.com/install-nodejs-ubuntu" rel="alternate" type="text/html" title="How to Install Nodejs on Ubuntu" /><published>2017-03-19T11:02:06+00:00</published><updated>2017-03-19T11:02:06+00:00</updated><id>https://www.shreyasmm.com/install-nodejs-ubuntu</id><content type="html" xml:base="https://www.shreyasmm.com/install-nodejs-ubuntu"><![CDATA[<p><img src="/assets/images/how-to-install-nodejs.jpg" alt="How to Install Nodejs on Ubuntu" class=".center" /></p>
<p>Today I am going to show How to install <a href="https://nodejs.org">nodejs</a> on your ubuntu machine of any version, you can install multiple versions of nodejs at same time using nvm.</p>
<h4 id="nvm--node-version-manager"><a href="https://github.com/creationix/nvm">NVM – Node Version Manager</a></h4>
<p>nvm is to node what rbenv is to ruby, nvm helps us to use multiple versions of node on project level and over all system wide level, We will be using nvm to install because ubuntu does not have latest version of node. This is the easiest method of all and to stay updated on latest release of node, lets install nvm</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://github.com/creationix/nvm.git .nvm
</code></pre></div></div>
<p>Now we need to source the nvm directory and nvm.sh to the shell, Add below lines to your <code class="language-plaintext highlighter-rouge">~/.bashrc</code>, <code class="language-plaintext highlighter-rouge">~/.profile</code>, or <code class="language-plaintext highlighter-rouge">~/.zshrc</code> based on the shell you use, so that the command will be available on you login</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">export </span><span class="nv">NVM_DIR</span><span class="o">=</span><span class="s2">"</span><span class="nv">$HOME</span><span class="s2">/.nvm"</span>
<span class="o">[</span> <span class="nt">-s</span> <span class="s2">"</span><span class="nv">$NVM_DIR</span><span class="s2">/nvm.sh"</span> <span class="o">]</span> <span class="o">&&</span> <span class="nb">.</span> <span class="s2">"</span><span class="nv">$NVM_DIR</span><span class="s2">/nvm.sh"</span>
</code></pre></div></div>
<p>Now get the list of available versions of nodejs</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvm ls-remote
</code></pre></div></div>
<p>Based on your requirement, install the node version i will go for LTS version</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvm <span class="nb">install </span>v6.10.0
</code></pre></div></div>
<p>Set this version as default</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvm <span class="nb">alias </span>default v6.10.0
</code></pre></div></div>
<p>Now Nodejs is installed</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>node <span class="nt">--version</span>
</code></pre></div></div>
<p>You also have access to npm (Node Package Manager) you can get many node packages with single command lets check its version</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nt">--version</span>
</code></pre></div></div>
<p>Now suppose any of your project depends on older version of node then run this in specific project directory</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s2">"4.8.0"</span> <span class="o">></span> .nvmrc
nvm use
</code></pre></div></div>]]></content><author><name>Shreyas M M</name></author><category term="ubuntu" /><category term="nodejs" /><category term="nvm" /><summary type="html"><![CDATA[Install nodejs on ubuntu using nvm the most easiest way and to stay updated on latest release of nodejs.]]></summary></entry><entry><title type="html">I Just Cleared RHCE</title><link href="https://www.shreyasmm.com/i-just-cleared-rhce" rel="alternate" type="text/html" title="I Just Cleared RHCE" /><published>2016-09-12T11:02:06+00:00</published><updated>2016-09-12T11:02:06+00:00</updated><id>https://www.shreyasmm.com/i-just-cleared-rhce</id><content type="html" xml:base="https://www.shreyasmm.com/i-just-cleared-rhce"><![CDATA[<p><img src="/assets/images/rhce.jpg" alt="RHCE Logo" class=".center" /></p>
<p>After Two months preparation i finally cleared RHCE, on 27 Aug 2016 i received a mail saying congratulation on earning RHCE. the whole week was bliss, well i had cleared RHCSA with 300/300, RHCE with 271/300. I have done my RHCE on Red Hat Enterprise Linux 7.</p>
<p>RHCSA is very easy it involves many basic Linux things RHCE is more advanced you can get more details on exams & course contents <a href="https://www.redhat.com/en/services/certification/rhcsa">RHCSA</a> and <a href="https://www.redhat.com/en/services/certification/rhce">RHCE</a></p>
<h4 id="some-tips-on-how-to-clear-the-rhce">Some tips on how to clear the RHCE</h4>
<ol>
<li>Time management is very important and crucial when concentrating on RHCE.</li>
<li>Even though you may know how to solve the question if you take more time in solving that problem its not worth you would have wasted more time in it instead you would have solved more small questions in it.</li>
<li>Rather than working in GUI try working more in terminal you will definitely save time and use ssh when you want to execute on commands on systems.</li>
<li>When practising keep note of time, you are taking to solve the problem this will help you a lot and give you a confidence exam is of 3 and half hours , you may get last half an hour for solving.</li>
<li>When preparing i used books provided by redhat concentrate on concepts and solve the examples given in the books.</li>
<li>Everything is in man pages, examples on important things like teaming,etc are provided in the man pages you can easily get reference from there for faster execution</li>
<li>If you got struck in any question leave it go for next at the end when you have time try solving it, don’t take more than 10 mins solving a question</li>
<li>Enable all the required firewall ports once, install all the packages at once in the beginning, you will definitely save a huge amount of time in this</li>
<li>Restart after every entry in /etc/fstab to check you have done correctly. At the end don’t forget to restart you systems.</li>
<li>Write down important things in the paper provided to you in exam it will save time when working & checking.</li>
</ol>
<p><strong>Important</strong><br />
Practice as much as Possible
Remember when you are practising, follow this approach – Try solving the problems with less time, Execute the problems with minimising time.</p>]]></content><author><name>Shreyas M M</name></author><category term="others" /><category term="rhce" /><summary type="html"><![CDATA[How clear RHCE, Some tips on how to clear the RHCE,RHCSA is very easy it involves many basic Linux things RHCE is more advanced.]]></summary></entry><entry><title type="html">Setup Virtualbox for Local Development Environment</title><link href="https://www.shreyasmm.com/setup-virtualbox-for-local-development-environment" rel="alternate" type="text/html" title="Setup Virtualbox for Local Development Environment" /><published>2016-06-07T11:02:06+00:00</published><updated>2016-06-07T11:02:06+00:00</updated><id>https://www.shreyasmm.com/setup-virtualbox-for-local-development-environment</id><content type="html" xml:base="https://www.shreyasmm.com/setup-virtualbox-for-local-development-environment"><![CDATA[<p><img src="/assets/images/virtualbox.jpg" alt="Setup Virtualbox for Local Development Environment" /></p>
<p>Hi Today i am going show you how to setup virtualbox for local Development which will be useful when you are developing / deploying application inside the virtual machine and want to interact with it outside the virtual machine or from host machine,this is also helpful when you are developing for openstack you have installed openstack in vm and want to interact and test the api from host machine, before starting download & install <a href="https://www.virtualbox.org">Virtualbox</a>.</p>
<p>Watch Video Tutorial Over Here</p>
<style>.embed-container { position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden; max-width: 100%; } .embed-container iframe, .embed-container object, .embed-container embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }</style>
<div class="embed-container"> <iframe title="YouTube video player" width="640" height="390" src="//www.youtube.com/embed/qIxnx21sUDk" frameborder="0" allowfullscreen=""></iframe></div>
<h3 id="create-host-only-network-adapter">Create Host only network adapter</h3>
<p>Click on File -> Preference
<img src="/assets/images/virtualbox1.png" alt="Create Host only network adapter 1" /></p>
<p>Choose Network, Click Host-only Networks and click on plus sign
<img src="/assets/images/virtualbox2.png" alt="Create Host only network adapter 2" /></p>
<p>Click on Settings button of vboxnet0
<img src="/assets/images/virtualbox3.png" alt="Create Host only network adapter 3" /></p>
<p>Under Adapter Tab
<img src="/assets/images/virtualbox4.png" alt="Create Host only network adapter 4" /></p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>IPv4 Address 192.168.56.1
IPv4 Network Mask 255.255.255.0
</code></pre></div></div>
<p>Under DHCP Server Tab
<img src="/assets/images/virtualbox5.png" alt="Create Host only network adapter 5" /><br />
Check mark the “Enable Server option”</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Server Address 192.168.56.2
Server Mask 255.255.255.0
Lower Address Bound 192.168.56.3
Upper Address Bound 192.168.56.240
</code></pre></div></div>
<h4 id="add-host-only-adapter-to-virtual-machine-as-network-adapter-2">Add Host only adapter to virtual machine as Network Adapter 2</h4>
<p>Right Click on the vm and click on settings
<img src="/assets/images/virtualbox6.png" alt="Create Host only network adapter 6" /></p>
<p>Choose Network , Under Adapter 2<br />
Check Enable Network Adapter<br />
Attached to: Host-only Adapter<br />
Name: vboxnet0
<img src="/assets/images/virtualbox7.png" alt="Create Host only network adapter 7" /></p>
<p>Then boot the vm and run <code class="language-plaintext highlighter-rouge">sudo vim /etc/network/interfaces</code>
Add These two lines at end</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>auto enp0s8
iface enp0s8 inet dhcp
</code></pre></div></div>
<p>Save the file and reboot the vm</p>
<p>Full Contents of <code class="language-plaintext highlighter-rouge">/etc/network/interfaces</code> file</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># The loopback network interface</span>
auto lo
iface lo inet loopback
<span class="c"># The primary network interface</span>
auto enp0s3
iface enp0s3 inet dhcp
auto enp0s8
iface enp0s8 inet dhcp
</code></pre></div></div>
<p>Once the vm is booted find the ip address given by hostonly adapter by running <code class="language-plaintext highlighter-rouge">ip a</code> of <code class="language-plaintext highlighter-rouge">enp0s8</code> interface. Once you get that ip address you can ping, ssh, ftp or if you are running a webserver in vm you can access it from host machine. From your host machine run <code class="language-plaintext highlighter-rouge">ping [ip address of vm]</code>, install webserver on vm open it on host machine.</p>]]></content><author><name>Shreyas M M</name></author><category term="ubuntu" /><category term="videos" /><category term="development-environment" /><category term="openstack" /><category term="virtualbox" /><summary type="html"><![CDATA[I am going show you how to setup virtualbox for local Dev env which will be useful when you are developing/deploying application inside the virtual machine.]]></summary></entry><entry><title type="html">Install Django on Ubuntu</title><link href="https://www.shreyasmm.com/install-django-on-ubuntu" rel="alternate" type="text/html" title="Install Django on Ubuntu" /><published>2016-03-09T11:02:06+00:00</published><updated>2016-03-09T11:02:06+00:00</updated><id>https://www.shreyasmm.com/install-django-on-ubuntu</id><content type="html" xml:base="https://www.shreyasmm.com/install-django-on-ubuntu"><![CDATA[<p><img src="/assets/images/installing-django-on-ubuntu.jpg" alt="Installing Django on Ubuntu" /></p>
<p>Today i am going to show how to setup or install <a href="https://www.djangoproject.com">Django</a> environment on Ubuntu. I will be concentrating only on python 3 version. Django is web application framework written in python, It Uses MVT (Models, Views, Templates) Concept .</p>
<p>We will be installing django in an isolated environment but why? simple because we do not want django packages to mess with os python libraries, we will be using pip to install packages and virtualenv to create virtual environments.pip is a package management system used to install and manage software packages written in Python. Now open your terminal and follow this commands</p>
<p>Install python3 Pip</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>apt-get <span class="nb">install </span>python3-pip
</code></pre></div></div>
<p>Install Virtualenv</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>pip3 <span class="nb">install </span>virtualenv
</code></pre></div></div>
<p>Create new directory for your project</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">mkdir</span> <span class="nt">-p</span> Code/Django/myapp
<span class="nb">cd </span>Code/Django/myapp
</code></pre></div></div>
<p>Create new Virtual Environment we will call it py3</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>virtualenv py3
</code></pre></div></div>
<p>Once you run above command new directory py3 will be created. Now We need to activate our new py3 environment</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">source </span>py3/bin/activate
</code></pre></div></div>
<p>your prompt will be changed to <code class="language-plaintext highlighter-rouge">(py3) Code/Django/myapp</code></p>
<p>Now Install Django. Notice we are not running pip3 command, we will just run pip inside virtualenv</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>django
</code></pre></div></div>
<p>Once Django is installed, you can check the version by</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>django-admin <span class="nt">--version</span>
1.9.2
</code></pre></div></div>
<p>Lets start new project call makeinindia</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>django-admin startproject makeinindia
<span class="nb">cd </span>makeinindia
</code></pre></div></div>
<p>Lets start new app blog</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python manage.py startapp blog
</code></pre></div></div>
<p>Now we will start the server</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python manage.py runserver
</code></pre></div></div>
<p>Finally done, Whenever you want to leave the virtual environment just run to <code class="language-plaintext highlighter-rouge">deactivate</code></p>
<p>Dont forget to run this command Every time you want to work with your Django app</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">cd </span>Code/Django/myapp
<span class="nb">source </span>py3/bin/activate
</code></pre></div></div>]]></content><author><name>Shreyas M M</name></author><category term="ubuntu" /><category term="django" /><category term="ubuntu" /><summary type="html"><![CDATA[In this guide we will show how to install django on ubuntu using virtualenv and pip.we will install django in isolated environment.]]></summary></entry><entry><title type="html">Device Drivers in Linux</title><link href="https://www.shreyasmm.com/device-drivers-linux" rel="alternate" type="text/html" title="Device Drivers in Linux" /><published>2015-12-10T11:02:06+00:00</published><updated>2015-12-10T11:02:06+00:00</updated><id>https://www.shreyasmm.com/device-drivers-linux</id><content type="html" xml:base="https://www.shreyasmm.com/device-drivers-linux"><![CDATA[<p><img src="/assets/images/device-drivers.jpg" alt="Device Drivers in Linux" class=".center" /></p>
<p>This is my Advance Operating System Assignment. I will show how to Compile Linux Kernel from Source,You can download Linux Kernel From <a href="https://www.kernel.org">Here</a>.</p>
<p>https://www.slideshare.net/MMShreyas/device-drivers-in-linux</p>
<p>I also show how Device Drivers are implemented as Kernel modules, What is Purpose of Udev, How you can Manually load and unload Kernel modules at Run time.</p>]]></content><author><name>Shreyas M M</name></author><category term="presentations" /><category term="ubuntu" /><category term="linux" /><category term="presentations" /><summary type="html"><![CDATA[Compiling Linux Kernel From Source, How Device Drivers are Implemented in Linux, Manually Loading of Kernel Modules, Purpose of Udev.]]></summary></entry><entry><title type="html">Containers and Cloud: From LXC to Docker to Kubernetes</title><link href="https://www.shreyasmm.com/containers-cloud-lxc-docker-kubernetes" rel="alternate" type="text/html" title="Containers and Cloud: From LXC to Docker to Kubernetes" /><published>2015-12-05T11:02:06+00:00</published><updated>2015-12-05T11:02:06+00:00</updated><id>https://www.shreyasmm.com/containers-cloud-lxc-docker-kubernetes</id><content type="html" xml:base="https://www.shreyasmm.com/containers-cloud-lxc-docker-kubernetes"><![CDATA[<p><img src="/assets/images/containers-cloud-lxc-docker-kubernetes.jpg" alt="Containers and Cloud: From LXC to Docker to Kubernetes" class=".center" /></p>
<p>Well this is December a month full of Exams, Assignments, Seminars.This is my Seminar Topic Containers and Cloud: From LXC to Docker to Kubernetes, it speaks about how present Cloud system is moving from Hypervisors to Docker & Kubernetes.</p>
<p>https://www.slideshare.net/MMShreyas/containers-and-cloud-from-lxc-to-docker-to-kubernetes</p>]]></content><author><name>Shreyas M M</name></author><category term="presentations" /><category term="cloud" /><category term="docker" /><summary type="html"><![CDATA[My Seminar Presentation, it speaks about how present Cloud system is moving from Hypervisors to Docker & Kubernetes.]]></summary></entry></feed>