tag:blogger.com,1999:blog-46046998431982763932024-03-07T00:25:40.213-08:00Osama Oransa's BlogOsama Oransa's Blog
مدونة أسامة عرنسة
<br>
<b>Technology Evangelist</b>
<br>
<img src="https://1.bp.blogspot.com/-iVyOo4oda3Y/Xe5XQlkJbLI/AAAAAAAAAvU/IobT6T6XZ-Q6XkWD9bdgPjn779bsZacZgCLcBGAsYHQ/s1600/pic%2B%2528Custom%2529.jpg">
<br>
My Profile on Linked-In <a href="http://eg.linkedin.com/pub/osama-oransa/19/791/235">Osama Oransa</a>Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.comBlogger90125tag:blogger.com,1999:blog-4604699843198276393.post-48699620456165494452020-06-09T04:48:00.001-07:002020-06-22T03:03:51.476-07:00Cloud Native Application Builder<div dir="ltr" style="text-align: left;" trbidi="on">
This is my new Open Source project, aiming to manage cloud native application in more efficient way with experience similar to monolithic application.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAWKyPC1HXsaRINO4LfCetXYqiRR1tQeEBZGChkcjxeI2JDDSRFLomgO0Rp-vvvmwXoG_7HHF9oG0Tu1ovOXFjY0OjOiKrd4ZaWek-Y4t-L7nzduyucS8qsPYdtXCtR7eqn_wAWdtwhevb/s1600/sample.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="751" data-original-width="1359" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAWKyPC1HXsaRINO4LfCetXYqiRR1tQeEBZGChkcjxeI2JDDSRFLomgO0Rp-vvvmwXoG_7HHF9oG0Tu1ovOXFjY0OjOiKrd4ZaWek-Y4t-L7nzduyucS8qsPYdtXCtR7eqn_wAWdtwhevb/s400/sample.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The project is designed to allow adding code and deployment generators per technology so by time more components will be added easily.</div>
<div class="separator" style="clear: both; text-align: left;">
The project/code generation will be enhanced to include draft implementations and in the future the tool will commit the generated code into a git repository.</div>
<div class="separator" style="clear: both; text-align: left;">
Currently the project have the initial support for Qurarkus, SpringBoot and Java in addition to generating deployment commands for Tomcat, JBoss, MySQL, MongoDB, MariaDB, Redis and PostgreSQL. It is still in early development phases so expect some changes and improvement over time.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2SDeYOX4P1lr5hBhDfUlsNFvl7P4nMlWoBuTfw2sznrEfzTbHmjnZIR5Lzc7QVYStGv-nOaO2KN7QQLjiW4YiFJttpLafZTZbsq6-dtkJBZXJQCVu9Eql9u6DWxVIb4TrF3B2uQ-1zCFg/s1600/props.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="594" data-original-width="622" height="381" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2SDeYOX4P1lr5hBhDfUlsNFvl7P4nMlWoBuTfw2sznrEfzTbHmjnZIR5Lzc7QVYStGv-nOaO2KN7QQLjiW4YiFJttpLafZTZbsq6-dtkJBZXJQCVu9Eql9u6DWxVIb4TrF3B2uQ-1zCFg/s400/props.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both;">
<b><u>Project GitHub Location:</u></b></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<a href="https://github.com/osa-ora/app-designer">https://github.com/osa-ora/app-designer</a></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
You can import this maven project into an IDE and execute it, or run the maven commands:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; line-height: 1.45; margin-bottom: 16px; overflow-wrap: normal; overflow: auto; padding: 16px;"><code style="background: initial; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; overflow-wrap: normal; overflow: visible; padding: 0px; word-break: normal;">mvn clean install compile package</code></pre>
<div class="separator" style="clear: both; text-align: left;">
And then deploy into into any application server such as Glassfish, Tomcat, JBoss, WebLogic, WebSphere, etc.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Also you can deploy it directly into OpenShift using S2I:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; line-height: 1.45; margin-bottom: 16px; overflow-wrap: normal; overflow: auto; padding: 16px;"><code style="background: initial; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; overflow-wrap: normal; overflow: visible; padding: 0px; word-break: normal;">oc new-app --name=my-designer jboss-webserver30-tomcat8-openshift:1.3~https://github.com/osa-ora/app-designer
</code></pre>
<div>
<code style="background: initial; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; overflow-wrap: normal; overflow: visible; padding: 0px; word-break: normal;">And then expose a router to the application:</code></div>
<pre style="background-color: #f6f8fa; border-radius: 3px; box-sizing: border-box; color: #24292e; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; line-height: 1.45; margin-bottom: 16px; overflow-wrap: normal; overflow: auto; padding: 16px;"><code style="background: initial; border-radius: 3px; border: 0px; box-sizing: border-box; display: inline; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, monospace; font-size: 13.6px; line-height: inherit; margin: 0px; overflow-wrap: normal; overflow: visible; padding: 0px; word-break: normal;">oc expose service my-desginer </code></pre>
<div class="separator" style="clear: both; text-align: left;">
Access the application using {route_url}/AppBuilder-1.0-SNAPSHOT/</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
There is a "sample.json" file in the GIT repository in the "samples" folder where you can load it or create your own application stack (it load and save applications in JSON format).</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Disclaimer:</b> This tool is still under development, anyone willing to join and work on it, feel free to contact me :)</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br /></div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com1tag:blogger.com,1999:blog-4604699843198276393.post-18412661282030973402020-01-19T03:05:00.001-08:002020-01-19T03:05:30.400-08:00CI/CD in OpenShift using Jenkins<div dir="ltr" style="text-align: left;" trbidi="on">
One of the interesting part if the CI/CD in Openshift, which provided built-in capabilities using embeded Jenkins for that, 2 ways to build CI/CD using Jenkins either use Jenkins directly and configure everything or uses OpenShift Pipeline feature which uses Jenkins behind the scene, we will demonstrate both in this post.<br />
<br />
In this post, I will go through this using GitHub + OpenShift + Jenkins.<br />
<span style="color: red;"><b><br /></b></span>
<span style="color: red;"><b>Pre-requisites:</b></span><br />
<br />
You have deployed your application and have build configurations for that application already configured in OpenShift.<br />
<h4>
<span style="color: red;">Before We Start: Add Jenkins to OpenShift</span></h4>
From the search box, search for Jenkins and add it to your project, go through the configuration wizard and wait for its deployment till you get the Jenkins end point.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigI4_5q5RR6-blUFepHEi0LFMdFBzwn3r-0SNccNiwychaNVdbY158va13-qVlTnvvPQvGbKDfmae71aoEr6IWqRefLS5NQbY9Enq1fzNf8Uff08tuJIhv0-tZ7hNDzcYcpxObFjHUw2Zz/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="243" data-original-width="468" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigI4_5q5RR6-blUFepHEi0LFMdFBzwn3r-0SNccNiwychaNVdbY158va13-qVlTnvvPQvGbKDfmae71aoEr6IWqRefLS5NQbY9Enq1fzNf8Uff08tuJIhv0-tZ7hNDzcYcpxObFjHUw2Zz/s320/1.png" width="320" /></a></div>
<br />
<span style="text-align: center;">Get the Jenkins URL from the Routes section:</span><br />
<span style="text-align: center;"><br /></span>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7A8ttiTrTLgoCyXPtJcVkn9Y7gH9eJRZGGPmGk8I58QE1ec6z44QZwDN9EorwLcmWUmhi4_02b96c9lppGMHgkMRdzFmksEWNX4_Y4TVY159wnotVBMpV3Q5cu2nhjBPTXOQO8qqJA5C4/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="237" data-original-width="947" height="98" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg7A8ttiTrTLgoCyXPtJcVkn9Y7gH9eJRZGGPmGk8I58QE1ec6z44QZwDN9EorwLcmWUmhi4_02b96c9lppGMHgkMRdzFmksEWNX4_Y4TVY159wnotVBMpV3Q5cu2nhjBPTXOQO8qqJA5C4/s400/3.png" width="400" /></a></div>
<span style="text-align: center;"><br /></span>
<h2 style="text-align: left;">
<span style="color: #351c75;">Use Case I: Using Jenkins Directly</span></h2>
<h4 style="text-align: left;">
<span style="color: red;">1) Configure Jenkins</span></h4>
The Instant app Jenkins that come with OpenShift has a built in plugin for interaction with OpenShift, there is a sample project which you can either use or create a new one, simply rename the sample project with your project name and let's configure this step by step.<br />
<br />
<b>a) General Tab</b><br />
Add project description and may be GitHub URL (just some information about the project)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8hk3J69JYt_5dWh8Xk-wuAmCJHiv4syg9bV3sV9wKidYnvi0OqFNcpdlg7capTKwjW-2PydyFdeboI95RnJZFUUVLwCAVjfu6Gefw-8vF1_vP0iTFjbYENXfpv3BTdjZrmEDJVfW0DWpU/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="528" data-original-width="1020" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi8hk3J69JYt_5dWh8Xk-wuAmCJHiv4syg9bV3sV9wKidYnvi0OqFNcpdlg7capTKwjW-2PydyFdeboI95RnJZFUUVLwCAVjfu6Gefw-8vF1_vP0iTFjbYENXfpv3BTdjZrmEDJVfW0DWpU/s400/4.png" width="400" /></a></div>
<br />
<br />
<b>b) Source Code Management</b><br />
Add your project source code for me I have added: <a href="https://github.com/osa-ora/AcmeInternetBankingApp">https://github.com/osa-ora/AcmeInternetBankingApp</a> as my own repository and I uses the master branch for all the builds in my sample project.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLHK_IUQDvvRuqb-7QVDAM6hT850QEPsvfdkte8CrXD2dAef8QlrFNbVnBHMHuBQms6rjA9AA_YUy7eXVXPw-P3-hbbBYmuMDc8hBu4K3y5Wi5jxexoer-Xouz-rnO0NicN0hs9Ejab2Xo/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="541" data-original-width="953" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLHK_IUQDvvRuqb-7QVDAM6hT850QEPsvfdkte8CrXD2dAef8QlrFNbVnBHMHuBQms6rjA9AA_YUy7eXVXPw-P3-hbbBYmuMDc8hBu4K3y5Wi5jxexoer-Xouz-rnO0NicN0hs9Ejab2Xo/s400/5.png" width="400" /></a></div>
<br />
<br />
<b>c) Build Triggers</b><br />
Check Poll SCM and configure it like */2 * * * * which means every 2 minutes check for any new commits in the configured branch in the GitHub configured repository<br />
This is similar to cron job configurations: MINUTE HOUR DOM MONTH DOW<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB8ddcFqB6OnSuhQBzvjPMdZmBwoQRwCq6jvtREdBt18fTWma_sEgo8DGfSFrtzmUmY8z5YVbcLCtfDADybX4GIidWsuKSKSyjK42rkv1VmdJdaQRYwMLAM2pkhUqyPYLs-K3x5Dp0znpI/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="864" height="231" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB8ddcFqB6OnSuhQBzvjPMdZmBwoQRwCq6jvtREdBt18fTWma_sEgo8DGfSFrtzmUmY8z5YVbcLCtfDADybX4GIidWsuKSKSyjK42rkv1VmdJdaQRYwMLAM2pkhUqyPYLs-K3x5Dp0znpI/s400/6.png" width="400" /></a></div>
<br />
<br />
This is one way to achieve CI/CD from GitHub the other way that we are going to use is to use the WebHook to push any changes from GitHub to Jenkins as below in step 2 & 3 as it uses push rather than keep pinging GitHub for any changes.<br />
<div>
<br /></div>
<b>d) Build</b><br />
This is the core of any Jenkins project, you need to configure every step from the build till the deployment.<br />
In Trigger OpenShift build add the project name and build name as in OpenShift, also check the box for getting the build output, both project nme and build config should match exactly what is configured in OpenShift for this application.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3IJoXQMgv9qQhPwGWiaLoW62my9BIF_K5YtsrlQyLG71VCFMWNxzxuATu-IxA4H7xixgodZaJOj9c2xvkX-y7KmEYQfVbtXT98xjBS6497O56IcshWbHE1GtNlauPwc14vek3zEUcuG5b/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="511" data-original-width="864" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3IJoXQMgv9qQhPwGWiaLoW62my9BIF_K5YtsrlQyLG71VCFMWNxzxuATu-IxA4H7xixgodZaJOj9c2xvkX-y7KmEYQfVbtXT98xjBS6497O56IcshWbHE1GtNlauPwc14vek3zEUcuG5b/s400/7.png" width="400" /></a></div>
<br />
<br />
In deployment do the same, also configure the image stream name, tags, etc. and check the box for deployment validation.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy-zF-A0eOOuJm_apq8oyWWXi-ZUf63270mLI5uJq2t4-aTGsHnSsjMktCDhS0OwN-ULSmkedY2fZ1hM-PTUYRFvcNF9KXIfGCiWjXH0iiUIzZcdsdN01l06G33-YUdMrcaGwinQ7f9g7k/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="500" data-original-width="836" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiy-zF-A0eOOuJm_apq8oyWWXi-ZUf63270mLI5uJq2t4-aTGsHnSsjMktCDhS0OwN-ULSmkedY2fZ1hM-PTUYRFvcNF9KXIfGCiWjXH0iiUIzZcdsdN01l06G33-YUdMrcaGwinQ7f9g7k/s400/8.png" width="400" /></a></div>
<br />
You can optionally add scaling to the project as per the required number of nodes.<br />
<br />
<br />
<b>e) Post Build Actions</b><br />
You can optionally add some post build actions, like running certain script or some test cases, etc.<br />
<br />
To verify that every thing is configured properly, execute build now and check the console output, if any issues fix them.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNDc1W1zyoq0YQ0RtfbLmoxu7QDmU2jI8MERksto9fPNearLMdUCDyScw2OiNCPCkbGYHHCE38yrfysJ-b86jaAnQagwwrKWIAOS8FQoiSWEDhPAYSCrQ5ay-pB9H3AILZ8uAw-f6RBewS/s1600/9.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="479" data-original-width="806" height="237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNDc1W1zyoq0YQ0RtfbLmoxu7QDmU2jI8MERksto9fPNearLMdUCDyScw2OiNCPCkbGYHHCE38yrfysJ-b86jaAnQagwwrKWIAOS8FQoiSWEDhPAYSCrQ5ay-pB9H3AILZ8uAw-f6RBewS/s400/9.png" width="400" /></a></div>
The console output should show successful build and deployment steps:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilgeLovg0mBIxcFvO5dN3RHbouf7mW-X6ss-s98Hp2PIGBhzaogSU6XkOS8xauhr7eG2GvaE-Y1zr59qJSz1ZypTkn8TAWejk0b9FuiyD7p6rdOV_wzwchxffd7foEZxKEn4MYdtMbAUg1/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="379" data-original-width="717" height="211" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilgeLovg0mBIxcFvO5dN3RHbouf7mW-X6ss-s98Hp2PIGBhzaogSU6XkOS8xauhr7eG2GvaE-Y1zr59qJSz1ZypTkn8TAWejk0b9FuiyD7p6rdOV_wzwchxffd7foEZxKEn4MYdtMbAUg1/s400/10.png" width="400" /></a></div>
<br />
<h4 style="text-align: left;">
<span style="color: red;">2) Enable Jenkins WebHook</span></h4>
Now from Jenkins settings (<b>Manage Jenkins</b> ==> <b>Configure System</b>)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihKPJvVZV-VKUw4G6WfREsAyjUad3hXRUyYnntBXljc2k22MwWrLiLB1yKRpH_-8H6yiAkHYNTuQUK42c-BJM_Tzl0u0FhzrVqR4YpqbaDQCgYHmuiu6hCGdp29YQMF90pleas5T9-Td96/s1600/11.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="361" data-original-width="662" height="217" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihKPJvVZV-VKUw4G6WfREsAyjUad3hXRUyYnntBXljc2k22MwWrLiLB1yKRpH_-8H6yiAkHYNTuQUK42c-BJM_Tzl0u0FhzrVqR4YpqbaDQCgYHmuiu6hCGdp29YQMF90pleas5T9-Td96/s400/11.png" width="400" /></a></div>
Go to <b>GitHub </b>section and get the WebHook URL, and save it in a notepad file.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_ZaDnK33ZUPAztvB6ttR0Dlh3zEHmSLATJC7EqKR5kf1iLygdcpQBcGLd9ErOSEvmZ7hYi1GSsHDFgH5GbcUfb1fgqa0M_8Mp0sI6FqASBf1FoJVUWDeRZHLmyDwnh8MvuRNz_d3p7FSz/s1600/12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="284" data-original-width="998" height="113" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_ZaDnK33ZUPAztvB6ttR0Dlh3zEHmSLATJC7EqKR5kf1iLygdcpQBcGLd9ErOSEvmZ7hYi1GSsHDFgH5GbcUfb1fgqa0M_8Mp0sI6FqASBf1FoJVUWDeRZHLmyDwnh8MvuRNz_d3p7FSz/s400/12.png" width="400" /></a></div>
<br />
<h4 style="text-align: left;">
<span style="color: red;">3) Configure GitHub WebHooks</span></h4>
Go to the GitHub project go to <b>Settings </b>and select <b>WebHooks</b> and add the Jenkins hook url, content type as application/json and send only push events and make sure it is active and save this webhook configurations.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU1FPBrAeURewNHtsseQZ4pTr5VMEUP24RVFFJFAGeqoN72FKdtnF2r9vdooCpdqZk4z0MwcAN7fN0UUG4jiOGEi5ye_fjv78BC4FsAeOfCueTEUUn7TgpJRcAi2ALf4_tatz2VriI5Mx5/s1600/13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="482" data-original-width="598" height="257" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU1FPBrAeURewNHtsseQZ4pTr5VMEUP24RVFFJFAGeqoN72FKdtnF2r9vdooCpdqZk4z0MwcAN7fN0UUG4jiOGEi5ye_fjv78BC4FsAeOfCueTEUUn7TgpJRcAi2ALf4_tatz2VriI5Mx5/s320/13.png" width="320" /></a></div>
<br />
Now, with every new push to the GitHub an invocation to Jenkins hook URL, so Jenkins can start building the project and deploy it.<br />
<br />
<h4 style="text-align: left;">
<span style="color: red;">4) Test it</span></h4>
Now commit a new change to your project and push it to the Git Repository branch that you configured in GitHub and wait for workflow to be invoked and changes to be deployed.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4xqF5YWQyi5rvX-9l3SRzdwPEnpY8bg8RviF0Stj2XS-BUyIPBAOWboUAlXcFy7nuMJZBjetoF1GwGiZAYYOm-On7pPZEWQFpK9WgXtzj1RINshjLdY3utNkd_My9t2Lv3I0B63qAtfUE/s1600/14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="207" data-original-width="737" height="111" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4xqF5YWQyi5rvX-9l3SRzdwPEnpY8bg8RviF0Stj2XS-BUyIPBAOWboUAlXcFy7nuMJZBjetoF1GwGiZAYYOm-On7pPZEWQFpK9WgXtzj1RINshjLdY3utNkd_My9t2Lv3I0B63qAtfUE/s400/14.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
You can see Jenkins invoked with this new commit push.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfs4dRzGWYb3zeUpv0xDOTIPtSRMxJD5yyMrBg7ZSUXz9Wi0mk68QXJBi8HI21LnvZOQzA6SNjJCOOhJ7z2pvdSuXPBtESNAYmr42-Q3keBPpqCrf8wRIKzAIPDNXChkjoatKIoUasbLek/s1600/15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="259" data-original-width="1067" height="96" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfs4dRzGWYb3zeUpv0xDOTIPtSRMxJD5yyMrBg7ZSUXz9Wi0mk68QXJBi8HI21LnvZOQzA6SNjJCOOhJ7z2pvdSuXPBtESNAYmr42-Q3keBPpqCrf8wRIKzAIPDNXChkjoatKIoUasbLek/s400/15.png" width="400" /></a></div>
And now we have a complete cycle from pushing the code, build, deploy and may be test as well.<br />
<br />
<h2 style="text-align: left;">
<span style="color: #351c75;">Use Case II: Using OpenShift Pipelines</span></h2>
<br />
OpenShift has the capability to hide all Jenkins configurations by using OpenShift Pipeline feature in the build tab.<br />
To use it all you need to do is to structure a file format for the pipeline such as the following:<br />
<h4 style="text-align: left;">
1) Build the Pipeline File</h4>
This is a sample file that has 3 stages; one for build, then deploy and 3rd one for scaling.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRUmvguOXwRsmJm7KRrfffvZezrAdCu2o8t5jUGZG5mmF5HPDt4h1ov9Gy77FB7japqdobeA5Zv9mrDEQ37yeti7Oj0rgdFUCdbsgTE1spmPjgRgF9fG4rQrUu4CeFKv_uHgnar6hc-isg/s1600/17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="407" data-original-width="920" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRUmvguOXwRsmJm7KRrfffvZezrAdCu2o8t5jUGZG5mmF5HPDt4h1ov9Gy77FB7japqdobeA5Zv9mrDEQ37yeti7Oj0rgdFUCdbsgTE1spmPjgRgF9fG4rQrUu4CeFKv_uHgnar6hc-isg/s400/17.png" width="400" /></a></div>
<br />
<br />
Note that the main components of the pipeline file is the stages which have a name and one or more actions to do.<br />
<br />
<h4 style="text-align: left;">
2) Import the Pipeline File</h4>
Select Import YAML/JSON and copy and paste the file content.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc1nM2qkk5ScJcQYHWPk2668jSrjU9f6ARehbHZSMHUC85oo5g9_2WXRpcwraf5udMMR5eOjp3e4RtmxPpVUs9Bnsm6wF_F6X4WJ0-4BKKYtuhnnJLe6HTrF6CrQsasRoLbkdnsB-2JLaK/s1600/18.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="227" data-original-width="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjc1nM2qkk5ScJcQYHWPk2668jSrjU9f6ARehbHZSMHUC85oo5g9_2WXRpcwraf5udMMR5eOjp3e4RtmxPpVUs9Bnsm6wF_F6X4WJ0-4BKKYtuhnnJLe6HTrF6CrQsasRoLbkdnsB-2JLaK/s1600/18.png" /></a></div>
<div>
<br /></div>
<div>
Validate by Invoking the pipeline to see if the progress is okay and no issues with your configurations.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYbCV6D4fRCGtO2-zQZmW1cpIfcg7DleEh1zxdf7Zf3Ie44Kg1Ns6y-5F4lyavqwAbtgkvAgdYEBPm0_aIkDm66JZ3TDJtlM01TGlR0f6ZsFxZ0yB3D2wYjNu9UCShvEb6NojOVuLuLGdc/s1600/19.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="273" data-original-width="959" height="113" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYbCV6D4fRCGtO2-zQZmW1cpIfcg7DleEh1zxdf7Zf3Ie44Kg1Ns6y-5F4lyavqwAbtgkvAgdYEBPm0_aIkDm66JZ3TDJtlM01TGlR0f6ZsFxZ0yB3D2wYjNu9UCShvEb6NojOVuLuLGdc/s400/19.png" width="400" /></a></div>
<br />
<h4 style="text-align: left;">
3) Get the Pipeline WebHook URL</h4>
From inside the pipeline get the Hook URL.<br />
<br />
<h4 style="text-align: left;">
4) Configure GitHub WebHook </h4>
Similar to what we did in step 3 in the first use case above.<br />
<br />
And now we have another complete cycle from pushing the code, build, deploy and may be test as well but using OpenShift Pipeline feature this time.<br />
<br />
<br />
<br />
</div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-87280893939669615212020-01-13T10:32:00.003-08:002020-01-18T09:19:27.450-08:00Using Liquibase to Manage DB Changes for CI/CD<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Liquibase </b>is an open source tool for database schema change management, it helps teams track, version, and deploy database schema and logic changes.<br />
It has 2 flavors; the community edition and the pro one.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitGOJNgAbhz0e01z6v2IkHNVwYlZlt62_w67jEEBn35QptlvMM2Ljgo9Ct1ahXgu-rydyRGdgh8UDXvuT4iBgu3KhMWKagZaKXwRZ3q2Uo4Kpk62K4NVzzwij17hff-7tmEdSC936t711g/s1600/liq_icon.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="52" data-original-width="250" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitGOJNgAbhz0e01z6v2IkHNVwYlZlt62_w67jEEBn35QptlvMM2Ljgo9Ct1ahXgu-rydyRGdgh8UDXvuT4iBgu3KhMWKagZaKXwRZ3q2Uo4Kpk62K4NVzzwij17hff-7tmEdSC936t711g/s1600/liq_icon.png" /></a></div>
<br />
<br />
In this post, we will do a local MySQL database schema changes management between 2 schema(s)<br />
Source: bankaccounts schema and the Target is: bankaccounts2 schema<br />
<br />
In one use case we will move all the schema into the target DB and then we will capture any changes and apply them into the target DB so we can make sure the source and target DB are consistent.<br />
<br />
<b><u>1) Download the Liquibase tool:</u></b><br />
From this page: https://download.liquibase.org/download/?frm=n you can download it.<br />
If for example, you are using Windows then just unzip the folder and add it to the PATH variable of your environment variables.<br />
<br />
Done? let's move to the next step.<br />
<br />
<b><u>2) Create a separate folder for Source and target name them as you wish</u></b><br />
<br />
<b><u>3) Do initial DB configurations:</u></b><br />
<br />
Open MySQL DB and create the following schema(s):<br />
<br />
<i>CREATE SCHEMA `bankaccounts` ;</i><br />
<i>GRANT ALL PRIVILEGES ON *.* TO 'bankaccounts'@'localhost' IDENTIFIED BY 'bankaccounts';databasechangelog</i><br />
<i><br /></i>
<i>CREATE SCHEMA `bankaccounts2` ;</i><br />
<i>GRANT ALL PRIVILEGES ON *.* TO 'bankaccounts2'@'localhost' IDENTIFIED BY 'bankaccounts2';databasechangelog</i><br />
<br />
Now we have 2 identical empty schema(s)<br />
<br />
<b><u>4) Load DB Schema:</u></b><br />
Load Schema 1, our source schema with some DB objects by executing this script:<br />
<br />
<i>CREATE TABLE `bankaccounts`.`accounts` (</i><br />
<i> `id` INT NOT NULL AUTO_INCREMENT,</i><br />
<i> `account_no` VARCHAR(45) NULL,</i><br />
<i> `balance` DOUBLE NULL,</i><br />
<i> `currency` VARCHAR(45) NULL,</i><br />
<i> PRIMARY KEY (`id`));</i><br />
<i><br /></i>
<i>CREATE TABLE `bankaccounts`.`transactions` (</i><br />
<i> `transaction_id` INT NOT NULL AUTO_INCREMENT,</i><br />
<i> `account_no` VARCHAR(45) NULL,</i><br />
<i> `transaction` DOUBLE NULL,</i><br />
<i> `date` DATETIME NULL,</i><br />
<i> `transaction_details` VARCHAR(45) NULL,</i><br />
<i> PRIMARY KEY (`transaction_id`));</i><br />
<br />
<br />
Now our source DB contains 2 tables.<br />
<br />
<h3 style="text-align: left;">
<b><span style="color: blue;">FIRST USE CASE: INITIAL DB MIGRATION:</span></b></h3>
Now Let's prepare our Liquibase tool to capture and do initial DB migration<br />
- In a directory named "source"<br />
1- Create a configure a file named: "<b>liquibase.properties</b>"<br />
with the following content:<br />
<br />
<i>changeLogFile: ./dbchangelog.xml</i><br />
<i>driver: com.mysql.jdbc.Driver</i><br />
<i>url: jdbc:mysql://localhost:3306/bankaccounts</i><br />
<i>username: bankaccounts</i><br />
<i>password: bankaccounts</i><br />
<i>classpath: ../../../mysql-connector-java-5.1.23-bin.jar</i><br />
<br />
<b><span style="color: blue;">Note:</span></b> you need also to fix the MySQL connector jar location as per your environment<br />
<br />
2- Run the Liquibase tool:<br />
<span style="color: red;"><b>liquibase generateChangeLog</b></span><br />
<br />
The output will be directed into the <b>dbchangelog.xml</b> file specified in our properties file<br />
Here is the content I got, you should get similar (except the id of the change set)<br />
<i><?xml version="1.1" encoding="UTF-8" standalone="no"?></i><br />
<i><databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.8.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd"></i><br />
<i> <changeSet author="ooransa (generated)" id="1578934983284-1"></i><br />
<i> <createTable tableName="accounts"></i><br />
<i> <column autoIncrement="true" name="id" type="INT"></i><br />
<i> <constraints nullable="false" primaryKey="true"/></i><br />
<i> </column></i><br />
<i> <column name="account_no" type="VARCHAR(45)"/></i><br />
<i> <column name="balance" type="DOUBLE"/></i><br />
<i> <column name="currency" type="VARCHAR(45)"/></i><br />
<i> </createTable></i><br />
<i> </changeSet></i><br />
<i> <changeSet author="ooransa (generated)" id="1578934983284-2"></i><br />
<i> <createTable tableName="transactions"></i><br />
<i> <column autoIncrement="true" name="transaction_id" type="INT"></i><br />
<i> <constraints nullable="false" primaryKey="true"/></i><br />
<i> </column></i><br />
<i> <column name="account_no" type="VARCHAR(45)"/></i><br />
<i> <column name="transaction" type="DOUBLE"/></i><br />
<i> <column name="date" type="VARCHAR(45)"/></i><br />
<i> <column name="transaction_details" type="VARCHAR(45)"/></i><br />
<i> </createTable></i><br />
<i> </changeSet></i><br />
<i></databaseChangeLog></i><br />
<br />
<br />
As you can see the 2 tables are captured in this file and we can now execute this into the target DB to do a schema migration by configuring the DB in a new property file and execute:<br />
<br />
<span style="color: red;"><b>liquibase update</b></span><br />
<br />
Which will apply all the changes in the XML file, the file structure is simple as collection of changeSet every changeSet capture one DB modification.<br />
The changes are identified as unique by combination of author and id fields, for example:<br />
<i>author="ooransa (generated)" id="1578934983284-2"</i><br />
<b><br /></b>
<b>We will skip this part as it will be demonstrated with the second use case.</b><br />
<b><br /></b>
<br />
<h3 style="text-align: left;">
<span style="color: blue;">SECOND USE CASE: DB SCHEMA CHANGE MANAGEMENT:</span></h3>
Let's now prepare our target DB to receive the initial and any updates to the schema<br />
In the "target" folder:<br />
1- create a new file named "<b>liquibase.properties</b>"<br />
with the following content:<br />
<br />
<i>changeLogFile: ./dbchangelog.xml</i><br />
<i>driver: com.mysql.jdbc.Driver</i><br />
<i>url: jdbc:mysql://localhost:3306/bankaccounts2</i><br />
<i>username: bankaccounts2</i><br />
<i>password: bankaccounts2</i><br />
<i>referenceUrl: jdbc:mysql://localhost:3306/bankaccounts</i><br />
<i>referenceUsername: bankaccounts</i><br />
<i>referencePassword: bankaccounts</i><br />
<i>referenceDriver: com.mysql.jdbc.Driver</i><br />
<i>classpath: ../../../mysql-connector-java-5.1.23-bin.jar</i><br />
<br />
<b><span style="color: blue;">Note:</span></b> you need also to fix the MySQL connector jar location as per your environment<br />
<br />
As you can see this time we configured the source (reference DB) and the target DB for this configurations.<br />
<br />
2- Execute the command:<br />
<span style="color: red;"><b>liquibase diffChangeLog</b></span><br />
<br />
This will capture the difference between our empty schema and the source/referenced schema which will produce a file similar to the previous XML file.<br />
<br />
Now apply these changes into the DB using the command:<br />
<br />
<span style="color: red;"><b>liquibase update</b></span><br />
<br />
That's it, all we need to do. whenever a new changes happen to the DB execute the diffChangeLog then the update commands, no more :)<br />
<br />
Note a change log table will be also created in our target DB named: <b>databasechangelog </b>plus a lock table to make sure only one liquibase command executed at a time.<br />
<br />
Now we did the initial DB migration from the source DB to the target DB<br />
<br />
Let's try this sample modification:<br />
<br />
- Create a new table in your source DB "bankaccounts" for example:<br />
<br />
<i>CREATE TABLE `bankaccounts`.`test_change` (</i><br />
<i> `id` INT NOT NULL AUTO_INCREMENT,</i><br />
<i> `name` VARCHAR(45) NULL,</i><br />
<i> PRIMARY KEY (`id`));</i><br />
<div>
<br /></div>
<div>
- Capture the new changes using the command: (while still in the target folder)</div>
<div>
<br /></div>
<div>
<span style="color: red;"><b>liquibase diffChangeLog</b></span></div>
<div>
<br /></div>
<div>
The new modification will be appended to our initial <b>dbchangelog.xml</b> so you can see a new entry:</div>
<div>
<br /></div>
<div>
<div>
<i><changeSet author="ooransa (generated)" id="1578935272217-1"></i></div>
<div>
<i> <createTable tableName="test_change"></i></div>
<div>
<i> <column autoIncrement="true" name="id" type="INT"></i></div>
<div>
<i> <constraints nullable="false" primaryKey="true"/></i></div>
<div>
<i> </column></i></div>
<div>
<i> <column name="name" type="VARCHAR(45)"/></i></div>
<div>
<i> </createTable></i></div>
<div>
<i> </changeSet></i></div>
</div>
<div>
<br /></div>
<div>
- Apply the changes to our target DB by executing the command: (while still in the target folder)</div>
<div>
<br /></div>
<div>
<span style="color: red;"><b>liquibase update</b></span></div>
<br />
Now you can see the new table created in the target DB.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYnubke_0PJ9N3dahXf5sHKjeA1unuAxrF2fWwkbAK8IVlLEh9uYJqk_AK2j0yTlK-gVVn5LT_QZSPWRqZSDBg14dedhKIzO44RWHLyoxlrnBayVk8KvzbOYITy1LYP4f-GGnwZTlICEeu/s1600/liq3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="457" data-original-width="1085" height="167" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYnubke_0PJ9N3dahXf5sHKjeA1unuAxrF2fWwkbAK8IVlLEh9uYJqk_AK2j0yTlK-gVVn5LT_QZSPWRqZSDBg14dedhKIzO44RWHLyoxlrnBayVk8KvzbOYITy1LYP4f-GGnwZTlICEeu/s400/liq3.png" width="400" /></a></div>
<br />
<br />
Drop the table from the source DB and re-execute both commands:<br />
<br />
<b><span style="color: red;">liquibase diffChangeLog</span></b><br />
<br />
You can see the change appended to the file:<br />
<br />
<i><changeSet author="ooransa (generated)" id="1578935549140-1"></i><br />
<i> <dropTable tableName="test_change"/></i><br />
<i> </changeSet></i><br />
<br />
<br />
Then apply it using:<br />
<br />
<b><span style="color: red;">liquibase update</span></b><br />
<br />
So whatever changes you do in the source you capture it using the <b>diffChangeLog </b>and apply it using the <b>update</b>, at the end all the changes you made for your DB will be persisted in this single DB change log file.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjizGyedAg-VOFvvy7qlv5X-l6sOdOt1Vklh1yw7H-990Q7rBiXFzlHdvSUqmcPRBGIfAGFtFncRwugiDwcx-o5gdlpxUqCjDIl7OLgwOkUCt98v4RdwHd7Zb7ZdQNiHnjMl1p7gCqfp8AZ/s1600/liq1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="474" data-original-width="948" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjizGyedAg-VOFvvy7qlv5X-l6sOdOt1Vklh1yw7H-990Q7rBiXFzlHdvSUqmcPRBGIfAGFtFncRwugiDwcx-o5gdlpxUqCjDIl7OLgwOkUCt98v4RdwHd7Zb7ZdQNiHnjMl1p7gCqfp8AZ/s400/liq1.png" width="400" /></a></div>
<br />
You can also do a rollback of the changes by using the <b>rollback </b>option.<br />
<br />
For more information: visit: https://www.liquibase.org/index.html<br />
<br />
<h3 style="text-align: left;">
<b><span style="color: blue;">Using Maven Plugin</span></b></h3>
<br />
It is better to use maven plugin and generate the DB change log as part of your build and package process. Now in the source folder, create a new folder named "maven" and in this folder create "pom.xml" file as following:<br />
<br />
1) Add the plugin as simple to the maven pom file as:<br />
<br />
<i><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</i><br />
<i><span style="white-space: pre;"> </span>xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"></i><br />
<i><span style="white-space: pre;"> </span><modelVersion>4.0.0</modelVersion></i><br />
<i><span style="white-space: pre;"> </span><groupId>osa.ora</groupId></i><br />
<i><span style="white-space: pre;"> </span><artifactId>BankingServiceDB</artifactId></i><br />
<i><span style="white-space: pre;"> </span><version>0.0.1-SNAPSHOT</version></i><br />
<i><span style="white-space: pre;"> </span><name>BankingServiceDB</name></i><br />
<i><span style="white-space: pre;"> </span><dependencies></i><br />
<i><span style="white-space: pre;"> </span><dependency></i><br />
<i><span style="white-space: pre;"> </span><groupId>org.liquibase</groupId></i><br />
<i><span style="white-space: pre;"> </span><artifactId>liquibase-maven-plugin</artifactId></i><br />
<i><span style="white-space: pre;"> </span><version>3.8.5</version></i><br />
<i><span style="white-space: pre;"> </span></dependency> </i><br />
<i><span style="white-space: pre;"> </span><dependency></i><br />
<i><span style="white-space: pre;"> </span> <groupId>mysql</groupId></i><br />
<i><span style="white-space: pre;"> </span> <artifactId>mysql-connector-java</artifactId></i><br />
<i><span style="white-space: pre;"> </span> <version>5.1.23</version></i><br />
<i><span style="white-space: pre;"> </span></dependency></i><br />
<i><span style="white-space: pre;"> </span></dependencies></i><br />
<i><span style="white-space: pre;"> </span><build></i><br />
<i><span style="white-space: pre;"> </span><plugins></i><br />
<i><span style="white-space: pre;"> </span><plugin></i><br />
<i><span style="white-space: pre;"> </span><groupId>org.liquibase</groupId></i><br />
<i><span style="white-space: pre;"> </span><artifactId>liquibase-maven-plugin</artifactId></i><br />
<i><span style="white-space: pre;"> </span><version>3.8.5</version></i><br />
<i><span style="white-space: pre;"> </span><configuration> </i><br />
<i> <outputChangeLogFile>./dbchangelog.xml</outputChangeLogFile><span style="white-space: pre;"> </span></i><br />
<i><span style="white-space: pre;"> </span><driver>com.mysql.jdbc.Driver</driver></i><br />
<i><span style="white-space: pre;"> </span><url>jdbc:mysql://localhost:3306/bankaccounts</url></i><br />
<i><span style="white-space: pre;"> </span><username>BankAccounts</username></i><br />
<i><span style="white-space: pre;"> </span><password>BankAccounts</password><span style="white-space: pre;"> </span></i><br />
<i><span style="white-space: pre;"> </span></configuration> </i><br />
<i><span style="white-space: pre;"> </span></plugin> </i><br />
<i><span style="white-space: pre;"> </span></plugins></i><br />
<i><span style="white-space: pre;"> </span></build></i><br />
<i></project></i><br />
<div>
<br /></div>
This also included the MySQL DB Driver dependency for example for MySQL<br />
<br />
2. The configurations is now part of our maven file, but in case you need to have them outside it in the property file: <i>liquibase.properties </i>You need to modify the configuration section in the POM file as following:<br />
<i><span style="white-space: pre;"> </span><configuration> </i><br />
<i><span style="white-space: pre;"> </span><propertyFile>liquibase.properties</propertyFile></i><br />
<i><span style="white-space: pre;"> </span></configuration> </i><br />
<div>
<i><br /></i></div>
<div>
Which point to configuration file "<i>liquibase.properties</i>" contains the following items:</div>
<div>
<i><br /></i></div>
<i>outputChangeLogFile: ./dbchangelog.xml</i><br />
<i>driver: com.mysql.jdbc.Driver</i><br />
<i>url: jdbc:mysql://localhost:3306/bankaccounts</i><br />
<i>username: BankAccounts</i><br />
<i>password: BankAccounts</i><br />
<div>
<br /></div>
Note that you don't need to specify the jar location for MySQL connector jar, it will be added to the classpath by maven.<br />
<br />
3) Execute it using maven:<br />
<br />
<span style="color: red;"><b>mvn liquibase:generateChangeLog</b></span><br />
<br />
Or execute any of other liquibase command options!<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIhcpL4_w-4fL0l774O5d9F7ffmLxHSGzN9GNATvBiFmGqDcb68DUfyK47enlOIdmxquQaDvoTr9HydFqkxUqV8d3INKIf6ARJFR7qFgx1qNKiRjYu1zb_FMb2jUzpBP3WZ9ijIjqg_ceV/s1600/maven.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="729" data-original-width="1345" height="216" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIhcpL4_w-4fL0l774O5d9F7ffmLxHSGzN9GNATvBiFmGqDcb68DUfyK47enlOIdmxquQaDvoTr9HydFqkxUqV8d3INKIf6ARJFR7qFgx1qNKiRjYu1zb_FMb2jUzpBP3WZ9ijIjqg_ceV/s400/maven.png" width="400" /></a></div>
<br />
<br />
Let's now try the other way around, modify the POM file to use the properties file:<br />
<br />
<i><span style="white-space: pre;"> </span><configuration> </i><br />
<i><span style="white-space: pre;"> </span><propertyFile>liquibase.properties</propertyFile></i><br />
<br />
<div>
</div>
<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<i><span style="white-space: pre;"> </span></configuration> </i></div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<i><br /></i></div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<i><br /></i></div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
And configure it as following:</div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<br /></div>
<i>diffChangeLogFile: ./dbchangelog_diff.xml</i><br />
<i>changeLogFile: ./dbchangelog.xml</i><br />
<i>driver: com.mysql.jdbc.Driver</i><br />
<i>url: jdbc:mysql://localhost:3306/bankaccounts2</i><br />
<i>username: bankaccounts2</i><br />
<i>password: bankaccounts2</i><br />
<i>referenceUrl: jdbc:mysql://localhost:3306/bankaccounts</i><br />
<i>referenceUsername: BankAccounts</i><br />
<i>referencePassword: BankAccounts</i><br />
<i></i><br />
<i>referenceDriver: com.mysql.jdbc.Driver</i><br />
<i><br /></i>
Now run the diff command to get the delta between the 2 databases:<br />
<i><br /></i>
<b><span style="color: red;">mvn liquibase:diff</span></b><br />
<i><br /></i>
<i><br /></i>
Do some changes to the source schema and then re-run the command and check the output file.<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<i><br /></i></div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
For the rollback details, I would suggest you read about this from this nice article:</div>
<div style="margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; widows: 2;">
<i><br /></i></div>
<div style="margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; widows: 2;">
<i>https://www.baeldung.com/liquibase-rollback</i></div>
<div style="margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; widows: 2;">
<i><br /></i></div>
<div style="margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; widows: 2;">
<i><br /></i></div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<br /></div>
</div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-2319507691586711952019-12-18T05:59:00.001-08:002019-12-18T06:17:37.676-08:00PCI DSS - Single Slide<div dir="ltr" style="text-align: left;" trbidi="on">
PCI Data Security Standard specifies twelve requirements for compliance, I created the following slide to summarize these requirements.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_1152vRuXs1dH_quBQe1-cpuUZoxNxQF8WH5Lm7sQ6dNv9nvVUIPLLni8ZR8WVQXNg73G1Ks9-N5KgZXgNxPFJOhGsJjJ1qfZQbtddDlCRLWvdf3BIipqm3ZKKUvyuPO7xWafRNafR71a/s1600/PCI+DSS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="573" data-original-width="1139" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_1152vRuXs1dH_quBQe1-cpuUZoxNxQF8WH5Lm7sQ6dNv9nvVUIPLLni8ZR8WVQXNg73G1Ks9-N5KgZXgNxPFJOhGsJjJ1qfZQbtddDlCRLWvdf3BIipqm3ZKKUvyuPO7xWafRNafR71a/s400/PCI+DSS.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
For more details:<br />
<a href="https://www.pcisecuritystandards.org/document_library?category=pcidss&document=pci_dss">https://www.pcisecuritystandards.org/document_library?category=pcidss&document=pci_dss</a><br />
<br /></div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-49447686753964212692019-12-09T06:05:00.003-08:002019-12-18T06:19:50.186-08:00Twelve-Factors Application - Single Slide<div dir="ltr" style="text-align: left;" trbidi="on">
I made this one slide to summarize all the twelve factor applications:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM8CtPK4cZjeEeWkM8ZrFelOmElhQYTM0JtPMK39Zvl6VvuLZVYDPNTfX4zcybp6F8FECei7hhvcNYsxHcd_YOlCSsjVZGkFx8vV4oKFzYMhn1BGbivKVHklWiKmgUnEtk2G9zBEWzmODG/s1600/12-factors.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="844" data-original-width="1600" height="210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjM8CtPK4cZjeEeWkM8ZrFelOmElhQYTM0JtPMK39Zvl6VvuLZVYDPNTfX4zcybp6F8FECei7hhvcNYsxHcd_YOlCSsjVZGkFx8vV4oKFzYMhn1BGbivKVHklWiKmgUnEtk2G9zBEWzmODG/s400/12-factors.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
Review these factors from the site <a href="https://12factor.net/" style="font-family: Arial;">https://12factor.net/</a> and then memorize them using this single slide.<br />
<br /></div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-62617422435965886802019-09-18T11:50:00.000-07:002019-09-19T09:36:56.288-07:00Use Google Authenticator for DFA<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Double Factor Authentication (DFA)</b> is one of the best methods to prevent brutal force attacks or password hijack, it allow the end user to have double factors to authenticate and login into any system i.e. password and OTP (One Time Password).<br />
<br />
There are many ways to generate the one time password, the easiest is to send a random number to a pre-defined user mobile phone number so the user can use this random number to login into the system.<br />
The random number here must be generated using a way that guarantee that no one can guess the number and able to by-pass such security way.<br />
<br />
Another simple way is to use a known algorithm that generate a unique number based on some calculations and the user enter this number as OTP while login into the system, he can have a device that run this algorithm or as Google Authenticator a mobile app.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFc6wVVGFIWmKuZfz35lpsdj-HDBtj5oguwQgOW0fhIzIYfkUJGMJJjpE08JhGlfjTaDIUXbTh_xoFVr9L8e7AGnYwtke0eCDa3wMTQtd-lW5-Z2OZKbGdaHc-71BoFE7j9f6c3CvB0RJa/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="143" data-original-width="419" height="109" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFc6wVVGFIWmKuZfz35lpsdj-HDBtj5oguwQgOW0fhIzIYfkUJGMJJjpE08JhGlfjTaDIUXbTh_xoFVr9L8e7AGnYwtke0eCDa3wMTQtd-lW5-Z2OZKbGdaHc-71BoFE7j9f6c3CvB0RJa/s320/1.png" width="320" /></a></div>
<br />
<b>Google Authenticator</b> is using a <b>Time-based One-Time Password algorithm (TOTP)</b> which is an extension of the <b>HMAC-based One-time Password algorithm (HOTP)</b> generating a one-time password by instead <i>taking uniqueness from the current time</i>.<br />
<br />
<br />
In order to configure your web site to work with Google authenticator you need to modify your login screens and do some code that enable the DFA as following:<br />
<br />
<b><u>Enablement steps</u></b><br />
<b><u><br /></u></b>
<b><u>1. Workflow Changes:</u></b><br />
<b><u><br /></u></b>
-<span style="white-space: pre;"> </span>User to go to profile management and request to enable double factor authentication (DFA) using OTP, 2 options can be implemented easily:<br />
1.<span style="white-space: pre;"> </span>Google Authenticator<br />
2.<span style="white-space: pre;"> </span>SMS<br />
-<span style="white-space: pre;"> </span>SMS should be only enabled if we have SMS gateway configured in the system, so in this post we will discuss only Google Authenticator:<br />
<br />
-<span style="white-space: pre;"> </span>User select one method, it route it to a new page which will contain:<br />
<br />
[1] Links to Mobile Apps in Android & iOS, here is the links:<br />
•<span style="white-space: pre;"> </span><a href="https://apps.apple.com/gb/app/google-authenticator/id388497605">Google Authenticator App (Apple iOS)</a><br />
•<span style="white-space: pre;"> </span><a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Google Authenticator App (Google Android)</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5bJKQHkcySzUH687C0w8OOQJWOXpQiUUBZbw9kOkMv0SdqFJNcH0anxqAYE0s9p0q14P8k2Jex0xQb-58Z6zGcqd7ZTgygp3PvVPuXHWVfCOMAkw5UO8_gWjuUl4EgUP-L5kehl0fAtu4/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="183" data-original-width="175" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5bJKQHkcySzUH687C0w8OOQJWOXpQiUUBZbw9kOkMv0SdqFJNcH0anxqAYE0s9p0q14P8k2Jex0xQb-58Z6zGcqd7ZTgygp3PvVPuXHWVfCOMAkw5UO8_gWjuUl4EgUP-L5kehl0fAtu4/s1600/2.png" /></a></div>
<br />
<br />
[2] QR code generated using either:<br />
•<span style="white-space: pre;"> </span>Google public service: img src=URL<br />
•<span style="white-space: pre;"> </span>Java backend libraries which is the recommended way.<br />
<br />
<br />
<ul style="text-align: left;">
<li> The URL for google public service looks like: https://chart.googleapis.com/chart?chs=200x200&cht=qr&chl=200x200&chld=M|0&cht=qr&chl=otpauth://totp/osa@myCompany.com%3Fsecret%3DJBSWY3DPEHPK3PXP</li>
<li>Osama_oransa@myCompany.com=loginName@companyName.com for example</li>
<li>3DJBSWY3DPEHPK3PXP=encoded <b><span style="color: red;">secret code</span></b> auto-generated to this user based on his profile e.g. name+timestamp or any random key</li>
<li>This URL will display an image that contains QR code or it can be generated by the Java backend.</li>
</ul>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh94a1BoqJBp1QX3nycXnvaACq0QtXQdlDVTpT-ONvttkMiXjowFvpsOuSuV10sgqg5Ahd4P0yLOsuC9cRBjIEZAUyUcr6V_V-beabTxTbUnb-XTb63Bl9wWrWpPB-Jg_hPJowtpa0LGppR/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="206" data-original-width="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh94a1BoqJBp1QX3nycXnvaACq0QtXQdlDVTpT-ONvttkMiXjowFvpsOuSuV10sgqg5Ahd4P0yLOsuC9cRBjIEZAUyUcr6V_V-beabTxTbUnb-XTb63Bl9wWrWpPB-Jg_hPJowtpa0LGppR/s1600/3.png" /></a></div>
<br />
<br />
[3] A statement displayed to the user: "Please scan this QR Code by Google Authenticator App"<br />
[4] An Input field for OTP number<br />
[5] A "Validate" button<br />
<br />
Once the user scanner the QR code, the Google authenticator app will display OTP, the user will use it and click on validate button, if successfully matched with the value that we generate in the backend using the <span style="color: red;"><b>secret code</b></span>, then DBA will be enabled for the user otherwise "OTP not matched" error will be displayed.<br />
<br />
After 3 failed trials the user will be routed back to the profile management page with error message.<br />
Once DFA is enabled the user profile page will now have disable DFA button instead of enable DFA (from security prospective, it is better to have this as re-configure DFA)<br />
<br />
Note: For a better security some systems do not allow the user to disable the DFA once enabled.<br />
<br />
<b><u>2. Login Changes</u></b><br />
<b><u><br /></u></b>
-<span style="white-space: pre;"> </span>Once the user entered correct username and password a new page will be displayed<br />
-<span style="white-space: pre;"> </span>The page will show a text field and validate button and request the user to enter the one time password.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGFWBx3KqaMLkEWhFWmCr5n8BwUm9gzOv1g9yvn2d5ViyPZP4v8luI7QGOOOJ_0wSexB5wKbzN7v0l0v2rk22ncN2eJG3BV68d1pEFy5-JtCfGGdbSYZgmFDn39iEJwl3PSF3vRvIzWhno/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="320" data-original-width="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGFWBx3KqaMLkEWhFWmCr5n8BwUm9gzOv1g9yvn2d5ViyPZP4v8luI7QGOOOJ_0wSexB5wKbzN7v0l0v2rk22ncN2eJG3BV68d1pEFy5-JtCfGGdbSYZgmFDn39iEJwl3PSF3vRvIzWhno/s1600/4.png" /></a></div>
<br />
-<span style="white-space: pre;"> </span>Once the user enter the value and click on validate button, the backend will calculate the existing value (based on the user <span style="color: red;"><b>secret code</b></span>) and compare it to the user input.<br />
<br />
-<span style="white-space: pre;"> </span>If successfully matched, the user will be directed to the home page otherwise he will be given 3 trials after that he will be logout and will be calculated as one invalid login trial.<br />
- Note: if the user exceed the max invalid login trials, the account should be locked.<br />
<br />
<br />
<b><u>3. Implementation Details</u></b><br />
<b><u><br /></u></b>
<b>-<span style="white-space: pre;"> </span>DB Changes: </b><br />
<br />
<ul style="text-align: left;">
<li>2 additional DB fields in the user/profile table: </li>
<ul>
<li>OTP_ENABLED (default No) </li>
<li>OTP_SECRET_CODE (encrypted, default null)</li>
</ul>
</ul>
<br />
<b>-<span style="white-space: pre;"> </span>User interface changes: </b><br />
<br />
<ul style="text-align: left;">
<li>New pages as per the flow above in both DFA enablement and post successful login page.</li>
<li>Add button for Enablement of DFA in the profile management page in case the DFA is not enabled and a button for disablement of DFA in case the DFA is enabled.</li>
</ul>
<br />
<div>
<br /></div>
<br />
<b><u>4. Implementation Reference</u></b><br />
<b><u><br /></u></b>
<span style="white-space: pre;"> </span>All the logic will be in the Java backend, which will generate the secret code, the calculation, QR Code generation and validation as per the below reference in Java.<br />
JavaScript library is listed here as it is the best reference to understand what is required for implementation.<br />
-<span style="white-space: pre;"> </span>In JavaScript: can be tested easily in the browser with all code libraries:<br />
<br />
<ul style="text-align: left;">
<li><a href="http://blog.tinisles.com/2011/10/google-authenticator-one-time-password-algorithm-in-javascript/">http://blog.tinisles.com/2011/10/google-authenticator-one-time-password-algorithm-in-javascript/</a></li>
</ul>
<br />
-<span style="white-space: pre;"> </span>In Java:<br />
<br />
<ul style="text-align: left;">
<li><a href="https://www.oodlestechnologies.com/blogs/Implementing-TOTP-Using-Google-Authenticator-in-Java/">https://www.oodlestechnologies.com/blogs/Implementing-TOTP-Using-Google-Authenticator-in-Java/</a></li>
</ul>
<br />
-<span style="white-space: pre;"> </span>Reference for other languages:<br />
<br />
<ul style="text-align: left;">
<li><a href="https://rosettacode.org/wiki/Time-based_One-time_Password_Algorithm">https://rosettacode.org/wiki/Time-based_One-time_Password_Algorithm</a></li>
</ul>
<br />
<div>
<br /></div>
<br />
<div>
<br /></div>
</div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-56850822797444866522019-04-03T10:55:00.001-07:002019-04-03T10:55:43.975-07:00Sensor-Ways Building Different IoT Devices<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
In this post we will build different variation of IoT devices that can work and communicate with the open source IoT backend application "Sensor-Ways".<br />
<br />
The previous post summarize everything about building, compiling, configuring and monitoring the IoT device, so in this post we will focus on the hardware part and code.<br />
<br />
All these devices can be either: <span style="color: red;"><b>Sensor-based only</b></span>, <span style="color: red;"><b>Control-Only devices</b></span> or <span style="color: red;"><b>Mixed Sensor and Control devices</b></span>, so we will simplify all the devices to be sensor only and we will show an example of how to have a control device.<br />
<br />
To connect a control device connect the relay the switch something on/off, you can connect up-to 2 relay modules as per the current design, but you can change it to accommodate more. Same for sensors, currently the supported is max 2 sensors connected, but this also can be change.<br />
Therefore the following hardware components are for all devices and we will only list the required sensor beside each device:<br />
<br />
<b><u>Hardware Components:</u></b><br />
- Arduino Wemos d1 or d1 mini or similar ESP8266 which contains the embedded WiFi chip.<br />
- Buzzer (for local alarm)<br />
- 5V Relay modules (1-2 optional in case we need to control other electric devices upon any action from the sensor reading or from the Sensor-Ways backend)<br />
- Connection wires.<br />
<div>
- Adapter 9V would be good to power the Wemos d1 board, optionally you can power it using USB connection or 9V Battery.</div>
<br />
The following are optional connected components:<br />
<div>
<b><u>Connectivity:</u></b><br />
1. Optional Buzzer (if local alarm is required): GND and D7</div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<div>
<div style="margin: 0px;">
2. Optional Relay 1 (if control device is required): GND & D5 </div>
</div>
<div>
<div style="margin: 0px;">
3. Optional Relay 2 (if a second control device is required): GND & D8 or D7 </div>
</div>
</div>
<h2 style="text-align: left;">
<b><span style="color: red;">1) Safety Devices</span></b></h2>
<div style="text-align: left;">
These devices are mainly about home and workplace safety, for example you can monitor the temperature in different location so you can have early detection of fire and better quality of locating the exact fire location.</div>
<div style="text-align: left;">
Same for gas leakage either for home or for industrial uses.</div>
<h3>
<span style="color: orange;">- Gas-Temperature Monitoring Device</span></h3>
<h3>
<div style="font-size: medium;">
<span style="font-weight: normal;">We already discussed this device in the previous post in details:</span></div>
<div style="font-size: medium;">
<a href="https://osama-oransa.blogspot.com/2019/03/sensor-ways-open-source-iot-devices.html">https://osama-oransa.blogspot.com/2019/03/sensor-ways-open-source-iot-devices.html</a><br />
<b><u>Sensors:</u></b><br />
<div style="font-weight: 400;">
<div>
1. MQ-2 or any to 5v, GND and A0 </div>
<div>
2. DHT sensor to 5v, GND and D6 </div>
<div>
<b><u>Device Code:</u></b></div>
</div>
<div style="font-weight: 400;">
From the GitHub code: <a href="https://github.com/osa-ora/sensor-ways-iot-devices/tree/master">https://github.com/osa-ora/sensor-ways-iot-devices/tree/master</a></div>
<div style="font-weight: 400;">
You will need the 2 files in the same folder:</div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<div style="margin: 0px;">
<a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-GasTempDeviceOTA.ino" id="ac8e459b5ccf374a7b553abc2834a16e-195282b9afbc610e292d32f512d6feb07a6621a1" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-size: 14px; white-space: nowrap;" title="IoTDevice-GasTempDeviceOTA.ino">IoTDevice-GasTempDeviceOTA.ino</a> and <a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-Common.ino" id="0c13f5ca31ff92ab8785b6905748bbb6-da870878d959d8d634e44daeedab46cc47ac8c4d" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-size: 14px; white-space: nowrap;" title="IoTDevice-Common.ino">IoTDevice-Common.ino</a></div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxju6QjpisccHTA54u-bpfCf3d8h7zMgjrOeY-XMw-4snPF9dTtMUkVkcUAx_OcX5iL65phZgKwdM-RTC20KI0Tztr3sybX0aDzIS8456CF9oqYSDA5km0ELw1V-OHIrjtJcCzQpMxQeQG/s1600/device.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="683" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgxju6QjpisccHTA54u-bpfCf3d8h7zMgjrOeY-XMw-4snPF9dTtMUkVkcUAx_OcX5iL65phZgKwdM-RTC20KI0Tztr3sybX0aDzIS8456CF9oqYSDA5km0ELw1V-OHIrjtJcCzQpMxQeQG/s320/device.jpg" width="227" /></a></div>
</div>
</h3>
<h3 style="text-align: left;">
<span style="color: orange;">- Gas Monitoring Device</span></h3>
<div>
<b><u>Sensor:</u></b><br />
- Gas sensor like MQ-2 or any MQ sensor, Connected to 5v, GND and A0.<br />
<b><u>Device Code:</u></b><br />
<div>
From the GitHub code: <a href="https://github.com/osa-ora/sensor-ways-iot-devices/tree/master">https://github.com/osa-ora/sensor-ways-iot-devices/tree/master</a></div>
<div>
You will need the 2 files in the same folder:</div>
<div>
<a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-GasControlDeviceOTA.ino" id="d0b662181a0e891cae3e8c5b83bf9207-8ce9135ebd5734e2935e8076c9d1b01d00275386" style="background-color: white; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-GasControlDeviceOTA.ino">IoTDevice-GasControlDeviceOTA.ino</a> and <a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-Common.ino" id="0c13f5ca31ff92ab8785b6905748bbb6-da870878d959d8d634e44daeedab46cc47ac8c4d" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-Common.ino">IoTDevice-Common.ino</a></div>
<div>
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJfPAgF3ymt7_o487bq-sSM468bVrcEj1KYFW-wRMxqkinZG8O-S_X_VMsSnkZbjRJiOSU0f7wB2i4GIxc8C5v8JgtUt1pWtSKTNfKhroTlidBTLxEoYo9vAnKG8mU5eppPeS1tVvolwRz/s1600/gas.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJfPAgF3ymt7_o487bq-sSM468bVrcEj1KYFW-wRMxqkinZG8O-S_X_VMsSnkZbjRJiOSU0f7wB2i4GIxc8C5v8JgtUt1pWtSKTNfKhroTlidBTLxEoYo9vAnKG8mU5eppPeS1tVvolwRz/s320/gas.jpg" width="240" /></a></div>
<br /></div>
</div>
<h3 style="text-align: left;">
<span style="color: orange;">- Temperature Monitoring Device</span></h3>
<b><u>Sensor:</u></b><br />
- DHT sensor to 5v, GND and D6<br />
<b><u>Device Code:</u></b><br />
<div>
From the GitHub code: <a href="https://github.com/osa-ora/sensor-ways-iot-devices/tree/master">https://github.com/osa-ora/sensor-ways-iot-devices/tree/master</a></div>
<div>
You will need the 2 files in the same folder:</div>
<div>
<a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-TempControlDeviceOTA.ino" id="724da5275e2f6d1669940ce8c50d3747-bf58d4973acf63b1152462e25f89b66bd6e2a333" style="background-color: white; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-TempControlDeviceOTA.ino">IoTDevice-TempControlDeviceOTA.ino</a> and <a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-Common.ino" id="0c13f5ca31ff92ab8785b6905748bbb6-da870878d959d8d634e44daeedab46cc47ac8c4d" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-Common.ino">IoTDevice-Common.ino</a></div>
<div>
<br /></div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<b><u><br /></u></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht5F10MHUdxF1eML_PXJAMaSGoaklCfaaMGqVyygqjGcTE9FidxSPqk0pROPy1IBLLIY1a0n1xBF0QUZFwxqdouRLNt0jwd4KmZb42giAz_Gp8XRSLdaJcBbQmlrRqQqXzxsXhXfIhnb-9/s1600/temp.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEht5F10MHUdxF1eML_PXJAMaSGoaklCfaaMGqVyygqjGcTE9FidxSPqk0pROPy1IBLLIY1a0n1xBF0QUZFwxqdouRLNt0jwd4KmZb42giAz_Gp8XRSLdaJcBbQmlrRqQqXzxsXhXfIhnb-9/s320/temp.jpg" width="240" /></a></div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<b><u><br /></u></b></div>
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: "Times New Roman"; font-size: medium; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: 400; letter-spacing: normal; margin: 0px; orphans: 2; text-align: left; text-decoration-color: initial; text-decoration-style: initial; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;">
<b><u><br /></u></b></div>
<h2 style="text-align: left;">
<span style="color: red;">2) Security Devices</span></h2>
<div>
These devices mostly fall into securing some locations such as restricted access doors, or home security.</div>
<h3 style="text-align: left;">
<span style="color: orange;">- Door/Window Open Monitoring Device</span></h3>
This can monitor a window or a door to know if it is open or closed and send alert upon change of the status.<br />
<b><u>Sensor:</u></b><br />
- Door magnetic sensor (see picture), Connected to 5v, and D6.<br />
<b><u>Device Code:</u></b><br />
<div>
From the GitHub code: <a href="https://github.com/osa-ora/sensor-ways-iot-devices/tree/master">https://github.com/osa-ora/sensor-ways-iot-devices/tree/master</a></div>
<div>
You will need the 2 files in the same folder:</div>
<div>
<a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-DoorControlDeviceOTA.ino" id="43818230b65ba82a2ebd3d81818b3734-265d539d10676b7f72c6c253c4df4422c83bfdd5" style="background-color: white; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-DoorControlDeviceOTA.ino">IoTDevice-DoorControlDeviceOTA.ino</a> and <a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-Common.ino" id="0c13f5ca31ff92ab8785b6905748bbb6-da870878d959d8d634e44daeedab46cc47ac8c4d" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-Common.ino">IoTDevice-Common.ino</a></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSPj3Spd2XQmwgKAmxcbTJXyxv7JqXckcfGS0ceMNXLn7C2UZV_0SwgKzWzNCgd2lBZxfYPFZn40L_RKRASMr0bjwYuleXPir82BSSgbsnrYVIr4gK4cXw8wALul9ppU0K8v_Gmn_G8g7s/s1600/door-window.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSPj3Spd2XQmwgKAmxcbTJXyxv7JqXckcfGS0ceMNXLn7C2UZV_0SwgKzWzNCgd2lBZxfYPFZn40L_RKRASMr0bjwYuleXPir82BSSgbsnrYVIr4gK4cXw8wALul9ppU0K8v_Gmn_G8g7s/s320/door-window.jpg" width="240" /></a></div>
<h3 style="text-align: left;">
<span style="color: orange;">- Laser Monitoring Device</span></h3>
To be posted soon.<br />
<h3 style="text-align: left;">
<span style="color: orange;">- Drawer Control Device</span></h3>
To be posted soon.<br />
<h3 style="text-align: left;">
<span style="color: orange;">- Camera Monitoring Device</span></h3>
To be posted soon.<br />
<div>
<h3 style="text-align: left;">
<span style="color: orange;">- Motion Sensor Device</span></h3>
To be posted soon.</div>
<h2 style="text-align: left;">
<span style="color: red;">3) Environmental Devices</span></h2>
<div>
These devices is more about monitoring the environment and weather conditions, or reduce the consumption of water or energy.</div>
<div>
The more you reduce the consumption of resources, the more efficient you help preserving the environment.</div>
<h3 style="text-align: left;">
<span style="color: orange;">- Soil Moisture Device</span></h3>
<div>
By Monitoring the soil moisture degree, you can switch on/off water irrigation and reduce the water consumption according to the actual needs which can varies as per the weather conditions.</div>
<b><u>Sensor:</u></b><br />
- Soil Moisture sensor (see picture), Connected to 5v, GND and A0.<br />
<b><u>Device Code:</u></b><br />
<div>
From the GitHub code: <a href="https://github.com/osa-ora/sensor-ways-iot-devices/tree/master">https://github.com/osa-ora/sensor-ways-iot-devices/tree/master</a></div>
<div>
You will need the 2 files in the same folder:</div>
<div>
<a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-SoilControlDeviceOTA.ino" id="042b8193b4589bfb79d77aaae6b414d5-f073437c1ba3d8da2486f67de6159a4326bcdf31" style="background-color: white; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-SoilControlDeviceOTA.ino">IoTDevice-SoilControlDeviceOTA.ino</a> and <a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-Common.ino" id="0c13f5ca31ff92ab8785b6905748bbb6-da870878d959d8d634e44daeedab46cc47ac8c4d" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-Common.ino">IoTDevice-Common.ino</a></div>
<div>
<br /></div>
<div>
<b><u><br /></u></b></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq1l29Scy3asof4otq6rV2sIPh2ahb-88MwsFQp7rOaJawGrhEI-U1mjo_0ya0WHLMSr_L_sBLYNOUY10hnl2xGcfMSg7-ofDVFhrMbbmR-KgfFeeyKI9tTxiSDcpv6g6foLaCDPgv3oC0/s1600/soil_moisture.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiq1l29Scy3asof4otq6rV2sIPh2ahb-88MwsFQp7rOaJawGrhEI-U1mjo_0ya0WHLMSr_L_sBLYNOUY10hnl2xGcfMSg7-ofDVFhrMbbmR-KgfFeeyKI9tTxiSDcpv6g6foLaCDPgv3oC0/s320/soil_moisture.jpg" width="240" /></a></div>
<div>
<b><u><br /></u></b></div>
<div>
<b><u><br /></u></b></div>
<h3 style="text-align: left;">
<span style="color: orange;">- Rain Monitoring Device</span></h3>
<div style="text-align: left;">
The use case to alert or automate something about rain starting, like retail shops that have some products outdoors or in the ports where products need to be covered in that situation.</div>
<b><u>Sensor:</u></b><br />
- Rain drops sensor (see picture), Connected to 5v, GND and A0.<br />
<b><u>Device Code:</u></b><br />
<div>
Same code like the Soil Moisture device but here we will care more about detecting any wet condition.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihKlMfTQEIhndiPigoaM678YwxHvTAd4YAvyOI60tgZAAKMpnG1SSdIy_xQZ9DgqCAGEEgLrhv4QsSHcoVTTFZ2d-NU1M9MwBgmbtopQwTnYYm5CqZ8foGJhTZpb5mmLLOS6MBlmJlXaA0/s1600/rain_drop.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEihKlMfTQEIhndiPigoaM678YwxHvTAd4YAvyOI60tgZAAKMpnG1SSdIy_xQZ9DgqCAGEEgLrhv4QsSHcoVTTFZ2d-NU1M9MwBgmbtopQwTnYYm5CqZ8foGJhTZpb5mmLLOS6MBlmJlXaA0/s320/rain_drop.jpg" width="240" /></a></div>
<br />
<br />
<h3 style="text-align: left;">
<span style="color: orange;">- Pollution Monitoring Device (Air Quality Sensor)</span></h3>
To be posted soon.<br />
<h3 style="text-align: left;">
<span style="color: orange;">- Garbage/Trash Filling Monitoring Device</span></h3>
<div>
By Monitoring the trash filling level using ultrasonic sensor, we can detect if the trash need urgent emptying or not.</div>
<b><u>Sensor:</u></b><br />
- Ultrasonic sensor (see picture), Connected to D6, D7, GND and V5<br />
<b><u>Device Code:</u></b><br />
<div>
From the GitHub code: <a href="https://github.com/osa-ora/sensor-ways-iot-devices/tree/master">https://github.com/osa-ora/sensor-ways-iot-devices/tree/master</a></div>
<div>
You will need the 2 files in the same folder:</div>
<a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-TrashSensorDeviceOTA.ino" id="636d1dc4d5e0fb71d841caa840a52654-d7d9de3a07b8c115747657752b3015548eb5b41d" style="background-color: white; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-TrashSensorDeviceOTA.ino">IoTDevice-TrashSensorDeviceOTA.ino</a> and <a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-Common.ino" id="0c13f5ca31ff92ab8785b6905748bbb6-da870878d959d8d634e44daeedab46cc47ac8c4d" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-size: 14px; white-space: nowrap;" title="IoTDevice-Common.ino">IoTDevice-Common.ino</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvAhnEOSK8Fv2uVvmy-DKXnql-iv7EWc0YPuEcJ0Jf14ukcv6Fp0qRZ9lDPBS2hKV_oX1OeJE3VUqaTATtTMN1rHigyJ24HC0ThqZcERUAPZkR-i4hZqLw21YI1ApS6E5wFsbdZSGWTfsC/s1600/ultrasonic.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvAhnEOSK8Fv2uVvmy-DKXnql-iv7EWc0YPuEcJ0Jf14ukcv6Fp0qRZ9lDPBS2hKV_oX1OeJE3VUqaTATtTMN1rHigyJ24HC0ThqZcERUAPZkR-i4hZqLw21YI1ApS6E5wFsbdZSGWTfsC/s320/ultrasonic.jpg" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<h2 style="text-align: left;">
<span style="color: red;">4) Control Devices</span></h2>
<h3>
<span style="color: orange;">- One/Two Control Device</span></h3>
<b><u>Sensor:</u></b><br />
- No Sensors, Only connect 1 or 2 relay modules as: Relay 1: GND & D5, Optionally Relay 2: GND & D8 or D7<br />
<b><u>Device Code:</u></b><br />
<div>
From the GitHub code: <a href="https://github.com/osa-ora/sensor-ways-iot-devices/tree/master">https://github.com/osa-ora/sensor-ways-iot-devices/tree/master</a></div>
<div>
You will need the 2 files in the same folder:</div>
<div>
<a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-ControlDeviceOTA.ino" id="7f65aa33fc1b3ac14b5cefcc9a5b7532-8f2e3c8e74b493f957929234d65d3c67a7c9a1c5" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-ControlDeviceOTA.ino">IoTDevice-ControlDeviceOTA.ino</a> and <a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-Common.ino" id="0c13f5ca31ff92ab8785b6905748bbb6-da870878d959d8d634e44daeedab46cc47ac8c4d" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-Common.ino">IoTDevice-Common.ino</a></div>
<h2>
<span style="color: red;">5) Medical Devices</span></h2>
<h3>
<span style="color: orange;">- Pulse & ECG Device</span></h3>
<div>
The idea behind this device is to capture either the ECG and send to the IoT backend or simply (more convenient) to detect heart rate, disconnected leads and flat rate, and set the alert to bradycardia or tachycardia or flat rate.<br />
<b><u>Sensor:</u></b><br />
- AD8232 heart monitoring connected to 3.3V, GND, A0, D6 and D7<br />
Leads must be placed over the left arm, right arm and right leg to record the 3 lead electricity.<br />
D6 & D7 detect disconnected leads if both are high (1)<br />
A0 contains the signal/electricity recorded which you can either capture over time and send to the backend server or do some processing using a threshold detection for heart beats and send the heart rate to the backend server.<br />
<b><u>Device Code:</u></b><br />
The code is simple as reading from A0 the electricity and either send a series of a specific duration e.g. 3 seconds or do some advanced analysis to detect HR and send only HR to the IoT backend.<br />
Should be carefully used and never use such devices as a medical device as medical devices must be very reliable and a lot of efforts should be done for noise filtration as well.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi32_Wgv1Och1iCiV8emSPLvIBMJgByM5ucUuFxI0as81irmyw9pAqagd3ro9PRk-iHpC9fx58UtasJ4USrp4-A39njjYid4A93TdciJBk20Cj3eZV9AyhwiYhDXaCKcgpOejtwX56LwOIA/s1600/ecg.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi32_Wgv1Och1iCiV8emSPLvIBMJgByM5ucUuFxI0as81irmyw9pAqagd3ro9PRk-iHpC9fx58UtasJ4USrp4-A39njjYid4A93TdciJBk20Cj3eZV9AyhwiYhDXaCKcgpOejtwX56LwOIA/s320/ecg.jpeg" width="320" /></a></div>
</div>
<h2 style="text-align: left;">
<span style="color: red;">6) Others Devices</span></h2>
<div style="text-align: left;">
The use case here is to detect morning and automate some work, or detect night to switch off something, etc.</div>
<h3 style="text-align: left;">
<span style="color: orange;">- Light Sensor Device</span></h3>
To be posted soon.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZLQD_qTXQuBYNgRiScn8g8WPgdcyHgk482VfLnE0R8ChbqTKrPP1UyIdtdtbUSmUx26-gWDRU4DusOjsdEfb0i8oEVKiF1dpF9NFY9tgA12AK4XssBmrKyt12o9Ir6CcOkQOFwi_mXuSl/s1600/light.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZLQD_qTXQuBYNgRiScn8g8WPgdcyHgk482VfLnE0R8ChbqTKrPP1UyIdtdtbUSmUx26-gWDRU4DusOjsdEfb0i8oEVKiF1dpF9NFY9tgA12AK4XssBmrKyt12o9Ir6CcOkQOFwi_mXuSl/s320/light.jpg" width="240" /></a></div>
<br />
<h3 style="text-align: left;">
<span style="color: orange;">- Parking Sensor Device</span></h3>
<div>
By Monitoring the parking slot using ultrasonic sensor, we can detect if the slot is empty or filled with something i.e. car.</div>
<b><u>Sensor:</u></b><br />
- Ultrasonic sensor (see picture), Connected to D6, D7, GND and V5<br />
<b><u>Device Code:</u></b><br />
<div>
From the GitHub code: <a href="https://github.com/osa-ora/sensor-ways-iot-devices/tree/master">https://github.com/osa-ora/sensor-ways-iot-devices/tree/master</a></div>
<div>
You will need the 2 files in the same folder:</div>
<a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-ParkingSensorDeviceOTA.ino" id="f707194d866f08901a7e71f4457355f6-c362ba661834e3a95e747d781987f602cd189ebf" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-ParkingSensorDeviceOTA.ino">IoTDevice-ParkingSensorDeviceOTA.ino</a> and <a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-Common.ino" id="0c13f5ca31ff92ab8785b6905748bbb6-da870878d959d8d634e44daeedab46cc47ac8c4d" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-size: 14px; white-space: nowrap;" title="IoTDevice-Common.ino">IoTDevice-Common.ino</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvAhnEOSK8Fv2uVvmy-DKXnql-iv7EWc0YPuEcJ0Jf14ukcv6Fp0qRZ9lDPBS2hKV_oX1OeJE3VUqaTATtTMN1rHigyJ24HC0ThqZcERUAPZkR-i4hZqLw21YI1ApS6E5wFsbdZSGWTfsC/s1600/ultrasonic.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvAhnEOSK8Fv2uVvmy-DKXnql-iv7EWc0YPuEcJ0Jf14ukcv6Fp0qRZ9lDPBS2hKV_oX1OeJE3VUqaTATtTMN1rHigyJ24HC0ThqZcERUAPZkR-i4hZqLw21YI1ApS6E5wFsbdZSGWTfsC/s320/ultrasonic.jpg" width="240" /></a></div>
<br />
<h3>
<span style="color: orange;">- Smart Phone as an IoT Device</span></h3>
To be posted soon.<br />
<div>
<br /></div>
<br />
<b><i>To Build Any Other devices, You need to pick the device with the same run-time requirement, and just change the sensor and may be other connections and build it in no time!</i></b><br />
<b><br /></b>
</div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-82025815356665107592019-03-18T02:51:00.002-07:002019-03-29T12:38:23.432-07:00Sensor-Ways Open Source IoT Devices<div dir="ltr" style="text-align: left;" trbidi="on">
In this post we will introduce the IoT devices that can work and communicate smoothly with the open source IoT backend application "Sensor-Ways".<br />
We will start with one useful device with both Gas and Temp monitoring capabilities.<br />
<br />
<b><u>Hardware Components:</u></b><br />
- Arduino Wemos d1 or d1 mini or similar ESP8266 which contains the embedded WiFi chip.<br />
- Gas sensor like MQ-2<br />
- Temperature Sensor DHT11<br />
- Buzzer (for local alarm)<br />
- 5V Relay modules (1-2 optional in case we need to control other electric devices upon any action from the sensor reading or from the Sensor-Ways backend)<br />
- Connection wires.<br />
<div>
- Adapter 9V would be good to power the Wemos d1 board, optionally you can power it using USB connection or 9V Battery.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuttMbd8xU0SZ1iYJD8iiKaN-zb7P9zPxiVJvkm2HKEElkXl8xvffV6PXLs2UFp_IMf7PEyZfpYveSKRxfxxyDUFSBKUM_IWrg9zH_LkhPxfc3vD9A8hdp7YO-hzB5RmpDWOEF5iPieJwV/s1600/device.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="960" data-original-width="683" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuttMbd8xU0SZ1iYJD8iiKaN-zb7P9zPxiVJvkm2HKEElkXl8xvffV6PXLs2UFp_IMf7PEyZfpYveSKRxfxxyDUFSBKUM_IWrg9zH_LkhPxfc3vD9A8hdp7YO-hzB5RmpDWOEF5iPieJwV/s400/device.jpg" width="283" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<b><u>Connectivity:</u></b></div>
<div>
<div>
1. MQ-2 or any to 5v, GND and A0 </div>
<div>
2. DHT sensor to 5v, GND and D6 </div>
<div>
3. Optional Buzzer: GND and D7</div>
<div>
4. Optional Relay 1: GND & D5 </div>
<div>
5. Optional Relay 2: GND & D8 or D7 </div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<b><u>Device Code:</u></b></div>
<div>
From the GitHub code: <a href="https://github.com/osa-ora/sensor-ways-iot-devices/tree/master">https://github.com/osa-ora/sensor-ways-iot-devices/tree/master</a></div>
<div>
You will need the 2 files in the same folder:</div>
<div>
<a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-GasTempDeviceOTA.ino" id="ac8e459b5ccf374a7b553abc2834a16e-195282b9afbc610e292d32f512d6feb07a6621a1" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-GasTempDeviceOTA.ino">IoTDevice-GasTempDeviceOTA.ino</a> and <a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways-iot-devices/blob/master/IoTDevice-Common.ino" id="0c13f5ca31ff92ab8785b6905748bbb6-da870878d959d8d634e44daeedab46cc47ac8c4d" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; text-decoration-line: none; white-space: nowrap;" title="IoTDevice-Common.ino">IoTDevice-Common.ino</a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<b><u>Code Compile & Upload:</u></b></div>
<div>
Using Arduino IDE compile the code and ensure everything is working fine. Then upload the code to a connected board using USB.</div>
<div>
Note: You may need to install some of the libraries as needed in the import section in the code.</div>
<div>
<br /></div>
<div>
<b><u>Device Configurations:</u></b></div>
<div>
The default code is configured to connect 2 sensors; Gas & Temp and no relay modules are connected, you can change this easily by the 2 variables:</div>
<div>
<div>
<span style="background-color: #eeeeee;">//Connected Sensors Count </span></div>
<div>
<span style="background-color: #eeeeee;">int connectedSensors = 2;</span></div>
<div>
<span style="background-color: #eeeeee;">//Connected Relay Modules Count </span></div>
<div>
<span style="background-color: #eeeeee;">int connectedDevices = 0;</span></div>
</div>
<div>
<br /></div>
<div>
You can also update the other settings like WiFI SSID, password, Sensor-Ways backend deployment IP/URL and Port and Device Id & Password.</div>
<div>
Note: In the previous post we have deployed our Sensor-Ways application, so you can easily get the IP address and HTTP/HTTPS port.</div>
<div>
Also we have demonstrated the steps required to register a new IoT device where we get at the end device Id and device password, all you need to do is to follow these steps again in the backend IoT Sensor-Ways server:</div>
<div>
<div>
<ol style="text-align: left;">
<li>Create a new Device Model with the same exact features supported in our IoT device (Gas and Temperature Sensors without any control device attached).</li>
<li>Add new unique bar code attached/mapped to this device model (once for each IoT device)</li>
<li>Go to Manage Devices and Add new device using this bar code (it will auto detect the associated device model)</li>
<li>Once the device is registered, you will need to use the device id and password to update your IoT device to connect to the system</li>
</ol>
</div>
</div>
<div>
Here is sample of defining Gas-Temp device model:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQk75rWbBdzo8x453MgdNc8dtp4msPyo6Wkb7V8QznwaUpZYDIg8gYvaOKlt4KjJ4lyQcdlKgUDekxWeY3FBfHv0H326MrtC6XTH5mdXGcbljEbu44GcBRIoj-T8Eb5maWqk-eWoZ_ucIv/s1600/device-model.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1071" data-original-width="1241" height="345" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQk75rWbBdzo8x453MgdNc8dtp4msPyo6Wkb7V8QznwaUpZYDIg8gYvaOKlt4KjJ4lyQcdlKgUDekxWeY3FBfHv0H326MrtC6XTH5mdXGcbljEbu44GcBRIoj-T8Eb5maWqk-eWoZ_ucIv/s400/device-model.png" width="400" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
- The other option to configure the device during runtime by deploying the code to the IoT device and it will allow you at 1st time to configure the required values at the 1st run; device Id, password, WIFI SSID and WIFI password.</div>
<div>
As simple as: Open the serial monitor in the Arduino IDE, send commands like: id=value, pass=value, wifi=vale, password=value, then send restart=true (1st time you will need to do a manual restart for the device after the code uploaded otherwise you will get an error)</div>
<div>
You can write help=true to show all the possible commands.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfLSj3DXkj9jhPzq3SkbC9ZHWEflnomnYwrKngr0cgKfCHpxxSvAMXP7GocAF4v3FtXS2dBmfqq5R7pIfy58F_UgeiySVpN5Y2pAyiCv4jl7NHB9oYiF_6RZ3uj9pgdlbTWyv7TgETM6tv/s1600/serial.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="655" data-original-width="1065" height="245" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfLSj3DXkj9jhPzq3SkbC9ZHWEflnomnYwrKngr0cgKfCHpxxSvAMXP7GocAF4v3FtXS2dBmfqq5R7pIfy58F_UgeiySVpN5Y2pAyiCv4jl7NHB9oYiF_6RZ3uj9pgdlbTWyv7TgETM6tv/s400/serial.png" width="400" /></a></div>
<div>
<br /></div>
<div>
This serial connection is very useful when you ship your IoT devices to the customers with pre-configuration to your IoT server, all you need during installation is to connect the device and configure the required customer variables such as device and WiFi identifiers.</div>
<div>
<br /></div>
<div>
Note: For production you will need to switch the debug messages by commenting one line in the variables section that define the debug:</div>
<div>
<div>
<span style="background-color: #eeeeee;">#define DEBUG</span></div>
</div>
<div>
<span style="background-color: #eeeeee;">To looks like:</span></div>
<div>
<div>
<span style="background-color: #eeeeee;">//define DEBUG</span></div>
</div>
<div>
<br /></div>
<div>
<b><u>Monitoring The Device & Device Management:</u></b></div>
<div>
Now if we go to Sensor-Ways backend application and open Manage Devices we can see the device status and last message received from the device and last ping (last seen).</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3QvQPW8PKoaTRVmISL7OBh-X9T6JFO4-Y4J1f2tkrP8jH_ijbUibX6gesjP67XMXUdABzg2yRVDh9b9dbkiXsUQfOA6pGXJYWiInjxJmK5gYtZfsh9qr60_UYmpJJo6UDxZpDNPdGANZO/s1600/gas-temp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="615" data-original-width="1373" height="178" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi3QvQPW8PKoaTRVmISL7OBh-X9T6JFO4-Y4J1f2tkrP8jH_ijbUibX6gesjP67XMXUdABzg2yRVDh9b9dbkiXsUQfOA6pGXJYWiInjxJmK5gYtZfsh9qr60_UYmpJJo6UDxZpDNPdGANZO/s400/gas-temp.png" width="400" /></a></div>
<div>
<br /></div>
<div>
If we click on that device we can see more information in the device details page and we can also send some commands or do some sort of device management.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4NrUGOYLmPznPR01i5IyuZCCuOc6B90Q18-rnF-xBwixzp82yLTlFDCSZ7lZeFkPwEQjbWBMLmdZiYQamnStXuefwGM0BUCe4dOzN0TEteIJufJsKMa8Crgd0MNAFPQunpbb0D7GSp09-/s1600/device-details.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="689" data-original-width="1600" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4NrUGOYLmPznPR01i5IyuZCCuOc6B90Q18-rnF-xBwixzp82yLTlFDCSZ7lZeFkPwEQjbWBMLmdZiYQamnStXuefwGM0BUCe4dOzN0TEteIJufJsKMa8Crgd0MNAFPQunpbb0D7GSp09-/s400/device-details.png" width="400" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
When you have enough messages, the graph icon will appear where you can see the pattern in your device messages.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyq0MRg5T7PZTLJ2Mz_sxGBHKWNScCm7oZ658llGJAB6ATZRmTuNQTB9eMAySobvUFmUq0-NniXIc8nBCDKtVKZKX0-bUInRkFoRlnQvEH1BpDgLmvvxvOXPrpcy6W9GNdVf58jDFuBKI1/s1600/temp-graph.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="591" data-original-width="919" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyq0MRg5T7PZTLJ2Mz_sxGBHKWNScCm7oZ658llGJAB6ATZRmTuNQTB9eMAySobvUFmUq0-NniXIc8nBCDKtVKZKX0-bUInRkFoRlnQvEH1BpDgLmvvxvOXPrpcy6W9GNdVf58jDFuBKI1/s400/temp-graph.png" width="400" /></a></div>
<div>
<br /></div>
<div>
You may try to send some commands such as request new update message from the device or restart the device, you can also edit the thresholds for alert for different sensor (per device).</div>
<div>
You will get notifications upon any alert (values that violate the thresholds) also when the device in online or offline or sending error data, etc.. you can control all these messages from the preferences:</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZtUP3PZlkYCRD7TLhAZXBxnGD4RmqUnhyZ_zeVP5nsDs5ds0tPgrIydIsc2myLZMiWOI6We2mu3ohO2LpVxNn_MoELlD7cZKus8FENXRny98dKXaD9JZ3cvRJzKHRoywB-dMJ8P9zDrPU/s1600/preferences.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="762" data-original-width="1600" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZtUP3PZlkYCRD7TLhAZXBxnGD4RmqUnhyZ_zeVP5nsDs5ds0tPgrIydIsc2myLZMiWOI6We2mu3ohO2LpVxNn_MoELlD7cZKus8FENXRny98dKXaD9JZ3cvRJzKHRoywB-dMJ8P9zDrPU/s400/preferences.png" width="400" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
The platform has a lot of other features like defining workflow based on the sensor input values, or schedulers, also building dashboards, simulators, etc.. you may need to spend reasonable time to fully understand the different features.</div>
<div>
<br /></div>
<div>
In subsequent posts, we will demonstrate many other IoT devices that enrich our IoT platform capabilities.</div>
<div>
<br /></div>
<div>
<br /></div>
</div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-11200616893651979702019-03-09T13:31:00.001-08:002019-06-21T09:42:53.562-07:00Sensor-Ways Open Source IoT Platform<div dir="ltr" style="text-align: left;" trbidi="on">
Sensor-Ways is my new open source project, created to provide end-to-end IoT capabilities and enable you to create different IoT applications.<br />
<br />
This is an example of the devices list page.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1RzZ5H0eTAkejpaptDwJfookgASzqo-f2hOU8C1YEXlsbzzQjadIHQewcUK-WnzvkYKdRHtNDM_HXYQTW2tzBlKPmF-UwHkxV5HO5gMolXN_wC4kS32qc7Jiq8OYxAbDWtKsT3a8VLflv/s1600/dashboard.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="857" data-original-width="1361" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1RzZ5H0eTAkejpaptDwJfookgASzqo-f2hOU8C1YEXlsbzzQjadIHQewcUK-WnzvkYKdRHtNDM_HXYQTW2tzBlKPmF-UwHkxV5HO5gMolXN_wC4kS32qc7Jiq8OYxAbDWtKsT3a8VLflv/s400/dashboard.png" width="400" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
In this post we will list the different capabilities in this platform which uses MySQL DB and Glassfish server for the runtime environment, all open source based technologies.<br />
The platform aim to use Arduino-based chips which can be customized as per our application needs, so the whole system enables the customization and upgrade ability of both hardware and software components of the IoT device.<br />
<br />
<b><u>List of features:</u></b><br />
<b><u><br /></u></b>
- Multi-tenant platform allow you to manage different and separate accounts/customers.<br />
- Account/User Management including activating/deactivating users, assign either read-only/read-write to different users.<br />
- Ability to define Device Models with different sensors and control units.<br />
- Ability to define bar codes for each device model to enable the on-boarding of end-user devices.<br />
- Ability to manage IoT Devices statuses, send command, request messages, etc..<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHZcKv42WxCYusuiMoF_Kd9GI_95T2UmJQIJtoI3LKyQDBQ_S8CS-0isl0m1xGWSLoTtro25qYneet0ZvXFWFNxftA7afewbpsljWXioLUmd15c7n6wgPQv_7XJiwH-4AdnR-TCKDj2kAi/s1600/control.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="716" data-original-width="1600" height="143" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHZcKv42WxCYusuiMoF_Kd9GI_95T2UmJQIJtoI3LKyQDBQ_S8CS-0isl0m1xGWSLoTtro25qYneet0ZvXFWFNxftA7afewbpsljWXioLUmd15c7n6wgPQv_7XJiwH-4AdnR-TCKDj2kAi/s320/control.png" width="320" /></a></div>
<br />
- Complete Device Management capabilities including: Control IoT Devices, Send/Recieve messages/commands, and enabled OTA firmware upgrade.<br />
- Define thresholds for alerts per each IoT device.<br />
- Define smart rules to be executed locally inside the device based on the sensors' readings.<br />
- Built-in notification alerts<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqZNZja3n9r4MNwzSl8akphX0amxHd-6vf0NesxnAHly0ZPnY2bFKJpMXYVyiiJFf5T_DfsxEifhMM5_KZpYJ4sTaEDIXb3bBi7Fabb2xk9fiikJdPq-1JtUYr4RQFyJc9Re4HDwGxOSuF/s1600/menu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="782" data-original-width="1371" height="227" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqZNZja3n9r4MNwzSl8akphX0amxHd-6vf0NesxnAHly0ZPnY2bFKJpMXYVyiiJFf5T_DfsxEifhMM5_KZpYJ4sTaEDIXb3bBi7Fabb2xk9fiikJdPq-1JtUYr4RQFyJc9Re4HDwGxOSuF/s400/menu.png" width="400" /></a></div>
<br />
- Using gmail for sending email notifications<br />
- Build workflows across different devices.<br />
- Build schedulers to execute actions on different devices.<br />
- Build device groups as a virtual grouping to control devices as one unit.<br />
- Build customized dashboard for each user with nice and simple graphs.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPvwuwlJz5yoEZ5Z-vdjj1lP-BF2S4MJp7n4SX4fiTu4Jrh04JqKBwP7bgUOVbbcuXZKvJedMb6EwRLilqHySH2ku5okirEx-sulAup-LsFGafYgkIR_vTIsMTCHg6EFwyWSLXp-65JALU/s1600/graphs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="870" data-original-width="1382" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPvwuwlJz5yoEZ5Z-vdjj1lP-BF2S4MJp7n4SX4fiTu4Jrh04JqKBwP7bgUOVbbcuXZKvJedMb6EwRLilqHySH2ku5okirEx-sulAup-LsFGafYgkIR_vTIsMTCHg6EFwyWSLXp-65JALU/s320/graphs.png" width="320" /></a></div>
<br />
- Assign a notification user per each device which gives high flexibility.<br />
- Build different simulations to simulate the IoT devices to build the IoT applications.<br />
- Upload new firmware for any model and define the required actions upon this new firmware upload.<br />
- Build customized reports as per needed.<br />
- Navigate and filter different audit records.<br />
- Full control over system jobs and their configurations e.g. offline detection of devices, purge old records, scheduler execution, etc.<br />
- Support different languages for the GUI and Notification templates.<br />
<b><u>Communication Protocol</u></b><br />
The protocol is documented in the application, in protocol.jsp page where you can clearly understand the different parameters, header values and responses.<br />
4 Main message types: login, update message, ping message and update firmware message.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdU5QGuW7Nap0qhzIL-Brb9djT1MFPAHJSaQkzcyTu8sKxsoaoRQecT4rRcL0Y_5NDRUXxbLj-FPcMZ9MHEk2-Z_4-kGBT_BUh6nuaybbaBI16_CTdEyhoLEte_0YGlC1oA_5JuGyDuIcX/s1600/protocol.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1003" data-original-width="1294" height="310" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdU5QGuW7Nap0qhzIL-Brb9djT1MFPAHJSaQkzcyTu8sKxsoaoRQecT4rRcL0Y_5NDRUXxbLj-FPcMZ9MHEk2-Z_4-kGBT_BUh6nuaybbaBI16_CTdEyhoLEte_0YGlC1oA_5JuGyDuIcX/s400/protocol.png" width="400" /></a></div>
<br />
<b><u>Project Repository</u></b><br />
<br />
The project is hosted in GitHub public repository:<br />
<a href="https://github.com/osa-ora/sensor-ways">https://github.com/osa-ora/sensor-ways</a><br />
<br />
<b><u>Installation Guide: Development Environment</u></b><br />
<br />
- The following steps for development environment setup, as this project is Java based project, and it is built using NetBeans 8.2 IDE.<br />
<br />
1- Install MySql DB 5.7 (if later version, you will need to review connection string, driver and fix it for proper DB connectivity)<br />
<div>
<div>
<div>
2- Create the required schema "iot" for the application and grant the application user access to the database "iot_user"</div>
<div>
<ul style="text-align: left;">
<li> Create "iot_user"</li>
<li> Create iot schema and run the schema creation script file "<a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways/blob/master/DataBase%20Scripts/schema_tables.sql" id="6d3a86abcc8de6140810c8af36b43c28-970ff584152b757880da9e3cb9bae81ce603539e" style="background-color: #f6f8fa; box-sizing: border-box; color: #0366d6; font-size: 14px; white-space: nowrap;" title="schema_tables.sql">schema_tables.sql</a>"</li>
<li> Populate the iot schema for LOV data by running the script file "<a class="js-navigation-open" href="https://github.com/osa-ora/sensor-ways/blob/master/DataBase%20Scripts/lov_data.sql" id="38aa4f2bdb2617ac75615069562606c1-18093f7f2423a072d7721a750575e2f80a59d8b4" style="background-color: white; box-sizing: border-box; color: #0366d6; font-size: 14px; white-space: nowrap;" title="lov_data.sql">lov_data.sql</a>"</li>
<li> Grant the user "iot_user" full privileges to the iot schema</li>
</ul>
</div>
<div>
3- Create default objects so the application can run including: tenant_settings, users and system_config tables.</div>
<div>
Here is the sample entries for these tables:</div>
<div>
<br /></div>
<div>
<span style="background-color: #eeeeee;">INSERT INTO `tenant_settings` VALUES (1,100,'Development Space', 1,150,15,20,'Africa/Cairo',0,'2019-01-31 16:21:06',5,20,1,0,0,0,0,5,0,0,0,'YOUR_EMAIL',15,1,1)</span></div>
<div>
<br /></div>
<div>
//Replace the email with your email.</div>
<div>
<br /></div>
<div>
<span style="background-color: #eeeeee;">INSERT INTO `users` VALUES (1,'Osama Oransa', '$31$16$nnmJyLDHWYGSGUF7gyrBjc2aw4JzkoB-PL5QCn_nKtA' ,'YOUR_EMAIL',100,1,0,'2019-02-03 11:40:26',1,'2018-06-01 18:07:43','2018-11-21 20:03:39' ,1,null,1,1,1,1,1,1,1,2,'0:0:0:0:0:0:0:1')</span></div>
<div>
<br /></div>
<div>
//Replace "Osama Oransa" and email with your data, email should match the email that you used in the tenant setting.</div>
<div>
<br /></div>
<div>
The default password is 123, no need to change it, because you can change it once the GUI is ready.</div>
<div>
<br /></div>
<div>
<span style="background-color: #eeeeee;">INSERT INTO `system_config` VALUES (1,'1.0','1.0',1,'smtp.gmail.com','587',1,'GMAIL_EMAIL','GMAIL_PASSWORD',2,'2018-11-10 15:47:46','1.0','SERVER_IP',SERVER_HTTPS,SERVER_HTTP,'Africa/Cairo');</span></div>
<div>
<br /></div>
<div>
//These settings is mainly for sending emails and for server information, you need to populate them all or disable the email sending.</div>
<div>
//Server information could be using the local or public IP Address of the target server of this deployment, this is very critical information for OTA device firmware upgrade.<br />
NOTE: Gmail account for sending emails must be security enabled to allow external applications to send emails.</div>
<div>
<br /></div>
<div>
</div>
4- Import the project/open it using NetBeans IDE8.x or later.</div>
<div>
5- Change the Glassfish resource file "glassfish-resources.xml" to point to the correct MySql DB and to use the proper "iot_user" credentials.</div>
<div>
6- Build & Deploy the application</div>
<div>
7- Login using your email, password=123 and development-identity=100</div>
</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji6hyWTMbF6ySrd8ESBCngwZ1ZKVH3ayHZNQRUsNAbNQuUQknka1JgVsb29ClhiuQj1-30mHJzmXZiONvPCaLy5jRtXFsI9U1-5mVFA5r_faJqbq-xol8M67D-RGWCxBtAHnbEMW5W5W6Z/s1600/login.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="663" data-original-width="1166" height="181" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEji6hyWTMbF6ySrd8ESBCngwZ1ZKVH3ayHZNQRUsNAbNQuUQknka1JgVsb29ClhiuQj1-30mHJzmXZiONvPCaLy5jRtXFsI9U1-5mVFA5r_faJqbq-xol8M67D-RGWCxBtAHnbEMW5W5W6Z/s320/login.png" width="320" /></a></div>
<div>
<br /></div>
8- Once logged-in change your password, and start to use the system.<br />
<br />
<b><u>Installation Guide: Production Environment</u></b><br />
<br />
- Ensure DB setup is correct and in place.<br />
- You need to export the WAR file and deploy it from the Glassfish Admin GUI.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFMpe-KqAtYeHrga8YOPJWgfUTRL7lP6Z9fGFJ8yfi0oZS2OBEgnro7VQSEaD_cGZgxcs-gcFYzomCQu8hMNBYLkxo8PJL6YihZHpLm6LJoeiByuTBHWW78e9L02xNO-zLRKrk53WaHikK/s1600/deploy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="940" data-original-width="1196" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFMpe-KqAtYeHrga8YOPJWgfUTRL7lP6Z9fGFJ8yfi0oZS2OBEgnro7VQSEaD_cGZgxcs-gcFYzomCQu8hMNBYLkxo8PJL6YihZHpLm6LJoeiByuTBHWW78e9L02xNO-zLRKrk53WaHikK/s400/deploy.png" width="400" /></a></div>
<br />
<br />
<b><u>Steps To Add an IoT Device:</u></b><br />
<br />
From the Server side we need to do the following steps:<br />
<br />
<ol style="text-align: left;">
<li>Create a new Device Model with the same exact features supported in your IoT device (once per device model).</li>
<li>Add new unique bar code for this device model (once for each IoT device)</li>
<li>Go to Manage Devices and Add new device using this bar code (it will auto detect the associated device model)</li>
<li>Once the device is registered, you will need to use the device id and password to update your IoT device to connect to the system.</li>
</ol>
<br />
<br />
We will see how to use the device id and password plus other important attributes in the next post where we will discuss the Arduino-based IoT Device Setup.<br />
<br />
<b><u>Features still in development:</u></b><br />
<div>
<br />
The following areas are still in development:<br />
- Add support to MQTT/JMS and other required protocol (Add different end points for each protocol)<br />
- Expose REST APIs for all operation (for management + mobile clients)<br />
- Build Mobile Clients that consumes the REST APIs<br />
- Add push notification as one of the notification channels<br />
- Add batch processing to some modules such as device registration.<br />
- Implement IoT device change password from the server<br />
- Add GUI language switch e.g. Arabic/English<br />
- Build some default applications<br />
- Enhance or build a new GUI<br />
- Improve dashboard and graph features by using ready open source modules.<br />
- Add better reporting capabilities.<br />
- Add billing reporting capabilities (to produce consumption reports)<br />
- Add some validation in the front-end, and backend.<br />
- Fix the workflows in the level of device group<br />
<br /></div>
<br /></div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-73811464960962433592018-05-19T05:30:00.001-07:002018-05-28T04:13:55.240-07:00Building Your Own Smart Home Solution<div dir="ltr" style="text-align: left;" trbidi="on">
In this series of blog posts, we will explain how you can build your own Smart Home Solution with almost low cost.<br />
<br />
<b><u>High Level Architecture</u></b><br />
The High Level Architecture is composed of the following:<br />
- Arduino devices (IoT devices) that collect sensor data and perform actions.<br />
- Back-end application : cloud hosted in a free tier and will be able to view messages and send commands to your IoT devices, we will build our application using JavaEE so it can be easily hosted in any cloud provider.<br />
- Mobile Application : another way to communicate with your devices, it is a client of the back-end application, we will build sample Android App as an example, you can build another iOS application to use according to your needs.<br />
<br />
Let's start by identify our platform requirements:<br />
<b><u>Hardware components</u></b><br />
- Arduino board + ESP8266 shield for WiFi connectivity: in my case I have selected: WeMos-D1-WiFi-uno-based which include the WiFi ESP8266 built-in with the board, so no more effort is required.<br />
- Temperature and Humidity Sensors : DHT11 is good enough.<br />
- 5V Relay modules to use it to control devices on and off.<br />
- Some connected wires to connect the sensor and relay module to the board.<br />
- USB connector to connect the board to the laptop (in WeMos case, mobile connector USB will be good).<br />
- Case for your board and components.<br />
- Adapter for the Arduino board to connect it later with direct electricity<br />
- A PC/Laptop to be used to develop our platform.<br />
- Soldering iron for production release of the device<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglallbKjG6f8qkGGbENhohRCfwe67bvU5SJe5Ky5n1Eb9FjPX9nh7CacKnM_TVtTBrRsCh8goGZi1Uois6mFIwFNpri8o46nL92qebMumBkXIxYleP9x0cmrdHH7ZBVvm7vQlwAJMJr8Pz/s1600/hardware.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="959" data-original-width="1191" height="257" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglallbKjG6f8qkGGbENhohRCfwe67bvU5SJe5Ky5n1Eb9FjPX9nh7CacKnM_TVtTBrRsCh8goGZi1Uois6mFIwFNpri8o46nL92qebMumBkXIxYleP9x0cmrdHH7ZBVvm7vQlwAJMJr8Pz/s320/hardware.png" width="320" /></a></div>
<br />
<br />
<b><u>Software Requirements</u></b><br />
- Setup Arduino IDE so we can develop our Arduino Code.<br />
- Google Cloud Tooling for Eclipse : here we will develop our back-end application code, deploy it to Google Cloud App Engine - Standard Environment (sandbox) which give us a chance to run it in a free tier.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinVtOWcMipw5pgA4n65yQdEaWEVGhZvXjJ6dQApqVhunxo8CCqzgwMCNcKogktdbeVLZGw_wUqLw66qyGiyat6GOYACTCz2-Lonv1y6pjW-EgA5KgdiQ3kca-dsmse7rZ53BKNlylIpERR/s1600/backend.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="554" data-original-width="1524" height="116" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEinVtOWcMipw5pgA4n65yQdEaWEVGhZvXjJ6dQApqVhunxo8CCqzgwMCNcKogktdbeVLZGw_wUqLw66qyGiyat6GOYACTCz2-Lonv1y6pjW-EgA5KgdiQ3kca-dsmse7rZ53BKNlylIpERR/s320/backend.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
- Optionally: Android Studio : to build the mobile application to be used as another way to control our smart home devices.<br />
<br />
In subsequent posts we will go in depth in the complete solution.<br />
<br /></div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-43606947209181693272017-05-20T13:25:00.000-07:002017-05-20T13:25:53.699-07:00Docker Overview<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="direction: ltr; line-height: 90%; margin-bottom: 0pt; margin-left: 0.25in; margin-top: 12pt; text-indent: -0.25in; unicode-bidi: embed; word-break: normal;">
<div style="direction: ltr; line-height: 90%; margin-bottom: 0pt; margin-left: 0.25in; margin-top: 12pt; text-indent: -0.25in; unicode-bidi: embed; word-break: normal;">
A container is packaged as an entire runtime environment: the service/app plus all dependencies, libraries, & configuration files needed to run it</div>
<div style="direction: ltr; line-height: 90%; margin-bottom: 0pt; margin-left: 0.25in; margin-top: 12pt; text-indent: -0.25in; unicode-bidi: embed; word-break: normal;">
Portable across environments & lightweight (share the OS)<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDXhFDEt6wbNeS40Pvj7KmynNWb8rCa1U2fnENPVn0ikgm3fdFyRhuZD6SvV0InXgPYaHUA8pYd0S5tUAk5yaVYPX41wK-C47NsI62fTrlWlJCx9DsLD-ZbkNXc_3NHTsDxaBlnwW7O7un/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="101" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDXhFDEt6wbNeS40Pvj7KmynNWb8rCa1U2fnENPVn0ikgm3fdFyRhuZD6SvV0InXgPYaHUA8pYd0S5tUAk5yaVYPX41wK-C47NsI62fTrlWlJCx9DsLD-ZbkNXc_3NHTsDxaBlnwW7O7un/s320/1.png" width="320" /></a></div>
<br />
The above image summarize the difference between container and VM, yet they can be combined and docker can be nested inside VM.<br />
<br />
Different docker technoloy available such as Docker : www.docker.com, Mesos : http://mesos.apache.org/ and Kubernetes : https://kubernetes.io/<br />
<div>
<br /></div>
<span style="text-indent: -0.25in;"><br /></span>
<span style="text-indent: -0.25in;">We will pick Docker to give high level functionality of it here.</span><br />
<span style="text-indent: -0.25in;"><br /></span>
<h2 style="text-align: left;">
<span style="text-indent: -0.25in;"><b>Docker</b></span></h2>
<br />
<span style="text-indent: -0.25in;">Docker began as an internal project for the dotCloud organization. </span><br />
<br />
It was developed in-house and then later open sourced in 2013.<br />
<br />
Enables you to:<br />
Separate your applications from your infrastructure so you can deliver software quickly.<br />
Manage your infrastructure in the same ways you manage your applications<br />
<div>
<br /></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBggbk8uDkL5rsXUQ2V_fWhZkYpwbsjBtdnZZkFKDB0h40YJW19KkgRGJHHEFJnRj-GS0UyLtQyRx2_xDmDbhIq52Lux_jtSneXw06a5tRPHFsYpKGuMAbNs-nl8zwf1fttfGdKzXiLHoV/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="241" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBggbk8uDkL5rsXUQ2V_fWhZkYpwbsjBtdnZZkFKDB0h40YJW19KkgRGJHHEFJnRj-GS0UyLtQyRx2_xDmDbhIq52Lux_jtSneXw06a5tRPHFsYpKGuMAbNs-nl8zwf1fttfGdKzXiLHoV/s320/2.png" width="320" /></a></div>
<br /></div>
<div style="direction: ltr; line-height: 90%; margin-bottom: 0pt; margin-left: 0.25in; margin-top: 12pt; text-indent: -0.25in; unicode-bidi: embed; word-break: normal;">
<span id="goog_665796149"></span><span id="goog_665796150"></span>As we can see Docker composed of Server (docker daemon) which expose the docker functionality via REST APIs, the docker command line client uses these REST APIs to communicate with the daemon service/server.<br />
<br />
The main components as we can see is the Images, Containers, Network and data Volumes.<br />
We can add to them the registries.<br />
<br />
The following show the architecture and include the registry in the picture:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLMtqx90SEFm-5SpEoxmSavy-hLG8ItienMm3rcboGMAmfiFy5OWIXwa4pfEi_U2TGQbbrBQUryxPlPHobAr369jdK1yvRpyIhQq4XabTSSW933fu5336Tmm6ca3ssxlfUduoqmbwfMha9/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="159" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhLMtqx90SEFm-5SpEoxmSavy-hLG8ItienMm3rcboGMAmfiFy5OWIXwa4pfEi_U2TGQbbrBQUryxPlPHobAr369jdK1yvRpyIhQq4XabTSSW933fu5336Tmm6ca3ssxlfUduoqmbwfMha9/s320/3.png" width="320" /></a></div>
<br />
<b><u><span style="color: red;">1) Docker Images : Templates</span></u></b><br />
<br />
<br />
An image is a read-only template with instructions “<b>Dockerfile</b>” for creating a Docker container. Often, an image is based on another image, with some additional customization.<br />
You might create your own images or use those created and published by others in a registry.<br />
When you change the Dockerfile and rebuild the image, only those layers which have changed are rebuilt.<br />
This is part of what makes images so lightweight, small, and fast, when compared to other virtualization technologies.<br />
<div>
<br /></div>
<br />
Example of Dockerfile:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVFwW9zQf2OctRXhf-UpF-d4IRiUnBgOr4v6v1zHDc83DAmzG-7z7OvND9Ov8NJO20Wc4qTA-4XRzvO9Re4AQYUx_9VHaHTWNV5sxpZ4QUuIoTtkfg5WCSFk-heT9bm1T4EF0MM88ZohcM/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVFwW9zQf2OctRXhf-UpF-d4IRiUnBgOr4v6v1zHDc83DAmzG-7z7OvND9Ov8NJO20Wc4qTA-4XRzvO9Re4AQYUx_9VHaHTWNV5sxpZ4QUuIoTtkfg5WCSFk-heT9bm1T4EF0MM88ZohcM/s320/4.png" width="320" /></a></div>
<br />
<br />
It is composed of 3 main parts, base image for that docker, different docker building steps including our application, finally the start command of that docker.<br />
You should know that docker image is layered and <span style="text-indent: -0.25in;">Any RUN commands you specify in the Dockerfile </span><span style="text-indent: -0.25in;">creates a new layer for the container, this allow us to share the layers and build upon them which improve the usability of the containers and their layers.</span><br />
<div>
<br /></div>
<br />
<b><u><span style="color: red;">2) Docker Registries: Templates Store</span></u></b><br />
A Docker registry stores Docker images.<br />
Docker Hub and Docker Cloud are public registries that anyone can use, and Docker is configured to look for images on Docker Hub by default.<br />
You can even run your own private registry - “Docker Trusted Registry (DTR)”<br />
<div>
<div>
You can push, and pull images from any Docker registry</div>
<div>
<br /></div>
<div>
A free <span style="text-indent: -0.25in;">https://cloud.docker.com/ account can be created where you can use it to store your docker images.</span></div>
<div>
To use your Docker Cloud account:</div>
<div>
docker login<span class="Apple-tab-span" style="white-space: pre;"> </span>: will prompt for username and password</div>
<div>
docker push <span class="Apple-tab-span" style="white-space: pre;"> </span>: push to store any image in your </div>
<div>
docker pull<span class="Apple-tab-span" style="white-space: pre;"> </span>: pull any image to your local machine</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
You can use: docker search keyword to search for any docker image.</div>
<div>
e.g. docker search oracle ==> to search for Oracle images.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<b><u><span style="color: red;">3) Docker Containers: Running instances</span></u></b><br />
A container is a runnable instance of an image.<br />
You can create, run, stop, move, or delete a container using the Docker API or CLI<br />
You can connect a container to:<br />
One or more networks<br />
Attach storage to it<br />
Capture a new image based on its current state.<br />
<div>
<br /></div>
<br /></div>
<div style="direction: ltr; line-height: 90%; margin-bottom: 0pt; margin-left: 0.25in; margin-top: 12pt; text-indent: -0.25in; unicode-bidi: embed; word-break: normal;">
<b><u><span style="color: red;">4) Docker Network :</span></u></b><br />
By default, Docker provides two network drivers:<br />
Bridge (default) : limited to a single host running Docker Engine.<br />
Overlay network : supports multiple hosts.<br />
You can create your own network:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>docker network create -d bridge my_bridge<br />
To list existing networks: docker network ls<br />
To add a docker into a network: docker run -d --net=my_bridge …..<br />
Optionally you can select the IP as well using --ip=ip_address (or --ip6=…)<br />
To inspect network: docker network inspect my_bridge<br />
<div>
<br /></div>
<div>
<br /></div>
<div>
<b><u><span style="color: red;">5) Docker Volumes :</span></u></b></div>
<div>
<div>
In addition to Docker Union File System which compose the Docker layers, Additional Storage can be mounted such as Data Volume :</div>
<div>
Used to persist data, independent of the container’s lifecycle. </div>
<div>
Mounted during create or run of the docker using -v</div>
<div>
Example : $ docker run -d -P --name web -v /webapp training/webapp python app.py</div>
<div>
You can also mount existing host directory using the same –v</div>
<div>
Example: $ docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py</div>
<div>
To list volumes: docker volume ls</div>
<div>
Note: Shared storage can be used but need to pay attention to write operations to avoid data corruption.</div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<b><u><span style="color: red;">6) Docker Swarm :</span></u></b></div>
</div>
<div style="direction: ltr; line-height: 90%; margin-bottom: 0pt; margin-left: 0.25in; margin-top: 12pt; text-indent: -0.25in; unicode-bidi: embed; word-break: normal;">
A swarm is a group of machines (physical or virtual) that are running Docker and have been joined into a cluster.<br />
Contains Swarm Manager and Worker Nodes.<br />
Uses several strategies to run containers:<br />
“emptiest node” : which fills the least utilized machines with containers<br />
“global” : which ensures that each machine gets exactly one instance of the specified container.<br />
You execute: docker swarm init to convert this machine to Swarm Manager and then use: docker swarm join in other machines to join this cluster.<br />
<div>
<br /></div>
<div>
<br /></div>
<div>
<span style="text-indent: -0.25in;"><b><u><span style="color: red;">7) Docker Service :</span></u></b></span></div>
<div>
<span style="text-indent: -0.25in;"><div>
A service only runs one image.</div>
<div>
Described using: docker-compose.yml</div>
<div>
Describing: what ports it should use, how many replicas, resources, etc.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrs4KfeD9vZGIxS19rpLUPxaSlPIprSed6492X9vfXTR_aytcZYWSmNNV8q9TGuigWgwbeNbg3VsBa_TUWkj6Q4ePOTk0R1WbNZRnD2uxVKsodbHI9piMFi9YsKgCG6QzNEIdYhuCkiQpr/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrs4KfeD9vZGIxS19rpLUPxaSlPIprSed6492X9vfXTR_aytcZYWSmNNV8q9TGuigWgwbeNbg3VsBa_TUWkj6Q4ePOTk0R1WbNZRnD2uxVKsodbHI9piMFi9YsKgCG6QzNEIdYhuCkiQpr/s320/5.png" width="320" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
docker stack deploy -c docker-compose.yml myapp</div>
<div>
docker stack ps myapp</div>
<div>
docker stack rm myapp</div>
<div>
<br /></div>
</span></div>
</div>
<div>
<br />
Example: Micro-service Example: Java REST App connect to Oracle DB<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoOCfbt2NepFskEzsqiaqkIFUQuuzEyRrSi1wtAcGHlvFGUQCUjTz9bwWXfhdKWjo5CkURr-Ouz7w-pGkR_0hNCmvogbSXxBG24RBeE27qEHfeCEoP3rawCDfqTUH_jUPO-gsUbYvW4F6C/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoOCfbt2NepFskEzsqiaqkIFUQuuzEyRrSi1wtAcGHlvFGUQCUjTz9bwWXfhdKWjo5CkURr-Ouz7w-pGkR_0hNCmvogbSXxBG24RBeE27qEHfeCEoP3rawCDfqTUH_jUPO-gsUbYvW4F6C/s320/6.png" width="320" /></a></div>
<br />
<br />
The following are the steps to create this example using docker command line:<br />
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">Execution</span><span style="font-family: Calibri; font-size: 11pt; vertical-align: baseline;"> Steps:</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt; vertical-align: baseline;">//Build our Java Application Docker ...</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">docker</span><span style="font-family: Calibri; font-size: 11pt;">
build -t </span><span style="font-family: Calibri; font-size: 11pt;">my_java_docker</span><span style="font-family: Calibri; font-size: 11pt;">
.</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">//Create Network for our Java & DB Dockers</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">docker</span><span style="font-family: Calibri; font-size: 11pt;">
network create -d bridge </span><span style="font-family: Calibri; font-size: 11pt;">my_bridge</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">//Search for Oracle DB XE</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">docker</span><span style="font-family: Calibri; font-size: 11pt;">
search oracle</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">//Pull one of Oracle DB EX images (not official)</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">docker</span><span style="font-family: Calibri; font-size: 11pt;">
pull </span><span style="font-family: Calibri; font-size: 11pt;">wnameless</span><span style="font-family: Calibri; font-size: 11pt;">/oracle-xe-11g</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri;"><span style="font-size: 11pt;">//Now run the DB </span><span style="font-size: 14.6667px;">container</span><span style="font-size: 11pt;"> in the my_bridge network ...</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">docker</span><span style="font-family: Calibri; font-size: 11pt;">
run --net=</span><span style="font-family: Calibri; font-size: 11pt;">my_bridge</span><span style="font-family: Calibri; font-size: 11pt;">
-d -p 49160:22 -p 49161:1521 -e ORACLE_ALLOW_REMOTE=true </span><span style="font-family: Calibri; font-size: 11pt;">wnameless</span><span style="font-family: Calibri; font-size: 11pt;">/oracle-xe-11g</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">//List current running docker instances to get DB XE Instance ID</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">docker</span><span style="font-family: Calibri; font-size: 11pt;">
</span><span style="font-family: Calibri; font-size: 11pt;">ps</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri;"><span style="font-size: 14.6667px;">//Access the DB Docker using bash and execute the required DB scripts.</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">docker</span><span style="font-family: Calibri; font-size: 11pt;">
exec -it "container id from the previous step" bash</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">//run SQLPlus to create our DB objects ..</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">sqlplus</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">//install DB objects</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri;"><span style="font-size: 14.6667px;">...</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri;"><span style="font-size: 14.6667px;">//Inspect my network to get the IP address of the DB container</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">docker</span><span style="font-family: Calibri; font-size: 11pt;">
network inspect </span><span style="font-family: Calibri; font-size: 11pt;">my_bridge</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri;"><span style="font-size: 11pt;">//Run the Java container using the DB IP address as </span><span style="font-size: 14.6667px;">Environment</span><span style="font-size: 11pt;"> variable in the Java docker container so it can connect to the DB successfully.</span></span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">docker</span><span style="font-family: Calibri; font-size: 11pt;">
run -p 4010:80 --net=</span><span style="font-family: Calibri; font-size: 11pt;">my_bridge</span><span style="font-family: Calibri; font-size: 11pt;"> -e
DBAAS_DEFAULT_CONNECT_DESCRIPTOR=172.18.0.3:1521:XE </span><span style="font-family: Calibri; font-size: 11pt;">my_java_docker</span></div>
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">// or use this in env file in the format of ENV VAR=VALUE</span></div>
<br />
<div style="direction: ltr; margin-bottom: 0pt; margin-left: 0in; margin-top: 6pt; unicode-bidi: embed; word-break: normal;">
<span style="font-family: Calibri; font-size: 11pt;">docker</span><span style="font-family: Calibri; font-size: 11pt;">
run -p 4010:80 --net=</span><span style="font-family: Calibri; font-size: 11pt;">my_bridge</span><span style="font-family: Calibri; font-size: 11pt;"> --</span><span style="font-family: Calibri; font-size: 11pt;">env</span><span style="font-family: Calibri; font-size: 11pt;">-file=./env.txt </span><span style="font-family: Calibri; font-size: 11pt;">my_java_docker</span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl0crnG7Q42hDQc6p9-IfSHCSj_tHGZNaO_uijWS7hcN-jddwuklvsMGsU6bivUHCZ4sQYMwPBm1vVActt4EG2vd9PyU3d5TY74GTDxoIwSYzTXjNdmgBYDnwXnhsSmZyqV5wo4_BXAU_5/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="135" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjl0crnG7Q42hDQc6p9-IfSHCSj_tHGZNaO_uijWS7hcN-jddwuklvsMGsU6bivUHCZ4sQYMwPBm1vVActt4EG2vd9PyU3d5TY74GTDxoIwSYzTXjNdmgBYDnwXnhsSmZyqV5wo4_BXAU_5/s320/7.png" width="320" /></a></div>
<br />
<br />
That's just an introduction about Docker and Container Technologies.<br />
<br />
For More information check Docker Documentation including samples and a lot of examples can be found at:<br />
https://docs.docker.com/<br />
<div>
<br /></div>
<br />
<br /></div>
</div>
</div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-87617535872351613712016-05-18T09:18:00.003-07:002016-05-18T09:18:48.244-07:00Designing Scalable MongoDB Documents versus Relational DB Entities<div dir="ltr" style="text-align: left;" trbidi="on">
One of the challenging to design MongoDB data model is the background knowledge of relational DB which will affect our ability to design optimal scalable data model structure.<br />
<br />
In this post we will demonstrate a use case that is taken from the book; <u><b>Instant MongoDB by Amol Nayak.</b></u><br />
<br />
The use case is about Students enrolled in courses that taught by lecturers.<br />
The relations can be summarized as following: <br /><br />
We have student use case where,<br />
- Student enroll into courses (many to many)<br />- Each course can belong to many categories (one to many)<br />- Each course is delivered by many lecturers (one to many)<br />- Each course has content (one to one)<br />- Each course content is divided into parts (one to many)<br />- Each content part is related to assignments (one to many)<br />- Each student has assignment submission that is related to assignment (one to one)<br />
<br />
<img alt="" src="data:image/png;base64,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" /><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Now to model this ER diagram for MongoDB documents, we need to do the following:<br />
<br />
<b>1) Think of the main documents that we have</b><br />
The main document is a key player, well defined, and contains a lot of information that doesn't let it simply included in other documents.<br />
We can think of Student, Course and Lecturer.<br />
<br />
<b>2) Embed Related Documents</b><br />
We can see the Student embed his/her
submissions while Course embed all other documents that is related to it such as catalog, content, assignment being all part of the course document.<br />
<br />
<b>3) Add reference to other documents (using id)</b><br />
We can see the Student reference his/her courses.<br />
Course reference the lecturers .<br />
<br />
<b>4) Add minimal information to the referenced documents</b><br />
Select the information that is not frequently change and will be mostly needed in the application.<br />
e.g. add course name in the referenced course in the student document (mostly will be required instead of go and query the course document, plus the course name is rarely change).<br />
Also add lecturer name in the course document which will be mostly required and will change rarely as well but will prevent us from query the lecturer document to get the name with each course.<br />
<br />
<b>5) Revisit the documents </b><br />
To see if we can omit some documents and include them in one of the existing documents.<br />
So for example if you decided to have a separate document for Course Category, at this step you'll see that the category has only name value so it is better to include it inside the course instead of reference it with id+name as it will cost us more information in that case.<br />
<br />
<br />
<br />
<img alt="" height="358" src="data:image/png;base64,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" width="640" /><br />
<br />
As we can see in the previous figure, we have identified 3 main documents with some embedded documents and we have selected the referenced documents, finally we have included the required minimal data in each of the referenced entities.<br />
For example Course category has only static values, so we have included it entirely in our Course document and we didn't defined a separate document for it.<br />
The same for Students submissions which reference the assignment but include all the required information so no separate document for it.<br />
The other information that is related to course is also included in the course being part of the course document including the content parts, assignments, etc..<br />
<br />
The challenge about the Lecture object here, the lecturer object has a lot of information about the lecturer that doesn't make any sense to put them in the course document and repeat them for different courses instead we can reference the lecturer document and define the minimal required information that we need to show or use it in our application, in this case lecturer name, the good thing about this information is not frequently change as well.<br />
<br />
This is how to design documents in mongoDB for salable applications.<br />
<br />
<br />
<br /></div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com2tag:blogger.com,1999:blog-4604699843198276393.post-59303494188330010582016-04-27T05:48:00.002-07:002016-04-27T05:50:27.602-07:00AngularJS Core Concepts<div dir="ltr" style="text-align: left;" trbidi="on">
AngularJS is an Open Source Java Script Framework built by Miško Hevery and Adam Abrons in 2009.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgumpaXfyMElaj6je9_x_aqGPZcBDD6nOm-F7QpOLh6J5CdAJOx5Rp6XdxvHYOfxOGOjv739CsMQayVUixZKZnsXhlsiC27TwQYtnUUi9vSIftm8d0aUCDX98uPg5CSWOk0GvId5vgPof29/s1600/AngularJS-large.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="90" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgumpaXfyMElaj6je9_x_aqGPZcBDD6nOm-F7QpOLh6J5CdAJOx5Rp6XdxvHYOfxOGOjv739CsMQayVUixZKZnsXhlsiC27TwQYtnUUi9vSIftm8d0aUCDX98uPg5CSWOk0GvId5vgPof29/s320/AngularJS-large.png" width="320" /></a></div>
<br />
<span style="font-size: large;"><b>Benefits</b>:</span><br />
- Easy to use<br />
- Dependency Injection<br />
- 2-ways Data Bindings<br />
- Clear MVC : separate model, view and controller.<br />
- Easy Testability<br />
- Useful features such as directives, filters, etc..<br />
<br />
<b><span style="font-size: large;">Start to use:</span></b><br />
Download Angluar.js file or angular.min.js (minified and obfuscated version to improve the page loading speed) and import it in your view (HTML) file.<br />
Download from : <a href="https://angularjs.org/">https://angularjs.org/</a><br />
<b><span style="font-size: large;">Angular Modules:</span></b><br />
Angular is designed based on modules which works as a container for all other angularJS components.<br />
You can define any module using:<br />
angular.module("module_name",[list_of_dependency_modules]<br />
e.g. var myApp = angular.module("myApp",[]);<br />
We can use this module inside our view or create anonymous application using ng-app<br />
<b><span style="font-size: large;">Angular controller:</span></b><br />
Is a java script function that get executed in a specific scope.<br />
For example we can add to our app a controller using:<br />
var myController = function($scope){<br />
$scope.employees=[<br />
{ "firstName" : "Osama", "lastName": "Oransa","picture": "/images/osama.png", "hiredate": new Date("June 29, 2000"), "salary": 1000, "tax": 0},<br />
{ "firstName" : "Ahmed", "lastName": "Samir","picture": "/images/ahmed.png", "hiredate": new Date("November 06, 2000"), "salary": 1500, "tax": 0},<br />
{ "firstName" : "Sameh", "lastName": "Alaa","picture": "/images/sameh.png", "hiredate": new Date("October 19, 2000"), "salary": 2000, "tax": 0},<br />
{ "firstName" : "Toka", "lastName": "Ibrhaim","picture": "/images/toka.png", "hiredate": new Date("May 21, 2000"), "salary": 1400, "tax": 0}<br />
];<br />
}<br />
myApp.controller("myController",myController);<br />
So these 2 steps we have create a controller and added it to our application/module.<br />
We can do this in a single step using:<br />
myApp.controller("myController",function($scope){<br />
$scope.employees=[<br />
{ "firstName" : "Osama", "lastName": "Oransa","picture": "/images/osama.png", "hiredate": new Date("June 29, 2000"), "salary": 1000, "tax": 0},<br />
{ "firstName" : "Ahmed", "lastName": "Samir","picture": "/images/ahmed.png", "hiredate": new Date("November 06, 2000"), "salary": 1500, "tax": 0},<br />
{ "firstName" : "Sameh", "lastName": "Alaa","picture": "/images/sameh.png", "hiredate": new Date("October 19, 2000"), "salary": 2000, "tax": 0},<br />
{ "firstName" : "Toka", "lastName": "Ibrhaim","picture": "/images/toka.png", "hiredate": new Date("May 21, 2000"), "salary": 1400, "tax": 0}<br />
];<br />
});<br />
$scope object is available to set data models and behavior so we can use them inside the view.<br />
We can also delete from the scope object:<br />
delete $scope.employees;<br />
<br />
Defining behavior:<br />
$scope.function_name = function(parameters) {<br />
... code here<br />
}<br />
For example:<br />
$scope.calculateTax= function(employee){<br />
employee.tax= employee.salary *0.2;<br />
}<br />
This add behavior and data model to our scope object where we can now use it from inside the view :<br />
Example:<br />
<html ng-app="myApp"><br />
<head><br />
<script src="angular.js"/><br />
</head><br />
<body><br />
<div ng-controller="myController"><br />
<table><br />
<tr ng-repeat="emp in employees"><br />
<td> Photo : <img ng-src="{{ emp.picture}}" /> </td><br />
<td> First Name : {{ emp.firstName}} </td><br />
<td> Last Name : {{ emp.lastName}} </td><br />
<td> Hiredate : {{ emp.hiredate }}</td><br />
<td> Salary : {{ emp.salary}} </td><br />
<td> Tax : {{ emp.tax}} <input type="button" value="Tax" ng-click="calculateTax(emp)"/> </td><br />
</tr><br />
</table><br />
</div><br />
</body><br />
</html><br />
We can have nested controllers and each one will be limited to its scope.<br />
<b><span style="font-size: large;">Directives, Events and Bindings:</span></b><br />
In the previous example we have used ng-repeat to loop over collection.<br />
We can use the following directives inside the loop:<br />
<br />
$index number Number of the element <br />
$first Boolean This is true if the element is the first one <br />
$last Boolean This is true if the element is the last one <br />
$middle Boolean This is true if the element is in the middle <br />
$even Boolean This is true if the element is even <br />
$odd Boolean This is true if the element is odd <br />
<br />
we can also have nested loops in that case we can get the parent index using $parent.$index<br />
We have also used ng-src for image to avoid using src directly which will fire 2 calls one before binding (which will fail) and another one after binding.<br />
We used the {{ }} directive to bind values we can also use the directive ng-bing or ng-bindHtml to bind values.<br />
We have used also ng-click to bind onClick event to that element, we can use also the following events:<br />
ng-Blur, ng-Change, ng-Copy, ng-Cut, ng-DblClick, ng-Focus, ng-KeyPress, ng-KeyDown, ng-KeyUp, ng-Mousedown, ng-Mouseenter, ng-Mouseleave, ng-Mousemove, ng-Mouseover, ng-Mouseup, and ng-Paste<br />
We can enable/disabled the element using ng-disabled="boolean value"<br />
The same for ng-show and ng-hide which take boolean expression.<br />
ng-if pevent the rendering of the element if the condition is not true.<br />
We can also import certain parts in our view using ng-include directive.<br />
e.g. <div ng-include="'mainMenu.html'"></div><br />
<br />
<b><span style="font-size: large;">Two way Data Binding:</span></b><br />
Change in the view update the model and change in the model update the view.<br />
This can be used with input, textfield and text area, using ng-model<br />
So for example in our previous example we can modify the Salary :<br />
<td> Salary : {{ emp.salary}} <input type="text" ng-model="emp.salary" /> </td><br />
<br />
<b><span style="font-size: large;">Filters in AngularJS:</span></b><br />
We can use Filters for 3 main use cases; Format, Sort or Filter the data.<br />
To apply a filer using the pipe charachter "|"<br />
e.g. {{ expression | filterName:parameter }}<br />
5 filternames are available: lowercase, uppercase, number, currency and date.<br />
<br />
LimitToFilter can be used to limit the number of rows or charachers in a String.<br />
e.g. {{ expression | limitTo : limit : begin }}<br />
$scope.rowLimit=3;<br />
In the view:<br />
Rows to Display: <input type="number" step="1" min="0" max="5" ng-model="rowLimit"/><br />
<br><br />
<table><br />
<thead><br />
<tr><br />
<th>First Name</th><br />
<th>Last Name</th><br />
<th>Salary</th><br />
<th>Tax</th><br />
</tr><br />
</thead><br />
<tbody><br />
<tr ng-repeat="emp in employees | limitTo:rowLimit:0"><br />
<td> First Name : {{ emp.firstName | upppercase }}</td><br />
<td> Last Name : {{ emp.lastName | lowercase }}</td><br />
<td> Hiredate : {{ emp.hiredate | date:"dd/MM/yyyy"}}</td><br />
<td> Salary : {{ emp.salary | number:2 }}</td><br />
<td> Tax : {{ emp.tax | currency:"$":1 }}</td><br />
</tr><br />
</tbody><br />
</table><br />
<br />
To sort data we use {{ orderby_expression | orderBy: expression : reverse }}<br />
e.g. ng-repeat=" emp in employees | orderBy:'salary':false" or '+salary' or '-salary'<br />
<br />
$scope.sortColumn = "firstName";<br />
In view:<br />
Order By : <select ng-model="sortColumn"><br />
<option value="firstName"> FirstName Asc</optoin><br />
<option value="-firstName"> FirstName Desc</optoin><br />
<option value="+salary"> Salary Asc</optoin><br />
<option value="-salary"> Salary Desc</optoin><br />
</select><br />
<br />
<br><br />
<table><br />
<tr><br />
<th>First Name</th><br />
<th>Last Name</th><br />
<th>Salary</th><br />
<th>Tax</th><br />
</tr><br />
<tr ng-repeat="emp in employees | orderBy:sortColumn"><br />
<td> First Name : {{ emp.firstName | uppercase }}</td><br />
<td> Last Name : {{ emp.lastName | lowercase }}</td><br />
<td> Hiredate : {{ emp.hiredate | date:"dd/MM/yyyy"}}</td><br />
<td> Salary : {{ emp.salary | number:2 }}</td><br />
<td> Tax : {{ emp.tax | currency:"$":1 }}</td><br />
</tr><br />
</table><br />
To sort using column header:<br />
$scope.reverseSort=false;<br />
//construct sorting column and reverse flag<br />
$scope.sortDate= function(column){<br />
$scope.reverseSort = ($scope.sortColumn == column) ? !$scope.reverseSort : false;<br />
$scope.sortColumn = column;<br />
}<br />
//add function to return css to show arrow beside the column name<br />
$scope.getSortClass= function(column) {<br />
if($scope.sortColumn== column) {<br />
return $scope.reverseSort ? 'arrow-down' : 'arrow-up'<br />
} else return '';<br />
}<br />
<br />
In the view now we need to define the CSS for the arrow-down and arrow-up.<br />
<th ng-click="sortDate('firstName')"> First Name <div ng-class="getSortClass('firstName')"/> </th><br />
<th ng-click="sortDate('lastName')"> Last Name <div ng-class="getSortClass('lastName')"/> </th><br />
<th ng-click="sortDate('salary')"> Salary <div ng-class="getSortClass('salary')"/> </th><br />
<th ng-click="sortDate('tax')"> Tax <div ng-class="getSortClass('tax')"/> </th><br />
<tr ng-repeat="emp in employees | orderBy:sortColumn:reverseSort"><br />
..<br />
</tr><br />
<br />
Finally in css file:<br />
th{<br />
cursor: pointer;<br />
}<br />
.arrow-up {<br />
width: 0;<br />
height: 0;<br />
border-left : 5px solid transparent;<br />
border-right : 5px solid transparent;<br />
border-bottom : 10px solid black;<br />
display: inline-block;<br />
}<br />
.arrow-down {<br />
width: 0;<br />
height: 0;<br />
border-left : 5px solid transparent;<br />
border-right : 5px solid transparent;<br />
border-top : 10px solid black;<br />
display: inline-block;<br />
}<br />
This will enable the sorting using the table headers.<br />
<br />
<b><span style="font-size: large;">Form Validations:</span></b><br />
To mandate a field: ng-required="true"<br />
For min and max we can use<br />
ng-minlength="6"<br />
ng-maxlength="10"<br />
We can also add reqular expressions using: ng-pattern<br />
ng-pattern="/^[A-z]+$/" to restrict it to alpahbets only<br />
If we have form like <form name="personalForm"> and a field like:<br />
<form name="personalForm"><br />
<div ng-show="personalForm.name.$dirty && personalForm.name.$invalid">Something went wrong! <br><br />
<span ng-show="personalForm.name.$error.required"><br />
You must enter the first name!<br><br />
</span><br />
<span ng-show="personalForm.name.$error.minlength"><br />
The name must have at least 6 characters!<br><br />
</span><br />
<span ng-show="personalForm.name.$error.maxlength"><br />
The name must have at most 10 characters!<br><br />
</span><br />
<span ng-show="personalForm.name.$error.pattern"><br />
The name must only include alphabets!<br><br />
</span><br />
</div><br />
<td> <input type="text" name="name" ng-required="true" ng-model="name" ng-minlength="6" ng-maxlength="10" ng-pattern="/^[A-z]+$/" /><br />
<input type="button" value="Submit" ng-disabled="personalForm.name.$invalid"/><br />
</form><br />
now we can use attribute to enable or disable the submit button:<br />
<input type="button" value="Submit" ng-disabled="personalForm.name.$invalid"/><br />
<br />
We can also show alert using the field attribute $invalid<br />
<div ng-show="personalForm.name.$dirty && personalForm.name.$invalid">Something went wrong! <br><br />
<br />
<br />
<b><span style="font-size: large;">Search Filter:</span></b><br />
Same concept using filter:key_word:exact_match<br />
e.g.<br />
First Name : <input type="text" ng-model="searchText.firstName" placeholder="search first name"/><br />
Last Name : <input type="text" ng-model="searchText.lastName" placeholder="search last name"/><br />
<input type="checkbox" ng-model="exactMatch"> Exact Match<br />
<br />
And in the repeat section:<br />
<tr ng-repeat="emp in employees | filter:searchText:exactMatch"><br />
<br />
<b><span style="font-size: large;">Custom Filter:</span></b><br />
To create custom filter all what we need to do is to define a filter function that return a function:<br />
myApp.filter("genderFilter",function() {<br />
return function(gender) {<br />
switch (gender) {<br />
case 1: return "Male";<br />
case 2: return "Female";<br />
default: return "N/A";<br />
}<br />
}<br />
});<br />
<br />
Now from inside the view use it as :<br />
<td> {{ emp.gender | genderFilter }} </td><br />
<br />
<br />
<b><span style="font-size: large;">AngularJS Service:</span></b><br />
To call a REST service to retireve the data, all you need is the end point and know the<br />
structure of your response data which is mostly JSON.<br />
For example if we have the following end point that retrieve all employees from the DB as a REST service with JSON structure:<br />
http://localhost:8090/ords/my_hr/my_emp/<br />
<br />
We can call it using a controller:<br />
myApp.controller("myController2",function($scope,$http){<br />
$http.get('http://localhost:8090/ords/my_hr/my_emp/')<br />
.then(function (response) {<br />
$scope.employees2 = response.data;<br />
});<br />
});<br />
We have used get HTTP method, we can use POST, DELETE, PUT, etc.<br />
Alternatively we can use the following way where we send configuration object as a parameter to the $http service:<br />
myApp.controller("myController2",function($scope,$http){<br />
$http(<br />
{<br />
url:'http://localhost:8090/ords/my_hr/my_emp/',<br />
method: 'get'<br />
})<br />
.then(function (response) {<br />
$scope.employees2 = response.data.items;<br />
});<br />
});<br />
We can also supply another function for errors:<br />
$http({<br />
url:'http://localhost:8090/ords/my_hr/my_emp/',<br />
method: 'get'})<br />
.then(function (response) {<br />
$scope.employees2 = response.data.items;<br />
$log.warn(response.data);<br />
}, function(reason){<br />
$scope.error= reason.data;<br />
$log.error(reason.data);<br />
});<br />
Where we can get the reason object of such error.<br />
We can also define these functions separately and then assign them in the then() method<br />
e.g. var function successCallBackFunction= function (response){ ... } &<br />
var function errorCallBackFunction= function (reason){ ... } &<br />
Now change then method into :<br />
.then(successCallBackFunction,errorCallBackFunction) <br />
<br />
<b>NOTE:</b> if you are using Oracle REST Data Service - ORDS you need to retireve the data using response.data.items;<br />
<br />
This will invoke the service and set the data in the scope once the response is available.<br />
In the view you can consume it as usual:<br />
<tr ng-repeat="emp in employees2"><br />
<td> {{ emp.first_name}} </td><br />
<td> {{ emp.last_name}} </td><br />
<td> {{ emp.hire_date | date:"dd/MM/yyyy"}}</td><br />
<td> {{ emp.salary}}</td><br />
<td> {{ emp.email}} </td><br />
</tr><br />
<br />
That's the simplest way to interact with REST services.<br />
<br />
<b><span style="font-size: large;">Use Logging Service:</span></b><br />
Simply we need to import the log service in controller parameters<br />
e.g. myApp.controller("myController2",function($scope,$log){<br />
<br />
and we can then use it as $log.info('message here'); or use other log messages types such as debug, warn and error. <br />
<br />
<b><span style="font-size: large;">Building Your Own Service:</span></b><br />
<br />
<br />
Service in AngularJS are JS objects that could contain atributes or functions for example $scope, $http and $log services, to build your own service you need to simply define the service and its attributes/functions so you can use it inside your application.<br />
This should promotes usability inside your application.<br />
For example we can define a new service named : service_name <br />
<br />
myApp.factory('service_name',function() {<br />
return {<br />
//the JS object here attributes and functions<br />
helloWorldFunction : function(input) {<br />
return "Hello "+input;<br />
}<br />
};<br />
}<br />
To use it in any controller, all you need is to reference your new service<br />
e.g.<br />
myApp.controller("myController2",function($scope, service_name){<br />
$scope.greeting= service_name.helloWorldFunction('Osama Oransa');<br />
}<br />
<br />
<b><span style="font-size: large;">Useuful Tutorial:</span></b><br />
One of the most useful AngularJS tutorials is the following one:<br />
<a href="https://www.youtube.com/watch?v=zKkUN-mJtPQ&list=PL6n9fhu94yhWKHkcL7RJmmXyxkuFB3KSl">https://www.youtube.com/watch?v=zKkUN-mJtPQ&list=PL6n9fhu94yhWKHkcL7RJmmXyxkuFB3KSl</a><br />
where a lot of the content in this post is based on that tutorial.<br />
<br />
<br /></div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-45700089650314664082016-02-11T01:29:00.000-08:002016-02-11T01:29:02.991-08:00Big Data & Hadoop Map Reduce<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="color: red;"><b>What is Big Data?</b></span><br />
<br />
Big data as the name suggest refer to the data with the following 3 characteristics:<br />
1- High Generation Rate i.e. High Velocity of data generation<br />
2- Big data size i.e. big Volume of data<br />
3- Many sources for the data i.e. Variety of data sources.<br />
These 3 Vs = Velocity (speed) Volume (size) Variety (sources) represents what is named the big data, such data is usually semi-structured data from different sources.<br />
<br /><span style="color: red;"><b>Apache Hadoop:</b></span><br />
Apache Hadoop is an open-source framework written in Java for distributed storage and distributed processing of very large data sets on computer clusters built.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqihV0CXSX-5G_BhmmR5eTt3EH6SsuT7mr0hJeIVThvh_c4sNeo_FJhUKqCOAvwm6p0-2aFobb8gPAhEhBU9x_LbYcLnPk77oFhkiR7p8kjD5GMWumVxMgaARga6mOqx6I8ZmOu-o7w3Hn/s1600/664px-Hadoop_logo.svg.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="82" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqihV0CXSX-5G_BhmmR5eTt3EH6SsuT7mr0hJeIVThvh_c4sNeo_FJhUKqCOAvwm6p0-2aFobb8gPAhEhBU9x_LbYcLnPk77oFhkiR7p8kjD5GMWumVxMgaARga6mOqx6I8ZmOu-o7w3Hn/s320/664px-Hadoop_logo.svg.png" width="320" /></a></div>
<br />
<br />
So we are discussing here 2 concepts in hadoop distributes storage and distributed processing. <br />
<br />
<b><u>1) Distributed Storage: </u></b><br />In Hadoop Data stored in <b>HDFS</b> : Hadoop Distributed File System where each file is splitted into blocks (default size of each block is 64MB) blk_1, blk_2, etc..<br />Each block is replicated 3 times in <b>Data Nodes</b> (for data redundancy) (this means if u have 100MB of data you'll need 300MB of storage). and if any node failed, hadoop will auto-replicate the data into another data node.<br />
The <b>Name Node</b> determines the location of different parts of each file stored in HDFS.<br />
Name node is stored usually in NFS (Network file system) for higher reliability and it runs also on active-standby node model where the standby node can take over if active node failed.<br />
<u><b>2) Distributed Processing:</b></u><br />
We have 2 concepts here; the mappers and reducers for distributed data processing.<br />- Each <b>Mapper </b>works in small set of data and produces intermediate records in a (key, value) pairs format.<br />- Data go through <b>Shuffle </b>step which move the data into reducers and <b>sort </b>them (optionally) <br />- The <b>Reducers </b>can reduce the data into format (key, values).<br />- Finally if we have multiple reducers additional step is required to merge and sort the keys to produce the final required results.<br />
<br /><b>Job Tracker</b> is responsible for splitting the work into different mappers and reducers.<br /><br />
In each data node, a <b>Task Tracker</b> exist which will usually assign the existing data block to the mapper in the same node to reduce the required network traffic but in case the current mapper is busy (for the 3 copies of the data block) the task tracker can delegate the task into a different data node mapper and stream the block into that node but this happens rarely.<br /><br /><b>Combiners</b> can do some reduction to reduce the data moved over the network.<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoSbsHDRWKFKMtDo9BDq93ODqa_KCKgDs8B1GPHSBFd4n78ps4s3DsBR4ya9XaDOQ9DJ-VUZsnPyZ3r86OpzsiO_1PMryDRsKX4VLAZNL04zc7aykjla8tN5gwamMPCtXja8ovpxzT_oKO/s1600/Hadoop_1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoSbsHDRWKFKMtDo9BDq93ODqa_KCKgDs8B1GPHSBFd4n78ps4s3DsBR4ya9XaDOQ9DJ-VUZsnPyZ3r86OpzsiO_1PMryDRsKX4VLAZNL04zc7aykjla8tN5gwamMPCtXja8ovpxzT_oKO/s320/Hadoop_1.png" width="320" /></a></div>
<br /><br /><span style="color: red;"><b> </b></span><br />
<span style="color: red;"><b>Hadoop Common Design Patterns:</b></span><br /><u><b>1) Filtering Patterns</b></u><br />e.g. Sampling or Top-N list<br /><br />Filter the records, do not change them, keep some and discard some.<br />The output is subset of the original data-set.<br /><br />Types:<br />- Simple filter e.g. function<br />- Bloom Filter<br />- Sampling Filter <br />- Random Sampling <br />- Top-n filter.<br /> Each mapper find the top-n list and the reducer produce the final top-n from these lists.<br /><br /><br /><u><b>2) Summarization Patterns</b></u><br />e.g. Counting, Min/Max, Statistics, index, etc.<br />Types: <br />- Inverted Index (reverse index for faster search)<br />- Numerical Summarization<br /> e.g. count, min/max, first/last, mean, median, average, etc.<br />Combiners are important here.<br /><br /><u><b>3) Structural Patterns</b></u><br />e.g. Combining data sets.<br />Structural to Hierarchical Pattern<br />- Moves the structured data in RDBMS into Hadoop but hierarchical<br />the data must be linked in the source using FK and must be structured in row-based.<br /><br /><u><b>4) Others such as Organization, I/O, ...etc.</b></u><br />
<br />
<br />
<br />
<br />
<br /><b><span style="color: red;">For More Details</span></b><br />
<br />
This is just a nutshell about Big Data and Hadoop Map Reduce and as of the Udacity <br />
<h3 class="h-slim">
<a data-course-title="" href="https://www.udacity.com/courses/ud617">Intro to Hadoop and MapReduce</a></h3>
<br /></div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-43385539760437632722016-01-31T11:27:00.001-08:002016-01-31T11:44:21.891-08:00NodeJS Quick Guide - Part 2<div dir="ltr" style="text-align: left;" trbidi="on">
In this part we will use the express web application to develop a sample web application.<br />
<br />
How to customize the application:<br />
<u><b>1) Change the port</b></u><br />
We can change the default port to a new port or better use the runtime arguments to set it.<br />
For example:<br />
<i><b>if (process.argv[2]!=null){<br /> var port = normalizePort(process.argv[2]);<br />} else {<br /> var port = normalizePort(process.env.PORT || '8000');<br />}<br />app.set('port', port);</b></i><br />
This will let us use the application by providing the port as an argument as following:<br />
<i><b>set DEBUG=mytestapp:* & npm start 8002</b></i><br />
<br />
<u><b>2) Add images in the images folder:</b></u><br />
Download any HR logo image and place it in the images folder.<br />
<br />
<u><b>3) Add or Edit Routes </b></u><br />
We can edit the current pages or create a new routes.<br />
Let's create header and footer pages and place all these files in the views folder<br />
<i>1) header.jade</i><i><b> </b></i><br />
<i><b><html></b></i><i><b><i><b><</b></i>head></b></i><i><b><i><b><</b></i>title>#{title}</b></i><i><b><i><b><</b></i>/title></b></i><i><b><i><b><</b></i>/head></b></i><i><b><i><b><</b></i>body></b></i><i><b><i><b><</b></i>center></b></i><i><b><i><b><</b></i>h1>#{title}</b></i><i><b><i><b><</b></i>/h1></b></i><i><b><i><b><</b></i>img src="/images/hr-logo.jpg" width=200 height=100></b></i><i><b><i><b><</b></i>hr></b></i><i><b><i><b><</b></i>br></b></i><br />
<br />
<i>2) footer.jade</i><br />
<i><b><i><b><</b></i>hr></b></i><i><b><i><b><</b></i>div> (c) Copyright 2016 </b></i><i><b><i><b><</b></i>/div></b></i><i><b><i><b><</b></i>/center></b></i><i><b><i><b><</b></i>/body></b></i><i><b><i><b><</b></i>/html></b></i><br />
<br />
Now modify <i>index.jade</i> to be as following:<br />
<i><b>include ./header.jade<br />block content<br /> h1= title<br /> p Welcome to #{title}<br />p Enter an Employee number to see his/her data</b></i><i><b><i><b><</b></i>/p></b></i><i><b><i><b><</b></i>form name='users' action='/users' method='get'></b></i><i><b><i><b><</b></i>input type='text' name='emp_num' /></b></i><i><b><i><b><</b></i>input type='submit' value='Submit' /></b></i><i><b><i><b><</b></i>/form><br />include ./footer.jade</b></i><br />
<br />
As you can see in these files, we have mixed the html tags with jade syntax e.g. <p> or p<br />
We use the format #{ ... } for variables.<br />
We have included the header and footer files using include statement.<br />
The form in index.jade submit the user inputs to the /users<br />
<br />
The <i>index.js</i> should be modified a little bit to include the correct page title:<br />
<i><b>var express = require('express');<br />var router = express.Router();<br />/* GET home page. */<br />router.get('/', function(req, res, next) {<br /> res.render('index', { title: 'HR Express' });<br />});<br />module.exports = router;</b></i><br />
<br />
Let's now edit the user.js file to capture this input field and route it into details page.<br />
<br />
<i><b>var express = require('express');<br />var router = express.Router();<br />/* GET users listing. */<br />router.get('/', function(req, res, next) {<br /> res.render('emp', { title: 'HR Express', number: req.query.emp_num, name: 'Osama Oransa', position: 'PaaS Expert' });<br />});<br />module.exports = router;</b></i><br />
<br />
You can see the query parameter is captured using <i>req.query.parameter_name</i> we have also set some variables, these variables should typically comes from the database tables.<br />
<br />
Add <i>emp.jade</i> view with the following content:<br />
<i><b>include ./header.jade<br />block content<br /> h1= title<br /> p Welcome to #{title} - Employee Details<br />p Here is the Employee Data<br />P Number : #{number}<br />P Name : #{name}<br />P Position: #{position}</b></i><i><b><i><b><</b></i>br><br />p </b></i><i><b><i><b><</b></i>a href='/'>Back</b></i><i><b><i><b><</b></i>/a><br />include ./footer.jade</b></i><br />
<br />
<u><b>4) Test the application</b></u><br />
We can now test the application by executing our command:<br />
<i><b>set DEBUG=mytestapp:* & npm start 8002</b></i><br />
<br />
In the home page enter any employee number and click submit to view the details page.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq_gcbyv4bhWUXj-fFvD4JpoTzIjhIBD_ZUeKkWD3k6u_0s1XJPlcomvEUWxlbY0VSrQ0NpS2-EGmsm58XPeOSIr4jHcRi2Q80b-8UuE0kmxg4jNtJASpXEdodMGPqbeVgSB98ew5puDU_/s1600/page.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgq_gcbyv4bhWUXj-fFvD4JpoTzIjhIBD_ZUeKkWD3k6u_0s1XJPlcomvEUWxlbY0VSrQ0NpS2-EGmsm58XPeOSIr4jHcRi2Q80b-8UuE0kmxg4jNtJASpXEdodMGPqbeVgSB98ew5puDU_/s320/page.png" width="320" /></a></div>
<br />
<br />
<br />
<u><b>5) Using Session object</b></u><br />
To use the session object we need to install the following modules: connect and cookie-session.<br />
<i><b>npm install connect<br />npm install cookie-session</b></i><br />
<br />
In <i>app.js</i> add the following to instantiate the session using cookies:<br />
<i><b>var connect = require('connect');<br />// store session state in browser cookie<br />var cookieSession = require('cookie-session');<br />app.use(cookieSession({<br /> keys: ['secret1', 'secret2']<br />}));</b></i><br />
You can change the session keys to any unique keys.<br />
Now in <i>index.js</i> modify the code to store a random guest name in the session.<br />
<i><b>var express = require('express');<br />var router = express.Router();<br />/* GET home page. */<br />router.get('/', function(req, res, next) {<br /> if(req.session.guest==null) req.session.guest='Osama '+random(1,10);<br /> res.render('index', { title: 'HR Express','guest':req.session.guest });<br />});<br />module.exports = router;<br />function random (low, high) {<br /> return Math.floor(Math.random() * (high - low + 1) + low);<br />}</b></i><br />
In <i>users.js</i> add the parameter as well to the variables:<br />
<i><b>/* GET users listing. */<br />router.get('/', function(req, res, next) {<br /> res.render('emp', { title: 'HR Express','guest':req.session.guest, number: req.query.emp_num, name: 'Osama Oransa', position: 'PaaS Expert' });<br />});</b></i><br />
<br />
Finally in the header.jade add a p for the guest name just above the image:<i><b><br /></b></i><br />
<i><b><i><b><</b></i>h1>#{title}</b></i><i><b><i><b><</b></i>/h1><br />p Welcome #{guest}</b></i><i><b><i><b><</b></i>br></b></i><br />
<br />
<u><b>6) Test the application</b></u><br />
Now test the application using 2 different browsers to see the effect of the session.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZAqRXkIUjZvGVWd8JJMEpakiocWpsBJy8yz4S2FBZkDYR8NMbSluUt6unBVHtKw9Bl_xi2iQTFpOqUyc22AlQ9tqWC0yUDWCKxsLncZHVq29FUB-qzlOUTuGuN5pQzZZS3iFwkFBiG_Iu/s1600/page2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZAqRXkIUjZvGVWd8JJMEpakiocWpsBJy8yz4S2FBZkDYR8NMbSluUt6unBVHtKw9Bl_xi2iQTFpOqUyc22AlQ9tqWC0yUDWCKxsLncZHVq29FUB-qzlOUTuGuN5pQzZZS3iFwkFBiG_Iu/s320/page2.png" width="320" /></a></div>
You can see the guest name is now below the title, test using different browsers.<br />
<br />
<u><b>7) Connect to the DB</b></u><br />
Now to connect the database we have many options, we can connect on SQL or NO-SQL database for example to use Oracle Database you need to modify the code to query the database.<br />
Oracle provides a DB driver for NodeJS can be found in the following URL:<br />
<a href="https://www.npmjs.com/package/oracledb">https://www.npmjs.com/package/oracledb</a><br />
To Install it, you'll need the following steps:<br />
<b>Prerequisites</b>:<br />
- Python 2.7<br />
- C Compiler with support for C++ 11 (Xcode, gcc, Visual Studio or similar)<br />
- The small, free Oracle Instant Client libraries if your database is remote. Or use a locally installed database such as the free Oracle XE release<br />
- Set OCI_LIB_DIR and OCI_INC_DIR during installation if the Oracle libraries and headers are in a non-default location<br />
<b>Installation:</b><br />
Run:<br />
<i><b>npm install oracledb </b></i><br />
This will install it from the NPM registry.<br />
<br />
Let's now modify the code to get the employee details from the DB (Oracle HR sample schema) as following:<br />
<br />
<i><b>var oracledb = require('oracledb'); <br />oracledb.getConnection(<br /> {<br /> user : "hr",<br /> password : "hr",<br /> connectString : "localhost/XE"<br /> },<br /> function(err, connection)<br /> {<br /> if (err) { console.error(err.message); return; }<br /> connection.execute(<br /> "Sselect first_name||' '||last_name name, job_title "+<br /> " FROM employees,jobs"+<br /> " WHERE employees.job_id=jobs.job_id"+<br /> " and employee_id = :id ",<br /> [110], // bind value for :id </b></i><br />
<i><b>{outFormat<span class="pl-k">:</span> <span class="pl-smi">oracledb</span>.<span class="pl-c1">OBJECT</span>}, <span class="pl-c">// outFormat can be OBJECT or ARRAY. The default is ARRAY</span></b></i><br />
<i><b><span class="pl-c"> </span> function(err, result)<br /> {<br /> if (err) { console.error(err.message); return; }<br /> console.log(result.rows);<br /> });<br /> });</b></i><br />
We need to replace the [110] with our employee parameter: req.query.emp_num, <br />
And pass the result into our emp.jade page to render the employee details.<br />
result[0].name & result[0].job_title<br />
We need also to route the errors into error pages.<br />
You can see here a lot of examples of how to use Oracle driver:<br />
<a href="https://github.com/oracle/node-oracledb/tree/master/examples">https://github.com/oracle/node-oracledb/tree/master/examples</a><br />
<br />
This is a simple application to show us how to use some of the NodeJS features in nutshell.</div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-87518642130122524692016-01-31T11:07:00.002-08:002016-02-01T08:21:38.959-08:00NodeJS Quick Guide - Part 1<div dir="ltr" style="text-align: left;" trbidi="on">
NodeJS developed by Ryan Dahl in 2009 which runs using Chrome JavaScript engine plus some libraries for asynchronous network and I/O modules. <br />
It targets building high performance and scalable server and client applications. Node.js uses Just-in-Time compilation with the V8 JavaScript Engine.<br />
<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkPG-kgZrfj5xxvdjq2R-NAP3Bj6-XR1T0aaE2RfoDSCVd1EAZyFlgRYAbOpMKO5k6jZif6Gv9y3S50QcFj7AcXHA29lYoOTp57EtVBInhsIC8fJMySYhBK-6SmgYqkUtR0mPCrznScdzx/s1600/nodejs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkPG-kgZrfj5xxvdjq2R-NAP3Bj6-XR1T0aaE2RfoDSCVd1EAZyFlgRYAbOpMKO5k6jZif6Gv9y3S50QcFj7AcXHA29lYoOTp57EtVBInhsIC8fJMySYhBK-6SmgYqkUtR0mPCrznScdzx/s320/nodejs.png" width="320" /></a></div>
<br />
<u><b>1) Installing NodeJS</b></u><br />
The quickest and easiest way is to install it from the nodejs.org web site.<br />
<a href="https://nodejs.org/en/download/">https://nodejs.org/en/download/</a><br />
<br />
Once installed from the command line you can write node or npm to ensure everything is fine.<br />
<br />
<u><b>2) NodeJS</b></u><br />
Uses the java script language where you can write loosely typed event based asynchronous code.<br />
Loosely typed: means the variable types can be determined at runtime not compilation time as in Java which gives power but could lead to potential errors as you already lost the compiler error scanning.<br />
Event-based: means you need to fire action and wait for the response/output in a function that process this output so instead of waiting the DB operation to finish fire the query and wait the response in a function, this unlike the thread based languages such as Java where you need to wait for the response , the gain is nullifying the context switching and simplify the code, which gives higher performance in throughput of the application.<br />
So every function that requests IO has a signature like function (... parameters ..., callback) and needs to be given a callback that will be invoked when the requested operation is completed i.e. Continuation-passing style.<br />
<br />
Note that Node is not suitable for high computation operations and it needs good design to process such operations without impacting the application.<br />
In spite NodeJS is a single threaded, and the potential feature for fork child-processes or threads is rolled back, some modules provide a way to run some threads for high computation consuming operations one example is Threads a gogo<br />
<a href="https://github.com/xk/node-threads-a-gogo">https://github.com/xk/node-threads-a-gogo</a><br />
<br />
<u><b>3) NodeJS Modules:</b></u><br />
Node is based on modules which is similar concept to packages in Java, the modules are used by the statement:<br />
<b><i>var http = require('http');</i></b> ==> This means the http variable will be used to access the exposed functions in the http module.<br />
The http module as an example here can expose different functions now by the following statement: exports.function_name e.g. :<br />
<i><b>exports.stop = function(){<br />console.log('Inside the stop function');<br />}</b></i><br />
<br />
One of the big issues in JavaSciprt is the global variables, using the modules and exports you can control what you need to expose and any global variable is now considered local to that module and won't interfere with any similar name variable in your application.<br />
<br />
To install modules that you need in your application, you need to use npm where you specify if you need to install the module for your application or globally for all applications by using:<br />
<br />
<i><b>npm install -g express</b></i> ==> this will install express a web application framework based on the open source connect project.<br />
if you omit <i><b>-g</b></i> you will install the packages locally for your application.<br />
The modules are loaded into the <i><b>node_modules</b></i> folder either in your application or globally.<br />
<br />
<u><b>4) Running a hello world application</b></u><br />
The following sample application uses the http module to start a server:<br />
<i><b>var http = require('http');<br />exports.start = function(){<br />server=http.createServer(function (req, res) {<br />res.writeHead(200, {'Content-Type': 'text/plain'});<br />res.end('Hello, World!\n');<br />}).listen(8082, '127.0.0.1');<br />console.log('Server is now running: http://127.0.0.1:8082');<br />}</b></i><br />
Save it into a file name; app.js<br />
now run node<br />
<i><b>> node<br />> var app=require('./app');<br />> app.start();</b></i><br />
Server is now running: http://127.0.0.1:8082<br />
<br />
Open the browser on the port 8082 using <i>localhost:8082</i> you can see hello world message is printed out.<br />
In our application we have exported start(); function() and from the node interpreter we have loaded our application module and executed this exposed start() function.<br />
Our application uses the http module to run the http server.<br />
You can run wrap it in another application <br />
<i><b>var app = require('./app');<br />app.start();</b></i><br />
Save it as <i>app-runner.js</i> and now run it using:<br />
<i><b>node app-runner</b></i><br />
<br />
another way is to use the <b>package.json</b> file which describes your application and dependencies<br />
create the file <i>package.json</i> and add the following JSON content:<br />
<i><b>{ "name": "AppRunner",<br /> "version": "1.0.0",<br /> "scripts": {<br /> "start": "node ./app-runner"<br /> },<br /> "dependencies": { <br /> }<br />}</b></i><br />
NOTE: to create the file you can execute <code><b><i>npm init</i></b></code> to create this <code>package.json</code> file.<br />
It simply shows the application name, version, start script and any dependencies should be added to that section. <br />
Now we can run the application using the command <br />
<i><b>npm start</b></i> ==> which will search for that file and run the start command.<br />
also <i><b>npm install</b></i> ==> will install all the required modules in the dependencies section in the local application directory.<br />
Finally <i><b>npm list</b></i> shows the installed modules for this application. <br />
<br />
<u><b>5) Using express web application framework</b></u><br />
Express is a Web Application Framework for node:<br />
<a href="http://expressjs.com/en/starter/generator.html">http://expressjs.com/en/starter/generator.html</a><br />
- Install express and express-generator<br />
<i><b>npm install express -g</b></i><br />
<i><b>npm install express-generator -g</b></i><br />
<br />
Now use it to create a sample web application <br />
<i><b>express mytestapp</b></i> ==> This will generate the web application framework in the mytestapp folder<br />
<i><b>cd mytestapp</b></i> ==> you can see the main application app.js and package.json where you need to add any future dependencies.<br />
<i><b>npm install</b></i> ==> to install all required modules locally.<br />
<i><b>set DEBUG=mytestapp:* & npm start</b></i> ==> in windows to start the application server <br />
Test the application in the browser using <i>localhost:3000</i> <br />
<br />
The following contains the APIs Guide for using Express:<br />
<a href="http://expressjs.com/en/4x/api.html">http://expressjs.com/en/4x/api.html</a><br />
<br />
The generated sample application contain the following main components:<br />
<br />
<u>1) Package.json file </u><br />
In that file we can see the start script is <br />
<i><b>"scripts": {<br /> "start": "node ./bin/www"<br /> },</b></i><br />
If we opened this file /bin/www , we can see that it uses the app.js, do the port configurations and the initialization of http server, which means if environment variable PORT is set, use it otherwise use the port 3000.<br />
<b><i>var port = normalizePort(process.env.PORT || '3000');<br />app.set('port', port);</i></b><br />
We can change this port 3000 into any port e.g. 8082<br />
<br />
<u>2) View folder for views</u><br />
We can add our views/pages here.<br />
<i><b>app.set('views', path.join(__dirname, 'views'));</b></i><br />
The view engine to parse the views is specified as:<br />
<i><b>app.set('view engine', 'ejs');</b></i><br />
or <br />
<i><b>app.set('view engine', 'jade');</b></i><br />
You can use both options to build your view files.<br />
Here is a quick guide for jade: <a href="http://jade-lang.com/reference/plain-text/">http://jade-lang.com/reference/plain-text/</a><br />
And here is a quick guide for ejs: <a href="http://www.embeddedjs.com/getting_started.html">http://www.embeddedjs.com/getting_started.html</a><br />
<br />
<u>3) Public folder for static contents:</u><br />
This folder for storing the images, stylesheets and client side java script files.<br />
<br />
<u>4) Router to router the requests.</u><br />
<i><b>var routes = require('./routes/index');<br />var users = require('./routes/users');<br />app.use('/', routes);<br />app.use('/users', users);</b></i><br />
one is <i>index.js</i> for the / path which is placed in the routes folder and another one is <i>users.js</i> for the path /users and is placed as well in routes folder.<br />
You can replace content in both files to see the impact of opening both URLs <a href="http://127.0.0.1:8000/users">http://127.0.0.1:8000/users</a> and <a href="http://127.0.0.1:8000/">http://127.0.0.1:8000/</a><br />
<br />
In part II, we will continue the application exploration by adding different pages and using parameters, forms, sessions and access the database to retrieve data.<br />
<br /></div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-6366304822214328672016-01-27T11:30:00.002-08:002016-01-27T11:30:32.309-08:00App Engine's Datastore<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
App Engine's datastore is built on top of Bigtable. To use App Engine we need to create account using our gmail, create identifier/key for our application and finally create our application in Eclipse.<br />
You can install Google App Engine Plugin in any Eclipse e.g. in Luna use the following URL: https://dl.google.com/eclipse/plugin/4.4<br />
<br />
This represents all Google tools, select the App Engine tools.<br />
<br />
To use Google datastore from inside our Java code we can use one of the following three methods:<br />
<h2 style="text-align: left;">
A) Using Java Data Objects (JDO) </h2>
JDO is a standard interface for accessing databases in Java, providing a mapping between Java classes and database tables.<br />
Let's explore how to use JDO to access datastore:<br />
We can follow the following simple steps:<br />
<br />
<b>1) Create the Entity Class(es) :</b><br />
@PersistenceCapable(identityType=IdentityType.APPLICATION)<br />
public class PersonLocation implements Serializable {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private static final long serialVersionUID = 1L;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@PrimaryKey<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public Long id;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Persistent<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public int personId;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Persistent<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public double lat;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Persistent<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public double lon;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Persistent<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public double accuracy;<br />
+ settings, getters and constructors.<br />
<br />
<b>2) Get the persistent manager factory:</b><br />
<br />
PersistenceManagerFactory pmfInstance = JDOHelper<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.getPersistenceManagerFactory("transactions-optional");<br />
<br />
<b>3) Get PersistenceManager from the factory and use it for CRUD operations:</b><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>PersistenceManager pm = pmfInstance.getPersistenceManager();<br />
<br />
<b>4) Create Entity :</b><br />
Create an object from the entity and persist it.<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>PersonLocation location = null;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location=new PersonLocation();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setPersonId(entityId);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setLat(lat);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setLon(lon);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setAccuracy(accuracy);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.makePersistent(location);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>System.out.println("id="+location.getId());<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} finally {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.close();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
Once the entity persistent you can get the id.<br />
<br />
<b>5) Get Entity:</b><br />
Either use the getObjectById as in the previous methods or execute datastore query to retireve the requied data.<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location = pm.getObjectById(PersonLocation.class, id);<br />
<br />
Or use the Query object, the query retrieves all entities of the given kind that satisfy all of the given filters, sorted in the specified order.<br />
public List<personlocation> getAllLocationsForEntity(int entityId){</personlocation><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>PersistenceManager pm = pmfInstance.getPersistenceManager();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>String queryStr = "select from " + PersonLocation.class.getName();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Query selectQuery=pm.newQuery(queryStr);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>selectQuery.setFilter("personId=="+entityId);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return (List<personlocation>) selectQuery.execute();<span class="Apple-tab-span" style="white-space: pre;"> </span></personlocation><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<b>6) Update Entity: </b><br />
Get the entity, update the entity and persist the updates.<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.currentTransaction().begin();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// We do lookup for the required id<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location = pm.getObjectById(PersonLocation.class, id);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setPersonId(entityId);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setLat(lat);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setLon(lon);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setAccuracy(accuracy);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.makePersistent(location);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.currentTransaction().commit();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (Exception ex) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.currentTransaction().rollback();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>throw new RuntimeException(ex);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} finally {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.close();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<br />
<br />
<b>7) Delete Entity: </b><br />
Get the entity and delete it.<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.currentTransaction().begin();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// We do lookup for the required id<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location = pm.getObjectById(PersonLocation.class, id);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.deletePersistent(location);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.currentTransaction().commit();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (Exception ex) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.currentTransaction().rollback();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>throw new RuntimeException(ex);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} finally {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.close();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<br />
<br />
<h2 style="text-align: left;">
B) Using JPA</h2>
Similarly to using JPA:<br />
<b>1) In persistence.xml</b><br />
<provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider><br />
<b>2) Get the EntityManagerFactory:</b><br />
private static final EntityManagerFactory emfInstance =<br />
Persistence.createEntityManagerFactory("transactions-optional");<br />
<b>3) Get the EntityManager from the EntityManagerFactory:</b><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>EntityManager em = emfInstance.createEntityManager();<br />
<b>4) Annotate your entity:</b><br />
@Entity<br />
public class Employee {<br />
@Id<br />
@GeneratedValue(strategy = GenerationType.IDENTITY)<br />
private Key key;<br />
private String firstName;<br />
private String lastName;}<br />
... setters, getters and constructors<br />
}<br />
<b>5) Use the entity manager to do the JPA CRUD operations. </b><br />
<br />
<h2 style="text-align: left;">
C) Using the low-level Datastore API, or one of the open-source APIs developed specifically for Datastore, such as Objectify. </h2>
This is recommended by Google as JDO and JPA was designed for use with traditional relational databases, and so has no way to explicitly represent some of the aspects of Datastore that make it different from relational databases, such as entity groups and ancestor queries. This can lead to subtle issues that are difficult to understand and fix.<br />
https://github.com/objectify/objectify<br />
<br />
Sample Code:<br />
@Entity<br />
class Car {<br />
@Id String vin; // Can be Long, long, or String<br />
String color;<br />
}<br />
<br />
ofy().save().entity(new Car("123123", "red")).now();<br />
Car c = ofy().load().type(Car.class).id("123123").now();<br />
ofy().delete().entity(c);<br />
<br /></div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-8717080637617419112015-12-13T02:01:00.000-08:002015-12-13T02:01:50.643-08:00Simplified Guide To Use MongoDB<div dir="ltr" style="text-align: left;" trbidi="on">
MongoDB is one of the No-SQL database engines, it is Document Oriented Database.<br />
Documents can represent any structure that can fit JSON format so for example the following is a car document : <br /><b>{<br /> "_id" : 6,<br /> "Car" : "BMW",<br /> "Model" : "S5",<br /> "Price" : 3455,<br /> "Color" : "Blue",<br /> "Date" : "09/10/2015",<br /> "Full Options" : "YES",<br /> "Level" : 1<br />}</b><br />
<br />
Simplified Steps to use MongoDB:<br />
<h2 style="text-align: left;">
<u><b>1) Install the database locally...</b></u></h2>
Download it and install it.<br />
From the command line execute: mongod and specify the location of the database files (any valid path so it can be used for storing database files).<br />
<b>mongod --dbpath c:\MongoDB\Database</b><br />
All database command lines exist in the bin folder under Server directory.<br />
<br />
<h2 style="text-align: left;">
<u><b>2) Create any test data ..</b></u></h2>
You can create .csv file or .json file the simplest and quickest way is to use .csv file.<br />
For example:<br />
<b>_id,Car,Model,Price,Color,Date,Full Options,Level<br />1,Mercedes,E-Class,12121,Red,12/12/2015,YES,1<br />2,Renault,Note,1223,Blue,09/09/2014,NO,2<br />3,Daihatsu,Terios,2333,Gray,10/10/2010,NO,2<br />4,BMW,S3,3988,Black,05/10/2008,YES,1</b><br />
<br />
As you can see the _id is the primary key in MongoDB (if you didn't specify it, MongoDB will generate it for these entries.<br />
<br />
<h2 style="text-align: left;">
<u><b>3) Import test data</b></u></h2>
From the command line run the following commands:<br />
<b>mongoimport -d catalog -c cars --file cars.csv --type csv --headerline</b><br />
This will import our file into Catalog database (similar to Schema in SQL DB) in a collection named cars (similar to DB table in SQL DB) <br />
Note: if you import json file you don't need to specify the --type or --headline<br />
<br />
<h2 style="text-align: left;">
<u><b> 4) Manipulate MongoDB data </b></u></h2>
Execute <b>mongo </b>from the command line ...<br />
The default will connect to the localhost running instance ...<br />
To connect to our database (schema) that we have created for cars, execute:<br />
<b> use catalog</b><br />
Now we can see all existing collections i.e. tables by executing:<br />
<b> show collections</b><br />
which will display only "cars" collection.<br />
To deal with "cars" we can use the following:<br />
<b> db.cars.count() </b><br />
To retrieve the count of the rows in this collection.<br />
<b> db.cars.find()</b><br />
To select all cars records <br />
<b>db.cars.find({"Level":1,"Color":"Black"})</b><br />
To select cars with level 1 and color is black.<br />
<b> db.cars.find({"Price":{$gt:2000}})</b><br />
To select cars with price more than 2000.<br />
<b>db.cars.find({"Price":{$lte:3000},"Color":/l/}).pretty()</b><br />
To select cars with price less than 3000 and color contain a "l" letter inside and then format it in JSON readable format.<br />
<b> db.cars.find({"Price":{$gte:1000}}).sort({"Price":1}).skip(1).limit(2).pretty()</b><br />
To select all cars with price more than or equal 1000 and sort the return by price ascending and limit the output to 2 only after skip the 1st results (we can use -1 to sort the result descending).<br />
Note: You can use <b>findOne()</b> instead of find() to return the 1st match only. <br />
To insert a new record :<br />
<b>db.cars.insert({ "_id" : 6, "Car" : "BMW", "Model" : "S5", "Price" : 3455, "Color" : "Blue", "Date" : "09/10/2015", "Full Options" : "YES", "Level" : 1 })</b><br />
To update the price of this inserted record we can use:<br />
<b>db.cars.update({_id:6},{$set:{"Price":5432}})</b><br />
To delete a row in the collection use:<br />
<b>db.cars.remove({"_id":5})</b><br />
To drop the whole collection: (don't execute it now)<br />
<b>db.cars.drop()</b>To analyze a query performance we can execute explain plan as following:<br />
<b>db.cars.find({"Color":"Red"}).explain()</b><br />We can create index to speed up the query by the following:<br />
<b>db.cars.ensureIndex({"Color":1}) </b><br />
This means we will create index for the Color field in ascending manner.<br />
Re-execute: <b>db.cars.find({"Color":"Red"}).explain()</b> to see the effect of this index.<br />
<br />
<h2 style="text-align: left;">
<u><b>5) Use MongoDB from inside Java Code</b></u></h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIFn1_3pkozNYlCmJMPewVJb5liLqV-HWlxQCIP9GOTYANu94E2W80fIpq-mX6xWJRnEdzHQoG3ihybQEbu1mAnnfpUziblAQ7PfoISxUIvtRuOCjrwXcmLlEuSV-orgDTXQZJd0mchw-Y/s1600/mongodb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="114" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIFn1_3pkozNYlCmJMPewVJb5liLqV-HWlxQCIP9GOTYANu94E2W80fIpq-mX6xWJRnEdzHQoG3ihybQEbu1mAnnfpUziblAQ7PfoISxUIvtRuOCjrwXcmLlEuSV-orgDTXQZJd0mchw-Y/s320/mongodb.png" width="320" /></a></div>
<br />
1- Add Mongo required drivers to your project classpath ...<br />
- mongodb-driver-3.0.4.jar<br />
- mongodb-driver-core-3.0.4.jar<br />
- bson-3.0.4.jar<br />
<br />
2- Write your code to connect to the Database as following:<br />
<b>MongoClient mongoClient = new MongoClient();</b><br />
This connect to a local running mongoDB on a default a port.<br />
<b>MongoDatabase db = mongoClient.getDatabase("catalog");</b><br />
This connect to our catalog database.<br />
<b>FindIterable<document> iterable = db.getCollection("cars").<br /> find(new Document("Level", 1)).<br /> sort(Sorts.ascending("Price"));<br /> iterable.forEach(new Block<document>() {<br /> @Override<br /> public void apply(final Document document) {<br /> System.out.println(document);<br /> }<br /> });</document></document></b><br />
This query our cars collection for Cars with level 1 and sort them ascending by Price, iterate over the output and print each Document (i.e. JSON string).<br />
To insert an entry use the same way:<br />
<b>String json = "{ \"_id\" : 5, \"Car\" : \"Kia\", \"Model\" : \"Picanto\", \"Price\" : 777, \"Color\" : \"Blue\", \"Date\" : \"09/09/2011\", \"Full Options\" : \"NO\", \"Level\" : 3 }";</b><br />
<b>db.getCollection("cars").insertOne(Document.parse(json));</b><br />
<br />
You can convert Bean objects into JSON and vice versa using any existing APIs..<br />
<br />
This is simplified overview that covers most of MongoDB in nutshell and let you master how to deal with this database in just 5 minutes.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-89173599109105710782014-12-23T02:42:00.000-08:002014-12-23T02:42:05.531-08:00Time To Plan For Your Next Year<div dir="ltr" style="text-align: left;" trbidi="on">
As the new year is approaching it is the best time these days to look forward to your next year technical plan, now if you don't have a mentor please try to find a mentor for yourself.<br />
Next thing you need to do is to decide which technical topic you want to learn, putting in your mind that in the technical field "Knowledge is our Future" ...<br />
One of the worth mentioning offers here is Packt Pub campaign where they offer eBooks and videos for just 5$ so this is your chance to get the latest technology books and plan for your next year well.<br />
<br />
Here is the press release I received from Packt Pub:<br />
<br />
<b style="text-align: justify;"><span lang="EN-IN" style="font-family: Calibri, sans-serif; font-size: 24pt;">Packt’s $5 eBonanza returns</span></b><br />
<div style="margin-bottom: 10.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; text-align: justify;">
<span style="font-family: Calibri, sans-serif; font-size: 11.5pt;"><br /></span></div>
<div style="margin-bottom: 10.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; text-align: justify;">
<span style="font-family: Calibri, sans-serif; font-size: 11.5pt;">Following the success of last year’s
festive offer, Packt Publishing will be celebrating the holiday season with an
even bigger $5 offer. </span></div>
<div style="margin-bottom: 10.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; text-align: justify;">
<span lang="EN-IN" style="font-family: Calibri, sans-serif; font-size: 11.5pt;">From Thursday 18</span><sup><span lang="EN-IN" style="font-family: Calibri, sans-serif; font-size: 7pt;">th</span></sup><span lang="EN-IN" style="font-family: Calibri, sans-serif; font-size: 11.5pt;"> December, every eBook and
video will be available on the publisher’s website for just $5. Customers are
invited to purchase as many as they like before the offer ends on Tuesday
January 6</span><sup><span lang="EN-IN" style="font-family: Calibri, sans-serif; font-size: 7pt;">th</span></sup><span lang="EN-IN" style="font-family: Calibri, sans-serif; font-size: 11.5pt;">, making it the perfect
opportunity to try something new or to take your skills to the next level as
2015 begins. </span></div>
<div style="margin-bottom: 10.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; text-align: justify;">
<span lang="EN-IN" style="font-family: Calibri, sans-serif; font-size: 11.5pt;">With all $5 products available in a range
of formats and DRM-free, customers will find great value content delivered
exactly how they want it across Packt’s website this Xmas and New Year.</span></div>
<div style="margin-bottom: 10.0pt; margin-left: 0in; margin-right: 0in; margin-top: 0in; text-align: justify;">
<span lang="EN-IN" style="font-family: Calibri, sans-serif; font-size: 11.5pt;">Find out <a href="https://www.blogger.com/null" name="_GoBack"></a>more at </span><span lang="EN-IN">- </span><a class="ecxmoz-txt-link-freetext" href="http://bit.ly/1wlsbea" style="background-color: white; color: blue; cursor: pointer; font-family: Calibri, sans-serif; font-size: 15px; line-height: 21.2999992370605px; text-align: left;" target="_blank">http://bit.ly/1wlsbea</a></div>
</div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-84619299921197867302014-08-13T05:17:00.002-07:002014-08-13T05:17:55.449-07:00Android HTML 5 Parameter Passing Between Pages<div dir="ltr" style="text-align: left;" trbidi="on">
Developing HTML 5 mobile application for Android is straightforward as we see before, one of the challenges in developing mobile applications using HTML 5 is passing parameters between pages, the main reason for that is some bugs that exist in some Android versions, let's see the possible ways to overcome this issue:<br />
<br />
<b>1) Using URL Parameters</b><br />
<b><br /></b>
In that case while you are routing your screen to another screen add the required parameters to the page URL.<br />
For example:<br />
self.location='itemDetails.html?id=115&type=Y';<br />
In that example we have passed 2 parameters; "id" and "type" with the corresponding values.<br />
This way fail due to Android bug and will mostly show "Page not found!" as it will search for the page that match the whole URL !<br />
<br />
<b>2) Using localStorage</b><br />
<br />
In that way submitting the page will save the selected parameters into localStorage and the target page will reload these parameters in its onLoad() method.<br />
For example:<br />
< img src="images/index/84.png" onClick="goDetails(84)"><br />
<br />
function goDetails(itemId){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>localStorage.setItem("itemId",itemId);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>self.location='itemDetails.html';<br />
}<br />
<br />
In the target page, load the stored value:<br />
<br />
< body onload="init();"><br />
<br />
function init(){<br />
itemId=localStorage.getItem("itemId");<br />
//do any required logic here ...<br />
}<br />
<br />
<b>3) Using Android JavaScriptInterface</b><br />
<br />
In this way we will use the Android code to store the selected parameters as instance variables so we can retrieve them from the target page.<br />
<br />
For example:<br />
function goDetails(itemId){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Android.setCurrentId(itemId);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>self.location='itemDetails.html';<br />
}<br />
function init(){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>itemId=Android.getCurrentId();<br />
<div>
}</div>
And in your Activity add the following JavaScriptInterface methods:<br />
<br />
public class MyJavascriptInterface {<br />
Context mContext;<br />
String id="114";<br />
MyJavascriptInterface(Context c) {<br />
mContext = c;<br />
}<br />
@android.webkit.JavascriptInterface<br />
public String getCurrentId() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return id;<br />
}<br />
@android.webkit.JavascriptInterface<br />
public void setCurrentId(String current) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>id= current;<br />
}<br />
<div>
....</div>
}<br />
<br />
We used the "String id" to store the value..<br />
<br />
And add it in the WebView we add our JavaScriptInterface with the prefix as following:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>webView.addJavascriptInterface(new MyJavascriptInterface(this), "Android");<br />
<br />
<br /></div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-44506666505396954802014-07-18T05:57:00.000-07:002014-07-18T05:57:07.733-07:00JPA 2.1 Performance Tuning Tips<div dir="ltr" style="text-align: left;" trbidi="on">
Here is some performance tuning tips while dealing with JPA 2.1.<br />
<br />
<br />
<iframe src="//www.slideshare.net/slideshow/embed_code/37124186" width="476" height="400" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
<br><br>
To get more details about Java EE 7 performance tuning, check my book at the following URL: <a href="http://www.packtpub.com/java-ee-7-performance-tuning-and- optimization/book">http://www.packtpub.com/java-ee-7-performance-tuning-and- optimization/book</a>
<br /></div>Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com2tag:blogger.com,1999:blog-4604699843198276393.post-63690782851305850052014-07-02T01:38:00.003-07:002014-07-09T15:41:31.135-07:00Win "Java EE 7 Performance Tuning and Optimization" Book - CLOSED<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://dgdsbygo8mp3h.cloudfront.net/sites/default/files/imagecache/productview_larger/6428EN_cov.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://dgdsbygo8mp3h.cloudfront.net/sites/default/files/imagecache/productview_larger/6428EN_cov.jpg" /></a></div>
<b><u><span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;"><br /></span></u></b>
<b><u><span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;"><br /></span></u></b>
<b><u><span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;">Book
Give-away:<o:p></o:p></span></u></b></div>
<div class="MsoNormal">
<span style="font-family: Calibri, sans-serif;"><br /></span></div>
<div class="MsoNormal">
<span style="font-family: Calibri, sans-serif;">Hold a chance to win free copy of the <b>Java EE 7 Performance Tuning and Optimization</b></span><a href="http://www.packtpub.com/learning-powercli/book"></a><span style="font-family: Calibri, sans-serif;">, just
by commenting about the book with the link - <a href="http://www.packtpub.com/java-ee-7-performance-tuning-and-optimization/book">http://www.packtpub.com/java-ee-7-performance-tuning-and-optimization/book</a>!</span></div>
<div class="MsoNormal">
<span style="font-family: Calibri, sans-serif;"><br /></span>
<span style="font-family: Calibri, sans-serif;">For the contest we have 5 e-copies each of the book <b>Java
EE 7 Performance Tuning and Optimization</b>, to be given away to 5 lucky
winners.</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><u><span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;">How you can win:<o:p></o:p></span></u></b></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;">To win your copy of this book, all you need to do is come up with a
comment below:</span><br />
<span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;">1) Highlighting the reason <b><i>"why you would like to win this book” </i></b></span><br />
<span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;">2) Add the link of the book<i> - </i><b><a href="http://www.packtpub.com/java-ee-7-performance-tuning-and-optimization/book">http://www.packtpub.com/java-ee-7-performance-tuning-and-optimization/book</a></b><o:p></o:p></span><br />
<span style="font-family: Calibri, sans-serif;">3) Adding a book tweet link or social media post in the comment will increase the chance to win the book.</span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;">Note – To win, you must follow the previous 3 steps.<o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><u><span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;">Duration of the contest & selection of
winners:<o:p></o:p></span></u></b></div>
<br />
<div class="MsoNormal">
<span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;">The contest is valid for 1 week, and is open to everyone. Winners will
be selected on the basis of their comment posted.<o:p></o:p></span><br />
<span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;">We will announce the winners in this post and ask them to provide their contact email addresses.</span><br />
<span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOpuC2euZQ5puXcnVSEeVVmp4Z75TyE-8ccPowDSdEzYrLKZBqoH3WLc53A_pPRQ6PS3rbbXXctmuuK6KR6zVBjuuXcUMPjlj-d18fZxdkIIHmZtw2nuH1mDffXqVBvnPdHAvKTKaJK0Yq/s1600/6428EN_mockupcover_nor_0.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOpuC2euZQ5puXcnVSEeVVmp4Z75TyE-8ccPowDSdEzYrLKZBqoH3WLc53A_pPRQ6PS3rbbXXctmuuK6KR6zVBjuuXcUMPjlj-d18fZxdkIIHmZtw2nuH1mDffXqVBvnPdHAvKTKaJK0Yq/s1600/6428EN_mockupcover_nor_0.jpg" height="320" width="259" /></a></div>
<span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;"><br /></span>
<span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;"><br /></span><span style="font-family: "Calibri","sans-serif"; mso-bidi-font-family: Calibri;">NOW the winners are listed below in the comments, please send me your emails, good luck for others.</span></div>
</div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com11tag:blogger.com,1999:blog-4604699843198276393.post-79399652516530063522014-07-01T03:51:00.001-07:002014-07-01T03:51:51.809-07:00Using JPA with Google App Engine Object Store<div dir="ltr" style="text-align: left;" trbidi="on">
We can use JPA while dealing with Object Store in Google App Engine, this abstracts the interaction with object store.<br />
Because both Object store and JPA are object-based there is good matching between both technologies.<br />
Here is the simple steps we need to follow:<br />
<br />
<b>1) Create the JPA beans</b><br />
- Including annotation<br />
- Define primary key<br />
- Setters/Getters for fields.<br />
Here is an example of using Locate object as JPA bean:<br />
@PersistenceCapable(identityType=IdentityType.DATASTORE)<br />
public class Location implements Serializable {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>private static final long serialVersionUID = 1L;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@PrimaryKey<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public Long id;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Persistent<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public int entityId;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Persistent<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public double lat;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Persistent<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public double lon;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Persistent<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public double accuracy;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>@Persistent<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public long time;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public Location(){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public Long getId() {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return id;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public void setId(Long id) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>this.id = id;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
...<br />
... //getters and setters<br />
}<br />
<br />
We used auto-generation primary key strategy here.<br />
<br />
<b>2) Create session facade or abstraction layer or DAO object to interact with this bean</b><br />
<b><br /></b>
public class LocationDAO {<br />
}<br />
<br />
<b>3) Define PersistenceManagerFactory object</b><br />
<br />
private static final PersistenceManagerFactory persistenceFactory = JDOHelper<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>.getPersistenceManagerFactory("transactions-optional");<br />
<br />
<br />
<b>4) Get PersistenceManager object to use for JPA interactions</b><br />
<b><br /></b>
<span class="Apple-tab-span" style="white-space: pre;"> </span>PersistenceManager pm = pmfInstance.getPersistenceManager();<br />
<br />
<br />
<b>5) Example for ADD/CREATE operation</b><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public Location addLocation(int entityId, double lat, double lon, double accuracy,long time){<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Location location = null;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>PersistenceManager pm = persistenceFactory.getPersistenceManager();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location=new Location();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setEntityId(entityId);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setLat(lat);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setLon(lon);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setAccuracy(accuracy);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setTime(time);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.makePersistent(location);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} finally {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.close();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return location;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<div>
<br /></div>
<div>
<b>6) Example for DELETE operation</b></div>
<div>
<b><br /></b></div>
<div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>public void removeLocation(Location location) {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>PersistenceManager pm = persistenceFactory.getPersistenceManager();</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.currentTransaction().begin();</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>location = pm.getObjectById(Location.class, location.getId());</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.deletePersistent(location);</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.currentTransaction().commit();</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (Exception ex) {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.currentTransaction().rollback();</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>throw new RuntimeException(ex);</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>} finally {</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.close();</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span>}</div>
</div>
<br />
<b>7) Example of UPDATE operation</b><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>public void updateLocation(Location location,int entityId, double lat, double lon, double accuracy,long time) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>PersistenceManager pm = persistenceFactory.getPersistenceManager();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>try {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.currentTransaction().begin();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location = pm.getObjectById(Location.class, location.getId());<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setEntityId(entityId);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setLat(lat);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setLon(lon);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setAccuracy(accuracy);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>location.setTime(time);<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.makePersistent(location);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.currentTransaction().commit();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} catch (Exception ex) {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.currentTransaction().rollback();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>throw new RuntimeException(ex);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>} finally {<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pm.close();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<b>8) Example of SELECT operation</b><br />
<b><br /></b>
<span class="Apple-tab-span" style="white-space: pre;"> </span>public List<location> getAllLocationsForEntity(int entityId){</location><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>PersistenceManager pm = persistenceFactory.getPersistenceManager();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>String queryStr = "select from " + Location.class.getName();<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>Query selectQuery=pm.newQuery(queryStr);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>selectQuery.setFilter("entityId=="+entityId);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return (List<location>) selectQuery.execute();<span class="Apple-tab-span" style="white-space: pre;"> </span></location><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
These are the simple basic CRUD operations to perform on Object data store in Google App Engine using JPA.</div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-23116751341686901212014-05-16T03:22:00.000-07:002014-07-20T01:38:54.105-07:00Java EE 7 Performance Tuning and Optimization Book<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.packtpub.com/java-ee-7-performance-tuning-and-optimization/book"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjqTTP_r_p_rJLT8pmAXcVB3KVw0oiA_61QqytoQqaebIcezscOqYA2f5LWr7FjvVWWVjFstgHOQ1LstCSvmkaDK32TeNf5TYiE2J9UHL93VsnPWvL6TBdsiT477zKm26jNDMHlFKeT7bu-/s1600/6428EN_mockupcover_nor_0.jpg" /></a></div>
<br />
The book covers performance tuning and optimization in Java EE 7, it takes months from me to complete this book :) and i did my best to cover most of the important topics in this area.<br />
<br />
What this book covers
<br />
<b>Chapter 1</b>, Getting Started with Performance Tuning, takes you through the art of performance tuning with its different components and shows you how to think when we face any performance issue. It focuses on preparing you to deal with the world of performance tuning and defining the handling tactics.
<br />
<b>Chapter 2</b>, Understanding Java Fundamentals, lays the foundation of required knowledge of the new features in Java Enterprise Edition 7 and different important Java concepts, including the JVM memory structure and Java concurrency. It also focuses on the different Java Enterprise Edition concurrency capabilities.
<br />
<b>Chapter 3</b>, Getting Familiar with Performance Testing, discusses performance testing with its different components, defines useful terminologies that you need to be aware of, and then gives hands-on information about using Apache JMeter to
create your performance test plans for different components and get the results.
<br />
<b>Chapter 4</b>, Monitoring Java Applications, dissects the different monitoring tools
that will be used in performance tuning, starting from the operating system
tools, different IDE tools, JDK tools, and standalone tools. It covers JProfiler
as an advanced profiling tool with its offline profiling capabilities.
<br />
<b>Chapter 5</b>, Recognizing Common Performance Issues, discusses the most common performance issues, classifies them, describes the symptoms, and analyzes the possible root causes.
<br />
<b>Chapter 6</b>, CPU Time Profiling, focuses on the details of getting the CPU and time profiling results, ways to interpret the results, and ways to handle such issues. It discusses the application logic performance and ways to evaluate different application logics. It provides the initial performance fixing strategy.
<br />
<b>Chapter 7</b>, Thread Profiling, discusses thread profiling with details on how to read and interpret thread profiling results and how to handle threading issues. It also highlights the ways to get, use, and read the thread dumps.
<br />
<b>Chapter 8</b>, Memory Profiling, discusses how to perform memory profiling, how to read and interpret the results, and how to identify and handle possible issues. It also shows how to read and query memory heap dumps and analyze the different out of memory root causes. The chapter finishes your draft performance fixing strategy.
<br />
<b>Chapter 9</b>, Tuning an Application's Environment, focuses on tuning the application environment, starting from the JVM and passing through other elements such as
the application servers, web servers, and OS. We will focus on selected examples
for each layer and discuss the best practices for tuning them.
<br />
<b>Chapter 10</b>, Designing High-performance Enterprise Applications, discusses design and architecture decisions and the performance impact. This includes SOA, REST, cloud, and data caching. It also discusses the performance anti-patterns.
<br />
<b>Chapter 11</b>, Performance Tuning Tips, highlights the performance considerations when using the Agile or Test-driven Development methodologies. This chapter also discusses some performance tuning tips that are essential during the designing and development stages of the Java EE applications, including database interaction, logging, exception handling, dealing with Java collections, and others. The chapter also discusses the javap tool that will help you to understand the compiled code in
a better way.
<br />
<b>Chapter 12</b>, Tuning a Sample Application, includes hands-on, step-by-step tuning of a sample application that has some performance issues. We will measure the application performance and tune the application issues, and re-evaluate the application performance.
<br/><br />
The book is published by<b> Packt Publishing</b>:<br />
You can find the covered topics in Table of content in the Packt Publishing web site:<br />
<a href="http://www.packtpub.com/java-ee-7-performance-tuning-and-optimization/book">http://www.packtpub.com/java-ee-7-performance-tuning-and-optimization/book</a><br />
<br />
Packt Publishing offers free shipping to UK, US, Europe and selected countries in Asia.
<br />
<br />
<br />
I hope everyone found this book useful and get the maximum value from the book topics.<br />
<br />
<br />
<br />
<br />
<br />
<br /></div>Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com0tag:blogger.com,1999:blog-4604699843198276393.post-46543069152536209012014-04-03T04:32:00.005-07:002014-04-03T05:28:55.899-07:00BRB<div dir="ltr" style="text-align: left;" trbidi="on">
Apologize for being busy in the past period, will try to give more time to my blog in the near future once I finished all my existing commitments :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJrW736hIWVYst3o335XaEORK0W8hyphenhyphenqj803VdDKQJbIB16qeOnCJkr-qpGyxAAF2Uu9gN-f7cZjavm6TfMkJ0gBUi9sA5Stc-wvLjYmkBQMrwAl6PqQd_VqjK1Jsl2gLeD9cg_6Tg3mQvM/s1600/brb.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJrW736hIWVYst3o335XaEORK0W8hyphenhyphenqj803VdDKQJbIB16qeOnCJkr-qpGyxAAF2Uu9gN-f7cZjavm6TfMkJ0gBUi9sA5Stc-wvLjYmkBQMrwAl6PqQd_VqjK1Jsl2gLeD9cg_6Tg3mQvM/s1600/brb.jpg" height="320" width="320" /></a></div>
<br /></div>
Osama Oransahttp://www.blogger.com/profile/03508436445550571265noreply@blogger.com1