aiShare Your Requirements
Pawanpreet Singh Oodles

Pawanpreet Singh (Manager-Solutions Architect)

Experience: 13+ yrs

Pawanpreet is an seasoned Project Manager with a wealth of knowledge in software development, specializing in frontend and mobile applications. He possesses a strong command of project management tools, including Jira, Trello, and others. With a proven track record, he has successfully overseen the delivery of multiple software development projects, managing budgets and large teams. Notable projects he has contributed to include TimeForge, Yogyata, Kairos, Veto, Inspirien App, and more. Pawanpreet excels in developing and maintaining project plans, schedules, and budgets, ensuring timely delivery while staying within allocated resources. He collaborates closely with clients to define project scope and requirements, establish timelines and milestones, and effectively manage expectations. Regular project status meetings are conducted by him, providing clients and stakeholders with consistent updates on project progress, risks, and issues. Additionally, he coaches and mentors project leads, offering guidance on project management best practices and supporting their professional development.

Pawanpreet Singh Oodles
Pawanpreet Singh
(Solutions Architect)

Pawanpreet is an seasoned Project Manager with a wealth of knowledge in software development, specializing in frontend and mobile applications. He possesses a strong command of project management tools, including Jira, Trello, and others. With a proven track record, he has successfully overseen the delivery of multiple software development projects, managing budgets and large teams. Notable projects he has contributed to include TimeForge, Yogyata, Kairos, Veto, Inspirien App, and more. Pawanpreet excels in developing and maintaining project plans, schedules, and budgets, ensuring timely delivery while staying within allocated resources. He collaborates closely with clients to define project scope and requirements, establish timelines and milestones, and effectively manage expectations. Regular project status meetings are conducted by him, providing clients and stakeholders with consistent updates on project progress, risks, and issues. Additionally, he coaches and mentors project leads, offering guidance on project management best practices and supporting their professional development.

LanguageLanguages

DotHindi

Bilingual

DotPunjabi

Fluent

DotEnglish

Conversational

SkillsSkills

DotAngular/AngularJS

80%

DotJavascript

80%

DotTechnical Project Management

100%
ExpWork Experience / Trainings / Internship

Sep 2012-Present

Technical Project Manager

Gurugram, India


Oodles Technologies

Gurugram, India

Sep 2012-Present

EducationEducation

2008-2012

Dot

Punjab Technical University

B.Tech -Computer Science

certificateCertifications
Dot

Certified Associate in Project Management (CAPM)®

Project Management Institute

Issued On

Nov 2024

Dot

Professional Scrum Master™ I (PSM I)

Scrum.org

Issued On

Oct 2023

Dot

Project Management Professional (PMP)®

Project Management Institute

Issued On

Nov 2025

