{
	"version": "https://jsonfeed.org/version/1",
	"title": "Sanat Hegde",
	"icon": "https://www.gravatar.com/avatar/70e5a679fca8cb4e7c81ebc1fae696fb?s=96&d=https%3A%2F%2Fmicro.blog%2Fimages%2Fblank_avatar.png",
	"home_page_url": "https://sanat.is/",
	"feed_url": "https://sanat.is/feed.json",
	"items": [
			{
				"id": "http://sanat.micro.blog/2026/09/05/out-of-done.html",
				"title": "6 out of 3 done",
				"content_html": "<p>I added a <a href=\"https://fitbod.me/\">Fitbod</a> widget to my phone’s home screen, thinking I’d start a new gym streak today.</p>\n\n<p>It showed me that I’d already done six out of the three workouts I planned for this week.</p>\n\n<p>Turns out my <a href=\"https://www.whoop.com/in/en/\">Whoop</a> is tracking my walks, my swims and even “playtime with child.”</p>\n\n<p>I’ve been feeling like I should be exercising more. I want to get back to my super-fit body, and something like three months of going to the gym every day will definitely get me there.</p>\n\n<p>But I’m suddenly aware that I have a pretty decent body right now as well—because of the swims, the walks, the irregular gym visits and the regular “playtime with child” workouts.</p>\n\n<p>Perhaps I’m already doing the things I need to do. I just don’t acknowledge the little things that go into making the big thing.</p>\n\n<p>That feels true about the rest of my life as well.</p>\n\n<p>Objectively, life is great. I have an amazing two-year-old, a (dare I say) ridiculously <a href=\"https://hirevire.com/\">good business</a>, a good family life, a great house and a community that I’m part of.</p>\n\n<p>I’m not stuck. But I sometimes feel stagnant.</p>\n\n<p>Keeping up with what I already have is consuming. I feel like I need explosive growth in some areas, while a lot of my time goes into the general maintenance work of living a life that I’m happy—and not guilty—about.</p>\n\n<p>Coming back from a holiday makes a fresh start feel possible. Time in nature, especially time around the sea, is really restorative for me. Something about travel gives you enough perspective to see your life a little differently.</p>\n\n<p>Perhaps a fresh start doesn’t always mean starting from zero. Sometimes it means noticing what you’re already doing and deciding to keep going.</p>\n\n<p>I went looking for a streak I could start.</p>\n\n<p>Turns out I was already 6 out of 3 done.</p>\n",
				
				"date_published": "2026-09-05T07:11:28-05:00",
				"url": "https://sanat.is/2026/09/05/out-of-done.html"
			},
			{
				"id": "http://Sanat.micro.blog/2021/09/09/sanat-hegde-and.html",
				"title": "Sanat Hegde and Sunil Shenoy on side projects",
				"content_html": "\n\n<p>You can listen to us here</p>\n\n<iframe src=\"https://share.listnr.fm/embed/podcast/63536e623e51ec001d5cc4df?minimal=true\" frameborder=\"no\" scrolling=\"no\" seamless width=\"100%\" height=\"90\"></iframe>\n\n<p>Transcript:</p>\n\n<h1 id=\"5-on-side-projects\">#5 - On Side Projects</h1>\n\n<p>Sanat: Hello. Hello, welcome to the Sanat and Sunil show, I&rsquo;m Sanat.</p>\n\n<p>Sunil: Hi I&rsquo;m Sunil.</p>\n\n<p>Sanat: today we want to talk about why you should be starting a side project.</p>\n\n<p>Sunil: And also about the side projects that we have done, so far.</p>\n\n<p>Sanat: some of our learnings about side projects</p>\n\n<p>Sunil: so why start side projects? One of the reasons for me has to be that. There&rsquo;s so many new things on the internet be it JavaScript frameworks, be it new languages. You come across all these tools like, Hey, CloudFlare has released cloud workers there are new hosting platforms.</p>\n\n<p>Sunil: And it&rsquo;s always good to keep experimenting with these tools or just learn it because at the normal. Nine to five job or the projects that I currently work on for money. Most of these projects need a stable platform,</p>\n\n<p>Sunil: I want to bet on technologies, which have been there for a long time, but I also want to see what the latest and greatest is and side projects for me. have been the go-to place where maybe I could build an API using Go and I could use serverless. And in the next two years, when my actual job requires that we build a serverless API for whatever reason, like if there was a use case for that, I could base that on that experience.</p>\n\n<p>Sunil: It&rsquo;s a good place to learn and experiment.</p>\n\n<p>Sanat: I think learning is super critical, right? You have to constantly find things that improve you and at least make you slightly better. And reading about something is not the same as working with it. Both of us, when we start reading about something, we want to start using it. Side projects are a great way to use something it&rsquo;s like a small.</p>\n\n<p>Sanat: That you can make, you can see whether this works or not, or how it works for you without it affecting your primary stream of work. That&rsquo;s the prime motivation for me, to learn something. It&rsquo;s best to try something, in a real use case where you are able to publish that out.</p>\n\n<p>Sanat: Productionize it at least put it out in the world.</p>\n\n<p>Sunil: The thing that you mentioned, to put it out there into the real world, that has to be the most critical part of a side project, because if you keep. Building on your local machine. If it&rsquo;s not a product or a tool that someone is using, then the motivation to keep working on it.</p>\n\n<p>Sunil: That goes down.</p>\n\n<p>Sunil: Maintaining it though. That&rsquo;s a different topic altogether.</p>\n\n<p>Sanat: so so the important thing is to start working on something. That&rsquo;s something that takes motivation to use something that you&rsquo;re not super comfortable with already. And then building something that somebody will actually use.</p>\n\n<p>Sanat: Something that you put out in the world and then at least shared with your friends, your folks you work with, and then they&rsquo;re able to see what you&rsquo;ve built. And that&rsquo;s building credibility for yourself that you are somebody who builds things. This philosophy is something that we&rsquo;ve tried before as well. Sunil and I independent MC tried to work on fact-check bot. If you forward a message to this bot, it would search on a particular API and then return whether this fact looked like it was true or false. And it&rsquo;s very easy to build something on top of existing APIs.</p>\n\n<p>Sunil: It was a good way of also learning some new languages that I wanted to experiment with. One of those things was Vue.js. I think we started with Vue.js And then we moved on to Next.js and Vercel to host it and Vercel, had a API serverless thing built into it. When you searched for some keyword, it would make an API call to Google and Google had a data checking API, so you could send keywords. And Google would tell you if the particular fact that you&rsquo;re looking for, it was true or false, and we would build the search page accordingly.</p>\n\n<p>Sanat: So basically a search results page. On top of Google&rsquo;s fact-check API. This is also one of my philosophies in life. That usually the thing that you want to build has been built already and it&rsquo;s available on the internet and you can just use it to get to 80% of what you want to do. In this case, it would be super difficult for us, to build a service that is able to check whether a particular claim like a website or an article or a link is fact checked or not. But. Obviously Google had built something like this already.</p>\n\n<p>Sanat: There are some others that we we tested and we didn&rsquo;t find them as good, but this was pretty easy to start with. So we said, let&rsquo;s work on building on top of that layer and using that. to just give this information to WhatsApp. So to start that , we built a website ourselves. We, we basically would let you just search on that website and then it would give you the results right there. We gave up on this project just before we built the whole WhatsApp integration, because turns out WhatsApp, integration is really tough, but that&rsquo;s something we found out because we went down that route.</p>\n\n<p>Sanat: And that&rsquo;s beneficial from learning from a side project as well. You get to learn whether something works or something doesn&rsquo;t work or how tough it is</p>\n\n<p>Sunil: It&rsquo;s also good to start side projects for that reason. Well, because let&rsquo;s say you have an idea and you&rsquo;re like, I think I should quit my job and do this X thing full time. If you wanted to tread water and just. See whether, is this something that you really want to work on? It&rsquo;s also good to start small because I some 10 years back or 12 years back. I wanted to quit my job and review movies full time. I love watching movies. So I&rsquo;m going to quit my job. And I started this tumbler blog called this.Movies.tumblr.com. And every Friday I would watch a new movie and I would come back and write about it. I got a few visits to the blog and I kept writing after three months though, I stopped watching movies. As much as I enjoyed watching the movies turns out I did not like writing about it</p>\n\n<p>Sanat: Yeah, the, the enjoyment went away because you had made a task out of it.</p>\n\n<p>Sunil: But if you start small and consider it as a side project and see how much you enjoy working on it.</p>\n\n<p>Sanat: So on the topic of starting small, the aim should always be to, to launch it where people can use it. It could be a website, it could be an app store play store link, or something that people can use. But to get there, you need to, figure out what the minimum viable product is for your particular app. So you can, you can trim out the features that are not super critical and just launch with something that&rsquo;s basic things like subscriptions and login in and settings pages, all those are not really critical.</p>\n\n<p>Sanat: Lots of people have talked about this. Something that comes to mind is 37 signals book called Getting Real. 37 signals had a very good book. Which was mostly about how to build an app and what to build first and what to build later. Similar to this, we had a side project in the previous company that I used to run.</p>\n\n<p>Sanat: We had an app which basically sat on top of the foursquare location API. If you gave it. Your location, it would tell you how far the nearest McDonald&rsquo;s was and a way to get to that nearest McDonald&rsquo;s a Google maps intent, which took you to a directions view on how to get there. And this was something we built, just so that folks in the company got some experience on doing end to end app development. They would have to build the app, build this API integration, publish the app, then do all of the things around publishing icons, play store pages. Every time a new technology is something that we were interested in would come out. We would rewrite the app. So the app was originally written in HTML just plain javascript, jQuery, then it was built using angular. Then it was built using angular2. At some point, we built it in react. And then that&rsquo;s the version that&rsquo;s out on the play store right now. Oh, surprisingly lots of people did use it as well. We had about 2000 daily visitors on this app. I don&rsquo;t know why people were using it, but it was, it was a fun experiment and it was nice to see that, something you&rsquo;ve put out into the world is being used, even though it didn&rsquo;t really give us any benefits.</p>\n\n<p>Sanat: Otherwise it was just a skill. Boost, you know, like we got those skills to publish the app.</p>\n\n<p>Sanat: That brings us to the next topic marketing your side projects because building is easy, at least for builders like us. But actually getting folks to use it to use it consistently and to pay for it so that you&rsquo;re able to make some money off of the project.</p>\n\n<p>Sanat: That&rsquo;s the toughest part. It&rsquo;s easy in the beginning, right? When you have no expectations. But eventually you do get expectations from any application, this application should at least pay for its hosting fees. It should be for the time that developers are spending on it.</p>\n\n<p>Sanat: And maintenance is, tough for any app.</p>\n\n<p>Sunil: I can write a book about maintaining software now, I think. Okay.</p>\n\n<p>Sanat: Yeah. Yeah. So it&rsquo;s, it&rsquo;s tough to continue something.</p>\n\n<p>Sanat: That&rsquo;s sort of the game, right? Side projects are not something that you can totally depend on, but I&rsquo;ve seen a lot of side projects become real projects as well because they&rsquo;re working so well for people.</p>\n\n<p>Sunil: As long as you&rsquo;re good with marketing it I was reading about MailChimp yesterday because they were going to get bought out by Intuit for $10 billion. And someone had posted that. It started off as a project for the web design agency behind MailChimp.</p>\n\n<p>Sunil: They wanted to build and use for themselves.</p>\n\n<p>Sanat: Making money is the key differentiator here. How do you make money from your side project? Maybe that&rsquo;s a topic for another day. What is important is building that community or at least that audience around the app, that you can then use to monetize the app.</p>\n\n<p>Sanat: There is an old article. It says that every app just needs thousand true fans to survive. And these thousand fans will pay some money, right. Even if they pay $2 a month, that&rsquo;s like $2,000 a month.</p>\n\n<p>Sanat: That&rsquo;s pretty decent for a basic app to survive.</p>\n\n<p>Sunil: So, I guess that&rsquo;s it for this time, see you next time.</p>\n\n<p>Sanat: Goodbye</p>\n",
				
				"date_published": "2021-09-08T21:00:13-05:00",
				"url": "https://sanat.is/2021/09/09/sanat-hegde-and.html"
			},
			{
				"id": "http://Sanat.micro.blog/2021/09/01/life-logging.html",
				"title": "Life logging apps",
				"content_html": "<p>I believe in\n“That which is measured improves. That which is measured and reported improves exponentially.”</p>\n\n<p>There are things in my life that I log for improving it myself - while other aspects especially health related are useful when reporting is needed.</p>\n\n<p>There’s a GTD aspect to it too where I’m able to take things out of my head - creating a less cluttered mind able to be a bit more present. My usual process is to instantly log the movie I’ve seen or the book I’m reading to not leave that item for later.</p>\n\n<p>This is a list of the apps and things I log. Hopefully it’s useful to those who want an opinion on the app ecosystem around logging.</p>\n\n<p><strong>Locations</strong></p>\n\n<p>Google Maps Timeline - I love the auto-logging/tracking features from Google Maps. The visualisations and the details are great. If you have location tracking on - and the google maps app installed on your phone Google will list out all the locations you’ve been to. <a href=\"https://timeline.google.com/maps/timeline?gl=JP&amp;pli=1&amp;rapt=AEjHL4PcmekeKbDwbQx1GramNlTxK3VCFiY4qLhU89V-8tbV2oFIvyWrupdaj66_c991jxTebbKUXERzOvVDiHJmmbgjXm4EJw&amp;pb\">Checkout your own timeline here</a>\n<img src=\"https://cdn.uploads.micro.blog/34232/2021/440fe9328c.png\" width=\"600\" height=\"277\" alt=\"Google timeline view - Sanat\" />\n<em>This is a view of the cities I’ve visited</em></p>\n\n<p>When visiting a place - I will log it on <a href=\"https://www.swarmapp.com\">Swarm</a> - a location logging app.  One added benefit to logging on Swarm is knowing the places your friends have visited.</p>\n\n<p><strong>Entertainment</strong></p>\n\n<p>When I’ve finished watching a movie I’ll log it in <a href=\"https://letterboxd.com\">Letterboxd</a><br />\n<a href=\"https://boxd.it/q3sP\">My profile</a></p>\n\n<p>I’m open for suggestions to log TV shows. Hit me up on twitter <a href=\"https://twitter.com/hsanat\">@hsanat</a></p>\n\n<p>Goodreads for <a href=\"https://sanat.is/books/\">books</a><br />\n<a href=\"https://www.goodreads.com/user/show/29211445-sanat-hegde\">My profile</a></p>\n\n<p><a href=\"https://www.splitwise.com\">Splitwise</a> is great for logging expenses with friends. I use this for personal and family expenses too - eg. keeping a running tab on how much I’ve spent on my car.</p>\n\n<p><strong>Health</strong></p>\n\n<p>I used to log sleep meticulously on <a href=\"http://david-smith.org/\">_DavidSmith</a>’s <a href=\"https://apps.apple.com/in/app/sleep/id1038440371\">Sleep++</a>. Why I’ve stopped is a story for another post.</p>\n\n<p>I use the built in <a href=\"https://apps.apple.com/in/app/fitness/id1208224953\">Activity</a> app for fitness goal tracking when I use the watch.\nApple Health logs most of the health related logs from other apps I use.</p>\n\n<p>For weight and body fat % I use a <a href=\"https://www.amazon.in/Fitbit-Wi-Fi-Smart-Scale-Black/dp/B0752M6T6K\">Fitbit Aria 2</a>. This also connects back to apple health - which then feeds it to the other apps that need this information.</p>\n\n<p><strong>Events</strong></p>\n\n<p>I like taking photographs of things happening in my life. I take a lot of pics throughout good days - some of these pics end up being good. I have to get better at sharing those pics. But the general philosophy of it is that it’ll show up on the timehop app at some point in the future.</p>\n\n<p><a href=\"https://www.timehop.com\">Timehop</a> - is a great app to resurface logs. It connects to different apps and then is able to pull the things that happened on that day. It’s so much fun looking and then sharing timehop pics. Of late Google photos and apple photos have started surfacing pics from a x years ago as well. But my go-to app for what happened x years ago today is still timehop.</p>\n\n<p>I&rsquo;ll try my best to keep this post updated over the coming years.</p>\n",
				
				"date_published": "2021-09-01T10:44:00-05:00",
				"url": "https://sanat.is/2021/09/01/life-logging.html"
			},
			{
				"id": "http://Sanat.micro.blog/2021/08/09/sunil-and-i.html",
				"title": "Sunil and I (eventually) talk about focus on the latest episode of our podcast.",
				"content_html": "<p><iframe src=\"https://share.listnr.fm/embed/podcast/6340bd0ed8a2a2001daf505c?minimal=true\" frameborder=\"no\" scrolling=\"no\" seamless width=\"100%\" height=\"90\"></iframe>\nShownotes:</p>\n\n<p>Sunil’s post - <a href=\"https://www.sunilshenoy.com/2021/07/10/the-best-thing.html\">The best thing that happened to you this week</a></p>\n\n<p><a href=\"https://www.netflix.com/in/title/81320770\">Hassen Dilruba on Neflix</a></p>\n\n<p><a href=\"https://www.goodreads.com/book/show/25744928-deep-work\">Deep Work</a> by Cal Newport</p>\n\n<p><a href=\"https://www.calnewport.com/podcast/\">Deep Questions</a> the podcast</p>\n\n<p><a href=\"http://www.paulgraham.com/makersschedule.html\">Maker’s Schedule</a> by Paul Graham</p>\n\n<p><a href=\"https://9to5mac.com/2021/06/09/how-to-use-iphone-focus-mode-ios-15/\">iOS 15 Focus mode</a></p>\n",
				
				"date_published": "2021-08-09T09:35:00-05:00",
				"url": "https://sanat.is/2021/08/09/sunil-and-i.html"
			},
			{
				"id": "http://Sanat.micro.blog/2021/06/28/a-wild-podcast.html",
				"title": "A wild podcast appears",
				"content_html": "<p>Sunil and I talk about our different and similar opinions about salaries.</p>\n\n<p>Listen to <a href=\"https://www.sunilshenoy.com/2021/06/27/episode.html\">Episode 2</a> <a href=\"https://www.sunilshenoy.com/2021/06/27/episode.html\">here</a></p>\n\n<p>Show notes:</p>\n\n<p><a href=\"https://www.kalzumeus.com/2012/01/23/salary-negotiation/\">Patio11&rsquo;s on salary negotiation</a></p>\n\n<p><a href=\"https://baremetrics.com/open-startups\">Baremetrics Open Startups</a></p>\n\n<p><a href=\"https://buffer.com/resources/compensation-philosophy/\">Salaries at Buffer</a></p>\n\n<p><a href=\"https://www.goodreads.com/book/show/32994.Maverick\">Maverick: The Success Story Behind the World&rsquo;s Most Unusual Workplace</a></p>\n\n<p><a href=\"https://m.signalvnoise.com/how-we-pay-people-at-basecamp/\">Salaries at Basecamp</a></p>\n",
				
				"date_published": "2021-06-28T12:24:45-05:00",
				"url": "https://sanat.is/2021/06/28/a-wild-podcast.html"
			},
			{
				"id": "http://Sanat.micro.blog/2021/01/20/a-story-about.html",
				"title": "A story about a tennis raquet",
				"content_html": "<p>I&rsquo;ve been learning to play tennis since the last couple of weeks. I&rsquo;ve been using extra raquets with my coach. I wanted to buy a new raquet for myself.</p>\n\n<p>I went to the best/closest tennis store that I could find and saw the options available for a beginner. I saw some of the options. The options available were all the same weight - slightly heavy at least what I thought. My arm&rsquo;s been hurting so much these days - possibly because of the different raquets that I was using - or because of my poor form and just going at it mentality.</p>\n\n<p>So I&rsquo;m at the store - and I have three options to choose from. I spend my time on the internet researching and comparing the options. The racket that I ended up purchasing - <a href=\"https://www.amazon.in/Mx-Attitude-Tour-Yellow-Graphite/dp/B07NGNG7KW/ref=sr_1_19?dchild=1&amp;keywords=head+arcore+tennis&amp;qid=1611123648&amp;sr=8-19\">the Head Attitude Tour</a> - had the best marketing material. It had words in it&rsquo;s marketing material like</p>\n\n<blockquote>\n<p>This racquet will make sure that your first steps on the tennis court won&rsquo;t be your last.</p>\n</blockquote>\n\n<p>The amazon reviews looked great, It was rated as being good for beginners and intermediate level players. Had diagrams about how it was the best value and had the right sweet spot for the ball. It was cheaper in this store than on Amazon. Plus it had this amazing colour. These things matter to me.</p>\n\n<p>So I bought it. I was kicked about this purchase.</p>\n\n<p>There&rsquo;s an excitement to new things that just makes it better for me.</p>\n\n<p>The day when I took it to the court for the first time - I met the assistant coach first and I excitedly told him about my new raquet. His first reaction to this was that it was heavy. It was 275 gm on the label - but this coach found a marking of 300gm on the raquet itself. Said that he would have preferred that I bought a lighter raquet. He talked about how it was not the nano material that the other Head Ti S6 model was made of. Mine is graphite. He said the balance was wrong - and I would need to get used to the heavier intermediate level playing style. He heard the price wrong and thought it was Rs. 47,000 instead of Rs. 4700.</p>\n\n<p>I was a little dejected - but I&rsquo;d made this purchase so I started with my drills. It was alright while warming up. I was a little less pumped but still excited about playing with it. I would be able to get used to something good. Sure it wasn&rsquo;t the greatest. The group and I played some games - I was ok. My arms were beginning to get sore again.</p>\n\n<p>Then the head coach came in. He&rsquo;s a jolly - excited about life kind of a guy. He told me that I have to give him a party for buying a new    raquet. Picked up my racket and said it was excellent. When I told him the price - he asked if I held a gun to the shopkeeper&rsquo;s head - that the price was really low for this kind of a raquet. He played a few shots with my raquet too. I asked about the weight and he said that this is a little on the higher end but still the right range for a beginner.</p>\n\n<p>On hearing this I was ecstatic. My soreness reduced. I felt more confident while playing. Even my shots connected slightly better.</p>\n\n<p>This basically goes to show what a few words of encouragement can do to you. It might have helped that it came after words of discouragement from someone who I respected more than the first person. Words are powerful though and the right words can make someone&rsquo;s just easier. Everyone is struggling slightly and getting better is within reach for most with the right mindset and getting that external validation can help make the journey smoother.</p>\n\n<p><img src=\"https://cdn.uploads.micro.blog/34232/2021/63e1d84200.jpg\" width=\"600\" height=\"600\" alt=\"Head Attitude Tour tennis raquet\" /></p>\n",
				
				"date_published": "2021-01-20T01:35:00-05:00",
				"url": "https://sanat.is/2021/01/20/a-story-about.html"
			},
			{
				"id": "http://Sanat.micro.blog/2020/08/16/reduce-distractions-work.html",
				"title": "Reduce distractions, work better",
				"content_html": "<div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\">\n<h3 name=\"f969\" id=\"f969\" class=\"graf graf--h3 graf--leading graf--title\">Reduce distractions, work better</h3>\n<p name=\"c552\" id=\"c552\" class=\"graf graf--p graf-after--h3\">Cal Newport in Deep Work talks about the benefits to the quality of the output of work when something is worked on without distractions for a long periods of time. Here’s a quick summary of his book — <a href=\"https://www.calnewport.com/books/deep-work/\" data-href=\"https://www.calnewport.com/books/deep-work/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Deep Work</a></p>\n<figure name=\"6944\" id=\"6944\" class=\"graf graf--figure graf--iframe graf-after--p\"><iframe src=\"https://www.youtube.com/embed/gTaJhjQHcf8?feature=oembed\" width=\"700\" height=\"393\" frameborder=\"0\" scrolling=\"no\"></iframe></figure><p name=\"b731\" id=\"b731\" class=\"graf graf--p graf-after--figure\">Spending long periods of time doing one thing is more difficult than before now in the age of constant distractions and cellphones are the biggest culprit at-least in my life aiding this distraction filled lifestyle.</p>\n<figure name=\"79a3\" id=\"79a3\" class=\"graf graf--figure graf--iframe graf-after--p\"><iframe src=\"https://www.youtube.com/embed/Ig6I3prnlnE?feature=oembed\" width=\"700\" height=\"393\" frameborder=\"0\" scrolling=\"no\"></iframe></figure><p name=\"585e\" id=\"585e\" class=\"graf graf--p graf-after--figure\">The deleterious effects of task switching is an extremely important subject— well captured by Paul Graham in his timeless essay <a href=\"http://www.paulgraham.com/makersschedule.html\" data-href=\"http://www.paulgraham.com/makersschedule.html\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Maker’s schedule, Manager’s Schedule</a></p>\n<p name=\"d9ce\" id=\"d9ce\" class=\"graf graf--p graf-after--p graf--trailing\">I’ve personally had some benefits from using <a href=\"https://support.apple.com/en-in/HT208982#:~:text=a%20child%27s%20device.-,Turn%20on%20Screen%20Time,is%20My%20Child%27s%20%5Bdevice%5D.\" data-href=\"https://support.apple.com/en-in/HT208982#:~:text=a%20child's%20device.-,Turn%20on%20Screen%20Time,is%20My%20Child's%20%5Bdevice%5D.\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Apple’s screen time</a> features to limit social media consuming my idle mind on the phone. I recently found out that it’s possible to do this on the <a href=\"https://support.apple.com/en-in/HT210387\" data-href=\"https://support.apple.com/en-in/HT210387\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Mac</a> as well. Android has something similar which called <a href=\"https://wellbeing.google/\" data-href=\"https://wellbeing.google/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Digital Wellbeing</a>.</p>\n</div></div>\n",
				
				"date_published": "2020-08-16T08:11:00-05:00",
				"url": "https://sanat.is/2020/08/16/reduce-distractions-work.html"
			},
			{
				"id": "http://Sanat.micro.blog/2018/08/14/we-should-all.html",
				"title": "We should all be automating our image optimization",
				"content_html": "<div class=\"section-content\">\n<div class=\"section-inner sectionLayout--insetColumn\"><p name=\"194a\" id=\"194a\" class=\"graf graf--p graf--leading\">We should all be automating our image optimization</p></div>\n<div class=\"section-inner sectionLayout--outsetColumn\"><figure name=\"7cda\" id=\"7cda\" class=\"graf graf--figure graf--layoutOutsetCenter graf-after--p\"><img class=\"graf-image\" data-image-id=\"0*wzp6e8AzDhudGjrC\" data-width=\"5184\" data-height=\"3456\" data-is-featured=\"true\" src=\"https://cdn.uploads.micro.blog/34232/2021/62bca4fa4f.jpg\"><figcaption class=\"imageCaption\">Photo by <a href=\"https://unsplash.com/@gui_vasconcelos?utm_source=medium&amp;utm_medium=referral\" data-href=\"https://unsplash.com/@gui_vasconcelos?utm_source=medium&amp;utm_medium=referral\" class=\"markup--anchor markup--figure-anchor\" rel=\"photo-creator noopener noopener\" target=\"_blank\">Guilherme Vasconcelos</a> on <a href=\"https://unsplash.com?utm_source=medium&amp;utm_medium=referral\" data-href=\"https://unsplash.com?utm_source=medium&amp;utm_medium=referral\" class=\"markup--anchor markup--figure-anchor\" rel=\"photo-source noopener noopener\" target=\"_blank\">Unsplash</a></figcaption></figure></div>\n<div class=\"section-inner sectionLayout--insetColumn\">\n<p name=\"d044\" id=\"d044\" class=\"graf graf--p graf-after--figure\"><strong class=\"markup--strong markup--p-strong\">The problem statement:</strong> <br>When building an image heavy site — <a href=\"https://getpepped.com/app/inspiration/popular-now/all\" data-href=\"https://getpepped.com/app/inspiration/popular-now/all\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">like a social network for photography enthusiasts</a> — you’ll need to handle images well. To automate image resizing we started using Google Cloud functions and the trusty <a href=\"https://www.imagemagick.org/\" data-href=\"https://www.imagemagick.org/\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">Imagemagick</a>.</p>\n<p name=\"3ac8\" id=\"3ac8\" class=\"graf graf--p graf-after--p\">Image resizing should be easy to do if you’re just serving dynamic transformed images. But again — this is something you have to build and maintain forever. And <a href=\"https://www.google.co.in/search?q=hackerone+imagemagick&amp;oq=hackerone+image&amp;aqs=chrome.1.69i57j0j69i60j0l2.5644j0j1&amp;sourceid=chrome&amp;ie=UTF-8\" data-href=\"https://www.google.co.in/search?q=hackerone+imagemagick&amp;oq=hackerone+image&amp;aqs=chrome.1.69i57j0j69i60j0l2.5644j0j1&amp;sourceid=chrome&amp;ie=UTF-8\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">fix vulnerabilities</a> for. If you think about optimizing the image for even a little while, there are more challenges.</p>\n<ul class=\"postList\">\n<li name=\"eb95\" id=\"eb95\" class=\"graf graf--li graf-after--p\">How do you find the optimal encoding format? (jpeg, png, webp, etc.)</li>\n<li name=\"8f9b\" id=\"8f9b\" class=\"graf graf--li graf-after--li\">How do you find the right compression settings? (lossy vs. lossless)</li>\n<li name=\"fe51\" id=\"fe51\" class=\"graf graf--li graf-after--li\">Determine which metadata should be kept or stripped</li>\n<li name=\"3725\" id=\"3725\" class=\"graf graf--li graf-after--li\">You’ll need to handle building multiple variants of each for each display + DPR resolution (for @2x and @3x)</li>\n<li name=\"c453\" id=\"c453\" class=\"graf graf--li graf-after--li\">Do you account want to handle a user’s network type, speed, and preferences?</li>\n</ul>\n<blockquote name=\"f9bf\" id=\"f9bf\" class=\"graf graf--pullquote graf-after--li\">The best way to learn is from the experience of others.</blockquote>\n<p name=\"f574\" id=\"f574\" class=\"graf graf--p graf-after--pullquote\">While looking for resources on how to do this better ourselves. I found <a href=\"https://images.guide/\" data-href=\"https://images.guide/\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">images.guide</a> by <a href=\"https://twitter.com/addyosmani?lang=en\" data-href=\"https://twitter.com/addyosmani?lang=en\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">Addy Osmani</a>. A phenomenal book for any web developer who works with images. Go save it for reading later right now, please.</p>\n<figure name=\"6b0a\" id=\"6b0a\" class=\"graf graf--figure graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*_qD7pvEMQ7yEI-syH2vzKQ.png\" data-width=\"461\" data-height=\"325\" src=\"https://cdn.uploads.micro.blog/34232/2021/937006386f.jpg\"><figcaption class=\"imageCaption\"><a href=\"https://images.guide/\" data-href=\"https://images.guide/\" class=\"markup--anchor markup--figure-anchor\" rel=\"nofollow noopener noopener\" target=\"_blank\">images.guide</a> a must read.</figcaption></figure><p name=\"d69e\" id=\"d69e\" class=\"graf graf--p graf-after--figure\">This book has learnings from Google, Facebook and 500px — amongst others.</p>\n<p name=\"ad42\" id=\"ad42\" class=\"graf graf--p graf-after--p\">It’s always surprising to me that any little facet of today’s world has someone’s lifetime spent. The <a href=\"https://github.com/google/butteraugli\" data-href=\"https://github.com/google/butteraugli\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">Butteraugli score</a>, for example, could be someone’s life work.</p>\n<p name=\"9a98\" id=\"9a98\" class=\"graf graf--p graf-after--p\"><strong class=\"markup--strong markup--p-strong\">The Solution:</strong> <br>That’s when we decided to use <a href=\"https://cloudinary.com/\" data-href=\"https://cloudinary.com/\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">Cloudinary</a>. A media management solution which solves the optimisation challenges that we talked about earlier, along with ones that we didn’t know existed, and delivers the optimised media from a CDN.</p>\n<p name=\"d22e\" id=\"d22e\" class=\"graf graf--p graf-after--p\">The demo on their homepage is mental. The way you can manipulate images with just the URLs. That’s something we wanted right away.</p>\n<figure name=\"f999\" id=\"f999\" class=\"graf graf--figure graf--iframe graf-after--p\"><iframe src=\"https://www.youtube.com/embed/P4FhRuttCgY?feature=oembed\" width=\"700\" height=\"393\" frameborder=\"0\" scrolling=\"no\"></iframe><figcaption class=\"imageCaption\">The cloudinary URL manipulation demo</figcaption></figure><p name=\"523d\" id=\"523d\" class=\"graf graf--p graf-after--figure\">The generous free plan is great to get started.</p>\n<p name=\"9858\" id=\"9858\" class=\"graf graf--p graf-after--p\"><strong class=\"markup--strong markup--p-strong\">Where we use Cloudinary.</strong></p>\n<ul class=\"postList\">\n<li name=\"b17a\" id=\"b17a\" class=\"graf graf--li graf-after--p\">Responsive images — Show smaller images to smaller devices. The picture element has made that job much easier. Now Cloudinary made it easier. We define the image URL with the size and quality needed.</li>\n<li name=\"4e59\" id=\"4e59\" class=\"graf graf--li graf-after--li\">Client hints — Chrome and some mobile browsers support <a href=\"https://developers.google.com/speed/webp/\" data-href=\"https://developers.google.com/speed/webp/\" class=\"markup--anchor markup--li-anchor\" rel=\"nofollow noopener\" target=\"_blank\">WebP</a> — an image format by Google that gives smaller files. Cloudinary will convert our images to WebP — if they’re smaller then will send them over to browsers that support them based on cloud hints. More on client-hints <a href=\"https://developers.google.com/web/updates/2015/09/automating-resource-selection-with-client-hints\" data-href=\"https://developers.google.com/web/updates/2015/09/automating-resource-selection-with-client-hints\" class=\"markup--anchor markup--li-anchor\" rel=\"nofollow noopener\" target=\"_blank\">here</a>\n</li>\n<li name=\"295a\" id=\"295a\" class=\"graf graf--li graf-after--li\">Placeholder images — For a better user experience, it’s a great idea to give users an idea that we are trying to load an image. We saw this feature on Medium where they show blurred image placeholders. It’s easy to implement — now we have a 10x10px transformed image as the placeholder before we show images. Check it out on a client’s site. <a href=\"https://getpepped.com/app/inspiration/wedding/2w5g7kxe1\" data-href=\"https://getpepped.com/app/inspiration/wedding/2w5g7kxe1\" class=\"markup--anchor markup--li-anchor\" rel=\"nofollow noopener\" target=\"_blank\">https://getpepped.com/app/inspiration/wedding/2w5g7kxe1</a>\n</li>\n</ul>\n<p name=\"d5ea\" id=\"d5ea\" class=\"graf graf--p graf-after--li graf--trailing\"><strong class=\"markup--strong markup--p-strong\">Closing comment.</strong> <br>Instead of trying to solve image optimization yourself, try integrating a solution that works for you. <strong class=\"markup--strong markup--p-strong\">We should all be automating our image optimization</strong>. #perfmatters</p>\n</div>\n</div>\n",
				
				"date_published": "2018-08-14T03:36:34-05:00",
				"url": "https://sanat.is/2018/08/14/we-should-all.html"
			},
			{
				"id": "http://Sanat.micro.blog/2018/07/17/how-we-got.html",
				"title": "How we got our webapp hosted on a separate server to show up as a subdirectory",
				"content_html": "<div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\">\n<p name=\"de81\" id=\"de81\" class=\"graf graf--p graf--leading\">How we got our webapp hosted on a separate server to show up as a subdirectory</p>\n<p name=\"466e\" id=\"466e\" class=\"graf graf--p graf-after--p\">We get it, marketing wants easy control of the website on the root domain. And because it’s so easy to setup a CMS there to publish marketing content, that is why most web apps are setup on subdomains instead of the root domain. This is alright if all of the app content is under a login. If that’s not the case — it’s so much better to get users to share the domain.com/xxxx url instead of the app.domain.com/xxx domain. Easy to remember and share.</p>\n<p name=\"229d\" id=\"229d\" class=\"graf graf--p graf-after--p\">Most SEO professionals agree that subdirectories are better than subdomains for ranking on search engines.</p>\n<blockquote name=\"d912\" id=\"d912\" class=\"graf graf--blockquote graf-after--p\">Search engines keep different metrics for domains than they do for subdomains, so even though Google itself has stated that — from a ranking perspective — content in subdomains and subdirectories is treated roughly equally, it’s still recommended that webmasters place link-worthy content like blogs in subfolders rather than subdomains (i.e. <a href=\"http://www.example.com/blog/\" data-href=\"http://www.example.com/blog/\" class=\"markup--anchor markup--blockquote-anchor\" rel=\"noopener\" target=\"_blank\">www.example.com/blog/</a> rather than blog.example.com).</blockquote>\n<p name=\"349b\" id=\"349b\" class=\"graf graf--p graf-after--blockquote\">— <a href=\"https://moz.com/\" data-href=\"https://moz.com/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Moz</a> SEO Experts, <a href=\"https://moz.com/learn/seo/domain\" data-href=\"https://moz.com/learn/seo/domain\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Domain Setup Guide</a></p>\n<p name=\"53b1\" id=\"53b1\" class=\"graf graf--p graf-after--p\">Sadly, it’s not easy to setup a redirect from a subdomain to a subfolder. While this is possible to do by setting up a reverse proxy. The maintenance of this complex engineering would have been a nightmare — attached to a client’s frontend. Something that should never go down.</p>\n<p name=\"46e9\" id=\"46e9\" class=\"graf graf--p graf-after--p\">We’ve been telling our clients that this cannot be done, until I found this very pretty article by fly.io <a href=\"http://onehostname.com/\" data-href=\"http://onehostname.com/\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">http://onehostname.com/</a></p>\n<p name=\"cd36\" id=\"cd36\" class=\"graf graf--p graf-after--p\">Fly describes itself as a global JavaScript platform that gives you the power to build your own CDN.</p>\n<figure name=\"7843\" id=\"7843\" class=\"graf graf--figure graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*lHpTx3_EVH0KM3r8-ebtHA.png\" data-width=\"1279\" data-height=\"812\" src=\"https://cdn.uploads.micro.blog/34232/2021/c7e4976c61.jpg\"><figcaption class=\"imageCaption\">The fly sites interface</figcaption></figure><p name=\"0784\" id=\"0784\" class=\"graf graf--p graf-after--figure\">We started by using fly sites. The fly site did not play well with the hosting that we were using — to server side render our angular app. Had a major issue with fly sites that we were not able to decode. While fly “sites” has a great UI to setup redirects, we found through support that they’re not actively supporting this functionality.</p>\n<p name=\"e0d9\" id=\"e0d9\" class=\"graf graf--p graf-after--p\">We then decided to build a Fly Edge Application using the github repo <a href=\"https://github.com/superfly/onehostname\" data-href=\"https://github.com/superfly/onehostname\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">https://github.com/superfly/onehostname</a> which was easy enough.</p>\n<p name=\"9b59\" id=\"9b59\" class=\"graf graf--p graf-after--p\">This is what we ended up doing.</p>\n<p name=\"7b1f\" id=\"7b1f\" class=\"graf graf--p graf-after--p\"><a href=\"https://getpepped.com\" data-href=\"https://getpepped.com\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">https://getpepped.com</a> — <code class=\"markup--code markup--p-code\">the root domain</code> , redirects to our squarespace site with marketing controls directly.<br><a href=\"https://getpepped.com/app/inspiration/popular-now/all\" data-href=\"https://getpepped.com/app/inspiration/popular-now/all\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">getpepped.com/app</a> — <code class=\"markup--code markup--p-code\">our angular app</code>, shows the server side rendered angular application from <a href=\"https://www.roast.io\" data-href=\"https://www.roast.io\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">roast.io</a></p>\n<p name=\"9c6b\" id=\"9c6b\" class=\"graf graf--p graf-after--p\">An added benefit by involving fly.io is they give free automatic SSL.</p>\n<p name=\"7778\" id=\"7778\" class=\"graf graf--p graf-after--p\">The one more layer in the stack to handle part of this exercise, does increase debugging efforts and needs a lot of technical know how — but I’m sticking to fly.io till we get similar results for such a small investment of time.</p>\n<p name=\"6677\" id=\"6677\" class=\"graf graf--p graf-after--p graf--trailing\">pro-tip —Get on the <a href=\"https://fly-chat.slack.com\" data-href=\"https://fly-chat.slack.com\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">slack channel</a> for quick support<br>Also read <a href=\"https://fly.io/articles/\" data-href=\"https://fly.io/articles/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">their articles</a> to get more value out of fly.io. They do a lot more than just let you manage hostnames.</p>\n</div></div>\n",
				
				"date_published": "2018-07-17T07:49:53-05:00",
				"url": "https://sanat.is/2018/07/17/how-we-got.html"
			},
			{
				"id": "http://Sanat.micro.blog/2018/06/15/the-tech-were.html",
				"title": "The tech we’re excited about — after Google Cloud Summit, Mumbai",
				"content_html": "<div class=\"section-content\">\n<div class=\"section-inner sectionLayout--insetColumn\">\n<h3 name=\"f8de\" id=\"f8de\" class=\"graf graf--h3 graf--leading graf--title\">The tech we’re excited about — after Google Cloud Summit, Mumbai</h3>\n<p name=\"ce5b\" id=\"ce5b\" class=\"graf graf--p graf-after--h3\">The thing that I’m most excited to do after yesterday’s summit is <a href=\"https://cloud.google.com/automl/\" data-href=\"https://cloud.google.com/automl/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Cloud AutoML</a>. The ability to build custom machine learning models and getting a google vision style API endpoint to use that model from the cloud sounds like magic. The keynote demo where a raspberry pi was used to classify Indian Mithai was too good.</p>\n</div>\n<div class=\"section-inner sectionLayout--outsetColumn\"><figure name=\"923c\" id=\"923c\" class=\"graf graf--figure graf--layoutOutsetCenter graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*eY6Dhlp5sHHhWZHHFyTWFQ.jpeg\" data-width=\"4032\" data-height=\"3024\" data-is-featured=\"true\" src=\"https://cdn.uploads.micro.blog/34232/2021/1ad23ce8a8.jpg\"></figure></div>\n<div class=\"section-inner sectionLayout--insetColumn\">\n<p name=\"bec1\" id=\"bec1\" class=\"graf graf--p graf-after--figure\">Pros — We do have a lot of pics in a project that we’ve been working on recently. I’m not sure what to use Cloud AutoML in that case. — but this could be slightly fun to do. Maybe use it to do automatic ratings.<br>Cons — It needs a lot of segregated image data to build a good model.</p>\n<p name=\"6d9f\" id=\"6d9f\" class=\"graf graf--p graf-after--p\"><a href=\"https://cloud.google.com/spanner/\" data-href=\"https://cloud.google.com/spanner/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Cloud spanner</a> —We need more of a realtime database for our mobile apps. We’ve been very happy with firebase and have started testing Firestore. Cloud spanner is <strong class=\"markup--strong markup--p-strong\">the</strong> database powering Google’s flagship apps like GMail and GSutie. The way it provides RDMS features with high availability and scaling sounds like a technological marvel. The pricing is prohibitive for the MVPs and small projects. Enterprises are going to love this though.</p>\n<p name=\"e176\" id=\"e176\" class=\"graf graf--p graf-after--p\"><a href=\"https://cloud.google.com/data-studio/\" data-href=\"https://cloud.google.com/data-studio/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Data Studio</a> — Seems interesting for using the data that we have generated from our projects and turning them into beautiful charts. We could use this as a solution in building out admin reporting dashboards. Have to try this out.</p>\n<p name=\"a1e4\" id=\"a1e4\" class=\"graf graf--p graf-after--p\"><a href=\"https://cloud.google.com/pubsub/\" data-href=\"https://cloud.google.com/pubsub/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">PubSub</a> — I’m not sure how firebase does it, but I’ve been meaning to use messaging queues for a long time. It sounds like the right thing to do. We’re big users for serverless cloud functions in our apps, and they usually don’t need queuing. But I could be wrong.</p>\n<p name=\"7f47\" id=\"7f47\" class=\"graf graf--p graf-after--p\"><a href=\"https://flutter.io/\" data-href=\"https://flutter.io/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Flutter</a> — Spoke to a google cloud developer — who incidentally wasn’t very fond of JS and JS devs . He wanted us to try flutter instead of Ionic. Flutter is Google’s counter to React Native, a cross platform mobile application development platform. We’re going to try out flutter over the next couple of weeks and am eager to see how it progresses once it goes stable.</p>\n<figure name=\"c793\" id=\"c793\" class=\"graf graf--figure graf--layoutOutsetLeft graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*-LR-AxNItDcNtlrheoaIww.jpeg\" data-width=\"2048\" data-height=\"2048\" src=\"https://cdn.uploads.micro.blog/34232/2021/fddcaf2967.jpg\"></figure><p name=\"117a\" id=\"117a\" class=\"graf graf--p graf-after--figure graf--trailing\">All in all the event gave us good exposure to existing google cloud infrastructure. We would have loved some firebase platform talks. Hopefully they’ll be part of the Google Cloud Summit next year.</p>\n</div>\n</div>\n",
				
				"date_published": "2018-06-15T05:16:37-05:00",
				"url": "https://sanat.is/2018/06/15/the-tech-were.html"
			},
			{
				"id": "http://Sanat.micro.blog/2018/02/14/the-psychological-tactics.html",
				"title": "The psychological tactics that keep me going back to Fortune city.",
				"content_html": "<div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\">\n<h3 name=\"2381\" id=\"2381\" class=\"graf graf--h3 graf--leading graf--title\">The psychological tactics that keep me going back to Fortune city.</h3>\n<figure name=\"9b8d\" id=\"9b8d\" class=\"graf graf--figure graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*4bwUvk57EpReTqGX-_-rGw.jpeg\" data-width=\"460\" data-height=\"460\" src=\"https://cdn.uploads.micro.blog/34232/2021/230eacb95d.jpg\"><figcaption class=\"imageCaption\">Source: <a href=\"https://itunes.apple.com/us/app/fortune-city-expense-tracker/id1172713884?mt=8\" data-href=\"https://itunes.apple.com/us/app/fortune-city-expense-tracker/id1172713884?mt=8\" class=\"markup--anchor markup--figure-anchor\" rel=\"noopener\" target=\"_blank\">The app store</a></figcaption></figure><p name=\"6432\" id=\"6432\" class=\"graf graf--p graf-after--figure\">It’s a mobile app — that I feel stupid being an addict of. I’ve tried a lot of expense tracking apps. Personal expense tracking is important. It’s helpful to know how much you spend each month. As a business owner it’s sometime tricky to know how much you make. But it’s easier to figure out how much you spent. Little victories.</p>\n<p name=\"4cf7\" id=\"4cf7\" class=\"graf graf--p graf-after--p\">Let’s start with the the Fortune city app does. You add an expense each day, and assign it a category. The category defines the kind of building. A food entry builds a restaurant and a drink entry builds a juice bar. You get the picture. The reason most expense tracking apps did not work for me was because I wouldn’t go into the app everyday. I would do it only when I remembered to. And that is what’s different in fortune city. It’s a game based on the expense tracking that you do.</p>\n<figure name=\"8398\" id=\"8398\" class=\"graf graf--figure graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*SYWX0szn07_blakkZ0LyWw.png\" data-width=\"750\" data-height=\"1334\" data-is-featured=\"true\" src=\"https://cdn.uploads.micro.blog/34232/2021/c5738bd9f4.jpg\"><figcaption class=\"imageCaption\">My metropolis</figcaption></figure><p name=\"73c1\" id=\"73c1\" class=\"graf graf--p graf-after--figure\">There are a lot of mechanics in the game to keep you coming back.</p>\n<p name=\"e50b\" id=\"e50b\" class=\"graf graf--p graf-after--p\">Here’s a list of things that the game does well.</p>\n<ol class=\"postList\">\n<li name=\"0349\" id=\"0349\" class=\"graf graf--li graf-after--p\">Incentivising the prime focus. <br>The foundation is one thing. Expense tracking. that’s what gives you the city that you play around with. They give you gems and other rewards for maintaining streaks. Giving you an incentive to fulfil the aim of the game.</li>\n<li name=\"ad5e\" id=\"ad5e\" class=\"graf graf--li graf-after--li\">An app with one purpose<br>It’s very rewarding for your user to do that one task. Building a product around one aim helps the product manager focus more on improving that one thing. This sort of increasing focus has lead to unbundling of apps. <a href=\"https://www.theverge.com/2014/5/1/5666062/foursquare-swarm-new-app\" data-href=\"https://www.theverge.com/2014/5/1/5666062/foursquare-swarm-new-app\" class=\"markup--anchor markup--li-anchor\" rel=\"noopener\" target=\"_blank\">Swarm and Foursquare did this well</a>. Not that <a href=\"https://a16z.com/2015/08/06/wechat-china-mobile-first/\" data-href=\"https://a16z.com/2015/08/06/wechat-china-mobile-first/\" class=\"markup--anchor markup--li-anchor\" rel=\"noopener\" target=\"_blank\">the other way doesn’t work too</a> . I’m in favour of singular focussed apps more than apps that do everything.</li>\n<li name=\"ece4\" id=\"ece4\" class=\"graf graf--li graf-after--li\">The game is simple to understand but has complex details. <br>The aim of the “Game” is to improve your city’s prosperity. It increases when you add buildings. Adding buildings increases the population limit. This in turn gives you more people to put in those buildings. The people in the buildings generate money. Money can be used to merge buildings together. You can do an in-app purchase to buy gems as well. Simple game mechanics, which this app does as well.</li>\n<li name=\"5f00\" id=\"5f00\" class=\"graf graf--li graf-after--li\">The prosperity score<br>This is the number one thing to track in the app. One thing to track makes it easy for someone to try to get better at this game. Reddit does it with karma and Swarm does it with coins for the week. <br>Prosperity increases slightly everytime you have a higher level building. That is simple. You get a lot of badges and gems for hitting milestones of number of entries of a type, or buildings or population. Which makes sense — as an incentive.<br>Prosperity depends on the kind of people you add to each building. <br>That’s one detail that I figured out only after playing for a long time. Each person has a score card of what their skills are like. Adding someone with a 10 out of 10 in Food — to a restaurant will increase the prosperity of the city. This amount of money that’s generated from the building increases as well.</li>\n<li name=\"ad53\" id=\"ad53\" class=\"graf graf--li graf-after--li\">Monetisation. <br> You get a fixed number of buildings you can create everyday. It starts at 5. The game has a set of builders — 5 — that make you the buildings. Adding the 6th expense does not add a new building since you only have 5 available for the day. The limit resets everyday — that’s your incentive to come check the app everyday. They also want you to buy stuff — so you can buy gems which you can use to upgrade your builders. But if you want to stay in the freemium tier, they’ve got you covered as well. There’s gems you can get by viewing video ads. These are reset everyday — there’s 7 of those. And these are reset regularly — you have to check the app to see if there’s a get gems symbol showing. To make you click through the people — they have random quests that give you gems as well. Similar to ads these are regularly reset. Most of these quests involve cycling through all the people in the city. To find a particular person.</li>\n<li name=\"483d\" id=\"483d\" class=\"graf graf--li graf-after--li\">Competition. <br>There’s a section which shows you your ranking based on your prosperity score. This is the primary reason I’m hooked to this game. I’m currently 14 in India. I check this country ranking screen at-least once in two days — to see where my competition is. I find myself playing to keep my ego satisfied that I’m better than the rest of the folks out there.</li>\n</ol>\n<figure name=\"4729\" id=\"4729\" class=\"graf graf--figure graf-after--li\"><img class=\"graf-image\" data-image-id=\"1*d-Ts4CTzzx6inm0NsucJmg.png\" data-width=\"750\" data-height=\"1334\" src=\"https://cdn.uploads.micro.blog/34232/2021/d235b42629.jpg\"><figcaption class=\"imageCaption\">№. 14!</figcaption></figure><p name=\"4313\" id=\"4313\" class=\"graf graf--p graf-after--figure\">I think it’s important to keep looking at things that work in apps and find out why they do. That’s how you make your product better. Emulate the best.</p>\n<p name=\"9582\" id=\"9582\" class=\"graf graf--p graf-after--p graf--trailing\"><a href=\"https://astechsolutions.in\" data-href=\"https://astechsolutions.in\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">We build web and mobile apps</a> — talk to us if you want us to help in your product journey.</p>\n</div></div>\n",
				
				"date_published": "2018-02-14T04:50:34-05:00",
				"url": "https://sanat.is/2018/02/14/the-psychological-tactics.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/11/10/easier-pretty-emails.html",
				"title": "Easier pretty emails for your web and mobile apps.",
				"content_html": "<div class=\"section-content\">\n<div class=\"section-inner sectionLayout--insetColumn\">\n<h3 name=\"ca48\" id=\"ca48\" class=\"graf graf--h3 graf--leading graf--title\">Easier pretty emails for your web and mobile apps.</h3>\n<p name=\"b15c\" id=\"b15c\" class=\"graf graf--p graf-after--h3\">tldr; Use mailchimp automation emails</p>\n<h4 name=\"e51d\" id=\"e51d\" class=\"graf graf--h4 graf-after--p\">A little background</h4>\n<p name=\"4cfa\" id=\"4cfa\" class=\"graf graf--p graf-after--h4\"><a href=\"https://astechsolutions.in/frontend-development/\" data-href=\"https://astechsolutions.in/frontend-development/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">We build web and mobile apps </a>built with Angular frontends and firebase backends.</p>\n<p name=\"93fc\" id=\"93fc\" class=\"graf graf--p graf-after--p\">These <a href=\"https://astechsolutions.in/frontend-development/\" data-href=\"https://astechsolutions.in/frontend-development/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">micro-service architecture apps</a> are a great idea — till you have to do something that needs a server. Things that need to use API keys for example. A simple feature that falls in this bucket is sending an email at an event.</p>\n<p name=\"bfa5\" id=\"bfa5\" class=\"graf graf--p graf-after--p\">The firebase ecosystem’ answer to that is <a href=\"https://firebase.google.com/docs/functions/\" data-href=\"https://firebase.google.com/docs/functions/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">firebase cloud functions</a>.</p>\n<p name=\"f746\" id=\"f746\" class=\"graf graf--p graf-after--p\">A cloud function trigger starts an on demand Node.js function that has the email content related code, sent out through a third party email provider like sendgrid, mailgun or postmark app.</p>\n<p name=\"c7b6\" id=\"c7b6\" class=\"graf graf--p graf-after--p\">This means that we have to code out the email HTMLs to pass it through the cloud function to the transactional email provider.</p>\n<h4 name=\"10de\" id=\"10de\" class=\"graf graf--h4 graf-after--p\">Enter mailchimp.</h4>\n<p name=\"46c4\" id=\"46c4\" class=\"graf graf--p graf-after--h4\">What we do now is when the the cloud function trigger is to update the list field for a mailchimp subscriber. <br>Mailchimp has email automations — which can be triggered on list field changes. The email can now be created much easily — from mailchimp’s own beautiful templates even. A lot of the email look and feel challenges are solved.</p>\n</div>\n<div class=\"section-inner sectionLayout--outsetColumn\"><figure name=\"7717\" id=\"7717\" class=\"graf graf--figure graf--layoutOutsetCenter graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*LA3NL_jXGI1hHC-0YShzeA.png\" data-width=\"1357\" data-height=\"475\" src=\"https://cdn.uploads.micro.blog/34232/2021/9dd1f40cd1.jpg\"></figure></div>\n<div class=\"section-inner sectionLayout--insetColumn\">\n<h4 name=\"d6ba\" id=\"d6ba\" class=\"graf graf--h4 graf-after--figure\">The cons.</h4>\n<ul class=\"postList\">\n<li name=\"8d17\" id=\"8d17\" class=\"graf graf--li graf-after--h4\">Mailchimp automations for some reason only send out one email per user per automation workflow email. So if you’re testing the app — there’s no way to trigger the emails again for the same user. Deleting the list subscribers doesn’t work. Since each automation workflow email has it’s own list of subscribers — which you cannot delete — even with the remove subscribers from workflow option. I’m hoping this is just a mailchimp bug.</li>\n<li name=\"e0e6\" id=\"e0e6\" class=\"graf graf--li graf-after--li\">Mailchimp automation triggers for list field exist for “list field value changes to a specific value”. This works for simpler cases — like if a user upgraded. But not for complex situations where we need to send the user a specific value. To counter this we create two list field values.</li>\n<li name=\"750d\" id=\"750d\" class=\"graf graf--li graf-after--li\">Automation list field trigger times don’t have granular controls. It’s either immediately or after an hour. We have a third party voucher code management service to update the user’s referral coupon codes to a subscriber’s list field as well — and this happens at varying times — from between instantly to two minutes later — after a user has been added to the list. To counter this we’ve had to use segments — which also surprisingly have the “not black” qualifier — to do what the trigger should have done — send voucher emails to people who have something in the voucher list fields.</li>\n</ul>\n<h4 name=\"c7dc\" id=\"c7dc\" class=\"graf graf--h4 graf-after--li\">The Pros</h4>\n<ul class=\"postList\">\n<li name=\"87a9\" id=\"87a9\" class=\"graf graf--li graf-after--h4\">This is still less time than spending time designing HTML emails. That work in all devices. And testing them.</li>\n<li name=\"4a5e\" id=\"4a5e\" class=\"graf graf--li graf-after--li\">Mailchimp is an easy to use web app — so the job of “making” the emails can be handed over to the design or content or any other team. That’s time saved using things that are built already.</li>\n<li name=\"2f85\" id=\"2f85\" class=\"graf graf--li graf-after--li\">There’s something about using well designed apps that brightens my day.</li>\n</ul>\n<figure name=\"9423\" id=\"9423\" class=\"graf graf--figure graf--iframe graf-after--li\"><blockquote class=\"twitter-tweet\"><a href=\"https://twitter.com/hSanat/status/95522509289558016?ref_src=twsrc%5Etfw\"></a></blockquote>\n<script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script></figure><p name=\"65d6\" id=\"65d6\" class=\"graf graf--p graf-after--figure graf--trailing\">I’ve personally been a Mailchimp fan for a long time. I’m glad to have found a way to do less work while getting more done.</p>\n</div>\n</div>\n",
				
				"date_published": "2017-11-10T07:00:26-05:00",
				"url": "https://sanat.is/2017/11/10/easier-pretty-emails.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/10/16/what-we-learnt.html",
				"title": "What we learnt while doing remote angular builds.",
				"content_html": "<div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\">\n<h3 name=\"9958\" id=\"9958\" class=\"graf graf--h3 graf--leading graf--title\">What we learnt while doing remote angular builds.</h3>\n<figure name=\"4dc0\" id=\"4dc0\" class=\"graf graf--figure graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*I4a6MOBxYhgQsBRcwbShRw.jpeg\" data-width=\"5816\" data-height=\"3877\" src=\"https://cdn.uploads.micro.blog/34232/2021/db481d4f43.jpg\"><figcaption class=\"imageCaption\"><a href=\"https://unsplash.com/photos/RkJF2BMrLJc\" data-href=\"https://unsplash.com/photos/RkJF2BMrLJc\" class=\"markup--anchor markup--figure-anchor\" rel=\"noopener\" target=\"_blank\">Photo courtesy Willam Bout</a></figcaption></figure><p name=\"78fa\" id=\"78fa\" class=\"graf graf--p graf-after--figure\">TLDR; It makes deploying angular apps a consistent experience.</p>\n<h3 name=\"318b\" id=\"318b\" class=\"graf graf--h3 graf-after--p\">What is a build — in terms of frontend apps?</h3>\n<p name=\"0a4a\" id=\"0a4a\" class=\"graf graf--p graf-after--h3\">We use Angular to make frontend applications. The Angular build process is — ng build which creates js bundles of all the code that drives the web app. Angular 4 has ahead of time compiling that takes the code written and makes a build that has a lot of best practices like <a href=\"https://angular.io/guide/aot-compiler#tree-shaking\" data-href=\"https://angular.io/guide/aot-compiler#tree-shaking\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">tree shaking</a> and transpiling for serving web applications.</p>\n<h3 name=\"fa7c\" id=\"fa7c\" class=\"graf graf--h3 graf-after--p\">Why we do remote builds?</h3>\n<p name=\"40ea\" id=\"40ea\" class=\"graf graf--p graf-after--h3\">So that everyone in our team can deploy code to the staging and production environments. Well, maybe not anyone. But it makes it easy for the project maintainer to focus on writing and maintaining the code.</p>\n<p name=\"5c28\" id=\"5c28\" class=\"graf graf--p graf-after--p\">Build processes are faster too — since they’re on machines dedicated to just doing that one thing. And consistent. It’s easy for everyone to go through logs in case something fails. It also lets us manage code reviews online. Once a pull request is merged after reviewing it — possibly using the web interface.</p>\n<p name=\"b0a1\" id=\"b0a1\" class=\"graf graf--p graf-after--p\">We currently don’t do automated tests — but when we do, those can be easily shoehorned into this deploy process.</p>\n<h3 name=\"d7d9\" id=\"d7d9\" class=\"graf graf--h3 graf-after--p\">What we use</h3>\n<p name=\"1905\" id=\"1905\" class=\"graf graf--p graf-after--h3\">We’ve had a great experience with <a href=\"https://beanstalkapp.com\" data-href=\"https://beanstalkapp.com\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Beanstalk</a> from the <a href=\"https://wildbit.com\" data-href=\"https://wildbit.com\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">wildbit</a> team. We tried <a href=\"https://deploybot.com\" data-href=\"https://deploybot.com\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Deploybot</a> and since we have a paid plan for Beanstalk — Wildbit was kind enough to give us a free Deploybot account 🎉</p>\n<h3 name=\"4bc6\" id=\"4bc6\" class=\"graf graf--h3 graf-after--p\">What we learnt</h3>\n<figure name=\"33f6\" id=\"33f6\" class=\"graf graf--figure graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*KmnFN7h_Gwr7bW0mMlGvnA.png\" data-width=\"686\" data-height=\"362\" data-is-featured=\"true\" src=\"https://cdn.uploads.micro.blog/34232/2021/af6675c00a.jpg\"></figure><ul class=\"postList\"><li name=\"b250\" id=\"b250\" class=\"graf graf--li graf-after--figure\">Caching the container that the build is made in decreases build time. While obvious, it took us some time to figure this one out. Deploybot — under advanced settings has an option to for preparation of the container (like installing dependencies) and the building of the source code itself.<br>Cached build commands are executed only once and then the results are cached for you, until the package.json file changes.</li></ul>\n<figure name=\"3a53\" id=\"3a53\" class=\"graf graf--figure graf-after--li\"><img class=\"graf-image\" data-image-id=\"1*8ZpkKmdShbXwtdVHZlVckw.png\" data-width=\"686\" data-height=\"362\" src=\"https://cdn.uploads.micro.blog/34232/2021/3ca175f538.jpg\"></figure><p name=\"c2e9\" id=\"c2e9\" class=\"graf graf--p graf-after--figure\">Creating builds and deploying that build go hand in hand.</p>\n<ul class=\"postList\">\n<li name=\"c77b\" id=\"c77b\" class=\"graf graf--li graf-after--p\">\n<a href=\"https://github.com/firebase/firebase-tools\" data-href=\"https://github.com/firebase/firebase-tools\" class=\"markup--anchor markup--li-anchor\" rel=\"noopener\" target=\"_blank\">Firebase tools</a> has a <a href=\"https://medium.com/@rohanbagchi/how-to-setup-continuous-integration-for-your-firebase-app-cd183bb862e1\" data-href=\"https://medium.com/@rohanbagchi/how-to-setup-continuous-integration-for-your-firebase-app-cd183bb862e1\" class=\"markup--anchor markup--li-anchor\" target=\"_blank\">login for CI</a> which generates a token that can be passed along while doing a remote build which allows us to use <a href=\"https://firebase.google.com/docs/hosting/\" data-href=\"https://firebase.google.com/docs/hosting/\" class=\"markup--anchor markup--li-anchor\" rel=\"noopener\" target=\"_blank\">firebase hosting</a>. This gives us an inexpensive way to use CDN backed hosting. Firebase hosting has a one-click rollback option to the serve the previously deployed build in case of a buggy build. That has saved our bacon more than once.</li>\n<li name=\"a4d2\" id=\"a4d2\" class=\"graf graf--li graf-after--li\">To combat failed production builds we sometimes create a production build locally and bug fix before using the automated system again. We do this mostly before a big feature release.</li>\n<li name=\"f71d\" id=\"f71d\" class=\"graf graf--li graf-after--li\">We usually have the npm modules defined as the latest ones in our package.json. This would sometimes cause build errors. To counter that we added an ng -v to the build script. This gives clear logs on what version modules were used during the remote build.</li>\n<li name=\"127d\" id=\"127d\" class=\"graf graf--li graf-after--li\">\n<a href=\"https://medium.com/beautiful-angular/angular-2-and-environment-variables-59c57ba643be\" data-href=\"https://medium.com/beautiful-angular/angular-2-and-environment-variables-59c57ba643be\" class=\"markup--anchor markup--li-anchor\" target=\"_blank\">Using environment variables</a> is a good idea to keep production variables away from the dev environment. Adding the output-hashing=all flag worked well as the cache buster for non prod builds.</li>\n<li name=\"98df\" id=\"98df\" class=\"graf graf--li graf-after--li\">We would also have random issues regarding firebase not being able to understand which project was associated.<br>Adding the — project flag sorted those issues out.</li>\n</ul>\n<p name=\"30c1\" id=\"30c1\" class=\"graf graf--p graf-after--li graf--trailing\">The result of all this:<br>No one spends time deploying anymore.<br>Well not most of the time</p>\n</div></div>\n",
				
				"date_published": "2017-10-16T07:24:20-05:00",
				"url": "https://sanat.is/2017/10/16/what-we-learnt.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/08/22/the-struggle-needs.html",
				"title": "The struggle needs to be real",
				"content_html": "<div class=\"section-content\">\n<div class=\"section-inner sectionLayout--insetColumn\"><h3 name=\"27a3\" id=\"27a3\" class=\"graf graf--h3 graf--leading graf--title\">The struggle needs to be real</h3></div>\n<div class=\"section-inner sectionLayout--outsetColumn\"><figure name=\"742d\" id=\"742d\" class=\"graf graf--figure graf--layoutOutsetCenter graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*oa72xBkLlzgAKFwLWpMSQQ.jpeg\" data-width=\"2439\" data-height=\"1632\" src=\"https://cdn.uploads.micro.blog/34232/2021/1b24510bde.jpg\"><figcaption class=\"imageCaption\">Photo by <a href=\"https://unsplash.com/photos/TsVN31Dzyv4?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" data-href=\"https://unsplash.com/photos/TsVN31Dzyv4?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" class=\"markup--anchor markup--figure-anchor\" rel=\"noopener\" target=\"_blank\">Cyril Saulnier</a> on <a href=\"https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" data-href=\"https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" class=\"markup--anchor markup--figure-anchor\" rel=\"noopener\" target=\"_blank\">Unsplash</a></figcaption></figure></div>\n<div class=\"section-inner sectionLayout--insetColumn\">\n<p name=\"283a\" id=\"283a\" class=\"graf graf--p graf-after--figure\">I started intermediate level weights at the gym today — it was legs day today. My trainer wanted me to use enough weights — so that I would not be able to do 15 reps of one set. That’s quite tough.</p>\n<p name=\"dbaf\" id=\"dbaf\" class=\"graf graf--p graf-after--p\">I want my life to be easy. I don’t want to be in pain. I don’t want to be stretched too thin. Maybe I’m just getting old.</p>\n<p name=\"215c\" id=\"215c\" class=\"graf graf--p graf-after--p\">But doing a lot of weights is tough only for a little while. And then your body gets used to it. I did squats with 30 kgs on me — which I would have not thought possible some time back.</p>\n<p name=\"8a01\" id=\"8a01\" class=\"graf graf--p graf-after--p\">A story is no fun if there’s no conflict. What’s the point of watching a story where everyone is comfortably living their lives. What’s the fun in living a life with no journey.</p>\n<p name=\"3027\" id=\"3027\" class=\"graf graf--p graf-after--p\">Bojack Horseman has a great scene where a Hollywood agent gets this amazing pep talk.</p>\n<figure name=\"d3ea\" id=\"d3ea\" class=\"graf graf--figure graf--iframe graf-after--p\"><iframe src=\"https://www.youtube.com/embed/VKEUqgLd4-I?feature=oembed\" width=\"700\" height=\"393\" frameborder=\"0\" scrolling=\"no\"></iframe></figure><p name=\"df84\" id=\"df84\" class=\"graf graf--p graf-after--figure graf--trailing\">Like they always said. No pain No gain.</p>\n</div>\n</div>\n",
				
				"date_published": "2017-08-22T05:37:30-05:00",
				"url": "https://sanat.is/2017/08/22/the-struggle-needs.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/08/10/an-easy-frontend.html",
				"title": "An easy frontend trick to test Angular2 apps on multiple devices",
				"content_html": "<div class=\"section-content\">\n<div class=\"section-inner sectionLayout--insetColumn\"><h3 name=\"7d28\" id=\"7d28\" class=\"graf graf--h3 graf--leading graf--title\">An easy frontend trick to test Angular2 apps on multiple devices</h3></div>\n<div class=\"section-inner sectionLayout--outsetColumn\"><figure name=\"d24b\" id=\"d24b\" class=\"graf graf--figure graf--layoutOutsetCenter graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*NSN1a2xVtV1exzcD8fpzhA.jpeg\" data-width=\"4288\" data-height=\"2848\" src=\"https://cdn.uploads.micro.blog/34232/2021/c742754473.jpg\"><figcaption class=\"imageCaption\">Photo by <a href=\"https://unsplash.com/photos/p-xSl33Wxyc?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" data-href=\"https://unsplash.com/photos/p-xSl33Wxyc?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" class=\"markup--anchor markup--figure-anchor\" rel=\"noopener\" target=\"_blank\">Farzad Nazifi</a> on <a href=\"https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" data-href=\"https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText\" class=\"markup--anchor markup--figure-anchor\" rel=\"noopener\" target=\"_blank\">Unsplash</a></figcaption></figure></div>\n<div class=\"section-inner sectionLayout--insetColumn\">\n<p name=\"72fb\" id=\"72fb\" class=\"graf graf--p graf-after--figure\">While building an MVP mobile app — it’s a great idea to build out a mobile site first. This gives you an opportunity to lock down on the details of the product before you build out an app.</p>\n<p name=\"1cf0\" id=\"1cf0\" class=\"graf graf--p graf-after--p\">We use Angular 2 to build out the web app. The same web app can then be packaged into a <a href=\"https://blog.astechsolutions.in/why-we-build-serverless-web-and-mobile-apps-af452977f867\" data-href=\"https://blog.astechsolutions.in/why-we-build-serverless-web-and-mobile-apps-af452977f867\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">hybrid mobile app</a> using <a href=\"https://cordova.apache.org\" data-href=\"https://cordova.apache.org\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">cordova</a>.</p>\n<p name=\"9761\" id=\"9761\" class=\"graf graf--p graf-after--p\">One of the tricks we use to test out things quickly is check the web app on a mobile browser at the same time.</p>\n<p name=\"e1f3\" id=\"e1f3\" class=\"graf graf--p graf-after--p\">To do this easily we use</p>\n<pre name=\"2ee2\" id=\"2ee2\" class=\"graf graf--pre graf-after--p\">ng serve --host=&lt;local IP address&gt;</pre>\n<p name=\"cf68\" id=\"cf68\" class=\"graf graf--p graf-after--pre\">Then we use at least a couple of mobile browsers pointed at the local IP (after making sure that they’re on the same network). So when you save the file it refreshes not just the desktop but the mobile browsers as well.</p>\n<p name=\"1e79\" id=\"1e79\" class=\"graf graf--p graf-after--p graf--trailing\">This works especially well when using <a href=\"https://css-tricks.com/snippets/css/a-guide-to-flexbox/\" data-href=\"https://css-tricks.com/snippets/css/a-guide-to-flexbox/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">flex</a> — which is a beautiful way to get CSS to work on multiple screens.</p>\n</div>\n</div>\n",
				
				"date_published": "2017-08-10T06:55:24-05:00",
				"url": "https://sanat.is/2017/08/10/an-easy-frontend.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/07/13/hey-prasad-actually.html",
				"title": "Hey Prasad, Actually we do use firebase for all the Google services mentioned — except for…",
				"content_html": "<div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\"><p name=\"0da3\" id=\"0da3\" class=\"graf graf--p graf--leading graf--trailing\">Hey Prasad, Actually we do use firebase for all the Google services mentioned — except for notifications. We started using One Signal before Firebase cloud functions was released and just stuck to it.</p></div></div>\n",
				
				"date_published": "2017-07-13T01:26:22-05:00",
				"url": "https://sanat.is/2017/07/13/hey-prasad-actually.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/07/11/why-we-build.html",
				"title": "Why we build serverless web and mobile apps.",
				"content_html": "<div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\">\n<h3 name=\"4646\" id=\"4646\" class=\"graf graf--h3 graf--leading graf--title\">Why we build serverless web and mobile apps.</h3>\n<p name=\"38d4\" id=\"38d4\" class=\"graf graf--p graf-after--h3\">The drive to microservices by giants such as <a href=\"https://blog.smartbear.com/microservices/why-you-cant-talk-about-microservices-without-mentioning-netflix/\" data-href=\"https://blog.smartbear.com/microservices/why-you-cant-talk-about-microservices-without-mentioning-netflix/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Netflix</a> has shown everyone why building monolithic applications is a thing of the past.</p>\n<figure name=\"035f\" id=\"035f\" class=\"graf graf--figure graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*YG9f3tsmdYuxaHfyKD-Rsg.jpeg\" data-width=\"638\" data-height=\"479\" src=\"https://cdn.uploads.micro.blog/34232/2021/284d09bac6.jpg\"><figcaption class=\"imageCaption\"><a href=\"https://www.slideshare.net/alvarosanchezmariscal/stateless-authentication-for-microservices/12?src=clipshare\" data-href=\"https://www.slideshare.net/alvarosanchezmariscal/stateless-authentication-for-microservices/12?src=clipshare\" class=\"markup--anchor markup--figure-anchor\" rel=\"noopener\" target=\"_blank\">via — Alvaro Sanchez’s slideshare</a></figcaption></figure><p name=\"5561\" id=\"5561\" class=\"graf graf--p graf-after--figure\">Serverless apps <strong class=\"markup--strong markup--p-strong\">have to be</strong> microservices-based.</p>\n<h3 name=\"4b03\" id=\"4b03\" class=\"graf graf--h3 graf-after--p\">The stack that we use for our apps</h3>\n<p name=\"f77e\" id=\"f77e\" class=\"graf graf--p graf-after--h3\">Angular for the frontend<br>Services we use</p>\n<ul class=\"postList\">\n<li name=\"69bb\" id=\"69bb\" class=\"graf graf--li graf-after--p\">Database — Firebase</li>\n<li name=\"1865\" id=\"1865\" class=\"graf graf--li graf-after--li\">Storage — Google Cloud Storage</li>\n<li name=\"6579\" id=\"6579\" class=\"graf graf--li graf-after--li\">Server dependent tasks — Google Cloud Functions</li>\n<li name=\"88ef\" id=\"88ef\" class=\"graf graf--li graf-after--li\">Email — Mailgun</li>\n<li name=\"de28\" id=\"de28\" class=\"graf graf--li graf-after--li\">Authentication — Firebase auth</li>\n<li name=\"af72\" id=\"af72\" class=\"graf graf--li graf-after--li\">Push Notifications — One Signal</li>\n</ul>\n<h3 name=\"f8c4\" id=\"f8c4\" class=\"graf graf--h3 graf-after--li\">The benefits of this stack</h3>\n<ul class=\"postList\">\n<li name=\"acdc\" id=\"acdc\" class=\"graf graf--li graf-after--h3\">No server management expertise needed</li>\n<li name=\"e793\" id=\"e793\" class=\"graf graf--li graf-after--li\">No maintenance needed on services except maintaining the app itself.</li>\n<li name=\"7672\" id=\"7672\" class=\"graf graf--li graf-after--li\">All of these are high availability services built with scalability in mind</li>\n<li name=\"55d1\" id=\"55d1\" class=\"graf graf--li graf-after--li\">The pay per use pricing of the services means that costs are small since our clients don’t have to pay for idle capacity.</li>\n<li name=\"cc87\" id=\"cc87\" class=\"graf graf--li graf-after--li\">It’s very easy to scale up or down depending on usage.</li>\n<li name=\"b4a9\" id=\"b4a9\" class=\"graf graf--li graf-after--li graf--trailing\">There are generous free tiers on all the services.</li>\n</ul>\n</div></div>\n",
				
				"date_published": "2017-07-11T05:52:21-05:00",
				"url": "https://sanat.is/2017/07/11/why-we-build.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/05/18/practice-makes-perfect.html",
				"title": "Practice makes perfect",
				"content_html": "<div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\">\n<h3 name=\"5c71\" id=\"5c71\" class=\"graf graf--h3 graf--leading graf--title\">Practice makes perfect</h3>\n<p name=\"8fcb\" id=\"8fcb\" class=\"graf graf--p graf-after--h3\"><em class=\"markup--em markup--p-em\">This post was first published in </em><a href=\"http://insanathon.tumblr.com/post/44698372525/practice-makes-perfect\" data-href=\"http://insanathon.tumblr.com/post/44698372525/practice-makes-perfect\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\"><em class=\"markup--em markup--p-em\">2012</em></a><em class=\"markup--em markup--p-em\"> and updated in 2017</em></p>\n<p name=\"27d4\" id=\"27d4\" class=\"graf graf--p graf-after--p\">I say this to anyone who will listen to me — web development is all about practice. You do it repeatedly and you’ll be a pro at it. But slowly I’ve come to realize that this is true about everything.</p>\n<p name=\"4ad8\" id=\"4ad8\" class=\"graf graf--p graf-after--p\">I remember a long time ago I used to be really scared of driving. I’m not anymore. I kinda like driving around now. In the past 4 years I’ve fallen down, been yelled at for accidentally scraping someone’s car, haven’t really been in an accident — but don’t really want to. But the process is important — and I’m a much better driver now because of it.</p>\n<p name=\"6b62\" id=\"6b62\" class=\"graf graf--p graf-after--p\">I can remember this dialogue from <a href=\"http://www.barcampmumbai.org/\" data-href=\"http://www.barcampmumbai.org/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Barcamp9</a> — some one on stage said “Don’t watch porn. Make it.”. This is true at so many levels. I read about successful web based companies everyday when I should be spending my time building successful companies instead. Instead of reading about hiring smart people I should be hiring smart people. Instead of reading about how to be more productive, innovating, automating, etc, etc. I should be doing all those things.</p>\n<p name=\"9600\" id=\"9600\" class=\"graf graf--p graf-after--p graf--trailing\">There’s a strike rate to everything. And you’re bound to be successful most of the times in the long run.</p>\n</div></div>\n",
				
				"date_published": "2017-05-18T07:18:38-05:00",
				"url": "https://sanat.is/2017/05/18/practice-makes-perfect.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/05/04/easy-project-backups.html",
				"title": "Easy project backups for web developers",
				"content_html": "<div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\">\n<p name=\"2621\" id=\"2621\" class=\"graf graf--p graf--leading\">Easy project backups for web developers</p>\n<figure name=\"0a32\" id=\"0a32\" class=\"graf graf--figure graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*jDehYdZTtsd6vD4PNG4eSA.png\" data-width=\"983\" data-height=\"578\" src=\"https://cdn.uploads.micro.blog/34232/2021/6d721f6cae.jpg\"><figcaption class=\"imageCaption\">Source: <a href=\"http://www.worldbackupday.com/en/\" data-href=\"http://www.worldbackupday.com/en/\" class=\"markup--anchor markup--figure-anchor\" rel=\"nofollow noopener\" target=\"_blank\">http://www.worldbackupday.com/</a></figcaption></figure><p name=\"a4eb\" id=\"a4eb\" class=\"graf graf--p graf-after--figure\">We’ve talked about <a href=\"https://blog.astechsolutions.in/how-we-deploy-code-to-websites-2665e9913ec7\" data-href=\"https://blog.astechsolutions.in/how-we-deploy-code-to-websites-2665e9913ec7\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">our development workflow</a>. I wanted to discuss actionable backup strategies that are baked into the workflow.</p>\n<p name=\"9509\" id=\"9509\" class=\"graf graf--p graf-after--p\">It’s important that setting up backups be made part of the development process. Since the actual backup is a background process — it is much more likely that it will be done.</p>\n<p name=\"07b0\" id=\"07b0\" class=\"graf graf--p graf-after--p\">Our workflow has three environments. <br>*local<br>*staging<br>*production</p>\n<p name=\"4151\" id=\"4151\" class=\"graf graf--p graf-after--p\">Our local projects are all backed up on a remote Git repository. We use Beanstalkapp for projects that are in use and Bitbucket as the final resting place for a project — since Bitbucket gives unlimited repositories in every plan. We usually create a separate repository for large assets like photoshop files and raw images.</p>\n<p name=\"ee75\" id=\"ee75\" class=\"graf graf--p graf-after--p\">Staging environment backups are usually not taken — since staging sites are a transitional space.</p>\n<p name=\"93d1\" id=\"93d1\" class=\"graf graf--p graf-after--p\">Production environment backups are usually done based on the platform used. <br>For WordPress project, we suggest WPEngine to most of our clients who can afford it. WPEngine has daily file and database <a href=\"https://astechsolutions.in/wpengine-plans\" data-href=\"https://astechsolutions.in/wpengine-plans\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">backups baked into each plan</a>. That’s saved our bacon on more than one occasion. For our WordPress clients not on WPEngine, we use <a href=\"https://vaultpress.com/\" data-href=\"https://vaultpress.com/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">VaultPress</a> which also does daily backups of the entire WordPress website.</p>\n<p name=\"8ce9\" id=\"8ce9\" class=\"graf graf--p graf-after--p\">We’ve recently been working with AngularJS frontend web and mobile apps powered by Firebase databases. We use the <a href=\"https://firebase.google.com/pricing/\" data-href=\"https://firebase.google.com/pricing/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">blaze plan</a> for daily backups. The major pro with the blaze plan is that since it is a “Pay as you go” type of plan we usually end up paying less than a dollar for daily backups of decently sized databases.</p>\n<p name=\"857c\" id=\"857c\" class=\"graf graf--p graf-after--p graf--trailing\">Fun fact — <a href=\"http://www.worldbackupday.com/en/\" data-href=\"http://www.worldbackupday.com/en/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">World backup day</a> is one day before April Fool’s day.</p>\n</div></div>\n",
				
				"date_published": "2017-05-04T06:22:12-05:00",
				"url": "https://sanat.is/2017/05/04/easy-project-backups.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/04/14/how-we-deploy.html",
				"title": "How we deploy code to websites.",
				"content_html": "<div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\">\n<h3 name=\"aac9\" id=\"aac9\" class=\"graf graf--h3 graf--leading graf--title\">How we deploy code to websites.</h3>\n<figure name=\"2375\" id=\"2375\" class=\"graf graf--figure graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*8CBYNrrrDjvLotfHrQw50Q.png\" data-width=\"696\" data-height=\"610\" src=\"https://cdn.uploads.micro.blog/34232/2021/a4316edd63.jpg\"><figcaption class=\"imageCaption\">Ftp Upload by Unlimiticon from the Noun Project</figcaption></figure><p name=\"4d29\" id=\"4d29\" class=\"graf graf--p graf-after--figure\">Our development workflows involve three environments.</p>\n<ol class=\"postList\"><li name=\"4f47\" id=\"4f47\" class=\"graf graf--li graf-after--p\">Development — This is where the code is written. <br> This is locally hosted on the computers that we’re developing on.</li></ol>\n<p name=\"ab45\" id=\"ab45\" class=\"graf graf--p graf-after--li\">2. Staging — usually on the same servers as the live website.</p>\n<p name=\"a647\" id=\"a647\" class=\"graf graf--p graf-after--p\">3. Production — the live website.</p>\n<p name=\"9097\" id=\"9097\" class=\"graf graf--p graf-after--p\">Our staging environments are set up to be automatic deployments. That means changed files from each new commit are uploaded automatically to the web server.Production environments are setup to be manual deploys. Which means that at the right times — changes that have passed testing are uploaded to the production web servers by someone pressing the manual deploy button within the deployment tool.</p>\n<p name=\"8692\" id=\"8692\" class=\"graf graf--p graf-after--p\">We use <a href=\"https://git-scm.com/\" data-href=\"https://git-scm.com/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Git</a> for version control and for collaboration on code.</p>\n<p name=\"0e91\" id=\"0e91\" class=\"graf graf--p graf-after--p\">We use <a href=\"http://beanstalkapp.com/\" data-href=\"http://beanstalkapp.com/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Beanstalkapp</a> to host most of our active repositories. We chose Beanstalkapp over GitHub because Beanstalkapp has the ability to make secure file transfers (SFTP) directly to our web servers based on our commits.</p>\n<p name=\"0d14\" id=\"0d14\" class=\"graf graf--p graf-after--p\">For some smaller or extremely large projects, we use <a href=\"https://bitbucket.org/\" data-href=\"https://bitbucket.org/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Bitbucket</a> to host the repository and use <a href=\"https://deploybot.com/\" data-href=\"https://deploybot.com/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Deploybot</a> to deploy the code.</p>\n<p name=\"ee9c\" id=\"ee9c\" class=\"graf graf--p graf-after--p\">Automated deploys mean</p>\n<ul class=\"postList\">\n<li name=\"a491\" id=\"a491\" class=\"graf graf--li graf-after--p\">No more manual tracking of files that were changed and more importantly no more manual uploading of the files that were changed leading to much lesser chances of developer error.</li>\n<li name=\"d23c\" id=\"d23c\" class=\"graf graf--li graf-after--li\">If there’s an issue with the release we can easily rollback the deployment.</li>\n<li name=\"5a85\" id=\"5a85\" class=\"graf graf--li graf-after--li\">All of our team members are able to deploy code even when they don’t have access to the servers themselves.</li>\n<li name=\"7381\" id=\"7381\" class=\"graf graf--li graf-after--li\">Since it’s so easy — each one of us is continuously deploying code to staging environments — where every change is tested for quality.</li>\n<li name=\"4e3e\" id=\"4e3e\" class=\"graf graf--li graf-after--li\">Enormous savings in time saved manually uploading files.</li>\n</ul>\n<p name=\"187f\" id=\"187f\" class=\"graf graf--p graf-after--li graf--trailing\">If your team does not deploy automatically — take the time to figure it out. Your team will thank you for letting them focus on developing code not worrying about deploying it.</p>\n</div></div>\n",
				
				"date_published": "2017-04-14T04:21:40-05:00",
				"url": "https://sanat.is/2017/04/14/how-we-deploy.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/04/03/reasons-why-you.html",
				"title": "Reasons why you should consider building a hybrid mobile app.",
				"content_html": "<div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\">\n<h3 name=\"ae2e\" id=\"ae2e\" class=\"graf graf--h3 graf--leading graf--title\">Reasons why you should consider building a hybrid mobile app.</h3>\n<h3 name=\"f686\" id=\"f686\" class=\"graf graf--h3 graf-after--h3\">What is the difference between a native app and a hybrid app?</h3>\n<figure name=\"b507\" id=\"b507\" class=\"graf graf--figure graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*UASX3Q-X0z4DgAvKMRxN9Q.jpeg\" data-width=\"595\" data-height=\"320\" src=\"https://cdn.uploads.micro.blog/34232/2021/5949aa8acb.jpg\"></figure><p name=\"5243\" id=\"5243\" class=\"graf graf--p graf-after--figure\">Native apps are built in native programming languages like Objective-C or Swift for iOS and Java for Android operating systems. Hybrid apps are mobile apps built using HTML/CSS/JS “pages” wrapped in Phonegap/Cordova.</p>\n<h3 name=\"9f6b\" id=\"9f6b\" class=\"graf graf--h3 graf-after--p\">Code once, works everywhere</h3>\n<figure name=\"324b\" id=\"324b\" class=\"graf graf--figure graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*WbUnec8AtYK4KJkptXtztw.jpeg\" data-width=\"500\" data-height=\"324\" src=\"https://cdn.uploads.micro.blog/34232/2021/26ca091183.jpg\"></figure><p name=\"cd16\" id=\"cd16\" class=\"graf graf--p graf-after--figure\">Hybrid apps need to be written once and can be built for both Android and iOS (and Windows Phone…). This saves development time that in turn saves development cost. With any software come bugs. While there will be similar bugs in android and iOS for hybrid apps — there will be two different types of bugs in native apps since they’re built off of two different code bases.</p>\n<h3 name=\"d14d\" id=\"d14d\" class=\"graf graf--h3 graf-after--p\">Frameworks galore</h3>\n<figure name=\"1497\" id=\"1497\" class=\"graf graf--figure graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*TpNyVenAh2P76IqMcmvDpg.jpeg\" data-width=\"500\" data-height=\"482\" src=\"https://cdn.uploads.micro.blog/34232/2021/60e4582f5c.jpg\"></figure><p name=\"985a\" id=\"985a\" class=\"graf graf--p graf-after--figure\">Frameworks such as <a href=\"https://ionicframework.com\" data-href=\"https://ionicframework.com\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Ionic</a> reduce the time taken to build feature rich mobile apps. Developers can add common features like <a href=\"http://ionicframework.com/docs/native/geolocation/\" data-href=\"http://ionicframework.com/docs/native/geolocation/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Geolocation</a>, <a href=\"http://ionicframework.com/docs/native/call-number/\" data-href=\"http://ionicframework.com/docs/native/call-number/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">dialer support</a>, <a href=\"http://ngcordova.com/docs/plugins/pushNotificationsV5/\" data-href=\"http://ngcordova.com/docs/plugins/pushNotificationsV5/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">push notifications</a> by going through a plugin installation. A vibrant plugin ecosystem makes it easy to utilize native capabilities of the mobile operating systems <br><a href=\"https://github.com/driftyco\" data-href=\"https://github.com/driftyco\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">https://github.com/driftyco</a><br><a href=\"http://ionicframework.com/docs/native/\" data-href=\"http://ionicframework.com/docs/native/\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">http://ionicframework.com/docs/native/</a></p>\n<h3 name=\"0cd0\" id=\"0cd0\" class=\"graf graf--h3 graf-after--p\">Plugins, Plugins, Plugins</h3>\n<figure name=\"c0db\" id=\"c0db\" class=\"graf graf--figure graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*kyZHB42zpZBlypQ-VDsXNA.jpeg\" data-width=\"565\" data-height=\"301\" src=\"https://cdn.uploads.micro.blog/34232/2021/dc2573a00c.jpg\"></figure><p name=\"1024\" id=\"1024\" class=\"graf graf--p graf-after--figure\">Open Source plugins are available for all hybrid app frameworks like phonegap, cordova and ionic and <a href=\"https://facebook.github.io/react-native/\" data-href=\"https://facebook.github.io/react-native/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">React native</a>. These make it easy to connect to third parties without having to build connectors. <br>Here’s a list of examples.<br><a href=\"https://www.npmjs.com/package/react-native-firebase\" data-href=\"https://www.npmjs.com/package/react-native-firebase\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Connect React native and firebase </a><br><a href=\"https://github.com/firebase/angularfire\" data-href=\"https://github.com/firebase/angularfire\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Angular bindings for Firebase</a><br><a href=\"https://github.com/OneSignal/OneSignal-Cordova-SDK\" data-href=\"https://github.com/OneSignal/OneSignal-Cordova-SDK\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">OneSignal</a> (a free push notifications service) with Cordova <br><a href=\"http://ngcordova.com/docs/plugins/sqlite/\" data-href=\"http://ngcordova.com/docs/plugins/sqlite/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">To connect the SQLite database with Cordova</a></p>\n<h3 name=\"f509\" id=\"f509\" class=\"graf graf--h3 graf-after--p\">Build a minimum viable product faster</h3>\n<figure name=\"f3f5\" id=\"f3f5\" class=\"graf graf--figure graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*KHS2SV_sxPM2Lh74Kswmng.jpeg\" data-width=\"900\" data-height=\"439\" src=\"https://cdn.uploads.micro.blog/34232/2021/e69afb658b.jpg\"><figcaption class=\"imageCaption\"><a href=\"http://dilbert.com/strip/2016-11-13\" data-href=\"http://dilbert.com/strip/2016-11-13\" class=\"markup--anchor markup--figure-anchor\" rel=\"nofollow noopener\" target=\"_blank\">http://dilbert.com/strip/2016-11-13</a></figcaption></figure><p name=\"b170\" id=\"b170\" class=\"graf graf--p graf-after--figure\">Rapid prototyping is possible by building on top of existing themes and functionality For eg. <a href=\"http://market.ionic.io/\" data-href=\"http://market.ionic.io/\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">http://market.ionic.io/</a> is a marketplace for Ionic starter packs for all kinds of apps.</p>\n<h3 name=\"9d40\" id=\"9d40\" class=\"graf graf--h3 graf-after--p\">Web Application included</h3>\n<figure name=\"534b\" id=\"534b\" class=\"graf graf--figure graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*k5ds7HCWQi6p3hi_7i2yOQ.jpeg\" data-width=\"500\" data-height=\"486\" src=\"https://cdn.uploads.micro.blog/34232/2021/5e9fc66b1b.jpg\"></figure><p name=\"1a99\" id=\"1a99\" class=\"graf graf--p graf-after--figure\">The mobile app source code can be hosted on a web server which makes it a web application. You don’t have to develop another web application. Famously <a href=\"https://m.uber.com/v1/\" data-href=\"https://m.uber.com/v1/\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener\" target=\"_blank\">https://m.uber.com/v1/</a> was the same code that used to power the Windows mobile application. You could even go the desktop app route by packaging the app in <a href=\"http://electron.atom.io\" data-href=\"http://electron.atom.io\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Electron</a> or <a href=\"http://ionicframework.com/docs/v2/resources/desktop-support/\" data-href=\"http://ionicframework.com/docs/v2/resources/desktop-support/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Ionic Desktop</a> instead.</p>\n<h3 name=\"f1ac\" id=\"f1ac\" class=\"graf graf--h3 graf-after--p\">Keep reading if you’re a developer.</h3>\n<figure name=\"621d\" id=\"621d\" class=\"graf graf--figure graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*RgeEfmdG4fH0AGM0UejJgg.png\" data-width=\"1920\" data-height=\"1080\" src=\"https://cdn.uploads.micro.blog/34232/2021/3db2aa5065.jpg\"><figcaption class=\"imageCaption\"><a href=\"http://ben-evans.com/benedictevans/2016/12/8/mobile-is-eating-the-world\" data-href=\"http://ben-evans.com/benedictevans/2016/12/8/mobile-is-eating-the-world\" class=\"markup--anchor markup--figure-anchor\" rel=\"nofollow noopener\" target=\"_blank\">http://ben-evans.com/benedictevans/2016/12/8/mobile-is-eating-the-world</a></figcaption></figure><p name=\"15b3\" id=\"15b3\" class=\"graf graf--p graf-after--figure\"><a href=\"http://ben-evans.com/benedictevans/2016/12/8/mobile-is-eating-the-world\" data-href=\"http://ben-evans.com/benedictevans/2016/12/8/mobile-is-eating-the-world\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Mobile is eating the world</a>. As a developer you need to embrace this. It is now very easy to further your frontend development skills to build mobile applications. All good frameworks do most of the hard things for you already — while giving you the opportunity to work with cutting edge tech like <a href=\"https://www.typescriptlang.org/\" data-href=\"https://www.typescriptlang.org/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Typescript</a>, <a href=\"https://angular.io/\" data-href=\"https://angular.io/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Angular 2</a> (which btw is <a href=\"http://angularjs.blogspot.in/2017/03/angular-400-now-available.html\" data-href=\"http://angularjs.blogspot.in/2017/03/angular-400-now-available.html\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">fully forward compatible with Angular 4</a>) or <a href=\"https://facebook.github.io/react/\" data-href=\"https://facebook.github.io/react/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">ReactJS</a>.</p>\n<figure name=\"dee6\" id=\"dee6\" class=\"graf graf--figure graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*5MFcONIXUNLSe7LgwxFZEg.png\" data-width=\"1920\" data-height=\"1080\" src=\"https://cdn.uploads.micro.blog/34232/2021/04a923434f.jpg\"><figcaption class=\"imageCaption\"><a href=\"https://firebase.google.com/docs/functions/use-cases\" data-href=\"https://firebase.google.com/docs/functions/use-cases\" class=\"markup--anchor markup--figure-anchor\" rel=\"noopener\" target=\"_blank\">From a use case example of Google Cloud functions</a></figcaption></figure><p name=\"3f43\" id=\"3f43\" class=\"graf graf--p graf-after--figure\">You can even postpone learning about dev ops. <a href=\"https://firebase.google.com/\" data-href=\"https://firebase.google.com/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Firebase</a> is awesome as a cloud-based database solution. You get a scalable database with storage in regions around the world without the hassle of managing DevOps. Serverless platforms like <a href=\"https://aws.amazon.com/lambda/\" data-href=\"https://aws.amazon.com/lambda/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">AWS Lambda</a> and <a href=\"https://cloud.google.com/functions/\" data-href=\"https://cloud.google.com/functions/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Google Cloud Functions</a> can let you run code that would usually need servers without having to manage servers.</p>\n<p name=\"3063\" id=\"3063\" class=\"graf graf--p graf-after--p graf--trailing\"><a href=\"https://astechsolutions.in/careers/\" data-href=\"https://astechsolutions.in/careers/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">We’re looking for frontend developers to help build amazing web and mobile applications</a>.</p>\n</div></div>\n",
				
				"date_published": "2017-04-03T05:43:55-05:00",
				"url": "https://sanat.is/2017/04/03/reasons-why-you.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/03/20/a-simple-workflow.html",
				"title": "A simple workflow for moving WordPress websites between servers.",
				"content_html": "<div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\">\n<h3 name=\"70d6\" id=\"70d6\" class=\"graf graf--h3 graf--leading graf--title\">A simple workflow for moving WordPress websites between servers.</h3>\n<figure name=\"aa8a\" id=\"aa8a\" class=\"graf graf--figure graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*zxrLJLgwrYr4rSEATglrmw.jpeg\" data-width=\"1920\" data-height=\"1024\" src=\"https://cdn.uploads.micro.blog/34232/2021/2d876f91e0.jpg\"></figure><p name=\"39df\" id=\"39df\" class=\"graf graf--p graf-after--figure\">Add the <a href=\"https://wordpress.org/plugins/content-freeze/\" data-href=\"https://wordpress.org/plugins/content-freeze/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Content Freeze plugin</a> so that no content is updated while the site is being moved</p>\n<p name=\"ab29\" id=\"ab29\" class=\"graf graf--p graf-after--p\">Use the <a href=\"https://wordpress.org/plugins/all-in-one-wp-migration/\" data-href=\"https://wordpress.org/plugins/all-in-one-wp-migration/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">All in one WP Migrate plugin</a> to create an export file.</p>\n<p name=\"8beb\" id=\"8beb\" class=\"graf graf--p graf-after--p\">Don’t download and upload the export file.It makes a lot more sense to move the file directly from one server to the other</p>\n<p name=\"5f03\" id=\"5f03\" class=\"graf graf--p graf-after--p\">If SSH is available on the new host — use <a href=\"http://www.computerhope.com/unix/wget.htm\" data-href=\"http://www.computerhope.com/unix/wget.htm\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">wget</a> to download the file directly to the server. Remember that <a href=\"https://www.cyberciti.biz/tips/wget-resume-broken-download.html\" data-href=\"https://www.cyberciti.biz/tips/wget-resume-broken-download.html\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">wget supports resuming downloads</a>.</p>\n<p name=\"0283\" id=\"0283\" class=\"graf graf--p graf-after--p\">If only cPanel is available use <a href=\"http://stackoverflow.com/a/25159399/543453\" data-href=\"http://stackoverflow.com/a/25159399/543453\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">exec to wget the file directly to the server</a></p>\n<p name=\"6921\" id=\"6921\" class=\"graf graf--p graf-after--p\">Make sure the export file is in the /wp-content/ai1wm</p>\n<p name=\"ba5d\" id=\"ba5d\" class=\"graf graf--p graf-after--p\">Restore the export from the backups section of All in one WP Migrate plugin dashboard.</p>\n<p name=\"de59\" id=\"de59\" class=\"graf graf--p graf-after--p\">Make sure the restore has gone smoothly by editing your hosts file to reflect the new host IP and checking in an incognito/private browser window.</p>\n<p name=\"08e4\" id=\"08e4\" class=\"graf graf--p graf-after--p graf--trailing\">Point the domain to the new host IP.</p>\n</div></div>\n",
				
				"date_published": "2017-03-20T05:37:59-05:00",
				"url": "https://sanat.is/2017/03/20/a-simple-workflow.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/03/02/how-we-moved.html",
				"title": "How we moved to HTTPS",
				"content_html": "<div class=\"section-content\"><div class=\"section-inner sectionLayout--insetColumn\">\n<p name=\"cccd\" id=\"cccd\" class=\"graf graf--p graf--leading\">How we moved to HTTPS</p>\n<figure name=\"1637\" id=\"1637\" class=\"graf graf--figure graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*eCuWBygl5D3yr9rz0CgejQ.png\" data-width=\"343\" data-height=\"113\" src=\"https://cdn.uploads.micro.blog/34232/2021/a43635a4b3.jpg\"></figure><p name=\"034b\" id=\"034b\" class=\"graf graf--p graf-after--figure\">Why HTTPS?<br>Google has been giving better search rankings to secure sites <a href=\"https://webmasters.googleblog.com/2014/08/https-as-ranking-signal.html\" data-href=\"https://webmasters.googleblog.com/2014/08/https-as-ranking-signal.html\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">since a very long time</a> . The nail in the coffin for us was now <a href=\"https://arstechnica.com/information-technology/2017/01/firefox-chrome-start-calling-http-connections-insecure/\" data-href=\"https://arstechnica.com/information-technology/2017/01/firefox-chrome-start-calling-http-connections-insecure/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">chrome and firefox show you an “Insecure” tag when you’re on a page with a password form</a>.</p>\n<p name=\"b1e1\" id=\"b1e1\" class=\"graf graf--p graf-after--p\"><a href=\"https://letsencrypt.org/\" data-href=\"https://letsencrypt.org/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Let’s encrypt</a> is amazing at giving out free SSL certificates. Our hosting platform (WPEngine) unfortunately did not support letsencrypt SSL certificates till now. Recently that changed and they even made it very easy to enable SSL using Let’s Encrypt.</p>\n<figure name=\"0d37\" id=\"0d37\" class=\"graf graf--figure graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*JkhvfN5UjF3U-RLkjPCm6A.png\" data-width=\"1199\" data-height=\"620\" src=\"https://cdn.uploads.micro.blog/34232/2021/67093cbfae.jpg\"></figure><p name=\"ba67\" id=\"ba67\" class=\"graf graf--p graf-after--figure\">While moving the root domain to https was easy. We had a CDN CNAME enabled for our site. The CNAME made is prettier — so we had cdn.astechsolutions.in serving out all our static assets instead of the gibberish.netdna-ssl.com address. This posed another challenge. We needed another SSL certificate for the cdn subdomain. This unfortunately was not available for free in WPEngine. We’d have to buy a SSL cert and then plug into WPengine which was not needed. The excellent chat support team helped change the CDN url to the poor looking <a href=\"https://413k2a2926rbn3qij2lhfr1tfu-wpengine.netdna-ssl.com\" data-href=\"https://413k2a2926rbn3qij2lhfr1tfu-wpengine.netdna-ssl.com\" class=\"markup--anchor markup--p-anchor\" rel=\"nofollow noopener noopener\" target=\"_blank\">https://413k2a2926rbn3qij2lhfr1tfu-wpengine.netdna-ssl.com</a> url for all our static assets.</p>\n<p name=\"ce6e\" id=\"ce6e\" class=\"graf graf--p graf-after--p\">Some things to note:<br>*A relative URL without a scheme (http: or https:) is valid. Include all scripts with // instead of http:// . This will use the https version of the scripts if one is available<br>*We used the plugin <a href=\"https://wordpress.org/plugins/really-simple-ssl/\" data-href=\"https://wordpress.org/plugins/really-simple-ssl/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Really Simple SSL</a> — to force SSL on certain links in the menus and widgets on the site. <br>*We had to setup a redirect so that all http links would redirect to https. This is a setting in the WPEngine console.<br>*It always a good idea to clear the cache and test if everything is working as expected. We had some errors show up when certain content was not secure on the site.<br>*Always take a backup before you make changes to your website.</p>\n<p name=\"d75d\" id=\"d75d\" class=\"graf graf--p graf-after--p graf--trailing\">Once we did this for ourselves — we got all our maintenance clients on WPEngine upgraded to https 🎉</p>\n</div></div>\n",
				
				"date_published": "2017-03-02T05:44:21-05:00",
				"url": "https://sanat.is/2017/03/02/how-we-moved.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/02/22/daily-presentations-how.html",
				"title": "Daily Presentations — How we made it easy for team members to share what they’ve learnt",
				"content_html": "<div class=\"section-content\">\n<div class=\"section-inner sectionLayout--insetColumn\"><h3 name=\"7c28\" id=\"7c28\" class=\"graf graf--h3 graf--leading graf--title\">Daily Presentations — How we made it easy for team members to share what they’ve learnt</h3></div>\n<div class=\"section-inner sectionLayout--fullWidth\"><figure name=\"1808\" id=\"1808\" class=\"graf graf--figure graf--layoutFillWidth graf-after--h3\"><img class=\"graf-image\" data-image-id=\"1*FqpSOhtLzVqnNsb-L0OStQ.jpeg\" data-width=\"1196\" data-height=\"800\" src=\"https://cdn.uploads.micro.blog/34232/2021/8492185b71.jpg\"><figcaption class=\"imageCaption\">What the score board looks at the end of one full cycle</figcaption></figure></div>\n<div class=\"section-inner sectionLayout--insetColumn\">\n<p name=\"431b\" id=\"431b\" class=\"graf graf--p graf-after--figure\">We have had a presentation everyday at astech since the last 8 months. We choose the speaker on a rotating basis … in the order your name is written on the score board — yes we keep scores. Winner gets an amazon gift card!</p>\n<p name=\"76bf\" id=\"76bf\" class=\"graf graf--p graf-after--p\"><strong class=\"markup--strong markup--p-strong\">Rules: </strong><br>1.You cannot miss your turn Has to be at most 5 minutes long — we use e.ggtimer.com/5mins to time<br>2.The presentation has to made to everyone. <br>3.Needs to be something that you have some personal experience with.<br>4. You get scored from 0 to 5. 5 being the highest.<br>5. If someone is absent you get 2 points from them.</p>\n<p name=\"9487\" id=\"9487\" class=\"graf graf--p graf-after--p\"><strong class=\"markup--strong markup--p-strong\">Pros: </strong><br>1.Everyone gets to learn something new everyday. <br>2.The presenter gets better at presenting<br>3.Possible blog post material</p>\n<p name=\"4073\" id=\"4073\" class=\"graf graf--p graf-after--p\"><strong class=\"markup--strong markup--p-strong\">Some of the topics that we have covered:</strong></p>\n<p name=\"5415\" id=\"5415\" class=\"graf graf--p graf-after--p\">How to update content on a WordPress site with custom post types.</p>\n<p name=\"92ae\" id=\"92ae\" class=\"graf graf--p graf-after--p\">Trekking 101</p>\n<p name=\"b865\" id=\"b865\" class=\"graf graf--p graf-after--p\">Machine Learning 101</p>\n<p name=\"ff4e\" id=\"ff4e\" class=\"graf graf--p graf-after--p\">An introduction to <a href=\"http://sass-lang.com/\" data-href=\"http://sass-lang.com/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Sass</a></p>\n<p name=\"f600\" id=\"f600\" class=\"graf graf--p graf-after--p\"><a href=\"https://kb.yoast.com/kb/canonical-urls-in-wordpress-seo/\" data-href=\"https://kb.yoast.com/kb/canonical-urls-in-wordpress-seo/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Cannonical URLs in WordPress</a></p>\n<p name=\"b69b\" id=\"b69b\" class=\"graf graf--p graf-after--p\">Indian Budget highlights (by our accountant)</p>\n<p name=\"e8c7\" id=\"e8c7\" class=\"graf graf--p graf-after--p\"><a href=\"https://www.webcomponents.org/\" data-href=\"https://www.webcomponents.org/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Webcomponents</a></p>\n<p name=\"e4c9\" id=\"e4c9\" class=\"graf graf--p graf-after--p\">Body Language 101</p>\n<p name=\"3d76\" id=\"3d76\" class=\"graf graf--p graf-after--p\">Features of the <a href=\"https://www.visualstudio.com/\" data-href=\"https://www.visualstudio.com/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Visual Studio Editor</a></p>\n<p name=\"0233\" id=\"0233\" class=\"graf graf--p graf-after--p\">An introduction to the <a href=\"http://electron.atom.io/\" data-href=\"http://electron.atom.io/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Electron</a> Framework for building desktop apps</p>\n<p name=\"dd8e\" id=\"dd8e\" class=\"graf graf--p graf-after--p\">An introduction to <a href=\"https://www.cloudflare.com/\" data-href=\"https://www.cloudflare.com/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Cloudflare</a></p>\n<p name=\"ef49\" id=\"ef49\" class=\"graf graf--p graf-after--p\">How to play Black Jack</p>\n<p name=\"5fb2\" id=\"5fb2\" class=\"graf graf--p graf-after--p\">Different types of Life Insurance</p>\n<p name=\"baf4\" id=\"baf4\" class=\"graf graf--p graf-after--p\">TDS (Tax Deducted at source) calculations and exemptions</p>\n<p name=\"7640\" id=\"7640\" class=\"graf graf--p graf-after--p\">An introduction to <a href=\"http://easyengine.io/\" data-href=\"http://easyengine.io/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">Easy Engine</a></p>\n<p name=\"00a8\" id=\"00a8\" class=\"graf graf--p graf-after--p\">UPI (Universal Payments Interface) 101</p>\n<p name=\"8cb3\" id=\"8cb3\" class=\"graf graf--p graf-after--p\">How to use Netflix</p>\n<p name=\"d0d7\" id=\"d0d7\" class=\"graf graf--p graf-after--p\">Documentation needed for home loan (from one of us who got a home loan recently)</p>\n<p name=\"f927\" id=\"f927\" class=\"graf graf--p graf-after--p\">How to look for cheap airfare</p>\n<p name=\"a70f\" id=\"a70f\" class=\"graf graf--p graf-after--p\">The Grammarly chrome extension</p>\n<p name=\"500d\" id=\"500d\" class=\"graf graf--p graf-after--p\"><strong class=\"markup--strong markup--p-strong\">Here’s what we’ve learnt.</strong><br>Everyone in astech is an expert at what they do. Even our accountant is an expert, at managing the books.</p>\n<p name=\"2c64\" id=\"2c64\" class=\"graf graf--p graf-after--p\">Sharing the process of how you learn new things helps others to learn better.</p>\n<p name=\"2ce5\" id=\"2ce5\" class=\"graf graf--p graf-after--p\">Sometimes it is the little things that matter. A little thing that has taken you hours to understand and master. The time taken to explain this saves on the time that someone would have to spend in the future.</p>\n<p name=\"75d6\" id=\"75d6\" class=\"graf graf--p graf-after--p\">While not all topics are technical — they are all interesting. Non interesting topics get weeded out since this has turned into a competition.</p>\n<p name=\"4538\" id=\"4538\" class=\"graf graf--p graf-after--p\">Since people work in their own silos it is easy to get caught up in what you’re doing and not share what you’ve learnt.</p>\n<p name=\"b3b9\" id=\"b3b9\" class=\"graf graf--p graf-after--p\">Some things come naturally to some people. While to some people those exact same things can be difficult for someone else.</p>\n<p name=\"df1c\" id=\"df1c\" class=\"graf graf--p graf-after--p\">You don’t know what you don’t know. It helps to get an exposure on new things.</p>\n<p name=\"c7c6\" id=\"c7c6\" class=\"graf graf--p graf-after--p graf--trailing\">Sometimes these presentations are a way to show your team something cool you found out.</p>\n</div>\n</div>\n",
				
				"date_published": "2017-02-22T04:38:01-05:00",
				"url": "https://sanat.is/2017/02/22/daily-presentations-how.html"
			},
			{
				"id": "http://Sanat.micro.blog/2017/02/08/a-play-store.html",
				"title": "A Play Store experiment",
				"content_html": "<div class=\"section-content\">\n<div class=\"section-inner sectionLayout--insetColumn\">\n<h3 name=\"0c81\" id=\"0c81\" class=\"graf graf--h3 graf--leading graf--title\">A Play Store experiment</h3>\n<p name=\"8c37\" id=\"8c37\" class=\"graf graf--p graf-after--h3\">The story begins three years ago when we created an app as an exercise for a new javascript developer in our company. We usually hire interns who are just out of college. College, especially in India, teaches you a lot about theory but not about the applications that exist already. The exercise was to implement an open API with PhoneGap while using data from a phone sensor.</p>\n<p name=\"001a\" id=\"001a\" class=\"graf graf--p graf-after--p\">While at McDonald’s a couple of us decided on making an app that gives you a list of McDonald’s closest to you. The intern knocked out the app in about two days. We passed the location from the phone to the foursquare API and then used jQuery mobile to show that list.</p>\n<p name=\"e67c\" id=\"e67c\" class=\"graf graf--p graf-after--p\">Got a logo designed by a friend. We even celebrated by putting it up on the <a href=\"https://play.google.com/store/apps/details?id=in.astech.closestmcdonalds\" data-href=\"https://play.google.com/store/apps/details?id=in.astech.closestmcdonalds\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">play store</a>.</p>\n</div>\n<div class=\"section-inner sectionLayout--outsetRow\" data-paragraph-count=\"3\">\n<figure name=\"045a\" id=\"045a\" class=\"graf graf--figure graf--layoutOutsetRow is-partialWidth graf-after--p\" style=\"width: 34.803%;\"><img class=\"graf-image\" data-image-id=\"1*wM1daNObrm1cYN0xd9IXJQ.png\" data-width=\"540\" data-height=\"900\" src=\"https://cdn.uploads.micro.blog/34232/2021/beabc86ae4.jpg\"></figure><figure name=\"9165\" id=\"9165\" class=\"graf graf--figure graf--layoutOutsetRowContinue is-partialWidth graf-after--figure\" style=\"width: 32.599%;\"><img class=\"graf-image\" data-image-id=\"1*LYX8i7zhC7PL-t7tQLNukw.png\" data-width=\"506\" data-height=\"900\" src=\"https://cdn.uploads.micro.blog/34232/2021/ad8991cd08.jpg\"></figure><figure name=\"299f\" id=\"299f\" class=\"graf graf--figure graf--layoutOutsetRowContinue is-partialWidth graf-after--figure\" style=\"width: 32.599%;\"><img class=\"graf-image\" data-image-id=\"1*RCAJPxFfkKkdiJNF4Nq5gg.png\" data-width=\"506\" data-height=\"900\" src=\"https://cdn.uploads.micro.blog/34232/2021/db7104d12d.jpg\"></figure>\n</div>\n<div class=\"section-inner sectionLayout--insetColumn\">\n<p name=\"eee0\" id=\"eee0\" class=\"graf graf--p graf-after--figure\">Then we forgot about it.</p>\n<p name=\"2083\" id=\"2083\" class=\"graf graf--p graf-after--p\">Two years later on a whim I decided to open the Play store developer area. I noticed that the app had 2000 active installs! That felt amazing. I’d looked up the app analytics only because we had a new intern and we were considering repeating this tried and tested app exercise.</p>\n<figure name=\"6f75\" id=\"6f75\" class=\"graf graf--figure graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*ZT9xegdEB7YNKR2lDBBLOA.png\" data-width=\"991\" data-height=\"277\" src=\"https://cdn.uploads.micro.blog/34232/2021/2e12872e8c.jpg\"></figure><figure name=\"db4f\" id=\"db4f\" class=\"graf graf--figure graf-after--figure\"><img class=\"graf-image\" data-image-id=\"1*lKLJLP63NCOyWIzmwP3-PA.png\" data-width=\"990\" data-height=\"284\" src=\"https://cdn.uploads.micro.blog/34232/2021/8de5267323.jpg\"></figure><p name=\"0cb6\" id=\"0cb6\" class=\"graf graf--p graf-after--figure\">We built the app again. This time with bootstrap and phonegap. We added some features as well like <a href=\"https://branch.io/what-is-deep-linking/\" data-href=\"https://branch.io/what-is-deep-linking/\" class=\"markup--anchor markup--p-anchor\" rel=\"noopener\" target=\"_blank\">deep linking</a> the location within google maps. That’s it.</p>\n<p name=\"f5d1\" id=\"f5d1\" class=\"graf graf--p graf-after--p\">A year later we redid the app in React Native. You see the pattern here. This was mostly an app that we used to exercise our skills. We like to be on the cutting edge of tech — or at least slightly behind the cutting edge. We started listening to user feedback by enabling review notifications from within the play store publish module.</p>\n<p name=\"e6ce\" id=\"e6ce\" class=\"graf graf--p graf-after--p\">Most recently as a new exercise for another new employee we rebuilt the app again using Ionic (which is AnuglarJS and Phonegap) put up a small Google Ad widget as well.</p>\n<figure name=\"5b2c\" id=\"5b2c\" class=\"graf graf--figure graf-after--p\"><img class=\"graf-image\" data-image-id=\"1*2ywPNF8bTqtWpd-9bzbjuw.png\" data-width=\"1132\" data-height=\"542\" src=\"https://cdn.uploads.micro.blog/34232/2021/4926e807f8.jpg\"><figcaption class=\"imageCaption\">Adsense data</figcaption></figure><p name=\"78e5\" id=\"78e5\" class=\"graf graf--p graf-after--figure\">The app earns around $8 a month — not bad at all for an exercise where we’re able to hone our skills.</p>\n<p name=\"92b3\" id=\"92b3\" class=\"graf graf--p graf-after--p graf--trailing\">Our plan with the app? Rewrite the app in Ionic2 next time someone new joins the team.</p>\n</div>\n</div>\n",
				
				"date_published": "2017-02-08T04:24:31-05:00",
				"url": "https://sanat.is/2017/02/08/a-play-store.html"
			}
	]
}
