-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlunr.json
351 lines (351 loc) · 161 KB
/
lunr.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
[
{
"uri": "/about",
"content": "---\nlayout: page\npermalink: /about/index.html\ntitle: Rajath?\ntype: about\nmodified: 2015-01-07\n\n---\n\nI’m a programmer currently living in Seattle, Washington. I came to the United States in 2012 to do my Masters in Computer Science. I graduated in May 2014 from University of Illinois at Chicago.\n\nI was born and brought up in Bangalore, India. I like running, I've done few half marathons and couple of full marathons. I also read lot of non-fiction books and listen to podcasts all the time. I've been playing lot of Chess recently.\n\nI use this blog to write about my experiences while learning new things. Hope you find something useful here.\n",
"tags": []
},
{
"uri": "/micro/100-days-to-offload",
"content": "---\ntitle: \"100 Days to Offload\"\ndate: 2020-06-23T00:12:42-07:00\n---\nThinking of doing the #100DaysToOffload thing. Let's see. \nhttps://100daystooffload.com\n",
"tags": []
},
{
"uri": "/micro/building-a-second-brain",
"content": "---\ntitle: \"Building a Second Brain\"\ndate: 2020-07-18T11:53:42-07:00\n---\nBuilding a second brain: The illustrated notes \nhttps://maggieappleton.com/basb\n",
"tags": []
},
{
"uri": "/micro/cognitive-bias-cheat-sheet",
"content": "---\ntitle: \"Cognitive Bias Cheat Sheet\"\ndate: 2020-09-21T22:22:15-07:00\n---\nCognitive Bias Cheat Sheet: \nhttps://medium.com/better-humans/cognitive-bias-cheat-sheet-55a472476b18\n",
"tags": []
},
{
"uri": "/micro/crazy-brains",
"content": "---\ntitle: \"Crazy Brains\"\ndate: 2020-06-22T23:40:14-07:00\n---\nHow crazy are our brains: \nhttps://mobile.twitter.com/Foone/status/1014267515696922624\n",
"tags": []
},
{
"uri": "/micro/first-post",
"content": "---\ntitle: \"First Post\"\ndate: 2020-06-22T22:35:01-07:00\n---\nFirst micro post. Planning to use this for short thoughts and sharing/saving interesting links I come across\n",
"tags": []
},
{
"uri": "/micro/futurepedia",
"title": "Futurepedia",
"content": "\nDirectory of AI tools containing free/freemium/paid services\n\nhttps://www.futurepedia.io\n",
"tags": []
},
{
"uri": "/micro/gordon-brander",
"content": "---\ntitle: \"Gordon Brander\"\ndate: 2020-09-12T11:24:11-07:00\n---\nGordon Brander: Patterns - knowledge base containing ideas and connections\nhttp://gordonbrander.com/pattern\n",
"tags": []
},
{
"uri": "/micro/internet-explained-first-principles",
"title": "Internet Explained First Principles",
"content": "\nInternet explained from First Principles\n\nhttps://explained-from-first-principles.com/internet\n",
"tags": []
},
{
"uri": "/micro/lights-and-shadows",
"content": "---\ntitle: \"Lights and Shadows\"\ndate: 2020-07-01T22:55:45-07:00\n---\nLights and Shadows: https://ciechanow.ski/lights-and-shadows\n",
"tags": []
},
{
"uri": "/micro/pkm",
"content": "---\ntitle: \"Pkm\"\ndate: 2020-09-11T22:26:59-07:00\n---\nMy new found interests: Personal Knowledge Management and Digital Gardens. \nhttps://logseq.com\nhttps://wiki.nikitavoloboev.xyz\n",
"tags": []
},
{
"uri": "/micro/untools-tools-for-better-thinking",
"title": "Untools",
"content": "\nUntools - Tools for better thinking\n\nhttps://untools.co\n",
"tags": []
},
{
"uri": "/now-archive",
"title": "Now Archive",
"content": "\nThis page contains everything that was moved from the Now page\n\n---\n\nSep 5, 2022 {sep-5-2022}\n\nFlow\n\nJul 31, 2022 {jul-31-2022}\n\nBuilding a Second Brain\n\nJun 26, 2022 {jun-26-2022}\n\nThe Three-Body Problem\nMasters of Doom\nSo Good They Can't Ignore You\nThe 12 Week Year\n\nJan 23, 2022 {jan-23-2022}\n\nSum: Forty Tales from the Afterlives\n\nMay 30, 2021 {may-30-2021}\n\nFinished reading The Great Mental Models Vol. 1\n\nJan 9, 2021 {jan-9-2021}\n\nAdding more blog posts\nConfigured some YASnippets on my Emacs\nAdded a bunch of dotfiles as literate configs\n\nOct 18, 2020 {oct-18-2020}\n\nSetting up a sustainable sync for my org files on my phone and laptop\n (since Orgzly is a bit of a pain when it comes to this)\nLearning Emacs and org-mode. Loving it\n\nAug 29, 2020 {aug-29-2020}\n\nWhat to write down when you're reading to learn\n\nJul 25, 2020 {jul-25-2020}\n\nBuilding a second brain\nSelf-hosting my data using Nextcloud on my Raspberry Pi\n\nJun 24, 2020 {jun-24-2020}\n\nMoved my blog from Jekyll to Hugo and now customizing some templates\nIndieweb integration\nSelf-hosting my data using Nextcloud on my Raspberry Pi",
"tags": []
},
{
"uri": "/now",
"title": "Now",
"content": "\nReading {reading}\n\nCode\nImmune\nSelf-Sovereign Identity\n\nWatching {watching}\n\nAwakening from the Meaning Crisis (16 episodes in)\n\nProjects {projects}\n\nBuilding split ergo mech keyboards (built a corne choc, a microdox bud mx and a 3x5 cantor so far)\n\nHealth {health}\n\nWorking out\nRunning\nMeditating\n\nLearning {learning}\n\nNextJs\nBuilding keyboards, soldering, debugging\n\n---\n\nThis is a Now page, based on the concept by Derek Sivers. Visit nownownow.com for more inspiration. Visit the Now Archive to check out things that used to be on this page {this-is-a-now-page-based-on-the-concept-by-derek-sivers-dot-visit-nownownow-dot-com-for-more-inspiration-dot-visit-the-now-archive-to-check-out-things-that-used-to-be-on-this-page}",
"tags": []
},
{
"uri": "/posts/2015-lessons-learned",
"content": "---\ncomments: true\ndate: \"2016-01-02T00:00:00Z\"\naliases: [/2015-lessons-learned]\ntags:\n2015\nlessons\ntitle: 2015 - Lessons Learned\nseries: [\"year-in-review\"]\n---\nI saw a couple of posts about what people did in 2015 (this and this) that inspired me to write my own. While both posts go in good detail about what they accomplished, my post kind of does the opposite. Mine is more about me reflecting on what I had planned to do, what I did and what I didn't do, and lessons learned during that. And\nnew year is a good time to look back on how the past one year went; how productive/lazy you were, how committed/easy going you were.\n\nAt the start of the year, I wrote down some goals for myself. I called it goals instead of resolutions (like I used to before) to make it sound serious (after all the goal-setting we do at our workplace). And to be honest it worked, to an extent. Couple of goals, I really crushed it and I'm happy about it, but few others, meh. Most importantly when I look at the whole of 2015 I'm surprised to see how I functioned. I was keeping myself busy for the most part doing something and learning\nsomething, but now I don't have much to show for all that. So I want to write down the lessons I learned for each goal that I had set and think about how I can improve what I'm doing well and also work on my shortcomings.\n\nLessons Learned\nLet's start with what went well. \n\nWorkout (a.k.a Project Lose-The-Tummy): I'm lazy. Physical activities wise, fitness wise, I'm really lazy. I go on few hikes in the summer, but that's it. I just stay indoors rest of the time glued to my laptop. I've been this way for few years now and I've acquired enough fat around my waist. For the first 5 months after setting this goal, I didn't do anything. One day when I looked at myself in the mirror, I said \"Shit! I should do something about it\". And I started running one\nmile, thrice a week. After that I slowly started running more and more. Then I started going to the gym in my apartment 5 days a week. Been doing it for close to 6 months now. I won't say I'm in perfect shape. But I can see the difference. Also from the time I started going to the gym, my eating habits have improved. So that's a happy byproduct of a good habit.\n\nRead more books (Goodreads reading challenge): I never used to read books, and I know that's a bad thing. One must read as many books as possible. The knowledge we get from them is immense. Also, I wanted to have hobbies that don't involve a screen. So I picked up a Kindle Paperwhite, but that screen doesn't count :) Goodreads has this reading challenge that you can take up and track your progress. You can also see\nwhat your friends have set their reading challenges as and what they're reading to get some nice recommendations. Anyway, I took the Goodreads reading challenge and set a goal for myself to read 10 books this year. I read 12, which is good. I plan to read more in 2016. I'll take up that challenge again.\n\nHere are the books I read: \n\nMan's Search for Meaning\nFreedom from the Known\nThe Selfish Gene\nIntroducing Stephan Hawking\nFreakonomics\nHow to Stop Sucking and Be Awesome Instead\nMini Habits\nNikola Tesla\nThe Martian\nClean Code\nPragmatic Programmer\nEnterprise Integration Patterns\n\nI guess that's it for what went well. Here's stuff that didn't go well. \n\nMake an Android app every 3 months: There's so much going on in Android app development that it's quite hard to catch up. My goal was to learn different design patterns, libraries, architectures and get to a comfortable state where I could develop apps with ease. Why I said 3 months is because I felt that would be enough time for me to learn some patterns/architectures, spend time in design and make a stable app while managing hectic work schedules and on call, instead of something that was hacked over a weekend just to make\nthings work. I also wanted to learn a bit of UI design to not only make the apps scalable, maintainable and robust, but also beautiful. I tried making 3 Android phone apps and 1 Android wear app and I took 2 of them close to completion, but never completed. Where I went wrong is I spent too much time in design and wanted to get everything perfect the first time. Also, when I was halfway through the development I would come across blog posts about the right way of designing your app, or\nthe best suited pattern and I would get lost in reading more about these patterns. After reading them I'd be in a dilemma if I should continue what I was doing that or redo the whole thing.\n\n Here's what I learnt from all this. If you're making an app as a side project, go ahead with it and finish it. Completion is more important than quality, at least for beginners. Moreover, you can call the shitty version as v1. Then you can add all sorts of improvements later on and make it nice, but at the end of the day every bit of it would be a good learning experience. It may not be the best app, but you get to learn so much about how not to do stuff. Also, if you complete the\napp you'll have some level of satisfaction as compared to how you feel when you just stop working on your side project for a while and it dies out. Things you do well and don't do well both make for a good blog post. So, that's a good way to keep your blog updated too.\n\nPlay Guitar: I didn't know how to quantify this goal or measure it, so I made it a little vague. This is less of a goal and more like a hobby. This is the second hobby that doesn't involve a screen. I started playing the guitar regularly on weekends for the first 2-3 months and then I just got busy with work and on call. An hour or two per week shouldn't be hard enough to allocate and practice. I'm going to work on this in 2016 and come up with a more solid plan to follow a course, read up some\ntheory, etc.\n\nBlog every week: I did terribly on this. I made two blog posts in 2015 and that's it. It should have been a weekly thing where I talk about what I did the previous week or some random stuff I'm interested in. But for some reason, I was way too lazy to update my blog. Even though I was sometimes working on my side project and learning new things. I should just keep it more updated in 2016.\n\n Conclusion\n\nEach of my goals and how I did against them taught me more about myself and how I handle things. To me, at least now, it boils down to these 3 things. \n\nDiscipline. If there's one thing that's present in the goals that went well and absent in the ones that didn't go well, it's discipline. Because discipline trumps motivation. Motivation is temporary; it's like a spark, it comes and goes. You can't keep waiting to get motivated in order to start working on something. Discipline on the other hand is more permanent. It's something that you religiously follow, something you're accountable to. If I have a discipline that I must blog every\nweek, come what may, then I will make most of my week eventful to make that happen. This helps in both blog-writing and also working on my side projects. I'd get better at both coding and writing. :) Same goes with side projects. Some days you're exhausted after work and you don't have the energy to work on your side project. That's a good time to refactor your code or read some blogs about best practices, new libraries/frameworks, whatever. In order to become an expert at something, you\nneed to work on it every day and keep practicing what you're doing. You cannot become an expert over night. \n\nFinish what you start. Always finish what you start. A goal left midway is more disappointing than not doing it at all because you start feeling that you had the capability to finish it had you put in a little more effort, but you just didn't do it. It may turn out to be a shitty app, or a shitty blog post. Only if you finish what you start, you'll know where you went wrong and what can be improved. Nobody gets it right the first time and you don't have to get it right the first time. Learning is important. Learning is\nbeautiful.\n\nReview your goals often. Never be lazy. Do something. Anything. Anything productive. It's okay to chill out sometimes, but otherwise, it's important to keep learning and making the best use of your time. Reviewing your goals on a timely basis helps you to stay on track and get shit done. Sometimes you may end up in a state where you feel like you're doing something pretty much every day, but not really getting anywhere. By making your goals measurable and reviewing them regularly, you\nknow exactly how far away you are from your goal and you can work towards it.\n\n",
"tags": []
},
{
"uri": "/posts/2018-year-in-review",
"content": "---\ncategories:\nannual-review\ncomments: true\ndate: \"2019-01-24T00:00:00Z\"\ntags:\nannual-review\n2018\ntitle: 2018 in Review\nseries: [\"year-in-review\"]\n---\n2018 went by really quick. It was one of the more eventful years - packed with activities, travel, new hobbies, experiences and accomplishments. I have been following James Clear and Tim Ferris for a long time now and their posts about past year review have been the inspiration behind this blog post.\n\nI don't like setting goals, but rather invest my time in building habits, as I feel they're more sustainable and long term rather than having an end point that brings me a lot of anxiety while approaching the due date. I like small incremental progress on a daily basis than few days of powering through a task that ends up half-baked. Having said that, I do like to identify few areas I want to focus on to at least head in a general direction to form a habit.\n\nHere are some of the goals (or habits) I had planned for 2018:\n\nPractice guitar\nRead more books\nUpdate blog more regularly\nLearn yoga\nEat fruits every day\nPractice mindfulness\n\nWhat went well\n\nThe first thing I did was to maintain a list called 2018 Highlights. I did this to keep track of the main events that happened to me in 2018, as a look back to see how it went. This list contained things that I tried for the first time, or something outside the ordinary, memorable activities and accomplishments. Here are some of more noteworthy ones from my list:\n\nFinished Level 1 of Japanese on Memrise\nPicked up Origami\nPicked up Chess (and solving Chess puzzles)\nPicked up Rubiks cube and got pretty good at it\nStarted meditating every day (325 days and counting)\nDeleted my Facebook account\n7 hikes\n3 half marathons\n2 10Ks\n1 full marathon\n\nBesides this list, here's a little more on how I did with my goals\n\n Read more books\n\nI read 27 books in 2017 and I wanted to read more than that in 2018. Due to other commitments, I didn't hit that mark. I did have phases where I'd read books every day and there were weeks where I didn't read them. But I got to read lot of good books on various topics like Physics, Philosophy, Biology, Biographies, and Running.\nHere's a list of books I read in 2018.\n\nLearn yoga\n\nI started doing yoga at the rock climbing gym that I was going to. I started with Yin Yoga and fell in love with it. I did it very regularly for few months. I had to stop when I was training for my marathon, since there wasn't enough time to fit climbing, yoga, strength training and 5 days of running in my 7 day schedule. However, I'm back to yoga and climbing after taking a 3-month break. Trying Vinyasa now just to see how it is. This is a habit that I plan to continue as I'm already seeing the benefits it has on my body.\n\n Eat fruits every day\n\nThis was decided on a whim when I realized I wasn't eating a lot of fruits. I wanted to have a healthy diet, but always missed out on fruits due to laziness. I succeeded in this by incorporating fruits at different parts of my diet, most of them being part of my breakfast smoothie.\n\nPractice Mindfulness\n\nSometime in March, I was reading some blog and I came across Headspace. I had heard of it before, but I never bothered trying it because I was not very interested in guided meditations. This time I thought I'll bite the bullet and give it a shot, and bought a yearly subscription. It was one of the best decisions I've made recently as it helped me meditate better and be more mindful. My run streak in the app says 325 days and I've been doing it either as soon as I wake up, or during my commute or sometimes before I go to sleep or whenever I have some time during the day.\n\n Running\n\n2018 was probably the best year for running. The year started off with my getting back to running after my knee injury (and couple of months of physical therapy). Starting off with 10 minute runs on the treadmill, I ended up doing my first half marathon in March. And it only got better after that. Here's all the runs I did in 2018:\n\nMarch: Mercer Island Half Marathon (1h 53m)\nApril: 10K Autism Run (53m 28s)\nMay: Mother's Day Half Marathon (1h 59m)\nJune: Seattle Rock N' Roll Half Marathon (1h 48m)\nJuly: 10K Trail Run (55m)\nOctober: Snohomish River Run Full Marathon (4h 16m)\n\nI'm planning to run more this year. Let's see how it goes.\n\nDaily Journaling\n\nThis is something I was never interested in until last year. But I thought of giving it a shot. I did it for an entire year and I don't regret it, I still do it. I realized the importance of putting my thoughts down. It helped me think more clearly and the habit of doing it every day makes me reflect on my days from a different perspective. I use the app Daylio which captures the activity and mood as well, and it gives a nice graph every week to see how the past week went.\n\n What didn't go well\n\nAs much as I enjoyed reading books, doing yoga and running a lot, there were goals that I missed. Here are some of them:\n\nPractice Guitar\n\nI wanted to make this a regular habit, but never got around to it. There were phases - couple of weeks of every day practice and then couple of months of nothing, mainly due to work commitments. Things just got hectic and I stopped playing guitar. This is something I want to work on. To keep the practice consistent, even if I'm playing for few minutes every other day. It's a good stress-buster.\n\n Blog Regularly\n\nThis is the worst of all. Never made a single blog post in the entire year, even though I had it as a goal. It's mostly due to the problem of inertia. It's so hard for me to get started on simple tasks, or tasks that only take few minutes. But once I start, I'll have enough momentum to finish it off. Hope I blog more often this year.\n\nSide Quests\n\nBesides the goals I had, there were few things I picked up during the year. Mainly because I somehow got interested in them long enough to actually commit a good chunk of time learning it.\n\nRubiks Cube: My best time to solving a 3x3x3 is about 2m 15s now. Planning on improving it :)\nKendama: My friend got Kendama at work and I was fascinated by it. I bought one for myself and ended up learning few tricks.\nOrigami: Made some cool stuff like DNA, Hyperbolic Paraboloid, Tangram, etc.\nLevel 1 of Japanese on Memrise: Decided to learn a new language - Japanese. Finished Level 1 on Memrise. Will pick it up later this year.\nSide projects with Raspberry Pi: Set up Pi-Hole (a network-wide ad-blocking software). Also tried setting up a voice assistant using snips.ai. Couldn't get the speaker to work, but everything else worked fine.\nPicked up drawing: This was a one-off thing where I saw a Medium post about a Quick Beginner's Guide to Drawing that involved hand workouts for pencil sketching and I just did those. Things like, filling up a page with circles and another one with hatched lines. Turned out pretty good, but never continued it.\n\n What I learned\n\nWith all the things I did and didn't do, here are the lessons I learned in 2018:\n\nYou're never ready, just go for it\n\nI learned this from my running. Beginning of the year, I never thought of doing a half marathon (which I did in March), let alone doing a full marathon. After my friend forced me to sign up, I thought I'll do it even if I sucked at it. And it went pretty well, for my first time - did it in under 2 hours. Same with running a full marathon in October. I thought I'm not ready for a full. But I also thought I shouldn't regret later. And it was pretty good time (4h 16m) for a first timer :)\n\n Don't underestimate the training\n\nThis one again comes from running. I finished my first full marathon in just over 4 hours, but looking back I see hundreds of hours of running, hundreds of miles of running, lot of IT band issues, hurt ankles, hurt everything. There were many times I lost hope during training, especially when I hurt my IT band during the run and then end up limping for the next two days. But it's that rigorous training that helped me do well in the actual event. What I got out of it is that if you're going for something big, you'll need to train a lot, you'll need to put in the hours. Not every day will turn out the way you want. There will be good days. There will be bad days. And there will definitely be shitty days. You just got to persist.\n\nTry to increase your circle of competence\n\nCircle of Competence Theory developed by Warren Buffet and Charlie Munger is something I believe in and strive to live every day. The more you learn and expand your knowledge, the more you realize you don't know enough. Try to learn new things outside your domain. This will help you think with new perspectives and also help find unique solutions to problems you face in your every day life.\n\n Conclusion\n\nThat wraps up 2018. It definitely was an eventful year and I learnt a lot. Looking forward to another year of activities, travel, new hobbies, more running, and hopefully more accomplishments.\n",
"tags": []
},
{
"uri": "/posts/2019-year-in-review",
"content": "---\ncategories:\nannual-review\ncomments: true\ndate: \"2020-01-05T00:00:00Z\"\naliases: [/annual-review/2019-year-in-review/]\ntags:\nannual-review\n2019\ntitle: 2019 in Review\nseries: [\"year-in-review\"]\n---\n\nAnother year done, and like always time flies by quicker and quicker every year. 2019 has been quite eventful in a few aspects and I took some time to reflect on how things went. This time I categorized my activities and personal growth into 3 sections - things I did more of, things I did less of, things I explored. Let's begin!\n\nThings I did more of\n\n Running\n\nI was faster (compared to last year) in almost all my races in 2019. I also participated in more races and set a few PRs.\n\nStats\n\nAll in for Autism 10K - 53m 33s\n\nMother's Day Half - 1h 57m\n\nThe Big Run 5K (trail run) - 29m 1s\n\nEvergreen Half - 1h 53m\n\nCraft Classic Half - 1h 49m\n\nIron Horse Half - 1h 42m\n\nFly 5K - 25m 46s\n\nSnohomish 10K - 51m 51s\n\nSnohomish River Run Full - 3h 56m\n\nI started off with the 10K in April with no training and I'm happy to see that my time only improved from then on. There was a time when I was running half marathons every couple of weeks and it got a little exhausting. But it feels great to look back and see all the races I've done.\n\n Marathon\n\nThe full marathon gets a special mention because the training was fun and the race, even more so. In 2018, I did my first full marathon and the training was quite brutal - mostly because I didn't know what to expect. And, I got first hand experience of what mile 18 feels like in a full marathon. But in 2019, I knew how the training would be, I knew how to prep and how to recover, when to push myself and when to take it easy. I used Hal Higdon's Intermediate 1 training plan and made my own modifications to it. Overall, I improved and set a PR.\n\nTraveling\n\nI did some traveling in 2019 with a few road trips - one in Oregon, couple in Washington, and few hikes around Seattle. I also visited Los Angeles. The most amazing and memorable one was the 4-day Inca Trail hike to Machu Picchu which was a birthday gift from my wife. Highly recommend going there and doing the 4-day hike, it's totally worth it. Also, a shout out to Alpaca Expeditions for their awesome crew that helped us with the hike, food, camps, etc.\n\n Things I did less of\n\nReading\n\nI fell off on the reading habit and ended up reading only about 14 books (compared to 24 in 2018). This is something I want to get back into.\n\n Working out\n\nI hardly worked out last year and thanks to my training for marathon, I just didn't have the time or energy to work out at all. When I wasn't training for my marathon, I was just plain lazy.\n\nBouldering\n\nThis fell off also because of my marathon training. I used to be regular and climb twice a week. But it just wasn't feasible.\n\n Things I explored (aka Side Quests)\n\nSnowboarding\n\nI picked up snowboarding in early 2019, thanks to my wife. I fell in love with it. I wasn't super interested in winter activities before, but after giving snowboarding a try I was always looking forward to driving to a nearby mountain and keep getting better at snowboarding. I'll be doing more of that this year for sure.\n\n Self Hosting\n\nI stumbled upon self hosting recently and it looked very appealing to me. The fact that I could just use Raspberry Pis to self host few things is what made me more inclined towards trying it out and playing with it. I see privacy concerns with storing my data on Google servers or with any other big corporations. I'd rather be in charge of my own data. So, I decided to slowly move things off of cloud services that I'm currently using and host my own data. I already set up a private cloud server and it's working like a charm. I got to learn lot of new technologies and it's been fun tinkering with Raspberry Pis.\n\nLearning new things\n\nIn my journey of learning to self host, I stumbled upon Docker, Traefik, Ansible, Prometheus, Grafana and I've been keen on learning these new technologies. I've also learnt a lot about networking, DNS, dynamic DNS, VPN, etc. I've spent many hours playing around with these, failing, learning and redoing a lot of the setup. It's a fun exercise which will continue this year as I get better at hosting a robust system with everything I need.\n\n Indie Web\n\nI stopped using social media platforms like Facebook, Twitter, Instagram few years ago. I knew about what Mastodon was in principle about a year ago, but never really got around to exploring it much. But towards the end of 2019, I checked out few instances in Mastodon and started exploring. I really liked the idea of instances that are built on certain set of principles and people adhering to it, and federating with other instances. I've only started with Mastodon, but I'll soon be exploring Pixelfed, Pleroma and the likes.\n\nLessons Learned\n\n You can't do everything\n\nHere's how my brain works. I find something interesting, I want to learn more about it. But I also don't want to give up on all the things I'm already doing. I fall short on some of the things (because it's not realistic to master everything, given the limited number of hours in a day). I get disappointed that I'm not doing enough. I've been doing this for years, even though I know that it doesn't make sense. What I should constantly remind myself is that I can't do (or master) everything. I should identify core areas where I want to grow and then focus all my energy on that. I should still explore things, and some of them may grow into something bigger and more important for my personal growth. But I must always acknowledge the fact that there is only limited amount of time and I must use it wisely.\n\nLess consumption, more creation\n\nWhat I didn't do more of is work on side projects, or create more. Even though, I don't use social media, I still check a lot of blogs and stuff myself with information. It's exhausting. Every time I have couple of minutes free on my hand, I check my phone and try to read a blog post. I have to practice to sit still, not touch my phone and not look at any screen. I used to meditate regularly and it definitely helps with being mindful about what we do. This is something I really want to do this year.\n",
"tags": []
},
{
"uri": "/posts/2020-year-in-review",
"content": "---\ntitle: \"2020 - Year in Review\"\ncategories:\nannual-review\ntags:\nannual-review\n2020\naliases: [/annual-review/2020-year-in-review/]\ndate: 2021-01-01T20:30:59-08:00\nseries: [\"year-in-review\"]\n---\n\n2020 has been quite a year for all of us and I don't want to get into the long list of things that have shook us this year. We're still resilient and stand strong even though we experience some of the most horrific events we're thrown into. I'm grateful for being privileged enough in terms of health, career, etc. This year hasn't been the best for pretty much anyone and the same goes for me. Having said that, like I do every year, here are some of the things I did more of, less of, some side quests and lessons learned along the way.\n\nThings I did more of\n\n Self hosting\n\nThis started out as a project for a few raspberry pis I had at home where I did a RAID-1 setup initially with NextCloud installed. However, I had to do a lot of heavy lifting in a lot of different areas, like configuring DDNS, setting up another raspberry pi as a mirror for data duplication, and other minor quirks I had along the way. Besides that, there were times when Nextcloud didn't work the way it was supposed to. Like, I wasn't seeing the 'Sharing' tab for any of the files or folders. There was not a lot of help from the community either. Besides that, the raspberry pi I had installed it on was constantly running out of memory. I just couldn't devote more time to it and fix all the quirks. Towards the end of 2020, I bought a Synology NAS DS220+ and I've been very happy with it.\n\nThe DS220+ did all the heavy lifting for me and the initial setup took less than 15 minutes. After that I just had to move my data to it. The DiskStation is definitely a superior and a much nicer product too. The fact that I have a great level of control into how my data is stored, shared and accessed while all the nitty gritty of the configuration is abstracted away has been a great experience. It's a huge time saver and I could focus my time and energy on other projects.\n\nChess\n\nThe quarantine prevented me from going out and that made me get into Chess. I spent many hours playing chess with my wife and got better at it. I also solved Chess puzzles on Lichess which I highly recommend if somebody is looking for good chess apps.\n\n Emacs/org-mode\n\nI used org-mode before with Spacemacs and it was okay. The workflow was great when I was in front of my computer, but for \"on the go\", I just couldn't get a good workflow going. This made me disinterested in emacs and org-mode and I switched to a different solution - Notion. I then learned about Doom Emacs which in my opinion is way better than Spacemacs since Spacemacs was really slow and clunky when I used it. With Orgzly installed on my phone, Syncthing set up on my phone and my computer, I got a good system that I could work with. Every day I learn new things about Emacs either intentionally or accidentally and I'm loving every bit of it.\n\nJournaling\n\nI journaled every single day this entire year. There were days when I journaled more and did a lot of brain dumps and there were other days where I journaled very little. I'm glad to have developed this habit since it has helped me organize my thoughts, come to logical solutions whenever I'm preoccupied with things that bother me, or just write down my thoughts. IMO, it's a very underrated habit and especially over time, you get a good ROI with journaling.\n\n Zettelkasten\n\nI take notes extensively. I used to take notes whenever I read a book, but these days I find myself taking notes when I read blog posts or listen to podcasts too. What I stumbled upon recently was a new note-taking method called Zettelkasten (or slip-box) - a system developed by Niklas Luhmann. I write smaller notes where each note contains an idea instead of a book summary. These notes end up getting interconnected to other notes. This system has been working well so far. Let's see where it takes me.\n\nReading\n\nI read few good books this year. I didn't focus on reading more books, but instead focused on reading bits and pieces of different books and reflecting on those ideas. This has been extremely valuable to me compared to how I used to read books or listen to audiobooks. For example, I read a 4 page chapter (called \"A sketch of good communication\") from a LessWrong book set (book name Epistemology) and reflected on it for couple of days which led me to few scenarios where was I guilty of bad communication in the past. The chapter is super interesting and is also available as a blogpost (as are all other chapters in the book set) if you're interested.\n\n Things I did less of\n\nRunning\n\nThe quarantine made us stay home and summer was mostly spent indoors. I did run a couple of times on a treadmill in our apartment gym, but that was closed too after a bit. I'm looking forward to running outside in 2021 once it gets warmer\n\n Working out\n\nI stopped doing bodyweight workouts too and I tend to have mostly focused on eating more, and gaining more weight (though that wasn't part of the plan).\n\nPersonal projects\n\nWith the whole WFH situation, I ended up working way more than I did when I used to go to office. This made me so tired that it was extremely hard to get motivated to do personal projects.\n\n Side Quests\n\nMaking music\n\nI recently discovered Groovepad and I really liked how easy it is to use that app and make music. As of this writing I made 3 tracks and I'm planning to put them up on Soundcloud and Spotify.\n\n Lessons Learned\n\nWith everything that happened in 2020 and so much time being spent indoors, it made me reflect on a lot things. I'm extremely grateful to have good health, family, career and friends. It has made me appreciate life more and gave me some perspective. It's easy to take things for granted and look the other way. But it takes a lot of strength and speaks to one's character to stand up for the right thing and fight for it.\n",
"tags": []
},
{
"uri": "/posts/2021-year-in-review",
"title": "2021 - Year in Review",
"content": "\nI've been doing this \"Year in Review\" for some time now and it helps me put things in perspective as to what I spent more time on, what I enjoyed, where I fell behind, etc. It's a great exercise to do regularly and check in with yourself. So, here are the usual sections - what went well, what didn't go well, side quests and lessons learned.\n\nWhat went well {what-went-well}\n\nDeleted WhatsApp {deleted-whatsapp}\n\nThis was another step in my journey of \"caring more about privacy\" and I also wrote a blog post about it. When WhatsApp introduced new terms and conditions to collect even more data than it already did, it motivated people to quit WhatsApp and move to Signal. I did too. I'm glad to not be part of all the groups with constant pings and I'm even more happy to be part of and in support of a product that actually cares about privacy.\n\nHome Automation {home-automation}\n\nI bought a home in early 2021 and I wanted to change everything to my liking. The rented apartments I lived in wouldn't let me change the switches or outlets (obviously) and owning a place gave me the freedom to turn my home into a smarthome. I used HomeAssistant as the hub with a USB stick that supports both ZWave and ZigBee protocols. I changed all the switches to smart switches that operate on ZWave, added a bunch of door sensors, motion sensors, time based automations, etc. Really enjoyed configuring and automating everything I could and I'm happy with the results.\n\nJournaling {journaling}\n\nI took journaling more seriously in 2021. My initial approach to journaling was about building consistency. And to achieve consistency, I came up with process, structure and templates so that I could make it more \"streamlined\". This led to journaling become a chore instead of an activity that needs to be performed mindfully. So, my journaling habit became more intentional and I was only doing it whenever I really wanted to write something down. This removed the stress of adding an entry every day. What I did force myself to do was to write weekly and monthly reviews which gave me good checkpoints on what went well, what didn't go well and such.\n\nBuilt my own emacs config from scratch {built-my-own-emacs-config-from-scratch}\n\nI've been using Emacs for about 1.5 years now and for the first year I used Doom Emacs which gave me pretty much everything I wanted. I hardly added anything extra in my config. But after watching SystemCrafters videos, I decided to roll my own and that was an amazing experience. I learned so much about Emacs in 3 weeks than I did in more than a year. Though laziness is what prevented me initially to create my own config, I'm glad I did it. I now know exactly what my emacs does and where to look and what to tweak. Since I made this a literate configuration, the whole config is documented and I've uploaded it on GitHub. This also made me create literate config for other applications like zsh, vim, etc.\n\nWhat didn't go well {what-didn-t-go-well}\n\nHealth {health}\n\nThis includes both diet and fitness. I had pretty bad lower back issues, and I had to stop working out and get some physical therapy. That took a few months after which I started doing yoga which helped me immensely. I knew good posture and exercise were important, but I never realized how important they were until I had these issues.\n\nMaking Notes {making-notes}\n\nI used to make notes a lot when I consumed information via blog posts, podcasts, books or YouTube. I've been fiddling with Obsidian for a while now, but never got the time to create a workflow to take notes in an effective way. There were technological constraints like the app not being available on the phone initially and then not being easy enough to sync the notes, etc. This is something I want to think more about.\n\nSide Quests {side-quests}\n\nPicked up guitar (again) {picked-up-guitar--again}\n\nI've been playing guitar on and off for many years and I've only played acoustic guitar. I wanted to try an electric guitar and I finally got one. I'm really enjoying it, especially with the Spark Amp which I highly recommend.\n\nCryptocurrency {cryptocurrency}\n\nI was not so much into cryptocurrencies and blockchain, but lately I got interested in them and started exploring the technological side of it. I've been consuming lot of videos and podcasts about cryptocurrencies and NFTs. It's been an interesting journey to say the least. I've been carving out time here and there to learn about it whenever I can.\n\nAwakening from the Meaning Crisis {awakening-from-the-meaning-crisis}\n\nThis is one of those serendipitous finds where one day I was checking the /r/InsightfulQuestions subreddit where one of the comments for a question (I don't even remember the question) was a mention of a lecture series on YouTube called Awakening from the Meaning Crisis. I've always been really interested in philosophy, anthropology, deep thoughts and thought experiments. So, just watching one episode of this got me hooked. Each episode is dense with information and it also makes you think a lot. I've been deeply enjoying this series and already made lot of notes and will continue to do so. I've also been taking it very slow and not binging on it because I want to give myself time to think and reflect on what I've consumed.\n\nLessons Learned {lessons-learned}\n\nNever neglect health {never-neglect-health}\n\nNaval Ravikant said \"Easy choices, hard life. Hard choices, easy life\", and it could not be more true. What I thought was maybe a couple of weeks of chilling - being lazy, ordering in, lying on the couch and watching YouTube ended up becoming a lifestyle. Easy choices made me put on weight, be out of shape and be slow and sluggish. Hard choices are to correct these and get back in shape. And this involves cooking at home most of the time, thinking about macros and being more conscious about what I consume, motivating myself to workout and be active. Getting back in shape is not linear. It's harder and takes longer to get back in shape.\n\nHaving few interests is better than having many {having-few-interests-is-better-than-having-many}\n\nI'm someone that's very curious about things and I easily get hooked on to learning new things. This isn't sustainable since my interests about stuff keep piling on and it either gets overwhelming or frustrating because I'm unable to give my attention to all of them. So, instead of having such varied interests, it's better to have just 2-3 things that you can go deep on and spend more time, and drop the rest. These handful of interests would be more fulfilling than trying to hit too many targets.\n",
"tags": []
},
{
"uri": "/posts/book-review-alchemist",
"content": "---\ncategories:\nbook-reviews\ndate: \"2016-01-09T00:00:00Z\"\naliases: [/book-reviews/book-review-alchemist]\ntags:\nbook\nreview\ntitle: 'Book Review: Alchemist'\n---\nAlchemist by Paulo Coelho is the first book I read in 2016. This book had been in my to-read list for quite a while now and I thought I'll give it a read. Also since it's a short book I felt I can get through the whole book in few hours.\n\nOverview\nThe book talks about one boy's journey in finding a hidden treasure which he sees in a recurrent dream. His pursuit of finding the treasure and how he goes against all odds in search of it is what makes this book an interesting read.\n\n Review\nI found this book quite inspiring. It starts off with a boy who is a shepherd has spent 2 years of his life traveling to different places and looking after his sheep and once gets a recurrent dream about finding treasure. He wants to pursue it no matter what because he thinks it's a sign from the universe since he got the exact same dream twice. So he travels to the Pyramids trying to look for the treasure and in the meanwhile meets a fortune teller, an old king, a crystal merchant,\n an alchemist and few other people. He tries to understand how the world interacts, how people who don't know the same language can still have a conversation and help each other and how everything is connected. He personifies pretty much everything from camels to desert, wind, sun, everything. There are times during the journey where he feels like giving up or sometimes feels like he has enough with him that he can call treasure. But he still moves on to search for it. Every person he\n meets, everything he observes around him teaches him something about life and how different people are.\n\nConclusion\n The key take away from this book is that one must follow their passion (or Personal Legend as it's called in this book). We will face many obstacles along the way for sure, we must not give up and keep working towards the goal of fulfilling our personal legend. Also, the journey of fulfilling our dreams may be filled with obstacles and roadblocks and in the end we may get disappointed looking at the reward as it may seem less compared to the effort we put in to get it. But\n what we forget is that the journey is the reward.\n\n Few things I didn't like about the book is the style of writing. It could have been better. Also, it gets a little weird towards the end where there's too much personification and the boy starts talking to the desert, the wind, the sun, etc. Some people may find a deeper meaning in all this, but it's just not my cup of tea. But apart from that the book is great and I recommend reading it.\n\n My rating: 4/5\n\n My Goodreads to-read list\n",
"tags": []
},
{
"uri": "/posts/clickbaits-are-here-to-stay",
"title": "Clickbaits are here to stay",
"content": "\nMore than a decade ago I came across BuzzFeed articles like \"10 things you didn't know about the Illuminati, number 7 will surprise you\" for the first time. At the time, I didn't even know they were called clickbait. This reminded me of the tabloids I saw near checkout lines in grocery stores. Every time I'd see one of those magazines, I used to think, \"This is beyond ridiculous. Who reads this stuff?\". In my mind, I used to categorize tabloids as the lowest form of \"news\" and just a desperate attempt to get peoples' attention to buy those magazines, and in my opinion that's still the case.\n\nBut when I started seeing more and more clickbaits online, I started becoming infuriated because now they were everywhere. I was seeing the equivalent of tabloid headlines in most of the websites I used to visit and it felt like there was no escaping them. I initially thought only sites like BuzzFeed and similar ones would be so desperate for attention and clicks, and real news sites wouldn't need clickbaits.\n\nI was wrong. I started seeing them even on websites like HackerNews or AndroidPolice. It was annoying me so much that I didn't click those links on purpose, even though I knew it had information that I was looking for. It was my way of \"vote with your clicks\". And then, it was all over YouTube too. The channels I subscribe to - Red Delta Project, Veritasium, etc. that have nothing to do with gossip or sensational news, but instead make educational content were also filled with titles that were very clickbait-y.\n\nI didn't like it, and I was hoping this was just a fad that would pass. I thought it would be one of those things where companies would jump on just to be part of whatever trend was going on and then drop it when it's no longer \"cool\". But at the back of my mind, I was thinking that clickbaits are only growing because they work. People click such links and clicks is what a service primarily measures (among other things) the popularity of its article.\n\nI recently saw a video on Veritasium titled Clickbait Is Unreasonably Effective. This hit home with me. If people tend to click on clickbait articles, then there will be more clickbait articles. This is one thing if a blog contains a bunch of such articles. But if a serivce like YouTube takes uploaded videos and ranks them, and happens to find clickbait-y videos perform better, it'll just rank those videos higher. And if I'm a YouTube content creator, and I want to stay in the game, I'd have to play the same game. As much as I hate clickbait, I'd still have to add a clickbait title, a clickbait thumbnail and a clickbait caption in the thumbnail. And not to forget a corny facial expression on the thumbnail.\n\nWhat I saw in the above video did put things into perspective as to why clickbait even exists and why everybody seems to be using it more and more. I still cringe when I see such titles. What scares me even more is, a lot of times any title I try to come up with for a blog post that I write, I start feeling like it's clickbait-y. I spend more time thinking about how to not make the title sound very clickbait-y. Or how to make the title sound as least clickbait-y as possible. Sometimes I fail. But I still try.\n\nI guess what I'm trying to say are two things:\n\nWhether anybody likes it or not, I think clickbaits will continue ot exist and thrive as long as clicks (or click-through rate) is used as one of the dominant metrics. That's just the world we live in now.\nI try my best to come up with titles that are not clickbait-sounding. I'd rather want the reader to not be interested to read my blogpost after looking at the headline than cringe hard at the headline.\n",
"tags": [
"clickbait"
]
},
{
"uri": "/posts/colored-kindle-highlights",
"title": "Colored Kindle Highlights",
"content": "\nA coworker of mine runs a bi-weekly tech book club where a bunch of people get together, read a couple of chapters of the ongoing tech book (like Clean Code) beforehand and discuss in the meeting how that can be applied in our existing codebase.\n\nSince he runs the meeting while sharing his screen, as he goes through the pages of the chapter, he shows his highlights that he thinks are good talking points for the meeting.\n\nI noticed that there were different colored highlights: blue, red and yellow. When asked about it, he mentioned that each color represents something:\n\nBlue: when he agrees with the author\nRed: when he disagrees with the author\nYellow: when he thinks he needs to do more research on that topic\n\nI think this convention is really good. This not only works for tech books, but also non-fiction. I'm certainly going to apply them going forward to all the tech and non-fiction books I read.\n",
"tags": []
},
{
"uri": "/posts/dont-break-the-chain-hard-mode",
"title": "Don't break the chain - hard mode",
"content": "\nThe basic concept of Don't Break The Chain is to do an activity every day so as to \"not break the chain\". This is a method that enforces consistency. This is helpful to make habits stick, provide visual feedback on the progress on a daily basis and motivates us to keep going.\n\nI came up with a slight modification to this method which I call \"Don't Break the Chain - hard mode\". This is how it works:\n\nYou start with one habit that you want to do every day and you start marking your calendar. For example, read a few pages in a book every day\nYou do this for a few days and keep marking the calendar. The chain starts getting longer and longer.\nNow you want to add another habit like \"Meditate for 10 minutes every day\". Instead of creating a new chain, you just continue the existing chain.\nKeep adding habits like these along the way while maintaining just one chain. If you miss any of the habits, the whole chain resets and you have to start over.\n\nThe nice thing about this is, for newer habits you get a \"headstart\" with a chain that's long enough already. But the flipside is, it's much harder to skip any of the habits you're tracking because it resets everything. So, it kind of is anxiety-inducing.\n\nI tried this once and I stacked about 4 habits over the course of 5-6 months and it worked surprisingly well. I want to try it again sometime soon.\n",
"tags": []
},
{
"uri": "/posts/exploring-helix-editor",
"title": "Exploring Helix Editor",
"content": "\nA few weeks ago, my coworker was talking about Helix Editor. I'm generally fascinated by CLI tools, so I decided to check it out.\n\nAs soon as I tried it I was super impressed with how many features were packed in it. Tree-Sitter, Language Servers, multiple selections and many more. I have been struggling the past few months to get a good IDE experience set up on Emacs and every time I try, it falls short by just a little bit and I end up switching back to VS Code. I remember doing tons of different customizations, trying out several packages and their individual settings just so that all those packages play along together very well. But it only got me to about 90% of what I like. I'd run into all kinds of weird issues every now and then and it would take my focus away from the task at hand.\n\nHelix on the other hand required almost zero config. Pretty much every single default it came with was intuitive. It supports so many languages, and with tree-sitter integration things are a lot smoother and faster while editing code. But the thing I was most impressed with was the speed. I've never seen that level of speed and responsiveness from any editor. Not Emacs, not VSCode, definitely not IntelliJ. I tried opening a few random projects and tried editing the code a little bit and the experience was awesome. Everything, from auto-complete to opening overlay menus, filtering files from a list of hundreds, even narrowing down commands from the command palette was very smooth.\n\nHelix also deviates from vim and has its own keybindings (inspired by Kakoune). Being a long time vim user, I hated them at first, but then I really understood why things are done differently and I totally agree with it. Vim has a \"do first, select later\" kind of navigation which is not super efficient. With vim you first specify that you want to change or delete something and then you specify what you want to do the operation on. For example, c2w will delete the next two words from the cursor's position and change the cursor to insert mode. If you go wrong in specifying how many words (in this instance), you'll have to undo and start over. Helix follows a \"select first, do later\" approach which is great. Once you're happy with the selection, you can do whatever you want with it. To do the above operation in Helix, I'd have to do v2wc. There's one more keystroke here, but it's a lot more intuitive and I make fewer mistakes.\n\nThere were a couple of things I really wanted in Helix - a tab bar so that I can see the open files (this was recently added and is now available), a tree explorer as a sidebar or an overlay (this was recently merged and should be available soon), and a way to automatically reload a file if that file was changed outside of Helix.\n\nI've really been enjoying Helix. I love the thriving community and the effort that goes into fixing bugs and adding features. I'm still learning the keybindings and how to efficiently navigate in the file. I'd recommend it to everyone to at least give it a try.\n",
"tags": []
},
{
"uri": "/posts/exporting-google-photos",
"content": "---\ntitle: \"Exporting Google Photos\"\ndate: 2021-01-02T15:17:57-08:00\ntags:\ngoogle\nphotos\nexport\n---\n\nI recently purchased a Synology NAS and I started hosting a media server containing movies, TV shows and photos. I had stored all my photos in Google Photos for the past several years. But recently Google announced that it was going to charge for storing photos as they near the storage limit of 15GB. I knew of Google Takeout and I downloaded some 44 GB of photos which were packed in about 23 zip files.\n\nI found that these zip files had lot of repetitive files, seemed like a lot of duplicates. I ended up extracting all of them to a single folder. And, I saw a lot of json files mixed in. When I searched online, I found couple of tools to get rid of them: Metadata Fixer and Google Photos Takeout Helper. These didn't work well and I thought of writing my own tool to do the job for me.\n\nI later came across a Reddit post where somebody posted an alternative for exporting Google Photos. The alternative is basically to select all the photos per year and download them via UI. This will not give us any json files. It just downloads the photos as is. This was perfect and worked for me.\n",
"tags": []
},
{
"uri": "/posts/graduation",
"content": "---\ncategories:\ngraduation\ncomments: true\ndate: \"2014-05-10T00:00:00Z\"\naliases: [/graduation/graduation]\ntags:\ngraduation\ntitle: Graduated :)\n---\n\nToday I graduated with Masters in Computer Science from University of Illinois at Chicago. It's been about two years since I came to this country and I had some really nice experiences working with my project mates, doing my internship, attending meetups and hackathons, spending sleepless nights working on projects and assignments while surviving on pizza, and sometimes coffee. Two years went by really fast. It feels like just yesterday I landed here. Done with college and now\nI'm going into a much more challenging phase of my life where I get to learn and innovate everyday. Will try my best to keep working on my hobby projects as and when I get time.",
"tags": []
},
{
"uri": "/posts/hello-world",
"content": "---\ndate: \"2013-11-08T00:00:00Z\"\ndescription: Just a little hello world post\ntags:\nhello\nworld\ntitle: Hello World\n---\n\nAfter being lazy as a sloth for a “really long” time, I finally pushed myself to create a blog where I can write/share about projects I work on in my free time and also about the technologies/tools that I encounter every now and then. I was basically inspired by this post by Matt Swanson since I face a similar situation while working on my side projects, wherein I work on many projects but none of them see completion. I was also drawn towards this blog post by Nathan LeClaire about committing code every day and blogging about it every week which is kinda similar to what Matt says. In Matt's own words,\n\n The basic idea is to set aside time each weekend to plan out what project you are going to work on during the coming week. Then, after the week is over, you reflect on what progress you made with a blog post and then write out next week’s plan. Rinse and repeat.\n\nI thought this is a good way to keep track of what I do (and not be a couch potato spending hours watching funny videos on YouTube), and at the same time, share with others the issues I encounter while working on a project and how I happen to solve them. So I’ll be starting a \"Weekly Noise\" series (similar to what is explained in the link above) and try my best to update it regularly.\n",
"tags": []
},
{
"uri": "/posts/i-enjoy-doing-boring-repetitive-mundane-tasks",
"title": "I enjoy doing boring, repetitive, mundane tasks",
"content": "\nThe title of this post seems kinda oxymoronic. Enjoyment and boredom seem to be opposites, so to speak. If we're bored, that means we're not stimulated and that means we're not enjoying whatever it is we're doing (or not doing).\n\nMost people I know hate doing mundane repetitive tasks or chores like cleaning, folding clothes, etc. I particularly like them. Not because I enjoy doing them. But because that's where a lot of my thoughts and ideas form connections. I've had a lot of epiphanies and aha moments during these times.\n\nFor the longest time, I didn't connect the dots of what motivated me to actually do \"boring and repetitive\" chores. I just did them. And when there was a choice between who in the household wanted to do the boring repetitive task, I always stepped up. After a while, I started viewing that as a negative since I thought seeking to do such boring chores meant I rather prefer doing those tasks than doing something more creative and stimulating. And that somehow by doing so, I was underachieving.\n\nHowever, I later realized that my mind starts wandering and inevitably starts thinking about things I read recently, a situation that happened to me recently or a recent conversation I had. A lot of times, my mind wanders into a problem at work I'd be struggling to solve. And amidst the cleaning or doing the dishes, or folding clothes, I'd suddenly find answers. This has happened so many times that I started enjoying such tasks. The main reason being, it gives my mind a break from the distraction in front of me.\n\nI constantly jump from one task to the next. Sometimes I try to multi-task, and fail miserably. I'd be working on some piece of code at the end of my workday and as soon as I'm done, I'd go to the living room to watch some TV, or play a game, or read a book, or check Reddit. Once I'm done with that task, I'd switch to another one immediately. I don't take breaks in between. I just keep hopping. This keeps my mind occupied and it's always in consumption mode. My mind never gets a break, it never gets some rest to process what it consumed. It continuously consumes.\n\nDoing chores forces our mind to disconnect from distractions and just do something \"mindlessly\". Those tasks are so \"boring\" that the brain is not required to apply logic, creativity, critical thinking or any of that. It is now free and this is when it starts to process what it consumed earlier. Connections are made, epiphanies are had, magic happens. These are the kind of feelings I long for. That moment when you figure something out. When you spend a lot of time and struggle to understand a concept, and then it finally hits you and everything makes sense. That's extremely satisfying.\n\nIf you think about it, it's a win-win-win.\n\nWin 1: you actually finish the chore. So the dishes are now clean, or the clothes are folded. Thanks to you.\nWin 2: you had epiphanies, made connections, formed ideas, cultivated opinions. You grew.\nWin 3: you actually enjoyed doing something that's very mundane. We seek satisfaction in what we do and what we did here is take something that most people don't find any satisfaction doing, and turned it into a superpower.\n\nSo, yeah. Just because a task is boring, doesn't mean that it's not worth doing. You can get a lot out of it and make your day-to-day experiences enjoyable.",
"tags": []
},
{
"uri": "/posts/ideas-need-sufficient-baketime",
"content": "---\ntitle: \"Ideas Need Sufficient Baketime\"\ndate: 2021-01-05T17:10:14-08:00\ntags:\nideas\nbaketime\nlearning\n---\n\nI've always been curious about learning new things. I've always consumed new information with great enthusiasm. I'd read book after book, blog post after blog post and listen to lot of podcasts and audiobooks. What ended up happening was I'd never really reflect on what I've read. So, after some time I'd have no recollection of the contents of any book. I used to be under the impression that the more I read, the more I learn and I was checking books off my list. Then I thought reading should really be about grasping the essence instead of trying to remember the nitty gritty details the author talks about in any book. All of this led to me passively consume information without giving any time for myself to reflect on what I've read.\n\nDon't passively consume information\nThis is the mistake I made while I used to read a lot of books. When I get a book recommendation via one of the many sources - friends, blogposts, podcasts, goodreads, etc., I'd keep adding them to my to-read list on Goodreads. Then, I'd either get the audiobook or I'd get the Kindle ebook. And, I'd just read them one after another. I'd thoroughly enjoy reading them and while I'm doing that I'd feel like I'm learning something.\n\nWhat happened later was that, when I'll be talking to a friend I'd say something like,\n My friend: \\Talking about their experience with crows being a team and using a diversion tactic to take his fries one day\\ \n Me: \"Hey, that reminds me, I read a book called Selfish Gene that explains the altruistic nature of crows. Richard Dawkins says in that book that crows are... um...\". \n\\*Silence\\*\n\nI just couldn't explain it, because I retained almost nothing from that book. I kind of sort of know about the altruistic nature of crows, but I just couldn't succinctly put it across. It infuriated me and I always wondered where I'm going wrong.\n\nI listened to a podcast few months ago where Derek Sivers was interviewed where he said\n\"Learning doesn't happen when you read, it happens when you reflect on what you've read\".\n\nThis quote hit home with me. It made so much sense and I felt I wasted a lot of time just consuming information without really \"consuming information\". Whatever I was reading was just useless.\n\n Ideas need baketime\nI changed my reading style from reading too much back to back, to reading little with breaks in between. Sometimes I'd read just a couple of pages and reflect on it for a few hours or a few days. The difference is night and day. Now it's no longer about remembering the little details of whatever I read, but it's about making connections between the different ideas I have in my mental model.\n\nWhere I found this to be most valuable is when I would do something that doesn't require a lot of thought - like cooking, working out without headphones, cleaning my apartment, going for a run, that's when I'd relect on whatever information I consumed and make connections. I've had several \"Aha!\" moments where I fit pieces together and develop a much better understanding.\n\nIn my opinion, the kind of reading for which you just have to grasp the essence is something that doesn't require you to understand an idea deeply, make connections and possibly apply it to your life. An example of this would be reading the newspaper. You don't have to understand deeply what happened in politics the previous day and reflect on them. However, when it comes to reading a book with lot of useful information, it becomes really valuable to understand the fundamentals. Reflecting upon ideas becomes one of the best tools in the box for succeeding in the learning process.\n",
"tags": []
},
{
"uri": "/posts/it-depends",
"title": "It depends…",
"content": "\nLast year I went to physical therapy because I had severe lower back pain. It turned out the pain was mostly because of bad posture. As I was visiting the physical therapy place regularly, I started describing to the therapist how I sit on the couch, how I sit at a table and what my overall posture is during these times.\n\nI would ask questions like \"I sit with my back straight at my desk, and for my legs I use a soft foot stool. Does that help with the posture\". And he'd say, \"Well, it depends...\"\nThen I would ask a question like, \"I sometimes sit cross-legged on the sofa and I find that to be very comfortable. Would this affect my back in the long run?\". He'd again say, \"Well, it depends...\"\n\nPretty much all his answers started with \"it depends...\" and then a caveat. At first I was annoyed that I never got direct answers and I hated any answer that started with \"it depends...\".\n\nI later realized that I just wasn't asking the right questions. Most of the time, the answers to many questions are not straight-forward, so it's hard to get concrete answers. Take losing weight, for example. Asking questions like \"Can I do X to lose weight?\" will never get you a clear cut answer, because there are so many variables involved - like food, portions, exercise, sleep, stress, and many other factors. This is why there's a plethora of information out there and people generally feel overwhelmed by it all. Our brains don't deal very well with overwhelming amount of information. So, it tries to look for shortcuts and simple explanations. We also get into this habit of looking for specific information without understanding the overall picture. And many times, given the overall picture, the answer we get may not be the right one.\n\nBack to my story, I realized I wasn't asking good questions and I was also taking similar mental shortcuts. What I should have asked was questions like, \"what muscles get worked while sitting?\", \"what's the best way to strengthen those muscles?\", \"how do muscles perform while being sedentary vs. while doing a physical activity?\". These and may be few other questions would have helped me get closer to the answer I was looking for.\n\nWhat I learned from this experience was to keep an eye out for answers that start with \"It depends...\". That's a good signal that my question must be refined and that may be I should approach it in a different way.",
"tags": []
},
{
"uri": "/posts/mac-users-must-swap-caps-lock-and-ctrl-keys",
"content": "---\ncategories:\nrants\ncomments: true\ndate: \"2015-03-14T00:00:00Z\"\naliases: [/rants/macbook-users-must-swap-caps-lock-and-ctrl-keys-seriously]\ntags:\nmacbook\nrants\ntitle: Macbook users must swap Caps Lock and Ctrl Keys. Seriously!\n---\nI tell this to everyone I meet who uses a MacBook. I mean, come on. People who are used to using a Windows keyboard put their pinky on the bottom left key of the keyboard to reach for the control key, and it's easy to reach too since the Ctrl key is pretty wide. But geniuses at Apple decided to use that key as the function key thus making us twist our wrists more so that our pinky can reach the control key. It's so damn uncomfortable to do that all the time. But thankfully, Mac OSX has the feature to switch modifier keys. You can basically make any modifier key (Ctrl, Shift, Alt, Caps Lock) to behave as any other modifier key. And we use Ctrl more than Caps Lock; mainly programmers. Moreover I've seen so many people holding Shift to type out phrases in caps where they could have used Caps Lock key once and comfortably typed out the phrase (without holding Shift the whole time). So to fix all this and type comfortably, just swap Caps Lock and Ctrl and live in peace.\n",
"tags": []
},
{
"uri": "/posts/moving-to-hugo",
"content": "---\ntitle: \"Moving to Hugo\"\ndate: 2020-06-25T17:43:30-07:00\ntags: \n100DaysToOffload\n---\nI've used Jekyll as a static site generator ever since I created this blog, which was in 2013. Before that, I had tried few other blogging platforms. Over the past few years when I irregularly updated my blog, I faced some friction with Jekyll. Every time I tried to make a new post and push to GitHub, Jekyll would complain about something that's either deprecated or broken. And, I had to go fix that first and then make a blog post and push it. That was a minor annoyance mostly due to the fact that I hardly touched my blog and things got outdated. But what annoyed me more than anything is the slowness of Jekyll to build the site and start the server. It was taking a good 10 seconds for it to build the entire site (which consisted of less than 30 files) and serve it on localhost.\n\nOn the other hand, in the last few months I have been tinkering with few Raspberry Pis and started self-hosting few things. I'm not done self-hosting everything I wanted, so there will be more playing around and more learnings that come out of it. This gives me a good opportunity to write about what I learned during the process so that people (including myself) can benefit from it.\n\nAnd finally, I recently stumbled upon the IndieWeb movement when I was checking out few Mastodon instances and I got super intrigued about it. There was good enough support for Hugo in the IndieWeb community. More details about what got me into IndieWeb movement in an other post. I'll also probably create a separate post about how I added IndieWeb support to my blog.\n\nSo, I decided to switch the static site generator to something better. I looked around, tried a few and finally settled on Hugo for two main reasons - it's fast and it has good community support.\n\nSince the switch, I've tweaked the theme to suit my needs, and added few specific pages that I think are important. Let's see where this takes me.\n",
"tags": []
},
{
"uri": "/posts/my-beorg-to-blog-workflow",
"title": "My beorg to blog workflow",
"content": "\nspan class=\"underline\"Note/span: Most part of this blog post was written using the workflow described below.\n\nAlright. This needs some explaining and prerequisites.\n\nI'm a heavy emacs user. I use it for a ton of things, one of them is to maintain and update my blog, which is a static site generated by Hugo. There is already a great package called ox-hugo which helps with blogging maintenance and workflows for Hugo-generated blogs.\n\nMy emacs workflows involve adding tasks, writing down ideas, updating my journal, etc. Beorg is a great app for iPhone that syncs well with org files either via Dropbox (which is what I use for syncing) or by other means.\n\nTypically I don't use Beorg on my phone for adding/updating blog posts. But when I do get ideas for a blog post, I use Beorg since that's my main driver. Most of the time I just write down the outline of the blog post on my phone using Beorg, and add the rest like links, images, etc on my computer. But sometimes, I'll be in the flow and end up writing an entire blog post on my phone.\n\nWhat I mention below may seem a little overwhelming for someone that doesn't use emacs, so read with caution.\n\nThe workflow {the-workflow}\n\nSo here's my workflow.\n\nI get an idea for a blog post and I quickly capture it. There's a capture template I've set up on beorg, that goes to a specific location with appropriate properties set.\nOnce I capture the idea, I make whatever modifications are needed to polish it.\nWhenever I hop on to the computer, I go to the blog post I just created and run a function I wrote to generate the export filename for the post. As soon as I hit save, the post will be formatted to Hugo standards and will be exported to the right location.\nI run the Hugo server to quickly check if everything looks good.\nI run the deploy.sh script to commit the code in the blog directory, commit the generated files in the GitHub pages directory and push both of them. That's it.\n\nCode snippets to make everything work {code-snippets-to-make-everything-work}\n\nHere are some of the code snippets that are used for different part of the workflow.\n\nBeorg capture {beorg-capture}\n\nBelow is the screenshot. The subtree can be configured in any way one sees fit.\n\nGenerating Hugo post filename {generating-hugo-post-filename}\n\nThis is a code snippet that is required for generating the filename for the blog post. This function parses the post title and creates a filename that ends with a '.md' extension.\n\n\t(defun rr/extract-hugo-post-file-name ()\n\t\t\"Create a filename out of blog post's title.\n\nThis method is expected to be executed on a TODO heading on a an\norg file containing blog posts that would be exported using\nox-hugo. Running this interactive command would set an org\nproperty called EXPORTFILENAME that is required by ox-hugo to\ngenerate a Hugo-friendly markdown file in the location specified\nin HUGOBASEDIR property.\"\n\t\t(interactive)\n\t\t(setq-local title-line (thing-at-point 'line t))\n\t\t(unless (not (string-match \"TODO \" title-line))\n\t\t\t(let* ((lines (split-string title-line \"TODO \"))\n\t\t\t\t\t\t (blog-post-title (nth 1 lines))\n\t\t\t\t\t\t (file-name (replace-regexp-in-string \"+\" \"-\" (replace-regexp-in-string \"\\\\W\" \"\" (string-trim (downcase blog-post-title)))))\n\t\t\t\t\t\t (blog-post-file-name (concat file-name \".md\")))\n\t\t\t\t(org-set-property \"EXPORTFILENAME\" blog-post-file-name))))\n\nThis is an interactive function and I run it by hitting M-x.\n\nTurn on auto-export-mode when I visit blog.org {turn-on-auto-export-mode-when-i-visit-blog-dot-org}\n\nAll my blog posts are saved in an org file called blog.org. Whenever I open this file, org-hugo-auto-export-mode is turned on.\n\nThe minor mode org-hugo-auto-export-mode enables auto export hugo posts on saving. However, this minor mode is disabled by default. It doesn't make sense to have this turned on globally. So, the following piece of code enables the minor mode only when the buffer is blog.org.\nFound the code in a stack overflow post.\n\n(defun rr/enable-hugo-auto-export-mode ()\n\t(if (equal (buffer-name) \"blog.org\")\n\t\t\t(org-hugo-auto-export-mode)))\n\n(add-hook 'find-file-hook 'rr/enable-hugo-auto-export-mode)\n\nWith this mode enabled, every time I hit save, any edited post gets exported to a Hugo-compatible markdown and saved to the right location specified in both the header of the file as well as the EXPORTFILENAME property.\n\ndeploy.sh script {deploy-dot-sh-script}\n\nOnce the post is ready to be published, the blog post must be committed to the current repository and pushed. Since I'm also hosting the blog on GitHub using GitHub Pages, there's an additional repository to which I have to copy the public directory generated in this code repository. Then those files must be committed and pushed as well. All of this is done using script called deploy.sh that needs to be run once. Here's the script.\n\n!/bin/sh\n\n If a command fails then the deploy stops\nset -e\n\nprintf \"\\033[0;32mDeploying updates to GitHub...\\033[0m\\n\"\n\nBuild the project.\nhugo -t ezhil if using a theme, replace with hugo -t YOURTHEME\n\ngit push committed changes in existing folder\ngit push origin master\n\n Copy public folder to the repo outside the submodule\nThe issue is, submodule does not get updated when running this script either because of incorrect setup\n or maybe because public is part of gitignore and the remote points to blog.git instead of rrajath.github.io.git.\nIn order to make this script work properly, the public folder that is generated is copied to the repo outside\n this folder and then committed and pushed\ncp -r public/* ../rrajath.github.io\n\nGo To Public folder\ncd ../rrajath.github.io\n\n Add changes to git.\ngit add -A\n\nCommit changes.\nmsg=\"rebuilding site $(date)\"\nif [ -n \"$*\" ]; then\n\tmsg=\"$*\"\nfi\ngit commit -m \"$msg\"\n\n Push source and build repos.\ngit push origin master\n\nConclusion {conclusion}\n\nThis seems like a lot of work, but it's not. All of this works beautifully and it's a one-time setup. The satisfaction of coming up with a system that is tailored to work exactly to my needs feels great.\n\nAlso, workflows are hard to explain using text or in a blog post. There are quite a lot of moving parts and different parts of the workflow need different pre-requisites. When all of them are aligned, it works smoothly.",
"tags": []
},
{
"uri": "/posts/my-experience-with-emacs-so-far",
"title": "My experience with Emacs so far",
"content": "\nI've been a vim user for about 15 years and loved every aspect of it. I'm nowhere close to the vim wizards I've seen on YouTube nor some of my coworkers who spend most part of their day writing shell scripts in vim. But among my friends and my team, I was considered a power-user. I used a lot of plugins to get things done much easily, I had my shortcuts that my friends found fascinated by and some of them were kind of amazed that I would do a code walkthrough jumping from function to function and file to file using just vim where most of them were going to their IDEs to do that.\n\nBut that's about it. My vim usage was just for making quick edits to code (larger edits meant opening up an IDE), editing shell scripts and viewing files quickly. I had to use a different tool for managing my tasks, journaling, saving links, etc.\n\nUsing Notion {using-notion}\n\nI came across Notion and I fell in love with how great it looked and how customizable it was. A lot of them were drag and drop, all the saved links had thumbnails, I could write comments, it was great for task management - I could set up dates and deadlines and get notifications accordingly, templates were great (I came up with my own journaling template since I used bullet journaling), tables were awesome and I could create different views. I used it for couple of years and I thoroughly enjoyed it.\n\nDownsides of Notion {downsides-of-notion}\n\nThere were couple of downsides with my Notion setup.\n\nThere was no offline support (at least at that time when I was using it). My notes were stored somewhere else and I needed internet to access it every time. This means, I couldn't use it at work.\nMy notes were in a format that I couldn't control. If I didn't like Notion some time in the future, I couldn't just export it to a different note taking app. I should either wait for the other app to add support to import Notion docs into it or export each and every note I had to markdown and then find a way to deal with it.\n\nThere were other downsides to Notion depending on the usage, but these were the ones I was affected by the most. I wanted a note taking system that would stand the test of time, something that was preferably open source, one where I had control of my notes, offline supported, customizable.\n\nAs I was searching for alternatives, I saw several HackerNews posts about note-taking, I kept seeing emacs (and specifically org-mode) pop up everywhere and every single person had only postive things to say about it.\n\nMy first introduction to Emacs (spacemacs) {my-first-introduction-to-emacs--spacemacs}\n\nA couple of years ago I was talking to a coworker of mine about vim and he said he uses emacs. Until then, nobody I met talked about emacs. With all the HN posts I read before, I was curious to try it and asked him where do I start. He said, use spacemacs. So, I did.\n\nI liked some parts of spacemacs, especially org-mode. I got pretty excited and I started using it as my daily driver, but after using it for a couple of weeks I gave up. I found spacemacs to be very clunky and slow. I didn't like the UI very much, and frankly, I didn't know how customizable emacs was at the time. Spacemacs had something called layers that I could enable. Elisp was so foreign to me that I didn't bother customizing anything because I had to learn a new language just to customize what I use and the amount of parenthesis threw me off.\n\nDoom Emacs {doom-emacs}\n\nAbout a year ago, I heard about Doom Emacs, I think in one of the emacs subreddits. I was intrigued again and I installed it. This time I was immediately hooked. The UI was better, the application was faster, configuration was easier, what I got out of the box with Doom Emacs was perfect for me. Everything felt intuitive and I started using it more and more. I developed my own workflows to organize my tasks, take meeting notes and journal.\n\nI liked the fact that I was able to easily toggle things on and off in the config, and I didn't really need to know Elisp to make any changes mainly because I got everything I needed out of the box anyway. I was using Android at the time and Orgzly was a good app for managing orgmode files as well.\n\nI was happy with the setup I had and like I mentioned before, I used it mainly for taking notes, organizing my tasks and journaling. Very minimal configuration and package setup. I honestly didn't really understand how everything fit together, how packages worked, how things can be customized by setting variables, or anything. But it worked for me, for the most part and I went with it.\n\nMy Custom Configuration {my-custom-configuration}\n\nI've been following System Crafters youtube channel for a few months and I wanted to check out the Emacs from Scratch series. For the longest time, I used to think building an emacs config from scratch is a complete waste of time when we already have something like Doom Emacs which gives us most of the things we need.\n\nBut I was wrong. About 3 weeks ago, I decided to give it a shot, followed the series and started building my own config. The amount of learning I had in the last 3 weeks is far greater than what I've learned ever since I started using Emacs. I learned so much about Emacs that I have a deep appreciation for it now. In 3 weeks I came up with a config that is a 1000+ lines long. Every day I tweak my config and make something better. I keep looking forward to using Emacs all the time.\n\nThe fact that I could literally look at what a specific keybinding does, which function gets invoked when I hit the keybinding, what the implemntation of that function is and basically change it to do what I want was so mind-boggling to me. I felt a sense of freedom where I could change Emacs to literally do whatever I want and behave exactly the way I want it. No other editor even comes close to this level of customizability and that's what excited me.\n\nEvery customization I was doing involved Elisp in some capacity that each such change was a new learning opportunity for me. So, with each change, my Emacs got better and I learned Elisp, which is like a win-win. As soon as I started this journey, so many doors opened up for me and I found opportunities to use Emacs for something more than just journaling and taking notes.\n\nI now use it as a file manager, terminal, taking notes, organizing my life, journaling, git client, a fully functional IDE with code completions and such, manage my work calendar, quick file edits, viewing and querying json files and blogging. This very post was written in Emacs and published using ox-hugo - a package used for exporting org files to markdown files that Hugo understands.\n\nObligatory XKCD comic about emacs {obligatory-xkcd-comic-about-emacs}\n\nNow that I've said all this about emacs, I have to use the obligatory xkcd comic about emacs:\n\n{{ figure src=\"/images/xkcdemacs.png\" link=\"/images/xkcdemacs.png\" }}\n\nConclusion {conclusion}\n\nIf you have never tried Emacs before, I highly recommend you try it. It has a steep learning curve, but it's totally worth it. The more you learn about it, the more appreciation you'd have. If you're an absolute beginner, Doom Emacs is a great place to start. However, once you have familiarized yourself with Emacs via Doom Emacs, I encourage you to build your own config. This would ensure you'll know exactly what's going on in your config and it's compeltely in your control. Your emacs will be truly personalized to your liking.\n",
"tags": []
},
{
"uri": "/posts/my-hugo-setup-part-2",
"content": "---\ntitle: \"My Hugo Setup Part 2\"\ndate: 2020-07-05T22:16:04-07:00\nseries: [\"hugo-setup\"]\ntags:\nhugo\n100DaysToOffload\n---\nIn my previous post, I explained all the visual tweaks I did to my Hugo blog theme so that I could get the pages I wanted in the format I liked the most. This post explains the publish part of it because I faced some issues doing that.\n\nI was used to Jekyll's way of doing things where it's just one repository on GitHub and all I had to do was git push and the blog would show up after about a minute. This means the repository contained both source and generated files. However, Hugo does things a little differently and I actually like it. There are several ways to deploy your Hugo website - using GitHub pages, GitLab, Netlify, etc. I chose GitHub pages since that's what I'm most familiar with.\n\nIf you are going with GitHub's User or Organization Pages, Hugo's recommendation is to split the source and generated files into two different repositories. The repository that the generated files go to will be the front for the website. Let me explain what I did in a little more detail.\n\nStep 1: Create a GitHub repository. I called mine \"blog\"\n\nStep 2: Create another GitHub repository called username.github.io. Mine is rrajath.github.io\n\nStep 3: Do a git clone of the \"blog\" repository you created on GitHub.\n\nStep 4: Copy over your Hugo website on your local to the \"blog\" directory that you just cloned.\n\nStep 5: Add a submodule using the command: git submodule add -b master https://github.com/username/username.github.io public. This creates a git submodule that points to the public directory in your Hugo website.\n\nStep 5 is where I encountered the issue. The idea is to point the public in your \"blog\" directory to a remote on GitHub by making it a submodule. The folder public contains all the generated files. Once you create a post and run hugo server to generate all the files, you have to do a git push on both the \"blog\" directory and the \"public\" directory (which is a submodule pointing to username.github.io repo on GitHub). And having the public directory as part of the .gitignore will exclude it from pushing its contents to the \"blog\" directory which is supposed to only contain the source files.\n\nHowever, this was not happening. I tried reconfiguring the submodules, changing my .gitignore file and doing several other things, but what was generated by Hugo in the public directory never got pushed to the remote repo; which means, my site never got updated even though I was updated the source files and things were working fine when I ran it on localhost.\n\nThe way I solved this is by cloning the username.github.io repo to outside the \"blog\" directory. Then changing the script deploy.sh mentioned in the documentation to copy all the files from public directory into the cloned directory, then committing and pushing the changes. The public directory now doesn't point to anything in the remote. Though this is slightly round about, it does the job and fixed my issue. It's also a one time setup and I don't have to touch it again.\n\nAll I do when I create a new post is, do a git add and a git commit. Then run deploy.sh to copy the generated files to the right repository (username.github.io) and then do a git push on the \"blog\" directory to push the source files.\n",
"tags": []
},
{
"uri": "/posts/my-hugo-setup-part-3",
"content": "---\ntitle: \"My Hugo Setup Part 3\"\ndate: 2020-07-08T21:03:07-07:00\nseries: [\"hugo-setup\"]\ntags:\nhugo\n100DaysToOffload\n---\nThis is the third installment of my Hugo Setup. In this post I explain how I added support for \"series\" in my blog and also provide links that can be used for further explorations.\n\nAlso, this post is part of a \"series\" and explains about how to setup \"series\". This is so meta!\n\nWhat is Series?\n\nSometimes, we have a bunch of blog posts that are related and maybe continuous. Breaking down one big topic into multiple blog posts is the best way to explain the topic. This is where Series adds value. Series also helps keep track of where one is in the list of posts and can easily navigate to posts before or after the current post. This post has nothing to do with writing something differently, but rather presenting mutliple related posts in a more intuitive way.\n\n How is it different from adding tags?\n\nTags are useful for categorizing similar topics. For example, there may be bunch of posts under the tag \"productivity\", but they may all be stand-alone posts that can be read in any order. Whereas, having posts that need continuity will need something a little more sophisticated than tags.\n\nImplementation\n\nI was deciding to implement this in my templates, but before doing that I searched around for easy, already existing implementations, and I did find some help in the Hugo community. I came across a Hugo forum post where a user had a similar ask. The link in the answer had everything I needed to add the \"series\" support for my blog.\n\nHugo supports Taxonomies where you can configure custom taxonomies and can be used everywhere on your blog. The first step is to add the series taxonomy in your config.toml file\n\n Step 1\n\nconfig.toml\n\n[taxonomies]\n\ttag = \"tags\"\n\tseries = \"series\"\n\nIf you have a yaml file, change the syntax accordingly.\n\nStep 2\n\nCreate a partial called serieslinks.html at /layouts/partials/serieslinks.html\n\nThis will contain the code that is responsible for displaying links to other posts in the series.\n\n/layouts/partials/series\\_links.html\n\n{{ if .Params.series }}\n {{ $name := index .Params.series 0 }}\n hr/\n Other posts in this series:/p\n\n {{ $name := $name | urlize }}\n {{ $series := index .Site.Taxonomies.series $name }}\n ul class=\"series\"\n {{ range $series.Pages }}\n li{{ .Date.Format \"Jan 02, 2006\" }} -\n a href=\"{{.Permalink}}\"{{ .LinkTitle }}/a/li\n {{ end }}\n /ul\n{{ end }}\n\nI got the above code from: https://npf.io/2014/08/making-it-a-series/\n\nThe explanation of what this means is explained better there, so I'm not going to reiterate the same thing here. \n\n Step 3\n\nGo to your single.html which is the template that renders each of your blog posts. \nReplace {{ .Content }} with the code below\n\n/layouts/\\_default/single.html\n\ndiv class=\"markdown\"\n\t\t\t{{ if .Params.series }}\n \t\t\t\t{{ $name := index .Params.series 0 }}\n \t\t\t\tp class=\"seriestoppage\" style=\"font-weight:50; background-color:#333\"iThis post is part of the a href=\"{{.Site.BaseURL}}/series/{{$name | urlize}}\"{{$name}}/a series./i/p\n\t\t\t{{ end }}\n\t\t\t{{ .Content }}\n\t\t\t{{ partial \"series_links.html\" . }}\n/div\n\nWhat this does is, before your main content it displays a banner stating that the post is part of a series (this banner doesn't appear otherwise). This tells the reader right of the bat that there are more related posts they can check out and read. You can look at the banner at the top of this post to see what it looks like. All of this is done by the code that comes before the {{ .Content }}\n\nThe code that comes after content, i.e. {{ partial \"serieslinks.html\" . }} simply calls the serieslinks.html partial we created in step 2 and injects it here, right after your post's main content.\n\nStep 4\n\nNow for the final step, you'll have to add front matter to your posts - the ones you want to make part of the series. That will look something like this:\n\n---\ntitle: \"My Hugo Setup\"\n...\nseries: [\"hugo-setup\"]\ntags:\ntag1\ntag2\n---\n\n Other Explorations\n\nI found an implementation which added fancier links to posts in series, like keeping track of how many posts are in the series, adding next and previous links, etc. I had some trouble with that and I didn't have the patience to debug and set it up. This piece of code got the job done for me. But feel free to explore that and tweak it to your needs.\nI also stumbled upon another implementation which did something similar. It's worth checking that out.\n",
"tags": []
},
{
"uri": "/posts/my-hugo-setup",
"content": "---\ntitle: \"My Hugo Setup\"\ndate: 2020-06-29T22:32:42-07:00\nseries: [\"hugo-setup\"]\ntags: [hugo, 100DaysToOffload]\n---\nI recently moved my blog to Hugo and wrote a brief post about it. This post explains how I selected a theme and how I made the modifications I needed.\n\nI needed a minimal theme for my blog and after searching a bit, I found ezhil. This checked most of my boxes:\n\nlooks simple and minimal\nconfigurable\nfeather icons for my socials\nlight/dark theme switch (nice to have)\n\nI tried it out on my blog and it looked good. The nice thing about the light/dark theme switch is that when set to \"auto\" it depends on the device's light or dark theme. For example, if the phone uses dark mode, the blog also uses dark mode.\n\nCustom changes to my theme\n\nAlthough I liked the theme and it fit most of my needs, I had to make some changes to get tailored to my taste.\n\n Post links and summaries on home page\n\nThe recent posts section (on the home page) was of the format:\n\npost_title -- summary\n\nThis felt a little cluttered for two reasons:\n\nBoth the title and the summary were on the same line next to each other\nTitle and summary were of the same font size\n\nI wanted the title to be a little bigger and have its own line, so I made the following changes to themes/ezhil/layouts/index.html:\n\na class=\"title u-url\" href=\"{{ .RelPermalink }}\"font size=\"+2\"{{.Title}}/font/a\n\t\tdiv\n\t\t span class=\"description\"\n\t\t {{ if isset .Params \"description\" }}\n {{ .Description }}\n {{ else }}\n {{ .Summary }}…\n {{ end }}\n /span\n /div\n\nBasically, add font size=\"+2\" and put the span inside a div\n\nAdded reading time\n\nI remember Jekyll didn't have a straight-forward way to add reading time to posts. Hugo gives this out of the box. I like having it for blog posts just to set the expectation of how long it takes to read the blog post before you dive into it. It can be vaguely estimated by just eye-balling or scrolling. But it's nice to have reading time displayed at the top of the post.\n\nIn themes/ezhil/layouts/_default/single.html:\n\n| {{ .ReadingTime }} min read\n\nAdded the above text next to the publish date. I also added permalink to the publish date.\n\n Added a page for Micro Posts\n\nBlog posts are more formal and kinda long-form content which has a specific theme or intent behind them. I wanted to have a separate page for short thoughts (one or few lines) that don't warrant for a full blog post. This can include things like sharing an image, a link, or just some quick thoughts. So, I added a page called Micro and created my own template that is based off of the standard list page, but a little different.\n\nTake a look at /themes/ezhil/layouts/micro/list.html to understand the customization.\n\nI've removed the heading of the post for since I want this to be like a twitter feed.\nAdded a Permalink that takes you to the post page, in case one needs to link to the exact micro post.\nAdded horizontal lines to separate out each micro post\n\nAdded a Now page\n\nThis page captures what I'm doing right now. This includes a variety of tasks/activities/projects that I'm doing at the moment to give a sense of what I'm up to. This is inspired by Derek Sivers. The Now page layout is similar to the blog post page, except few changes.\n",
"tags": []
},
{
"uri": "/posts/my-theme-setup",
"content": "---\ndate: \"2013-11-14T00:00:00Z\"\naliases: [/my-theme-setup]\ntags:\ntheme\nso simple\ntitle: My Theme Setup\n---\nFirst of all, kudos to @mmistakes for coming up with such an elegant theme called So Simple. Everything looks perfect and every component is placed where it's supposed to be. I didn't really have much to change except for few images and links here and there. It took me some time (along with my coursework) to setup this theme with my customizations on it. Following are the changes I made on this theme:\n\nRemoved site logo (the big circle head) that appears at the top of every post and restricted it to pages alone, so as not to make it redundant.\nChanged font of some headings to Candara.\nAdded a Projects page on the navigation bar.\nChanged the color of link hover to blue in most places.\nEliminated the need to have a 'Home' link on the NavBar and instead made the site logo clickable that takes you to the homepage.\nThe theme didn't have a Rakefile to generate a page/post template. So I just borrowed the Rakefile from Jekyll Bootstrap and edited to fit to tailor it to my needs.\n",
"tags": []
},
{
"uri": "/posts/on-analysis-paralysis",
"content": "---\ntitle: \"On Analysis Paralysis\"\ndate: 2021-05-30T17:44:42-07:00\ntags:\nthoughts\n---\n\nI have often gotten stuck in analysis paralysis mode where I constantly look for the right way to solve a problem and end up spending way too much time on it than actually solving the problem. A lot of times what happens is the activity of searching for the right way to do something itself takes so much time and energy that I'd develop an aversion to the actual activity. Or I'd not feel the same level of enthusiasm with which I started.\n\nA recent example for this was when I was thinking about the right way to journal. I've been journaling on and off the past few years and I've also changed my note-taking apps/services a few times. These note-taking apps have also influenced the way I journal.\n\nI currently use org-mode to manage my tasks, events, journal, notes, thoughts, etc. Given that I wanted to journal in org-more, I started searching for the best ways to go about it - to \"streamline the process\", so to speak. Like, what would the headings be? Should I follow a template? Can I use a text expander for the template? Should I add tags for each heading in that template? I was even looking up the /r/journaling subreddit to get some ideas.\n\nBut after spending some time on this, it just hit me - I should worry more about content than workflows. So, I just went ahead and freestyled it by putting in vague yet meaningful enough headings for each journal entry that either captures the task/event/feeling. And then I added tags to capture how I'm feeling. This took a lot of stress away from me and helped me focus on journaling instead of building a workflow.\n\nThis is just one example out of several where I spent too much time trying to find the right way to do something before actually doing it. What I realized from the above experience was to identify what is important to me. In the journaling example, what's important is the content - writing down what I think, how I feel, rationalizing my thoughts when I'm anxious, etc. Everything else is secondary. As long as I make it extremely easy to accomplish this, I shouldn't care about workflows. Because, workflows develop organically based on usage.\n\n",
"tags": []
},
{
"uri": "/posts/org-mode-smart-archive",
"title": "OrgMode Smart Archive",
"content": "\nSo far, my workflow in OrgMode for managing tasks and events was to have one file called organize.org that contains top-level headings - Tasks, Events that contained respective items. Once I finished those items, I'd move them to a different file called archive.org. So, my organize.org file looked something like this:\n\norganize.org\n\n Tasks\n Task 1\n Task 2\n Events\n Event 1\n Event 2\n\nInitially, I was directly archiving all the tasks/events that I completed, so my archive.org became a dumping ground. A few weeks later I looked at my archive file and it was so hard to go look at it and separate them out, so I created similar top-level headings.\n\nNow my archive.org had Tasks and Events as the top-level headings and I would archive all the DONE tasks and events to their respective headings. This also felt a little tedious because each time I had to archive something, I had to select the specific file and heading. I could have used the archive feature that org-mode provides, but that creates a new file whenever I want to archive something from another file. I want to maintain just one file for archive and if I want to archive anything from any of the other files, they'll all go to this one archive.org. This is part of my PARA workflow.\n\n**Note**: By the way, I use Doom Emacs, so some of the keybindings I mention in this article will be specific to Doom Emacs. They may not work with Spacemacs or Vanilla Emacs.\n\nWhat I figured out later was to have a :PROPERTIES: drawer containing the location of the archive file and the heading under which it can be archived to. And, I did this for all the headings where I usually archive stuff. Now that I've set this up, all I do is hit SPC m A (or M-x org-archive-subtree) and the item goes to the right location. And not just that, it also adds a :PROPERTIES: drawer in the destination location with all the relevant details like where that heading came from, at what time the task was archived, etc.\n\norganize.org\n\n Tasks\n :PROPERTIES:\n :ARCHIVE: ./archive.org::* Tasks\n :END:\n Events\n :PROPERTIES:\n :ARCHIVE: ./archive.org::* Events\n :END:\n\nNow, if I have to look at all the things I've done and events I've attended over the past day/week/month/quarter/year, I just have to go to archive.org and do a sparse tree search (SPC m s s or M-x org-sparse-tree) on that tree and I can slice and dice the data however I want. In case you want to know what properties get added in archive.org, here's a preview.\n\narchive.org\n\n Tasks\n ** DONE Task 1\n CLOSED: [2020-09-12 Sat 11:51]\n :PROPERTIES:\n :ARCHIVE_TIME: 2020-09-12 Sat 11:52\n :ARCHIVE_FILE: ~/Documents/org-mode/organize.org\n :ARCHIVE_OLPATH: Tasks\n :ARCHIVE_CATEGORY: organize\n :ARCHIVE_TODO: DONE\n :ARCHIVE_ITAGS: task\n :END:\n",
"tags": [
"productivity",
"orgmode",
"emacs"
]
},
{
"uri": "/posts/orgmode-tips-tricks",
"title": "OrgMode Tips and Tricks",
"content": "\nAdd a link to headings in other org files {add-a-link-to-headings-in-other-org-files}\n\nUse file:~/path/to/file.org::Target\n\nTarget searches for a heading called Target. If not found, it'll ask to create one\n*Target points to a heading called Target\n",
"tags": [
"productivity",
"orgmode",
"emacs"
]
},
{
"uri": "/posts/replacing-knee-jerk-reactions-with-new-learnings",
"title": "Replacing knee-jerk reactions with new learnings",
"content": "\nOften times we come across a blog post, a portion of a book, a podcast, an interview, etc where an expert in a field is explaining something that is very counter-intuitive to us. This happens mostly because we have some strongly held beliefs about how the world works and those beliefs are challenged. This used to happen to me while I was growing up and my first reaction to this was usually, \"That doesn't make sense. He's clearly wrong, because of <insert vaguely recollected poorly understood never researched supposed fact/anecdote here>\". It didn't help me in any way. Some times it made me feel better about myself, but the net outcome of consuming that resource was zero at best, if not negative.\n\nAs I grew up, I started realizing and asking myself - \"am I really challenging someone who has a PhD in this subject they're discussing and has spent countless hours thinking about the topic where I'm going in to this with nothing more than a hunch on a subject I know nothing about?\" It's definitely possible that I'm right and they're wrong, but it's also highly unlikely.\n\nOnce I realized this I stopped having such knee-jerk reactions when I saw something I didn't agree with initially. My first reaction now is always, \"That's interesting and doesn't conform with my beliefs. What am I missing?\" I prefer to err on the side of me being wrong and learning something from it and updating my beliefs rather than doubling down on something I was already believing in without confirming the validity of it.\n\nIt's easy to dismiss something just because it doesn't align with what we believe in, but it's much more fruitful to learn about a different perspective and update our beliefs.\n",
"tags": []
},
{
"uri": "/posts/taskr",
"content": "---\ncategories:\nandroid\ncomments: true\ndate: \"2015-01-07T00:00:00Z\"\naliases: [/android/taskr]\ntags:\ntaskr\nandroid\napp\ntitle: Taskr - the simplest task management app\n---\nI started off 2015 by making an Android app. I created a very simple todo list app called Taskr. This was mainly to brush up my Android skills and get my hands dirty while digging into Material Design. I was inspired by Material Design since it was launched, but never had the time to implement it in my hobby projects. Now I am trying to take baby steps every day and work on creating Android apps that mostly stick to the new Material Design.\n\nI came up with the name Taskr because I couldn't come up with anything better. I did think about many names but since this isn't going anywhere near Play Store, I just stuck to the most unimaginative name possible. Yes, this is probably the simplest task management app that you can find. It's so simple that all you can do is add/edit a task name and description, mark tasks as done and delete completed tasks. To make it a little more usable, I used SQLite database to persist data entered by\nthe user.\n\nThis application uses no fragments, but just a couple of activities. Here's how I designed the application.\n\nA TaskItem data class that holds information about each task and is used to translate cursor objects.\nArrayAdapter that spews out tasks from the TaskItem list.\nA DatabaseHelper class that is used to save the task items in an SQLite database.\nA main list activity to display the list with a floating action button and an activity dialog to add/edit a task\nA menu that has an option to clean up completed tasks.\nA util class that is used to calculate time elapsed since the task was created and display appropriately.\n\nTo make things simpler, I have used couple of libraries.\n\nLombok\nLombok helps you skip writing getters and setters for data objects by adding the @Data annotation. This helps in keeping the code short, clean and readable. So the class would look something like this:\n\n{{ highlight java }}\n @Data\n public class TaskItem {\n private int id;\n private String taskName;\n private String taskDescription;\n private long creationTime;\n private boolean isTaskComplete;\n }\n{{ / highlight }}\n\nThis looks much cleaner than a class that is cluttered with getters and setters.\n\n Butterknife\nButterknife is another library that helps you inject views more easily with annotations. Adding the @InjectView annotation will automatically cast the corresponding view in your layout. So you no longer have to write things like\n\n{{ highlight java }}\nView view = inflater.inflate(R.layout.layout_main, container, false);\netTaskName = (EditText) view.findViewById(R.id.tasknameedit_text);\n{{ / highlight }}\n\nYou instead write:\n\n{{ highlight java }}\n@InjectView(R.id.tasknameedit_text)\nEditText etTaskName;\n{{ / highlight }}\n\nThere are many more things that these libraries offer and I plan to use it in every Android project of mine.\n\nProblems I faced: \nI was finding it hard to keep the list up to date. Since I had my tasks in a List and I was using an instance of ArrayAdapter. It was hard to keep track of what was added to the list and what was deleted whenever the user interacted with the list. The main issue was when going from one activity to another and returning back to the main activity. Passing around intents with parcelable/serializable was a pain for a small app like this. And hitting database so often is not a great design.\n\nSolution I used: \nI used a singleton to have a single copy of the task list which will be available to all activities in the app. So any add/update/remove operations performed on this list anywhere in the app will be reflected and is readily available (so the list will have the latest information), though in background I was writing the tasks to database. This mainly helped me avoid passing around intents back and forth.\n\nIt took me a few days to get this simple app done due to hectic work schedules. I guess I will get back to working on it and add some minor enhancements.\n\nScreenshots\nHere are some screenshots of my app:\n\n \n\nThe white background of the app blends into the white background of the page :( \nI'll have to change the theme sometime.\n\nThe project can be found on my GitHub page: taskr\n",
"tags": []
},
{
"uri": "/posts/the-dreaded-65k-method-limit-on-android",
"content": "---\ncategories:\nandroid\ndate: \"2016-03-09T00:00:00Z\"\naliases: [/android/the-dreaded-65k-method-limit-on-android]\ntags:\nandroid\ndex\ntitle: The Dreaded 65k Method Limit on Android\n---\nIf you're an Android developer, it's likely that you have experienced this at least a few times during your development.\n\nThe first time I heard people talk about 65k method limit I wasn't aware of it so much. I was thinking, \"How can a small Android app have 65,000 methods? That's ridiculous! I don't know what people are complaining about.\" Then when I read what the fuss was all about, I realized that 65k method limit includes not just all the methods in my app, but also everything my app consumes. Yes, that includes libraries; even if you don't use them. Surprisingly I never ran into this issue before though I used to throw in libraries for every little thing without caring about how much it's contributing to the 65k limit. Of course, in the beginning I was using smaller libraries with low method count. Not giants like Goole Play Services. But in a recent project I was working on, one fine day I got this error:\n\n Unable to execute dex: method ID not in [0, 0xffff]: 65536\n Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536\n\nAnd I thought, \"Huh, looks like I'm now in the same boat as many developers who've been talking about 65k method limit.\" As I always do with weird unknown errors, I googled this one and got a bunch of StackOverflow links which all said pretty much the same thing - enable multidex. I was about to do that, but I stopped and thought \"Let me at least understand why this is happening. I'm surely not using many libraries. All I'm using is dagger, retrofit, timber, google play services and few others. Let me see the culprit that's making my method count reach 65k.\"\n\nAfter some searching, I came across this awesome website methodscount.com by Sebastian Gottardo that gives the method count for any library. Later I found the plugin for Android Studio which made my day. After I installed the plugin, I saw the method counts of all the libraries I was using right in the build.gradle file and I found it. GooglePlayServices, with its massive 19k method count. I mean, come on. 19k? Really? I thought this is insane!! So did other developers, a long time ago. I was just late to the party. Few more minutes of googling and I found that Google Play Services 6.5 onwards the library is more modular - which means you can include only the stuff you want instead of the whole library. For my application I just needed wearable and location services and methods count for each is under 1.5k.\n\n compile 'com.google.android.gms:play-services:8.4.0'\n\nSo, the above line became:\n\n compile 'com.google.android.gms:play-services-wearable:8.4.0'\n compile 'com.google.android.gms:play-services-location:8.4.0'\n\ngiving me just what I need.\n\nAnother awesome tool to consider to get the method counts in a more detailed manner is dex-method-counts by Mihai Parparita. This script gives the method counts in a tree format neatly segregating the counts for each package. There are few other tools out there to get method counts, but the key thing to remember is to think before using any 3rd party library. If it's helping you at the cost of bringing in thousands of methods into your DEX file, then is it really worth including it into your app? Can you use a different library that does the same job for you but with a considerably fewer method count?\n\nPS: If you're interested to know why 65k, or rather why 65,536 specifically, you should listen to Fragmented Podcast Episode 29 where Koushik Gopal explains about this.\n\nFor more details on 65k limit, here are few links:\n\n2016 Prediction: Battling the 65k limit \n[DEX] Sky's the limit? No, 65k methods is\nDeep dive into Android Multidex\n\n",
"tags": []
},
{
"uri": "/posts/two-months-with-project-fi",
"content": "---\ncategories:\nreviews\ndate: \"2016-01-16T00:00:00Z\"\naliases: [/reviews/two-months-with-project-fi]\ntags:\nproject-fi\nreviews\ntitle: Two Months With Project Fi\n---\n\nIt's been 2 months since I started using Project Fi on my Nexus 6P and I thought I'll write my review about it.\n\nWhat is Project Fi\nProject Fi is a mobile phone carrier offered by Google and it's a prepaid service (at least for now). It uses 2 cellular networks - Sprint and T-Mobile with switching between the two depending on which network has better connection. It also features Wi-Fi calling so when you're at home or work or at a place where there is good Wi-Fi connectivity calls can be made through Wi-Fi. Currently only Nexus 5X, 6 and 6P are supported. Signing up for it is a simple process. You request an invite and within few days you'll receive the nano sim card. When you sign up for it, you have to provide your details like home address, billing address, credit card details and your mobile phone number (for mobile number portability). This can be done later too, but if you do all this before you get the sim card, then the transition is instant. You just use the new sim card and you're good to go. Once you make the switch to Project Fi, your current prepaid number will be paused. If\nyou don't feel like continuing with Project Fi you can opt out of it and you'll get back your old number and connection. I like the simplicity of this. No going to the store, no paperwork, no wait times.\n\n Plan\nProject Fi plans look neat and straightforward. $20 for just talk and text and then $10 per GB. Best part about this plan is if you don't use all the data that was assigned to you in the plan, you'll be refunded for the unused data and it will reflect in your next bill. Similarly, if you use over your limit, you'll be charged extra on a prorated basis. So for example, if you don't use about 0.4GB of data by the end of your billing cycle, you'll get\n$4 as refund. No hidden charges, you just pay for what you use (+ taxes of course). They have good international coverage in case you want to call numbers outside US or use it outside US. It also supports international roaming in over 120+ countries. You don't get LTE while on roaming, it's limited to 256kbps. But it's okay. At least you're not paying extra for data, you just continue your current plan. And you don't have to buy\nanother SIM card and share your temporary number with your friends when you're on vacation.\n\nMy experience using it outside US\nI was in India for 3 weeks last December and I depended on Project Fi for all my calls and texts both in India and to US. It worked seamlessly, for the most part. I had no issues with connectivity, I always had cellular network and I was able to make calls easily and there were no call drops midway during the call. Data worked perfectly too but only until about 5 days before I left. On a Saturday morning, my data just stopped working. I didn't change any setting, I didn't fiddle with the\nphone, nothing. I wake up and it's gone, no data. I tried turning it off and on again, switching to airplane mode and back, switching off and on the international roaming, and also turning off the phone and turning it on again. Nothing worked. I called up customer service and they asked me to do everything I already did and it didn't help. They weren't able to figure it out either. It just didn't work until I came back to US. I could still make and receive calls though. The biggest problem was none of the messages anybody sent to me on WhatsApp or Hangouts reached me and they couldn't call me since mine was an international number and it would cost them about 8-10 times more than a regular local call. I also couldn't use Uber/Maps, which sucked.\n\n Other hiccups?\nI didn't really have any other problems with Project Fi. Call quality is great, plans are cheap and customizable and no issues with data (at least in the US). But sometimes my phone searches for network when enter my apartment lobby and also sometimes after hanging up. I added a screenshot of that below. It's no biggie, but it never happened to me with my previous carrier.\n\nA sweet surprise\nWhen I came back from India, a package was waiting for me. A package sent by Google. And it was a LEGO kit to create a phone stand or docking station or other fun things. I had read on AndroidPolice that Google was giving away Lego kits to some subscribers of Project Fi. I never expected I'd get it. So I opened it and built my own docking station. Check it out ;)\n\n Conclusion\nI like it. I like the plan and the idea of refunding for unused data, I liked the smooth transition from existing carrier to Project Fi, I like the beautiful app they have to manage accounts, track data usage, view bills and past statements and do so much more and I love the LEGO kit :D I'll stick to it until something stops working unexpectedly (like how my data stopped working for no reason when I was in India). I hope they enable higher data speeds outside US sometime soon.\n",
"tags": []
},
{
"uri": "/posts/using-literate-configuration-for-all-text-based-configs",
"title": "Using literate configuration for all text-based configs",
"content": "\nHas it ever happened to you that you look at your config (vim, tmux, whatever) after a while and see an obscure piece of code there that you have no recollection adding and what it's even doing? This has happened to me so many times. So, what can we do about it? Add comments while adding new pieces of config? Couple of lines of comments are fine, but if you need more explanation than that, it just gets cluttered. If you want to add links, they are not clickable, unless you have an editor or terminal that can handle text links and make them clickable.\n\nSo what can we do? What we can do is change that config to a literate configuration.\n\nWhat is Literate Configuration {what-is-literate-configuration}\n\nLiterate Configuration comes from the literate programming paradigm. Simple put, you write your config like documentation where you'd have code blocks interspersed within your config. You run a simple command to \"tangle\" these documentation-like files and the code blocks in them get evaluated and then written to a separate file (like an actual config file). And, tangling is a process of extracting source blocks in an org file into the location specified at the top of the org file or in the source block itself.\n\nOnce you follow this, you will never touch the actual config. You basically write documentation for each part of your config and let it generate your config file with your code in it. Your application understands the file your literate config generates and you understand the file you write since it's well-documented.\n\nSo, why literate configuration anyway? {so-why-literate-configuration-anyway}\n\nChanging your configs to make them look like documentation sounds like a lot of work. But, there are many benefits to using a literate configuration:\n\nEasy to understand. Thanks to the documentation surrounding the code snippets\nEasy to share. People you share this with need no explanation as to what's in your config, your documentation takes care of that\nEasy to maintain. You never touch the actual config, you only update this .org file and make it generate the actual source file\nEasy to publish. If you want to publish your config online, it's super easy. GitHub, for example, natively supports org the same way it supports Markdown. So, these org files are rendered nicely, just as regular documentation.\n\nOne of the issues I used to have with maintaining multiple dotfiles for my applications is that they're all in different places. If I have to check them all into a git repo, I'd either have all of them in one location and create symlinks to them in the apps that use them, or use a program like GNU Stow.\n\nI didn't like either of these methods. Literate configuration solves this in the most elegant way. All you have to do is have your literate configs (org files) in a git repo (used for dotfiles) and set the tangle locations in each of these files to where each of the apps needs them. Once that is done, your dotfiles will only contain org files and all your apps will contain the config files they need.\n\nHow to build a literate config? {how-to-build-a-literate-config}\n\nBuilding a literate configuration needs just one prerequisite - Emacs, because we need a way to \"tangle\" the source blocks in the org files. Since Emacs ships with org mode and org babel, tangling is just a keybinding away. We only need two things in order to create a literate configuration: a source block and a tangle attribute. Here's an example to show how that's done.\n\nExample {example}\n\nEnabling tangle in an org file can be done by specifying a tangle location at the top as part of the #+PROPERTY attribute, like this:\n\n+PROPERTY: header-args :tangle /path/to/file-name.extension\n\nHere's what a code block looks like in an org file.\n\n+begin_src emacs-lisp\n (setq foo \"bar\")\n+end_src\n\nYou can write your documentation around these code blocks and hitting C-c C-v t (or invoking the function org-babel-tangle) at the top of your file would tangle them to the file specified in the +PROPERTY attribute of your org file.\n\nConclusion {conclusion}\n\nUsing literate configuration for config files is great and I converted almost all my configs to literate configs. For reference, have a look at my literate configuration for my Emacs setup. Look at the source blocks to see actual configs. Use the \"Raw\" button on github notice line 2 where it says :tangle ./private-config.el\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-1",
"content": "---\ncategories:\nweekly-noise\ndate: \"2013-11-09T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-1]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #1 - Moving to GitHub Pages'\n---\n\nTo set the context, Weekly Noise series is where I talk about what I accomplished during the week (like working on my personal projects among other things) and also set the goals for next week. So this will be a weekly iteration of my progress in the projects I work on.\n\nSo to start off with the Weekly Noise series, I would share an update on what happened in the last one month. Here's my story on hopping between different blogging platforms in the quest to find the right one (for me).\n\nThe story so far:\n\nI wanted to have a very simple, minimalistic, no fluff kind of a blog to share my thoughts. Though I'm far from being a designer, a good theme is a must and I don't stop unless I find a good one. Given that I'm a little too lazy, I wanted something of very minimal effort; as little as writing a blog post in a text file and posting it on the web. So I tried the following:\n\nWordpress\n\nNope. Not my cup of tea. I started off with Wordpress and somehow I didn't really like the themes there. Moreover, it was a little too much for my needs. One of the main reasons for not choosing Wordpress is that there's no freedom when it comes to editing the existing theme and I wasn't really happy with that. It has an admin panel that's not very helpful in terms of version control.\n\n Scriptogr.am\n\nI really liked this blogging for it offered Markdown editing and Dropbox sync which makes it a good choice for quick blogging. But the theme editor is not all that great and also, I didn't see much support for Scriptogr.am. They're not very active on Twitter, nor have they updated their own official blog for more than a year. And the link to their support page hasn't been working for the past one month or so. It turned me off and I had to switch to something else. It's probably still in its nascent stage of development, but I don't see much happening at their end (at least that's what it looks like).\n\nGhost\n\nWhen Ghost was launched to the public, no wonder there was so much buzz in the blogging and web hosting communities. It indeed lives up to its expectations and I believe it's a great blogging platform. It does what it says - nothing more, nothing less. But the catch is I need a VPS to host it for which I have to pay every month. And there's also the reliability and latency issues that come with every VPS. So I ditched Ghost in the hope of finding something that better suited my needs.\n\n Along came GitHub Pages\n\nI stumbled upon this page which hinted me to take a peek at GitHub pages and I was impressed. I checked out Jekyll and it seemed perfect and exactly what I wanted. All I had to do was, fork the repo and push my posts to GitHub. As simple as that.\n\nPosts can be created in markdown. A simple rake command generates the boilerplate stuff to get you started.\n\n{{ highlight ruby }}\nrake post title='A new blog post'\n{{ / highlight }}\n\nThe above command is all that is needed to create a new post. It fills up the new file with headers which has some important information that looks something like this.\n\n---\nlayout: post \ntitle: \"Weekly Noise #1\" \ndescription: \"Moving to GitHub pages\" \ncategory: \"weekly-noise\" \ntags: [weekly, noise]\n---\nWrite your blog post here\nOnce you're done writing a post, you just have to add, commit and push\n\ngit add .\ngit commit\ngit push origin master\n\nAnd Voila! You're done. :)\n\nGitHub Pages is so simple and fast. It doesn't need a database, the so-called admin panel is just a YAML config file. And the best part is, the whole blog is in your control. You have the freedom to change anything and everything.\n\nI spent the week customizing the blog and pushing my changes to the repo. There are still couple of changes that I should be doing. But most of the blog layout and plugins are in place. Here's the target for next week:\n\nFix the Navbar at the top of the blog.\nWrite a blog post about my theme setup.\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-10",
"content": "---\ncategories:\nweekly-noise\ndate: \"2014-03-22T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-10]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #10 - Offline Phase Complete'\n---\nIn order to bulk load the parking cell data, I chose to use a JSON file as it is simpler to edit cell information (if need be). I wrote a Python script to generate the JSON file with parking cell information. The JSON file is an array of parking cells wherein each element in that array has the grid co-ordinates. With this information, I will be able to bulk insert information about all parking cells into the database. A simple button on the Intro Activity takes care of this task.\n\nSince each navigation cell has a parking cell on either side, the navigation cell id for those parking cells must be updated. The DataSource file has all the relevant methods to do these operations.\n\nAlso, the colored cell issue still persists and I'm almost on the verge of giving up in order to not waste any more time on this. I am instead thinking of reducing the height of the cells in the grid view to make it non-scrollable.\n\nI also added a background image (the floor plan) to the grid view and made the grid transparent, but for some reason the image is distorted. I am currently not concentrating on fixing that issue since the offline phase is used for our reference to build the database with fingerprints and will not be shown to the user.\n\nThis completes the development for the offline phase. Any more development on this will only be bug fixes. The online phase will be a new app altogether that involves tracking current user location, routing algorithm and navigation.\n\nSo here's the target for next week:\n\nExplore a way to train the offline data using data mining algorithms. Also explore other ways to find nearest match of fingerprints with the offline database.\nImplement GeoFencing.\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-11",
"content": "---\ncategories:\nweekly-noise\ndate: \"2014-03-29T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-11]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #11 - Online Phase'\n---\nThe online phase is where scans are made periodically and matched with the offline database to find the current location of the user. When a scan is made the set of fingerprints are captured and compared with existing data in the database. With Nearest Neighbour algorithm, we predict 3 closest matches as to where the user could be. Initially, we were searching the whole database to find the 3 closest matches, but later on we reduced our search space significantly by searching\nthe current and the next 2 cells along the navigation path. If the database search yields a (or any) result, then the current location of the user will be updated to the yielded result. Else, we assume that there is no change in the user's location. This way, the search happens every 2 seconds and the position is updated accordingly as and when the car moves inside the parking lot. To illustrate this approach, refer the figure below.\n\nAs you can see in the image, the green cells are the next 3 predicted cells on the navigation path, the blue cells are rest of the cells and the orange cells are the ramps in the middle of the parking that takes you to the next level of the parking structure. The worst case is when the search results yield nothing thus not changing the position of the car on the map. If the search results do yield something, the car moves forward.\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-12",
"content": "---\ncategories:\nweekly-noise\ndate: \"2014-04-05T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-12]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #12 - Geofencing'\n---\nGeofencing is a concept wherein a fence is created around a particular area and any action can be performed once a mobile device enters this fence. Google detects when the mobile device enters this fence and allows the developer to invoke any activity or service. So the way it works is that it expects an x,y coordinate and a radius parameter. The radius parameter creates a circular fence around the co-ordinates.\n\nWe have used this concept in our project in order to detect if the user is entering the parking structure. If so, we invoke our application and set the starting point as the entrance of the parking structure and present the user with the list of available parking slots to choose from. Once the user chooses the parking slot, the app calculates the route and starts navigating.\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-13",
"content": "---\ncategories:\nweekly-noise\ndate: \"2014-04-12T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-13]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #13 - Routing Algorithm'\n---\nThis week we implemented the Routing Algorithm. We considered each intersection as a checkpoint and made a graph out of the navigation paths and the corresponding intersection points among them. Doing this helps us in finding out the best way to navigate to any parking slot. Most parking structures have uni-directional paths. That is, cars can go only in one direction. They pretty much don't have a choice in terms of choosing different ways to get to the destination parking slot. We used this\nto our advantage in our routing algorithm. The directed graph that we created had nodes as the intersections and edges as the navigation paths in which cars can move. Below is a good illustration of how we visualized our routing algorithm.\n\nAs you see in the figure, N, S, E, W, NE, SW refers to the direction in which a car can move upon reaching that intersection point. The edges have a fixed value so that it would be easy to calculate distances. The arrows shown in red are part of the navigation path. From the start point to the destination the path is along the checkpoints - N, W, W, SW and E. And the distances along the path are calculated accordingly. The starting point is fixed since the app starts when the car enters\nthe lot. Once the user selects a parking slot, the route is calculated using the routing algorithm mentioned above. This should be giving the user a step by step navigation and voice alerts as and when he turns.\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-14",
"content": "---\ncategories:\nweekly-noise\ndate: \"2014-04-19T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-14]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #14 - Navigation and Voice Alerts'\n---\nThis week we concentrated on Navigation and Voice Alerts. Calculation of the route path is quite easy and it's a one-time task, the results of which will be used repetitively for navigation. Navigation in itself is quite complicated since it involves detecting the location of the user and then directing him accordingly. So the whole process banks on the accuracy of the current location of the user. Any mistake in the location of the user will result in displaying the directions too early or\ntoo late thus leading to a bad user experience. Hence this needs efficient calibration in terms of number of times the search for the location happens, the number of navigation cells to be considered for search and the like.\n\nWe have used the current navigation cell and the next two cells along the navigation path during testing and fine tuning and they ended up giving good results. What we employed was to detect intersection points in the route digraph and alert the user when he reaches the intersection point. Thus in the search for the next probable position of the car along the navigation path, if the returned grid coordinate is one of the intersection points, the alert is displayed to the user asking him\nto make a left turn or a right turn accordingly. Similarly, if the destination is among the next 3 cells, then the last voice alert is displayed which says - your destination is on the left (or right).\n\nVoice alerts were easy since all it expects is a string and it says whatever is passed through that string. We maintained all the voice alerts in a queue and these were computed during the route calculation. As and when an intersection is approached, the queue is emptied one by one.\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-15",
"content": "---\ncategories:\nweekly-noise\ncomments: true\ndate: \"2014-04-26T00:00:00Z\"\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #15 - Experimental Results'\n---\nTwo phones were used as part of testing – LG Nexus 4 and HTC One. Logging was done multiple times during the day, between 11am and 5pm. One floor was considered to test the accuracy of the algorithm. A total of 28 feature points were collected on one floor. About 150 scans were performed on each feature point and about 750 records were inserted into the database. With the above-mentioned algorithm and localization approach, an accuracy of at least 10m was obtained. We noticed that HTC One\ndid not record signal strengths less than - 90 and hence we had to tweak the code for data collection to make it uniform with the other phones.\n\nChallenges faced\n\nWe faced many challenges while working on this project.\n\nUnavailability of GPS was a huge drawback. We did not get GPS signal in the middle of the parking lot, but when we tried locating ourselves near the corners of the parking lot, the GPS was pointing to a different building altogether.\nUnavailability of wireless access points inside the parking lot. Since there are no wireless routers inside the parking lot and we depend on the beacons received from neighboring buildings, trilateration cannot be applied which became a huge drawback for accuracy.\nIn the online phase, some wireless routers were turned off at certain times, mostly during the evening and weekends. This delays data collection process and also hinders the actual working of the app since there are no access points to match the existing database with.\nPhones detect signals differently. We tested our app with LG Nexus 4 and HTC One. We observed that HTC One is incapable of recognizing weak signals. So if data collection is done with a Nexus 4, HTC One will have errors in matching fingerprints since most of the signals captured and stored in the database will be outliers to HTC.\nWe tried using accelerometer, gyroscope and other sensor to detect movement, direction and orientation. But this posed a problem since the results from sensors change in microseconds time and we will not get an accurate reading of the sensors.\nWe tried classifying each feature point into different classes and use Support Vector Machines to localize. But this approach does not really work with less data in this case since we have less number of feature points.\nThe signal strengths from wireless routers keep varying since they depend on many factors such as weather, location and number of cars or people inside the parking lot. Also, some scans identify a good number of access points while some don’t. This instability makes it difficult to match fingerprints from the database thus resulting in inaccuracy.\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-16",
"content": "---\ncategories:\nweekly-noise\ndate: \"2014-05-03T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-16]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #16 - Wrap up and future enhancements'\n---\nAll in all, this project was an extremely interesting one. We got to learn a lot from this project, especially being new to Android development.\n\nIn conclusion, this project demonstrates a car navigation system as an Android app that uses one of the localization techniques, namely, WiFi Fingerprinting to navigate a car in a restricted indoor space. Due to poor visibility of satellites inside an indoor structure, fingerprints from the available access points can be used for navigation. Although this method of navigating cars inside indoor spaces are basically smartphone apps that add nothing to the existing infrastructure, the\ndownside of this approach is that one has to not only depend on the availability of routers during the offline/online phase, but also keep track of the addition or deletion of routers between offline and online phases.\n\nWe made few mistakes which we realized too late in the project and it was too costly to correct. Some of them are:\n\nMaking our own routing algorithm instead of using Dijkstra's. Had we used Dijkstra's shortest path algorithm, our code would have been much simpler and would have worked for pretty much any parking lot.\nNot using a MapView. Being new to Android, it was hard for us to play around with MapView and understand how to make a pointer move on the map as the car moves in the parking lot. We postponed that task till the end, though researching about it periodically. But that's one major drawback with this project.\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-2",
"content": "---\ncategories:\nweekly-noise\ndate: \"2013-11-17T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-2]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #2 - Theme Enhancements'\n---\nLast week I worked on the theme to modify few things which I have explained in the My Theme Setup post. I added a Projects link in the Navbar at the top which I will be filling up with my hobby projects sometime soon. I was held up with a class project in one of the courses which ate up most of my time. But I did finish what I had planned to finish. I've also got my finals approaching in less than a month so my updates may not be significant. That being said, here are some tasks for next week:\n\nIntegrate Medium-style \"time it takes to read the post\" (I don't know what it's called) feature into posts.\nWrite about one of my hobby projects.\nBuy a domain and make it point to my GitHub page.\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-3",
"content": "---\ncategories:\nweekly-noise\ndate: \"2013-11-24T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-3]\ntags:\nweekly\nnoise\nresume\ntitle: 'Weekly Noise #3 - New Domain'\n---\nAs promised, last week I integrated Medium-style \"time-to-read\" kind of feature which is pretty much added manually since Jekyll is a static blog generator. So it doesn't calculate such things and insert them at run time. I changed the formatting of the description of a post to appear beside the tags and the \"time to read\" must be added manually after running a simple wc -w command on the .md file. Once I finish writing a post, I run the above command and insert it manually. Besides that, I also purchased a domain from NameCheap and made it point to the blog. I added a write up about one of the projects - Tweet Sentiment Classifier - that I developed during my Data Mining course. I also added a new page to hold my Resume.\n\nI have one of my finals coming up right after Thanksgiving, so I'll be busy with that. However, since one of the projects involves Android development, I'm planning to develop some sample apps as a quick recap into Android development. So target for next week would be:\n\nDevelop 1 or 2 simple Android apps.\nA write up about another hobby project.\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-4",
"content": "---\ncategories:\nweekly-noise\ndate: \"2014-02-08T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-4]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #4 - Hibernation'\n---\nIt's been quite a while since I last updated my blog. I was busy with exams and then vacations. I went back home (Bangalore, India) after about 1.5 years to enjoy a warm winter break as I was missing the terrible polar vortex that hit Chicago for couple of weeks in December. I couldn't get to work on any of my hobby projects since I had to spend time with family and friends. The one month went by really fast and before I knew it I was back walking on the freezing streets of Chicago again. I got busy with doing literature survey for my Masters Project and had to read lot of papers to deeply understand the problem statement. The project is about developing a Car Navigation System inside a parking lot. I will be talking more about the project in my next Weekly Noise post. But for now, it's glad to be back :)\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-5",
"content": "---\ncategories:\nweekly-noise\ndate: \"2014-02-15T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-5]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #5 - My Masters Project'\n---\nI would like to give a glimpse of what my Masters Project is all about and what I will be working on in the next couple of months. The project involves spatial databases, navigation and a ton of Android programming.\n\nParking in Restricted Spaces\nThe idea is to develop a Car Navigation System that enables a user to drive around a parking lot and navigate him to the parking slot of his choice without using battery intensive sensors like GPS.\n\nThe project is divided into 3 stages:\n\nCreate a digital map of the parking lot showing different parking slots and the navigation paths.\nUse a low-power method such as WiFi localization to identify when the car enters the space, and thus trigger retrieval of the developed map and dead-reckoning.\nProvide navigation on the smartphone to a given location in the restricted space; the location will be given as a parameter to the navigation system developed.\n\nThe parking lot we chose is a multi-level structure where one cannot rely on GPS for navigation since GPS doesn't work so well indoors as it does outdoors. Besides, GPS does not give meter-level accuracy to differentiate between different parking slots. So it would be efficient to use WiFi localization to accurately determine where a car is in the parking lot and then use the same approach to navigate the car to its destination.\n\nSince this is a significantly huge experimental project, I am working on it with another Masters student. A working demo of the project is expected by the end of April.\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-6",
"content": "---\ncategories:\nweekly-noise\ncomments: true\ndate: \"2014-02-22T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-6]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #6 - Design'\n---\nParkAssist\n\nIn my previous post I gave a brief overview about the project that I was working on and its problem statement. After much research about how WiFi localization works and everything that we need to know about it, we started working on the design. Our approach uses WiFi localization, accelerometer and gyroscope for navigating the car. By the way, the name of the app is called ParkAssist. The project will up on GitHub and will have regular commits for the next couple of months.\n\n What is a WiFi fingerprint?\nA fingerprint at a location is a set of access points and their corresponding signal strengths that can uniquely identify that location. Any point inside a building having multiple access points will have different set of fingerprints. Since we have different sets of (access point, signal strength) pairs for each location, we will be able to identify each location uniquely.\n\nDesign\nWe obtained the blueprint of the parking lot from our college Facilities Department. The parking lot has 3 floors with about 200+ slots spread out across each floor. We observed that the parking lot resembled a grid and hence we decided to divide the parking lot into a grind containing cells each of which must have a fingerprint associated with it. Later we realized that we don't have to record fingerprints for each cell, per se, but instead just the ones that lie on the navigation path. This is because the car only has to navigate up to the nearest point on the navigation path where the slot is; so we don't really need to know the fingerprint in the parking slot.\n\n Working\nThe process is divided into two phases:\n\nOffline Phase\nOnline Phase \n\nIn the offline phase, each cell along the navigation path is associated with a particular fingerprint and these fingerprints are recorded and stored in a database. The database will be used in future during the online phase in order to track the location of the user.\n\nAS SHOWN IN THE FIGURE BELOW, the grid is divided into cells. ParkCells are the parking slots and NavCells are the cells along the navigation path. The offline phase is only about storing fingerprints at each navigation cell into a database.\n\nIn the online phase, as the car enters the lot, the application is activated using GeoFencing technique. Once the application is activated, the user is shown the parking lot grid where he can choose a parking slot. When the user selects a parking slot, the neighboring navigation cell is selected as the destination point. We know the start point of the car since it is the entrance of the parking lot. We also continuously track the movement of the car using accelerometer and gyroscope. This technique combined with fingerprint matching will give an accurate location of the car and the car is routed from the start point to the destination point. This becomes a simple routing problem on a grid with predefined navigation path.\n\nMy Development Environment\n\nIDE: IntelliJ IDEA 13.0[Insert Link] \nEmulator: Genymotion[Insert Link] \nAndroid version: 4.2 and above \nDatabase: SQLite \nVersion Control: Git \nWorkflow: GitFlow\n\nThis being said about the project, here's the plan for next week:\n\nDesign the database\nCreate entity beans for each table\nCreate activities to display grid and perform scans\nWrite logic to compute mean values for each fingerprint\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-7",
"content": "---\ncategories:\nweekly-noise\ndate: \"2014-03-01T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-7]\ntags:\nweekly\nnoise\ndevelopment\nenvironment\ntitle: 'Weekly Noise #7 - My Development Environment'\n---\nBefore I go to the details about the working of the project, I would like to explain my Development Environment - the tools I use and why I use them.\n\nIDE: IntelliJ IDEA 13\n\nI am a huge fan of IntelliJ IDEA since I got my hands on it during my internship. This JetBrains team is pure genius and have put some serious thought while creating the IDE. It is so much better than Eclipse in terms of features, speed and performance. It also has Eclipse shortcuts which makes the transition from Eclipse a lot smoother. It has an awesome set of plugins, which are easy to load and install. It also has its own versioning system wherein you can dig up files from local history and revert to any previous version or just include part of the changes. There are plenty of good features to talk about and I'm sure any developer will fall in love with this IDE once s/he starts using it.\n\n Emulator: Genymotion\n\nAccept it. The default Android emulator SUCKS! It's too slow and there's always a lag no matter what you do - open an application or just swipe screens. It consumes lot of memory making the laptop slow and also burning your lap (Oh yes. It heats up the laptop turning it into a furnace). Genymotion is, again, an emulator that I used during my internship and it's extremely fast. It's as if using your phone. The transitions are smooth and seamless and it consumes less memory. Android developers MUST give it a try.\n\nVersion Control: Git\n\nGit is obviously the primary choice when it comes to version control. Since I have a teammate in the project, it will be easier to collaborate using Git, maintain a Wiki, track issues, etc.\n\n Workflow: GitFlow\n\nThe workflow we follow is the famous GitFlow model. So basically the master branch is untouched until a major release. develop branch is where all the development happens. When we split up the tasks and each work on a feature, we create local branches, commit changes, merge the branch with develop and then delete that branch. This makes managing code base a lot simpler.\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-8",
"content": "---\ncategories:\nweekly-noise\ndate: \"2014-03-08T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-8]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #8 - Database Schema'\n---\nAs per the design, we created database schemas, tables and other relevant classes:\n\nDatabase:\n\nparking_table to store information about the parking slots.\nnavigation_table to store information about navigation path.\nfingerprint_table to store information about fingerprints scanned in different cells on the grid.\n\nOther classes:\n\nCreated two activities - one to display the grid and one to scan and save fingerprints.\nCreated entity beans corresponding to the database schemas that were created.\nAdded multiple scans feature wherein you can perform any number of scans you want (using Start and Stop buttons) and the mean RSS value will be considered.\n\nTo make a grid we tried TableLayout, LinearLayout and GridLayout, but finally ended up using GridView to represent the grid since that is the easiest way to handle parking cells and navigation cells in our project. I changed the color of the selected cell to indicate that the scan has been performed. The only issue is that upon scroll, the colored cells change position; so every time there's a scroll where the colored cell goes off the screen, a different cell is colored upon scrolling back. Nonetheless, it does not affect the values in the grid, it's only the colored cell that changes.\n\nAlso, a DataSource class contains methods to perform CRUD operations on tables. For each fingerprint that is scanned, a record will be inserted in the navigation_table with the respective grid co-ordinates. Each record will point to a fingerprint id that was generated during the scan.\n\nPlan for next week:\n\nFix the colored cell issue\nAbstract the scanning logic from the Activity\nAdd an activity to view and manage database\n",
"tags": []
},
{
"uri": "/posts/weekly-noise-9",
"content": "---\ncategories:\nweekly-noise\ndate: \"2014-03-15T00:00:00Z\"\naliases: [/weekly-noise/weekly-noise-9]\ntags:\nweekly\nnoise\ntitle: 'Weekly Noise #9 - Managing Database'\n---\nAfter last week's development, there was pretty good progress with the project. We managed to get the following things done:\n\nCreated an activity to manage database: This activity is a drop down of table names with buttons to delete both the auto-increment sequences and the data from selected table. This becomes easier for testing so that pretty much all database related tasks can be handled on the fly.\nAbstracted scan logic from the main activity to make the code more readable and increase modularity.\nSome code cleanup: segregating classes to different packages.\n\nThe issue with colored cells in the grid still persists and I am not sure how to fix that. Will keep looking and I'll post an update soon if I find something that works.\n\nThere are plenty of parking cells and relatively fewer navigation cells. Also parking cells have pretty much the same data that does not change over time. So it is better to bulk load the data since we already know the positions of these cells on the grid. The only thing we don't know is that the neighboring navigation cell id for each parking cell. We don't know this because we still haven't scanned the neighboring navigation cells. Once we scan a navigation cell, we will assign the neighboring parking cells the corresponding id so that it will be easier to pick the navigation cell as the destination point.\n\nHere's the target for next week:\n\nBulk load the parking cell data\nUpdate neighboring parking cells to hold navigation cell IDs.\n",
"tags": []
},
{
"uri": "/posts/whatsapp-privacy-policy-signal",
"content": "---\ntitle: \"WhatsApp 0:1 Signal\"\ndate: 2021-01-09T15:16:44-08:00\ntags:\nwhatsapp\nsignal\nprivacy\n---\n\nI've been on Signal for a few years now, but it has mostly been crickets and tumbleweeds there because I only had a handful of contacts that were on Signal. My main (and only) app for communication with friends and family was WhatsApp. I used to install Signal and a few days later I'd uninstall it because I didn't really have many people to talk to on Signal. I wanted to keep it and at least use it as an SMS app, but with the amount of spam texts I get and the fact that it doesn't have a feature to filter texts by keyword made me not use it as an SMS app either.\n\nThe problem with new platforms\n\nThe main problem with newer platforms is the user base. If all your friends and family are not on the new platform (social media or messenger), then you really can't use it. That's what happened with me on Signal. It was a herculean task for me to convince people who cared very little about privacy to make them switch to Signal. The thing is, it ends up being a huge task for them too. They also have to convince their contacts to switch to Signal or else they'll experience the same silence of having no one to talk to on that app. Some people are okay with using multiple messaging apps and I know a lot of people that don't. I personally don't enjoy it.\n\n WhatsApp's new privacy policy\n\nWhatsApp's new privacy policy that will take effect in Feb 2021 went viral and made enough people talk about it. The fact that there was no way to opt out was the final straw that broke the camel's back. Even Elon Musk tweeted which ended up putting way too much stress on Signal's servers where there was a delay for new users in receiving verification codes. As much as downtimes are hated in tech services, this particular problem is actually good to have for any tech company.\n\nI'd say this is a kind of blessing in disguise which gave a lot of people the final push to stop giving in to big tech companies to continue stealing data from customers. What I did realize was how easy and valuable it was to make people aware of the data collection practices.\n\nIf this privacy policy update had come in the form of an email that we usually get from other services, like \"We have updated our privacy policy. Please click here to learn more.\" I don't think we would have taken it this seriously.\n\nHow I spread awareness\n\nWhatsApp made the job easier for me to spread awareness of their privacy and data collection nightmare.\n\n 1. Update my WhatsApp status\n\nThe first thing I did was to update my WhatsApp status to say \"I'm deleting WhatsApp on 1/31. Find me on Signal\". This would give people a heads-up about my availability on WhatsApp and also tell them where to find me.\n\n2. Starting conversations about privacy with people\n\nI ended up sharing two screenshots with the groups and people I interact with the most on WhatsApp. Once I shared them, it was abundantly clear to them that they had to ditch WhatsApp and most of them immediately hopped on to Signal.\n\nfigure\n img style=\"width:50%\" src=\"/images/whatsapp-privacy-policy-feb2021.jpeg\"/\n figcaptionWhatsApp Privacy Policy/figcaption\n/figure\n\nfigure\n img style=\"width:100%\" src=\"/images/data-collection-messaging-apps.jpeg\"/\n figcaptiona href=\"https://www.forbes.com/sites/zakdoffman/2021/01/03/whatsapp-beaten-by-apples-new-imessage-update-for-iphone-users/?sh=191b47e36234\"Data collection by different apps/a/figcaption\n/figure\n\nWhat I also did was to create Groups on Signal and send the group invite to respective groups in WhatsApp. It made the transition easier. Now the number of contacts in Signal is growing.\n\n Signal is the future\n\nSignal paved the way and showed the world how apps can be made that wouldn't profit off of your data. Their Reddit AMA provides good insight into their values, their vision and a lot more about who they are and how they operate. I have donated to Signal and will continue to do so. I love the fact that they're non-profit and open source; that's a huge plus to me. It's so peaceful stress-free to use an app or a service that we know has our best interests and wouldn't make money off of our data. In the world where it seems as if privacy no longer exists, it's great to see a very private and secure messaging app is growing to be so popular and it is on its way to become people's primary mode of communication.\n",
"tags": []
},
{
"uri": "/posts/write-emails-from-bottom-to-top",
"title": "Write emails from bottom to top",
"content": "\nIn the years I've composed emails, I was initially finding it a little hard to go through the top-down steps of adding people in the To field, CC field and coming up with the subject line. There were two problems with this workflow:\n\nIt broke my flow for composing an email\nI'd have a vague idea of how to express my thoughts into words and that flow was broken by filling out these fields.\nI used to be trigger happy in sending the email.\nIn most email clients, Option+Enter (or Alt+Enter) is the keyboard shortcut for sending email. I'd be so used to hitting these that I'd sometimes hit them in the middle of the email. This was particularly a problem when I was using IntelliJ IDEs quite heavily. Because, Option+Enter in an IntelliJ IDE would insert the currently suggested hint.\n\nSo, I figured out a simple fix for this: Write emails from bottom to top. Basically, do the following in order:\n\nWrite the body of the email first and you get all your thoughts out.\nThen fill the subject line which is now easier to summarize.\nAdd people in To and CC fields.\n\nThe best part about this workflow is, hitting Option+Enter at any point during the process (except once you start filling the To/CC fields) would do nothing, because there's nobody to send the email to. This turned out to be super useful hack that I have been using ever since and has worked out really well.",
"tags": []
}
]