<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Impulsive Web - Medium]]></title>
        <description><![CDATA[Impulsive Web Blogs - Medium]]></description>
        <link>https://medium.com/impulsiveweb?source=rss----8d6c49df0dbf---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Impulsive Web - Medium</title>
            <link>https://medium.com/impulsiveweb?source=rss----8d6c49df0dbf---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 20:47:37 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/impulsiveweb" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Case Study — Custom LLM Powered Knowledge Base for Real Estate Industry using Gemma and MongoDB]]></title>
            <link>https://medium.com/impulsiveweb/case-study-custom-llm-powered-knowledge-base-for-real-estate-industry-using-gemma-and-mongodb-1b62c7d9ff94?source=rss----8d6c49df0dbf---4</link>
            <guid isPermaLink="false">https://medium.com/p/1b62c7d9ff94</guid>
            <category><![CDATA[llm]]></category>
            <category><![CDATA[knowledge-management]]></category>
            <category><![CDATA[case-study]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[rags]]></category>
            <dc:creator><![CDATA[Ashok Vishwakarma]]></dc:creator>
            <pubDate>Sun, 01 Sep 2024 10:54:19 GMT</pubDate>
            <atom:updated>2024-09-01T10:54:18.951Z</atom:updated>
            <content:encoded><![CDATA[<h3><strong>Case Study — Custom LLM Powered Knowledge Base for Real Estate Industry using Gemma and MongoDB</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GsFgfk0kTRFBZZbNz42zAw.png" /></figure><p>In the fast-paced, data-intensive environment of real estate, the management and retrieval of extensive project-related data pose significant challenges. Real estate firms generate a vast array of documents at every stage of their operations — from land feasibility studies and market research to architectural designs and compliance reports. The sheer volume and diversity of this data make traditional storage and retrieval methods inefficient, often leading to delays in decision-making and missed opportunities.</p><p>To address these challenges, we have developed a Custom LLM-Powered Knowledge Base using <strong>Gemma</strong> for text vectorization and <strong>MongoDB</strong> for storing and querying vector data. This innovative solution allows real estate firms to quickly access, query, and generate insights from their extensive document repositories, transforming how they manage and utilize their data.</p><h3><strong>Understanding the challenge</strong></h3><p>Real estate operations involve a multitude of processes, each generating a significant number of documents. Some key document types include:</p><ul><li>Land Feasibility Studies</li><li>Zoning and Land Use Plans</li><li>Market Research Reports</li><li>Project Feasibility Reports</li><li>Environmental Impact Assessments</li><li>Building Plan Approvals</li></ul><p>The challenge lies not only in storing these documents but also in efficiently retrieving relevant information when needed. Traditional document management systems, while useful, often fall short in handling unstructured data or performing complex queries across large datasets.</p><p>Here we see an opportunity to use LLM’s capability to make a queryable knowledge base using those documents.</p><h3><strong>Our solution</strong></h3><p>Our solution leverages LLM’s capabilities to create a powerful knowledge base that can understand, process, and respond to natural language queries. By integrating <a href="https://ai.google.dev/gemma"><strong>Gemma</strong></a><strong> (</strong>a family of lightweight, state-of-the-art models), with <strong>MongoDB</strong> <strong>Vector Database</strong>, we have built a system that efficiently stores, retrieves, and generates insights from vast amounts of data.</p><p><strong>Extracting Text from PDF</strong></p><p>We use <a href="https://pymupdf.readthedocs.io/"><strong>PyMuPDF</strong></a> to convert PDF documents into plain text format. This step is crucial as it transforms unstructured data into a format that can be processed by the model.</p><pre>import fitz  # PyMuPDF<br><br>def extract_text_from_pdf(pdf_path):<br>    doc = fitz.open(pdf_path)<br>    text = &quot;&quot;<br>    for page_num in range(len(doc)):<br>        page = doc.load_page(page_num)<br>        text += page.get_text()<br>    return text<br><br>pdf_path = &quot;path/to/your/document.pdf&quot;<br>document_text = extract_text_from_pdf(pdf_path)</pre><blockquote>To support vast majority of data types such as pdf, sheets, drawings and etc. We have used different solutions to convert and extract meaningful texts out of those data files.</blockquote><p><strong>Vectorizing the Text using Gemma</strong></p><p>The extracted text is then vectorized using <strong>Gemma</strong>. Vectorization involves converting the text into numerical vectors that represent the semantic meaning of the content. These vectors are essential for performing similarity searches and for understanding the context of queries.</p><pre>import os<br>from google.cloud import aiplatform<br><br>os.environ[&quot;GOOGLE_APPLICATION_CREDENTIALS&quot;] = &quot;&lt;service-json&gt;&quot;<br><br>aiplatform.init(<br>    project=&quot;&lt;projectId&gt;&quot;,<br>    location=&quot;&lt;region&gt;&quot;<br>)<br><br>def vectorize_text_with_gemma(text):<br>    gemma_input = {&quot;instances&quot;: [{&quot;content&quot;: text}]}<br>    response = model_endpoint.predict(instances=gemma_input)<br>    embeddings = response.predictions[0][&#39;embedding&#39;]<br>    return embeddings.numpy() if hasattr(embeddings, &#39;numpy&#39;) else embeddings<br><br>document_vector = vectorize_text_with_gemma(document_text)</pre><p><strong>Storing vectors in MongoDB</strong></p><p>Once the text is vectorized, we store the vectors in <strong>MongoDB Vector Database</strong>. MongoDB is ideal for this purpose due to its scalability and support for complex queries. Storing vectors in MongoDB allows for efficient indexing and retrieval, which is crucial for processing large datasets.</p><pre>from pymongo import MongoClient<br><br>client = MongoClient(&quot;mongodb://localhost:27017/&quot;)<br>db = client[&#39;real_estate_projects&#39;]<br>collection = db[&#39;documents&#39;]<br><br>document = {<br>    &quot;project_id&quot;: &quot;123&quot;,<br>    &quot;type&quot;: &quot;budget&quot;,<br>    &quot;content&quot;: document_text,<br>    &quot;vector&quot;: document_vector.tolist()<br>}<br><br>collection.insert_one(document)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*agHIr-NY-wxozPCCYD3nEQ.png" /></figure><p>The above pipeline stores the converted data into Mongo DB in a vector format also known as <strong>Data Ingestion Pipeline.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NZVpkHh-Lw2pJ0wE7ebDzg.png" /><figcaption>Example of Data Clusters in Vector Database</figcaption></figure><p>Each time a new dataset is generated, we utilize the Data Ingestion Pipeline to update our Vector Database. This approach ensures that the system remains scalable and efficient, seamlessly supporting ongoing data updates and insertions.</p><h3>Making a query</h3><p>Once our Vector Database is configured and populated with all the necessary data, we proceed to build a query interface. This setup ensures that the system is ready to handle complex queries efficiently, leveraging the structured data stored in the database.</p><p>We then develop a simple application that allows users to input their queries. The application uses our solution, powered by a Large Language Model (LLM), to process these queries and provide accurate and relevant information in response. This approach streamlines the process of retrieving critical data, making it accessible and actionable for users.</p><p>To illustrate this process, we here is a step-by-step example of how data is queried and how the system delivers precise answers based on the input provided.</p><p><strong>Query processing and Vectorization</strong></p><p>When a user submits a query, it is processed and vectorized using Gemma, similar to how the documents were vectorized. This ensures that the query is represented in the same vector space, allowing for accurate similarity searches.</p><pre>def vectorize_query_with_gemma(query):<br>    gemma_input = {&quot;instances&quot;: [{&quot;content&quot;: query}]}<br>    response = model_endpoint.predict(instances=gemma_input)<br>    embeddings = response.predictions[0][&#39;embedding&#39;]<br>    return embeddings.numpy() if hasattr(embeddings, &#39;numpy&#39;) else embeddings<br><br>query = &quot;What are the compliance requirements to develop a residential project in Hyderabad?&quot;<br>query_vector = vectorize_query_with_gemma(query)</pre><p><strong>Retrieving Relevant Data from MongoDB</strong></p><p>The vectorized query is then used to perform a similarity search in MongoDB. This search retrieves the most relevant documents based on their vector similarity to the query.</p><pre>def retrieve_relevant_documents(query_vector, collection, k=5):<br>    query_vector_list = query_vector.tolist()<br>    results = collection.aggregate([<br>        {<br>            &quot;$search&quot;: {<br>                &quot;knnBeta&quot;: {<br>                    &quot;vector&quot;: query_vector_list,<br>                    &quot;path&quot;: &quot;vector&quot;,<br>                    &quot;k&quot;: k<br>                }<br>            }<br>        }<br>    ])<br>    return list(results)<br><br>retrieved_documents = retrieve_relevant_documents(query_vector, collection)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZyWnx6pp65RKLcWeonAWuA.png" /></figure><p><strong>Generating responses with Gemma</strong></p><p>The final step involves generating a coherent response based on the retrieved documents. Gemma uses the context from these documents to generate an answer that is relevant and accurate.</p><pre>def generate_response_with_gemma(retrieved_documents, query):<br>    context = &quot; &quot;.join([doc[&#39;content&#39;] for doc in retrieved_documents])<br>    gemma_input = {<br>        &quot;instances&quot;: [{&quot;prompt&quot;: f&quot;Context: {context}\nQuery: {query}&quot;}]<br>    }<br>    response = model_endpoint.predict(instances=gemma_input)<br>    generated_text = response.predictions[0][&#39;text&#39;]<br>    return generated_text<br><br>response = generate_response_with_gemma(retrieved_documents, query)<br>print(&quot;Generated Response:&quot;, response)</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*tWBLbopoeZXlv5kxbRTKKw.png" /></figure><p>This process can be referred to as the query pipeline, where we take the user’s text input, convert it into a vector using Gemma, and query our Vector Database to identify the nodes most relevant to the user’s query.</p><h3><strong>Looking Ahead</strong></h3><p>To further enhance the system, we plan to implement several improvements:</p><p>1. <strong>Data Processing Enhancements:</strong> Advanced data cleaning, segmentation, and metadata enrichment to improve the quality of the input data.</p><p>2. <strong>Vectorization 2.0:</strong> Fine-tuning the Gemma model, optimizing embeddings, and batch processing to better capture the nuances of the text.</p><p>3. <strong>Optimizing Storage:</strong> Implementing better indexing strategies, sharding, and data archival to handle growing data volumes more efficiently.</p><p>4. <strong>Query Enhancements:</strong> Incorporating contextual understanding and a feedback loop to refine the accuracy of query responses.</p><p>5. <strong>Improving Response Generation:</strong> Using template-based responses, user personalization, and better error handling to provide more accurate and user-friendly outputs.</p><p>The solution presented in this case study is known as Retrieval-Augmented Generation (RAG), where we optimize the process of generating responses using an LLM by sending both the query and relevant context. One limitation is the token size (Query + Context) that can be sent to a specific model to generate responses. RAG addresses this by optimizing context retrieval through an external vector database, making the process more accurate, efficient, and scalable.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Whw2r1Izb2hdyIBuZFyLGQ.png" /><figcaption>Maximum Supported Token Size for LLMs</figcaption></figure><h3>Conclusion</h3><p>Our Custom LLM-Powered Knowledge Base represents a significant advancement in how real estate firms can manage and utilize their data. By integrating Gemma with MongoDB’s advanced vector search capabilities, we have created a system that not only stores vast amounts of data but also makes it accessible and actionable in ways that were previously unattainable. As we continue to refine and expand this solution, we anticipate it will have a profound impact on the efficiency and effectiveness of real estate operations.</p><p>For those interested in exploring the technical details or implementing a similar solution, we invite you to visit our GitHub repository or contact us directly. We are also actively hiring — join us in building the future of AI-driven knowledge management!</p><p>This detailed article serves as a comprehensive overview of your project, including the problem it solves, the technical approach, and the specific code implementations used. It is designed to resonate with a technical audience who would be interested in the intricacies of your solution and its benefits to the real estate industry.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1b62c7d9ff94" width="1" height="1" alt=""><hr><p><a href="https://medium.com/impulsiveweb/case-study-custom-llm-powered-knowledge-base-for-real-estate-industry-using-gemma-and-mongodb-1b62c7d9ff94">Case Study — Custom LLM Powered Knowledge Base for Real Estate Industry using Gemma and MongoDB</a> was originally published in <a href="https://medium.com/impulsiveweb">Impulsive Web</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Deploy Next.js app with SSR using AWS Lambda]]></title>
            <link>https://medium.com/impulsiveweb/deploy-next-js-app-with-ssr-using-aws-lambda-33b667c90eef?source=rss----8d6c49df0dbf---4</link>
            <guid isPermaLink="false">https://medium.com/p/33b667c90eef</guid>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[nextjs-deployment]]></category>
            <dc:creator><![CDATA[Sheetal Kumar Maurya]]></dc:creator>
            <pubDate>Wed, 31 Jul 2024 05:17:05 GMT</pubDate>
            <atom:updated>2024-07-31T05:17:05.316Z</atom:updated>
            <content:encoded><![CDATA[<p>There are many ways to deploy Next.js app to the production environment. In AWS we can use EC2, Amplify, S3 Buckets, etc. We need to choose the right deployment process based on the web app.</p><p>Here we will see the process of Next.js app deployment using AWS Lambda and S3. It has good scalability and is a cost-saving approach in serverless architecture. Let us have some details about the role of Lambda and S3.</p><p><strong>AWS Lambda — </strong><br>In this deployment, AWS Lambda is responsible for creating SSR pages dynamically by processing server-side props of the next.js app.</p><p><strong>S3 Bucket — </strong><br>We will use the S3 bucket to serve all static content of the website like JS, CSS, Media, etc. AWS Lambda has a limit for its size, so we can not put large static files there.</p><p>Let&#39;s start step by step process to deploy your Next.js app using this process. We will use an AWS Lambda Web Adapter to convert and process the HTTP request received on the lambda function and transfer it to our next.js app.<br><a href="https://github.com/awslabs/aws-lambda-web-adapter">https://github.com/awslabs/aws-lambda-web-adapter</a></p><p>The basic structure of this process is as below.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Hp14QKZWOvqyMlS4LAf2Aw.png" /></figure><ol><li><strong>Build your app in a standalone format.</strong><br>Here are some configuration updates for your next.config.js</li></ol><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a8cda4c3ce22e9940094f1508a29f70b/href">https://medium.com/media/a8cda4c3ce22e9940094f1508a29f70b/href</a></iframe><p>Here output format is standalone so it will create the standalone app in the build process to deploy anywhere using node. Now you will see a standalone folder inside .next after the build finishes.<br>Here <strong>assetPrefix</strong> is used to point all static files to S3 bucket.</p><p>Now run next.js build command.</p><pre>npm run build</pre><p>It will produce .next folder with the output below —</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_U4Md1bifyIOGsxj6ghoLw.png" /></figure><p><strong>2. Deploy static contents on S3 Bucket<br></strong>Copy static foder form .next to your s3 bucket inside ${BUILD_VERSION}/_next/<br>Now all your static files should be accessible using bucket url like:<br>https://${s3Bucket}.s3.${awsRegion}.amazonaws.com/${buildVersion}/_next/static/media/51ed15f9841b9f9d-s.woff2</p><p>3. <strong>Deploy the standalone app to AWS Lambda<br></strong>Create AWS Lambda function for app deployment.<br><a href="https://ap-south-1.console.aws.amazon.com/lambda/home?region=ap-south-1#/create/function">https://ap-south-1.console.aws.amazon.com/lambda/home?region=ap-south-1#/create/function</a><br>Provide the function name and in Advance Setting Check “Enable Function URL”</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Kg8Pr_7Vufe5FGbuSNvmHw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*d7EUEm45cJ-IUtdKoKznPQ.png" /></figure><p>Add <strong>AWS Lambda Web Adapter</strong> to our lambda function by using “Add a layer” option.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eJsFKzRMjuRX9odoYESjFQ.png" /></figure><p>Select “Specify an ARN” and fill:<br>arn:aws:lambda:<strong>${AWS::Region}</strong>:753240598075:layer:LambdaAdapterLayerX86:22<br>update aws region in the above ARN.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LOE9Nzngrw7xMeppuhvmCQ.png" /></figure><p>Now AWS Lambda Web Adapter is ready to use. Now update “Runtime settings” handler. Set handler as <strong>server.sh.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5W2smQLw4R0Uoh8fp7I25w.png" /></figure><p>Before deploying the standalone folder to AWS Lambda we need to create the <strong>server.sh</strong> file inside the standalone directory and put the execution entry code.</p><pre>#!/bin/bash<br># Execute server.js for SSR pages<br>exec node server.js</pre><p>Now copy the public folder from the root of your next.js app into .next/standalone for server public content on SSR.</p><pre>cp -r public/. .next/standalone/public</pre><p>Here your standalone app is ready to deploy on AWS lambda, create a zip of contents inside the standalone.</p><pre>cd .next/standalone<br>zip -r deploy.zip .</pre><p>Now upload deploy.zip file in AWS Lambda function.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2Zt2JDefwJW6i4VeYFs-Qw.png" /></figure><p>In the last, we need to set up environment variables that are used in our app. To run the application we need to set up two environment variables initially.</p><pre>AWS_LAMBDA_EXEC_WRAPPER = /opt/bootstrap<br>PORT = 8000</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*m79iNLSi4L_3QBqSwiKvig.png" /></figure><p>Our deployment is finished here, you can test now using the Function URL.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_kjfmZaeTdNNXegZM8Nphw.png" /></figure><p>You can see logs in Monitor -&gt; View Cloud Logs to see SSR logs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*57AUj_zJPQNxVicxxObEeg.png" /></figure><p>The Next.js app is ready to use. To deploy your app just need to set the Function URL to Cloudfront Origin.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XvqieDo9LlMfe5FKKKITiA.png" /></figure><h3>Conclusion</h3><p>Here I was implying the Next.js app deployment that is easy to maintain, watch, and scale. After setting up this infrastructure it is easy to create a CI/CD pipeline using any CI/CD tool.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=33b667c90eef" width="1" height="1" alt=""><hr><p><a href="https://medium.com/impulsiveweb/deploy-next-js-app-with-ssr-using-aws-lambda-33b667c90eef">Deploy Next.js app with SSR using AWS Lambda</a> was originally published in <a href="https://medium.com/impulsiveweb">Impulsive Web</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Retrofit multiple file upload with progress in android]]></title>
            <link>https://medium.com/impulsiveweb/retrofit-multiple-file-upload-with-progress-in-android-82634b494df3?source=rss----8d6c49df0dbf---4</link>
            <guid isPermaLink="false">https://medium.com/p/82634b494df3</guid>
            <category><![CDATA[retrofit2]]></category>
            <category><![CDATA[retrofit-upload-progress]]></category>
            <category><![CDATA[android]]></category>
            <category><![CDATA[upload-file-with-progress]]></category>
            <category><![CDATA[multiple-file-upload]]></category>
            <dc:creator><![CDATA[Sheetal Kumar Maurya]]></dc:creator>
            <pubDate>Fri, 29 May 2020 05:20:43 GMT</pubDate>
            <atom:updated>2020-05-29T05:20:43.698Z</atom:updated>
            <content:encoded><![CDATA[<p>Upload file in a Mobile Application is a general task for a developer. But when you need progress with file upload, it goes complex to manage due to data will transfer in multiple parts. Some other issue is there to get the sequence of file upload, Total progress, Which file is uploading, etc is a critical task to do. Here I have created a class to make multiple file upload easy for all developers with the retrofit library.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*JPPS32UzwyJYEOm_rks_SA.gif" /></figure><p>I have created a class FileUploader that usage Retrofit Library for connecting to API. To upload the file the code skeleton is as follow:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8d3e89744b60f71849bf103172be28de/href">https://medium.com/media/8d3e89744b60f71849bf103172be28de/href</a></iframe><p>fileUploader.uploadFiles() function takes 5 arguments.</p><p>1. API endpoint</p><p>2. API file key</p><p>3. An array of the File object (Files to be upload)</p><p>4. Callbacks</p><p>5. Authorization Token (Optional, pass it API require auth token)</p><h3>A full example of MainActitity.java is as below:</h3><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a6ba2a95d504b43970582af70de73848/href">https://medium.com/media/a6ba2a95d504b43970582af70de73848/href</a></iframe><h3>ApiClient.java</h3><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e018b3e5c162277e3dd9255f4390638a/href">https://medium.com/media/e018b3e5c162277e3dd9255f4390638a/href</a></iframe><h3>FileUploader.java</h3><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/0a09f730c0068355ef991ac07f0f0f79/href">https://medium.com/media/0a09f730c0068355ef991ac07f0f0f79/href</a></iframe><p>You can download the full working code sample from GitHub.</p><p><a href="https://github.com/sheetalkumar105/retrofit-multiple-file-upload-with-progress">sheetalkumar105/retrofit-multiple-file-upload-with-progress</a></p><p>For any other assistance, you can visit DevStudioOnline.</p><p><a href="https://devstudioonline.com/article/retrofit-multiple-file-upload-with-progress-in-android">Retrofit multiple file upload with progress in android</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=82634b494df3" width="1" height="1" alt=""><hr><p><a href="https://medium.com/impulsiveweb/retrofit-multiple-file-upload-with-progress-in-android-82634b494df3">Retrofit multiple file upload with progress in android</a> was originally published in <a href="https://medium.com/impulsiveweb">Impulsive Web</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ElectronJS — The Future of Desktop Application]]></title>
            <link>https://medium.com/impulsiveweb/electronjs-the-future-of-desktop-application-1d513689b671?source=rss----8d6c49df0dbf---4</link>
            <guid isPermaLink="false">https://medium.com/p/1d513689b671</guid>
            <category><![CDATA[desktop-app]]></category>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[electronjs]]></category>
            <dc:creator><![CDATA[Impulsive Web]]></dc:creator>
            <pubDate>Wed, 27 May 2020 11:29:17 GMT</pubDate>
            <atom:updated>2020-05-27T09:10:24.369Z</atom:updated>
            <content:encoded><![CDATA[<h3>ElectronJS — The Future of Desktop Application</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aeQpsjS8ABPsDcToJVhFJw.jpeg" /></figure><p>Desktop applications are still a force to reckon with even though there’s been a steady decline in the number of applications created thanks to the growing number of browsers and mobile devices; you can argue that desktop applications are still useful for many reasons.</p><p>Desktop applications are ever-present on your computer, connect better thanks to shortcuts and they offer faster notifications for those who delight in lightning speed.</p><p>The creation of desktop applications, on the other hand, is not as fanciful as the applications it creates. Using JavaScript, you will be able to create a codebase and package for each operating system with ease. A new method works. Nowadays, Electron JS is the tool used more often along with NW.JS.</p><h3>What is Electron?</h3><p>The electron as a framework is used for creating desktop applications in collaboration with other popular technologies such as JavaScript and CSS. It does the dirty work so you can focus on the significant areas of your application.</p><p>Electron J.S is open source and works as a cross-platform framework, which means it is compatible with Mac, Windows and Linux. Everything you need to hardcode a desktop application is inbuilt to the Electron framework including updates, notifications, and debugging features.</p><p>This framework is used by lots of developers, and this is due in part to some reasons chief of which is the runtime it provides to build desktop applications using pure JavaScript.</p><p>Once you fire up this application, a process kickstarts which interacts with the graphical user interface of the operating system. It does this by creating a file called main.js followed by application windows which are filled with rendered web pages with the power to interact with the GUI of the installed operating system.</p><p>Electron J.S is more than a framework. It is part of the computer revolution.</p><p>Electron Js has been powering some of the most famous desktop applications, and there are no signs of it slowing down anytime soon.</p><p>Here are some popular desktop applications that were built on the Electron platform:</p><h3>Torrent Desktop Apps</h3><p>When Torrent first broke out in, the whole world broke out into a frenzy. Today, we have millions of people all across the globe using torrent websites to download and share files securely. Todays, torrent files can be downloaded on a mobile phone or to your desktop computers.</p><p>There are lots of mobile apps and desktop apps for torrent websites but the most intuitive has to be the WebTorrent app which is built on Electron JS as their basic developing program.</p><p>WebTorrent also happens to be the first torrent client that works in the browser and on the desktop. It’s written in JavaScript, and it handles peer-to-peer transport through WebRTC. It works by linking the user to a decentralized browser-to-browser network that ensures the efficient sharing and transfer of files without any plugins or extensions being installed. Thanks to what it’s built on, Electron, the WebTorrent desktop version runs very fast, is lightweight and ad-free ensuring the user enjoys the experience every time it’s’ being used.</p><h3>CMS Desktop Apps</h3><p>Content Management Systems have simplified the ease at which digital content is created and managed. CMS systems differ based on the ease at which they can be installed, used, and extended.</p><p>A list of the popular content management systems used globally includes Wordpress, Drupal, Joomla, and Alfresco. Wordpress remains the most popular CMS platform, used primarily for blogging thanks to the documentation.</p><p>The WordPress Desktop application is built on Electron, and it is built on an open-source framework that makes it easier to manage Wordpress content.</p><p>While most users might access WordPress more from their browsers, WordPress for Desktop is an entirely new seamless and cross-platform experience that allows the users to focus more on content creation without all of the distractions that comes with browsers.</p><p>WordPress uses Electron due to its minimal load times allowing the writer to get its work done without music hassles. Built on Electron as the framework and JavaScript using React as its primary language.</p><p>Ghost is another open-source platform that allows users to build and run their private online publications. It’s not as popular as WordPress, but it has its tribe. You’ll find thousands of blogs to magazines and even journals using this online publication.</p><p>The Ghost Desktop app is quite intuitive and fast due to the simple and more focused style of writing.</p><p>The Ghost Desktop application is built on Electron which allows users to focus on writing by providing little things like shortcuts during writing while remaining versatile enough to manage multiple blogs. The Ghost app uses JavaScript and Node.js for delivering an excellent user experience.</p><h3>Messaging Apps</h3><p>Some of the world’s most used messaging desktop apps are built on Electron. A good example is Slack Desktop for macOS.</p><p>This app is built on the Electron framework and is responsible for its fast performance and unique look compared to what you have in the browser experience.</p><p>With the Slack Desktop app, you get to enjoy all the features you experience on the browser version plus better organization and focused workspace to communicate with your team.</p><p>Another top messaging app that is based on the Electron framework is Whatsapp Desktop Messenger App which provides more for you while working less. Thanks to the Electron framework, Whatsapp was able to streamline and revolutionize its unique messaging app as well as taking it to the next level.</p><p>The electron framework has dominated for a while and based on the number of popular desktop applications using it, we expect it to c</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1d513689b671" width="1" height="1" alt=""><hr><p><a href="https://medium.com/impulsiveweb/electronjs-the-future-of-desktop-application-1d513689b671">ElectronJS — The Future of Desktop Application</a> was originally published in <a href="https://medium.com/impulsiveweb">Impulsive Web</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Private Blockchain — Joining The Pieces Together]]></title>
            <link>https://medium.com/impulsiveweb/private-blockchain-joining-the-pieces-together-5f84a7b5c50b?source=rss----8d6c49df0dbf---4</link>
            <guid isPermaLink="false">https://medium.com/p/5f84a7b5c50b</guid>
            <category><![CDATA[blockchain]]></category>
            <category><![CDATA[blockchain-technology]]></category>
            <category><![CDATA[private-blockchain]]></category>
            <dc:creator><![CDATA[Impulsive Web]]></dc:creator>
            <pubDate>Wed, 27 May 2020 11:29:02 GMT</pubDate>
            <atom:updated>2020-05-27T09:12:41.340Z</atom:updated>
            <content:encoded><![CDATA[<h3>Private Blockchain — Joining The Pieces Together</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*w3hh9DJ1L_zKngJvHgp3NA.jpeg" /></figure><p>The blockchain is arguably one of the most brilliant inventions of the millennium and it has continued to evolve over the years. Blockchain allows for the distribution of digital information, thereby creating the chords that hold the new internet together.</p><p>Originally created by a group of people or persons called Satoshi Nakamoto, Blockchain was devised to power the first digital currency, Bitcoin but it has evolved over the years with new meaning and application ascribed to it.</p><h3>Blockchain is durable</h3><p>Like the internet, blockchain technology is quite robust and durable and this is made possible by its ability to store blocks of information that are similar across its networks — preventing control by a single entity as well as removing the incidence of a single point of failure.</p><p>When you build on the blockchain, the only problems you’ll encounter will be based on bad intentions and human error, not the underlying concepts that hold the technology.</p><h3>Blockchain and Bitcoin</h3><p>One of the most popular cases use for blockchain is for bitcoin transactions. When you send bitcoin to someone, the nodes scan the network to validate possession of those currencies and then, once the information is confirmed, the transaction gets added to a “block” which gets added to the previous block in the network and then a chain is formed — hence the name “blockchain”.</p><p>There is no single point of failure in the blockchain because transactions can’t be undone or tampered with. This can be viewed as an advantage as well as a disadvantage of using digital currencies compared to traditional financial transactions.</p><h3>Blockchain: Beyond Cryptocurrency</h3><p>Blockchain at its fundamental level is a decentralized ledger that keeps records across a peer-to-peer network. It’s the greatest advantage is the ease of transfer of assets without the need to go through a centralized third party.</p><p>Other potential application of the blockchain network includes manufacturing, automotive where fractional ownership in autonomous cars could be better managed as well as in healthcare.</p><p>For healthcare, the blockchain network can create encrypted health information for patients which could then be shared with multiple providers in a safe and secure way.</p><p>There are so many applications to the use of blockchain beyond bitcoin. It can be deployed to track and trace the origin of goods from the farm to the warehouse, where the raw materials come from, verify ownership of intellectual property, and help recover stolen goods in transit.</p><p>Blockchain application is endless and can only be limited by our imagination. The technology provides better transparency and visibility to the supply chain and increases the value of products as consumers now have detailed information on where they came from.</p><h3>Blockchain and Manufacturing</h3><p>Supply chain, identity, and data management are three key areas that blockchain can work on to revolutionize the manufacturing sector.</p><p>As a manufacturer, there are so many things you have to deal with that make transparency and accountability challenges.</p><p>These range from logistics of shipping new parts as more manufacturers are starting to shift from the traditional break-fix model to the cost-effective subscription-based model that maximizes product uptime.</p><p>This allows the manufacturers to leverage predictive analysis so they are more proactive in their maintenance culture and not just reactionary.</p><p>With Blockchain, there can be a better track and trace system put in place to enhance the visibility of this process. Blockchain at the top of its technology allows a manufacturer to see its entire global service supply chain repair parts as they move and ensure repairs are done before damage is done.</p><p>Blockchain will also ensure this data can create and maintain a shared and continually reconciled database seamlessly in a decentralized manner.</p><h3>Blockchain and Food Tech</h3><p>If we go back to the Spinach Scare of 2006, where consumers were confused about the scarcity of their beloved vegetables and then had to wait for weeks to figure out that the major problems affecting the supply of spinach were the lower elevation and the rain. With blockchain, there will be better visibility and transparency in the food chain making sure that the spinach scare of 2006 would be solved in days rather than weeks.</p><p>Today’s consumers want to be more informed about the processes involved in the production of the meals they consume.</p><p>Blockchain technology allows for that level of transparency and accountability as a consumer can look up information to trace the path their food goes through from the farm to the warehouse to their local grocery store.</p><p>They will also be informed about the ingredients as well as other preservatives that they might not want to consume. With so much spotlight on every step taken, food production will also take an ethical turn in terms of how food is grown, caught, and even slaughtered.</p><p>We could also expect new but desirable practices are kept like how animals are hunted and what they do with their skin as well as whether or not fishes are responsibly caught at sea.</p><p>Blockchain goes a long way in addressing a lot of issues that we can have and it is a track and trace dream for manufacturers. Adding Blockchain to a manufacturer’s sophisticated but complex system won’t come cheap but once it is put in motion, blockchain technology can make the processes simpler and easier.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5f84a7b5c50b" width="1" height="1" alt=""><hr><p><a href="https://medium.com/impulsiveweb/private-blockchain-joining-the-pieces-together-5f84a7b5c50b">Private Blockchain — Joining The Pieces Together</a> was originally published in <a href="https://medium.com/impulsiveweb">Impulsive Web</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Importance of UX design and how to get it right]]></title>
            <link>https://medium.com/impulsiveweb/importance-of-ux-design-and-how-to-get-it-right-9f2bf080e10e?source=rss----8d6c49df0dbf---4</link>
            <guid isPermaLink="false">https://medium.com/p/9f2bf080e10e</guid>
            <category><![CDATA[ux-design]]></category>
            <category><![CDATA[ui-ux-design]]></category>
            <category><![CDATA[ui-design]]></category>
            <dc:creator><![CDATA[Impulsive Web]]></dc:creator>
            <pubDate>Wed, 27 May 2020 11:28:53 GMT</pubDate>
            <atom:updated>2020-05-27T09:15:09.462Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iAa44k_V_bTpbKHapKUrBA.jpeg" /></figure><p>It all began when developers wanted to create user-friendly computers with simple layouts. From there, the idea of a graphical user interface (GUI) appeared and it became very easy for anyone to use a PC. There were icons, drop-down menus, and a host of other things that were attractive to the eye with easy description.</p><p>UI and UX have come a long way from beautiful screens to pages and buttons. Today, it’s about how well a user interacts with a website, app, or product. UI and UX have characterized how a user can get to point B from point A using the least amount of effort.</p><h3>Does UI/UX Matter?</h3><p>In today’s fast-paced society, the most successful products will be the ones that make it easy for the consumer to find what they want as well as those that respond quickly and efficiently to queries.</p><p>The internet is now consumer-centric and this is what the whole idea of UI and UX is about. If your product takes too much time to install compared to your competitors, be rest assured that the users will switch to your competitors.</p><p>There are a couple of concepts that are important in a user’s experience with a product:</p><ul><li>The processes they go through.</li><li>The sequence of actions they take while interacting with your product.</li><li>The thoughts that arise while using your product</li><li>The final experience or impression they take away.</li></ul><p>Every company wants to do one or two things: create new revenue streams, enhance the brand, and build customer engagement. When push comes to shove, there is nothing more important to your business than having an excellent user experience.</p><p>The right user experience will make users spend more time using the product, rave about your offerings on social media, and share the experience with their close network.</p><p>A picture can change someone’s mood, it can turn a soul. A well-developed user interface and user experience could be the difference between a startup that grows its bottom line and the ones that struggle too.</p><p>UI and UX are important. You need to design a product that stands out from the crowd and not just one that is good enough.</p><h3>User Experience</h3><p>For your product to stand among the greats, it needs to have a good UX.</p><p>This is how you get users to interact with you and some might even provide useful feedback on how you can improve further.</p><p>This type of feedback is critical as the users are the ones using the product and they can tell you first hand the areas that need strengthening.</p><p>With a laser focus on user experience, your Startup will experience higher revenues and more retention of users. No one enjoys using a product with a poor UX and oftentimes, they find it hard to have loyal users.</p><p>Once a user-centric product comes around with a better UX, the users will shift the ground and use the new product.</p><p>Companies that focus on user experience lower acquisition costs and fewer complaints. If your user experience is awesome, your best form of marketing will be your customers.</p><p>User acceptance and adoption are critical to having a successful product and that is why having a professional development partner like Impulsive Web is important.</p><h3>How do you accomplish a great user experience?</h3><p>First, you need to ask yourself some hard questions. You also need to dig deep to understand why customers would abandon the current product in favor of yours.</p><p>You also need to find out what the user expects to get from using your product. Whatever their end goal is, your job is to make it as easy as possible for them.</p><p>During the testing stage, you should expect feedback from your initial tester to validate whether or not your assumptions were correct. During this stage, be careful not to overwhelm users with too many options that they won’t need or use as well.</p><h3>User Interface</h3><p>User Interface is also important to the survival of your product. Your users might tell you they don’t judge a book by its cover, but they do. We all do.</p><p>A well-executed design will sell a product before it’s even built. From graphics and animations to a uniform layout and ease of use; the user interface encompasses the credibility and ease of using the product without getting the user confused. You want them to be excited and happy while using your product not disgruntled or pissed off.</p><p>This is why we believe it is important you hire a professional development team that can focus on creating visually captivating and easy to use UI.</p><p>The user interface in the product is equally as important as what happens in the background for the final goal to be accomplished. This is the first step in designing an efficient and simple navigation interface that can then be tested using a minimum viable product.</p><p>It is generally recommended that our Minimum Viable Product should be deployed to a small group of testers (early adopters) for feedback and to gauge interest. MVP is a smart way of building a scaled-down version of the original product.</p><p>This saves you the cost of building a product that the customer might not value and it helps you maximize the information learned from the adopters.</p><p>At Impulsive Web, we break down every tiny detail and the functionality of the product which shows you what will happen behind the scenes when a particular button is clicked on.</p><p>By considering these factors, we can identify what the user interface needs to display for the user and what the product development team needs to do for the user experience to achieve the set goals.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9f2bf080e10e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/impulsiveweb/importance-of-ux-design-and-how-to-get-it-right-9f2bf080e10e">Importance of UX design and how to get it right</a> was originally published in <a href="https://medium.com/impulsiveweb">Impulsive Web</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Front End Performance and Enhancements]]></title>
            <link>https://medium.com/impulsiveweb/front-end-performance-and-enhancements-15a890185c73?source=rss----8d6c49df0dbf---4</link>
            <guid isPermaLink="false">https://medium.com/p/15a890185c73</guid>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[performance]]></category>
            <dc:creator><![CDATA[Impulsive Web]]></dc:creator>
            <pubDate>Wed, 27 May 2020 11:28:43 GMT</pubDate>
            <atom:updated>2020-05-27T09:17:19.696Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*R79Rce3-HIyoU1yErmbQhA.jpeg" /></figure><p>The amount of time it takes users to complete multiple tasks on your site is affected by the front-end performance. How fast can they click on a button while reading through your product page? How quickly does the search results page take to load? According to Google, if a search results page takes more than half a second to load, it can decrease traffic and your ad revenue. Users expect web pages to load as fast as possible.</p><p>Knowing what your customers expect is one part of the equation. The other part is to know if you can cope or not. Designing sites with multiple rich content and lots of dynamic elements means it might be difficult to keep up.</p><h3>Design for Performance</h3><p>At the basic level, the performance of a website can be traced to the design. Everything related to performance weighs heavily on the choices made at design. It impacts the load speed and the conversion rate of your site. Every little detail needs to be questioned. What value does the wide background add? Is it causing more havoc than it is helping your site? Sometimes, you might have to do as little as bundling your images into a sprite. This could increase the total homepage size while decreasing the number of requests made. This will lead to a reduction in the entire homepage load time.</p><h3>Coding for Performance</h3><p>After designing, coding is another area that affects front-end performance. Sometimes, this could be fixed by cleaning your HTML, and everything else will follow suit. The toughest tasks here will be renaming non-semantic elements in the HTML. Theming concerning semantics like “article” and less with design, you will start reaping the rewards for your efforts. Some of these elements end up in our code due to the need to have more weight in CSS selectors. The right way to go will be to clean up our CSS while adding more specificity but we end up adding IDs that are unnecessary and other elements to our HTML.</p><p>Once you’re done with theming semantics together, you should clean up your CSS to eliminate inefficient selectors. Inefficient selectors have a way of increasing page load time, and they are harder to re-design or customize. Efficient CSS selectors are easier to redesign making them quicker to customize the design and styles in the future. Good code is easier to edit, and an editable code leads to good front-end performance.</p><p>The third stage is purging your HTML of div-itis. The goal here is to ensure your markup ends up cleaner so the CSS will become smaller and easier to redesign and edit. That way, you end up saving lots of development time and page load time.</p><p>Finally, work on creating repurposable code which will also save you time and results when loading your CSS and HTML files. This makes it easier to maintain and redesign your files later and keep them in smaller page sizes.</p><h3>Optimizing</h3><p>You have to optimize requests so your site will request fewer ones. Requests occur when the site has to fetch a file or a record. The cleaner the markup, the more infrequent requests the browser has to make, and the less time the user will spend waiting for the browsers to send that information back.</p><p>Cleaning the markup is not the destination. JavaScript requests have to be minimized as well, so they only load when it’s necessary. For instance, you don’t have to load a JavaScript file on a mobile design that is only needed for larger screens. You can also configure the site to load JavaScript asynchronously — this ensures the script won’t block any of your content while rendering.</p><p>For most sites, a responsive design means more images and CSS files loading, which increases the weight of the requests. You can still get faster load times when the number of requests has been optimized, so only important details are loaded.</p><h3>Optimizing Images</h3><p>The first step here is to focus on creating sprites — this ensures you save as many image requests as you can. Creating sprites can reduce the page load time by as much as 10%. After creating sprites, clean up the images by creating one sprite for repeating backgrounds. For no-repeat backgrounds, you can create one transparent sprite for this, inclusive of your logo and icons. At this stage, you will need a tool that will figure out how best to serve your images to your users. After regenerating the images, optimize them by making them smaller with a tool like ImageMagick, TinyPNG and etc.</p><h3>Measuring Front-End Performance</h3><p>What is not measured cannot be changed. You have to determine whether your efforts are paying off. This will include using Google’s PageSpeed or YSlow by Yahoo!. These tools will also give you more suggestions on how to improve your page load time, elements blocking faster page rendering, and how to optimize the social scripts on your page.</p><p>Front-end performance will always affect your users, and it is your job to understand how it works, measure it, and improve it for a better page load time. A faster front-end performance will lead to better conversion rates for your business, and it will ensure your site accomplish all that it wants to in a short amount of time.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=15a890185c73" width="1" height="1" alt=""><hr><p><a href="https://medium.com/impulsiveweb/front-end-performance-and-enhancements-15a890185c73">Front End Performance and Enhancements</a> was originally published in <a href="https://medium.com/impulsiveweb">Impulsive Web</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Progressive Web Apps (PWA)]]></title>
            <link>https://medium.com/impulsiveweb/progressive-web-apps-pwa-ded19976529f?source=rss----8d6c49df0dbf---4</link>
            <guid isPermaLink="false">https://medium.com/p/ded19976529f</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[progressive-web-app]]></category>
            <category><![CDATA[mobile-web]]></category>
            <category><![CDATA[pwa]]></category>
            <dc:creator><![CDATA[Impulsive Web]]></dc:creator>
            <pubDate>Wed, 27 May 2020 11:28:33 GMT</pubDate>
            <atom:updated>2020-05-27T10:41:50.280Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qeaPBtudXa1BfEF0-dlzIQ.jpeg" /></figure><p>Progressive web apps are no doubt the in-thing in today’s mobile-first business world. This new app has been piped to elicit a paradigm shift in the mobile world.</p><p>Even businesses that have invested technological resources in developing local mobile apps are prospecting what it could look like when you have the PWA. These businesses know that the uniqueness of the Power web apps could outshine the longevity of their native apps.</p><p>Companies that are yet to devote their resources in a mobile app are now considering the option of making PWA their first resort because they look more economical and relatively easier than the task of developing an entirely new app experience. To put succinctly, all businesses know that the PWA comes with the comparative advantage of a superior web-based app experience that would outshine the features of any native app.</p><h3>Progressive Web App</h3><p>The platform-locked design and difficulty to access are some of the restrictions symptomatic of native apps. The PWA which was introduced by Google in 2015 has a unique level of functionality beyond these restrictions.</p><p>The distinctive features, therefore, prompted the term progressive web apps. PWA delivers a rare experience incorporating the excellent features found in native apps coupled with the simplicity and unrestricted access to the web.</p><p>It is a web-based, app experience. In other words, PWA acts just like a native app but has the merit of being accessible through a mobile web browser.</p><p>Thus, the features and functionality are maintained while more users can still easily be connected to the app. By so doing, users are bound to experience functionality better than what is obtained in native apps.</p><h3>Progressive Web Apps Futuristic Suitability</h3><p>PWAs tend to outshine mobile apps in the nearest future. It is being suggested that mobile-app are most likely to deliver web-based experiences in the nearest future. Some might remain skeptical of this position going by the number of native apps that mobile users subscribe to on their phones without the web.</p><p>PWAs come with novel opportunities that are not peculiar to native apps. Firstly, most mobile phone users are not acquainted with the existence of an app until they access other apps such as the App Store or Google Play. The stressful experience of downloading the app and installing it could be discouraging. Some phone users would not even bother searching for apps at all.</p><p>Progressive web apps do not require such a tedious process just to gain access. Users can be connected to app experience via a URL link which makes it easy to share with others.</p><p>Phone users would surely savor the experience of merely getting connected to an app through a link.</p><p>Accessibility could not have been much easier. Thus, apps could become even more popular than social media platforms when users know that all they require is just to copy and then paste on their friends’ wall. The ability to share progressive web apps will make native apps look outdated and obsolete in no time.</p><h3>Hybrid Approach</h3><p>If one is to look at the debate between PWAs and native apps from another facet, it might be rational to conclude that the presence of both types of the app will simply offer a diversity of technological options.</p><p>It means mobile companies willing to carve a niche for in their market could offer both the web-based and native versions of the same app.</p><p>Companies that have invested in the development of native apps might explore this option in order not to see their investment going down the drain due to a shift in the paradigm.</p><p>This hybrid approach flourishes where the two options deviate. Brands can leverage on offering a more comprehensive and all-encompassing experience when they have both versions in their kitty.</p><p>PWAs require a lot of power and therefore have a drawback bothering on the lack of performance. Native apps, however, do not have such drawbacks since they do not rely on performance-based features. The hybrid approach will fill the gap left by both versions and deliver an all-around app experience to users.</p><p>Thus, companies adopting this hybrid approach could leverage on the accessibility of their power web apps and gain more popularity in the process.</p><p>Subscribers can then further urge to obtaining the full native app and enjoy the more comprehensive features. From another shrewd business perspective, PWAs can be exploited for one-time experiences that will create more of a passing craze. For instance, a well-known brand attempting to diversify in its production could release a PWA to aid the market transition and consumer awareness with low marketing overheads being expended.</p><p>The native apps will then still retain the basic performance-oriented experiences of the new product.</p><h3>Why PWAs Might Still Define the Future</h3><p>App fatigue is one of the maladies affecting mobile users. There seems to be a growing apathy among consumers with many among them not even taking time to check for the latest apps let alone download them.</p><p>App stores have tried checking this fatigue by getting rid of old apps that are not being updated or downloaded. There is however still almost 1.5 million apps that are yet to be downloaded.</p><p>Most phone users have become frugal with the availability of space on their phone. Many mobile users often feel that they have more than enough apps on their phone which chunk data storage and affects the speed and performance of the phone itself.</p><p>PWAs are instantaneous inaccessibility. It does not chunk space like the native apps and therefore has the money to combat app fatigue of mobile phone users.</p><p>Users also have the choice of merely saving the PWA’s link if it would not constitute even the most infinitesimal burden. And even if it does, accessing the experience comes by merely entering the URL into a mobile browser.</p><p>The flexibility is unique. With Google being the brain behind it, PWA’s are most likely to dictate the tempo in the nearest future.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ded19976529f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/impulsiveweb/progressive-web-apps-pwa-ded19976529f">Progressive Web Apps (PWA)</a> was originally published in <a href="https://medium.com/impulsiveweb">Impulsive Web</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Marine Geotagging]]></title>
            <link>https://medium.com/impulsiveweb/marine-geotagging-a7b389d8516f?source=rss----8d6c49df0dbf---4</link>
            <guid isPermaLink="false">https://medium.com/p/a7b389d8516f</guid>
            <category><![CDATA[marine]]></category>
            <category><![CDATA[geotag]]></category>
            <category><![CDATA[postgis]]></category>
            <category><![CDATA[geotagging]]></category>
            <category><![CDATA[postgresql]]></category>
            <dc:creator><![CDATA[Impulsive Web]]></dc:creator>
            <pubDate>Wed, 27 May 2020 11:28:22 GMT</pubDate>
            <atom:updated>2020-05-27T10:52:42.601Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3lxqXYC-w7B3gGoauOwbug.jpeg" /></figure><h3>Requirements</h3><p>One of our clients has a tremendous amount of geo-coordinates from marine traffic across the globe and they wanted to geotag each coordinate for Marine Region, IHO Sea, Country, and Sovereign.</p><h4>Data Required for each coordinate</h4><p>Marine Region, IHO Sea, Country, and Sovereign</p><h4>Conditions</h4><p>If any of the above data is not available find the nearest data</p><h3>Problem</h3><p>Marine Geotagging has several challenges in terms of data availability with the latest and enough information, huge cost involves purchasing Geolocation APIs either from Google or any other service provider and when you have more than 500 Billion coordinates to geotag the problem become more challenging.</p><p>A summary of the major problems are as follows:</p><ul><li>More than 500 Billion geo-coordinates</li><li>Not has enough budget to spend on third-party Geolocation services like Google and etc.</li><li>A very limited resource to calculate this amount of data</li></ul><h3>Third-Party APIs</h3><p>There are many third-party Geolocation Service APIs available to Geotag GPS coordinates and find the required information. The problem with these APIs are</p><ul><li>They are very slow as geotagging takes time</li><li>Very costly, mostly per coordinate basis</li><li>Not available for all the Marine Regions</li></ul><p>These API Services include Google Geolocation Tool, NeutrinoApi, GeoMaker APIs and etc.</p><h3>The Research</h3><p>We have started our research keeping two things in our mind</p><ul><li>A super fast and reliable solution</li><li>Data accuracy for at least 100 meters radius</li></ul><p>We have divided the problem into two major steps, one is to find a reliable approach with accuracy, test the same on a small chunk of data, and finally scale the same solution for all 500 billion records.</p><p>After a week of effort and energy spend in the same direction we find out that the shapefile approach is the only reliable solution that will have the desired accuracy on the data.</p><h3>The Solution — Part 1</h3><p>The solution was very simple, find or create a multi-polygon shapefile for Marine Regions including required information like Marine Region name, IHO Sea, Country, and Sovereign.</p><p>Match all 500 billion geo-coordinates against this shapefile and check if it exists within any polygon into the shapefile.</p><p>If not contains within the polygon, find the nearest polygon to that coordinate.</p><h4>Shapefile</h4><p>Finding shapefile on open source was very difficult and we have spent enough time searching on various shape file repositories looking for the exact shapefile, we have found few but was not enough and we have started thinking to create our own using QGis.</p><p>Soon we realize that creating an accurate shapefile will take a lot of time and effort and best case scenario if we will be able to create the desired shapefile mapping the same with Marine Region and other required information will be another problem to solve.</p><p>Luckily, we have found one shapefile containing 525 polygons with the required information. Intersect_IHO_EEZ_v2_2012.zip available for free <a href="http://www.marineregions.org/downloads.php">http://www.marineregions.org/downloads.php</a></p><p>This file contains information in every polygon</p><ol><li>MarRegion — Marine Region</li><li>MARGID — Marine Region Group ID</li><li>IHO_Sea — IHO Sea information</li><li>IHO_ID — IHO Sea ID</li><li>IHO_MARGID — IHO Marine Region Group ID</li><li>EEZ -</li><li>EEZ_ID -</li><li>Country — Country of the region</li><li>Sovereign — Sovereign of the region</li><li>Sov_ID — Sovereign ID</li><li>EEZ_MARGID — EEZ Marine Region Group ID</li><li>Latitude</li><li>Longitude</li><li>Area_m2 — Area of the Region in Meter square</li></ol><p>We have imported the shapefile in QGis and it looks like this</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/930/1*8vBg4fag1SxYsAMbi71OYQ.jpeg" /></figure><h4>Python</h4><p>Initially, we have tried Python to process the shapefile using the PyShp package and match our test data (GPS coordinates) with the polygons and check if they fall within any of these 525 polygons.</p><p>This was a working solution, we were able to match our test records and find the desired information from the shapefile but it was very slow.</p><p>The problem was the linear match of the 525 shapes against all the records, we have tested the solution against a smaller data size (10000 geo-coordinates) and it took more than ~14 minutes to process on my machine (MacBook Pro, i7, 16GB RAM, 512GB SSD), we needed a different approach as the data was very huge (500 billion geo-coordinates)</p><h4>Postgre</h4><p>We have been using Postgre for a long time and have used in quite a few of our projects as an alternative to MySQL but we have never used Postgre with any plugin.</p><p>While researching about the same we find out about PostGIS a Postgre plugin for Geospatial data, we have installed and started looking into the same.</p><p>The result was pretty amazing, it was able to process 10000 geo-coordinates in less than ~0.02 seconds as it was using indexes on the 525 shapes we have imported into the PostGIS.</p><p>We have decided to dig more into PostGIS to make it even faster to process all 500 billion geo-coordinates at once.</p><p>Later, we realized that it is not that easy to process 500 billion records at once and we must divide the same into smaller chunks and it worked.</p><ol><li>Split the main CSV file containing 500 billion geo-coordinates to 1000 CSV files containing 500 million geo-coordinates each using Python.</li><li>Written a Postgre function to read the CSV file from disk and import into a Postgre table</li><li>Generate point using longitude and latitude and store into the same table</li><li>Match each point against the 525 polygons if they fall within any of them</li><li>Store the matching ID of the shapes into the same table</li><li>Populate a new table with matching records along with the geo-coordinates</li></ol><h3>The Solution — Part 2</h3><p>The actual implementation, commands, and table and data format are as follows:</p><h4>Splitting CSV</h4><p>The actual CSV of all records contains only two columns for longitude and latitude and have more than 500 billion records,</p><p>The first step to split the CSV into 1000 CSVs containing only 500 million records each. We have used Python to do the same</p><pre># split CSV for every 1 million records<br># Filename will be <br>csvfile = open(&#39;all_records.csv&#39;, &#39;r&#39;).readlines()<br>filename = 1<br>for i in range(len(csvfile)):<br>    if i % 1000000 == 0:<br>      open(str(filename) + &#39;.csv&#39;,&#39;w+&#39;).writelines(csvfile[i:i+1000000])<br>      filename += 1</pre><p>After running the above, we have 1000 CSV files containing 1 million records each.</p><h4>Postgre Import — Shapefile</h4><p>We have used shp2pgsql command from PostGIS to import shapefile into Postgre</p><pre>shp2pgsql -I -s   . | psql -U postgres -d ;</pre><h4>Postgre Import — CSV</h4><p>To import CSV file in Postgre we have used COPY command of Postgre, see the documentation on below link</p><p><a href="https://fiddle.jshell.net/%22https://www.postgresql.org/docs/9.2/static/sql-copy.html/%22">https://www.postgresql.org/docs/9.2/static/sql-copy.html</a></p><pre>COPY lat_long (long, lat) FROM &#39;/path/to/csv-1.csv&#39; WITH DELIMITER &#39;,&#39;;</pre><h4>Postgre (PostGIS) — Make Point</h4><p>We only have longitude and latitude in our records and to match the same with shapes we need a point, so we have used ST_MakePiont command to generate point from the given longitude and latitude</p><pre>UPDATE oceans.all_records SET geom = ST_MakePoint(long, lat);</pre><p>See the ST_MakePoint documentation at below link</p><p><a href="https://fiddle.jshell.net/%22http://www.postgis.net/docs/ST_MakePoint.html/%22">http://www.postgis.net/docs/ST_MakePoint.html</a></p><h4>Postgre — If the point is within the shape</h4><p>To check if a point is within the shape we have used the ST_Within method of PostGIS</p><pre>CREATE OR REPLACE FUNCTION GET_SID(p geometry)<br>RETURNS INTEGER AS $$<br>ndeclare result INT; <br>BEGIN <br>SELECT id INTO result<br>FROM oceans.shapes<br>WHERE ST_Within(geom, p) IS NOT NULL; <br>return result; <br>END;<br>$$ LANGUAGE plpgsql;</pre><pre>UPDATE oceans.all_records SET sid = GET_SID(geom);</pre><p>We have created a function that takes POINT geometry as input and returns the Shape ID which contains the passed geometry.</p><p>Using the UPDATE statement we have updated our all_records table.</p><h4>Postgre — Nearest shape</h4><p>There are few records that don’t have shape information as they are not within any of the 525 shapes we have imported, to add the nearest shape into those records we have used ST_Distance method from PostGIS.</p><pre>CREATE OR REPLACE FUNCTION GET_SID_MIN_DISTANCE(d geometry)<br>RETURNS INTEGER AS $$ <br>declare   distance INT; <br>id INT;<br>BEGIN <br>SELECT Min(ST_Distance(s.geom, d)) AS distance, s.id<br>INTO distance, id<br>FROM oceans.shapes AS s <br>GROUP BY s.gid<br>ORDER BY distance <br>LIMIT 1; <br>return sid; <br>END;<br>$$ LANGUAGE plpgsql;</pre><pre>UPDATE oceans.all_records SET sid = GET_SID_MIN_DISTANCE(geom) WHERE sid IS NULL;</pre><p>We have created a function GET_SID_MIN_DISTANCE which takes POINT geometry and returns the minimum distance shape from the shapes table.</p><p>Using UPDATE command we have updated the rest of the SIDs in the all_records table.</p><p>After all the above operations we have the all_records table with SID containing Shape ID from shapes table, which can be directly joined to populate the final records including Marine Region, IHO Sea, Country, Sovereign from Shapes and Longitude, Latitude from Records.</p><pre>SELECT p.lat, p.long, s.marregion, s.iho_sea, s.country, s.sovereign<br>FROM oceans.all_records AS p<br>JOIN oceans.shapes AS s<br>ON p.sid;</pre><h3>Conclusion</h3><p>By spending time on research we were able to Geotag all the 500 billion geo-coordinates with the matching records without spending a huge amount of money on third-party Geo Tagging services.</p><p>When there is a challenge we tend to spend most of the time researching, reading, and testing various available options to find the best fit within the requirements and budget. Sometimes it takes a while to make a decision but knowing the boundary is very important.</p><p>We are not saying that spend most of the time in research for everything, there are things which lots of people have already spent the time it required we should leverage their effort and try not to reinvent the wheel but we should double-check the environment that specific solution is designed or developed.</p><p>Let us know if have faced similar challenges, we would be really happy to know how you have overcome and what you have built.</p><p>Cheers!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a7b389d8516f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/impulsiveweb/marine-geotagging-a7b389d8516f">Marine Geotagging</a> was originally published in <a href="https://medium.com/impulsiveweb">Impulsive Web</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Automated performance testing with JMeter]]></title>
            <link>https://medium.com/impulsiveweb/automated-performance-testing-with-jmeter-e8b6adf72563?source=rss----8d6c49df0dbf---4</link>
            <guid isPermaLink="false">https://medium.com/p/e8b6adf72563</guid>
            <category><![CDATA[performance-testing]]></category>
            <category><![CDATA[jmeter]]></category>
            <category><![CDATA[automation]]></category>
            <category><![CDATA[apache-jmeter]]></category>
            <dc:creator><![CDATA[Impulsive Web]]></dc:creator>
            <pubDate>Wed, 27 May 2020 11:28:13 GMT</pubDate>
            <atom:updated>2020-05-27T11:00:10.522Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*azif0tG8IRv7TV3bFubicg.jpeg" /></figure><h3>Background</h3><p>Today the key feature of any website is how fast it performs and how fast we can get the results out of it as today nobody has time to wait and stare the screen to get the desired output.</p><p>To fix that we need Performance Testing and to do performance testing we need scripts, to get the scripts we need time and a performance engineer which is a time-consuming process.</p><p>In performance testing, the most important thing is to identify the scenarios for performance, the scripts, and then to identify and analyze the results.</p><p>The most time taking and painful part in whole is the scripting so what if I say we made that easy!!</p><p>Just one click and your scripts are ready to run on any platform you need, be it LoadRunner, JMeter, Neoload, etc.</p><h3>The Problem</h3><p>Today almost every tool has the capability of recording the steps you perform on the AUT and then generating a script out of it, but the major challenge is to correlate that.</p><p>So for a nonperformance guy, the question will be “What does this correlation mean?”</p><p>Explaining that in a very layman terms is capturing the dynamic values returned by the server and then sending that with every request so that you can fool your server that the request is valid and you should get a valid response.</p><p>Now, this might seem to be a very small and easy job but let me tell you it wasn’t.</p><p>We need to dive deep into every response, rerun the scripts to find out the difference, looking into those dynamic ids and then keep correlating them with the help of regular expressions which takes a hell lot of time and effort.</p><h3>The Solution</h3><p>We initially started with a thought “what if this can be automated?” as there are many who are working on automated reporting automated load models etc but no tool has this capability to automate the core, The Scripting!!</p><p>Then the biggest question was Maybe this is not achievable because if it is then there are tech giants who would have done this, no?</p><p>But apart all we thought of giving it a try and see we get something else it will be a lesson learned.</p><p>We researched a lot and then found out a way to proceed on:</p><ul><li>Get the HAR files of each action performed from chrome.</li><li>Repeat the steps performed and get another HAR to compare.</li><li>Compare the HAR’s and get dynamic values and boundaries.</li><li>Correlate them by identifying the left and right boundaries.</li><li>Put that correlation in place of the tags.</li><li>Finally, generate a script in the desired format as per the tool and get the script ready.</li></ul><h3>Getting the HAR File</h3><p>To get the HAR we also made a recorder that can record the steps we perform and then re-run those which helped us remove one more human intervention.</p><p>The first challenge we faced was to generate the HAR and we tried Phantom JS and puppeteer but later learned that it does not have the right capabilities to create multiple HAR then we researched a bit more and finally settled on selenium with JAVA. One problem solved!!</p><h3>Comparing the HAR Files</h3><p>The next was to compare 2 HAR’s and get the differences, easy we did that in a while by storing each element as a key-value pair and later comparing them to get the results.</p><h3>Backtracking</h3><p>Now the most complicated process was to correlate them by identifying the left and right boundaries on the fly and get the values correlated. We struggled a lot in that and finally figured out that every application responds differently so we cannot automate everything at a go.</p><p>We figured out some very basic and the most common values returned which should be taken care of first and we started covering them.</p><pre>&lt;(anything) key = value (anything)/&gt; <br>&lt;(anything) key (anything) value (anything)&gt;<br>&lt;(anything) value (anything) key (anything)&gt;</pre><p>To get the values in Header, cookies, and Body</p><p>Finding the dynamic boundaries was really tough but after a lot of iterations and struggle we did that finally</p><p>Now the next challenge was to put those pieces together and create a script out of that. For this, we targeted JMeter script first and created a valid JMX out of that which can be easily run in Jmeter.</p><p>We put all the pieces together and created a tool which can just record the actions you do on the browser as a plugin and send the HAR generated to our server where our engine works and create 2 runs of the project to compare, the engine compares then and auto-generates a JMX file out of this which we can run at our servers and we will get beautiful reports out of that.</p><h3>Conclusion</h3><p>We are still enhancing our tool each and every day by adding more and more conditions in that and making the system more intelligent.</p><p>We research and try to challenge our skills and sometimes we achieve which seems impossible.</p><p>Not believing in the story? Ask a demo for the product to see it live!!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e8b6adf72563" width="1" height="1" alt=""><hr><p><a href="https://medium.com/impulsiveweb/automated-performance-testing-with-jmeter-e8b6adf72563">Automated performance testing with JMeter</a> was originally published in <a href="https://medium.com/impulsiveweb">Impulsive Web</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>