<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Kelvin Nishikawa</title>
<link>https://kelnishi.com/</link>
<description>Blog and projects of Kelvin Nishikawa.</description>
<language>en-us</language>
<atom:link href="https://kelnishi.com/feed.xml" rel="self" type="application/rss+xml"/>
<item>
<title>New KBMC project page</title>
<link>https://kelnishi.com/blog/new-kbmc-project-page/</link>
<guid>https://kelnishi.com/blog/new-kbmc-project-page/</guid>
<pubDate>Sat, 27 Mar 2021 12:00:00 GMT</pubDate>
<description>&lt;p&gt;A few people were asking me about the custom PC gaming controller I built, so I put together a project page with some info and pictures: &lt;a href=&quot;https://kelnishi.com/kbmc&quot;&gt;KBMC&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://kelnishi.com/assets/new-kbmc-project-page/IMG_5793.PNG&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
</description>
</item>
<item>
<title>git pull, but discard conflicting local changes</title>
<link>https://kelnishi.com/blog/git-pull-but-discard-all-local-changes/</link>
<guid>https://kelnishi.com/blog/git-pull-but-discard-all-local-changes/</guid>
<pubDate>Mon, 09 Sep 2019 12:00:00 GMT</pubDate>
<description>&lt;p&gt;A situation I encounter frequently is one where Unity has made local changes and I need to do a git pull. One or more of the local changes will get overwritten, blocking the merge. I don’t particularly care about this file as I didn’t manually edit it and I just need to get the latest code.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://kelnishi.com/assets/git-pull-but-discard-all-local-changes/mergeconflict.png&quot; alt=&quot;I don’t care about this file, but it’s blocking my git pull.&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I don’t care about this file, but it’s blocking my git pull.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here’s how you can &lt;a href=&quot;https://git-scm.com/docs/git-pull&quot;&gt;&lt;em&gt;&lt;strong&gt;git pull&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;, but discard any local changes that might conflict: &lt;a href=&quot;https://gist.github.com/kelnishi/7e4973abdef2c55b768f6e61cbc7639f&quot;&gt;https://gist.github.com/kelnishi/7e4973abdef2c55b768f6e61cbc7639f&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;First, use &lt;a href=&quot;https://git-scm.com/docs/git-stash#_options&quot;&gt;&lt;em&gt;&lt;strong&gt;stash --include-untracked&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; to set aside all local changes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git stash --include-untracked
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now when you &lt;em&gt;&lt;strong&gt;pull&lt;/strong&gt;&lt;/em&gt;, it should finish cleanly.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git pull
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next you’ll &lt;a href=&quot;https://git-scm.com/docs/git-stash#Documentation/git-stash.txt-pop--index-q--quietltstashgt&quot;&gt;&lt;em&gt;&lt;strong&gt;stash pop&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; to reapply all the local changes you had. After doing this, the files that blocked the original pull will be marked as conflicted.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git stash pop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;*Make sure you’re at the root directory of your git repo.&lt;/p&gt;
&lt;p&gt;We’ll use some bash git magic to list all the files.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://git-scm.com/docs/git-ls-files&quot;&gt;&lt;em&gt;&lt;strong&gt;ls-files -u&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; will list all unmerged (conflicted) files from the stash pop.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://git-scm.com/docs/git-ls-files#_output&quot;&gt;output&lt;/a&gt; will be a bit verbose so we’ll use &lt;a href=&quot;https://ss64.com/osx/cut.html&quot;&gt;&lt;em&gt;&lt;strong&gt;cut&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; to select just the file names.&lt;/p&gt;
&lt;p&gt;Since each conflict has multiple states listed, we’ll use &lt;a href=&quot;https://ss64.com/osx/uniq.html&quot;&gt;&lt;em&gt;&lt;strong&gt;uniq&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; to remove the duplicate entries.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ss64.com/osx/awk.html&quot;&gt;&lt;em&gt;&lt;strong&gt;awk&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; will wrap our lines in quotes so spaces won’t trip us up.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ss64.com/osx/paste.html&quot;&gt;&lt;em&gt;&lt;strong&gt;paste&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; will concatenate our 1 file per line into a single space delimited line.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git ls-files --full-name -u | cut -f 2 | uniq | awk &amp;#39;{print &amp;quot;\&amp;quot;&amp;quot;$0&amp;quot;\&amp;quot;&amp;quot;}&amp;#39; | paste -s -d&amp;quot; &amp;quot; -
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should get all the conflicted files, wrapped in quotes, on a single line output.&lt;/p&gt;
&lt;h3&gt;*Now is a good time to check to see that you’re not blowing away work you want to keep.&lt;/h3&gt;
&lt;p&gt;If it all the files are ones you think should be reset, we’re good to go.&lt;/p&gt;
&lt;p&gt;Next, &lt;em&gt;&lt;strong&gt;FILES=$(!!)&lt;/strong&gt;&lt;/em&gt; saves the output of the last command into a variable. We need to do this because &lt;em&gt;&lt;strong&gt;reset&lt;/strong&gt;&lt;/em&gt; will change state and the output of ls-files.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ss64.com/osx/eval.html&quot;&gt;&lt;em&gt;&lt;strong&gt;eval&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; will unwrap our variable and allow us to pass the space delimited list as parameters to our two git commands. In this case, we’ll use &lt;a href=&quot;https://git-scm.com/docs/git-reset#Documentation/git-reset.txt-emgitresetem-qlttree-ishgt--ltpathsgt82308203&quot;&gt;&lt;em&gt;&lt;strong&gt;reset&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; (to unstage and de-conflict) and &lt;a href=&quot;https://git-scm.com/docs/git-checkout&quot;&gt;&lt;em&gt;&lt;strong&gt;checkout&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt; (to discard the changes) against all our conflicted files.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;FILES=$(!!); eval git reset -- $FILES; eval git checkout -- $FILES
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After running the last line, you should be in a state similar to before you started this whole process. You should have your local changes intact (and not staged), your branch up-to-date with origin, and any conflicts blocking the merge will have been discarded.&lt;/p&gt;
&lt;p&gt;the gist: &lt;a href=&quot;https://gist.github.com/kelnishi/7e4973abdef2c55b768f6e61cbc7639f&quot;&gt;https://gist.github.com/kelnishi/7e4973abdef2c55b768f6e61cbc7639f&lt;/a&gt;&lt;/p&gt;
</description>
</item>
<item>
<title>brew install python</title>
<link>https://kelnishi.com/blog/brew-install-python/</link>
<guid>https://kelnishi.com/blog/brew-install-python/</guid>
<pubDate>Mon, 19 Aug 2019 12:00:00 GMT</pubDate>
<description>&lt;p&gt;Using &lt;a href=&quot;https://brew.sh&quot;&gt;homebrew&lt;/a&gt; to install python3 on macOS Mojave required a little bit of permissions juggling.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo install -d -o $(whoami) -g admin /usr/local/Frameworks
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;brew link python
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;via &lt;a href=&quot;https://gist.github.com/irazasyed/7732946#gistcomment-2235469&quot;&gt;this gist&lt;/a&gt;&lt;/p&gt;
</description>
</item>
<item>
<title>macOS terminal color based on current directory</title>
<link>https://kelnishi.com/blog/macos-terminal-color-based-on-current-directory/</link>
<guid>https://kelnishi.com/blog/macos-terminal-color-based-on-current-directory/</guid>
<pubDate>Mon, 22 Jul 2019 12:00:00 GMT</pubDate>
<description>&lt;p&gt;Recently, I’ve had to juggle multiple copies of a git repo because &lt;em&gt;reasons&lt;/em&gt;. This has inevitably led to me accidentally running commands in the terminal in the wrong copy. So, to avoid this, I’ve written a bash profile script that will set my terminal windows to different colors based on the present working directory.&lt;/p&gt;
&lt;p&gt;Here: &lt;a href=&quot;https://gist.github.com/kelnishi/c522a97b43ea42bc50b07b25bf824a0d&quot;&gt;https://gist.github.com/kelnishi/c522a97b43ea42bc50b07b25bf824a0d&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To use it, just stick it into your .bash_profile, then&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://kelnishi.com/assets/macos-terminal-color-based-on-current-directory/Screen-Shot-2019-07-22-at-1.11.07-PM.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;In whatever directory you want to color&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://kelnishi.com/assets/macos-terminal-color-based-on-current-directory/Screen-Shot-2019-07-22-at-1.12.46-PM.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&amp;gt; dircolor “&lt;em&gt;Some Terminal.app color profile&lt;/em&gt;”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://kelnishi.com/assets/macos-terminal-color-based-on-current-directory/Screen-Shot-2019-07-22-at-1.12.57-PM.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;This will place a .window_color turd in that directory.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://kelnishi.com/assets/macos-terminal-color-based-on-current-directory/Screen-Shot-2019-07-22-at-1.13.10-PM.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Now, whenever you are under that directory, the window color will change.&lt;/p&gt;
&lt;p&gt;You can rm .window_color to remove the turd if you no longer want to color the directory.&lt;/p&gt;
</description>
</item>
<item>
<title>F2P and iOS App Piracy</title>
<link>https://kelnishi.com/blog/f2p-and-ios-app-piracy/</link>
<guid>https://kelnishi.com/blog/f2p-and-ios-app-piracy/</guid>
<pubDate>Sat, 31 Jan 2015 12:00:00 GMT</pubDate>
<description>&lt;p&gt;Ahoy! Thar be pirates ahead.&lt;/p&gt;
&lt;p&gt;Recently I shipped a free to play (F2P) game for iPhone titled &amp;quot;&lt;a href=&quot;http://www.jurojin.com&quot;&gt;Jurojin: Immortal Ninja&lt;/a&gt;&amp;quot;. I spent the better part of 2 years building it as a labor of love. And, while it hasn&amp;#39;t reached its ultimate form, it&amp;#39;s well on it&amp;#39;s way to becoming a game I can be proud to say I made. Like many iOS games, Jurojin&amp;#39;s release schedule started with what&amp;#39;s called a soft-launch. It&amp;#39;s a limited release to a few countries where (the plan goes) we gather critical UX data, quash bugs, and prepare for a brighter and bigger worldwide release. User acquisition, marketing, and initial data from the soft-launch went pretty much as we expected. We were getting few to no users without putting dollars into marketing and we were learning what we needed to learn. Then things started picking up.&lt;/p&gt;
&lt;p&gt;The biggest gaming news site to pickup our soft-launch was the excellent &lt;a href=&quot;http://toucharcade.com&quot;&gt;TouchArcade&lt;/a&gt;. With the favorable review and large community, our organic user installs went from about a dozen per day to almost eighty per day while the article was on the front page (the game was only available in Canada mind you). This saved me some marketing budget and boosted my spirits. It also started a nice media snowball. Buzz started to pick up for Jurojin and I decided to release in a few more countries to take advantage of that fact. Vietnam still shows the most external coverage for the game on various vietnamese gaming sites. Various sites and blogs started posting blurbs and adding Jurojin to a bunch of listings and trackers. It was nice.&lt;/p&gt;
&lt;p&gt;I didn&amp;#39;t know it, but the pirates came. They charged in like a 6-year old at the Lego store. Jurojin was still in the glow of new media coverage and I did not know what to expect. When I woke up, I checked my server dashboard, and then I started to dance on the bed. 90 installs in the last half hour! What&amp;#39;s the new user count? 4.13K since last night?!? Check iTC. iTC says there&amp;#39;s only 20 installs yesterday, they&amp;#39;re probably lagging. 4.8K users! Server usage climbing! It keeps going! 24 hours later, we were sitting at almost 6K new users. The next morning, iTC confirmed the worst.&lt;/p&gt;
&lt;p&gt;Of the 6K new users, only 35 had come from the AppStore. Jurojin was being pirated. I think the worst feeling was that these pirates made me feel stupid. A consistent creamy stupid, like a fine cheese. Why would someone steal something that&amp;#39;s already free?! How absurd! But price is not the motivating factor for these pirates. Apps are just hamburger meat for the big hungry beast that is the pirate appstores. This soft-launch decided to let me learn much more than I thought I would.&lt;/p&gt;
&lt;p&gt;If these pirates weren&amp;#39;t so irritating, they&amp;#39;d be downright fascinating. They&amp;#39;re using automated cracking tools (duh) and have sophisticated distribution infrastructures in place. We (miraculously) released a new build of Jurojin just 2 days after the pirate influx. Within 24 hours the new build was already cracked and being distributed. Jurojin has some startup code that disallows old clients from playing and points those players to the App Store to upgrade. During the transition, our new users reverted to legit downloads until the new binary was cracked. Because of the endless stream of Chinese display names, I think I correctly assumed that the pirates were Chinese. So, I released Jurojin in the Chinese App Store. There&amp;#39;s a lot of Chinese people (if you didn&amp;#39;t know) and we got a lot of downloads. More than 300 legit downloads in the first day with zero advertising and no ranking. Was it because of the pirates? I don&amp;#39;t know, but it did give me an opportunity to compare the users.&lt;/p&gt;
&lt;p&gt;The pirates are people. Or, at least they seem to be. Jurojin uses the latest authentication services from Apple and we try to authenticate users&amp;#39; GameCenter logins in order to provide a seamless account creation. The crypto is pretty standard and I&amp;#39;m assuming unbroken. So when I see about 30% of pirates with legit GameCenter logins, I trust that they&amp;#39;re real. Real users, by the way, are about 90% logged into GameCenter. Pirates also seem to see apps as completely disposable. The churn is huge. The fall out rate for our tutorial is over 80% for pirates, with many not even making it more than a few steps past account creation. Some of them do seem to like the game though.&lt;/p&gt;
&lt;p&gt;One of my hobbies (now that the game is live) is to watch the live logs and look at what players are doing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;New User. Haha, this guy died to the low level minion. Somebody opened the store and didn&amp;#39;t buy anything. New User. Core user is training some scrolls. New User. Attempted IAP!! Wait a second...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, the pirates, their tools are pretty good. The automated cracking tools seem to be sophisticated enough to attempt IAP circumvention. Seems pretty obvious: if you don&amp;#39;t have a legit binary you can&amp;#39;t make legit IAP transactions. But, I was a good boy and I studied instead of played. Like I said: Jurojin uses the latest auth services from Apple. And since the game is server-authoritative, all transactions must pass validation from our server code. Server code which validates receipts via a direct connection to Apple. Even if you&amp;#39;ve cracked the Jurojin binary, you&amp;#39;re not getting the content without also reimplementing our fairly sophisticated server infrastructure. But that doesn&amp;#39;t stop the pirates from trying.&lt;/p&gt;
&lt;p&gt;From what I can tell, the jailbroken pirate OS does its best to generate legit-looking receipts in order to try and fool app servers. The receipts are far from perfect but superficially, they look pretty good. I&amp;#39;m guessing that the little bits of bad mojo in the pirate receipt are somehow related to tracking. I imagine that it&amp;#39;s very possible that some poor Chinese pirate paid actual RMB into his pirate OS iPhone to initiate an in-app-purchase. An IAP that our server quickly and correctly denied. Great, but not really.&lt;/p&gt;
&lt;p&gt;This whole piracy situation sucks. It&amp;#39;s sucking costly server bandwidth. It&amp;#39;s sucking my morale. And I don&amp;#39;t know if it will topple my already fragile efforts. I think the thing that gets me down the most is that these pirates are actually trying to use the IAP in our game. Maybe they don&amp;#39;t pay any real money for it. Maybe they pay real money and get nothing in exchange. But they genuinely want to use the features we&amp;#39;ve built... and can&amp;#39;t. I&amp;#39;ve talked about it with other developers and there&amp;#39;s plenty of things I could do to reduce the suck. I could show an avalanche of adwalls to pirates. I could do even tighter restrictions and validation at the server to prevent them from playing. I could do a bunch of clever stuff. But it wouldn&amp;#39;t change the fact that I set out to share an experience with people and that experience is being denied.&lt;/p&gt;
&lt;p&gt;I feel it&amp;#39;s akin to setting up that little table in the supermarket with the free sample weenies. And then somebody hijacks the truck delivering the packaged weenies to the store and drives it off a cliff. On your birthday.&lt;/p&gt;
</description>
</item>
<item>
<title>Peg + Cat Theme Song for Ukulele</title>
<link>https://kelnishi.com/blog/peg-cat-theme-song-for-ukulele/</link>
<guid>https://kelnishi.com/blog/peg-cat-theme-song-for-ukulele/</guid>
<pubDate>Tue, 07 Oct 2014 12:00:00 GMT</pubDate>
<description>&lt;p&gt;My daughter really likes the &lt;a href=&quot;https://www.youtube.com/watch?feature=player_detailpage&amp;v=YhhI6gNPgJg#t=4&quot;&gt;&amp;quot;Peg + Cat&amp;quot; theme song&lt;/a&gt;. She&amp;#39;ll dance to it even if it&amp;#39;s interrupting other shows. So, I thought I&amp;#39;d learn it so I could play along on my ukulele if it comes up.&lt;/p&gt;
&lt;p&gt;However...&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It&amp;#39;s really frickin&amp;#39; hard!&lt;/em&gt; I am almost incensed that a little cartoon girl can play this song like it&amp;#39;s nothing while dancing and frolicking in the woods. &amp;lt;Ahem&amp;gt;&lt;/p&gt;
&lt;p&gt;If you try to pick it apart by ear, you&amp;#39;ll quickly fail because it&amp;#39;s in the uncommon key of Eb. I&amp;#39;d recommend a capo at the 3rd fret. (Peg obviously doesn&amp;#39;t use a capo since she open picks all 4 strings at the start, showoff.) (Speaking of capos...) I used &lt;a href=&quot;http://supermegaultragroovy.com/products/capo/&quot;&gt;Capo3&lt;/a&gt; and &lt;a href=&quot;https://itunes.apple.com/us/app/ukechords/id298774999?mt=8&quot;&gt;UkeChords&lt;/a&gt; to transcribe these verses by hand. My untrained ear says the chords are correct, but feel free to speak up if something sounds off.&lt;/p&gt;
&lt;p&gt;Anyhow, you&amp;#39;re going to want to barre across the 3rd fret with your index finger and use your second and third fingers to hit the Ab and C notes (respectively) in your Ab chord in the riff. I&amp;#39;m really bad at describing strumming patterns, so you&amp;#39;ll have to pick that up on your own.&lt;/p&gt;
&lt;p&gt;For the missing parts, you basically just play the riff or repeat the beginning.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
Peg + Cat Ukulele Accompaniment