Top Blog Posts
Use Plugin in Flutter (function (e,t,n){window[e].set(t,n)})("n5335990381742446", "9315512458466202", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n4068204111265985", "5439739611205312", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n7061334426503474", "11583010757504963", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n6513798176719909", "2237132518424796", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n2906099174865213", "7200896985752863", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n8591014405130157", "2018766429704537", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n8099674264396977", "7651538876374999", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n22506560379471896", "8897457231715498", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n007517276405486939", "5870207609676132", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n4191489148718337", "9053097173279729", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n9204869782571112", "8495177978925232", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n9204869782571112", "8495177978925232", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false}); Flutter provides us the opportunity to create beautiful mobile applications If we want to invoke any functionality of the device we need to add a plugin of it. We will learn by adding Shared Preferences plugin in our application. Create an application and name it "shared_preferences_demo" then add the following code in its lib/main.dart file import 'package:flutter/material.dart'; void main() => runApp(SharedPreferencesDemo()); class SharedPreferencesDemo extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Shared Preferences Demo', home: HomePage(title: 'Shared Preferences Demo'), ); } } class HomePage extends StatefulWidget { HomePage({Key key, this.title}) : super(key: key); final String title; @override _HomePageState createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { TextEditingController textController = new TextEditingController(); String savedData = ""; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Column( children: <Widget>[ TextField( controller: textController, ), FlatButton( child: Text("Save In Shared Preferences"), onPressed: () { saveInSharedPreferences(); }, color: Colors.redAccent, ), Padding( padding: EdgeInsets.all(10), ), Text(savedData), FlatButton( child: Text("Get from Shared Preferences"), onPressed: () { getFromSharedPreferences(); }, color: Colors.greenAccent, ), ], )); } void saveInSharedPreferences() { debugPrint('save pressed'); } void getFromSharedPreferences() { debugPrint('get pressed'); } } Finding a plugin: 1. There are various flutter plugins available on the https://pub.dartlang.org/flutter, One can search and find a plugin there easily. 2. Search for shared preferences. 3. Select shared_preferences option. 4. Open Installing tab - Here you will learn how to integrate this plugin in your application. Integrating Plugin in Our Application 1. Open pubspec.yaml file of your project 2. Add the following in your dependencies. dependencies: shared_preferences: 3. Install it via command flutter packages get 4. Import in your code as the following import 'package:shared_preferences/shared_preferences.dart'; Add the following code in your lib/main.dart file. 1. Add this in saveInSharedPreferences method void saveInSharedPreferences() async { String dataToSave = textController.text; SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setString('data', dataToSave); textController.text = ''; } 2. Add this in getFromSharedPreferences method void getFromSharedPreferences() async { SharedPreferences prefs = await SharedPreferences.getInstance(); savedData = await prefs.getString('data'); debugPrint(savedData); } Run the app. Now you will be able to save and get from shared preferences in your application. Hope you enjoyed my post References: 1. https://pub.dartlang.org/ 2. https://github.com/flutter/plugins
How To Create Your Own Marker For AR Js (function (e,t,n){window[e].set(t,n)})("n6100373148881877", "31244620640676746", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n735317554679928", "2954710755390295", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n4375696134080078", "4742141163142286", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n7244493635988534", "05284779674972806", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n4512618767806622", "9206307371301816", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n5894406572729494", "13211498150364753", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n5617523931461517", "4972980863451295", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n3418693925659986", "9939347473242133", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n05912695234330423", "8885680430327181", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n7381951163952816", "7191272667738577", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n9407553667864794", "45747435369167566", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n6824101935125313", "012253837720794136", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n6824101935125313", "012253837720794136", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n6824101935125313", "012253837720794136", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n6824101935125313", "012253837720794136", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false}); Here we will discuss how to create your own marker for AR js, As you know AR js is a javascript library use for creating an application with the capability of Augment Reality. But it relies on marker meaning we have to define a pattern on which we want to Augment the things, By default, this library use HIRO marker and there are several other inbuilt markers like kanji, but if you want to use your own pattern you can follow the below steps: Following are the requirement for creating your own marker for AR js 1. AR.js (https://github.com/jeromeetienne/AR.js) 2. marker-generator (https://jeromeetienne.github.io/AR.js/three.js/examples/marker-training/examples/generator.html) 3. Image of marker preferably square and in black and white colors, In this example, have used the image as shown below. To generate your own marker 1. Go to the marker generator website. 2. Upload marker there. 3. click on Downoad Marker and Download Image, save both things in a location. 4. Our generated Marker image is as shown below and you can use my marker from here. Use generated marker in our AR js application 1. Upload marker to a location on web and copy its path. 2. To use marker in AR js application you have to define the following line. <a-marker preset="pattern" type="pattern" url="[web location of generated pattern]"> 3.Your code will looks something like as shown below <html> <script src="aframe.min.js"></script> <script src="AR.js/aframe/build/aframe-ar.js"> </script> <a-scene > <a-sky color="#87cefa"> <a-animation attribute="color" dur="10000" from="#87cefa" to="#1e90ff" repeat="indefinite"></a-animation> </a-sky> <!-- Basic plane. --> <a-marker preset="pattern" type="pattern" url='https://s3.amazonaws.com/oodles-blogs/blog-images/495e139a-0a49-474f-ab3c-476cbcc9bbc8.null'> <a-plane color="#c2b280" height="5" width="5" rotation="-90 0 0"></a-plane> <a-torus color="green" radius="0.4" position="-1.5 0 -1" rotation="-90 0 0"></a-torus> <a-cylinder color="brown" height="2" radius="0.03" position="-1.5 0 0" rotation="-90 0 0"></a-cylinder> <a-torus color="green" radius="0.4" position="1.5 0 -1" rotation="-90 0 0"></a-torus> <a-cylinder color="brown" height="2" radius="0.03" position="1.5 0 0" rotation="-90 0 0"></a-cylinder> <a-text color="red" value="Pawanpreet Singh" width="5" position="-1.3 0 -2" rotation="-90 0 0"></a-text> <a-text color="blue" value="Oodles Technologies" width="5" position="-1.2 0 0" rotation="-90 0 0"></a-text> </a-marker> <a-entity camera></a-entity> </a-scene> </html> 4. Code shown here will generate the following result if shown below marker. Hope you enjoyed my post.
Augument Reality With A Frame and AR Javascript Libraries (function (e,t,n){window[e].set(t,n)})("n6510465233421763", "40532714009895243", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n2535867130156062", "07883600453844886", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n2710938261333211", "07458575311586446", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n5742021250942284", "49959398755893414", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n0013746992131400404", "7591417701908953", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n9780631750921192", "4645326573507853", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n22736490190603065", "718711805541099", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n9354339075272196", "5885905319074185", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n5896053148631029", "3064850847613001", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false});(function (e,t,n){window[e].set(t,n)})("n5896053148631029", "3064850847613001", {"blockalert":false,"blockconfirm":false,"blockprompt":false,"renderalert":false}); AFrame.js - Using AFrame.js library one can build virtual reality applications in a markup language like html. First we have created a scene using Aframe.js using following snippet <html> <script src="aframe.min.js"></script> <a-scene> <a-plane color="#c2b280" height="10" width="10" rotation="-90 0 0"></a-plane> <a-torus color="green" radius="1.2" position="-4.5 3 -4.5"></a-torus> <a-cylinder color="brown" height="2" radius="0.05" position="-4.5 1 -4.5"></a-cylinder> <a-torus color="green" radius="1.2" position="4.5 3 -4.5"></a-torus> <a-cylinder color="brown" height="2" radius="0.05" position="4.5 1 -4.5"></a-cylinder> <a-text color="red" value="Pawanpreet Singh" width="5" position="-0.5 0 -4" rotation="-90 0 0"></a-text> <a-text color="blue" value="Oodles Technologies" width="5" position="-0.5 0 -3" rotation="-90 0 0"></a-text> </a-scene> </html> Everything in the Aframe is written in the scene element. First I have created a plane and provided it a color #c2b280 for using it as floor. Then I created circles using torus element and provided green color to it and assign its position in the scene. Then to using circles as tree a have created its lower portion using cylinder element and provide brown color to it and then set its position. For Writing text i have used text element and provided color and values to it. AR.js - Using AR.js one can build Augment Reality applications in Javascript. To use the above code written in Aframe library in Augment Reality I have used AR.js framework as shown below: <html> <script src="aframe.min.js"></script> <script src="https://cdn.rawgit.com/jeromeetienne/AR.js/1.5.0/aframe/build/aframe-ar.js"> </script> <a-scene > <a-marker preset="hiro"> <a-plane color="#c2b280" height="5" width="5" rotation="-90 0 0"></a-plane> <a-torus color="green" radius="0.4" position="-1.5 0 -1" rotation="-90 0 0"></a-torus> <a-cylinder color="brown" height="2" radius="0.03" position="-1.5 0 0" rotation="-90 0 0"></a-cylinder> <a-torus color="green" radius="0.4" position="1.5 0 -1" rotation="-90 0 0"></a-torus> <a-cylinder color="brown" height="2" radius="0.03" position="1.5 0 0" rotation="-90 0 0"></a-cylinder> <a-text color="red" value="Pawanpreet Singh" width="5" position="-1.3 0 -2" rotation="-90 0 0"></a-text> <a-text color="blue" value="Oodles Technologies" width="5" position="-1.2 0 0" rotation="-90 0 0"></a-text> </a-marker> <a-entity camera></a-entity> </a-scene> </html> In the above code we used aFrame-ar.js to use our aframe written code in Augment Reality applications. First we told the application on which marker you have to react and set it to Hiro marker. Hiro marker is as shown below Then I changed height and positions of the object so that it can be shown in the marker. Now when I run this application and shown the above marker to camera it augmented the marker as shown in the image below Hope It helps you understand the basics of AR.js and Aframe.
Augment Reality a Brief Introduction with Javascript Augment Reality?? It is a technology using which one can show information over the real world objects using devices such as mobile phones, tablets or AR glasses like Google Glass and Microsoft Hololens. How Augment Reality differs from Virtual Reality?? In virtual reality, the user wears a device with a head-mounted display and experience a whole new world using that device. such devices shut the whole real world and provide a simulated environment to the user. but Augment Reality provide device provide experience over the real world where it adds computer-generated element over the real world object surrounding the user. Frameworks/Libraries in javascript which can help to create AR applications?? There are various frameworks present in Javascript which can help one to create applications based on Augment Reality: 1. AR.js - It is an opensource, very fast web based AR framework, it tries to provide 60 FPS experience even on older mobile devices. 2. js-aruco - It is a port of arUco libraray, It is based on OpenCV. From above two libabries AR.js has good community support, Using AR.js one can augment things in the real world very easily using simple markup like language, below is the basic code to create a simple project with AR.js. <script src="https://cdnjs.cloudflare.com/ajax/libs/aframe/0.7.1/aframe.js"></script> <script src="https://cdn.rawgit.com/jeromeetienne/AR.js/1.6.0/aframe/build/aframe-ar.js"></script> <body style='margin : 0px; overflow: hidden;'> <a-scene embedded arjs='sourceType: webcam;'> <a-box position='0 0.5 0' material='opacity: 0.5;'></a-box> <a-marker-camera preset='hiro'></a-marker-camera> </a-scene> </body> When you execute the above code, It will ask you for camera permission then if you show the hiro marker to the camera which will create an object over it. Hope now you understand the basics of Augument Reality using javascript.
Understanding Angular Universal and Creating Build Angular uses HTML templates with javascript and parse it to the actual web page at the run time using a browser. Now using Angular Universal one can render Angular on a server. There are various reasons why one needs server-side rendering like Search Engine Optimization, Social Sites Content Embedding in sites like Twitter, Facebook, etc. With Angular 4.0 it ships along with packages of core angular titled platform-browser and platform-server. Create basic angular application using @angular/cli ng new my-new-app cd my-new-app Because we want our app to work on a server, we have to do some changes because now our application will have two starting points. Now we have to create two type-script files named browser.app.module and server.app.module in the same location as app.module.ts file. browser.module This module will call BrowserModule.withServerTransition which conveys the angular that view will be changed after the whole framework is loaded in the memory of the browser. Here we need to provide appId which is just a string. import { AppModule } from './app.module'; import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; @NgModule({ declarations: [], imports: [ BrowserModule.withServerTransition({ appId: 'your-app-id' }), AppModule ], providers: [], bootstrap: [AppComponent] }) export class BrowserAppModule {} server.module This module is not installed by default, we have to install it using the following command yarn add @angular/platform-server npm install @angular/platform-server --save Let's add the following code to server module file import { AppModule } from './app.module'; import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; //Installed separatly import { ServerModule } from '@angular/platform-server'; import { AppComponent } from './app.component'; @NgModule({ declarations: [], imports: [ //Make sure the string matches BrowserModule.withServerTransition({ appId: 'my-app-id' }), ServerModule, AppModule ], providers: [], bootstrap: [AppComponent] }) export class ServerAppModule {} Now we need the new entry point for server lets create a new file typescript server.main in the same location as main.ts file with following code. export { ServerAppModule } from './app/server.app.module'; Now we need separate ts config file for a server so that while rendering at the server it can be used. tsconfig.browser.json { "extends": "../tsconfig.json", "angularCompilerOptions": { "entryModule": "./app/server.app.module#ServerAppModule" }, "exclude": [] } { "extends": "../tsconfig.json", "angularCompilerOptions": { "entryModule": "./app/browser.app.module#BrowserAppModule" }, "exclude": ["test.ts", "**/*.spec.ts"] } We are not done yet now we have to edit the angular-cli so that we can generate a new build for server deployment. "apps": [ { "root": "src", "outDir": "dist", "assets": ["assets", "favicon.ico"], "index": "index.html", "main": "main.ts", "polyfills": "polyfills.ts", "test": "test.ts", "tsconfig": "tsconfig.browser.json", "testTsconfig": "tsconfig.spec.json", "prefix": "app", "styles": ["styles.css"], "scripts": [], "environmentSource": "environments/environment.ts", "environments": { "dev": "environments/environment.ts", "prod": "environments/environment.prod.ts" } }, { "root": "src", "outDir": "dist-server", "assets": ["assets", "favicon.ico"], "index": "index.html", "main": "server.main.ts", "platform": "server", "polyfills": "polyfills.ts", "test": "test.ts", "tsconfig": "tsconfig.server.json", "testTsconfig": "tsconfig.spec.json", "prefix": "app", "styles": ["styles.css"], "scripts": [], "environmentSource": "environments/environment.ts", "environments": { "dev": "environments/environment.ts", "prod": "environments/environment.prod.ts" } } ], Let's create the build with the following command ng build --prod --app 1
Understating Web Workers Basics As you know javascript is single threaded language, we cannot run multiple scripts in javascript at same time. Various situations occurs when developers need things to run simultaneously. To handle those situations developers do some hacks like setTimeout etc. But in HTML 5 we have been provided with certain API’s to handle such scenarios which are known as Webworkers. Basic Methods Creating object - Web worker execute in an environment which is isolated from other code. Thats why it needs a separate file to craete an object for the worker. Below is the example of contructor that has the name of file as input paramenter. var myWorker = new Worker(‘heavyLoop.js’); postMessage - After the worker is created execute it using this method as shown below. myWorker.postMessage(); onmessage - This event captures the message sent by post message method we have to implement this in the main html file where we have constructed the worker. We get data in the event of this method, its implementation is as shown below. myWorker.onmessage = function(e){ alert(“Executed ” + e.data + “”); }; Basic Code Example: welcome.html <!DOCTYPE HTML> <html> <title>Heavy Loop</title> <script> var myWorker = new Worker(‘heavyLoop.js’); myWorker.onmessage = function(e){ alert(“Executed ” + e.data + “”); }; function welcomeMessage() { alert(“Welcome Man...”); } </script> <body> <input type=”button” onclick=”welcomeMessage();” value=”Welcome Message”/> </body> </html> Below code will be the content of heavyLoop.js file. var iterations = 600000000; var times = 0; for(var a = 0; a Now we have to keep welcome.html and heavyLoop.js in same place in server. Happy Coding.
Different Storage Options In HTML5 Objective:- Learn various types of storage options in client side. Which one to use at a certain occasion. Types:- Web Storage - localStorage and sessionStorage Web SQL IndexedDB WebStorage -Web apps using web storage can save data in the local memory of person browser. Before this data was stored in cookies. Web storage can store a large amount of application data and it's more secure than cookies. Web Storge save data based on origin, all web pages can access same data if their origin is same as (origin = www.xyz.com). localStorage - store data in browsers memory without any expiry. sessionStorage - store data in browsers memory for a particular session. // Save localStorage.setItem("name", "Pawanpreet"); // Get document.getElementById("output").innerHTML = localStorage.getItem("name"); Web SQL - It is a web API for saving data in DB which can be accessed using SQL. Because one can access use it using SQL statements it is known as WebSql. Main methods of webSql are as below openDatabase - this function will use an existing database or create the new one if not found. transaction - this function provides the power to control the transaction either complete it or roll back the transaction. executeSql - this function is used to run SQL queries. IndexedDB - IndexedDB unlike WebSql does not save data in fixed columns but save data in the js based object-oriented database object. Using this one can save and access data using “key”. Like WebSql indexDB also work on the same origin. Features: Store data in a Key-Value form. Based on Transactional DB model. Most of API’s are asynchronous. Uses event based on DOM to notify availability of result. It is Object Oriented. Does not use SQL statements. Use same origin Policy.
Creating A Directive in Angular 4 Objective: Learn the basics of @Directive decorator Learn how to use your directive with elements using attribute. Learning Decorator: We will use ppNoZero name for our directive and will attach it to code like shown below: <input type=”number” ppNoZero /> The team at Angular recommends that we should use some prefix in our directive, here we have used 'pp' as a prefix. Code: import { Directive, HostListener, Input } from '@angular/core'; import { DefaultValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; @Directive( { selector : 'input[ppNoZero], textarea[ppNoZero]', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: NoZeroDirective, multi: true } ], } ) export class NoZeroDirective extends DefaultValueAccessor { // set a new value to the field and model. private set value( val: any ) { // update element this.writeValue( val ); // update model this.onChange( val ); } /** * Updates the value on the input event. */ @HostListener( 'input', ['$event.type', '$event.target.value'] ) onInput( event: string, value: string ): void { this.updateValue( event, value ); } /** * restrict zero on an input value. * * @param {string} value - input value * @param {string} event - input event */ private updateValue( event: string, value: string ): void { //restricts zero on an input value this.value = value.replace(/^0/g, '');; } } We have created a directive using @Directive annotation decorator in our angular class. Here we said it will be used on two selectors input and text area which has our directive in it. Our directive will work only on input events if user inputs zero in initial place it will restrict it and replace it with the empty string using the updateValue method. To use this directive we have to associate with an element in the HTML as shown below. <input type=”number” ppNoZero /> Now include this directive in your module to import its functionality into your project. Happy Coding.
Dealing with major rejection reasons while submitting iOS apps Apps submitted for Apple App Storeundergoes a review process which usually take place after 3-4 days for free apps and then its status changes to in Review. There are several reasons for which your app might be get rejected, Please be prepared for stated issues before submitting your apps to Apple App Store. Common Issues: 1) More Information needed 2)Guideline 2.2: Apps that exhibit bugs will be rejected 3)Guideline 10.6: Apple and our customers place a high value on simple, refined, creative, well thought through interfaces. They take more work but are worth it. Apple sets a high bar. If your user interface is complex or less than very good, it may be rejected 4)Guideline 22.2: Apps that contain false, fraudulent or misleading representations or use names or icons similar to other Apps will be rejected 5)Guideline 3.3: Apps with names, descriptions, screenshots, or previews not relevant to the content and functionality of the App will be rejected 6)Guideline 17.2: Apps that require users to share personal information, such as email address and date of birth, in order to function will be rejected 7)Guideline 3.1: Apps or metadata that mentions the name of any other mobile platform will be rejected 8)Guideline 3.8: Developers are responsible for assigning appropriate ratings to their Apps. Inappropriate ratings may be changed/deleted by Apple 9)Guideline 3.4: App names in iTunes Connect and as displayed on a device should be similar, so as not to cause confusion 10)Guideline 2.16: Multitasking Apps may only use background services for their intended purposes: VoIP, audio playback, location, task completion, local notifications, etc. What to do while submitting the app: So before submitting the app please do refer to the upstated issues if your app is violating any one then you have to deal with some points given below: 1) You must provide full information to visit and check each fucntionality of your app, you must provide them user credentials if your app has any to check whole functionality. 2) Remove the crashes of bugs related to flow of your app. 3) Flow of your app must be simple for a new user to understand. 4) If you are only using facebook or google as your login process then you have to use other feature of them without this apple can reject your app. 5) Please do not provide false information for your apps functionality which you not have yet activated in the version submitted for review all the functionality described must be working. 6) Do not use apps name or icon similar to other app, try to be unique. 7) Try to add your own signup system rather than depending on third party services. 8) Try to appropriately rate your app, if its is not suitable for youngster and you have selected 3+ rating then your app might got rejected. 9) Do not use other platforms name(Android especially) in your apps metadata. 10) Yous app name in iTunes connect and in users mobile must be same. If you try to check these upsated points while submitting your app then your app is less prone to get rejected. THANKS
Cocoapods Requirement Installation and Usage with Swift Requirement and Why to use it: While developing projects we need third Party libraries, whenever we have to add new library we copy its code to our Project, while upgrading our Project to meet latest xCode requirements sometimes we need latest version of those libararies which we have added to our projects and in one project we might be using several third party libraries which we have to update, to manage all thsese headaches developers use dependency managers likeCocoaPods. Life without dependency manager: 1) Upgrading a library to a latest version can be difficult, especially if various libraries must be updated together because one can dependon another. 2) Including a library in your project makes it tempting to make local changes to the code, making it harder to update to a newer version later. 3) Determining the current version if the librabry used in your project can be a tough job especially if you are now tracking your changes. 4) Finding new libraries can be difficult without a central location to see all the available libraries. Installation: Open Terminal and enter the following command: sudo gem install cocoapods Enter your password when requested.You must use sudo to install CocoaPods, but you won’t need to use sudo after it’s installed. Lastly, enter this command in Terminal to complete the setup: pod setup --verbose This process will likely take a few minutes as it clones the CocoaPods Master Specs repository into ~/.cocoapods/ on your computer. The verbose option logs progress as the process runs, allowing you to watch the process instead of seeing a seemingly “frozen” screen. Usage: You first need to close Xcode. Open Terminal and navigate to the directory that contains your IceCreamShop project by using the cd command: cd ~/Path/To/Folder/Containing/Project Next, enter this command: pod init This creates a Podfile for your project. Type this command to open the Podfile using Xcode for editing: open -a Xcode Podfile The default Podfile looks like this: # Uncomment this line to define a global platform for your project # platform :ios, ‘8.0’ target ‘Project’ do end target ‘ProjectTests' do end Replace the two commented lines with the following: platform :ios, "8.0" use_frameworks! This tells CocoaPods that your project is targeting iOS 8.0 and will be using frameworks instead of static libraries. Now add dependency using CocoaPods. Save and Close the Podfile You now need to tell CocoaPods to install the dependencies for your project. Enter the following command in Terminal: pod install This is all you need to do!