<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>mchampaneri.in</title><description></description><managingEditor>noreply@blogger.com (Manish Champaneri)</managingEditor><pubDate>Fri, 30 Oct 2026 08:59:23 +0530</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">77</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><link>http://www.mchampaneri.in/</link><language>en-us</language><xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item><title>Agent Orchestration with VS Code and GitHub Copilot (Local Agents Only) </title><link>http://www.mchampaneri.in/2026/04/agent-orchestration-with-vs-code-and.html</link><category>Github copilot</category><category>vscode</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Sat, 4 Apr 2026 22:55:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-5700834244327970178</guid><description>&lt;p&gt;&lt;/p&gt;&lt;h1&gt;Agent Orchestration with VS Code and GitHub Copilot (Local Agents Only)&lt;/h1&gt;&lt;h1&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_aYic1lkydeUBOpBcLVhS7J3U0vaEx-I7RGuEzFp0Zoc2m90Vf_cbHPAd1fFpibm-0dS9K8_Cfvz2CEdeNlafM4UwjuPn1wRbBqgJXG70iu_1ufO79SeAQBCREpAEfHafkoyate7cJrrsXZ_9CuG7YlOR6VXMZ6EwAw1j5fQT2cQIdboYDtU36KEsXWg/s1536/ChatGPT%20Image%20Apr%204,%202026,%2010_38_06%20PM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="1024" data-original-width="1536" height="427" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_aYic1lkydeUBOpBcLVhS7J3U0vaEx-I7RGuEzFp0Zoc2m90Vf_cbHPAd1fFpibm-0dS9K8_Cfvz2CEdeNlafM4UwjuPn1wRbBqgJXG70iu_1ufO79SeAQBCREpAEfHafkoyate7cJrrsXZ_9CuG7YlOR6VXMZ6EwAw1j5fQT2cQIdboYDtU36KEsXWg/w640-h427/ChatGPT%20Image%20Apr%204,%202026,%2010_38_06%20PM.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/h1&gt;&lt;p&gt;Agent orchestration is becoming a key pattern in AI-assisted development. Instead of relying on a single assistant, developers can coordinate multiple specialized agents that collaborate to complete complex workflows.&lt;/p&gt;&lt;p&gt;This article focuses strictly on local agents within GitHub Copilot in Visual Studio Code. It does not cover background agents or cloud agents.&lt;/p&gt;&lt;p&gt;&lt;b&gt;Scope of this article:&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Local agent capabilities in VS Code&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Agent handoff for orchestration&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Use of skills&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Reference implementation&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h2&gt;Focus on Local Agents&lt;/h2&gt;&lt;p&gt;Local agents operate entirely within the VS Code environment.&lt;/p&gt;&lt;h3&gt;Characteristics&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Execute inside the editor session&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Provide fast, interactive responses&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Work with local files and context&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;No dependency on external execution pipelines&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Why Local Agents&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Immediate feedback loop&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Better developer control&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ideal for iterative workflows&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Lower complexity compared to distributed systems&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;b&gt;Key idea:&lt;/b&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Local agents are sufficient to build effective multi-agent orchestration without involving external systems&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;br /&gt;&lt;h3 style="text-align: left;"&gt;&lt;strong data-end="1176" data-start="1088"&gt;&lt;span style="background-color: white; color: #444444;"&gt;&#128528;&amp;nbsp; &amp;nbsp;Prefer executable knowledge over written explanations?&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;h3 style="text-align: left;"&gt;&lt;strong data-end="1176" data-start="1088"&gt;&lt;span style="background-color: white; color: #444444;"&gt;You might want to begin here:&lt;/span&gt;&lt;/strong&gt;&lt;/h3&gt;&lt;h3 style="text-align: left;"&gt;&lt;a class="decorated-link" data-end="1222" data-start="1179" href="https://github.com/groupzer0/vs-code-agents" rel="noopener" target="_new"&gt;&lt;span style="font-size: medium;"&gt;https://github.com/groupzer0/vs-code-agents&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-size: medium;"&gt;[ This is not my repo, Nor I'm contributer, I'm one of who gave a star &#127775; for good agents.&amp;nbsp; &#128513; ]&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;h2&gt;&lt;hr /&gt;&lt;br /&gt;&lt;/h2&gt;&lt;h2&gt;VS Code GitHub Copilot Local Agent Model&lt;/h2&gt;&lt;p&gt;Within the scope of local agents, Copilot acts as a multi-role system rather than a single assistant.&lt;/p&gt;&lt;h3&gt;Role-based Local Agents&lt;/h3&gt;&lt;p&gt;You can structure agents based on responsibilities:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Planning Agent&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Breaks down tasks&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Defines approach and steps&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Implementation Agent&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Writes and modifies code&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Executes instructions from planning&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Review Agent&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Validates code&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Suggests improvements&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Debug Agent&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Identifies issues&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Proposes fixes&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Key Concept&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Multiple logical agents can operate within the same local environment&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Separation is defined by prompts, roles, and instructions rather than infrastructure&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h2&gt;Agent Handoff for Local Orchestration&lt;/h2&gt;&lt;p&gt;Agent handoff enables coordination between local agents.&lt;/p&gt;&lt;h3&gt;Definition&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Transfer context and responsibility from one agent to another within the same environment&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;How It Works (Local Context)&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;One agent completes a step&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The next agent continues using the same context&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;No external execution required&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Example Workflow&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Planning Agent&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Defines feature structure&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Handoff to Implementation Agent&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Generates code&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Handoff to Review Agent&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Validates output&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Handoff to Debug Agent (if needed)&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Fixes issues&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Benefits&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Clear separation of concerns&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Improved output quality&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Easier iteration and refinement&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h2&gt;Use of Skills with Local Agents&lt;/h2&gt;&lt;p&gt;Skills enhance local agents by providing reusable capabilities.&lt;/p&gt;&lt;h3&gt;Definition&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Predefined instruction sets or modules&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Automatically used when relevant&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Role in Local Orchestration&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Reduce repetitive prompting&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Standardize execution&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Improve consistency across agents&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Examples&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Generate API endpoints&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Create test cases&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Refactor code&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Enforce coding standards&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Key Insight&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Skills act as a reusable capability layer within local agent workflows&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h2&gt;Orchestration Patterns Using Local Agents&lt;/h2&gt;&lt;h3&gt;Sequential Flow&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Planning → Implementation → Review → Debug&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Iterative Loop&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Implementation → Review → Fix → Review&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Parallel Thinking (Conceptual)&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Multiple approaches generated, then evaluated&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Skill-driven Execution&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Agents invoke predefined skills instead of relying only on prompts&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h2&gt;Reference Repository&lt;/h2&gt;&lt;p&gt;A practical implementation can be found here:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/groupzer0/vs-code-agents"&gt;https://github.com/groupzer0/vs-code-agents&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;What to Explore&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Agent role definitions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Structured workflows&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Reusable configurations&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Key Takeaways&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Local agents can be organized effectively using simple configuration patterns&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Complex orchestration does not require distributed systems&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h2&gt;How to Build a Local Agent System&lt;/h2&gt;&lt;h3&gt;Step 1: Define Roles&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Assign clear responsibilities to each agent&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Keep roles focused and minimal&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Step 2: Structure Prompts&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Use consistent instructions&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Maintain clarity between agents&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Step 3: Design Handoffs&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Define when and how control shifts between agents&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Step 4: Add Skills&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Identify repeatable tasks&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Convert them into reusable modules&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Step 5: Iterate&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Continuously refine roles, prompts, and flows&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Local agents in VS Code with GitHub Copilot provide a powerful foundation for agent orchestration.&lt;/p&gt;&lt;p&gt;Key points:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Entire workflow runs within the editor&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;No dependency on background or cloud agents&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Handoff enables coordination between roles&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Skills improve efficiency and consistency&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;This approach allows developers to build structured, multi-agent systems while keeping execution simple and fully local.&lt;/p&gt;&lt;span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&lt;!--more--&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;&lt;!--more--&gt;&lt;/span&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_aYic1lkydeUBOpBcLVhS7J3U0vaEx-I7RGuEzFp0Zoc2m90Vf_cbHPAd1fFpibm-0dS9K8_Cfvz2CEdeNlafM4UwjuPn1wRbBqgJXG70iu_1ufO79SeAQBCREpAEfHafkoyate7cJrrsXZ_9CuG7YlOR6VXMZ6EwAw1j5fQT2cQIdboYDtU36KEsXWg/s72-w640-h427-c/ChatGPT%20Image%20Apr%204,%202026,%2010_38_06%20PM.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Three ways to use user defined vscode snippets</title><link>http://www.mchampaneri.in/2022/05/three-ways-to-use-user-defined-vscode.html</link><category>Awesome</category><category>IDE</category><category>tools</category><category>vscode</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Mon, 30 May 2022 21:35:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-5209499976811529689</guid><description>&lt;h2 style="text-align: left;"&gt;What are code snippets?&lt;/h2&gt;&lt;div style="text-align: left;"&gt;Code snippets are templates that make entering repeated code patterns, such as loops or conditional statements,&amp;nbsp; easier.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 style="text-align: left;"&gt;Types of snippets&lt;/h2&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Built-in snippets&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;Vscode has built-in snippets for number of languages like &lt;span style="color: #e69138;"&gt;PHP, Javascript, Typescript etc&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Snippets available on market place&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&amp;nbsp;There custom snippets averrable on marketplace for specific frameworks / languages and platforms as well. For example snippets for &lt;span style="color: #e69138;"&gt;VUE, Laravel&lt;/span&gt; etc.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;User defined snippets&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;You can defined your own snippets, It's called user defined snippets. You can create snippets according to your need using the snippet templates.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 style="text-align: left;"&gt;Ways you can use user defined snippets&lt;/h2&gt;&lt;div&gt;You can use snippets in several way. Like generating fixed static code or generating &lt;u&gt;code with placeholders&lt;/u&gt;&amp;nbsp;according to your need.&lt;/div&gt;&lt;h3 style="text-align: left;"&gt;Snippet for fixed static code&amp;nbsp;&lt;/h3&gt;&lt;div&gt;You can create a snippet to insert the fixed static code, which is fixed but you need to add that in several places. You can use snippet in this case.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;For example, You need to add copyright in every page footer.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class="html4strict" style="background-color: white; box-sizing: border-box; margin-bottom: 1rem; margin-top: 0px; overflow: auto;"&gt;&lt;ol style="box-sizing: border-box; color: #212529; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin-bottom: 1rem; margin-top: 0px; white-space: normal;"&gt;&lt;li style="box-sizing: border-box;"&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;lt;&lt;span style="box-sizing: border-box; color: black;"&gt;p&lt;/span&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;Copyright&amp;nbsp;@&amp;nbsp;2020&amp;nbsp;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;lt;&lt;span style="box-sizing: border-box; color: #66cc66;"&gt;/&lt;/span&gt;&lt;span style="box-sizing: border-box; color: black;"&gt;p&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;You can create a snippet for it like,&lt;/div&gt;&lt;div&gt;&lt;pre class="app__pre" style="background-color: white; border-radius: 2px; border: none; box-shadow: rgba(0, 0, 0, 0.25) 0px 0px 0px 1px inset; box-sizing: border-box; flex: 1 1 0%; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 16px; resize: none; user-select: all;"&gt;&lt;span style="font-family: Source Code Pro;"&gt;"Add copyright text": {
  "prefix": "copyright",
  "body": [
    "&amp;lt;p&amp;gt; Copyright @ 2020 &amp;lt;/p&amp;gt;"
  ],
  "description": "Add copyright text"
}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style="text-align: left;"&gt;Snippet as template with placeholders&lt;/h3&gt;&lt;div&gt;You can create a snippet for the repetitive code block have changes in some fixed attributes.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;For example,&amp;nbsp; Form Input of of bootstrap. In this case you just need to change the Label and type of text.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;pre class="html4strict" style="background-color: white; box-sizing: border-box; color: #212529; font-size: 14.4px; margin-bottom: 1rem; margin-top: 0px; overflow: auto;"&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre class="html4strict" style="box-sizing: border-box; margin-bottom: 1rem; margin-top: 0px; overflow: auto;"&gt;&lt;ol style="background-color: white; box-sizing: border-box; color: #212529; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin-bottom: 1rem; margin-top: 0px; white-space: normal;"&gt;&lt;li style="box-sizing: border-box;"&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;lt;&lt;span style="box-sizing: border-box; color: black;"&gt;div&lt;/span&gt;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #000066;"&gt;class&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="box-sizing: border-box; color: red;"&gt;"mb-3"&lt;/span&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;lt;&lt;span style="box-sizing: border-box; color: black;"&gt;label&lt;/span&gt;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #000066;"&gt;for&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="box-sizing: border-box; color: red;"&gt;"exampleFormControlInput1"&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #000066;"&gt;class&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="box-sizing: border-box; color: red;"&gt;"form-label"&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Email&amp;nbsp;address&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;lt;&lt;span style="box-sizing: border-box; color: #66cc66;"&gt;/&lt;/span&gt;&lt;span style="box-sizing: border-box; color: black;"&gt;label&lt;/span&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;lt;&lt;span style="box-sizing: border-box; color: black;"&gt;input&lt;/span&gt;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #000066;"&gt;type&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="box-sizing: border-box; color: red;"&gt;"email"&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #000066;"&gt;class&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="box-sizing: border-box; color: red;"&gt;"form-control"&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #000066;"&gt;id&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="box-sizing: border-box; color: red;"&gt;"exampleFormControlInput1"&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #000066;"&gt;placeholder&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #66cc66;"&gt;=&lt;/span&gt;&lt;span style="box-sizing: border-box; color: red;"&gt;"name@example.com"&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;&amp;lt;&lt;span style="box-sizing: border-box; color: #66cc66;"&gt;/&lt;/span&gt;&lt;span style="box-sizing: border-box; color: black;"&gt;div&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-family: times;"&gt;In the above code block, Things that will be changed per block is,&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span style="font-family: times;"&gt;Label value&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: times;"&gt;Label for value&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: times;"&gt;Input type&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: times;"&gt;Id of input&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: times;"&gt;and Placeholder value&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;We can create template for form-input like this,&lt;/div&gt;&lt;div&gt;&lt;pre class="app__pre" style="background-color: white; border-radius: 2px; border: none; box-shadow: rgba(0, 0, 0, 0.25) 0px 0px 0px 1px inset; box-sizing: border-box; flex: 1 1 0%; font-family: inherit; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 16px; resize: none; user-select: all;"&gt;"Form input block": {
  "prefix": "form-input",
  "body": [
    "&amp;lt;div class=\"mb-3\"&amp;gt; ",
    "    &amp;lt;label for=\"&lt;span style="color: #a64d79;"&gt;$2&lt;/span&gt;\" ",
    "          class=\"form-label\"",
    "    &amp;gt;",
    "         &lt;span style="color: #674ea7;"&gt; $1&lt;/span&gt;",
    "    &amp;lt;/label&amp;gt; ",
    "    &amp;lt;input type=\"&lt;span style="color: #3d85c6;"&gt;$3&lt;/span&gt;\" ",
    "     class=\"form-control\" ",
    "     id=\"&lt;span style="color: #a64d79;"&gt;$2&lt;/span&gt;\" ",
    "     placeholder=\"&lt;span style="color: #6aa84f;"&gt;$4&lt;/span&gt;\"",
    "    &amp;gt; ",
    "&amp;lt;/div&amp;gt;&lt;span style="color: #cc0000;"&gt;$0&lt;/span&gt;"
  ],
  "description": "Form input block"
}&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here, $1, $2, $3, $4 and $0 are tab-indexed placeholders. Number after $ shows the tab index. Like $1 means first tab. $2 means second tab and so on. $0 is alway last.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;&lt;span style="color: #e69138;"&gt;Note, I'm using $2 for label for&amp;nbsp; and id of the input both, as both will be sharing the same value. So It will write on the both places using multi cursor.&amp;nbsp; Cool, Right!&lt;/span&gt;&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style="text-align: left;"&gt;&lt;span&gt;&lt;!--more--&gt;&lt;/span&gt;Snippet as Modifiers / Generator&lt;/h3&gt;&lt;div&gt;Suppose you have a javascript code where you are following code convention like this,&lt;/div&gt;&lt;div&gt;For any [variable Name] error checking code is invalid[variable Name].&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;E.g For Name, validation function is invalidVariable()&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol style="background-color: white; box-sizing: border-box; color: #212529; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Segoe UI&amp;quot;, Roboto, &amp;quot;Helvetica Neue&amp;quot;, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;; font-size: 16px; margin-bottom: 1rem; margin-top: 0px;"&gt;&lt;li style="box-sizing: border-box;"&gt;var Name=""&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&lt;br /&gt;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;invalidName&lt;span style="box-sizing: border-box; color: #009900;"&gt;(&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;)&lt;/span&gt;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #009900;"&gt;{&lt;/span&gt;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #000066;"&gt;return&lt;/span&gt;&amp;nbsp;_.&lt;span style="box-sizing: border-box; color: #000066;"&gt;get&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;(&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #000066;"&gt;this&lt;/span&gt;.&lt;span style="box-sizing: border-box; color: #660066;"&gt;errors&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #339933;"&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="box-sizing: border-box; color: #3366cc;"&gt;"Name[0]"&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;)&lt;/span&gt;&lt;span style="box-sizing: border-box; color: #339933;"&gt;;&lt;/span&gt;&lt;/li&gt;&lt;li style="box-sizing: border-box;"&gt;&lt;span style="box-sizing: border-box; color: #009900;"&gt;}&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;span face="-apple-system, system-ui, Segoe UI, Roboto, Helvetica Neue, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol" style="color: #009900;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;In this case, We can create a snippet we can generate invalid[Variable Name] function for us. This kind of snippet can be created using a special built-in variable&amp;nbsp; provided by vscode.&amp;nbsp;&lt;span style="background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 15px; white-space: pre;"&gt;${TM_SELECTED_TEXT}&lt;/span&gt;&lt;div&gt;&lt;span style="background-color: white; color: #a31515; font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 15px; white-space: pre;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Snippet will look like this,&lt;div&gt;&lt;pre class="app__pre" style="background-color: white; border-radius: 2px; border: none; box-shadow: rgba(0, 0, 0, 0.25) 0px 0px 0px 1px inset; box-sizing: border-box; flex: 1 1 0%; font-family: inherit; font-size: 16px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; line-height: inherit; margin-bottom: 0px; margin-top: 0px; overflow: auto; padding: 16px; resize: none; user-select: all;"&gt;"validation error check function": {
  "prefix": "invalid-feedback-function",
  "body": [
    "invalid&lt;span style="color: #a64d79;"&gt;${TM_SELECTED_TEXT}&lt;/span&gt;() {",&lt;br /&gt;    "      return _.get(this.errors, \"&lt;span style="color: #a64d79;"&gt;${TM_SELECTED_TEXT}&lt;/span&gt;[0]\");",&lt;br /&gt;    "    },"
  ],
  "description": "validation error check function"
}
&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="color: #e69138;"&gt;&lt;u&gt;${TM_SELECTED_TEXT} takes the code currently selected as input.&lt;/u&gt;&lt;/span&gt;&lt;div&gt;&lt;span style="color: #e69138;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="color: #e69138;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;You can create more complex and useful snippets according to your need. Check the official link to the vscode user-defined snippets to find out what other built-in variables are available to create snippets.&lt;br /&gt;&lt;br /&gt;Here is the link to official&amp;nbsp; documentation for vscode&amp;nbsp; user defined snippes:&lt;br /&gt;&lt;a href="https://code.visualstudio.com/docs/editor/userdefinedsnippets " rel="nofollow" target="_blank"&gt;https://code.visualstudio.com/docs/editor/userdefinedsnippets&amp;nbsp;&lt;/a&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Use google cloud log-sink to log incidents to your project management system</title><link>http://www.mchampaneri.in/2021/05/use-google-cloud-log-sink-to-log.html</link><category>Awesome</category><category>Debugging</category><category>firebase</category><category>google cloud platform</category><category>tools</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Sun, 23 May 2021 19:55:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-8258979152079869255</guid><description>Small team working on multi service product, With carrying more then one responsibilities. It's a big challenge to keep everything on track. &lt;br /&gt;&lt;br /&gt;Most importantly, When it comes to incident reporting. We can not automate every thing but, at least we can automate incident reporting to our project management service eg Gitlab / GitHub / Slack. &lt;br /&gt;&lt;br /&gt;( Slack &#128517; , for small team like us slack also work like project management tool. )&lt;br /&gt;&lt;br /&gt;&lt;h2 style="text-align: left;"&gt;Google cloud log-sink&lt;/h2&gt;Here comes &lt;a href="#"&gt;google cloud log-sink&lt;/a&gt; handy to you. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="#"&gt;&lt;img border="0" height="318" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_QSi7fBIliwR-wpQghj99KFx7S3Z0ENXnUf2n0nOk6CH5sjmJuxwTO6p_EC1dPm7WVoWVex2LNBZYoBiJiU7QL0-CBmI2Vuqfj2VWuKYlXZba3uPPdHVq-D_DdL2P5U3MtNySl9NB4Ig/w640-h318/Screenshot+2021-05-23+at+7.40.25+PM.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;We can direct all of your logs with severity level of &lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Error&lt;/li&gt;&lt;li&gt;Crtitical&lt;/li&gt;&lt;li&gt;Alert&lt;/li&gt;&lt;li&gt;Emergency&lt;/li&gt;&lt;/ul&gt;to a logs ink which log a incident on your project &amp;amp; issue tracking service ( For example Gitlab )  using cloud pub/sub topics. [ You can use firebase function for such pub/sub topics ] &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="#"&gt;&lt;img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh1-2OGzaYYQfdfKslOgtbkRzhtD7U9_NmFutJD87SsveMiCic2ktZWjcib1uofDbpgtuC7RKpd1lxERe5qYF9pFO89l0fxPo_ni-Uat8qJuznCBDSs-LrCxlMnEVV_2YyjoyGSzkjppo/w610-h640/Screenshot+2021-05-23+at+7.42.31+PM.png" width="610" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Inclusion filter for error logs severity='(ERROR OR CRITICAL OR ALERT OR EMERGENCY)'&lt;br /&gt;&lt;br /&gt;&lt;a href="#"&gt;&lt;img border="0" height="450" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkA5krcl8dKtOc9zq6YR0yo7nK63al7M78Mj4vFHUWhUx7A6xzyoYwb-Rwm1m3hIjtp1EATLVdIeIYb_AufMaZU-HAMD_jxoGEgtNjpCME0FGQAiYrVIRozhE_AU4ePvVfQuLHNFsu3PE/w640-h450/Screenshot+2021-05-23+at+7.44.02+PM.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next time when ever error log will be generated on your cloud logs. You will get an incident created on your gitlab. &lt;br /&gt;&lt;br /&gt;So Don't wait for your tester or your user to report the issue, get it right away to your project management service with adequate information in it using log sink.&lt;br /&gt;&lt;br /&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_QSi7fBIliwR-wpQghj99KFx7S3Z0ENXnUf2n0nOk6CH5sjmJuxwTO6p_EC1dPm7WVoWVex2LNBZYoBiJiU7QL0-CBmI2Vuqfj2VWuKYlXZba3uPPdHVq-D_DdL2P5U3MtNySl9NB4Ig/s72-w640-h318-c/Screenshot+2021-05-23+at+7.40.25+PM.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Transpile your mithril jsx using babel's online transpiler</title><link>http://www.mchampaneri.in/2020/11/transpile-your-mithril-jsx-using-babels.html</link><category>jsx</category><category>mithril</category><category>transpile</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Sat, 7 Nov 2020 08:43:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-3671722509978796350</guid><description>You can transpile your JSX based mithril component to mithril component online with help of babeljs.&lt;br /&gt;&lt;br /&gt;Goto https://babeljs.io/repl&lt;br /&gt;&lt;a href="#"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBXOrxqdsr-tDwrZxzBK_GWhEhn6V76ERl2dPPbc0CT8Cv0rbRIKyRakaFBxrdNH6eylTOuiL3f38tkB5eUqcqsRg9BFgkKuAFyLcaKjalhsNt8O9q1AbcBKZAu34vLNBIV9oH4SwLPOo/w640-h252/Screenshot+2020-11-06+at+9.21.41+PM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Copy your JSX component over there.&lt;br /&gt;&lt;a href="#"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRP2EfvA2Vlx3bRFSeC6EGAXvGEgK1fVykDRH5if-RPG8n4PL3vXN7FvR_eGLGfmk5ub61eSxZ5yHYR0XMeqx0HqF4RSZDOdgf_N_Ba0wIcFF49drf5VyW6GsT3vuLgp1mL90sX5_KZoY/w640-h174/Screenshot+2020-11-06+at+9.20.58+PM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Select React and ES2015 in preset for compilation.&lt;br /&gt;&lt;a href="#"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiutLqNz1d1AhzboVdlr1SRdvuSHy4EZT8O9022lNzU6OBQf38gCXWKlM0I_88HxcGbMmndWTFru_tPAePRsQe344AVpIQhfluGqgCjGBzHjpjkOw-4EwDE9iCk9sH__I8Z-cKtuVKxFB4/w358-h400/Screenshot+2020-11-06+at+9.25.10+PM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You will be getting compiled code on the right side.&lt;br /&gt;&lt;a href="#"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCbAmaIqK_lZkXmWv6hg_VFeJkOCM4IfMWF-WPREr-kmnLkGUMy9n5shUKEko8N9DfbBH2sAmdhAeX0CIEtNNFdOyH9KuE6CFA42LqrUwd-IKFXOaeALFpoc7hiie5e9VzDeEx32Il7aA/w640-h152/Screenshot+2020-11-06+at+9.21.24+PM.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you notice this compiled code is for React, and not for the mithril.&lt;br /&gt;You have to go one step more, Replace all the React.createElement with m and you got the code for your mithril.&lt;br /&gt;&lt;br /&gt;&lt;a href="#"&gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDNefgNdv15njjjyLo3c2dGJGxRL_dc049iP9mGs2KJnMHzzUABcfwHaHUkBS_SBufyEK5o0qWIlwi7XNyYFK_UTiQCrXfdPAJasT1ItLJ5HbIb_KUouds3C_lKVtfBiP8wY9AnejTlHw/w640-h152/export.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cheers!&lt;br /&gt;&lt;br /&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBXOrxqdsr-tDwrZxzBK_GWhEhn6V76ERl2dPPbc0CT8Cv0rbRIKyRakaFBxrdNH6eylTOuiL3f38tkB5eUqcqsRg9BFgkKuAFyLcaKjalhsNt8O9q1AbcBKZAu34vLNBIV9oH4SwLPOo/s72-w640-h252-c/Screenshot+2020-11-06+at+9.21.41+PM.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total></item><item><title>Gitlab CI/CD for firebase project</title><link>http://www.mchampaneri.in/2020/11/gitlab-cicd-for-firebase-project.html</link><category>gitlab cicd firebase</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Sun, 1 Nov 2020 18:58:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-1678388328083976734</guid><description>&lt;blockquote&gt;CI/CD stands for continues integration, continuous deployment.&amp;nbsp;&lt;/blockquote&gt;&lt;div&gt;Normally, I am hosting my private projects on Gitlab. One of my project is implemented on google's firebase platform. It's using firebase functions, hosting, pub-sub and other google service heavily. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; &lt;a href="#"&gt;&lt;img border="0" src="https://about.gitlab.com/images/ci/ci-cd-test-deploy-illustration_2x.png" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;span&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;/span&gt;&lt;h2 style="text-align: left;"&gt;Why I needed CI/CD ? &#129300;&lt;/h2&gt;Initially, there was hosting and very few firebase functions to handle. It was giving me option to deploy that particle service. &lt;br /&gt;&lt;br /&gt; Like, I want to deploy only hosting, I will say &lt;br /&gt; $ firebase deploy --only hosting &lt;br /&gt;&lt;br /&gt; Or, If I want to deploy only function &lt;br /&gt; $ firebase deploy --only functions &lt;br /&gt;&lt;br /&gt; Or more precisely, I want to deploy only a particular function. &lt;br /&gt; $ firebase deploy --only functions:[function-name] &lt;br /&gt;&lt;br /&gt; But, as the project started to grow, this approach started showing issues in integration. &lt;br /&gt;&lt;br /&gt; Local version were working fine while deployment were showing issues. Why ? . Because, the approach of deploying only services that has been touched was depending on the list of deployment. If that list misses something, depending services will generate false results and in worst case, It might brake other dependent services as well. &lt;br /&gt; &lt;br /&gt;Though due to workflow of multiple tests before moving on, we were able to rectify the missing service, it was stretching the process of deployments to several hours before we can confirm success of the deployment. &lt;br /&gt;&lt;h3 style="text-align: left;"&gt;CI/CD as Solution &#128074;&lt;/h3&gt; As a solution for the problem of integration, we moved to GitLab CI/CD. Meaning, now we were making full deployment of all services which were used while development phase. &lt;br /&gt;&lt;br /&gt;Our full deployment is taking 9-15 minutes, which is higher then specific deployment ( 3-5 minutes ), But less then time was spent to confirmation the validation of deployment (15 minutes to several hours if test results were false positive)&lt;br /&gt;&lt;br /&gt;It saved us from the loop of  &lt;br /&gt;test -&amp;gt; rectify missing service -&amp;gt; deploy service -&amp;gt; test &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;It also saved me from making manual deployments, we are using merge event on specific branch to trigger CI/CD. ✌&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;