Riff (played over most of the song)
Eb  Ab  Eb  Ab  Eb  Eb  Ab  Ab  Eb  Ab
6   6   6   6   6   6   6   6   6   6
3   4   3   4   3   3   4   4   3   4
3   3   3   3   3   3   3   3   3   3
3   5   3   5   3   3   5   5   3   5

Peg  +  Cat brdoo dodododoodoodoo
Eb  Bb7 Eb  Eb  Eb  Ab  Ab  Eb  Ab
6   5   6   6   6   6   6   6   6
3   4   3   3   3   4   4   3   4
3   5   3   3   3   3   3   3   3
3   3   3   3   3   5   5   3   5

Pe~g +  Cat brdoo dodododoodoodoo
F7  Bb7 Eb  Eb  Eb  Ab  Ab  Eb  Ab
3   5   6   6   6   6   6   6   6
1   4   3   3   3   4   4   3   4
3   5   3   3   3   3   3   3   3
2   3   3   3   3   5   5   3   5

You&amp;#39;re the Best!
Eb     Eb    Eb
8      8     8
10     10    10
10     10    10
10     10    10

We Are Two~  Nana nana na~
Eb  Eb  Eb-  Eb7  Eb7  Eb7
6   6   6    44   44   4
3   3   3    33   33   3
3   3   3    33   33   3
3   3   3    33   33   3