&lt;script src="https://gist.github.com/mchampaneri/2fc283daf4894a190d1db10a70698d78.js"&gt;&lt;/script&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Google blogger Ideas panel</title><link>http://www.mchampaneri.in/2020/10/google-blogger-ideas-panel.html</link><category>Awesome</category><category>blogging</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Mon, 12 Oct 2020 12:00:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-8057280390264455607</guid><description>&lt;p&gt;&lt;/p&gt;&lt;h1 style="text-align: left;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;span style="font-size: large;"&gt;Google blogger Ideas&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&amp;nbsp;I opened by blogger today, and..&amp;nbsp; &amp;nbsp;I got this.&amp;nbsp;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCKxhr5pR65h8lOAgOJ6HuYxlUyryEvg8y6nW0wURQjk9Mr4Z36XwmlOtxZ_ahcj0jjdxk6J4a9SZslJ7nG4ps3Yx6b6fVcQ4ac8ecqqxG3n-OnsRa9cP2ZEoJKZPW5qWTX_cfF_HadUM/s753/Screenshot+2020-10-12+at+11.51.38+AM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;img alt="Google blogger Ideas" border="0" data-original-height="753" data-original-width="528" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCKxhr5pR65h8lOAgOJ6HuYxlUyryEvg8y6nW0wURQjk9Mr4Z36XwmlOtxZ_ahcj0jjdxk6J4a9SZslJ7nG4ps3Yx6b6fVcQ4ac8ecqqxG3n-OnsRa9cP2ZEoJKZPW5qWTX_cfF_HadUM/w280-h400/Screenshot+2020-10-12+at+11.51.38+AM.png" title="Google blogger Ideas" width="280" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-family: verdana;"&gt;Google blogger Ideas&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;A panel suggesting a topic on which I can write my next blog. It's fetching unanswered question from web according to your previous post and topics.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;It was something, I was really looking for, after all it takes time to finding subject on which to write next and still being in the same niche.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;h3&gt;&lt;span style="font-family: verdana;"&gt;Awesome feature Blogger!&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCKxhr5pR65h8lOAgOJ6HuYxlUyryEvg8y6nW0wURQjk9Mr4Z36XwmlOtxZ_ahcj0jjdxk6J4a9SZslJ7nG4ps3Yx6b6fVcQ4ac8ecqqxG3n-OnsRa9cP2ZEoJKZPW5qWTX_cfF_HadUM/s72-w280-h400-c/Screenshot+2020-10-12+at+11.51.38+AM.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total></item><item><title>Immutable.js with firebase </title><link>http://www.mchampaneri.in/2020/10/to-store-data-we-can-use-either-object.html</link><category>Awesome</category><category>firebase</category><category>firestore</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Sat, 10 Oct 2020 11:18:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-6908714686570397731</guid><description>&lt;p&gt;&lt;span style="font-family: verdana;"&gt;To store data we can use either object or we can use array in javascript. Both have their own advantage and disadvantage.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;&lt;b&gt;Array&lt;/b&gt; : Array has advantage of maintaining order, but negative side is that If you want to update any element inside array you have to find the index of the element. May be via looping through the whole array if indexes are not predictable.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;&lt;b&gt;Object&lt;/b&gt; : You can store element as object property. It's like key-value pair, So If you want to update any property (element) of object, you can update it easily using key. So, It's easy to update the elements in object, but object uses hash for property, So order is not guaranteed.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style="text-align: left;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;a href="https://immutable-js.github.io/immutable-js/docs/#/" target="_blank"&gt;Immutable.js&lt;/a&gt; with firebase&lt;/span&gt;&lt;/h2&gt;&lt;div&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;Firebase provides live updates. Suppose you are having a program where you are listening for live updates on some last x elements, while retaining others for display only, but order of display matters.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;You are listening for last x elements live, So you have to update the data of those elements when you receive update&amp;nbsp; from firestore, but also have to maintain order of all the elements.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;Here comes &lt;a href="https://immutable-js.github.io/immutable-js/docs/#/" target="_blank"&gt;immutable.js&lt;/a&gt;, to get advantage of both Array and Object. Using &lt;a href="https://immutable-js.github.io/immutable-js/docs/#/OrderedMap" target="_blank"&gt;OrderedMap&lt;/a&gt; from &lt;a href="https://immutable-js.github.io/" target="_blank"&gt;immutable.js&lt;/a&gt;&amp;nbsp;which has ability to update with key and which guarantees the order as well, solves the problem.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: verdana;"&gt;&lt;script src="https://gist.github.com/mchampaneri/a6cf58e119c71e990d721a490765f52a.js"&gt;&lt;/script&gt;
&lt;/span&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-family: verdana;"&gt;[Source code]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;In &lt;a href="https://immutable-js.github.io/immutable-js/docs/#/OrderedMap" target="_blank"&gt;orderedMap&lt;/a&gt; element stored in order of they are set, But for existing key it updates the existing element with that key. So, you get your&lt;i&gt; update with key&lt;/i&gt; problem solved here.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;Now next issue is &lt;i&gt;display in order&lt;/i&gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;You can convert &lt;a href="https://immutable-js.github.io/immutable-js/docs/#/OrderedMap" target="_blank"&gt;OrderdMap&lt;/a&gt; to an array using toArray method on it. So you will alway get orderd output.&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-family: verdana;"&gt;&lt;script src="https://gist.github.com/mchampaneri/d3f3438a5d6e94b83afd5532af54a2c8.js"&gt;&lt;/script&gt; 
&lt;/span&gt;&lt;p style="text-align: center;"&gt;&lt;span style="font-family: verdana;"&gt;[Source code]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;span style="font-family: verdana;"&gt;Real world uses case is pagination. How ??? Try to implement a pagination with infinite scroll which fetches old message when scrolled up while also listens live to the last X messages while on the bottom.&lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>Ahmedabad Shopping festival </title><link>http://www.mchampaneri.in/2020/08/ahmedabad-shopping-festival.html</link><category>Awesome</category><category>case study</category><category>datastore</category><category>Go</category><category>google cloud platform</category><category>projects</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Sun, 9 Aug 2020 22:24:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-7181213278894611398</guid><description>&lt;p&gt;&lt;/p&gt;&lt;div style="text-align: center;"&gt;&lt;span style="background-color: #ffe599;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;span style="color: #666666; font-size: small;"&gt;Ahmedabad Shopping festival is solution created by&amp;nbsp;&lt;/span&gt;&lt;span style="color: #666666; font-size: small; text-align: center; text-transform: capitalize;"&gt;&lt;a href="https://www.tuzz.in/" rel="nofollow" target="_blank"&gt;Tuzzin Infotech Pvt. Ltd&lt;/a&gt;.&lt;br /&gt;I worked as part of the development team&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span style="background-color: #ffe599; color: #666666; font-size: small; text-align: center; text-transform: capitalize;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;My journey started as a part-time web developer. A MySQL database, Php for backend, VueJs and jQuery frontend, scss for css and I'm done. So easy!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;I was never thinking about scaling, rate limiting, timeout on those days, and normal site even does not need to care about such things unless they reaches that threshold.&lt;/span&gt;&lt;/p&gt;&lt;p style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;Luckily, I got chance to work on a product which was requiring all of this. It was the first time when I got exposure to real scalable application with spike in traffic, &lt;span style="background-color: #fff2cc;"&gt;Ahmedabad Shopping festival 2019.&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;&lt;span style="font-size: xx-large;"&gt;Brief Intro of Ahmedabad Shopping festival&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/Qp2ABJNj_1s" width="320" youtube-src-id="Qp2ABJNj_1s"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;Ahmedabad Shopping festival&amp;nbsp;was &lt;span style="background-color: #fff2cc;"&gt;first digitally managed shopping festival of India&lt;/span&gt; hosted in Ahmedabad, Gujarat. Every customer were getting &lt;i&gt;rewards&lt;/i&gt; and &lt;i&gt;coupons for chance to win prize &lt;/i&gt;on making &lt;i&gt;shopping during shopping hours&lt;/i&gt;.&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;&lt;span style="font-size: xx-large;"&gt;Technical requirements&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahmedabad Shopping festival was &lt;span style="background-color: #fff2cc;"&gt;consisting a web portal for retailers, a web portal for administrators of shopping festival and mobile application for shoppers&lt;/span&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;&lt;span style="background-color: #fff2cc;"&gt;All of this modules were needing access to database, sms module and push notification module and requests to each service could scale from 0 to massive amount at any time.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It was also required to be able to make deployment during shopping hours without having any downtime or any glitch in any of the module.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: xx-large;"&gt;Issues and Resolutions&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana; font-size: xx-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: x-large;"&gt;&lt;span style="font-family: verdana;"&gt;Ability to make deployments during shopping hours.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;Our first and for most issue was&amp;nbsp; ability to make a deployment during shopping hour &lt;span style="background-color: #fff2cc;"&gt;without introducing any glitch.&lt;/span&gt; Glitch was not acceptable at all as It could affect result of lucky winner selection based on coupons issued.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGDJOg-O81wSrZ2ls8ZbdtL7HmEqpJ969dx0j9ra3USHn41lj7aIxmqNqK-W_D2Nv9IrYiSbECZjH04jtM0mfcoKhj6FviN6wsVkTKxEkbqe2UoUEFvhv9uEtup6wibupxXhyphenhyphen8YIFizZI/s857/Screenshot+2020-08-09+at+8.47.25+PM.png" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img alt="version defined in yaml" border="0" data-original-height="110" data-original-width="857" height="82" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgGDJOg-O81wSrZ2ls8ZbdtL7HmEqpJ969dx0j9ra3USHn41lj7aIxmqNqK-W_D2Nv9IrYiSbECZjH04jtM0mfcoKhj6FviN6wsVkTKxEkbqe2UoUEFvhv9uEtup6wibupxXhyphenhyphen8YIFizZI/w640-h82/Screenshot+2020-08-09+at+8.47.25+PM.png" title="version defined in yaml" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: verdana;"&gt;This issue was solved using &lt;span style="background-color: #fff2cc;"&gt;versioning with app engine services&lt;/span&gt; &lt;span style="background-color: #fff2cc;"&gt;and traffic migration&lt;/span&gt; in conjunction with warmup request.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6bmoYIIkQXJO8Q9F71KJM0CiIrF-p-M_2s7y5qowjdubxtqCK4Qpr6boZGUZZxnGiEpKp3MQAX1BLOyQQJzoLRQzdXjp2NqegDoMKxPIUkU1C87Y1qhRMu62HUJb_wTqcQskxdGygupc/s869/Screenshot+2020-08-09+at+8.46.16+PM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;img alt="instance with warmup support" border="0" data-original-height="192" data-original-width="869" height="141" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6bmoYIIkQXJO8Q9F71KJM0CiIrF-p-M_2s7y5qowjdubxtqCK4Qpr6boZGUZZxnGiEpKp3MQAX1BLOyQQJzoLRQzdXjp2NqegDoMKxPIUkU1C87Y1qhRMu62HUJb_wTqcQskxdGygupc/w640-h141/Screenshot+2020-08-09+at+8.46.16+PM.png" title="instance with warmup support" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: x-large;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-size: x-large;"&gt;&lt;span style="font-family: verdana;"&gt;Rate Limiting&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;We were using sms and push notifications with all the modules. &lt;span style="background-color: #fff2cc;"&gt;Sms service was capped by a rate limit per time period (X / sec ). Reaching that limit would have resulted in delivery failure of sms.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;Sms were used for notifications to retailers and admins but, most importantly sms were also used for OTP for signup/sign-in in shopper facing app. So&lt;span style="background-color: #fff2cc;"&gt; neither late not failure of sms delivery was acceptable at all.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;Google cloud task was used as solution&lt;span style="background-color: transparent;"&gt;. All of the sms from different backend services were written to that queue which was optimised in way that it was sending messages at highest possible rate without exceeding limit.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span style="font-family: verdana; margin-left: 1em; margin-right: 1em;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8p5dHzBlOsmbf1qcmIjH626TSqscguHZlV1gDnv5ZU16xT95qTUFmCprq_2A-jxuVe0qztD9dM9vmkD4sBiD-9Qh4NU23env74iPFRJuk29MXRMPppXmBtCMeTQy2fGRadJQre6lmFgI/s827/Screenshot+2020-08-09+at+9.02.50+PM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img alt="google cloud task" border="0" data-original-height="331" data-original-width="827" height="256" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8p5dHzBlOsmbf1qcmIjH626TSqscguHZlV1gDnv5ZU16xT95qTUFmCprq_2A-jxuVe0qztD9dM9vmkD4sBiD-9Qh4NU23env74iPFRJuk29MXRMPppXmBtCMeTQy2fGRadJQre6lmFgI/w640-h256/Screenshot+2020-08-09+at+9.02.50+PM.png" title="google cloud task" width="640" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana; font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana; font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana; font-size: x-large;"&gt;Taking daily backup, loading data and processing to find lucky winner&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana;"&gt;This tasks were supposed to run daily on specified time. It was handled using cron jobs.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3IFYsXz26X-RT5oSVo0pNy78SwhFH6HEDyhdYjZQnomtAsXsrdk6gmw4w2a-A31Jq7ccdFcI5wICtvtV1s11mQJIENp4L2pEdB67cv0SqnKiEAaZESeeY-vshseADLVQ9Q9GvoqhWnwM/s856/Screenshot+2020-08-09+at+9.27.55+PM.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;img border="0" data-original-height="380" data-original-width="856" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh3IFYsXz26X-RT5oSVo0pNy78SwhFH6HEDyhdYjZQnomtAsXsrdk6gmw4w2a-A31Jq7ccdFcI5wICtvtV1s11mQJIENp4L2pEdB67cv0SqnKiEAaZESeeY-vshseADLVQ9Q9GvoqhWnwM/s640/Screenshot+2020-08-09+at+9.27.55+PM.png" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana; font-size: x-large;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana; font-size: x-large;"&gt;Giving as fast response as possible to every request&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="font-family: verdana;"&gt;Shoppers were in count of thousands. During shopping hour request could making spikes that it reach the read limit per second of database. Therefor reading from the database was not a feasible one.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;As solution memcache was used.&lt;span style="background-color: transparent;"&gt; For every incoming request we were first looking at memcache, if memcache does not have data then data was loaded to memcache and same time it was returned as response as well.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;Here we found that data being sent to shopper were not going to be changed by any event or action of shopper other then his/her coupon counts. Most of the data was going to be static for the day,&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;There was only one request the first one of the day has to go to read the database, but we know that reading memcache is faster then reading database. So to make first request to read memcache as well, we started refreshing and reloading memcache before the first request of the day hits api.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="font-family: verdana;"&gt;So, technically were serving thorough only memcache through out the day without going to database for reading more then once in a day in normal scenario.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;Data sent to shoppers were static and going to be unchanged for day long. As result &lt;span style="background-color: #fff2cc;"&gt;we were caching data to the devices local storage for day that was reducing request to the api and loading data faster&lt;/span&gt; at same time.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;div style="text-align: justify;"&gt;So there were two caches used,&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;div style="text-align: justify;"&gt;on cloud in form of memcache&amp;nbsp;&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: #fff2cc;"&gt;&lt;div style="text-align: justify;"&gt;second local storage at device level which significantly&amp;nbsp;improved response time.&lt;/div&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: xx-large;"&gt;Conclusion&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;Architecture was designed to generate faster response with&amp;nbsp;minimum usage of resource and without exceeding constrains imposed by third party service providers and cloud services (database &amp;amp; big-query ) itself.&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: verdana;"&gt;Ahmedabad Shopping festival was the project which made me think as a &lt;span style="background-color: #fff2cc;"&gt;person for whom things working is not enough, but the way it works is also matters.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-family: verdana;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/Qp2ABJNj_1s/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>Creating 2d games with golang and gontuz/prototype</title><link>http://www.mchampaneri.in/2020/06/creating-2d-games-with-golang-and.html</link><category>Awesome</category><category>Example</category><category>Go</category><category>GUI</category><category>libray</category><category>open source</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Sun, 7 Jun 2020 16:43:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-6845490210366157703</guid><description>&lt;font face="verdana"&gt;Golang was created as server language. But with the time and curiosity of people, &lt;span style="background-color: #fce8b2;"&gt;golang has covered GUI application and game&lt;/span&gt; development as well.&lt;br /&gt;&lt;br /&gt;I am sharing here one of the available golang library, on top of which you can create 2d games. &lt;span style="background-color: #fce8b2;"&gt;Its &lt;a href="https://github.com/gonutz/prototype"&gt;gonutz/prototype&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;&lt;/font&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;font face="verdana"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;font face="verdana"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;&lt;i&gt;&lt;font face="verdana"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;&lt;i&gt;&lt;font face="verdana"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;b&gt;&lt;i&gt;&lt;font face="verdana"&gt;Sample video&lt;/font&gt;&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;font face="verdana"&gt;&lt;br /&gt;&lt;/font&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;font face="verdana"&gt;&lt;iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/BL-jOVTm48g" width="320" youtube-src-id="BL-jOVTm48g"&gt;&lt;/iframe&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;font face="verdana"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;font face="verdana"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;font face="verdana"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;font face="verdana"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;font face="verdana"&gt;Gonutz/prototype is very&lt;span style="background-color: #fce8b2;"&gt; small and easy to learn&lt;/span&gt; library. &lt;span style="background-color: #fce8b2;"&gt;It's cross-platform&lt;/span&gt;, that means the game your are creating in one platform will be able to run on other platforms without any change in code ( in normal case ).&amp;nbsp;&lt;br /&gt;&lt;br /&gt;This package currently &lt;span style="background-color: #fce8b2;"&gt;supports windows , mac and linux.&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;font face="verdana"&gt;&lt;br /&gt;&lt;font size="4"&gt;gonutz/prototype features&lt;/font&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;font face="verdana"&gt;Support for keyboard input&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face="verdana"&gt;Support for mouse input&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face="verdana"&gt;Support for 2d drawing&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face="verdana"&gt;Support for image and sprite-sheets&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font face="verdana"&gt;Support for sound&amp;nbsp;&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;font face="verdana"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;font face="verdana"&gt;&lt;i&gt;Want to learn more about this package.&amp;nbsp;&lt;/i&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;font face="verdana"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;font face="verdana"&gt;&lt;b&gt;Follow my youtube video playlist "2d game development in golang"&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;font face="verdana"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;font face="verdana"&gt;&lt;i&gt;Video tutorial playlist:&lt;/i&gt;&lt;/font&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;font face="verdana"&gt;&lt;i&gt;&amp;nbsp;&lt;a href="https://www.youtube.com/playlist?list=PLub5C2vM5SjJIF0f561mAON7nFG2nKHD9" style="text-align: left;"&gt;https://www.youtube.com/playlist?list=PLub5C2vM5SjJIF0f561mAON7nFG2nKHD9&lt;/a&gt;&lt;/i&gt;&lt;/font&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/BL-jOVTm48g/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total></item><item><title>Go-boiler : smaller and simplest starter kit</title><link>http://www.mchampaneri.in/2019/04/go-boiler-smaller-and-simplest-starter.html</link><category>Go</category><category>projects</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Mon, 29 Apr 2019 11:59:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-8283215855736662385</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Project Name&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Go-boiler&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Project Descrtiption&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: verdana, sans-serif;"&gt;Simple, small &amp;amp; easy to get started boiler-plate(starter-kit) written in golang for creating website/webapps.&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbT4i6OaVFieXIXUW3NHJzl2ZjJCJ_rJ5qMKUFIPs3U77JLNZ6RE__MQODzC2rUeCtf3tHhe5KbB6yfPBbg4N4HnYn1MVZl9UXg2pOIcq89Nj1VaDykyd81b2r7XuR0GGyVvY34YZQHvM/s1600/go-boiler.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="530" data-original-width="897" height="377" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbT4i6OaVFieXIXUW3NHJzl2ZjJCJ_rJ5qMKUFIPs3U77JLNZ6RE__MQODzC2rUeCtf3tHhe5KbB6yfPBbg4N4HnYn1MVZl9UXg2pOIcq89Nj1VaDykyd81b2r7XuR0GGyVvY34YZQHvM/s640/go-boiler.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;External libraries&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Cloudykit/Jet ( HTML templating engine)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;gorilla/mux ( HTTP Routing )&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;gorilla/csrf ( CSRF )&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Source code&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;a href="https://github.com/mchampaneri/go-boiler"&gt;https://github.com/mchampaneri/go-boiler&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Documentation&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;a href="https://mchampaneri.github.io/go-boiler"&gt;https://mchampaneri.github.io/go-boiler&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbT4i6OaVFieXIXUW3NHJzl2ZjJCJ_rJ5qMKUFIPs3U77JLNZ6RE__MQODzC2rUeCtf3tHhe5KbB6yfPBbg4N4HnYn1MVZl9UXg2pOIcq89Nj1VaDykyd81b2r7XuR0GGyVvY34YZQHvM/s72-c/go-boiler.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Customize Scrollbar look</title><link>http://www.mchampaneri.in/2019/03/customize-scrollbar-look.html</link><category>Awesome</category><category>css</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Mon, 25 Mar 2019 16:27:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-3394242422899533368</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
You can customize the look of scrollbar using CSS.&lt;br /&gt;
Here is a snippet of sample custom scrollbar UI,&lt;br /&gt;
&lt;br /&gt;
( I have introduced&amp;nbsp;&lt;b&gt;&lt;i&gt;:&lt;/i&gt;&lt;/b&gt;&lt;b&gt;&lt;i&gt;hover&lt;/i&gt;&lt;/b&gt;&amp;nbsp; because I want to show scrollbar on an element only when user hover on that element )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style="background: #272822; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;table&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;pre style="line-height: 125%; margin: 0;"&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19&lt;/pre&gt;
&lt;/td&gt;&lt;td&gt;&lt;pre style="line-height: 125%; margin: 0;"&gt;&lt;span style="color: #f92672;"&gt;*:&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;:-webkit-scrollbar&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;width&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;5px&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
 &lt;span style="color: #66d9ef;"&gt;display&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;none&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;background-color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;#666666&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #f92672;"&gt;*&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;:hover&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;:-webkit-scrollbar&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;width&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;5px&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;display&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #66d9ef;"&gt;block&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;background-color&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;#666666&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;span style="color: #f92672;"&gt;*:&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;:-webkit-scrollbar-track&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;background&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;#ddd&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;

&lt;span style="color: #f92672;"&gt;*:&lt;/span&gt;&lt;span style="color: #a6e22e;"&gt;:-webkit-scrollbar-thumb&lt;/span&gt; &lt;span style="color: #f8f8f2;"&gt;{&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;background&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;#666&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
  &lt;span style="color: #66d9ef;"&gt;border&lt;/span&gt;&lt;span style="color: #f92672;"&gt;-&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;radius&lt;/span&gt;&lt;span style="color: #f92672;"&gt;:&lt;/span&gt; &lt;span style="color: #ae81ff;"&gt;20px&lt;/span&gt;&lt;span style="color: #f8f8f2;"&gt;;&lt;/span&gt;
&lt;span style="color: #f8f8f2;"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>YTDownload ( Server ) </title><link>http://www.mchampaneri.in/2019/03/ytdownload-server.html</link><category>open source</category><category>projects</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Sat, 2 Mar 2019 10:59:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-1784194948123827702</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;b&gt;Project Name&lt;/b&gt;&lt;br /&gt;
YTDownload&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Project Descrtiption&lt;/b&gt;&lt;br /&gt;
YTDownload ( Server ) is a server-based application. Its aim is to download video from youtube in all format and qualities provided by youtube.&lt;br /&gt;
It uses a web browser for its UI. The core logic of the server is written in goLang.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/96i_RnvFSUs/0.jpg" src="https://www.youtube.com/embed/96i_RnvFSUs?feature=player_embedded" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;External libraries &amp;amp; dependcies&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;VueJS ( JavaScript FrameWork )&lt;/li&gt;
&lt;li&gt;Spectre ( Css FrameWork )&lt;/li&gt;
&lt;li&gt;YTDL ( GoLang Youtube download Library )&lt;/li&gt;
&lt;li&gt;Gorilla Mux ( GoLang HTTP Routing Library )&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Pros&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;It's a server-based application. So you just have to start the server and you will be able to use it from any device having a browser and connected to the same network using local address of the server.&lt;/li&gt;
&lt;li&gt;No need to install&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Cons&lt;/b&gt;&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;Downloads with a single thread, so downloading speed will be less than those other downloaders provides.&lt;/li&gt;
&lt;li&gt;Can not use without the local server running.&lt;/li&gt;
&lt;li&gt;No mobile platform for the server is supported&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;b&gt;Source code&lt;/b&gt;&lt;br /&gt;
https://sourceforge.net/projects/ytdownloader-xyz/&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Download link&lt;/b&gt;&lt;br /&gt;
https://ytdownloader-xyz.sourceforge.io/&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://img.youtube.com/vi/96i_RnvFSUs/default.jpg" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></item><item><title>Datastore : Handling heavy insertions</title><link>http://www.mchampaneri.in/2019/01/datastore-handling-heavy-insertions.html</link><category>case study</category><category>datastore</category><category>problems</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Thu, 24 Jan 2019 12:52:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-930140789043763892</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif; font-size: x-small;"&gt;&lt;i&gt;Note: This is a case study to share what I faced, this might not be new to you and may have a better solution then I find. (You can share you solution here &#128522;) .&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;At first sight, datastore looks very easy to work with. And &lt;span style="background-color: #cccccc;"&gt;it is if insertions have to be done at a low rate.&lt;/span&gt; But &lt;span style="background-color: yellow;"&gt;when insertions are done at a high rate you come to find out certain issues which are not because your program is faulty but because you don't read the ( long detailed ) documentation of datastore, that itself has certain restrictions you might never hear before.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Timeout Problems&lt;/span&gt;&lt;/h3&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;There are two kinds of timeouts&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;1. Call error 11: Deadline exceeded&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;2. API error 5 (datastore_v3: TIMEOUT)&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Call error 11: Deadline exceeded&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This kind of time out happens when your &lt;span style="background-color: yellow;"&gt;datastore operation takes time more than 60 sec to finish the operation.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;For example, you are inserting too much data with a putMulti function. That takes time more then 60s insert.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;API error 5 (datastore_v3: TIMEOUT)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="background-color: yellow; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;a href="https://cloud.google.com/appengine/articles/handling_datastore_errors" target="_blank"&gt;This mostly occurs due to write contention.&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;When you attempt to write to a single entity group too quickly. Writes to a single entity group are serialized by the App Engine datastore, and thus there's a limit on how quickly you can update one entity group. In general, this works out to somewhere between 1 and 5 updates per second.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h4 style="text-align: left;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;My Case&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;In my case, it was actually worst. Because I was doing which was recommended not to do by the GAE datastore&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;documentation&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;"&gt;The most common example of this occurs&lt;span style="background-color: yellow;"&gt; when an app rapidly inserts a large number of entities of the same kind with sequential IDs&lt;/span&gt;. In this case, most inserts hit the same range of the same tablet, and the single tablet server is overwhelmed with writes. Most apps never have to worry about this: &lt;span style="background-color: yellow;"&gt;it only becomes a problem at write rates of several hundred queries per second and above &lt;i&gt;&lt;b&gt;( chances are high when you use gorotines to speed up appliaction)&lt;/b&gt;&lt;/i&gt;.&lt;/span&gt; If this does affect your app, the easiest solution is to use more evenly distributed IDs instead of the auto-allocated ones.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;( So, I got both kinds of the error are the system, and as a solution, I have to slow down insertions, because have no choice to move ids to auto-allocated ones )&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;a href="https://cloud.google.com/datastore/docs/concepts/transactions" target="_blank"&gt;Transactions Related Issues&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;A transaction is a set of Google Cloud Datastore operations on one or more &lt;span style="background-color: yellow;"&gt;entities in up to 25 entity groups&lt;/span&gt;. Each transaction is guaranteed to be atomic, which means that transactions are never partially applied. Either all of the operations in the transaction are applied, or none of them is applied.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;I have highlighted 25 here. Because it is the digit drive crazy two times in 5 days.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;For the first time I was using a &lt;span style="background-color: #f6d5d9;"&gt;multiPut&amp;nbsp;&lt;/span&gt;of&amp;nbsp; &lt;span style="background-color: #d5a6bd;"&gt;25+ entity X&lt;/span&gt; + &lt;span style="background-color: #d5a6bd;"&gt;2 related entities&lt;/span&gt; and I got an error of exceeding entity counts. So, I &lt;span style="background-color: #d5a6bd;"&gt;fixed it by batching entity X in the batch of 25&lt;/span&gt;. With that everything is fine&lt;span style="background-color: #e06666;"&gt; (As per my&amp;nbsp;assumption)&#128517;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;After 48hrs I got the same error again.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Then I realised that I have to take those 2 related entities also in the count and was actually trying to process 27 entities. But luckily it was the first incident of processing &lt;span style="background-color: #d5a6bd;"&gt;23+ entity&amp;nbsp;X&lt;/span&gt; in production env. So, It was quickly fixed before further such incidents.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Counting entities&amp;nbsp;to be processed as a group in the single transaction example.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Problematic code&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0px;"&gt;&lt;span style="background-color: white; color: green;"&gt;// entityX :=  array of 25 entityX elements&lt;/span&gt;&lt;span style="background-color: white;"&gt;
&lt;/span&gt;&lt;span style="background-color: white; color: green;"&gt;// entityXKeys :=  array of 25 datastore keys for entityX elements&lt;/span&gt;&lt;span style="background-color: white;"&gt;

_, err := client.RunInTransaction(ctx, &lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;func&lt;/span&gt;&lt;span style="background-color: white;"&gt;(tx *datastore.Transaction) &lt;/span&gt;&lt;span style="background-color: white; color: #2b91af;"&gt;error&lt;/span&gt;&lt;span style="background-color: white;"&gt; {
 
        _, err := tx.PutMulti(entityXKeys, entityX) &lt;/span&gt;&lt;span style="background-color: white; color: green;"&gt;// &lt;/span&gt;&lt;span style="background-color: yellow; color: green;"&gt;25 entites&lt;/span&gt;&lt;span style="background-color: white;"&gt;
 tx.Put(key1, &amp;amp;ele1) &lt;/span&gt;&lt;span style="background-color: white; color: green;"&gt;//&lt;/span&gt;&lt;span style="background-color: yellow; color: green;"&gt; 1 entity&lt;/span&gt;&lt;span style="background-color: white;"&gt;
 tx.Put(key2, &amp;amp;ele2) &lt;/span&gt;&lt;span style="background-color: white; color: green;"&gt;//&lt;/span&gt;&lt;span style="background-color: yellow; color: green;"&gt; 1 entity&lt;/span&gt;&lt;span style="background-color: white;"&gt;
&lt;/span&gt;&lt;span style="background-color: yellow;"&gt;
 &lt;span style="color: green;"&gt;// So total here we are processing 25 + 1 + 1 = 27 elements in one entity group &lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: white;"&gt;
        &lt;/span&gt;&lt;span style="background-color: white; color: green;"&gt;// which is not allowe by datastore &lt;/span&gt;&lt;span style="background-color: white;"&gt;
        &lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background-color: white;"&gt; err
})
&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span style="font-family: verdana, sans-serif;"&gt;&lt;b&gt;Solution&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 16.25px;"&gt;&lt;span style="background-color: white; color: green;"&gt;// instead of inserting 25 element at once use batch of approriate count of elements &lt;/span&gt;&lt;span style="background-color: yellow; color: green;"&gt;( in&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height: 16.25px;"&gt;&lt;span style="background-color: yellow; color: green;"&gt;// this case 22 )&lt;/span&gt;&lt;span style="background-color: white; color: green;"&gt; so inside transction count elements remains below or most equal to 25&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height: 16.25px;"&gt;&lt;span style="background-color: white;"&gt;for {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height: 16.25px;"&gt;&lt;span style="background-color: white; color: green;"&gt;// entityX :=  array of 22 entityX elements&lt;/span&gt;&lt;span style="background-color: white;"&gt;
&lt;/span&gt;&lt;span style="background-color: white; color: green;"&gt;// entityXKeys :=  array of 22 datastore keys for entityX elements&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height: 16.25px;"&gt;&lt;span style="background-color: white;"&gt;_, err := client.RunInTransaction(ctx, &lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;func&lt;/span&gt;&lt;span style="background-color: white;"&gt;(tx *datastore.Transaction) &lt;/span&gt;&lt;span style="background-color: white; color: #2b91af;"&gt;error&lt;/span&gt;&lt;span style="background-color: white;"&gt; {
 
        _, err := tx.PutMulti(entityXKeys22, entityX22) &lt;/span&gt;&lt;span style="background-color: white; color: green;"&gt;// &lt;/span&gt;&lt;span style="background-color: yellow; color: green;"&gt;25 entites&lt;/span&gt;&lt;span style="background-color: white;"&gt;
 tx.Put(key1, &amp;amp;ele1) &lt;/span&gt;&lt;span style="background-color: white; color: green;"&gt;//&lt;/span&gt;&lt;span style="background-color: yellow; color: green;"&gt; 1 entity&lt;/span&gt;&lt;span style="background-color: white;"&gt;
 tx.Put(key2, &amp;amp;ele2) &lt;/span&gt;&lt;span style="background-color: white; color: green;"&gt;//&lt;/span&gt;&lt;span style="background-color: yellow; color: green;"&gt; 1 entity&lt;/span&gt;&lt;span style="background-color: white;"&gt;
&lt;/span&gt;&lt;span style="background-color: yellow;"&gt;
 &lt;span style="color: green;"&gt;// So total here we are processing 25 + 1 + 1 = 27 elements in one entity group &lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: white;"&gt;
        &lt;/span&gt;&lt;span style="background-color: white; color: green;"&gt;// which is not allowe by datastore &lt;/span&gt;&lt;span style="background-color: white;"&gt;
        &lt;/span&gt;&lt;span style="background-color: white; color: blue;"&gt;return&lt;/span&gt;&lt;span style="background-color: white;"&gt; err
})
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height: 16.25px;"&gt;&lt;span style="background-color: white;"&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="line-height: 16.25px;"&gt;&lt;span style="background-color: white;"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Conclusion,&lt;/span&gt;&lt;/h3&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;When you are going to do heavy insertion in datastore, you should keep in mind the insertion limit of transaction and timeout criteria provided by &lt;span style="background-color: rgba(246, 213, 217, 0.686);"&gt;GAE&amp;nbsp;&lt;/span&gt;datastore API.&lt;/span&gt;&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Cursor based navigation for datatable</title><link>http://www.mchampaneri.in/2019/01/cursor-based-navigation-for-datatable.html</link><category>Awesome</category><category>with jquery</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Wed, 2 Jan 2019 18:30:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-8057824500770211040</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;I was working on a module where data was comming from datastore and paginated using cursor. If you are not familier with datastore, then you can refer to this &lt;a href="https://cloud.google.com/appengine/docs/standard/python/datastore/" target="_blank"&gt;link&lt;/a&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;In case of datastore we just have cursor to get next set of data. Though there is offset availabe in datastore its costly. So to be cost effective we have only option available is cursor.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Datastore decodes cursor and in response returns data associated with that cursor.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Now, If you are using bootstrap data-table you might find it cofusing that how to pass the cursor to your queryparameter.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Even I still don't get answer of how I can change data-queryparamter dynamically to update cursor on the url.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;But instead I got another simple solution.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;HTML Snippet&lt;/span&gt;&lt;br /&gt;
&lt;div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0;"&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;"&gt;&amp;lt;table id=&lt;span style="color: #a31515;"&gt;"table"&lt;/span&gt; data-toggle=&lt;span style="color: #a31515;"&gt;"table"&lt;/span&gt; &amp;gt;
    &amp;lt;thead&amp;gt;
      &amp;lt;tr&amp;gt;
       // your data table fields
      &amp;lt;/tr&amp;gt;
    &amp;lt;/thead&amp;gt;
    &amp;lt;tbody&amp;gt;&amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;nav aria-label=&lt;span style="color: #a31515;"&gt;"Page navigation example"&lt;/span&gt; style=&lt;span style="color: #a31515;"&gt;"margin-top: 2%;"&lt;/span&gt;&amp;gt;
    &amp;lt;ul class=&lt;span style="color: #a31515;"&gt;"pagination"&lt;/span&gt;&amp;gt;
      &amp;lt;li class=&lt;span style="color: #a31515;"&gt;"page-item"&lt;/span&gt;&amp;gt;&amp;lt;a class=&lt;span style="color: #a31515;"&gt;"page-link"&lt;/span&gt; href=&lt;span style="color: #a31515;"&gt;"#"&lt;/span&gt;  onclick=&lt;span style="color: #a31515;"&gt;"fetchPrevdata()"&lt;/span&gt;&amp;gt;Previous&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
      &amp;lt;li class=&lt;span style="color: #a31515;"&gt;"page-item"&lt;/span&gt;&amp;gt;&amp;lt;a class=&lt;span style="color: #a31515;"&gt;"page-link"&lt;/span&gt; href=&lt;span style="color: #a31515;"&gt;"#"&lt;/span&gt; id=&lt;span style="color: #a31515;"&gt;"nextData"&lt;/span&gt; onclick=&lt;span style="color: #a31515;"&gt;"fetchNextdata()"&lt;/span&gt;&amp;gt;Next&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