Me  +   You~  Nana nana na~
Ab  Ab  Ab-  Eb7  Eb7  Eb7
3   3   3    66   66   6
4   4   4    66   66   6
3   3   3    77   77   7
5   5   5    66   66   6
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;video&quot;&gt;&lt;iframe src=&quot;https://www.youtube-nocookie.com/embed/YhhI6gNPgJg&quot; title=&quot;YouTube video&quot; loading=&quot;lazy&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
</description>
</item>
<item>
<title>A Quick Reminder for Parents</title>
<link>https://kelnishi.com/blog/a-quick-reminder-for-parents/</link>
<guid>https://kelnishi.com/blog/a-quick-reminder-for-parents/</guid>
<pubDate>Fri, 03 Oct 2014 12:00:00 GMT</pubDate>
<description>&lt;p&gt;In a minute I want you to close your eyes. (If I were there, I&amp;#39;d ask you to close them now)&lt;/p&gt;
&lt;p&gt;Stop and think back as far as you can to your childhood. Try to remember this feeling: The feeling of being held and hugged by your mom or dad. The warm embrace that wraps around you, lifts you, and settles behind your nose.&lt;/p&gt;
&lt;p&gt;It&amp;#39;s probably a distant memory.&lt;/p&gt;
&lt;p&gt;But, you can feel it again. It&amp;#39;s the same feeling you feel hugging your child.&lt;/p&gt;
&lt;p&gt;ok, go.&lt;/p&gt;
</description>
</item>
<item>
<title>On switching to/from iPhone/Android:</title>
<link>https://kelnishi.com/blog/on-switching-tofrom-iphoneandroid/</link>
<guid>https://kelnishi.com/blog/on-switching-tofrom-iphoneandroid/</guid>
<pubDate>Fri, 26 Sep 2014 12:00:00 GMT</pubDate>
<description>&lt;p&gt;You&amp;#39;re going to end up liking it, but not because it&amp;#39;s better.&lt;/p&gt;
&lt;p&gt;If you are like most people, you&amp;#39;ll upgrade your subsidized phone every 2 years. In those 2 years, all top-of-the-line phones will become faster and prettier than whatever you have. If you decide to switch, you&amp;#39;ll immediately see how much faster and prettier your new phone looks than your old phone and your irrational self will declare &amp;quot;This is better!&amp;quot; Except...&lt;/p&gt;
&lt;p&gt;Somethings will be painful. You might lose all your apps. You might have to get used to a different UI. You might not be able to export your contacts. You might lose your unlimited data plan. There will be annoyances. But, these annoyances are the reason you will like your new phone more than the last one. It&amp;#39;s not the faster, prettier. It&amp;#39;s the pain. You&amp;#39;ll have no choice but to deal with these things. Your brain will rewire neurons and adapt (like a good human brain) and you&amp;#39;ll expend effort and energy to conquer these annoyances. And in short order (much less than 2 years), you will master them. And that&amp;#39;s where you become attached.&lt;/p&gt;
&lt;p&gt;The fancy new thing you got wasn&amp;#39;t a new phone. It was a new skill. How to accept and work around the new annoyances. And you&amp;#39;ll like it. Every time you dodge a pitfall, every time you become more efficient, your brain releases endorphins to strengthen the neural pathways. It feels good. And because those things you learned with your first phone are disused, the good and bad, they will become unrewarding and unimportant. You&amp;#39;ll do this every day, or as often as you use your new phone.&lt;/p&gt;
&lt;p&gt;Then one day, you&amp;#39;re finally invested in the new phone. You like it and you can wrongly describe why. You&amp;#39;ve got synergy and efficiency and you&amp;#39;ve forgotten the pain on the path that brought you here.&lt;/p&gt;
&lt;p&gt;And in 2 years, any numerical or feature superiority that might have factored into your decision to switch will be gone. Your phone will be mediocre again. But that&amp;#39;s ok. You&amp;#39;ll still like it. You now have a brain that likes it, warts and all.&lt;/p&gt;
&lt;p&gt;So, just come back and reread this in 2 years. Because
I told you so.&lt;/p&gt;
</description>
</item>
<item>
<title>Let's try this again.</title>
<link>https://kelnishi.com/blog/lets-try-this-again/</link>
<guid>https://kelnishi.com/blog/lets-try-this-again/</guid>
<pubDate>Fri, 25 Jul 2014 12:00:00 GMT</pubDate>
<description>&lt;p&gt;Social media really has obviated the need for a blog. I really feel like I should publish content though. Better than letting the dream die, right?&lt;/p&gt;
</description>
</item>
</channel>
</rss>