&amp;lt;/nav&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Below is Javascript&lt;/span&gt;&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0;"&gt;$(document).ready(&lt;span style="color: blue;"&gt;function&lt;/span&gt; () {
  fetchFirst();
});


&lt;span style="color: blue;"&gt;var&lt;/span&gt; cursors = [&lt;span style="color: #a31515;"&gt;""&lt;/span&gt;];
&lt;span style="color: blue;"&gt;var&lt;/span&gt; index = 0;

&lt;span style="color: blue;"&gt;function&lt;/span&gt; fetchFirst(){

  alert(&lt;span style="color: #a31515;"&gt;"fetchFirst called"&lt;/span&gt;)
  &lt;span style="color: blue;"&gt;var&lt;/span&gt; url = &lt;span style="color: #a31515;"&gt;"/winners-data?c="&lt;/span&gt; + cursors[index]
  $.get(url)
    .done(&lt;span style="color: blue;"&gt;function&lt;/span&gt; (data)
    {
      &lt;span style="color: blue;"&gt;if&lt;/span&gt;(index == cursors.length-1 ){
        cursors.push(data.Cursor);     
      }             
    })
}

&lt;span style="color: blue;"&gt;function&lt;/span&gt; fetchNextdata()
{  
  index++
  &lt;span style="color: blue;"&gt;var&lt;/span&gt; url = &lt;span style="color: #a31515;"&gt;"/url?c="&lt;/span&gt; + cursors[index] 
  $.get(url)
    .done(&lt;span style="color: blue;"&gt;function&lt;/span&gt; (data)
    {
      &lt;span style="color: blue;"&gt;if&lt;/span&gt;(index == cursors.length-1 ){
        cursors.push(data.Cursor);          
      }   
      &lt;span style="color: blue;"&gt;if&lt;/span&gt; (data.rows != &lt;span style="color: blue;"&gt;null&lt;/span&gt;) {       
        $table.bootstrapTable(&lt;span style="color: #a31515;"&gt;'load'&lt;/span&gt;, data.rows)
      }  
    })
}

&lt;span style="color: blue;"&gt;function&lt;/span&gt; fetchPrevdata()
{
  index--;
  &lt;span style="color: blue;"&gt;var&lt;/span&gt; url = &lt;span style="color: #a31515;"&gt;"/url?c="&lt;/span&gt; +  cursors[index]
  $.get(url)
    .done(&lt;span style="color: blue;"&gt;function&lt;/span&gt; (data)
    {
      &lt;span style="color: blue;"&gt;if&lt;/span&gt; (data.rows != &lt;span style="color: blue;"&gt;null&lt;/span&gt;) {
        $table.bootstrapTable(&lt;span style="color: #a31515;"&gt;'load'&lt;/span&gt;, data.rows)     
      }        
    })
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Hopefully, You find it useful.

If you any otherway to do this please share it via comments.&lt;/span&gt;
&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>datastore to bigquery data export</title><link>http://www.mchampaneri.in/2018/12/datastore-to-bigquery-data-export.html</link><category>google cloud platform</category><category>Hosting</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Fri, 7 Dec 2018 11:11:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-6853259022362347249</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Google Cloud Provides a ready made script to run scheduled export from datastore.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;I am using that export data as input to BigQuery.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;To get it done, I had created two crons,&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;First for calling data export operation&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Second for loading that exported data to BigQuery&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;span style="background-color: yellow; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: yellow; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Problem &lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;I was facing was that export was taking some time more time than I have assumed, So &lt;/span&gt;&lt;span style="background-color: yellow; font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Bigquery loading cron was getting initiated before data export opertion get completed,&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt; and result bigquery loading was failing.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Solution was to make those two cron job as a single one which works as chain. On successful completion of task one second gets called.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;So, I just modified the schedule export script provided by google, which exports files, and then checks if operation is successfully done or not fixed time intervals in loop, and if operation is found to be done successfully, it calls BigQuery load task.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Here is gist&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;!-- GIST FROM GITHUB ---&gt;
&lt;script src="https://gist.github.com/mchampaneri/e0dea76c48d23dda8553f2523dff7a2e.js"&gt;&lt;/script&gt;
&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>partial search with firestore</title><link>http://www.mchampaneri.in/2018/11/partial-search-with-firestore.html</link><category>Awesome</category><category>firebase</category><category>firestore</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Wed, 28 Nov 2018 16:00:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-4759403767414344258</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;You can provide partial search [ type ahead facility ] with firestore. It's &lt;i&gt;&lt;u&gt;not that much streight forward&lt;/u&gt;&lt;/i&gt; and also &lt;u&gt;&lt;i&gt;not feasible in case of large amount of data&lt;/i&gt;&lt;/u&gt; that has to support the partial search.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Here is just a sample of how you provide partial search with firestore.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Logic behind the search is a custom kind of indexing that enables partial search for us. &lt;b&gt;&lt;u style="background-color: yellow;"&gt;You need to create a collection of documents called indexes which contains indexes generated for the fields you want to search over.&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;First reqirement is to create every possible partial search strings.&lt;/span&gt;&lt;/h3&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Below function returns array of the possible indexes generate after chopping out input string character by character.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;!----- Code for chopper ----&gt;
&lt;!-- HTML generated using hilite.me --&gt;
&lt;br /&gt;
&lt;div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0;"&gt;&lt;span style="color: green;"&gt;/* storing searchabel fields */&lt;/span&gt;

&lt;span style="color: blue;"&gt;function&lt;/span&gt; _chopped_object(iString) {

  &lt;span style="color: blue;"&gt;var&lt;/span&gt; searchables = {}
  &lt;span style="color: blue;"&gt;for&lt;/span&gt; (i = 0; i &amp;lt; iString.length; i++) {
    &lt;span style="color: blue;"&gt;var&lt;/span&gt; string_part = iString.substr(0, iString.length - i)
    searchables[string_part] = &lt;span style="color: blue;"&gt;true&lt;/span&gt;
  }

  &lt;span style="color: blue;"&gt;return&lt;/span&gt; searchables

}
&lt;/pre&gt;
&lt;/div&gt;
&lt;!-------------&gt;
&lt;b&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Output of _chopped_object(manish) will be,&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;{&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;manish :true&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;manis&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;:true&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;mani&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;:true&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;man&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;:true&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;ma&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;:true&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;m&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;:true&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;}&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;That's what we want, Right !&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;We want tha if we write "m..." it should know we may want to write "manish"&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Next question is how to store this index and use it with firebase project.&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Create a sperate collection called searchables ( I am saying it searachables &#128512;, you are free to say anything man ), and store these index documents inside it.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0;"&gt; db.collection(&lt;span style="color: #a31515;"&gt;"searchables"&lt;/span&gt;)
   .doc([some-randome-string])
   .set({
   &lt;span style="color: green;"&gt;// searchable_index: _chopped_object(sender_profile[key]),&lt;/span&gt;
   searchables_index: _chopped_object(sender_profile[key]),

   mapping_value: [mapping_value]

   }).then(() =&amp;gt; {

    console.log(&lt;span style="color: #a31515;"&gt;"Document successfully updated!"&lt;/span&gt;);

   }).&lt;span style="color: blue;"&gt;catch&lt;/span&gt;((err) =&amp;gt; {

    console.log(err)

   });
&lt;/pre&gt;
&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;It may be that it's some confusing, how to use this code.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Example&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;We have dictonary of Persons, It includes details like name,phone,email,address&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0;"&gt;{
    name:&lt;span style="color: #a31515;"&gt;"manish"&lt;/span&gt;,
    phone:[not-going-to-share],
    email:m.champaneri.20&lt;span style="border: 1px solid #FF0000;"&gt;@&lt;/span&gt;gmail.com,
    address:&lt;span style="color: #a31515;"&gt;"something something"&lt;/span&gt;,
},
{
    name:&lt;span style="color: #a31515;"&gt;"mchampnaeri"&lt;/span&gt;,
    phone:[not-going-to-share],
    email:m.champaneri.20&lt;span style="border: 1px solid #FF0000;"&gt;@&lt;/span&gt;gmail.com,
    address:&lt;span style="color: #a31515;"&gt;"something something"&lt;/span&gt;,
},
{
    name:&lt;span style="color: #a31515;"&gt;"rohan"&lt;/span&gt;,
    phone:[not-going-to-share],
    email:m.champaneri.20&lt;span style="border: 1px solid #FF0000;"&gt;@&lt;/span&gt;gmail.com,
    address:&lt;span style="color: #a31515;"&gt;"something something"&lt;/span&gt;,
},
&lt;/pre&gt;
&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This is our document we are storing in collection of persons&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;We want to create searchable index of field of name.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Means, If, I type "m" I should get suggetion of "manish" and "mchampaneri" and after "ma" it should just suggest "manish" &#128077;.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;In this case,&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;when you store the person details in document you can create a searchable index in same process.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;( I am using nodejs exmpale is in javascript )&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0;"&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; storePersonDeatails(){

&lt;span style="color: blue;"&gt;var&lt;/span&gt; some_radom_key = [ -value- ]  &lt;span style="color: green;"&gt;// To store person document &lt;/span&gt;
&lt;span style="color: blue;"&gt;var&lt;/span&gt; some_radom_key2 = [ -value-2 ]  &lt;span style="color: green;"&gt;// To store person document search index&lt;/span&gt;
 
db.collection(&lt;span style="color: #a31515;"&gt;"persons"&lt;/span&gt;)
   .doc( some_radom_key )
   .set({
   personObject
   }).then(() =&amp;gt; {   

 &lt;span style="color: green;"&gt;// Incase of success full insertion you should create a searchable&lt;/span&gt;
        &lt;span style="color: green;"&gt;// index on name field for that person&lt;/span&gt;
  db.collection(&lt;span style="color: #a31515;"&gt;"searchables"&lt;/span&gt;)
    .doc( some_radom_key2 )
    .set({
      searcables_index: _chopped_object(personObject.name),
     mapping_value: some_radom_key  &lt;span style="color: green;"&gt;// Same value used as key for document, &lt;/span&gt;
                                                  &lt;span style="color: green;"&gt;// so index get attached with the document via key &lt;/span&gt;

    }).then(() =&amp;gt; {
     console.log(&lt;span style="color: #a31515;"&gt;"Document successfully updated!"&lt;/span&gt;);

    }).&lt;span style="color: blue;"&gt;catch&lt;/span&gt;((err) =&amp;gt; {
     console.log(err)

    });

   }).&lt;span style="color: blue;"&gt;catch&lt;/span&gt;((err) =&amp;gt; {

    console.log(err)

   });

}
&lt;/pre&gt;
&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;If you see your serachables documents you will find data look like somthing this&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin_p1dicpCiJXMe57rBEtefaJ94JwvKBXlyuG7X7MMKsu29stk0ZQfGNJDltIyBM7WVaVzhbHe8JL-xrnNDQlkSb7YyTUvu-Uil0Jq0hqMOz4Ur4hdKJA959AvLB5JMRbx0WzqsykJoaw/s1600/searchable.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="searchable Index" border="0" data-original-height="507" data-original-width="890" height="364" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin_p1dicpCiJXMe57rBEtefaJ94JwvKBXlyuG7X7MMKsu29stk0ZQfGNJDltIyBM7WVaVzhbHe8JL-xrnNDQlkSb7YyTUvu-Uil0Jq0hqMOz4Ur4hdKJA959AvLB5JMRbx0WzqsykJoaw/s640/searchable.png" title="searchable Index" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;searchable Index&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;UpTo This we just make searchable index now just use it in your search box&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;here is example code for search box ..&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0;"&gt;&lt;span style="color: blue;"&gt;function&lt;/span&gt; search(value) {
 db.collection(&lt;span style="color: #a31515;"&gt;"searchables"&lt;/span&gt;)
  .where(&lt;span style="color: #a31515;"&gt;"searchables_index."&lt;/span&gt;+ value,&lt;span style="color: #a31515;"&gt;"=="&lt;/span&gt;,&lt;span style="color: blue;"&gt;true&lt;/span&gt;)                 
  .get()
  .then((searchbles)=&amp;gt;{
    searchbles.forEach((item)=&amp;gt;{
    consle.log(item.data())
  })
 }) 
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Upper code will just try to read the property [value] of the object searchables_index and will get true if it exist.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Hope this was easy to understand.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;If it's not clear,&amp;nbsp; let me know!&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Have a great day !&lt;/span&gt;&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEin_p1dicpCiJXMe57rBEtefaJ94JwvKBXlyuG7X7MMKsu29stk0ZQfGNJDltIyBM7WVaVzhbHe8JL-xrnNDQlkSb7YyTUvu-Uil0Jq0hqMOz4Ur4hdKJA959AvLB5JMRbx0WzqsykJoaw/s72-c/searchable.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>Creating nested documents in firestore</title><link>http://www.mchampaneri.in/2018/11/creating-nested-documents-in-firestore.html</link><category>firebase</category><category>firestore</category><category>google cloud platform</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Tue, 20 Nov 2018 14:39:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-3439189828547097075</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;Firestore returning no records yet, I see them in console&lt;/li&gt;
&lt;li&gt;Collection not retuning any element.&lt;/li&gt;
&lt;li&gt;... ...&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;b&gt;&lt;i&gt;You might facing issues written above. Then it might be this case.&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
You might getting empty response in this kind of query though there are elements in firestore.&lt;br /&gt;
&lt;br /&gt;
&lt;!-- Code --&gt;

&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style="background: #f8f8f8; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0;"&gt;db.collection(collection1).doc(doc1)
.collection(collection2).doc(doc2)
.collection(collection3).get()
.then(
 &lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt; (querySnapshot) {
            querySnapshot.forEach(&lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt; (doc) {   
              console.log(doc.id, &lt;span style="color: #ba2121;"&gt;" = "&lt;/span&gt;, doc.data());
 }
)
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;!--/ code --&gt;

I face the same problem.&lt;span style="background-color: yellow;"&gt; Though data was stored sucessfully ( I was guessing, which was wrong actully )&lt;/span&gt;.&amp;nbsp; To verify that your data is not stored as you expceted you can do check this.&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg722OY4To5CVNXyXER8cu6eZnf7X7oUUjuq_hmJC8DGgJ99yrbw6kXGGNnzxJVNo_Pa0Hw-5vuec91s2U7PsCwCLX6crZVJyl4RuvFuXJTwHkGvzAiawFeXx0VnmRaX4vYaOjSkFWpmpE/s1600/key-in-itlics-means-deleted.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="Key in italics font means element is deleted" border="0" data-original-height="502" data-original-width="1141" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg722OY4To5CVNXyXER8cu6eZnf7X7oUUjuq_hmJC8DGgJ99yrbw6kXGGNnzxJVNo_Pa0Hw-5vuec91s2U7PsCwCLX6crZVJyl4RuvFuXJTwHkGvzAiawFeXx0VnmRaX4vYaOjSkFWpmpE/s640/key-in-itlics-means-deleted.png" title="Key in italics font means element is deleted" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Key in italics font means element is deleted&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style="background-color: #ffd966;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: #ffd966; color: #990000;"&gt;If key of your data is in italic font then &lt;u&gt;&lt;i&gt;your data is not stored or is marked as deleted &lt;/i&gt;&lt;/u&gt;[ that was happening in my case ]. See in image.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now you might thinking, that I have created element and&amp;nbsp; not deleted it then why it's showing as deleted.&lt;br /&gt;
&lt;br /&gt;
Truth is that if you want to create nested&lt;br /&gt;
&lt;br /&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;collection ( parent collection )&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;document ( parent docuemnt )&amp;nbsp;&lt;/li&gt;
&lt;li&gt;collection ( child collection )&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;document ( child document )&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;br /&gt;
you have to create first parent document and after using its referance you have to create child document.&lt;br /&gt;
&lt;br /&gt;
You should find reson behind this behaviour your self , but for now, perfect way to handle this would be is&lt;span style="background-color: #ffd966; color: #990000;"&gt; &lt;i&gt;make sure you code creating documents at every level explicitly.&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
For example,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style="background: #f8f8f8; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0;"&gt;&lt;span style="color: green; font-weight: bold;"&gt;var&lt;/span&gt; collectoinRef&lt;span style="color: #666666;"&gt;=&lt;/span&gt; db.collection(collection1).doc((doc1))
    .collection(collection2).doc(doc2)
    .collection(collection3)

  collectoinRef.doc(doc1)
    .get()
    .then((docSnapshot) &lt;span style="color: #666666;"&gt;=&amp;gt;&lt;/span&gt; {

      &lt;span style="color: #408080; font-style: italic;"&gt;// If document we are going to use as parent document is exist then &lt;/span&gt;
      &lt;span style="color: #408080; font-style: italic;"&gt;// we just have to set the child doc inside collectin of that document&lt;/span&gt;
      &lt;span style="color: green; font-weight: bold;"&gt;if&lt;/span&gt; (docSnapshot.exists) {
         collectoinRef.doc(doc1)
          .collection(collection2)
          .doc({customeid&lt;span style="color: #666666;"&gt;-&lt;/span&gt;&lt;span style="color: green; font-weight: bold;"&gt;for&lt;/span&gt;&lt;span style="color: #666666;"&gt;-&lt;/span&gt;doc}).set(doc)
          .then(() &lt;span style="color: #666666;"&gt;=&amp;gt;&lt;/span&gt; {
         &lt;span style="color: #408080; font-style: italic;"&gt;// Something ....            &lt;/span&gt;
          })
     
      &lt;span style="color: #408080; font-style: italic;"&gt;// But if document we want to use as parent not exist, Then first we have to &lt;/span&gt;
      &lt;span style="color: #408080; font-style: italic;"&gt;// create it.&lt;/span&gt;
      &lt;span style="color: #408080; font-style: italic;"&gt;// If that document is just used for arragment of elements then just pass empty&lt;/span&gt;
      &lt;span style="color: #408080; font-style: italic;"&gt;// object set({}) and it will creat empty document for you.&lt;/span&gt;
      &lt;span style="color: #408080; font-style: italic;"&gt;// After creation of empty parent object you can create collection of child docs &lt;/span&gt;
      &lt;span style="color: #408080; font-style: italic;"&gt;// inside it.&lt;/span&gt;
     
      } &lt;span style="color: green; font-weight: bold;"&gt;else&lt;/span&gt; {
  &lt;span style="color: #408080; font-style: italic;"&gt;// Creating empty parent object&lt;/span&gt;
         collectoinRef.doc(doc1).set({}).then(() &lt;span style="color: #666666;"&gt;=&amp;gt;&lt;/span&gt; {
          &lt;span style="color: #408080; font-style: italic;"&gt;// creating child object inside parent object&lt;/span&gt;
          &lt;span style="color: #408080; font-style: italic;"&gt;// after succefull insertion of parent object&lt;/span&gt;
          collectoinRef.doc(doc1).collection(collection2)
            .doc({customeid&lt;span style="color: #666666;"&gt;-&lt;/span&gt;&lt;span style="color: green; font-weight: bold;"&gt;for&lt;/span&gt;&lt;span style="color: #666666;"&gt;-&lt;/span&gt;doc}).set(doc)
            .then(() &lt;span style="color: #666666;"&gt;=&amp;gt;&lt;/span&gt; {
             &lt;span style="color: #408080; font-style: italic;"&gt;// Something ....        &lt;/span&gt;
            })
        })     
      }
    })
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg722OY4To5CVNXyXER8cu6eZnf7X7oUUjuq_hmJC8DGgJ99yrbw6kXGGNnzxJVNo_Pa0Hw-5vuec91s2U7PsCwCLX6crZVJyl4RuvFuXJTwHkGvzAiawFeXx0VnmRaX4vYaOjSkFWpmpE/s72-c/key-in-itlics-means-deleted.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Upload Files to Firebase Storage with  dropzone.js</title><link>http://www.mchampaneri.in/2018/11/upload-files-to-firebase-storage-with.html</link><category>Awesome</category><category>dropzone.js</category><category>Example</category><category>firebase</category><category>firestore</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Tue, 6 Nov 2018 15:33:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-6289620457022600833</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGRSQ4DAOEqyDRvqj9KVlaWKS4LAMoDoDRPyKOag71nFIJNO5EwnyF9BrQyNQ0jjAj8-Xv2oljcD1oobKVA2RbkMt7vw0iIHBGk3dQGfW9IHixmCaPnkZE4hv4vrCIGFodakB8tfI80cU/s1600/firebase-dropzone-example.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="502" data-original-width="936" height="171" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGRSQ4DAOEqyDRvqj9KVlaWKS4LAMoDoDRPyKOag71nFIJNO5EwnyF9BrQyNQ0jjAj8-Xv2oljcD1oobKVA2RbkMt7vw0iIHBGk3dQGfW9IHixmCaPnkZE4hv4vrCIGFodakB8tfI80cU/s320/firebase-dropzone-example.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;b&gt;Almost every&lt;/b&gt; file uploader I found on web are expecting url to where we want to upload file.&lt;b&gt; If you are using firebase storage then you will find this awkward as you don't have any rest url where you have to upload file&lt;/b&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Instead, file upload handled by firestore library firebase-storage.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;After certain effort I found a way to use dropzone.js with firebase storage. Here is some snippet of code which you may find useful, If you are in the same situation as I am.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;This both function are in same file&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Dropzone configuration.. ( in index.js )&lt;/span&gt;&lt;/h3&gt;
&lt;!-----------

&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style="background: #f8f8f8; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0;"&gt;   &lt;span style="color: green; font-weight: bold;"&gt;var&lt;/span&gt; myDropzone &lt;span style="color: #666666;"&gt;=&lt;/span&gt; &lt;span style="color: green; font-weight: bold;"&gt;new&lt;/span&gt; Dropzone(&lt;span style="color: #ba2121;"&gt;"form#dropzone"&lt;/span&gt;, { &lt;span style="color: #408080; font-style: italic;"&gt;// Make the whole body a dropzone&lt;/span&gt;
          url&lt;span style="color: #666666;"&gt;:&lt;/span&gt; &lt;span style="color: #ba2121;"&gt;'/'&lt;/span&gt;,  
          addRemoveLinks&lt;span style="color: #666666;"&gt;:&lt;/span&gt; &lt;span style="color: green; font-weight: bold;"&gt;true&lt;/span&gt;,  
          method&lt;span style="color: #666666;"&gt;:&lt;/span&gt; &lt;span style="color: #ba2121;"&gt;'put'&lt;/span&gt;,  
          chunking&lt;span style="color: #666666;"&gt;:&lt;/span&gt;&lt;span style="color: green; font-weight: bold;"&gt;true&lt;/span&gt;,
          forceChunking&lt;span style="color: #666666;"&gt;:&lt;/span&gt;&lt;span style="color: green; font-weight: bold;"&gt;true&lt;/span&gt;,      
          autoQueue&lt;span style="color: #666666;"&gt;:&lt;/span&gt; &lt;span style="color: green; font-weight: bold;"&gt;false&lt;/span&gt;,
          autoProcessQueue&lt;span style="color: #666666;"&gt;:&lt;/span&gt; &lt;span style="color: green; font-weight: bold;"&gt;false&lt;/span&gt;         
        });
        myDropzone.autoDiscover &lt;span style="color: #666666;"&gt;=&lt;/span&gt; &lt;span style="color: green; font-weight: bold;"&gt;false&lt;/span&gt;;
        
        myDropzone.on(&lt;span style="color: #ba2121;"&gt;"addedfile"&lt;/span&gt;, &lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt;(file) {
          &lt;span style="color: green; font-weight: bold;"&gt;var&lt;/span&gt; reader &lt;span style="color: #666666;"&gt;=&lt;/span&gt; &lt;span style="color: green; font-weight: bold;"&gt;new&lt;/span&gt; FileReader();
          &lt;span style="color: green; font-weight: bold;"&gt;if&lt;/span&gt; (myDropzone.files.length &lt;span style="color: #666666;"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color: #666666;"&gt;4&lt;/span&gt; ) {
              reader.onload &lt;span style="color: #666666;"&gt;=&lt;/span&gt; &lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt;(event) {
                 &lt;span style="color: #408080; font-style: italic;"&gt;// event.target.result contains base64 encoded image&lt;/span&gt;
                 console.log(&lt;span style="color: #ba2121;"&gt;"file being uploaded "&lt;/span&gt;)
                  storage_upload(&lt;span style="color: #ba2121;"&gt;"image"&lt;/span&gt;,event.target.result, file, myDropzone ,(r)&lt;span style="color: #666666;"&gt;=&amp;gt;&lt;/span&gt;{
                    console.log(&lt;span style="color: #ba2121;"&gt;"Storage upload response"&lt;/span&gt;)
                    console.log(r)
                  })
              };      
              reader.readAsDataURL(file); 
          }&lt;span style="color: green; font-weight: bold;"&gt;else&lt;/span&gt; {
            console.log(&lt;span style="color: #ba2121;"&gt;'skipping file as we are excceding the upload limit'&lt;/span&gt;)
          }
        });        

        myDropzone.on(&lt;span style="color: #ba2121;"&gt;"removedfile"&lt;/span&gt;, &lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt;(file){
          &lt;span style="color: green; font-weight: bold;"&gt;var&lt;/span&gt; storageRef &lt;span style="color: #666666;"&gt;=&lt;/span&gt; firebase.storage().ref(&lt;span style="color: #ba2121;"&gt;"/"&lt;/span&gt;);
          storageRef.child(file.fullPath).&lt;span style="color: green; font-weight: bold;"&gt;delete&lt;/span&gt;().then(
            &lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt;(){          
             console.log(file.fullPath  &lt;span style="color: #666666;"&gt;+&lt;/span&gt; &lt;span style="color: #ba2121;"&gt;" deleted succefuly"&lt;/span&gt;)
            }).&lt;span style="color: green; font-weight: bold;"&gt;catch&lt;/span&gt;(&lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt;(error) {
              console.log(&lt;span style="color: #ba2121;"&gt;"Something is wrong"&lt;/span&gt;)
              console.log(error)
            });
          })    
        });
&lt;/pre&gt;
&lt;!-------- --&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;h3 style="text-align: left;"&gt;
&lt;span style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Firebase upload function ( in index.js &lt;strike&gt;&lt;span style="color: red;"&gt;not in function.js&lt;/span&gt;&lt;/strike&gt; )&lt;/span&gt;&lt;/h3&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;!---------- --- &gt;
&lt;!-- HTML generated using hilite.me --&gt;&lt;br /&gt;
&lt;div style="background: #f8f8f8; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;"&gt;
&lt;pre style="line-height: 125%; margin: 0;"&gt;&lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt; storage_upload(filedata, filehandle, DropzoneHandle, cb) {

  &lt;span style="color: #408080; font-style: italic;"&gt;// Getting Handle of the progressbar element of current file // &lt;/span&gt;
  &lt;span style="color: green; font-weight: bold;"&gt;var&lt;/span&gt; progressBar &lt;span style="color: #666666;"&gt;=&lt;/span&gt; filehandle.previewElement.children[&lt;span style="color: #666666;"&gt;2&lt;/span&gt;]  

  &lt;span style="color: #408080; font-style: italic;"&gt;// Firestore storage task &lt;/span&gt;
  &lt;span style="color: green; font-weight: bold;"&gt;var&lt;/span&gt; task
  &lt;span style="color: #408080; font-style: italic;"&gt;// uuid for file being uploaded&lt;/span&gt;
  &lt;span style="color: green; font-weight: bold;"&gt;var&lt;/span&gt; uuid_string &lt;span style="color: #666666;"&gt;=&lt;/span&gt; uuid()

  &lt;span style="color: #408080; font-style: italic;"&gt;// Getting Storeage referance for file &lt;/span&gt;
  &lt;span style="color: green; font-weight: bold;"&gt;var&lt;/span&gt; storageRef &lt;span style="color: #666666;"&gt;=&lt;/span&gt; firebase.storage().ref(User.client_id &lt;span style="color: #666666;"&gt;+&lt;/span&gt; &lt;span style="color: #ba2121;"&gt;"/"&lt;/span&gt; &lt;span style="color: #666666;"&gt;+&lt;/span&gt; uuid_string );

  &lt;span style="color: #408080; font-style: italic;"&gt;// Because I am uploading file in base64 data_url // &lt;/span&gt;
  task  &lt;span style="color: #666666;"&gt;=&lt;/span&gt; storageRef.putString(filedata, &lt;span style="color: #ba2121;"&gt;'data_url'&lt;/span&gt;);
  
  &lt;span style="color: #408080; font-style: italic;"&gt;// Making progress bar of current file preview element visible  &lt;/span&gt;
  progressBar.opacity &lt;span style="color: #666666;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;"&gt;1&lt;/span&gt;

  task
    .on(firebase.storage.TaskEvent.STATE_CHANGED,

      &lt;span style="color: #408080; font-style: italic;"&gt;// Trakcing progress of upload&lt;/span&gt;
      &lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt; progress(snapshot){
        &lt;span style="color: green; font-weight: bold;"&gt;var&lt;/span&gt; progress &lt;span style="color: #666666;"&gt;=&lt;/span&gt; (snapshot.bytesTransferred &lt;span style="color: #666666;"&gt;/&lt;/span&gt; snapshot.totalBytes) &lt;span style="color: #666666;"&gt;*&lt;/span&gt; &lt;span style="color: #666666;"&gt;100&lt;/span&gt;;
    
        &lt;span style="color: #408080; font-style: italic;"&gt;// Updating progressbar width - to make it look like filling&lt;/span&gt;
        progressBar.children[&lt;span style="color: #666666;"&gt;0&lt;/span&gt;].style.width &lt;span style="color: #666666;"&gt;=&lt;/span&gt; progress&lt;span style="color: #666666;"&gt;+&lt;/span&gt;&lt;span style="color: #ba2121;"&gt;'%'&lt;/span&gt;
       
      },

      &lt;span style="color: #408080; font-style: italic;"&gt;// Firebase storeage upload error handling &lt;/span&gt;
      &lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt;(error) {
        &lt;span style="color: #408080; font-style: italic;"&gt;// Hanlde your way&lt;/span&gt;
        &lt;span style="color: #408080; font-style: italic;"&gt;// A full list of error codes is available at&lt;/span&gt;
        &lt;span style="color: #408080; font-style: italic;"&gt;// https://firebase.google.com/docs/storage/web/handle-errors&lt;/span&gt;
      },

      &lt;span style="color: #408080; font-style: italic;"&gt;// Finishing process and returing data&lt;/span&gt;
      &lt;span style="color: #408080; font-style: italic;"&gt;// Returning file-meta and  url&lt;/span&gt;
      &lt;span style="color: #408080; font-style: italic;"&gt;// and hiding progress bar  &lt;/span&gt;
      &lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt;() {

        &lt;span style="color: #408080; font-style: italic;"&gt;// Upload completed successfully, now we can get the meta data of file&lt;/span&gt;
        task.snapshot.ref.getMetadata().then(&lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt;(meta) {
   &lt;span style="color: #408080; font-style: italic;"&gt;// Getting download url of file&lt;/span&gt;
          task.snapshot.ref.getDownloadURL().then(&lt;span style="color: green; font-weight: bold;"&gt;function&lt;/span&gt;(downloadUrl){

              &lt;span style="color: #408080; font-style: italic;"&gt;// storing meta data and download url in object and returning &lt;/span&gt;
              &lt;span style="color: #408080; font-style: italic;"&gt;// it to callign function ... &lt;/span&gt;
              &lt;span style="color: green; font-weight: bold;"&gt;var&lt;/span&gt; response &lt;span style="color: #666666;"&gt;=&lt;/span&gt; {
                object_info&lt;span style="color: #666666;"&gt;:&lt;/span&gt; {
                  publicURL&lt;span style="color: #666666;"&gt;:&lt;/span&gt; downloadUrl,
                  metainfo&lt;span style="color: #666666;"&gt;:&lt;/span&gt; meta
                },
                type_of_object&lt;span style="color: #666666;"&gt;:&lt;/span&gt; type
              }
              filehandle.fullPath &lt;span style="color: #666666;"&gt;=&lt;/span&gt; meta.fullPath
              &lt;span style="color: green; font-weight: bold;"&gt;return&lt;/span&gt; cb(response)
            })
        })
        
        &lt;span style="color: #408080; font-style: italic;"&gt;// Hiding progress bar for current file &lt;/span&gt;
        progressBar.style.opacity &lt;span style="color: #666666;"&gt;=&lt;/span&gt; &lt;span style="color: #666666;"&gt;0&lt;/span&gt;
      }
    )
  
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;!-------- ---&gt;&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGRSQ4DAOEqyDRvqj9KVlaWKS4LAMoDoDRPyKOag71nFIJNO5EwnyF9BrQyNQ0jjAj8-Xv2oljcD1oobKVA2RbkMt7vw0iIHBGk3dQGfW9IHixmCaPnkZE4hv4vrCIGFodakB8tfI80cU/s72-c/firebase-dropzone-example.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Firebase - update a spacific fields of single element of object of array in firestore </title><link>http://www.mchampaneri.in/2018/10/firebase-update-spacific-fields-of.html</link><category>firebase</category><category>firestore</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Fri, 5 Oct 2018 11:43:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-129107069248795712</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMgRQ9xfapstFAcv0tpjCH_YJ-e-UxgSiCyfDrG8rk7bropfNJdszt28sJ9pVic1nDLVffxaxZYqYVOnl68a2-0-1lJyW9gt1M4iWksQtPHvlF2nAzuWW1J8mDhQW78_F3Tm3c-kPOKC0/s1600/udpate-spacific-field-of-element-of-array-in-firestore.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img alt="Firebase - update a spacific fields of single element of object of array in firestore " border="0" data-original-height="502" data-original-width="1235" height="260" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMgRQ9xfapstFAcv0tpjCH_YJ-e-UxgSiCyfDrG8rk7bropfNJdszt28sJ9pVic1nDLVffxaxZYqYVOnl68a2-0-1lJyW9gt1M4iWksQtPHvlF2nAzuWW1J8mDhQW78_F3Tm3c-kPOKC0/s640/udpate-spacific-field-of-element-of-array-in-firestore.png" title="Firebase - update a spacific fields of single element of object of array in firestore " width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Firebase - update a spacific fields of single element of object of array in firestore&amp;nbsp;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Its actully advisable to use map instead of array when ever it is possible. But, there are cetain cases where you don't have option to do so.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;For example, you are directly saving the response from some outer source without any modification and they send you an array. In this case you will have array to work with.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Firestore does not support array here is why&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;"bad things can happen if you have multiple clients all trying to update or delete array elements at specific indexes. In the past, Cloud Firestore addressed these issues by limiting what you can do with arrays "&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif; font-size: x-small;"&gt;For more details information you can refer to Kato Richardson post &lt;a href="https://firebase.googleblog.com/2014/04/best-practices-arrays-in-firebase.html" target="_blank"&gt;Best Practices: Arrays in Firebase&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkeZS2G-ldRaJW6_ZcSvqzWOHMnBhx5iRHQPZtit5okWe0zqyBGI9IQ2GWV2y6-9XfejUpPPX2r2DR4d55DLgK7LIyryZauOfqjvE89p_zXR238dD_2JfEQfmb-_498bIoalzeOAz1Lmg/s1600/firestore-array-element-update.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img alt="Firestore document having array [ used from stackoverflow question ]" border="0" data-original-height="470" data-original-width="1235" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkeZS2G-ldRaJW6_ZcSvqzWOHMnBhx5iRHQPZtit5okWe0zqyBGI9IQ2GWV2y6-9XfejUpPPX2r2DR4d55DLgK7LIyryZauOfqjvE89p_zXR238dD_2JfEQfmb-_498bIoalzeOAz1Lmg/s640/firestore-array-element-update.png" title="Firestore document having array [ used from stackoverflow question ]" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Firestore document having array [ used from stackoverflow question ]&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Suppose you have array of object something like shown in array. Now you want to update endTime field of the object on the index [1].&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;There is no direct way to update it. You might get some solution like this on internet.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;&amp;nbsp;db.collection(something).doc(something)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .collection(something").doc(something)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .update({&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "data.[1].startTime": [ value]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;&amp;nbsp;db.collection(something).doc(something)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .collection(something").doc(something)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .update({&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "data.${1}.startTime": [ value]&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: red; font-family: Verdana, sans-serif;"&gt;But none of this is working actully [ at least not for me].&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;The only way to perform update on existin array element is to fetch complete array upate the desired element and update complete array.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&lt;b&gt;// First data of the desired document&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; db.collection(something).doc(something)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .collection(something).doc(something)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .get().then((doc) =&amp;gt; {&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt; &amp;nbsp; // Assign array to local javascript variable&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var objects = doc.data().dates&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Assing desired element of object to local javascript variable&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var objectToupdate = objects [1]&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt; &amp;nbsp; // Update field of the element assigned to local javascript variable&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; objectToupdate.startDate = [new Date]&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt; &amp;nbsp; &amp;nbsp; // reassign object to local array variable&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; objects [1] = objectToupdate&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;b&gt; &amp;nbsp; &amp;nbsp; // Update complete array with update copy of element we have&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // created in local javascript variable.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; db.collection(something).doc(something)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .collection(something).doc(something)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .update({&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dates: dates&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; })&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #38761d; font-family: Verdana, sans-serif;"&gt;&amp;nbsp; &amp;nbsp;})&lt;/span&gt;&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMgRQ9xfapstFAcv0tpjCH_YJ-e-UxgSiCyfDrG8rk7bropfNJdszt28sJ9pVic1nDLVffxaxZYqYVOnl68a2-0-1lJyW9gt1M4iWksQtPHvlF2nAzuWW1J8mDhQW78_F3Tm3c-kPOKC0/s72-c/udpate-spacific-field-of-element-of-array-in-firestore.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total></item><item><title>mailgun forward incoming mail</title><link>http://www.mchampaneri.in/2018/09/mailgun-forward-incoming-mail.html</link><category>Awesome</category><category>domain</category><category>Email</category><category>Server</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Mon, 10 Sep 2018 18:14:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-3180917518771075220</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Mailgun is email service provider. For detail infomration about mailgun you can visit its site &lt;a href="https://www.mailgun.com/" target="_blank"&gt;mailgun.com&lt;/a&gt;. Untill my last project( &lt;a href="http://blogger-editor.xyz/" target="_blank"&gt;blogger-editor.xyz&lt;/a&gt;) i was just using mailgun sending mails. There was no need to receive emails on that domain.&lt;br /&gt;
&lt;br /&gt;
But in &lt;a href="http://blogger-editor.xyz/" target="_blank"&gt;blogger-editor.xyz&lt;/a&gt;, I need to have a domain based email address on which i should send and receive email. Its quite straight forward setup to receive email through mailgun.&lt;br /&gt;
&lt;br /&gt;
Just you have to do these two things :&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Make sure your mx record points to mailgun. [ It should be ticked verfied on mailgun dns verification ]&lt;/li&gt;
&lt;li&gt;Setup route on mailgun&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;h2&gt;
MX Record setup with Domain Registrar&lt;/h2&gt;
&lt;br /&gt;
In domain verification and Dns section of mailgun you will find that you have to setup two mx record with your domain service provider.&lt;br /&gt;
&lt;br /&gt;
&lt;ol style="text-align: left;"&gt;
&lt;li&gt;mxb.mailgun.org  ( priority 10 )&lt;/li&gt;
&lt;li&gt;mxb.mailgun.org  ( priority 10 )&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
During creation of mx record you will be asked for host. Host value for your record is the @ if you are using root domain with mailgun , and it will be subdomain value if you are using subdomain with mailgun like mg.samplesite.com&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5eRSpGfy-LhUBmOHN8RKeQGwzkIKvw0eyWGCb0wpjM2uDry17XeK7R_01I0z8DBIF9N6CAQs-Le9kTQiZkkTZE199vEF_rqLCxSSvWVg9I0lrZ_IMNfbNHuFKWqlBoEM7dReNOXuA2q8/s1600/mx-records.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="create mx record with appropriate host [ i have used mg subdomain so have used mg as host (godday is my registrar)]" border="0" data-original-height="117" data-original-width="1200" height="62" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5eRSpGfy-LhUBmOHN8RKeQGwzkIKvw0eyWGCb0wpjM2uDry17XeK7R_01I0z8DBIF9N6CAQs-Le9kTQiZkkTZE199vEF_rqLCxSSvWVg9I0lrZ_IMNfbNHuFKWqlBoEM7dReNOXuA2q8/s640/mx-records.png" title="create mx record with appropriate host [ i have used mg subdomain so have used mg as host (godday is my registrar)]" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;create mx record with appropriate host [ i have used mg subdomain so have used mg as host (godday is my registrar)]&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Make sure your mx records are verified by maingun. It should be right inside green circle. Other wise some thing is wrong with your mx record.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM44U618w9DXbgaJeX5-BlxBV6s2Pya2qPir3LuyoH3pyLUVqMdY4AZEwDR-1UWPkv9O19KsFZMm2cJg67j1j5aLmwn2b5tPyQ5SRSOT9WZVz1i1ua-zqRHYqIkLDCf1wBOBBHzIk-9ZY/s1600/verified-mx-records-on-mailgub.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="mx records verified by mailgun" border="0" data-original-height="234" data-original-width="1041" height="142" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM44U618w9DXbgaJeX5-BlxBV6s2Pya2qPir3LuyoH3pyLUVqMdY4AZEwDR-1UWPkv9O19KsFZMm2cJg67j1j5aLmwn2b5tPyQ5SRSOT9WZVz1i1ua-zqRHYqIkLDCf1wBOBBHzIk-9ZY/s640/verified-mx-records-on-mailgub.png" title="mx records verified by mailgun" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;mx records verified by mailgun&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;h2&gt;
Route Setup on Mailgun&lt;/h2&gt;
&lt;br /&gt;
What mailgun says about routes is " Mailgun Routes filter messages and trigger defined actions based on those filters. "&lt;br /&gt;
&lt;br /&gt;
Mailgun does not provide faciltity like inbox  where you can directly see mails you have received. But they provieds an api for fetching emails. They also provied facility to forward email.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Here you have two option &lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Use api and create your own inbox app which will read mails from mailgun storage&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Use mailguns routes forward faciltity and forward that mail to your email address ( abc@gmail.com etc .. .)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf_IVXjIVfDENGrFL1n_xT0FWo3xFI5LTf0OfzFKfMZVwS6racqPUB89FLW21spHMEl52splztxuYQIWSTf6NxIkUF0_jdS9BQ6oqLhaWZIiRY7XreKUaYPf_-u67IsurIGzC1jdvlja4/s1600/forward+mail.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="Setup route for mail forwarding on mailgun" border="0" data-original-height="506" data-original-width="1152" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf_IVXjIVfDENGrFL1n_xT0FWo3xFI5LTf0OfzFKfMZVwS6racqPUB89FLW21spHMEl52splztxuYQIWSTf6NxIkUF0_jdS9BQ6oqLhaWZIiRY7XreKUaYPf_-u67IsurIGzC1jdvlja4/s640/forward+mail.png" title="Setup route for mail forwarding on mailgun" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Setup route for mail forwarding on mailgun&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj5eRSpGfy-LhUBmOHN8RKeQGwzkIKvw0eyWGCb0wpjM2uDry17XeK7R_01I0z8DBIF9N6CAQs-Le9kTQiZkkTZE199vEF_rqLCxSSvWVg9I0lrZ_IMNfbNHuFKWqlBoEM7dReNOXuA2q8/s72-c/mx-records.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Find count of day differance between two dates</title><link>http://www.mchampaneri.in/2018/09/find-count-of-day-differance-between.html</link><category>Go</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Fri, 7 Sep 2018 14:32:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-8882850296841662538</guid><description>&lt;p&gt;
&lt;/p&gt;&lt;p&gt;In golang there is no direct way [ atleast i don't know ] to find count of differance in days between two days. So, I do it the way might every one does [ except who has already faced this ].&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;h2&gt;Partial Solution&lt;/h2&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;What I does is just find out duration differance of two dates using sub function.

&lt;/p&gt;&lt;pre class="ql-syntax" spellcheck="false"&gt;differance := time.Now().Sub( startTime )
daysCount := int(differance.Hours() / 24.0)
&lt;/pre&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;It might seem ok. But, there is a problem with this solution.&amp;nbsp;

&lt;/p&gt;&lt;p&gt;Let assume,&amp;nbsp;startTime is &lt;u&gt;2018-02-02 23:59:59&lt;/u&gt;.&amp;nbsp;&amp;nbsp;

&lt;/p&gt;&lt;p&gt;In this case&amp;nbsp;daysCount&amp;nbsp;will be 0 on next day [ 2018-02-03 ] until time is &lt;u&gt;2018-02-03 23:59:59.&lt;/u&gt;

&lt;/p&gt;&lt;h2&gt;Perfect Solution&lt;/h2&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: yellow;"&gt;Simple solution is just normalize startTime to starting of that date&lt;/span&gt;.
&lt;/p&gt;&lt;pre class="ql-syntax" spellcheck="false"&gt;normalizedTime := time.Date(startTime&amp;nbsp;.Year(),startTime&amp;nbsp;.Month(),startTime&amp;nbsp;.Day(), 0, 0, 0, 0, time.Local)
differance := time.Now().Sub( normalizedTime&amp;nbsp;)
daysCount := int(differance.Hours() / 24.0)
&lt;/pre&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;normalizedTime is startTime but at starting of date.
&lt;/p&gt;&lt;p&gt;So, Now we are substracting time from&amp;nbsp;&lt;u&gt;2018-02-02 00:00:00&lt;/u&gt; instead of&amp;nbsp;&lt;u&gt;2018-02-02 23:59:59&lt;/u&gt;.&amp;nbsp;
&lt;/p&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Setup forward proxy in apache2</title><link>http://www.mchampaneri.in/2018/08/setup-forward-proxy-in-apache2.html</link><category>Server</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Wed, 22 Aug 2018 18:09:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-3289775391094510441</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
Proxy word is noramally used for forward proxy. It forwards requst to other server and pass downs the response to the client.&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This post is not supposed to describe the differneace between forward and revsers proxy.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
But if you want to find out exact differance you can refer this stackoverflow post.&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;&lt;a href="https://stackoverflow.com/questions/224664/difference-between-proxy-server-and-reverse-proxy-server"&gt;https://stackoverflow.com/questions/224664/difference-between-proxy-server-and-reverse-proxy-server&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
To setup forward proxy on your apahce2. you have to install [ if you are on linux ] / enable [ if you are using windows ] modules&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;ul style="text-align: left;"&gt;
&lt;li&gt;mod_proxy.so&lt;/li&gt;
&lt;li&gt;mod_proxy_ajp.so&lt;/li&gt;
&lt;li&gt;mod_proxy_balancer.so&lt;/li&gt;
&lt;li&gt;mod_proxy_connect.so&lt;/li&gt;
&lt;li&gt;mod_proxy_http.so&lt;/li&gt;
&lt;li&gt;mod_slotmem_shm.so&lt;/li&gt;
&lt;li&gt;mod_ssl.so&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;span style="color: red;"&gt;[ If I am includeing any extra please corrent me. But I had to eanble all this modules. ]&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: red;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
You have to make virtual host for proxy forward&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&amp;lt; VirtualHost *: XX&amp;nbsp; &amp;gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="white-space: pre;"&gt; &lt;/span&gt;ProxyRequests On&lt;/div&gt;
&lt;div&gt;
&lt;span style="white-space: pre;"&gt; &lt;/span&gt;ProxyVia On&lt;/div&gt;
&lt;div&gt;
&lt;span style="white-space: pre;"&gt; &lt;/span&gt;&amp;lt; Proxy * &amp;gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="white-space: pre;"&gt;  &lt;/span&gt;&amp;nbsp; Require all granted&lt;/div&gt;
&lt;div&gt;
&lt;span style="white-space: pre;"&gt; &lt;/span&gt;&amp;lt; /Proxy &amp;gt;&lt;/div&gt;
&lt;div&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
You can restrict forward proxy for the request from certain hosts only. Just have change required greatend&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&amp;lt;VirtualHost *:&amp;nbsp; xx &amp;gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="white-space: pre;"&gt; &lt;/span&gt;ProxyRequests On&lt;/div&gt;
&lt;div&gt;
&lt;span style="white-space: pre;"&gt; &lt;/span&gt;ProxyVia On&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Allow certain host only to&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // use forward proxy&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//&amp;nbsp; For other hosts it will block&lt;/div&gt;
&lt;div&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//&amp;nbsp; Requests&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #3d85c6;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;&amp;lt;Proxy *&amp;nbsp;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #3d85c6;"&gt;&lt;span style="white-space: pre;"&gt;  &lt;/span&gt;&amp;nbsp; Require xx . xxx . xxx . xxx&amp;nbsp; granted&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #3d85c6;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;&amp;lt;/Proxy&amp;nbsp;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Packfolder : archive your resource of sciter based application</title><link>http://www.mchampaneri.in/2018/08/packfolder-archive-your-resource-of.html</link><category>GUI</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Tue, 7 Aug 2018 17:11:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-6745667846929164681</guid><description>&lt;h2 style="text-align: left;"&gt;&lt;span style="color: inherit; font-size: inherit;"&gt;&lt;span class="" style="font-family: &amp;quot;verdana&amp;quot; , sans-serif;"&gt;Packfolder&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;packfolder&amp;nbsp;is utility provided as part&amp;nbsp;&lt;a href="https://www.mchampaneri.in/2018/06/sciter-gui-application-with-golang.html" target="_blank"&gt;sciter-sdk&lt;/a&gt;. It compresses resources folder under a single file of the format of your choice ( should support by&amp;nbsp;packfolder&amp;nbsp;).&amp;nbsp;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;Currently, the supported output formats are&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;Syntex, &lt;/p&gt;&lt;p&gt;[path]\packfolder.exe [resource-folder] [resource-file].[ext] -V [name-of-variable] -[output-format]

&lt;/p&gt;&lt;p&gt;For example,
&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: white; font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;"&gt;Windows PowerShell&lt;/span&gt;
&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: white;"&gt;Copyright (C) Microsoft Corporation. All rights reserved.
PS&amp;nbsp;08-packfolderIntro&amp;gt; .\packfolder.exe res res.go -v resources -go&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW9OJaOCC3AAseafSU-m1ZkQy669RxMPunNbVrUdYGQ_04VL033ZOnZDt_D8hpJp6aFQiPQJEThx1Bj3SXxu-UL5h-MIaBWhELJBgMHx_uoKDRtbsRUH7F1Vd6ERz1Gd2uDdRRY7r7UY0/s1600/image.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="176" data-original-width="570" height="122" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW9OJaOCC3AAseafSU-m1ZkQy669RxMPunNbVrUdYGQ_04VL033ZOnZDt_D8hpJp6aFQiPQJEThx1Bj3SXxu-UL5h-MIaBWhELJBgMHx_uoKDRtbsRUH7F1Vd6ERz1Gd2uDdRRY7r7UY0/s400/image.png" width="400"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Source Code&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href="https://github.com/mchampaneri/go-sciter-example/tree/master/08-packfolderIntro" target="_blank"&gt;08-packfolderIntro&lt;/a&gt;
&lt;/p&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjW9OJaOCC3AAseafSU-m1ZkQy669RxMPunNbVrUdYGQ_04VL033ZOnZDt_D8hpJp6aFQiPQJEThx1Bj3SXxu-UL5h-MIaBWhELJBgMHx_uoKDRtbsRUH7F1Vd6ERz1Gd2uDdRRY7r7UY0/s72-c/image.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item><item><title>Use packfolder to archive your resource </title><link>http://www.mchampaneri.in/2018/08/use-packfolder-to-archive-your-resource.html</link><category>Go</category><category>tools</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Tue, 7 Aug 2018 16:56:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-4267291928507050040</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQK1DB3SWMJTt_SyS0NfZnQJPnfBCrsFdF8ysb9wltyzzLmM_tN90p3mWft4z2PXV-sOqoVbxiNCPg_DJLCXIX9Hz1IrRGwE0EvZA35CesLQuU3qG4t_n6uERNQOaGnBZ5JmiLZjUFuGc/s1600/packfolder-cover.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="502" data-original-width="936" height="342" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQK1DB3SWMJTt_SyS0NfZnQJPnfBCrsFdF8ysb9wltyzzLmM_tN90p3mWft4z2PXV-sOqoVbxiNCPg_DJLCXIX9Hz1IrRGwE0EvZA35CesLQuU3qG4t_n6uERNQOaGnBZ5JmiLZjUFuGc/s640/packfolder-cover.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;In &lt;a href="https://github.com/sciter-sdk/go-sciter/commit/25d8ed42e0bb4c4acb742de9f148f6902d32ff41" target="_blank"&gt;commit 25d8ed42e0bb4c4acb742de9f148f6902d32ff41 go-sciter SDK &lt;/a&gt;has added one new facility&amp;nbsp;which automatically resolves file path&amp;nbsp;for archived data . Now you can use archived data from the archive and it will resolve import by itself, as it does for c &amp;amp; c++.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h3 style="text-align: left;"&gt;&lt;span style="font-family: inherit;"&gt;Packfolder&lt;/span&gt;&lt;/h3&gt;&lt;span style="font-family: inherit;"&gt;packfolder is utility provided as part sciter-sdk. It compresses resources folder under a single file of the format of your choice ( should support by packfolder ). Currently, supported output format files are bin ( normal binary file ) an array of bytes in c, go, d and rust language.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;Syntex is ,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;"&gt;[path]\packfolder.exe [resource-folder] [resource-file].[ext] -V [name-of-variable] -[output-format]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;path = full / relative path to packfolder.exe to execute command&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;resource-folder = full/relative path to the folder inside which your resouce is contained&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;resource-file&amp;nbsp; = name of the file you want as your output file&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;name-of-variable = it will the name of the varilble that will iniated with the array of bytes of your resource folder&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: inherit;"&gt;output-format = format of your output file&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3 style="text-align: left;"&gt;Example&amp;nbsp;&lt;/h3&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;[ ps stands for PowerShell&amp;nbsp;- I'm using windows ]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhISQyGXrJ9bgaiToHAiBD_QKE4qvR0s1WVX2ebuIyDjWcOQ4pJnOiAkDuv6RQcNmZYocAI1ioltK82Bq5Dj0qzxllmrXZDoHNvLZqicCOYIyDlUDR2sk1ei1v7WNR94Oa6tv7cYYV1Sp4/s1600/before-packfolder-exection.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="unarchived res folder " border="0" data-original-height="340" data-original-width="1171" height="115" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhISQyGXrJ9bgaiToHAiBD_QKE4qvR0s1WVX2ebuIyDjWcOQ4pJnOiAkDuv6RQcNmZYocAI1ioltK82Bq5Dj0qzxllmrXZDoHNvLZqicCOYIyDlUDR2sk1ei1v7WNR94Oa6tv7cYYV1Sp4/s400/before-packfolder-exection.png" title="unarchived res folder " width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b style="font-family: inherit;"&gt;Command&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;courier new&amp;quot; , &amp;quot;courier&amp;quot; , monospace;"&gt;PS:.\packfolder.exe res res.go -V resource -go&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;here &amp;nbsp;I've put packfolder.exe in the same folder as my project. [ ya, you can do that, after all, packfolder is standalone utitily . ]&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;res is the folder which contians resource used in my app&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJZRB5JCWYVYFmR8tz12eseuJUnzU_rnJPkslNUtLYun8UW0231CVoXxD3k7tScDB7_shOjVYDPULCMHweBrYgx34-0qh_mYTNLAPAnSlYhcoJ4x9ES6ygJA-seMylZklAA8TavOAyHz8/s1600/folder-to-be-compressed.png" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img alt="Resource folder we want to compress" border="0" data-original-height="352" data-original-width="1249" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJZRB5JCWYVYFmR8tz12eseuJUnzU_rnJPkslNUtLYun8UW0231CVoXxD3k7tScDB7_shOjVYDPULCMHweBrYgx34-0qh_mYTNLAPAnSlYhcoJ4x9ES6ygJA-seMylZklAA8TavOAyHz8/s400/folder-to-be-compressed.png" title="Resource folder we want to compress" width="400" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;res.go is the file &lt;/span&gt;I&lt;span style="font-family: inherit;"&gt; am &lt;/span&gt;expecting&lt;span style="font-family: inherit;"&gt; to be generated on compress of the resource folder.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWqpx1Pp_4XHwcOc7fWkrUtSjKFY1Vo7mb7VQ2XgO_gIlFM2ExiSxDJu0Uq964z77VNH5XmKKHG7auwJTEOXawuFusN8BeDAQ8xsSafdqAHVuWOWka2cNRgPufna385gibtFSufSipTpk/s1600/resource-file-generated.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" data-original-height="387" data-original-width="1245" height="123" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhWqpx1Pp_4XHwcOc7fWkrUtSjKFY1Vo7mb7VQ2XgO_gIlFM2ExiSxDJu0Uq964z77VNH5XmKKHG7auwJTEOXawuFusN8BeDAQ8xsSafdqAHVuWOWka2cNRgPufna385gibtFSufSipTpk/s400/resource-file-generated.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;-V stands for the variable name I want the variale name as resoruce so I&amp;nbsp; "&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;-V resource"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;and at last, i want output for the golang file. so -go&lt;/span&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDb3Uy5O67KKWycRjyrtwx8Wl8jkeJCWDtiDRExBSke-V3WTvUEyr4D_5E06YCTMGiMdlj9YYIKCmfjhlZMCgqh0PGrCsqRUKGxHo6VHvSg2_pg6R6yd2D56lSQfV4jfRClEByqDvrxAw/s1600/resouce-file-screenshot.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img alt="res.go file containing bytes of archived data " border="0" data-original-height="299" data-original-width="920" height="208" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDb3Uy5O67KKWycRjyrtwx8Wl8jkeJCWDtiDRExBSke-V3WTvUEyr4D_5E06YCTMGiMdlj9YYIKCmfjhlZMCgqh0PGrCsqRUKGxHo6VHvSg2_pg6R6yd2D56lSQfV4jfRClEByqDvrxAw/s640/resouce-file-screenshot.png" title="res.go file containing bytes of archived data " width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;It will generate a syntactilly valid file of golang contiaing bytes of our archive.&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: inherit;"&gt;Upto this we have compressed our res folder in a single resource file.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4 style="text-align: left;"&gt;Load archived resource in your App using &lt;span style="color: #f1c232;"&gt;SetResourceArchive&lt;/span&gt;&lt;/h4&gt;&lt;span style="font-family: inherit;"&gt;&lt;b&gt;SetResouceArchive &lt;/b&gt;function is responsible for loading the archived file at their relative paths.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;func main() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;// make rect for window&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;rect := sciter.NewRect(100, 100, 300, 500)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;// create a window using upper rect&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;win, _ := window.New(sciter.SW_MAIN|sciter.SW_CONTROLS|sciter.SW_RESIZEABLE, rect)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;// SetResourceArchive expects array of bytes as input&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;// It does open the archive and also auto resolvs file&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;// file path&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;// Here resoure is array of bytes that has been generated&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;// by packfolder.exe&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="background-color: yellow; font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;win.SetResourceArchive(resources)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;win.LoadFile("this://app/htdocs/notepad.htm")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;win.SetTitle("Notepad+-")&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;// registering methods&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;win.DefineFunction("closeWindow", closeApplication)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;win.DefineFunction("save", save)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;win.DefineFunction("open", open)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;win.Show()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;win.Run()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;span style="white-space: pre;"&gt; &lt;/span&gt;win.CloseArchive()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style="font-family: inherit;"&gt;So now your resource are part of your gocode. There is no need to ship the resource folder any more. It also make your resource safe and hidden from outside.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For example, visit &lt;a href="https://github.com/mchampaneri/go-sciter-example/tree/master/08-packfolderIntro" target="_blank"&gt;08-packfolderIntro&lt;/a&gt;&lt;/div&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQK1DB3SWMJTt_SyS0NfZnQJPnfBCrsFdF8ysb9wltyzzLmM_tN90p3mWft4z2PXV-sOqoVbxiNCPg_DJLCXIX9Hz1IrRGwE0EvZA35CesLQuU3qG4t_n6uERNQOaGnBZ5JmiLZjUFuGc/s72-c/packfolder-cover.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Remove console screen for your gui application written in go</title><link>http://www.mchampaneri.in/2018/07/remove-console-screen-for-your-gui.html</link><category>Go</category><category>GUI</category><author>noreply@blogger.com (Manish Champaneri)</author><pubDate>Fri, 20 Jul 2018 11:24:00 +0530</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-7409277376735838981.post-3406081027076541097</guid><description>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrR8jrFzMGjCoVoLjdlQ-EOypd2nhDNnEV3q3Av0tvmd-l7KBbpnt4sNgn8ltigIZCTQtcF9oq3xLqNgA0cV7sw2EWSgmWobuDvrd9e5pmWiv3ReOh8_tsG6AQW0mzhzE-Hm-i8GdWCi4/s1600/console-less-gui-appliaction-golang.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img alt="Remove console screen for your gui application written in go" border="0" data-original-height="502" data-original-width="936" height="342" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrR8jrFzMGjCoVoLjdlQ-EOypd2nhDNnEV3q3Av0tvmd-l7KBbpnt4sNgn8ltigIZCTQtcF9oq3xLqNgA0cV7sw2EWSgmWobuDvrd9e5pmWiv3ReOh8_tsG6AQW0mzhzE-Hm-i8GdWCi4/s640/console-less-gui-appliaction-golang.png" title="Remove console screen for your gui application written in go" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Remove console screen for your gui application written in go&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Arial, Helvetica, sans-serif; font-size: x-small;"&gt;Images of appliaction used as example is&amp;nbsp;notepad plus minus. I writen as example. To get details of this program you can &lt;a href="https://go-sciter.mchampaneri.in/2018/07/simple-documnet-based-appliaction-with.html" target="_blank"&gt;visit post " Simple document based application with golang "&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;You write a GUI application and it runs with a console screen behind. It looks pretty weird, right! I mean what is the meaning of a console when console actually&amp;nbsp;not going to interact with the user.&amp;nbsp;&lt;/span&gt;&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVPlotpK3Qb2abH9v79Y_sp8K1VVIBRcoDYqTwjuWtQV3HPA1INR6c1HDASaVmN2qvm2NSGfjcZ5PNVdz5hHpnWeUJqpmOYgSBjA01zYQX2u1amwN_kzKbmfsOXjn-h7G_gk4AfJlsVwM/s1600/go-gui-app-with-console.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img alt="GoLang Gui Appliaction with Console Screen" border="0" data-original-height="499" data-original-width="1108" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVPlotpK3Qb2abH9v79Y_sp8K1VVIBRcoDYqTwjuWtQV3HPA1INR6c1HDASaVmN2qvm2NSGfjcZ5PNVdz5hHpnWeUJqpmOYgSBjA01zYQX2u1amwN_kzKbmfsOXjn-h7G_gk4AfJlsVwM/s640/go-gui-app-with-console.png" title="GoLang Gui Appliaction with Console Screen" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;GoLang Gui Application with Console Screen&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Don't know how this works on Mac or Linux as I have not done this on either Mac or Linux. But for windows, I find a way to compile console-less GUI application for golang.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;Just build the application with this argument.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Courier New, Courier, monospace;"&gt;go build -ldflags&amp;nbsp;"-H=windowsgui"&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;ldflags&amp;nbsp;used to set build time variable. Now. in the upper statement we are saying golang that current application we are building is windowsgui application so don't create the console with it. Just create a GUI of application.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizfbwpl06PacmVWraUe0LtWKgPZcnLo6LJBOCEdCjhc3WgcJA2f_mQRBxGcacByG3QowXRtrq_p5D59jbSFJ6ptAzixrcXtmh95N0QaXPmAV7QXqzrF6W73FOQUGM-3v6Lk9YYzyXea3w/s1600/go-gui-appliaction-without-console.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;&lt;img alt="Go Gui Application without console" border="0" data-original-height="533" data-original-width="342" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizfbwpl06PacmVWraUe0LtWKgPZcnLo6LJBOCEdCjhc3WgcJA2f_mQRBxGcacByG3QowXRtrq_p5D59jbSFJ6ptAzixrcXtmh95N0QaXPmAV7QXqzrF6W73FOQUGM-3v6Lk9YYzyXea3w/s320/go-gui-appliaction-without-console.png" title="Go Gui Application without console" width="205" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span style="font-family: Verdana, sans-serif;"&gt;Go Gui Application without console&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrR8jrFzMGjCoVoLjdlQ-EOypd2nhDNnEV3q3Av0tvmd-l7KBbpnt4sNgn8ltigIZCTQtcF9oq3xLqNgA0cV7sw2EWSgmWobuDvrd9e5pmWiv3ReOh8_tsG6AQW0mzhzE-Hm-i8GdWCi4/s72-c/console-less-gui-appliaction-golang.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total></item></channel></rss>