prodissueshttp://prodissues.com/2019-03-09T21:51:00-05:00The Right Sequence of Communication2019-03-09T21:51:00-05:002019-03-09T21:51:00-05:00yanivtag:prodissues.com,2019-03-09:/2019/03/the-right-sequence-of-communication.html<p>Talk, think, listen ✖️</p>
<p>Talk, listen, think ✖️</p>
<p>Listen, talk, think ✖️ </p>
<p>Listen, think, talk ✔️</p>
<p>Think, talk, listen ✖️</p>
<p>Think, listen, talk ✔️</p><p>Talk, think, listen ✖️</p>
<p>Talk, listen, think ✖️</p>
<p>Listen, talk, think ✖️ </p>
<p>Listen, think, talk ✔️</p>
<p>Think, talk, listen ✖️</p>
<p>Think, listen, talk ✔️</p>iPhone X - Not Yet2017-10-28T23:09:00-04:002017-10-28T23:09:00-04:00yanivtag:prodissues.com,2017-10-28:/2017/10/iphone-x-not-yet.html<p>I received the long awaited email - the iPhone X is available for pre-order! It’s time to replace my old iPhone 6. Or is it…? I was about to pre-order, but decided to wait.</p>
<p>Since reading the book <a href="https://www.goodreads.com/book/show/25980294-deep-work">Deep Work</a> I’m on a “distraction diet”. It means that, among …</p><p>I received the long awaited email - the iPhone X is available for pre-order! It’s time to replace my old iPhone 6. Or is it…? I was about to pre-order, but decided to wait.</p>
<p>Since reading the book <a href="https://www.goodreads.com/book/show/25980294-deep-work">Deep Work</a> I’m on a “distraction diet”. It means that, among other things, I use my phone <strong>only</strong> when I truly need to. <a href="https://www.theverge.com/2016/4/18/11454976/apple-iphone-use-data-unlock-stats">Apple says</a> that on average we unlock our phones 80 times a day. I probably unlocked mine twice as many time before, but do much less now. It turns out I don't need my phone <em>that</em> often. Here’s what I <em>do</em> use it for: </p>
<ul>
<li>Take or make a call </li>
<li>Check my calendar (Apple calendar) </li>
<li>Check or create todos (Omnifocus) </li>
<li>Log baby related stuff<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup> (BabyConnect) </li>
<li>Check the weather (Apple weather) </li>
<li>Text, WhatsApp and slack </li>
<li>Take pictures</li>
</ul>
<p>Not much use, and it definitely not warrants a 1099/$ new phone.</p>
<p>But the truth is my phone doesn’t work great. I mean, it looks new, but doesn’t function as one. I'm using iOS 11, which apparently doesn’t play well with iPhone 6. My phone is slow. It hangs and lags frequently, mainly when I open iMessage or the camera app. It also has some serious battery issues. I might say that I have more than 50% battery, but a second later the battery drops to 13%. Another minute and my phone shuts off. Moreover, to make it through the day, I need to charge it at least twice.</p>
<p>And yet, I’m reluctant to give up on it. I don’t like the conditioning of buying a new iPhone just because mine is 2 years old, and want out of the Apple marketing machine. More importantly, I don’t want to risk my “distraction diet”.</p>
<p>So, I’m making an attempt to revive my iPhone. My strategy:</p>
<h3>Remove apps</h3>
<p>I’m going to remove every app I don't use on a daily basis. I will keep “rescue” apps, which I don’t use often but rely on in case of emergency. For example Uber.</p>
<h3>Factory reset</h3>
<p>If removing apps won’t get my phone to better behave, I’m going to do a hard reset. That will downgrade me to iOS 10 (or even 9), which I hope will be more usable.</p>
<p>I acted on step 1, and removed most of the apps I had on my phone. It looks slimmer, but will it also act that way? Here's the before and after of my home screen:</p>
<p><img alt="My lean iPhone" src="http://media.prodissues.com/images/2017/10/composition_portrate_1.jpeg"></p>
<p>Feel free to make other suggestion in the comments. I’ll update this post with more findings, on performance, battery and next steps.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>My wife and I track every bottle and every diaper of our little one… <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Call me Ishmael2017-09-25T12:05:00-04:002017-09-25T12:05:00-04:00yanivtag:prodissues.com,2017-09-25:/2017/09/call-me-ishmael.html<p>How timely... yesterday I finished <a href="https://www.goodreads.com/book/show/27742061-moby-dick">the book</a>, and today Dropbox Paper already greeted me with this prompt:<img alt="Call-me-Ishmael" src="http://media.prodissues.com/images/2018/04/Screen-Shot-2017-09-25-at-11.54.22-AM.png"></p>
<blockquote>
<p>"It was the devious-cruising Rachel, that in her retracing search after her missing children, only found another orphan."</p>
</blockquote><p>How timely... yesterday I finished <a href="https://www.goodreads.com/book/show/27742061-moby-dick">the book</a>, and today Dropbox Paper already greeted me with this prompt:<img alt="Call-me-Ishmael" src="http://media.prodissues.com/images/2018/04/Screen-Shot-2017-09-25-at-11.54.22-AM.png"></p>
<blockquote>
<p>"It was the devious-cruising Rachel, that in her retracing search after her missing children, only found another orphan."</p>
</blockquote>Product Leader's First 100 Days Plan2017-09-12T01:06:00-04:002017-09-12T01:06:00-04:00yanivtag:prodissues.com,2017-09-12:/2017/09/the-first-100-days-in-a-product-leadership-role.html<p>Asking a candidate for a 100 days plan apparently <a href="https://www.forbes.com/sites/georgebradt/2016/07/27/want-the-job-bring-a-100-day-action-plan-to-the-interview/">becomes the norm</a>. As for me, I'm part of this norm. During the final steps in my recruiting process to <a href="http://www.usebutton.com">Button</a>, I created such 30/60/90 days plan.</p>
<blockquote>
<p>“By failing to prepare, you are preparing to fail.”<br>
― <a href="https://www.goodreads.com/author/show/289513.Benjamin_Franklin">Benjamin Franklin</a></p>
</blockquote>
<p>Drafting …</p><p>Asking a candidate for a 100 days plan apparently <a href="https://www.forbes.com/sites/georgebradt/2016/07/27/want-the-job-bring-a-100-day-action-plan-to-the-interview/">becomes the norm</a>. As for me, I'm part of this norm. During the final steps in my recruiting process to <a href="http://www.usebutton.com">Button</a>, I created such 30/60/90 days plan.</p>
<blockquote>
<p>“By failing to prepare, you are preparing to fail.”<br>
― <a href="https://www.goodreads.com/author/show/289513.Benjamin_Franklin">Benjamin Franklin</a></p>
</blockquote>
<p>Drafting this plan was one of the better ways I could prepare for the
new role. It helped me in both setting better expectations for myself,
as for what will be expected of me in those first 3 months, and set a
cadence for progress and execution, right from day one.</p>
<p>As I'm about to hit the first 30 days mark, its time to revisit this
plan, and see where I stand against it. Doing so, I've figured it might
be a good idea to share my plan. Hopefully someone finds it helpful,
and/or share their own ideas.</p>
<!--more-->
<p>There are two perspectives through which I think of the different time
horizons in that exercise:</p>
<ul>
<li>Learn, plan, execute</li>
<li>Influence myself, my team, the company</li>
</ul>
<p>Here's a <a href="https://docs.google.com/document/d/1h-0g8ZenD578LlUsCkJ1ndxjX1ovh3o7mn1EdGy5qcE/edit?usp=sharing">google doc version</a> of the plan. Feel free to comment, just make sure to add your name to the comment.</p>
<hr>
<h1><strong>THE FIRST 100 DAYS</strong></h1>
<h2><strong>0-30 Days - LEARN</strong></h2>
<h3><strong>Product</strong></h3>
<p>(Repeat the below for each product.)</p>
<ul>
<li>What does it do?</li>
<li>What problems/needs does it solve?</li>
<li>How does it work?</li>
<li>What's the value proposition?</li>
<li>Business model</li>
<li>Set of features</li>
<li>Current roadmap (icebox, long-term planning, short term backlog)</li>
<li>How it's measured?</li>
<li>Tech stack</li>
<li>Open issues and bugs</li>
<li>Stakeholders</li>
<li>How integration, management and maintenance processes look like?</li>
</ul>
<h3><strong>The market</strong></h3>
<ul>
<li>Partners/Customers/Users<ul>
<li>Top partners</li>
<li>Type of partners</li>
</ul>
</li>
<li>Representative personas within partners’ organizations</li>
<li>GTM strategy and process</li>
<li>Product positioning</li>
<li>Are there product commitments to future/new/existing partners?</li>
<li>Competitive landscape</li>
</ul>
<h3><strong>Current product/market fit</strong></h3>
<ul>
<li>Are there any gaps between the market needs and the current products and features?</li>
<li>Sales/BD pipeline<ul>
<li>Are there new types of customers in the pipeline?</li>
<li>Are the needs of future customers match current product (+ roadmap items)?</li>
<li>Is there an alignment between the sales pitch to current products (or features that are WIP)?</li>
</ul>
</li>
</ul>
<h3><strong>Company culture</strong></h3>
<ul>
<li>How things work - structure, functions, teams, pods</li>
<li>Meet the people</li>
<li>Internal lingo</li>
<li>What people like (/don't like) about the product and development process?</li>
<li>How product vision and roadmap are being communicated? where/how are they tracked?</li>
</ul>
<h3><strong>Current definition of the PM role</strong></h3>
<ul>
<li>Current definition of product management</li>
<li>Scope of ownership and responsibility of product</li>
<li>What from the above is currently missing? (assuming there are no full time PMs in pods)</li>
</ul>
<h3><strong>Product team</strong></h3>
<ul>
<li>Current plans and open heads</li>
<li>Job description</li>
<li>Hiring pipeline and status</li>
<li>Meet relevant candidates</li>
<li>Scope ownership<ul>
<li>Manager/Me</li>
<li>PMs to products (depends on products’ definitions)</li>
</ul>
</li>
</ul>
<h3><strong>Product Development Process</strong></h3>
<ul>
<li>What's the process today?<ul>
<li>What works?</li>
<li>What doesn't work?</li>
</ul>
</li>
<li>How involved team members are in sprint planning</li>
</ul>
<h3><strong>Tools</strong></h3>
<ul>
<li>What tools are used today?</li>
<li>Who are the users of the tools?</li>
<li>How product vision, strategy, roadmap, and WIP is communicated? how transparent is it?</li>
</ul>
<hr>
<h2><strong>31 - 60 Days - PLAN</strong></h2>
<p>Based on the first 30 days, the goal in this stage is to set the framework for the product team, product development process, and complete a strategic product plan.</p>
<h3><strong>Products/Market</strong></h3>
<ul>
<li>Clear definition of products' suite</li>
<li>Levers for growth</li>
<li>Definition of customers and needs</li>
<li>Definition of user personas</li>
<li>Prioritize and start building a roadmap</li>
<li>Goals and KPIs</li>
</ul>
<h3><strong>Product Team</strong></h3>
<ul>
<li>Define the value of Product Management to the company, and to product development</li>
<li>Define the goal of the team (Maximize business results through product solutions that meet both market needs and company goals)</li>
<li>PM hiring process</li>
<li>100-days plan - onboarding process for new PM</li>
<li><a href="https://www.goodreads.com/review/list/4819618-yaniv?shelf=product">List of "must" read books for PM</a></li>
<li>Personal growth and mentorship program</li>
</ul>
<h3><strong>Product Development Process</strong></h3>
<ul>
<li>Write a "product development
manifesto"</li>
</ul>
<hr>
<h2><strong>61 - 100 Days - EXECUTE</strong></h2>
<p>Goal of these phase is to start
executing against the plans.</p>
<h3><strong>Product Team</strong></h3>
<ul>
<li>Product offsite (assuming most of
team hired). Reach clarity, team buildup.</li>
<li>Split of ownerships and
responsibilities</li>
</ul>
<h3><strong>Product Development Process</strong></h3>
<ul>
<li>Team training and starting to work
according to the planned process</li>
</ul>
<hr>
<h2><strong>Reference</strong></h2>
<ul>
<li><a href="https://blog.intercom.com/how-we-build-software/">Lessons learned from scaling a product team</a>, Paul Adams ,VP Of Product, Intercom</li>
<li><a href="https://www.slideshare.net/anthonymitchell3/product-management-90-day-plan">Product Management 90 Day Plan</a>, By Anthony Mitchell, Jul 2014</li>
<li><a href="https://www.bcg.com/documents/file14030.pdf">Assuming Leadership: The First 100 Days</a>, BCG</li>
<li><a href="http://web.stanford.edu/class/ee204/ProductMarketFit.html">Product/Market Fit</a>, by Marc Andreesen, June 25, 2007</li>
<li><a href="http://pragmaticmarketing.com/resources/5-steps-to-building-a-great-product-management-organization">5 Steps to Building a Great Product Management Organization</a>, By Saeed Khan September 27, 2010</li>
<li><a href="https://www.inc.com/katherine-barr/the-art-of-hiring-employees-who-fit-right-in.html">How to Build a Killer Product Team</a>, By Katherine Barr</li>
<li><a href="https://crew.co/blog/how-to-structure-your-team/">How to properly structure your growing product team</a>, By Angus Woodman, August 17, 2016</li>
<li><a href="http://www.thisisproductmanagement.com/episodes/building-a-customer-driven-product-team-is-product-management">Building a Customer-Driven Product Team is Product Management</a>, This is product management podcast,Ep.052, with David Cancel, CEO of Drift</li>
</ul>Time To Move On2017-08-03T14:00:00-04:002017-08-03T14:00:00-04:00yanivtag:prodissues.com,2017-08-03:/2017/08/its-time-to-move-on.html<p>Tomorrow will be my last day at Outbrain. Here's my goodbye note.</p>
<blockquote>
<p>Hi all, </p>
<p>Tomorrow will be my last day at Outbrain.</p>
<p>I'd like to thank you for being such an important part of my life for the last (almost) 5 years. </p>
<p>As there's rarely a single feature that makes …</p></blockquote><p>Tomorrow will be my last day at Outbrain. Here's my goodbye note.</p>
<blockquote>
<p>Hi all, </p>
<p>Tomorrow will be my last day at Outbrain.</p>
<p>I'd like to thank you for being such an important part of my life for the last (almost) 5 years. </p>
<p>As there's rarely a single feature that makes a killer product, but rather a combination of capabilities, orchestrated in just the right way to help a user solve a need, the same is true now, when I look to thank the people who've shaped my experience at Outbrain. I can't mention just one or several people, because it's the collection of you all, creating a truly unique culture and atmosphere that makes that company so special. </p>
<p>I'm thankful for the privilege to work with and learn from you!</p>
<p>Keeping in touch with many Outbrain alumni, I know that I can leave Outbrain, but the Outbrain will never leave me :)</p>
<p>So please don't hesitate to keep in touch and reach out! I'll be a click of a <a href="http://usebutton.com"><em>button</em></a> away.</p>
<p>Thanks. Yaniv</p>
</blockquote>Comics And How Did I Get There2017-01-21T22:05:00-05:002017-01-21T22:05:00-05:00yanivtag:prodissues.com,2017-01-21:/2017/01/bread-crumbs-of-the-learning-rabbit-hole.html<p><a href="http://rosenfeldmedia.com/books/see-what-i-mean/">How to Use Comics to Communicate
Ideas</a> - now wait. How
did I get here...?</p>
<p>Too often will I find myself somewhere, reading something that is
completely unrelated to what I do or like doing. I will try to retract
the steps that led me to that spot, usually with no …</p><p><a href="http://rosenfeldmedia.com/books/see-what-i-mean/">How to Use Comics to Communicate
Ideas</a> - now wait. How
did I get here...?</p>
<p>Too often will I find myself somewhere, reading something that is
completely unrelated to what I do or like doing. I will try to retract
the steps that led me to that spot, usually with no successes. I'm at
the same situation now, but am determined to go back and log the
breadcrumbs of exploration that led me to, of all things, comics. I
never read comics, and weren't interested in it. And now I'm about to
buy a book teaching how to use it to communicate ideas. So here's how I
got here.</p>
<p>About a month ago, I started to work on this <a href="https://www.messenger.com/t/1800370993514871">Messenger
App</a>. Initially, I did the
development work. I used python and flsk to build a server that acted as
the back-end of the service. Later, a friend joined me. He is a much
more experienced developer, and over time became the lead developer in
the project. I did more of the product work - spec'ing and prioritizing
as well as building the front-end of the bot, using
<a href="https://chatfuel.com">Chatfuel</a> as the CMS.</p>
<p>We needed a designer, and thought to hire a freelancer. We also wanted
to experiment with the concept, because we think of it as a way to scale
ourselves cheaply. I used <a href="https://www.guru.com/">Guru</a> to find
designers.</p>
<p>To hire a designer, a freelancer, I needed examples of the design work
and styles that I'm looking for. And so I started to create them.</p>
<p>I started with <a href="https://inkscape.org">Inkscape</a>. In addition, I
downloaded Sketch and illustrator for a trial period. The latter two
didn't stick at the beginning, and since I learned to use Inkscape
quickly, I didn't need them.</p>
<p>I learned Inkscape mainly through YouTube. I wasn't familiar not only
with the app, but also illustration and vector graphic. I never really
understood bezier, or how to use it. But now I started to, and realized
the potential of vector graphics.</p>
<p>As I learned more, I was drowning more and more into the design world. I
started to think colors and see shapes. I made more and more
illustrations of cloth items. (<a href="http://prodissues.com/2016/12/some-illustration-fun.html">here
are</a> few
examples.)</p>
<p>The designers I hired on Guru didn't work out. One resigned after I
hired her, because she didn't feel comfortable with material design. The
other submitted a horrible first draft, and I stopped the project short.
And since I started to have a lot of fun creating the illustrations
myself, I decided to keep doing it and complete the design work for v1
of the product.</p>
<p>I produced tens of items, and while doing so started to develop a design
language for the app. (I was inspired by <a href="https://www.youtube.com/watch?v=ygk_pIBrMZA&list=FL9kscMXqi9gccvZkeWyKRJg&index=1&t=922s">this
video</a>.)</p>
<p>Once I had the items, I moved to compose the outfits for the different
genders and weather conditions. While Inkscape is great, it's not as
good when it comes to layout design. And so I tried Sketch and
Illustrator again.</p>
<p>At that point I already made a lot of progress learning vector design,
and started to get comfortable with the design workflow. And while I
still didn't get how to use Illustrator, working with Sketch was fun and
flawless. In less than two days I completed the full sets of outfits.</p>
<p>I got totally excited about design, and felt that I can actually do it
in a more serious way. And it that's the case, then I must learn Adobe
Illustrator, the gold standard for graphic design.</p>
<p>I started to read a ton of blog posts and tutorial. I watched many
YouTube videos. And I started to see the power of Illustrator, and the
endless capabilities it allows. Just two examples for features I wished
for when working with Inkscape:</p>
<ul>
<li>Illustrating fur. <a href="https://www.youtube.com/watch?v=LNhxVWBnDsY">Here's a
video</a> of how to do it
in Illustrator.</li>
<li>Color refactoring - I needed to design for both boys and girls.
Since the focus at the initial version was on newborns, all I needed
to do, in most cases, was to simply change the color scheme of an
item, to make is "girlish" or "boyish". It took about 30 minutes in
Inkscape, manually changing the colors. In illustrator, there's a
color refactoring function, that lets me create as many colors from
the same item in seconds.</li>
</ul>
<p>So Illustrator rocks. I need to learn it, and maybe I should do it in a
structured course, rather than reading sporadic tutorial. A designer
friend recommended Lynda, but I eventually signed up to 5 classes in
Udemy (they had the January promotion, when all classes were only 10\$
each, so I added to my cart whatever had illustrator in the title...).</p>
<p>I started with <a href="https://www.udemy.com/adobe-illustrator-cc-tutorial/learn/v4/content">Adobe Illustrator CC Tutorial - Training Taught By Experts</a>.
A 12 hours course, that spans across 132 episodes. I completed it in less than a week. I continued to <a href="https://www.udemy.com/learn-to-draw-fashion-with-adobe-illustrator-cc-beginners/learn/v4/content">Learn to draw fashion with Adobe Illustrator CC - Beginners</a><sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>.</p>
<p>While taking the courses, and getting deeper into Illustrator, I started
to feel strongly about creating, painting and making illustrations. I
bought an <a href="http://www.wacom.com/en-es/products/pen-tablets/intuos-pro">Intous Pro
tablet</a>,
because I thought it will open me to digital art, and make the design
process more efficient and much more enjoyable. I was right, and not
only that, but using the Intous, I got even more eager to create. I
wanted to replicate as much as possible the the physical sensation of
sketching on paper.</p>
<p>And that's were I started to contemplate on buying an iPad pro with a
pencil... It took one day since I started playing with that idea till
when I got one... a classic impulsive buy (though I bought a used one.)</p>
<p>The experience with the iPad, though I have it for less than a week, is
amazing. I carry it with me everywhere, and find myself sketching when
ever I have few minutes, such as when sitting in a cafe for lunch. I use
it to also take notes, and can see how it replaces my pen and notebook
that I love so much.</p>
<p>And so, as I start to express myself visually, I want to, well, learn
how to do it better. I'm writing a spec for one of the projects I'm
working on at Outbrain, and thought that a storyboard that illustrates
user stories might be a good way to convey my thoughts and the user
flows I had in mind. And so I started to read about using storyboards
for product design. <a href="https://uxmag.com/articles/storyboarding-in-the-software-design-process">One of the articles I
read</a>
led me to this book. And that's were I paused, and started to write this
post.</p>
<p>I was never interested in comics, let alone creating them. But for some
reason, I have a strong feeling that that's going to change very soon...</p>
<p>Can't wait for the next learning adventure.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>I have 3 more in the queue: <a href="https://www.udemy.com/learn-to-draw-fashion-with-adobe-illustrator-cc-intermediate/learn/v4/">Learn to draw fashion with Adobe Illustrator CC Intermediate</a>, <a href="https://www.udemy.com/icondesign/learn/v4/">Icon Design - Material Design Mastered in Illustrator</a> and <a href="https://www.udemy.com/logodesign/learn/v4/">Logo Design in Illustrator - for Beginners &
Beyond</a>. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Illustrations - v22017-01-19T22:57:00-05:002017-01-19T22:57:00-05:00yanivtag:prodissues.com,2017-01-19:/2017/01/illustrations-v2.html<p>In an <a href="http://prodissues.com/2016/12/some-illustration-fun.html">earlier post</a> I shared some of my illustrations for <a href="http://m.me/1800370993514871">Baby Weatr</a>, a Messenger app that helps parents chose an outfit for their newborn baby based on the weather. As I gained more experience in illustrations (note: I'm not a designer), a style started to emerge. Here are the …</p><p>In an <a href="http://prodissues.com/2016/12/some-illustration-fun.html">earlier post</a> I shared some of my illustrations for <a href="http://m.me/1800370993514871">Baby Weatr</a>, a Messenger app that helps parents chose an outfit for their newborn baby based on the weather. As I gained more experience in illustrations (note: I'm not a designer), a style started to emerge. Here are the outcomes of the second iterations.</p>
<p>I created most of those illustrations in <a href="http://inkscape.org">Inkscape</a>, while transitioning to <a href="http://www.adobe.com/products/illustrator.html">Illustrator</a>. Finally, I then used <a href="https://www.sketchapp.com">Sketch</a> to create complete outfits (see example at the bottom of this post).</p>
<p>These are the styles we're using in the app:</p>
<p>[gallery
ids="1062,1064,1065,1066,1067,1069,1070,1071,1072,1073,1074,1075"]</p>
<p>And here's how items then added to a complete outfit:
<img alt="Girl 20f-less" class="alignnone size-large wp-image-1060" height="751" src="http://prodissues.com/wp-content/uploads/2017/01/Girl-20f-less-900x1024.png" width="660"></p>What I've Been Working On Lately - Recap2017-01-11T23:40:00-05:002017-01-11T23:40:00-05:00yanivtag:prodissues.com,2017-01-11:/2017/01/recape-of-the-last-couple-of-months.html<p>I didn't write for a while<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>. And it's not that nothing had happened. The opposite... so much learning and new experiences that I didn't find the time to log. No, it's not a lack of time, but rather not internalizing how important it is to stop, asses and capture …</p><p>I didn't write for a while<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>. And it's not that nothing had happened. The opposite... so much learning and new experiences that I didn't find the time to log. No, it's not a lack of time, but rather not internalizing how important it is to stop, asses and capture what I'm learning as I go.</p>
<p>But it's better done late than never<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>. So here's a list of projects I've been working on, in no particular order, followed by the list of new skills I've learned.</p>
<h2>Projects</h2>
<h3>Outbrain News Brief for Alexa</h3>
<p>This is a simple skill for Alexa, that reads summaries of top news stories. So as a user, you have to add this skill to Alexa, and can then ask Alexa "what's in the news". Alexa then calls a web service, which I developed. This web-service calls Outbrain and ask for the latest news (using the <a href="https://developers.sphere.com">Sphere platform</a>). It then sends the articles it gets from Outbrain to a summation service (<a href="https://www.agolo.com/">Agolo</a>), and returns them back to Alexa, which then reads the summaries to the user.</p>
<h3>Outbrain skill for Alexa</h3>
<p>Similar to the skill above<sup id="fnref-3"><a class="footnote-ref" href="#fn-3">3</a></sup>, but with more functionality. This is actually the initial stage of a conversational experience, where users will be able to interact with Alexa to get personalized news stories. So users will be able to guide Alexa through conversation to article from site, or on topic they are interested in, or discover new content based on their interest graph. Here's a simple sequence diagram that illustrating the current user flow:</p>
<p><img alt="sequence-diagram.jpg" src="http://media.prodissues.com/images/2017/01/sequence-diagram.jpg"></p>
<h3>My Clipboard</h3>
<p><img alt="alexa-clipboard-icon.png" src="http://media.prodissues.com/images/2017/01/alexa-clipboard-icon.png"></p>
<p>Now that's where things become more interesting, working on my stuff... This is a skill for Alexa that serves as your clipboard. You can say" Alexa, ask my clipboard to remember 212 322 4432" and she'll remember this phone number for you. "Alexa ask my clipboard what's in my clipboard" (yeah, redundant, I know...) and she'll repeat the phone number for you.</p>
<p>Why is it helpful? imaging that you're on the phone and can't take a note, or fine a pen to write one down... let Alexa handling it for you... But if you think about a smarter clipboard, one that takes keys and values, you can do much more interesting stuff. For example, ask Alexa to remember that you put your passport in the top drawer. Later on, you can ask her where did I put the passport. But that's a longer term functionality... I first need to finish the current iteration and get it public (it's not at the time of writing this...).</p>
<h3><a href="http://m.me/1800370993514871">Baby Weatr</a></h3>
<p><img alt="Artboard_1v2.png" src="http://media.prodissues.com/images/2017/01/Artboard_1v2.png" width="150px"></p>
<p>Baby Weatr is a Facebook Messenger app<sup id="fnref-4"><a class="footnote-ref" href="#fn-4">4</a></sup> that helps parents decide how to dress their kids appropriately for the weather. Well, it designed around my lack of any skill to translate weather into baby wear. So to make sure I'm not endangering our daughter, I decided to build this decision support app.</p>
<p>I'm working on it together with a friend, but this was an opportunity to tie together a lot of the things that I like, and always wanted to use more, such as coding and design<sup id="fnref-5"><a class="footnote-ref" href="#fn-5">5</a></sup>. Initially we tried to outsource the design work, but working with chip freelancers produced deliverable at the quality we paid for, meaning bad. On the other hand, hiring capable designer is expensive. So, I decided to hone on the opportunity to connect with the right side of my brain, and design the first version of the app myself.</p>
<p>Baby Wear is live on Messenger now, so if you need help dressing up your baby - I would love to get your feedback...</p>
<p><a href="https://m.me/1800370993514871?ref=Welcome">Try Baby Weatr</a></p>
<h3><a href="https://yanivgilad.wordpress.com">Dlog</a></h3>
<p>While working on the projects above, I did quite a bit of coding. What's
more, this time I coded almost professionally (some of what I built is
going to be used by my company...).</p>
<p>I found that I need to log what I'm doing, so I can backtrack if needed, and won't make the same mistakes twice. I found that it also accelerated my learning (similar to how writing does...). Git commit, or inline commenting weren't enough, as I wanted to capture not only the outcome of my thinking, research, trail and error and refactoring. But rather, I wanted to put capture my deliberations and place bread crumbs as I go. I wanted to be able to read back and understand why I made certain decisions. For example, why I selected one data structure and not another, how do I start a flask project, and how do I run a flask app and make it reload every time I make a change.</p>
<p>And so I started to maintain a file called development log, or dlog. I keep it open as part of my workspace and include it in my git repository. Here's an example of how it looks like (the dlog is in the bottom right quadrant):</p>
<p><img alt="dlog view in emacs" src="http://media.prodissues.com/images/2018/04/screen_shot_2016-11-29_at_12_50_16.png"></p>
<p>I thought that might be something that other developers find helpful, and put it on a separate blog (<a href="https://yanivgilad.wordpress.com">here</a>). I'm contemplating with the idea of opening this blog for others, with the assumption that if many developers log their process, it will serve as a new form of knowledge repository, stack-overflow extension, or companion to readme documentation.</p>
<h2>Things I've learned</h2>
<h3>~~Chatbots~~ Messenger Apps</h3>
<p>Well that's not new for me... my team is dedicated to messaging apps for awhile now. I think I mentioned before that we're responsible for the CNN app on Messenger and Kik, as well as for the apps of other notable publishers. What I <em>did</em> learn is how to view these type of apps as the best way to develop an MVP, and how you can build a full experience with building blocks, and minimum amount of code, or back-end services.</p>
<p>I'm used Chatfuel<sup id="fnref-6"><a class="footnote-ref" href="#fn-6">6</a></sup> as the content management system for the Baby Weatr app, and love the way I can control the behavior of the app, and build it to match the way I'm thinking about flows. Here's how the Baby Weatr app looks like within Chatfuel: <img alt="chatfuel-baby-weatr.png" src="http://media.prodissues.com/images/2017/01/chatfuel-baby-weatr.png"></p>
<h3>Assistant devices</h3>
<p>Assisted device are the conversational version of messenger apps. Here, a user can interact with a device with voice, rather than with text. I've been working with Alexa on the skills I mentioned above. I also experimented with Google Home, and their api.ai platform.</p>
<p>I think that these experiences are the real revolution in AI and conversational design, and messaging apps, or chatbots are just a stop in the way. I suspect that FB is going to kill their (less than) year old platform, and bet on live video, VR and maybe voice recognition. Right now the messenger apps are like a ghost town, Much more to say about that, and about what messenger apps <em>are</em> good for (hint: MVP). I'll keep that to another post.</p>
<h3>Python</h3>
<p>Python isn't new to me. I use it occasionally to write scripts to streamline my workflows, or automate tedious manual work. (<a href="https://automatetheboringstuff.com">Automate the Boring Stuff with Python</a> was the book that got me started with python. Highly recommended.)</p>
<p>But this is the first time I've used python for real products and services. Using it more intensely I've learned how friendly the language is, and how well it fits the way I think about code. I wrote so much, that even google took note, and invited my to the google coding challenge<sup id="fnref-7"><a class="footnote-ref" href="#fn-7">7</a></sup>, mistaking me with a real developer :-).</p>
<p><img alt="google-code-challange.jpg" src="http://media.prodissues.com/images/2017/01/google-code-challange.jpg"></p>
<h4>Flask</h4>
<p>That's the backbone of almost every one of the projects I listed above. <a href="http://flask.pocoo.org">Flask</a>, and it's Alexa extension - <a href="https://alexatutorial.com/flask-ask/">Flask-Ask</a>, are super easy and intuitive packages that help creating web services. I created a template (TODO: push this template to GitHub) and I use it as a starting point with new projects.</p>
<h3>Design</h3>
<p>Now, that were my passion is at these days. I've just finished a 12h <a href="https://www.udemy.com/adobe-illustrator-cc-tutorial/learn v4/">Illustrator course</a> in Udemy, and in the middle of a... <a href="https://www.udemy.com/learn-to-draw-fashion-with-adobe-illustrator-cc-beginners/learn/v4/">Illustrator 4 Fashion</a> class. All I think about are shapes and colors, and how I can make them in Adobe Illustrator, my hands are glued to the new <a href="https://us-store.wacom.com/Product/intuos-pro-s01#/undefined1">Intous Pro</a> I've just bought.</p>
<p>In a way, I'm where I wanted to be when I did my bachelor degree - code and design (I graduated as a software engineer, with focus on machine learning and... graphic design).</p>
<p>But in my journey to Illustrator I actually made two stopped, in Inkscape and Sketch. I started with Inkscape, which is great. It's easy to learn and very powerful. What I like most with Inkscape is the control over the creation and modification of paths, which is way easier and more intuitive than Sketch and Illustrator. I did most of the clothing items to Baby Weatr using it, and posted samples of these designs in a <a href="http://prodissues.com/2016/12/some-illustration-fun.html">previous post</a>.</p>
<p>But Inkscape lacks in layout and layer management. I also missed smart guides, which makes the interface design much controllable. And so I've started to learn <a href="https://www.sketchapp.com">Sketch</a>.</p>
<p>I love Sketch's workflow, as well as the way it lets me organize design assets alongside my artboards. But, it's not a replacement to Inkscape when it comes to actual illustrations. What I ended up doing is creating the cloth items' illustrations in Inkscape, and importing them into Sketch, where I did the layout created the sets of outfits.</p>
<p>Here's how the Baby Weatr project looks like in Sketch: </p>
<p><img alt="sketch-outfits-page.png" src="http://media.prodissues.com/images/2017/01/sketch-outfits-page.png"></p>
<p><img alt="sketch-cloth-items.png" src="http://media.prodissues.com/images/2017/01/sketch-cloth-items.png"></p>
<p>And then, as I drawn deeper and deeper into design, I've started to learn more about Adobe Illustrator. I tried it while using Inkscape and Sketch, but it seemed too complex, and inaccessible to me. But the more complex it seemed, the more attracted to it I became (no wonder I use Emacs...). When I finished all the clothing sets I needed for the beta launch of Baby Weatr, I decided to get serious and learn Illustrator. After all, it is <em>the</em> tool for designers...</p>
<p>And as I mentioned, 150 episodes later that took 15 hours and span over 3 course, I'm at a point where I feel comfortable with the tool, and starting to do art and design work in it.</p>
<p>Phooo, there was a lot of catching up I needed to do... but it feels good to look at that list and appreciate all the things that I had the chance to learn and experiment with.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>And now, just to make sure this post is going to get published, I used <a href="http://prodissues.com/2016/10 another-change-to-my-writing-workflow.html">one of my hacks</a>, and put it on scheduled publishing... <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>And no, there's no new year resolution involved in this writing. I don't
like this practice, and don't set those resolutions... <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn-3">
<p>This skill is still in development, so not public and can't be added to
Alexa yet. <a class="footnote-backref" href="#fnref-3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn-4">
<p>aka chatbot, but I denounce the term, because it's lame... <a class="footnote-backref" href="#fnref-4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn-5">
<p>I graduated as a software engineer, with a focus on machine learning
and... graphic design. <a class="footnote-backref" href="#fnref-5" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
<li id="fn-6">
<p>They were actually a fierce competitor when we tried to get the CNN
project :) <a class="footnote-backref" href="#fnref-6" title="Jump back to footnote 6 in the text">↩</a></p>
</li>
<li id="fn-7">
<p>I completed several stages, but didn't go all the way, because I had
other things to work on, and I'm not going to make a career switch... <a class="footnote-backref" href="#fnref-7" title="Jump back to footnote 7 in the text">↩</a></p>
</li>
</ol>
</div>Cost of a New User2016-12-14T12:07:53-05:002016-12-14T12:07:53-05:00yanivtag:prodissues.com,2016-12-14:/2016/12/cost-of-a-new-new-user.html<ol>
<li>10$ for an iOS app.</li>
<li>40,000$ for the army.</li>
</ol>
<p><img alt="Army vs. Ibotta - new user cost" src="http://media.prodissues.com/images/2018/04/ua-cost-sabway.jpg"></p><ol>
<li>10$ for an iOS app.</li>
<li>40,000$ for the army.</li>
</ol>
<p><img alt="Army vs. Ibotta - new user cost" src="http://media.prodissues.com/images/2018/04/ua-cost-sabway.jpg"></p>Typing On Cherry G80 And AEKII2016-11-03T23:00:00-04:002016-11-03T23:00:00-04:00yanivtag:prodissues.com,2016-11-03:/2016/11/typing-on-cherry-g80-and-aekii.html<p>I'm running some typing tests on the AEK and the Cherry g08 with the
black MX switches.</p>
<h2>The Cherry G80</h2>
<p><img alt="cherry-g80.jpg" src="http://media.prodissues.com/images/2016/10/cherry-g80.jpg">
I tried the cherry keyboard before and liked the keys. They are smooth
and linear, and I felt that though they are a bit hard to press, not
having the …</p><p>I'm running some typing tests on the AEK and the Cherry g08 with the
black MX switches.</p>
<h2>The Cherry G80</h2>
<p><img alt="cherry-g80.jpg" src="http://media.prodissues.com/images/2016/10/cherry-g80.jpg">
I tried the cherry keyboard before and liked the keys. They are smooth
and linear, and I felt that though they are a bit hard to press, not
having the tactile sensation, actually kind of pushed my fingers up, and
gave them the energy to move to the next key.</p>
<p>On the other hand, I didn't like that the keys feel smaller than those
in my AEK and Wasd code. My hands felt somewhat claustrophobic when
typing, scrambling and twisting to get to the desired keys. Now since I
type in Emacs, it means that I need to use modifier keys quite often.
The layout didn't help either. The bottom row is skewed to the left, so
the modifiers are not aligned under the 'z' and the 'x' as they are in
other, more conventional keyboards.</p>
<p>Apart for the keys, the cherry keyboard is pretty much crap. It's very
light, and feels to be constructed out of cheap materials. The touch-pad
is a jock. It's barely responsive, and won't track my finger unless it
moves slower than it would have taken me to go to the other room and
bring a decent mouse. Overall, though I kinda like the black switches, I
think I'll prefer the browns, which require less force to press. So
overall, this keyboard isn't a keeper.</p>
<h2>Apple Extended Keyboard</h2>
<p><img alt="aekii.jpg" src="http://media.prodissues.com/images/2016/10/aekii.jpg"></p>
<p>And this is now the apple keyboard that I'm typing on, and the first
impression is so much better.</p>
<p>Maybe, my only complaint might be that the keys aren't linear. The
blacks, which are linear feels very good, but they are a little too
hard. It takes just too much force to push down the keys, and keep a
fast typing pace.</p>
<p>Here, with the apple keyboard, typing feels good, but the tactile
feeling is a bit weird. It's like the keys don't seat right, as if they
are not perfectly aligned. The pressing of the key isn't linear. It
feels like there is some kind of a bump the the key pushes through,
which gives a non harmonious tactile feel to the click. It feels like
driving a car on pebbles. Just like you feel those vibrations coming
from the rocky road, that's how they typing on the AEK feels. My fingers
absorb that vibration, caused by the push through this non-linear path
the key does when it's pressed down.</p>use-package's :config vs. :init2016-10-25T10:36:00-04:002016-10-25T10:36:00-04:00yanivtag:prodissues.com,2016-10-25:/2016/10/use-packages-config-vs-init.html<p>I read <a href="https://www.reddit.com/r/emacs/comments/58v6id/what_is_your_favorite_dark_theme_that_works_well/?ref=share&ref_source=link">this</a>
Reddit thread about favorite themes, and got intrigued by the <a href="https://github.com/nashamri/spacemacs-theme">spacemacs</a> theme<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>.</p>
<p>I added that theme to my <code>init</code> file, and tried making it the default
theme. I use <code>use-package</code>, and configured the theme as follows:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nb">use-package</span> <span class="nv">spacemacs-theme</span>
<span class="ss">:ensure</span> <span class="no">t</span>
<span class="ss">:config</span>
<span class="p">(</span><span class="nv">load-theme</span> <span class="ss">'spacemacs-light</span> <span class="no">t</span><span class="p">)</span>
<span class="p">)</span>
</pre></div>
<p>When re-evaluating …</p><p>I read <a href="https://www.reddit.com/r/emacs/comments/58v6id/what_is_your_favorite_dark_theme_that_works_well/?ref=share&ref_source=link">this</a>
Reddit thread about favorite themes, and got intrigued by the <a href="https://github.com/nashamri/spacemacs-theme">spacemacs</a> theme<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>.</p>
<p>I added that theme to my <code>init</code> file, and tried making it the default
theme. I use <code>use-package</code>, and configured the theme as follows:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nb">use-package</span> <span class="nv">spacemacs-theme</span>
<span class="ss">:ensure</span> <span class="no">t</span>
<span class="ss">:config</span>
<span class="p">(</span><span class="nv">load-theme</span> <span class="ss">'spacemacs-light</span> <span class="no">t</span><span class="p">)</span>
<span class="p">)</span>
</pre></div>
<p>When re-evaluating my <code>init</code> file, the theme didn't load. I tried to run
only the <code>(load-theme 'spacemacs-light t)</code> line, and the theme loaded. I
changed the <code>:config</code> to <code>:init</code> in the package configuration, and it
loaded when I re-loaded emacs.</p>
<p>What, then, is the difference between <code>:init</code> and <code>:config</code> in
<code>use-package</code>?</p>
<p>The answer to that question, which I found it in this <a href="http://emacs.stackexchange.com/a/10403">stack-overflow
answer</a>, is that in
<code>use-package</code>, whatever defined inside the <code>:init</code> keyword, will load
whenever emacs is loading. What's in the <code>:config</code>, though, will be
executed only when the package is actually loaded (i.e lazy
loading)<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>.</p>
<p>Here's how my configuration for that theme looks like now:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nb">use-package</span> <span class="nv">spacemacs-theme</span>
<span class="ss">:ensure</span> <span class="no">t</span>
<span class="ss">:init</span>
<span class="p">(</span><span class="nv">load-theme</span> <span class="ss">'spacemacs-light</span> <span class="no">t</span><span class="p">)</span>
<span class="p">)</span>
</pre></div>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>I tried spacemacs before, and liked its look and feel, but didn't know I
can take it back with me to gnu emacs <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>Needless to say that, going back to the <code>use-package</code> documentation, the
difference between <code>:init</code> and <code>:config</code> is clearly described… <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Book Notes - The Myth Of Sisyphus2016-10-23T23:30:00-04:002016-10-23T23:30:00-04:00yanivtag:prodissues.com,2016-10-23:/2016/10/book-notes-the-myth-of-sysiphus.html<p>Thank god it's over.</p>
<p>Long time ago I pledged not to put down a book I started reading. I tend
to read at least couple of books in parallel, and if not being
disciplined, I can easily focus on one and drop the other. I might then
start yet another …</p><p>Thank god it's over.</p>
<p>Long time ago I pledged not to put down a book I started reading. I tend
to read at least couple of books in parallel, and if not being
disciplined, I can easily focus on one and drop the other. I might then
start yet another one, and forget about the other two.</p>
<p>"The Myth Of Sisyphus" almost got me to break this rule, though I
haven't. It wasn't my "avoids putting a book down" principle that kept
me going, but the book's underling idea - the absurd life, the poignant
quotes it is packed with, and the wealth of references it makes to other
writers and books. Timing contributed as well, as this book came in a
relevant time in life.</p>
<p>And so, I wanted to read what Camus had to say, but his writing style is
annoying, verbose, and too abstract. Too often Camus will go in circles,
to a point where I lost his line of thought. His writing style, and the
way he structures his sentences are awful, making me read the same
paragraphs over and over again, trying to comprehend what in havens he
meant to say.</p>
<p>As eager I was to wrap my head around absurdism, I wouldn't have made it
without the excellent help of
<a href="http://www.sparknotes.com/philosophy/sisyphus/context.html">sparknotes</a>.
(I did skip the adjoining essays. It was too much...)</p>
<blockquote>
<p>The central concern of The Myth of Sisyphus is what Camus calls "the
absurd." Camus claims that there is a fundamental conflict between
what we want from the universe (whether it be meaning, order, or
reasons) and what we find in the universe (formless chaos). We will
never find in life itself the meaning that we want to find. Either we
will discover that meaning through a leap of faith, by placing our
hopes in a God beyond this world, or we will conclude that life is
meaningless. (source:
<a href="http://www.sparknotes.com/philosophy/sisyphus/context.html">sparknotes</a>)</p>
</blockquote>
<p>But put writing style aside, the absurd is a thought provoking idea, and
I can see why it was so influential. It raises a lot of questions,
leading me to think about life in ways I never did before. However,
while doing so, it doesn't provide satisfying, practical answers. And
so, the book delineates the philosophy it manifests, in that it helped
me asking questions and seeing things as they are, while leading me
towards no particular destination. And so, finishing reading it, I feel
I was left at a dead-end.</p>
<h2>Takeaways</h2>
<ul>
<li>If there is no eternal life, and if we don't know what's the meaning
of life, nor will we ever know, why keep living?</li>
<li>God, as well as hope are ways around the previous question. Both
don't give answer, but stir us from the meaningless habit of living.</li>
<li>Suicide is the other extreme. If one have freedom of choice, why
would she keep doing the same thing over and over again, knowing
what he is doing is futile and has no point, meaning or legacy. Stop
doing this repetitive thing (i.e. keep leaving the repetitive,
meaningless, life) is a sound option. But it means caving to the
absurd, just like believing in god and developing hope.</li>
<li>If not God, Hope or suicide, how can one keep living knowing that
nothing one does adds to something?</li>
<li>Camus's answer is to revolt, or, well, keep living live life with
passion and to the fullest. While the previous point make sense,
this one is less so, simply because I don't see clearly how it
translates to real life, and how my day-to-day decisions would be
affected by it.</li>
<li>So, while the absurd makes a lot of sense, and make me realize that
I'm not the only one who's seeing the absurdity in life, it doesn't
get me much further. And so, I'm going to acknowledge the absurd and
keep living my life, probably hoping and dreaming on "some day...".</li>
</ul>
<h2>Favorite quotes</h2>
<blockquote>
<p>"Beginning to think is beginning to undermined." (p.4)</p>
<p>"In a sense, and as in melodrama, killing yourself amounts to
confessing. It is confessing that life is too much for you or that you
do not understand it."(p.5)</p>
<p>"Living, naturally, in never easy. You continue making the gestures
commanded by existence for many reasons, the first of which is
habit."(p.5)</p>
<p>"A world that can be explained even with bad reasons is a familiar
world. But, on the other hand, in a universe suddenly divested of
illusions and lights, man feels an alien, a stranger."(p.6)</p>
<p>"We get into the habit of living before acquiring the habit of
thinking." (p.8)</p>
<p>"Hitherto, ... , people have played on words and pretended to believe
that refusing to grant a meaning to life necessarily leads to
declaring that it is not worth living." (p.8)</p>
<p>"One kills oneself because life is not worth living, that is certainly
a truth - yet an unfruitful one, because it is a truism. But does that
insult to existence, that flat denial in which it is plunged come from
the fact that it has no meaning? Does its absurdity require one to
escape it through hope or suicide - this is what must be clarified,
hunted down, and elucidated" (p.9)</p>
<p>"...during every day of an unillustrious life, time carries us. But a
moment always comes when we have to carry it. We live on the future:
'tomorrow,' 'later on', 'when you have made your way', 'you will
understand when you are old enough'. Such irrelevancies are wonderful,
for , after all, it's a mater of dying. Yet a day comes when a man
notices or says that he is thirty. Thus he asserts his youth. But
simultaneously he situates himself in relation to time. ... He admits
that he stands at a certain point on a curve that he acknowledges
having to travel to its end."(p.13)</p>
<p>"Living is keeping the absurd alive. Keeping it alive is, above all
contemplating it. Unlike Eurydice, the absurd dies only when we turn
away from it. One of the only coherent philosophical position is thus
revolt." (p.54)</p>
<p>"It is essential to die unreconciled and not of one's own free
will."(p.55)</p>
<p>"... either we are not free and God the all-powerful is responsible
for evil. Or we are free and responsible but God is not
all-powerful."(p.56)</p>
<p>"Before encountering the absurd, the everyday man lives with aims,...
He weighs his chances, he counts on 'someday'..."(p.57)</p>
<p>"One becomes so accustomed so quickly. A man wants to earn money in
order to be happy, and his whole effort and the best of a life are
devoted to the earning of that money. Happiness is forgotten; the
means are taken for the end."(p.103)</p>
<p>"If God exists, all depends on him and we can do nothing against his
will. If he does not exist everything depends on us."(p.108)</p>
</blockquote>
<h2>Follow up books</h2>
<ul>
<li>Herman Melville - <a href="https://www.goodreads.com/book/show/153747.Moby_Dick_or_The_Whale">Moby Dick</a></li>
<li>Martin Esslin - <a href="https://www.goodreads.com/book/show/359954.The_Theatre_of_the_Absurd">The Theater Of The Absurd</a></li>
<li>Greek Mythology: Sisyphus / Prometheus / Minotaur / Eurydice / Oedipus / Trojan War</li>
<li>Fyodor Dostoevsky - <a href="https://www.goodreads.com/book/show/5695.Demons?ac=1&from_search=true">Demons</a> / <a href="https://www.goodreads.com/book/show/4934.The_Brothers_Karamazov">Brothers Karamazov</a></li>
<li>Franz Kafka - <a href="https://www.goodreads.com/book/show/17690.The_Trial">The Trial</a><sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup> / <a href="https://www.goodreads.com/book/show/333538.The_Castle">The Castle</a></li>
<li>George Gordon Byron - <a href="https://www.goodreads.com/book/show/78249.Don_Juan?from_search=true">Don Juan</a></li>
<li>Friedrich Nietzcshe - Thus Spoke Zarathustra</li>
<li>Johann Wolfgang von Goethe - <a href="https://www.goodreads.com/book/show/406373.Faust">Faust</a></li>
</ul>
<h2>Other links</h2>
<ul>
<li><a href="https://www.goodreads.com/book/show/11987.The_Myth_of_Sisyphus_and_Other_Essays">Book Info</a> (Goodreads)</li>
<li><a href="https://www.goodreads.com/review/show/1459576487">Joshie's Reviews</a> (Goodreads)</li>
<li><a href="https://www.goodreads.com/review/show/46449348?book_show_action=false&from_review_page=1">Michael's Reviews</a> (Goodreads)</li>
<li><a href="http://www.sparknotes.com/philosophy/sisyphus/context.html">Book summary and analysis</a> (Sparknotes)</li>
</ul>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>I read it few years ago, but now I'm interested in reading it under the
prism of absurdity <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Elisp Video Tutorial - Notes2016-10-18T22:12:00-04:002016-10-18T22:12:00-04:00yanivtag:prodissues.com,2016-10-18:/2016/10/elisp-video-tutorial-notes.html<p>I've just finished watching <a href="http://www.pygopar.com/">Daniel Gopar's</a>
elisp <a href="https://www.youtube.com/watch?list=PL3kg5TcOuFlpyqiZspzlkk6Ro66nQdESz&params=OAFIAVgB&v=CH0RUrO_oww&mode=NORMAL&app=desktop">video tutorial</a>. So far there are 4 parts to the tutorial, and based on <a href="https://www.reddit.com/r/emacs/comments/5542rm/made_some_elisp_videos/?">this thread</a> on Reddit, there are more to come.</p>
<p>After watching the guide I don't feel more proficient in elisp, yet less timid running <code>evals</code> and more courageous tinkering …</p><p>I've just finished watching <a href="http://www.pygopar.com/">Daniel Gopar's</a>
elisp <a href="https://www.youtube.com/watch?list=PL3kg5TcOuFlpyqiZspzlkk6Ro66nQdESz&params=OAFIAVgB&v=CH0RUrO_oww&mode=NORMAL&app=desktop">video tutorial</a>. So far there are 4 parts to the tutorial, and based on <a href="https://www.reddit.com/r/emacs/comments/5542rm/made_some_elisp_videos/?">this thread</a> on Reddit, there are more to come.</p>
<p>After watching the guide I don't feel more proficient in elisp, yet less timid running <code>evals</code> and more courageous tinkering with my <a href="https://github.com/yanivdll/.emacs.d/blob/master/config.org">config</a> file.</p>
<p>Following is a short summary of the code exercises and shortcuts I
logged while watching.</p>
<h2>Part 1 - Intro</h2>
<p><a href="https://www.youtube.com/watch?list=PL3kg5TcOuFlpyqiZspzlkk6Ro66nQdESz&params=OAFIAVgB&v=CH0RUrO_oww&mode=NORMAL&app=desktop">Link to episode 1</a></p>
<p>REPL - read-eval-print-loop</p>
<p>Define functions:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nb">defun</span> <span class="nv">add-num</span> <span class="p">(</span><span class="nv">a</span> <span class="nv">b</span><span class="p">)</span> <span class="p">(</span><span class="nb">+</span> <span class="nv">a</span> <span class="nv">b</span><span class="p">))</span>
</pre></div>
<p>Define a test:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nb">require</span> <span class="ss">'ert</span><span class="p">)</span>
<span class="p">(</span><span class="nv">ert-deftest</span> <span class="nv">add-num-pos</span> <span class="p">()</span>
<span class="p">(</span><span class="nv">should</span>
<span class="p">(</span><span class="nb">equal</span> <span class="p">(</span><span class="nv">add-num</span> <span class="mi">10</span> <span class="mi">10</span><span class="p">)</span> <span class="mi">20</span><span class="p">)))</span>
</pre></div>
<p>To run the test that I've just created:
<code>M-x ert-run-tests-interactively</code></p>
<p>Choose the test I would like to run (in this case "pos-add-num")</p>
<h2>Part 2 - Create A Simple Function And A Test Of That Function</h2>
<p><a href="https://www.youtube.com/watch?list=PL3kg5TcOuFlpyqiZspzlkk6Ro66nQdESz&params=OAFIAVgB&v=CH0RUrO_oww&mode=NORMAL&app=desktop">Link to episode 2</a></p>
<p><code>setq</code> to set variables and lists <code>(setq my-list '(1 2 3))</code></p>
<p><code>add-to-list</code> to add element <code>(add-to-list 'my-list 4)</code></p>
<p>Another way to add to list, but this time to a copy of the list:
<code>(cons 5 my-list)</code> - this will return (5 1 2 3 4) But when inquiring
my-list, we will get (1 2 3 4)</p>
<p><code>car</code> returns the first element in every list <code>(car my-list)</code> -> 1</p>
<p><code>cdr</code> returns everything from a list, after the first element
<code>(crd my-list)</code> -> (2 3 4)</p>
<p><code>nth</code> return a certain element in the list <code>(nth 4 my-list)</code> -> 3</p>
<p><code>member</code> check for a certain value in a list, and return the elements in
that list from that value on <code>(member 3 my-list)</code> -> (3 4)
<code>(member 7 my-list)</code> -> nil</p>
<h2>Part 3 - Looping And Local Variables</h2>
<p><a href="https://www.youtube.com/watch?v=VqCSbDqHziM&list=PL3kg5TcOuFlpyqiZspzlkk6Ro66nQdESz&index=3">Link to episode 3</a>
</p></p>
<p>Use the <strong>scratch</strong> buffer, so I can write in multiple lines</p>
<p><code>C-x C-e</code> to evaluate code. Point needs to be at the end of the code in
order to get evaluated.</p>
<p>Looping through variables:</p>
<p><code>let</code> to create a local variable</p>
<p><code>when</code> and <code>if</code> - what they suppose to do...</p>
<p>If there is more than one statement in the <code>if</code> statement, need to use
to wrap those lines with <code>progn</code>. There is no such limitation in the
<code>else</code> statement.</p>
<h2>Part 4 - Interactive Functions</h2>
<p><a href="https://www.youtube.com/watch?v=KwBRpS9Bs4U&index=4&list=PL3kg5TcOuFlpyqiZspzlkk6Ro66nQdESz">Link to episode 4</a></p>
<p>Created a function to count words, plus the test for it.</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nb">defun</span> <span class="nv">cheap-count-words</span><span class="p">()</span>
<span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
<span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">words</span> <span class="mi">0</span><span class="p">))</span>
<span class="p">(</span><span class="nv">save-excursion</span>
<span class="p">(</span><span class="nv">goto-char</span> <span class="p">(</span><span class="nv">point-min</span><span class="p">))</span>
<span class="p">(</span><span class="nv">while</span> <span class="p">(</span><span class="nv">forward-word</span><span class="p">)</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">words</span> <span class="p">(</span><span class="nb">1+</span> <span class="nv">words</span><span class="p">))</span> <span class="p">))</span>
<span class="p">(</span><span class="nv">message</span> <span class="p">(</span><span class="nb">format</span> <span class="s">"Words in Buffer: %s"</span> <span class="nv">words</span><span class="p">))</span><span class="nv">words</span><span class="p">))</span>
<span class="c1">;; Tests</span>
<span class="p">(</span><span class="nb">require</span> <span class="ss">'ert</span><span class="p">)</span>
<span class="p">(</span><span class="nv">ert-deftest</span> <span class="nv">count-words-test</span> <span class="p">()</span>
<span class="p">(</span><span class="nv">get-buffer-create</span> <span class="s">"*test*"</span><span class="p">)</span>
<span class="p">(</span><span class="nv">with-current-buffer</span> <span class="s">"*test*"</span>
<span class="p">(</span><span class="nv">erase-buffer</span><span class="p">)</span>
<span class="p">(</span><span class="nv">insert</span> <span class="s">"Hello world"</span><span class="p">)</span>
<span class="p">(</span><span class="nv">should</span> <span class="p">(</span><span class="nb">=</span><span class="p">(</span><span class="nv">cheap-count-words</span><span class="p">)</span> <span class="mi">2</span><span class="p">)))</span>
<span class="p">(</span><span class="nv">kill-buffer</span> <span class="s">"*test*"</span><span class="p">))</span>
</pre></div>Another Change To My Writing Workflow2016-10-07T12:48:00-04:002016-10-07T12:48:00-04:00yanivtag:prodissues.com,2016-10-07:/2016/10/another-change-to-my-writing-workflow.html<p>Till not long ago kept all my drafts in one big <a href="https://prodissues.com/2015/11/drafts.html">posts' drafts</a>. It was a good way
to log things I've learned, while preparing to share those learnings in
this blog. Keep this huge file public, meant to encourage me to iterate
on drafts and eventually turn them into …</p><p>Till not long ago kept all my drafts in one big <a href="https://prodissues.com/2015/11/drafts.html">posts' drafts</a>. It was a good way
to log things I've learned, while preparing to share those learnings in
this blog. Keep this huge file public, meant to encourage me to iterate
on drafts and eventually turn them into posts.</p>
<p>In an <a href="https://prodissues.com/2016/09/revising-my-approach-to-drafts.html">earlier post</a> I mentioned that this strategy didn't work very well, as this draft file turned into a draft cemetery - whatever got into it, didn't come out. I, therefore, changed my workflow, and implemented the WordPress scheduling feature. I found that writing a first draft, and setting a publish date 2 days or so into the future, is much more effective in keeping me focused finishing up posts, and eventually help me write more.</p>
<p>The only thing is that I need to write those drafts <em>somewhere,</em> and I
still want those drafts to be online. Instead of going back to my old
single draft file, I figured I can start drafts in separate files,
categorize them as drafts and publish them into the future. But I don't
want those drafts to show on the main page, so I installed the
"<a href="https://wordpress.org/plugins/ultimate-category-excluder/screenshots/">Ultimate Category Excluder</a>", which let me exclude posts from certain categories to show up in the homepage.</p>
<p><strong>Update:</strong> This "hiding category" solution won't work... to begin with,
even if I hide a category, when publishing a draft post, subscribers get
a notification that there's a new post on my blog. I don't want that to
happen. Second, the whole scheduling thing doesn't work anymore, because
the post is already live when I post it as draft... so no motivation to
go back to it, more than do it when it's part of a larger file...</p>Your App Is Burried In A Folder - Make Its Icon Stand Out2016-10-06T00:00:00-04:002016-10-06T00:00:00-04:00yanivtag:prodissues.com,2016-10-06:/2016/10/your-app-is-burried-in-folder-make-its-icon-stand-out.html<p>Meetup has finally updated its mobile app. More than that, it went
through a complete re-branding, and as part of it also redesigned the
icon of its mobile app.</p>
<p>From the look of the new icon, it seems that Meetup's designers assumed
their app sits front and center in their …</p><p>Meetup has finally updated its mobile app. More than that, it went
through a complete re-branding, and as part of it also redesigned the
icon of its mobile app.</p>
<p>From the look of the new icon, it seems that Meetup's designers assumed
their app sits front and center in their users' devices. I hesitate
that's the case.</p>
<blockquote>
<p>It’s increasingly difficult for smaller publishers/brands to break
through — even with downloaded apps — because of folders (being
buried) ..
-- <a href="http://marketingland.com/nearly-85-percent-smartphone-app-time-concentrated-top-five-apps-report-191624">marketingland.com</a></p>
</blockquote>
<p>I'm one of those users... while I use the Meetup app quite often, to
stay in touch and communicate with members of the groups I lead, it's
not one of the few apps I spend most of my time on. Therefore Meetup,
like 98% of my apps, lives in a folder.</p>
<p>As a foldered app, it should have an icon that's visually
distinguishable, and that stands out with every pixel, otherwise users
will ignore the app and won't use it. Meetup's new icon is anything but
standing out. On the contrary - it blends with the rest of the icons and
lacks identity.</p>
<p>Take a look at Meetup's icon before and after:</p>
<p><img alt="meetup-new-icon.png" src="http://media.prodissues.com/images/2016/10/meetup-new-icon.png"></p>
<p><span class="figure-number">Figure 1:</span> Left - before, Right -
after. In both images, it's in the top-right folder, the bottom-right
icon</p>
<p>The previous icon, while not optimized for mobile - having to squeeze
the name in the small icon - had some color contrast to it, which made
it recognizable.</p>
<h2>Your App Is Not Special</h2>
<iframe src="https://www.youtube.com/embed/3CnryN0_bvY" width="560" height="315" frameborder="0" allowfullscreen="allowfullscreen"></iframe>
<p>Don't assume users care about your app; they don't. After downloading
it, they are likely to either delete it, or throw it into a folder. The
least you can do is plan for the latter, and design an icon that's
unique, and can be recognized in any size.</p>
<p>Take a look again at the screenshots above - which icons do better job
at grabbing your attention, even when placed within a
folder<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>?</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>My pick would be the <strong>Workflow's</strong> icon (same folder as Meetup,
bottom-left corner), as well as <strong>Spotify</strong> (right image, top-left
folder, top-left icon) and <strong>Overcast</strong> (right image, top-left folder,
mid-left icon). <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Magit - My Simple Workflow2016-10-05T20:30:00-04:002016-10-05T20:30:00-04:00yanivtag:prodissues.com,2016-10-05:/2016/10/magit-my-simple-workflow.html<p>I still not fluent with Magit's terminology and workflow. Probably because I'm not using git in general too often. When I do, and when I try to use Magit as the interface, I usually get confused by the wealth of options and switches, and resort to the terminal.</p>
<p>Today I …</p><p>I still not fluent with Magit's terminology and workflow. Probably because I'm not using git in general too often. When I do, and when I try to use Magit as the interface, I usually get confused by the wealth of options and switches, and resort to the terminal.</p>
<p>Today I decided to give Magit yet another try. I read the this <a href="https://magit.vc/manual/magit/Getting-started.html#Getting-started">Getting Started</a> guide, and now things makes much more sense. However, I can see how I forget what I've just read a week from now, so here's the gist of that, my simplest cheat-sheet:</p>
<h2>(Ma)git status:</h2>
<p><code>C-x g</code></p>
<h2>(Ma)git add</h2>
<p>For each unstage file:
<code>s</code></p>
<h2>(Ma)git commit</h2>
<p><code>c c</code></p>
<p>Type the commit note and then <code>C-c C-c</code> to create the commit.</p>
<h2>(Ma)git push</h2>
<p><code>p u</code></p>
<p>Done. Now I can type <code>q</code> to close the Magit pop-up buffer, and be back on the file I was working on.</p>Electric Pair Mode In Emacs2016-10-02T00:00:00-04:002016-10-02T00:00:00-04:00yanivtag:prodissues.com,2016-10-02:/2016/10/electric-pair-mode-in-emacs.html<p>So far I've used <a href="https://textexpander.com">TextExpander</a> for text
snippets and, well, text expansion. One of my main uses-cases is
character pairings. For example, when I type <code>"</code> I almost always enclose
it with another <code>"</code>.</p>
<p>But TextExpander is lacking in several ways:</p>
<ol>
<li>Performance - it takes a friction of a second for the expansion …</li></ol><p>So far I've used <a href="https://textexpander.com">TextExpander</a> for text
snippets and, well, text expansion. One of my main uses-cases is
character pairings. For example, when I type <code>"</code> I almost always enclose
it with another <code>"</code>.</p>
<p>But TextExpander is lacking in several ways:</p>
<ol>
<li>Performance - it takes a friction of a second for the expansion to
happen, but it's notable, and feels like a little hang.</li>
<li>If I delete one part of the pair, it won't remove the other.</li>
<li>It won't work to wrap text. If I typed something, and then want to
wrap it with brackets, for example, I can't select the text and type
the bracket character.</li>
</ol>
<p>In addition to the above technical shortcomings, I don't plan to keep
using TextExpander in the long run. The recent <a href="http://www.macworld.com/article/3052440/os-x/smile-updates-textexpander-and-switches-to-subscriptions.html">move into subscription
based</a>
pricing, isn't something I'm interested in. I mean, paying subscription
to text snippets...?</p>
<p>Anyway, Emacs comes with an electric-pair-mode, which enables smart
pairing. I turned it on, but out of the box it's configured to work
mainly with programming major modes. I need it also in other text based
modes, such as org, markdown and simple text. For example, in org I use
<code>~</code> for inline code snippets, and <code>~</code> isn't paired by default. Same goes
with <code>"</code>.</p>
<p>Luckily, defining more pairs is easy, through modifying the
electric-pair-pairs variable.</p>
<p>Here's my configuration for this mode:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nv">electric-pair-mode</span> <span class="mi">1</span><span class="p">)</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">electric-pair-pairs</span> <span class="o">'</span><span class="p">(</span>
<span class="p">(</span><span class="nv">?\ .</span> <span class="nv">?\)</span>
<span class="p">(</span><span class="nv">?\ .</span> <span class="nv">?\)</span>
<span class="p">(</span><span class="nv">?\(</span> <span class="o">.</span> <span class="nv">?\)</span><span class="p">)</span>
<span class="p">(</span><span class="nv">?\{</span> <span class="o">.</span> <span class="nv">?\}</span><span class="p">)</span>
<span class="p">))</span>
</pre></div>
<p>I'll add more pairs as I encounter them. Also, I'll need to learn how to
add pairs for specific major modes.</p>An Inconsistent User Experience in iOS2016-09-29T22:59:00-04:002016-09-29T22:59:00-04:00yanivtag:prodissues.com,2016-09-29:/2016/09/inconsistency-in-ios.html<p>When it comes to user experience, I'm a big fan of consistent design,
which gives users confidence that their actions will lead to an expected
outcome. When users know what to expect, they are open to
experimentations; they are not afraid to explore wider set of features,
and try out …</p><p>When it comes to user experience, I'm a big fan of consistent design,
which gives users confidence that their actions will lead to an expected
outcome. When users know what to expect, they are open to
experimentations; they are not afraid to explore wider set of features,
and try out new capabilities.</p>
<p>When there's <em>no</em> consistency, when the same function gets different
names or labels, or when it shows in different places, then users get
confused. And when users get confused, they're reluctant to try anything
that's not within their immediate need. Here's an example for such
confusion, which I've just experienced on my iPhone, when trying to
share an image with a friend.</p>
<p>That's the flow I went through:</p>
<ul>
<li>Took a screenshot on my iPhone </li>
<li>Went to the iOS photos app</li>
<li>Selected the screenshot I've just taken</li>
<li>Clicked the share icon</li>
<li>Selected to share via Messages</li>
<li>Selected the friend I wanted to share the screenshot with</li>
<li>Clicked send</li>
</ul>
<p>Or have I...? when I clicked what I thought was send, the Messages'
screen closed, leaving me wondering if the image was actually sent. I
repeated the flow, and just before clicking the "send"
button<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup> paused to read its label. Hmm... it says "cancel". That's weird. I'm pretty sure it should say "send". But what made me think that that's where the "send" button is? was there another app that primed me with this expectation?</p>
<p>There is, off course. It's called Mail.</p>
<p>In Mail, the send button dominates the top-right corner of the screen.
Now, since I send too many emails every day, way more than I share
photos, my brain expect the "send" button, in whatever app I'm in, to
show at the top-right.</p>
<p><img alt="ios-inconsistency-ux.png" src="http://media.prodissues.com/images/2016/09/ios-inconsistency-ux.png"></p>
<p><span class="figure-number">Figure 1:</span> To the left is the
Messages. On the right - the Mail app. Note the different buttons on the
top-right corner of each of those apps.</p>
<p>I love those moment of self awareness, which allow me to test some of my
own assumptions...</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>It's a little hard for me to call it button, because nothing make it
stand out from its background, like you would have expect a button. Is
it possible that my brains is still wired in the pseudo physical,
skeuomorphism, design...? <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Google Allo - First Impression2016-09-25T00:00:00-04:002016-09-25T00:00:00-04:00yanivtag:prodissues.com,2016-09-25:/2016/09/google-allo-first-impression.html<p>Yesterday I installed the new Google Allo and gave it a first try. My
team at Outbrain is responsible building chatbot CMS for publishers. So
I was interested to learn about some of the decision made in Allo, and
compare them with what we've learned over the last 6 month …</p><p>Yesterday I installed the new Google Allo and gave it a first try. My
team at Outbrain is responsible building chatbot CMS for publishers. So
I was interested to learn about some of the decision made in Allo, and
compare them with what we've learned over the last 6 month powering the
CNN bots on Facebook Messenger and Kik.</p>
<h2>User on-boarding</h2>
<p>I downloaded the app, installed it, but then deleted it in the middle of
the on-boarding. Why? because Google are being overly transparent. Why
do they make such a point that they are going to send my contact list to
their cloud now and then? there must be some evil reason for that...</p>
<p><img alt="Allo-onboarding-1.png" src="http://media.prodissues.com/images/2016/09/Allo-onboarding-1.png"></p>
<p>So, I deleted the app. But then I thought to myself, "wait, you're using
Google Contacts, and your contacts are already syncing with google. Not
periodically, but all the time, in real-time..." I felt stupid,
downloaded the app again and completed the on-boarding. And I won't say
I felt better when the first few prompts from Allo kept pushing on that
sharing thing, as if trying to tell me that I'll be better not use it,
if I want keeping private <em>anything</em>...</p>
<p><img alt="Allo-onboarding-2.PNG" src="http://media.prodissues.com/images/2016/09/Allo-onboarding-2.PNG"></p>
<p>To sum things up, the on-boarding experience could have done more to
instill trust and make me more comfortable. Right now I'm not, and
although he is a bit more of a privacy snob than I am, Snowden already
made a point about <a href="http://www.independent.co.uk/life-style/gadgets-and-tech/news/google-allo-should-be-deleted-and-never-used-says-edward-snowden-a7320861.html">the lack of privacy in
Allo</a>.</p>
<h2>Content experience</h2>
<ul>
<li>Typed "top stories" - I got relatively fresh stories, but definitely
not important ones.</li>
<li>They put the publish time. Seeing that a story published 37 minutes
ago give confidence that they deliver news as they happen.</li>
<li>The stories carousel is clean and simple, but I would have liked to
be able to take action on a specific story. This is possible in
Facebook Messenger using the <a href="https://developers.facebook.com/docs/messenger-platform/product-overview/conversation#send_messages">'Structured
Message'</a> template.
Articles' recommendations in Allo feel temporary, since you can't do
much to engage with them other than read when you see them. Adding
an option to see a summary of an article, save it for later or get
more similar stories might give users a better sense of control over
the experience and the stories they are seeing.</li>
<li>Google seems to think of Allo as a new interface for search, which
makes sense for Google, but make Allo feels like a browser. When
searching for something, the first quick reply is "Google results",
which once tapped opens the browser and search for your input. I
didn't like that it takes me out of the app.</li>
<li>The content in Allo doesn't feel native. Rather, it feels like a
patch, a cut and paste from the browser. Again, makes me feel that
Allo is just another browser.</li>
</ul>
<h2>Chat-flow and experience</h2>
<ul>
<li>There are no dead ends. Even when chatting with friends, you always
have quick replies available. That's great.</li>
<li>There are 'like' and 'dislike' emoji's at the last two positions of
every set of quick replies. It didn't make sense to me. As a user, I
don't know what they mean, hence probably won't use them.</li>
</ul>
<h2>AI</h2>
<ul>
<li>That's the part that surprised me the most. Allo tries to be smart.
It tries as much as it can to be non scriptive. Say "hi" and every
time it will answer with something different. The first time I typed
"hi", I got the entry point experience, namely the option that I
have to interact with the bot. Later, when I wanted to get to the
same entry point, I typed "hi" again. This time, though, Allo tried
to get into conversation with me. After few more greeting inputs
that got me no where, I gave up and typed what I was looking for.</li>
<li>At that early stage, when users aren't educated enough on the
conversational design, and are accustomed to more deterministic
experiences, trying to be smart is wrong. It's like the early days
of the iPhone - the skeuomorphism design helped users get accustomed
to use it, through the icons that imitated physical objects. Once
they got educated, more than 8 years latter, the flat design
was introduced.</li>
</ul>
<p>To sum things up, my overall impression is <strong>ahh</strong>. Yeah, it's cool to
play with Allo and see how well it handles natural language, but it's no
different than Google search. In fact, it feels too much like google
search, which is bit outdated. But than again, I'm writing this post
with Emacs...</p>Hostile Lead Generation2016-09-15T20:00:00-04:002016-09-15T20:00:00-04:00yanivtag:prodissues.com,2016-09-15:/2016/09/hostile-lead-generation.html<p>In the last few days I've been getting daily emails from TWC, promoting
their "Time Warner Cable Business Class" service. I don't know anything
about this service, and since I don't run a business, its irrelevant to
me. </p>
<p>Until today I simply deleted those emails, but today I got annoyed …</p><p>In the last few days I've been getting daily emails from TWC, promoting
their "Time Warner Cable Business Class" service. I don't know anything
about this service, and since I don't run a business, its irrelevant to
me. </p>
<p>Until today I simply deleted those emails, but today I got annoyed, and
made an effort to indicate it by unsubscribing from their mailing list.
However, the unsubscribe flow made me think that TWC isn't really
deterred by requests to unsubscribe. In fact, it seems it's using it as
another user acquisition channel.<br>
And I think I cracked the protocol of this funnel:</p>
<h3>Marketing emails</h3>
<p>Send daily emails to users whose emails we ~~get~~ buy.<br>
<img alt="img" src="//media.prodissues.com/images/2016/09/twc-email.png"></p>
<p>Keep sending those emails until the user respond, by clicking on the
unsubscribe link, or selecting the gmail "report spam & unsubscribe"
button. </p>
<p><img alt="img" src="//media.prodissues.com/images/2016/09/twc-unsubscribe.png"></p>
<h3>Clean user information through an ~~un~~ subscribe form</h3>
<p>When a user clicks the unsubscribe link in the email, we have a precious
opportunity to make sure the information we have about this user is
correct.</p>
<p><img alt="img" src="//media.prodissues.com/images/2016/09/twc-unsubscribe-form.png"></p>
<p>When a user submit the unsubscribe form, we should update our database
with the new information.</p>
<h3>User is redirected to unsubscribe form</h3>
<p>After we get a successful respond from our servers, redirect the user to
the TWC homepage.</p>
<p><img alt="img" src="//media.prodissues.com/images/2016/09/twc-unsubscribe-confirmation.png"></p>
<p>We assume (or hope) that when the user submit the form, she moves focus
to another tab, rather than closing the one she've submitted the form
in. If this assumption holds, then the user will have the TWC homepage
waiting for her, and she'll get to it in the near future.</p>
<h3>User visit the TWC homepage</h3>
<p>At some point, as we assumed, the user zap through open tabs and open
the one that displays the TWC homepage. Great, we have a new lead! The
user is visiting our site, meaning she's interested in our service.</p>
<p><img alt="img" src="//media.prodissues.com/images/2016/09/twc-redirect-to-homepage.png"></p>
<p>Hurry up to drop a cookie on her, and look for whatever information we
can get on that cookie. Wait, we have her full name and email address!</p>
<h3>Retarget potential leads</h3>
<p>Let's make sure we slice the bread while it's still fresh, and find that
user wherever she browse. This way we can nudge her just a little more,
and try to get her to come back to our site and take another step toward
conversion.</p>
<p><img alt="img" src="//media.prodissues.com/images/2016/09/twc-retargeting.png"></p>
<p>And wait, we have her email! that's gold...</p>
<p>Well, no bad feelings for TWC. It's just an amusing example of the
absurdity of how user acquisition works.</p>Revising My Approach To Drafts2016-09-11T20:00:00-04:002016-09-11T20:00:00-04:00yanivtag:prodissues.com,2016-09-11:/2016/09/revising-my-approach-to-drafts.html<blockquote>
<p>a blog post is like a news story about yourself</p>
</blockquote>
<p>This was an insightful commnet made by Nathan, a member of my Blog
Writing Meetup. He made this remark in the context of writing style and
voice - he would like to reflect his personality in his posts, rather
than simply …</p><blockquote>
<p>a blog post is like a news story about yourself</p>
</blockquote>
<p>This was an insightful commnet made by Nathan, a member of my Blog
Writing Meetup. He made this remark in the context of writing style and
voice - he would like to reflect his personality in his posts, rather
than simply report on facts. But thinking about this insight from
another angle might help me understand why I <a href="https://prodissues.com/2015/11/drafts.html">accumulate so many
unfinished drafts</a>, and why
I rarely go back to them.</p>
<h3>News vs. Blog post</h3>
<blockquote>
<p><span class="s1"><strong>News</strong> *(n)<strong>*:</strong> newly received or noteworthy
information, especially about recent or important events</span></p>
</blockquote>
<p>I won't go into explaining news nor will I try to redifine it. I'll
simply assume that if you're reading this post, you can tell a news
article when you see one<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>.</p>
<p>The thing about news is that it's ephermal. No one will care about this
<a href="http://www.macworld.co.uk/news/iphone/iphone-7-release-date-rumours-uk-new-features-price-specs-launch-pre-orders-start-3530504/">Apple iPhone 7 release date</a> a year from now; or as we joke in my team - chatbots are so April 2016....</p>
<p>Going back to Nathan's comment, I think of a blog post as coverage of
one's thoughts and ideas, a translation of what goes in one's mind. And
so, writing a blog post is really like writing a news story, covering
what's going on in the writer's
head<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>. And since thoughts and ideas
come and go, not reporting on them in time (obviously, reporting on
those worth noting), makes them stale, irrelevant and less interesting.
Mind you, though, that they become so in the writer's mind, and not
necessarily in the readers'<sup id="fnref-3"><a class="footnote-ref" href="#fn-3">3</a></sup>.</p>
<h3>My Drafts Graveyard</h3>
<p>It now makes sense why I accumulate tons of drafts, but don't go back to
edit and publish any of them. It's not that they're not good, or not
interesting, but that they're not relevant to me anymore. I lost
interest, as new thoughts are gushing through my head.</p>
<p>When I started this blog, I implemented a writing hack I thought was
useful (I still do) - keeping a <a href="https://prodissues.com/2015/11/drafts.html">draft section</a> in my blog. Every post I start goes into this section, which suppose to help me capture ideas and serve as a springboard for future posts. In reality, though, it's less a springboard and more graveyard of half backed posts.</p>
<h3>Fight Back</h3>
<blockquote>
<p><span class="s1">The formulation of the problem is often more
essential than its solution</span></p>
<p><em>― Albert Einstein</em></p>
</blockquote>
<p>So now that I understand why I never go back to rework on my drafts, it
might be easier to find ways around it. My current approach is to use
the "burn the bridges" strategy <sup id="fnref-4"><a class="footnote-ref" href="#fn-4">4</a></sup>, inspired by Sacha Chua's "<a href="http://sachachua.com/blog/2015/02/clear-out-your-drafts-by-scheduling-minimum-viable-posts/">Clear out your drafts by scheduling Minimum Viable Posts</a>"
post.</p>
<p>The idea is to write a first draft that captures just enough of a
thought to make it understandable. Then, instead of putting it aside and
plan to get back to work on it (which rarely happens), I would schedule
this post to be published in a day or two. Now, I know it's going to go
public and I have no way around it<sup id="fnref-5"><a class="footnote-ref" href="#fn-5">5</a></sup>; I can either iterate on the draft or let it be. But draft it won't be forever.</p>
<p>I use this new strategy with this post, with that very paragraph, which
I'm writing during the grace period before the post published. Next
thing I'm thinking to go through my drafts, and start scheduling few of
them, reminiscence of past time thoughts' news...</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>To further your understanding of news, I recommend <a href="https://www.amazon.com/News-Users-Manual-Alain-Botton/dp/0307379124/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=1473471390&sr=1-1">The News: A User's
Manual</a>, by Alain De Botton <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>I'm not going into the differences of writing styles between news articles and blog posts. <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn-3">
<p>The user will not know, of course about worthy thoughts that have been discarded or laying as uncompleted drafts, craving to be published some day... <a class="footnote-backref" href="#fnref-3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn-4">
<p>“When your army has crossed the border, you should burn your boats and bridges, in order to make it clear to everybody that you have no hankering after home.” -Sun Tzu, The Art of War <a class="footnote-backref" href="#fnref-4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn-5">
<p>Of course, I can cancel the scheduling, but the idea is to let go of that option... <a class="footnote-backref" href="#fnref-5" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>A Hell of a User Journey2016-08-07T23:10:00-04:002016-08-07T23:10:00-04:00yanivtag:prodissues.com,2016-08-07:/2016/08/a-hell-of-a-user-journey.html<p>Well, that's not a user journey in the product sense of the word, but
still a journey that illustrates the bizarre randomness of life...</p>
<!--more-->
<p>Couple of days ago I logged in to
my <a href="https://filethis.com">FileThis</a> account and noticed the balance on
my listed saving account isn’t up to date. So …</p><p>Well, that's not a user journey in the product sense of the word, but
still a journey that illustrates the bizarre randomness of life...</p>
<!--more-->
<p>Couple of days ago I logged in to
my <a href="https://filethis.com">FileThis</a> account and noticed the balance on
my listed saving account isn’t up to date. So I didn't check this
account for a while, and was interested in its actual balance, so I
continued to my online bank account. There, I didn't even find this
account. I googled the issue, and found that I should simply call my
bank and ask to make the saving account visible.</p>
<p>I did, but the customer service weren’t able to locate this account
either. It is probably dormant I was told. You should call the unclaimed
property department and ask to reactivate it, I was told. Inactive?
Unclaimed property??? I started to get anxious. I called that department
the next day, and they too weren’t able to locate it. Go to a physical
branch, the lady on the phone suggested. They’ll have more ways to
locate this missing account.</p>
<p>I went as soon as I possibly could to the nearest branch. It took
awhile, but eventually they were able to find it. It is under my wife's
name, but barely so, because they got wrong almost every piece of
information on her - no social security number and no address. I was
lucky they were even able to associate this account to her. I couldn't
get any information about this account, because I wasn't even
assigned to it, and was asked to come back with my wife and straighten things up. Oh, and when your wife comes, please bring her social security card an id and a proof of address (her info was all messed up in their system), they asked.</p>
<p>Now that the saving account was found I was much more relaxed, but still
wanted to get this all over with. So my wife and I went to the
branch again today. I took with me our social security cards, passports
and ids. I was very careful to stash it in our bag, and made sure I
always have eye on that bag. This is a lot of important documentation.</p>
<p>We got the account and information fixed, and continued to a nice
afternoon in Staten Island. We went by the ferry, had a nice dinner,
spent some time with our daughter in the prime dance, before taking the
ferry back to the city.</p>
<p>In our way back, just as the ferry set sail, I asked my wife for
the bag. I thought you have it, she said. Hmmm, apparently I don’t.
Well, you probably left it on a bench in the promenade. Craaap!!!!! I
never lost a bag, or left one behind. This is the first time I do, and
there can't be a worst time to lose one, with our entire identities in
it. And not only that, but we're in sea, with no way to go back to look
for it.</p>
<p>So I had to go with the ferry back to Manhattan, stay on it and get back
to Staten Island, hoping the bag will wait me there. Yeah right… On the
ferry I asked one of the security guys for help. He tried to do whatever
he could, notified the captain who called the terminal and asked to send
someone for the estimated location where I thought I left the bag. No
luck - they didn’t find it…</p>
<p>I took the ferry back, and run as fast as I could as soon as
it anchored. No bag. I asked around and no one saw anything. I saw in
the distance a man with an orange vest, and hopped he’s patrolling the
area. He did. To my relief he even knew about this lost bag that has a
passport in it... It’s in the precinct, which is just across the street
from the promenade. Run fast before the caps will vulture it… I did, and
couldn’t be happier to have the people at the precinct accepting my
arrival, and being so nice and sensitive with my nervousness...</p>
<p>I back home now, with the bag, still amazed how that random check led to
that mess. A mess that could have gone much much worst…</p>Ortus Rengi2016-07-29T20:37:00-04:002016-07-29T20:37:00-04:00yanivtag:prodissues.com,2016-07-29:/2016/07/ortus-rengi.html<p>Recently I'm into gaming. It started with a nostalgic craving to
Half-Life, which I used to spend hours on, about ages ago. I wondered if
there's a version for mac, and found that there is, in
<a href="http://steamcommunity.com">Steam</a>. I didn't hear about Steam before
(thinking about it, I <em>did</em> hear about …</p><p>Recently I'm into gaming. It started with a nostalgic craving to
Half-Life, which I used to spend hours on, about ages ago. I wondered if
there's a version for mac, and found that there is, in
<a href="http://steamcommunity.com">Steam</a>. I didn't hear about Steam before
(thinking about it, I <em>did</em> hear about it in one of the Cortex podcast
episodes), but once visiting that service, there is no way out... a
spent almost the entire night browsing through games, feeling I'm in
an amusement park. I forgot all about half-life, and eventually immersed
myself in <a href="http://ortusregni.com">Ortus Rengi</a>, a closed-deck,
deck-design strategy card game.</p>Aim Away From The Target2016-05-05T23:18:00-04:002016-05-05T23:18:00-04:00yanivtag:prodissues.com,2016-05-05:/2016/05/aim-away-from-the-target.html<p>Yesterday my blog writing meetup got together. We talked about voice:<br>
how do you transfer raw thoughts from your brain, to your hands and type
them to the screen without losing their authenticity. How can you make
your writing read as if you were speaking it? How can you make …</p><p>Yesterday my blog writing meetup got together. We talked about voice:<br>
how do you transfer raw thoughts from your brain, to your hands and type
them to the screen without losing their authenticity. How can you make
your writing read as if you were speaking it? How can you make your
readers hear you speaking to them through your posts?</p>
<p>Here are couple of posts we read, as examples for strong sense of unique
voice, which the authors were able to maintain, or maybe convey:</p>
<ul>
<li><a href="http://roxanegay.tumblr.com/post/143464148055/the-kale-was-talking-shit-to-me">The Kale Was Talking Shit To Me</a> (by
Roxane Gay)</li>
<li><a href="http://www.kinderkamackroad.com/too-cheerful.html?entry=rat">Rats</a> (by
Joshep Minion)</li>
</ul>
<p>My biggest takeaway from the discussion last night was that voice
<em>isn't</em> something I can think of or plan for when writing. Instead I
<em>should not</em> think of it. Only when I won't, my voice <em>will</em> find its
way, and slip into my writing.</p>
<p>Holly, on of the group members, put it nicely, paraphrasing on "Zen in
the Art of Archery"</p>
<blockquote>
<p>Aim away from the target.</p>
</blockquote>
<p>If only it was that easy, though...</p>Chronicles of Addiction2016-05-05T22:27:00-04:002016-05-05T22:27:00-04:00yanivtag:prodissues.com,2016-05-05:/2016/05/chronicals-of-addiction.html<p>6 months ago I listened to <a href="https://www.relay.fm/cortex/1">a podcast</a>,
and learned for the first time about this mechanical keyboard thing.</p>
<p>I was intrigued and began reading about it.</p>
<p>3 weeks later I bought a <a href="http://www.wasdkeyboards.com/index.php/products/code-keyboard/code-104-key-mechanical-keyboard-1303.html">wasd code</a>.</p>
<p>I kinda liked it, but not that much. The blue switches, together with
the thin …</p><p>6 months ago I listened to <a href="https://www.relay.fm/cortex/1">a podcast</a>,
and learned for the first time about this mechanical keyboard thing.</p>
<p>I was intrigued and began reading about it.</p>
<p>3 weeks later I bought a <a href="http://www.wasdkeyboards.com/index.php/products/code-keyboard/code-104-key-mechanical-keyboard-1303.html">wasd code</a>.</p>
<p>I kinda liked it, but not that much. The blue switches, together with
the thin keycaps felt flimsy and hollow. The typing experience wasn't
what I imagined it to be.</p>
<p>More research, and I've learned about the different types of switches. I
returned blues and replaced with a <a href="http://www.wasdkeyboards.com/index.php/products/code-keyboard/code-104-key-mechanical-keyboard-mx-green.html">tenkeyless greens</a>.</p>
<p>The sound and tactile feel of the green switches was better, but the
typing experience still wasn't there.</p>
<p>I'm looking for mechs on Craigslist and find this old <a href="http://stanis.net/uvpub/omnikey102.html">Northgste
keyboard</a>. I google and find
its an old classic. Trying to buy it didn't work, but I'm getting hooked
to old school keyboards. Shortly after, I venture with an <a href="https://deskthority.net/wiki/Apple_Extended_Keyboard_II">Apple
Extended Keyboard 2</a>.</p>
<p>The AEK2 felt like a dream. But it's 30 years old keys start to die one
after the other.</p>
<p>I've turned into a keyboard doctor and gave it an <a href="https://prodissues.com/2016/01/fixing-my-apple-extended-keyboard-ii.html">open heart
surgery</a>.</p>
<p>I'm delving deeper into mechs, and spend hours
at <a href="https://www.reddit.com/r/MechanicalKeyboards/">r/MechanicalKeyboards/</a>.</p>
<p>I heard about Massdrop. This horrible site detached me from hundreds of
dollars.</p>
<p>There is more to mechanical keyboards than just the switches. As it
turned out keycaps is an entire area that I wasn't aware of. I'm
learning about all the different profiles. SA looked awesome, but there
is a Granit DSA drop in Massdrop, and I can't hold myself from
committing to it.</p>
<p>I need to see and try more keyboards than I can buy, so I'm starting a
<a href="http://www.meetup.com/Click-clack-Mechanical-Keyboard/">mechanical keyboard meetup</a>.</p>
<p>The granit drop was closed 2 and I'm getting the keys 3 months later.</p>
<p>I'm swapping the crappy wasd keys, but finding that the stabilizers
won't fit into the new granit keycaps, so I buy silicon tape and wrap
it over the stabilizers to make it fit more closely with the new
granits.</p>
<p>My renewed code can finally compete with the AEK2; compete but never
win...</p>
<p>What have become of me... How have I been sucked into this world...?</p>
<p>Anyway, I'm starting to feel an itch for a portable mech. For travels.
Going to hunt a 60% drop.</p>
<p>The lesson: never listen to podcasts again.</p>Morning Muses2016-04-26T22:46:00-04:002016-04-26T22:46:00-04:00yanivtag:prodissues.com,2016-04-26:/2016/04/410.html<p>One writing hack is to read something by someone you admire, before
going about writing. Today, I went on my morning pages right after
reading "<a href="http://www.opensourceshakespeare.org/views/plays/playmenu.php?WorkID=tempest">The Tempest</a>", one of Shakespeare's most lyrical plays. Here's the outcome...:</p>
<p>I'm on a flight back from a well needed vacation in the Caribbean,
the …</p><p>One writing hack is to read something by someone you admire, before
going about writing. Today, I went on my morning pages right after
reading "<a href="http://www.opensourceshakespeare.org/views/plays/playmenu.php?WorkID=tempest">The Tempest</a>", one of Shakespeare's most lyrical plays. Here's the outcome...:</p>
<p>I'm on a flight back from a well needed vacation in the Caribbean,
the first, in a long time, which got me to an almost complete
relaxation. I got my sleep deprivation settled, feel refreshed and
recharged, ready to a new adventure. And a new adventure is right by the
corner, hopefully this week its nature I will uncover. Writing
prosaically, a Shakespeare influence it must be, hence can settle the
battle between writing and reading. My mind craves the taste of a good
book, but bloated from the excessive thoughts it has absorbed, with way
not to let them out.</p>
<p>Such fun it is to write this way, encrypting my thoughts, the key to
which known to only me.</p>
<p>What's in me, but a storm? I can't make my mind if I'm an owner or under
someone else's power. I want to make some of my own, yet can't commit
for the sum with which it comes.</p>
<p>I like this muse, it makes me flow, it make my mind fly, sing and play.
Lots of serious business to consider, but I'm going to let my heart take
the final decision.</p>
<p>Here, here, for a fun afternoon astir.</p>From an Idea to an MVP2016-04-18T00:00:00-04:002016-04-18T00:00:00-04:00yanivtag:prodissues.com,2016-04-18:/2016/04/from-an-idea-to-an-mvp.html<p>So I have this <a href="https://prodissues.com/2016/03/make-food-fun-again.html">idea for food recommendation</a>, but now I'm struggling with where to start. What will be a good first usecase for a POC or MVP.</p>
<p>At the moment, I'm planning on a single page dashboard where users can
login to, to get a report on their food …</p><p>So I have this <a href="https://prodissues.com/2016/03/make-food-fun-again.html">idea for food recommendation</a>, but now I'm struggling with where to start. What will be a good first usecase for a POC or MVP.</p>
<p>At the moment, I'm planning on a single page dashboard where users can
login to, to get a report on their food ordering habits - top dishes and
restaurants and more such data.</p>
<p>But I have are two issues with scope:</p>
<ol>
<li>Not sure users will see the value that I see in such dashboard. Now,
sure, that's what the MVP is for, but:</li>
<li>It's not testing the real product assumption that users will want to
get recommendations for food.</li>
</ol>
<p>With that in mind, I thought of two other options:</p>
<ol>
<li>Dishes following - as a user, I can follow the food that I like and
see updates, recipes and places I can find them.</li>
<li>Group ordering - offer a simple 'negotiator' for food ordering. For
example, a group of 4 people who want to order lunch, will connect
to this page and put their preferences. The system will match their
preferences and come with a suggested restaurant. Users can then
save their preferences by registering. It reminds me of
<a href="http://www.doodle.com/">doodle.com</a>.</li>
</ol>
<p>I like the other option both because it requires less technical effort -
I can see how I can pull out an MVP without writing a line of code. In
addition, this can turn out to be a utility that users will be willing
to register to. Lastly, solving for groups orders introduce the
possibility for virality and network effect.</p>On Not Writing2016-04-17T14:00:00-04:002016-04-17T14:00:00-04:00yanivtag:prodissues.com,2016-04-17:/2016/04/on-not-writing.html<p>I'm sitting in Pret, at my favorite spot in the store, dark coffee with
tons of sugar, listening to <a href="https://www.youtube.com/watch?v=i5Kwf_nNmGI">Requiem For A Dream</a> for the gazillionth time. This was the soundtrack of my life for the last month, playing in an infinite loop, and with every repeat charging me with …</p><p>I'm sitting in Pret, at my favorite spot in the store, dark coffee with
tons of sugar, listening to <a href="https://www.youtube.com/watch?v=i5Kwf_nNmGI">Requiem For A Dream</a> for the gazillionth time. This was the soundtrack of my life for the last month, playing in an infinite loop, and with every repeat charging me with more energy. So much energy, that I'm about to explode.</p>
<p>For a month now, I'm doing some of the coolest stuff I've ever did. At
work, the product and team I'm leading got the recognition it deserve<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>, being featured by Mark Zuckerberg in the opening keynote at F8<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>.</p>
<p>In parallel, I'm working on <a href="https://prodissues.com/2016/03/make-food-fun-again.html">my own thing</a>, and while looking for a technical co-founder, I've started to get my hands dirty with code. Elastic search, python scripts, email scrapping, logstach and kibana are just few of the technologies I got myself
familiarized with.</p>
<p>Everything good except for one thing: I didn't write a single post during all that time. If writing was part of me, this would have been the best month for it to flourish. I could share so many experiences, learning and lessons; I could also even brag (just a little) about some the successes my team had. But nothing got documented. This month was like a dream vacation where I took no photos.</p>
<p><strong>But all is not lost</strong>. When I started this blog, I "bought" an
"insurance policy", specifically for that situation. I initiated the
<a href="http://www.meetup.com/Blog-writing/">Blog Writing meetup</a> and
surrounded myself with people who are passionate about writing, who can
support me, while supporting each other, to stay on the wagon (or is it
off the wagon...).</p>
<p>This week, I made a claim to my insurance. In our monthly meetup, I
shared with the group my struggle in keep writing during this crazy
month, and my frustration when finding that the writing mussel got
weaken so quickly when not being trained for only this short period,
hindering me from getting back to writing.</p>
<p>Fortunately, my investment paid off. I learned from members of the group
not only the writing-hacks that might help me get back on writing, but
that I'm not the only one suffering from those symptoms.</p>
<p>Sue Hellene, a novelist and a published author, shared that she has
different moods for writing, and can't write productively at night. She
also related with my feeling that writing is like a muscle, and that it
weakens if not trained regularly. Melody had many good tips to overcome
writers' block. For her, setting a deadline for each post, absorbing
herself in the editor, eliminating any possible destruction (read -
disconnect from the internet...), and, sometime, the a glass of wine,
help keeping her writing on track. Dee-on reminded me of the morning
pages, which were my initial inspiration. And lastly, Joe's post, <a href="http://www.kinderkamackroad.com/too-cheerful.html?entry=the-look-of-silence">"The
Look of Silence"</a>, helped me think of my posts as notes-to-self again, and not worried about those who might read them, hence freeing myself to write whatever on my mind.</p>
<p>And thanks to that group, here I am, writing again. Sitting in this coffee place, starting from a morning page that turned into this post, my Emacs is in full screen and I'm committed to push publish before going back home. Nothing special, interesting, or helpful in this post, just a small, personal, step forward; a light jog after a month of no exercises. Rarely will a quote from physics will be that appropriate:</p>
<blockquote>
<p>"Every object in a state of uniform motion tends to remain in that
state of motion unless an external force is applied to it." Newton's
First Law of Motion</p>
</blockquote>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>At least from the technology world. wish it would have a fraction of it
internally... <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>Details on what that product is will come in a follow-up post... <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Make Food Fun Again2016-03-20T00:00:00-04:002016-03-20T00:00:00-04:00yanivtag:prodissues.com,2016-03-20:/2016/03/make-food-fun-again.html<p>So this idea that I had. I was talking with a company that is doing
personalization for jobs - UpScored. I knew Elise, their CEO, from
twitter and gave their newly launched product a spin. I came back with
some feedback, and after a good chat with Elise, I realized that …</p><p>So this idea that I had. I was talking with a company that is doing
personalization for jobs - UpScored. I knew Elise, their CEO, from
twitter and gave their newly launched product a spin. I came back with
some feedback, and after a good chat with Elise, I realized that the
problem I'm working on my day-to-day - personalization engine for
content, is relevant for other fields as well.</p>
<p>A day later, I was introduced to on of the co-founders of Plated - a
meal planning service. He's story, of how they've started the company,
reminded me a lot of how and why I've started FeedMe - a marketplace for
food company that I started about 5 years ago and close about a year
later. He was talking about Plated as a food-tech company, while I was
struggling what technology had to do with the service, other than having
a consumer facing website.</p>
<p>Anyway, at that point I was doing one plus one in my head, and the idea
to develop a true technological approach to food discovery popped up. I
want to develop an app that will tell <strong>me</strong> what I want to eat. Let me
offer some context, though.</p>
<p>While food related technologies and services proliferate, the simple
question of "what to eat?" becomes harder than ever.</p>
<p>Here's an example: last weekend I went to Austin, for the SXSW festival.
I landed on Friday morning, and headed downtown for breakfast. I opened
Yelp, to "discover" what I should be eating. But after looking into the
first 5 results (out of hundreds), I became hungrier and less patient,
so I picked up the first restaurant that I saw across the street, and
which seemed decent. Yelp didn't help me to "discover" the best of
Austin.</p>
<p>Another example: Every night (no exaggerations), I have the same dialog
with my wife:</p>
<p><img alt="Screen_Shot_2016-03-20_at_00.03.51.png" src="http://media.prodissues.com/images/2016/03/Screen_Shot_2016-03-20_at_00.03.51.png"></p>
<p>So the problem is that not being able to choose what to eat takes the
fun out of the food experience. I want an app, or a service that will
take the decision for me, based on my history, my taste, my diet and
that's of my partner for the order.</p>
<p>I spent the previous week researching, brainstorming with friends,
wire-framing and what not, and got a long way in defining the problem
and focusing the approach for the solution. More on it in following
posts.</p>An idea...2016-03-09T13:07:00-05:002016-03-09T13:07:00-05:00yanivtag:prodissues.com,2016-03-09:/2016/03/an-idea.html<p>I have an idea.</p>
<p>I just want to mark the date; will share more later on :-)</p><p>I have an idea.</p>
<p>I just want to mark the date; will share more later on :-)</p>Just A Couple Of Emacs Keybindings2016-02-23T00:00:00-05:002016-02-23T00:00:00-05:00yanivtag:prodissues.com,2016-02-23:/2016/02/intertesting-keybindings-in-emacs.html<p>Every now and then I'll type something in Emacs with a certain goal,
just to find that I get something completely different from what I've
intended.</p>
<p>When in org file, I tried to convert a list item to a sub-header. The
keybinding to make this conversion is <code>C-c *</code>. But when …</p><p>Every now and then I'll type something in Emacs with a certain goal,
just to find that I get something completely different from what I've
intended.</p>
<p>When in org file, I tried to convert a list item to a sub-header. The
keybinding to make this conversion is <code>C-c *</code>. But when I (thought I)
typed it, instead of getting a sub-header, a new buffer opened at the
bottom of the frame - a calculator:</p>
<p><img alt="emacs-calc-mode.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/emacs-calc-mode.png"></p>
<p><span class="figure-number">Figure 1:</span> Calc mode</p>
<h2>view-lossage</h2>
<p>I had no idea how did <em>that</em> happen, and luckily recalled a <a href="https://www.reddit.com/r/emacs/comments/3w46xu/how_did_i_get_here_command/cxt6w6r">tip I
got</a>, on how to move back in time using the <code>view-lossage</code> command, which
display last 300 input keystrokes. Doing so, I found that instead of
<code>C-c *</code>, I typed <code>C-x *</code>.</p>
<p>So now I know (and hopefully remember) that:</p>
<ol>
<li>There's a calculator<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup> in Emacs, bound to
<code>C-x *</code></li>
<li><code>C-h l</code> is a useful way to track back clumsy keystrokes</li>
</ol>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>Not that I had any doubts there is, just didn't think to look for it
just yet. There are so many other "to-learn" things on my list... <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>NY Mechanical Keyboards Meetup2016-02-22T16:09:00-05:002016-02-22T16:09:00-05:00yanivtag:prodissues.com,2016-02-22:/2016/02/ny-mechanical-keyboards-meetup.html<p>I've just started a new meetup group in NYC. This groups is all about
mechanical keyboards! </p>
<p>So if you're around (in the NYC area), if you have reminiscences to the
tactile feel and click-clacky noise keyboards used to have when you were
a kid, if you're already spellbound, spending hundreds …</p><p>I've just started a new meetup group in NYC. This groups is all about
mechanical keyboards! </p>
<p>So if you're around (in the NYC area), if you have reminiscences to the
tactile feel and click-clacky noise keyboards used to have when you were
a kid, if you're already spellbound, spending hundreds of dollars in
Massdrop, if you know everything about SA and DSA, if you're one of the
5% who had their space-bar flipped, if you have just built your own
Ergdox, or if you just want to learn what's all the fuss with those
retro, charming typing devices - <a href="http://www.meetup.com/Click-clack-Mechanical-Keyboard/">join us</a>! </p>Emacs GPG For Dummies2016-02-16T00:00:00-05:002016-02-16T00:00:00-05:00yanivtag:prodissues.com,2016-02-16:/2016/02/emacs-gpg-for-dummies.html<p>I've <a href="https://prodissues.com/2016/02/adding-mu4e-support-to-emacs.html">set up mu4e</a>, and have my Gmail credentials stored in two files:</p>
<ol>
<li><code>.offlineimaprc</code> - this file is used by Offlineimap to connect to my
Gmail and sync my inbox with mu4e.</li>
<li><code>.authinfo</code> - that file stores my Gmail credential, and used by
Emacs to send emails.</li>
</ol>
<!--more-->
<p>Unfortunately, both of those files …</p><p>I've <a href="https://prodissues.com/2016/02/adding-mu4e-support-to-emacs.html">set up mu4e</a>, and have my Gmail credentials stored in two files:</p>
<ol>
<li><code>.offlineimaprc</code> - this file is used by Offlineimap to connect to my
Gmail and sync my inbox with mu4e.</li>
<li><code>.authinfo</code> - that file stores my Gmail credential, and used by
Emacs to send emails.</li>
</ol>
<!--more-->
<p>Unfortunately, both of those files are plain text, and though I’m not a
security freak, I’m uncomfortable storing my passwords out in the open.
So, I went ahead to find out how to encrypt them. Most of the tutorials
I read were too technical, and covered much more than my simple usecase.
It’s not that I couldn’t follow theme, but I know I wouldn’t have
retained the information, and able to retract my steps if I needed to in
the future.</p>
<p>My goal with this post was to create a simple guide on how to install
gpg, generate a key, and use it in mu4e. I failed... I thought I will be
able to it non-technical for the most part, but once getting to
configure Emacs and mu4e to work with gpg, I had to delve into some
heavy configuration, which included the creation of a python script to
work along Offlineimap... The good thing is that this guide <em>will</em> help
you get Emacs and mu4e work with an encrypted version of a <code>.authinfo</code>
file, and your credentials will remain secret.</p>
<p>Now that our expectations are set, and assuming you're up for the ride,
lets start this journey.</p>
<h2>Installing GPG</h2>
<div class="highlight"><pre><span></span>~ $ brew install gpg
</pre></div>
<p>Let's make sure gpg was installed:</p>
<div class="highlight"><pre><span></span>~ $ gpg --version
</pre></div>
<p><img alt="gpg--version.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/gpg--version.png"></p>
<p><span class="figure-number">Figure 1:</span> gpg version information
along with the list of supported algorithms</p>
<p>Now really, the most informative source of information is gpg's help. Go
ahead and skim it:</p>
<div class="highlight"><pre><span></span><span class="nv">~</span> <span class="nv">$</span> <span class="nv">gpg</span> <span class="nv">-h</span>
</pre></div>
<h2>Create a key</h2>
<div class="highlight"><pre><span></span>~ $ gpg --gen-key
</pre></div>
<p>There’s a simple wizard that lets you set the encryption type, and asks
for your name, email address and other comments. Those details will be
associated with your key.</p>
<p>Next, you’ll be asked to create a passphrase. This is like the password
to your secret key. If you lose it, you’ll have no access to any of the
information encrypted with this key. So don’t ever lose it…</p>
<p>Here’s how this flow looks like:</p>
<div class="highlight"><pre><span></span>~ $ gpg --gen-key
gpg <span class="o">(</span>GnuPG<span class="o">)</span> <span class="m">1</span>.4.19<span class="p">;</span> Copyright <span class="o">(</span>C<span class="o">)</span> <span class="m">2015</span> Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please <span class="k">select</span> what kind of key you want:
<span class="o">(</span><span class="m">1</span><span class="o">)</span> RSA and RSA <span class="o">(</span>default<span class="o">)</span>
<span class="o">(</span><span class="m">2</span><span class="o">)</span> DSA and Elgamal
<span class="o">(</span><span class="m">3</span><span class="o">)</span> DSA <span class="o">(</span>sign only<span class="o">)</span>
<span class="o">(</span><span class="m">4</span><span class="o">)</span> RSA <span class="o">(</span>sign only<span class="o">)</span>
Your selection? <span class="m">1</span>
RSA keys may be between <span class="m">1024</span> and <span class="m">4096</span> bits long.
What keysize <span class="k">do</span> you want? <span class="o">(</span><span class="m">2048</span><span class="o">)</span>
Requested keysize is <span class="m">2048</span> bits
Please specify how long the key should be valid.
<span class="nv">0</span> <span class="o">=</span> key does not expire
<n> <span class="o">=</span> key expires in n days
<n>w <span class="o">=</span> key expires in n weeks
<n>m <span class="o">=</span> key expires in n months
<n>y <span class="o">=</span> key expires in n years
Key is valid <span class="k">for</span>? <span class="o">(</span><span class="m">0</span><span class="o">)</span>
Key does not expire at all
Is this correct? <span class="o">(</span>y/N<span class="o">)</span> y
You need a user ID to identify your key<span class="p">;</span> the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
<span class="s2">"Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"</span>
Real name: Jane Roe
Email address: jane@example.com
Comment: lorem ipsum
You selected this USER-ID:
<span class="s2">"Jane Roe (lorem ipsum) <jane@example.com>"</span>
Change <span class="o">(</span>N<span class="o">)</span>ame, <span class="o">(</span>C<span class="o">)</span>omment, <span class="o">(</span>E<span class="o">)</span>mail or <span class="o">(</span>O<span class="o">)</span>kay/<span class="o">(</span>Q<span class="o">)</span>uit? O
You need a Passphrase to protect your secret key.
We need to generate a lot of random bytes. It is a good idea to perform
some other action <span class="o">(</span><span class="nb">type</span> on the keyboard, move the mouse, utilize the
disks<span class="o">)</span> during the prime generation<span class="p">;</span> this gives the random number
generator a better chance to gain enough entropy.
..........+++++
.+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action <span class="o">(</span><span class="nb">type</span> on the keyboard, move the mouse, utilize the
disks<span class="o">)</span> during the prime generation<span class="p">;</span> this gives the random number
generator a better chance to gain enough entropy.
..........+++++
...+++++
gpg: key 86B62C98 marked as ultimately trusted
public and secret key created and signed.
gpg: checking the trustdb
gpg: <span class="m">3</span> marginal<span class="o">(</span>s<span class="o">)</span> needed, <span class="m">1</span> complete<span class="o">(</span>s<span class="o">)</span> needed, PGP trust model
gpg: depth: <span class="m">0</span> valid: <span class="m">2</span> signed: <span class="m">0</span> trust: <span class="m">0</span>-, 0q, 0n, 0m, 0f, 2u
pub 2048R/86B62C98 <span class="m">2016</span>-02-17
Key <span class="nv">fingerprint</span> <span class="o">=</span> 42FD C031 BD51 4CC8 7C02 EA14 35D4 80A2 86B6 2C98
uid Jane Roe <span class="o">(</span>lorem ipsum<span class="o">)</span> <jane@example.com>
sub 2048R/8C0D5E5D <span class="m">2016</span>-02-17
~ $
</pre></div>
<p>Now that you've created a key, you can go ahead and sign the <code>.authinfo</code>
file.</p>
<h2>Sign and encrypt the <code>.authinfo</code> file<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup></h2>
<div class="highlight"><pre><span></span>~ $ gpg -se .authinfo
</pre></div>
<p>You'll be asked for your passphrase. Enter it, and the <code>.authinfo</code> will
be signed, and renamed to <code>.authinfo.gpg</code></p>
<p><a href="https://www.emacswiki.org/emacs/GnusAuthinfo">EmacsWiki</a> suggests to
limit permission to this file. I find it important:</p>
<div class="highlight"><pre><span></span>~ $ chmod <span class="m">600</span> .authinfo.gpg
</pre></div>
<p>Back in Emacs, there are couple of changes we need to make in order for
mu4e to start working with the <code>,authinfo.gpg</code> file. I wish I read <a href="https://gist.github.com/areina/3879626">this
gist</a> before, because it covers
those changes succinctly, but here is a summary of those modifications:</p>
<h2>Changes to <code>.offlineimaprc</code></h2>
<p>Two additions:</p>
<ol>
<li>A reference to a python file where you'll store a function to fetch
your credentials from the <code>.authinfo.gpg</code> file</li>
<li>Under the <code>[Repository Remote]</code> section add the call to the
<code>get_password_emac</code> function</li>
</ol>
<p>Here's how your <code>.offlineimaprc</code> file will look like afterwards:</p>
<div class="highlight"><pre><span></span><span class="nv">[general]</span>
<span class="nv">accounts</span> <span class="nb">=</span> <span class="nv">Gmail</span>
<span class="nv">maxsyncaccounts</span> <span class="nb">=</span> <span class="mi">3</span>
<span class="nv">pythonfile</span> <span class="nb">=</span> <span class="nv">~/.offlineimap.py</span>
<span class="nv">[Account</span> <span class="nv">Gmail]</span>
<span class="nv">localrepository</span> <span class="nb">=</span> <span class="nv">Local</span>
<span class="nv">remoterepository</span> <span class="nb">=</span> <span class="nv">Remote</span>
<span class="nv">[Repository</span> <span class="nv">Local]</span>
<span class="k">type</span> <span class="nb">=</span> <span class="nv">Maildir</span>
<span class="nv">localfolders</span> <span class="nb">=</span> <span class="nv">~/Maildir</span>
<span class="nv">[Repository</span> <span class="nv">Remote]</span>
<span class="k">type</span> <span class="nb">=</span> <span class="nv">IMAP</span>
<span class="nv">remoteuser</span> <span class="nb">=</span> <span class="nv">yanivdll@gmail.com</span>
<span class="nv">remotehost</span> <span class="nb">=</span> <span class="nv">imap.gmail.com</span>
<span class="nv">remotepasseval</span> <span class="nb">=</span> <span class="nv">get_password_emacs</span><span class="p">(</span><span class="s">"imap.gmail.com"</span><span class="o">,</span> <span class="s">"yanivdll@gmail.com"</span><span class="o">,</span> <span class="s">"993"</span><span class="p">)</span>
<span class="nv">ssl</span> <span class="nb">=</span> <span class="nv">yes</span>
<span class="nv">sslcacertfile</span> <span class="nb">=</span> <span class="nv">/usr/local/etc/openssl/certs/ca-bundle.crt</span>
<span class="nv">maxconnections</span> <span class="nb">=</span> <span class="mi">1</span>
<span class="nv">realdelete</span> <span class="nb">=</span> <span class="nv">no</span>
</pre></div>
<h2>Add a <code>.offlineimap.py</code> file</h2>
<p>This file will define the <code>get_password_emac</code> function:</p>
<div class="highlight"><pre><span></span><span class="ch">#!/usr/bin/python</span>
<span class="kn">import</span> <span class="nn">re</span><span class="o">,</span> <span class="nn">os</span>
<span class="k">def</span> <span class="nf">get_password_emacs</span><span class="p">(</span><span class="n">machine</span><span class="p">,</span> <span class="n">login</span><span class="p">,</span> <span class="n">port</span><span class="p">):</span>
<span class="n">s</span> <span class="o">=</span> <span class="s2">"machine </span><span class="si">%s</span><span class="s2"> login </span><span class="si">%s</span><span class="s2"> port </span><span class="si">%s</span><span class="s2"> password ([^ ]*)</span><span class="se">\n</span><span class="s2">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">machine</span><span class="p">,</span> <span class="n">login</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="n">s</span><span class="p">)</span>
<span class="n">authinfo</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">popen</span><span class="p">(</span><span class="s2">"gpg -q --no-tty -d ~/.authinfo.gpg"</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="k">return</span> <span class="n">p</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">authinfo</span><span class="p">)</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</pre></div>
<h2 id="orgheadline6">Changes to mu4e config</h2>
<hr>
<p>Lastly, in your Emacs config, under the mu4e smtp settings, add a
reference to the encrypted auth file:</p>
<div class="highlight"><pre><span></span><span class="o">...</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">message-send-mail-function</span> <span class="ss">'smtpmail-send-it</span>
<span class="nv">starttls-use-gnutls</span> <span class="no">t</span>
<span class="nv">smtpmail-starttls-credentials</span>
<span class="o">'</span><span class="p">((</span><span class="s">"smtp.gmail.com"</span> <span class="mi">465</span> <span class="no">nil</span> <span class="no">nil</span><span class="p">))</span>
<span class="nv">smtpmail-auth-credentials</span>
<span class="p">(</span><span class="nv">expand-file-name</span> <span class="s">"~/.authinfo.gpg"</span><span class="p">)</span>
<span class="nv">smtpmail-default-smtp-server</span> <span class="s">"smtp.gmail.com"</span>
<span class="nv">smtpmail-smtp-server</span> <span class="s">"smtp.gmail.com"</span>
<span class="nv">smtpmail-smtp-service</span> <span class="mi">465</span>
<span class="nv">smtpmail-debug-info</span> <span class="no">t</span><span class="p">)</span>
<span class="o">...</span>
</pre></div>
<p>Now, you're emails should be sent using the <code>.authinfo.gpg</code> file. Go on
and try it<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>. Note that before actually sending the email, Emacs will ask for your pass-phrase<sup id="fnref-3"><a class="footnote-ref" href="#fn-3">3</a></sup></p>
<h2>Extras</h2>
<h3>Backup private key</h3>
<p>I stored all the information related to my gpg key, as well as a backup
file in my <a href="https://agilebits.com/onepassword">1password</a>. Here's how I
created the key backup:</p>
<div class="highlight"><pre><span></span>~ $ gpg --export-secret-keys --armor jane@example.com > jroe-privkey.asc
</pre></div>
<p><strong>Important:</strong> Make sure to store the output file in a secure place; it
contains your private key in plain text.</p>
<h3>Encrypt text in Emacs</h3>
<ol>
<li>Mark the text you would like to encrypt</li>
<li>Run <code>M-x epa-encrypt-region</code></li>
<li>Mark the key you would like to use for encryption</li>
</ol>
<p>Now the encrypted text will replace the original, plain, text:</p>
<p><img alt="encrypted-text.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/encrypted-text.png"></p>
<p><span class="figure-number">Figure 2:</span> <code>M-x epa-encrypt-region</code>
will encrypt a region of text in Emacs</p>
<h3>Decrypt text</h3>
<p>To decrypt a message, or a file you've encrypted:</p>
<ol>
<li>Mark the text you would like to decrypt (you'll have to mark also
the header and footer of the message)</li>
<li>
<p>Run <code>M-x epa-decrypt-region</code>
<div class="figure"></p>
<p><img alt="decrypt-text.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/decrypt-text.png"></p>
<p><span class="figure-number">Figure 3:</span>
<code>M-x epa-decrypt-region</code> will decrypt a region of text in Emacs</p>
</div>
</li>
<li>
<p>Enter your pass-phrase</p>
</li>
<li>Emacs will ask if you want the decrypted text to replace the
original text. If you choose "No", it will open the text in a
second window.</li>
</ol>
<p><img alt="decrypted-text-2.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/decrypted-text-2.png"></p>
<p><span class="figure-number">Figure 4:</span> The decrypted text in a
second window</p>
<p>That's it. If you're interested in more than the basics that I went
through above, try the links bellow.</p>
<h2>Reference</h2>
<ul>
<li><a href="https://www.gnupg.org/documentation/howtos.html">Gnupg - documentation</a></li>
<li>Using gpg in emacs - <a href="https://www.gnu.org/software/emacs/manual/html_mono/epa.html#Quick-start">EasyPG Assistant user’s manual</a></li>
<li><a href="https://fedoraproject.org/wiki/Creating_GPG_Keys#ExportCLI">Fedora Wiki pages</a> - GPG essentials</li>
<li><a href="https://www.emacswiki.org/emacs/GnusAuthinfo">EmacsWiki - GnusAuthinfo</a></li>
<li><a href="http://danzorx.tumblr.com/post/11976550618/easypg-for-emacs-on-os-x-or-sometimes-emacs">Tricotism - EasyPG for Emacs on OS X, or sometimes Emacs doesn’t load the env paths you might expect</a></li>
<li><a href="http://ubuntuforums.org/showthread.php?t=2155060">ubuntu forums</a> Encrypting and decrypting a message</li>
</ul>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>Made an edit here (initially, I only signed the file, without encrypting
it). Thanks <a href="https://www.reddit.com/user/aminb">/u/aminab</a> for <a href="https://www.reddit.com/r/emacs/comments/46fi6f/adding_mu4e_support_to_emacs_part_two_configuring/d04szm3">the
correction</a>. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>If you still have the <code>.authinfo</code> file, rename it. Once we see that mu4e
sends emails using the encrypted version of the auth file, we can
dispose this, decrypted, version of it. <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn-3">
<p>If Emacs asks for your passphrase too often, you might find this
<a href="https://www.reddit.com/r/emacs/comments/45lx1s/adding_mu4e_support_to_emacs_the_hard_way/d01b1hu">comment in Reddit</a>, by <a href="https://www.reddit.com/user/aminb">/u/aminb</a>, helpful. <a class="footnote-backref" href="#fnref-3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Adding mu4e Support To Emacs2016-02-12T00:00:00-05:002016-02-12T00:00:00-05:00yanivtag:prodissues.com,2016-02-12:/2016/02/adding-mu4e-support-to-emacs.html<p>Couple of months ago<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup> I started to use Emacs
as my secondary email client; the primary one remains Gmail's web
interface. Bringing my Gmail account to Emacs wasn't as smooth sail as I
hoped it to be, but I'm happy with the results so far.</p>
<!--more-->
<h2>Why use Emacs for …</h2><p>Couple of months ago<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup> I started to use Emacs
as my secondary email client; the primary one remains Gmail's web
interface. Bringing my Gmail account to Emacs wasn't as smooth sail as I
hoped it to be, but I'm happy with the results so far.</p>
<!--more-->
<h2>Why use Emacs for emails?</h2>
<ul>
<li>Because ~~I~~ Emacs can.</li>
<li>Because when writing a serious email (one with more than two lines),
I usually draft it in an editor first. Now that this editor is
Emacs, it makes sense to do the editing <em>and</em> the sending parts
in it...</li>
<li>Because I want org support for my emails</li>
<li>And, because <a href="https://www.google.com/search?q=emacs+email%5C&client=safari&rls=en&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjSnqe8ys_JAhXH2D4KHYPAD4kQ_AUIBygB&biw=1496&bih=1003#tbm=isch&q=emacs+email">these images</a> makes emails look way cooler in Emacs than in any other client.</li>
</ul>
<h2>Choosing an email client</h2>
<p>I went back and forth between mu4e and gnus, and finally took <a href="http://codingquark.com/setting-up-gnus-in-emacs/">Dhavan
Vaidya's</a> advice to
pick one and just move on with it. Unlike him, though, I chose mu4e,
mainly because its focus on search.</p>
<p>So here we go - implementing mu4e in Emacs. For a quick and dirty
checklist, follow the first part, which summaries the steps to get mu4e
working. If you're more of an FPS person, and interested in the details,
read through the second part, which journals my steps as well as the
errors I encountered and their fixes.</p>
<blockquote>
<p>Note: The <a href="http://www.djcbsoftware.nl/code/mu/mu4e/index.html">Mu4e official manual</a> is great, as long as everything works flawlessly. In my case, though, I run through every problem and error possible. So if you want to install mu4e, I recommend you'll start with the manual. If you get stuck, or encounter a problem, you might find the solution here.</p>
</blockquote>
<h2>The short story</h2>
<ol>
<li>Install <a href="http://brew.sh/">Homebrew</a></li>
<li>Install <a href="http://offlineimap.org/">offlineimap</a></li>
<li>Configure offlineimap to point to the IMAP server you would like to
connect to.</li>
<li>Run offlineimap for the first time to download your IMAP folder from
the remote server.</li>
<li>Get mu from git: <a href="https://github.com/djcb/mu">https://github.com/djcb/mu</a></li>
<li>Run mu to index and load the messages into Emacs.</li>
<li>Configure your Emacs init file to connect with mu4e and customize
the client.</li>
<li>On Emacs, run - <code>M-x mu4e</code></li>
</ol>
<h2>The details</h2>
<p>According to the manual, mu4e is only a client, or an interface to my
emails, and does non of the fetching, storing, editing or sending them
on its own.</p>
<blockquote>
<p>This leaves mu4e to concentrate on what it does best: quickly finding
the mails you are looking for, and handle them as efficiently as
possible.</p>
</blockquote>
<p>Mu4e should, therefore, be complemented with the other components to
work. My hope is that installing all those packages won't be too big of
a hassle... And with that, let's move on to the installation checklist.</p>
<p>The <a href="http://www.djcbsoftware.nl/code/mu/mu4e/Installation.html#Installation">mu4e
manual</a> is thorough
and informative, but I'm not sure how to install mu and make it
available in Emacs. I also don't understand what I should use to manage
the IMAP repository for me. I'm getting confused...</p>
<p>Searching for unofficial documentation, or a blog post for some extra
hand holding, I find <a href="http://blog.developwithpassion.com/2013/05/02/getting-up-and-running-with-a-sane-mutt-setup/">this
one</a>
by Jean-Paul. It turned out that I should install offlineimap from brew,
as well as SQLite, which will store messages' states:</p>
<h3>Installing offlineimap</h3>
<div class="highlight"><pre><span></span>// install brew
$ brew install wget
</pre></div>
<div class="highlight"><pre><span></span>//install offlineimap
$ brew install offlineimap
</pre></div>
<p>Done. Next - modify the offlineimap configuration file. Here's my Gmail
setup:</p>
<div class="highlight"><pre><span></span><span class="o">[</span>general<span class="o">]</span>
<span class="nv">accounts</span> <span class="o">=</span> Gmail
<span class="nv">maxsyncaccounts</span> <span class="o">=</span> <span class="m">3</span>
<span class="o">[</span>Account Gmail<span class="o">]</span>
<span class="nv">localrepository</span> <span class="o">=</span> Local
<span class="nv">remoterepository</span> <span class="o">=</span> Remote
<span class="o">[</span>Repository Local<span class="o">]</span>
<span class="nb">type</span> <span class="o">=</span> Maildir
<span class="nv">localfolders</span> <span class="o">=</span> ~/Maildir
<span class="o">[</span>Repository Remote<span class="o">]</span>
<span class="nb">type</span> <span class="o">=</span> IMAP
<span class="nv">remotehost</span> <span class="o">=</span> imap.gmail.com
<span class="nv">remoteuser</span> <span class="o">=</span> USERNAME@gmail.com //change with your email
<span class="nv">remotepass</span> <span class="o">=</span> PASSWORD //change with your password
<span class="nv">ssl</span> <span class="o">=</span> yes
<span class="nv">sslcacertfile</span> <span class="o">=</span> /etc/ssl/certs/ca-certificates.crt
<span class="nv">maxconnections</span> <span class="o">=</span> <span class="m">1</span>
<span class="nv">realdelete</span> <span class="o">=</span> no
</pre></div>
<p>This <code>sslcacertfile</code> line I got from
<a href="http://superuser.com/questions/927632/configuring-offlineimap-for-gmail-ssl-error">stack-overflow</a>,
after getting an error when trying to load <code>offlineimap</code>.</p>
<p>Offlineimap still refuses to load. Apparently the folder specified in
<code>sslcacertfile</code> doesn't exist in my computer, and offlineimap can't
connect to my Gmail account. More research, and I finally find this
helpful, <a href="http://lists.alioth.debian.org/pipermail/offlineimap-project/2014-August/004916.html">"How can I use sslcertfile"</a>,
article. Here's the gist of it:</p>
<ol>
<li>Download the ca-cert bundle
from <a href="https://downloads.sourceforge.net/project/machomebrew/mirror/curl-ca-bundle-1.87.tar.bz2">sourceforge</a>.</li>
<li>Copy the <code>ca-bundle.crt</code> file to <code>/usr/local/etc/openssl/certs/</code></li>
<li>I didn't have to, but if it still doesn't work, try
running <code>/usr/local/opt/openssl/bin/c_rehas</code> , so openssl can take
note of the new certificate.</li>
<li>Update the <code>sslcacertifile</code> parameter with the new folder:</li>
</ol>
<div class="highlight"><pre><span></span><span class="nv">sslcacertfile</span> <span class="o">=</span> /usr/local/etc/openssl/certs/ca-bundle.crt
</pre></div>
<p>Offlineimap is finally working, and downloading my emails.</p>
<p>Waiting... I have 45977 messages to sync, so it's going to take some
time. I'll do other stuff in the meantime.</p>
<p>Damn! In my stupidity I closed the lid of my laptop, and when opened it
again found that the offilneimap sync process hangs. I kill it, and try
to run it again. I can't - another error. The fix - delete the
<code>Gmail.lock</code> file:</p>
<div class="highlight"><pre><span></span>$ rm .offlineimap/Gmail.lock
</pre></div>
<p>Running <code>offlineimap</code> again. Works this time.</p>
<p><img alt="offlineimap-sync.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/offlineimap-sync.png"></p>
<p>While my repository is syncing, I switch to configure mu and mu4e.</p>
<h3>Installing mu</h3>
<p>First, I clone the mu repository and install libtool (I have no idea
what it does, just that it's required for building mu)</p>
<div class="highlight"><pre><span></span>$ git clone https://github.com/djcb/mu.git
$ brew install libtool
</pre></div>
<p>Next, build mu:</p>
<div class="highlight"><pre><span></span>$ <span class="nb">cd</span> mu
mu/$ autoreconf -i <span class="o">&&</span> ./configure <span class="o">&&</span> make
</pre></div>
<p>Once the offlineimap process ends, I run mu to index my emails, which
located at the <code>/Maildir</code> folder, as defined in the <code>~/.offlineimaprc</code>
file.</p>
<div class="highlight"><pre><span></span>/usr/local/Cellar/mu/mu/$ ./mu index
</pre></div>
<p>Here's the result:</p>
<p><img alt="mu-index.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/mu-index.png"></p>
<p>We're making progress here...</p>
<h3>Emacs config</h3>
<p>Now I have to setup mu4e (mu for Emacs, I assume...). In my
<a href="https://github.com/yanivdll/.emacs.d/blob/master/config.org#mu4e">config</a>
file, I add the following settings, taken almost as-is from mu4e manual:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nv">add-to-list</span> <span class="ss">'load-path</span> <span class="s">"/usr/local/Cellar/mu/mu4e"</span><span class="p">)</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">mu4e-mu-binary</span> <span class="p">(</span><span class="nv">executable-find</span> <span class="s">"/usr/local/Cellar/mu/mu/mu"</span><span class="p">))</span>
<span class="p">(</span><span class="nb">require</span> <span class="ss">'mu4e</span><span class="p">)</span>
<span class="c1">;; default</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">mu4e-maildir</span> <span class="s">"~/Maildir"</span><span class="p">)</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">mu4e-drafts-folder</span> <span class="s">"/[Gmail].Drafts"</span><span class="p">)</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">mu4e-sent-folder</span> <span class="s">"/[Gmail].Sent Mail"</span><span class="p">)</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">mu4e-trash-folder</span> <span class="s">"/[Gmail].Trash"</span><span class="p">)</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">mu4e-refile-folder</span> <span class="s">"/[Gmail].All Mail"</span><span class="p">)</span>
<span class="c1">;; don't save message to Sent Messages, Gmail/IMAP takes care of this</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">mu4e-sent-messages-behavior</span> <span class="ss">'delete</span><span class="p">)</span>
<span class="c1">;; (See the documentation for `mu4e-sent-messages-behavior' if you have</span>
<span class="c1">;; additional non-Gmail addresses and want assign them different</span>
<span class="c1">;; behavior.)</span>
<span class="c1">;; setup some handy shortcuts</span>
<span class="c1">;; you can quickly switch to your Inbox -- press ``ji''</span>
<span class="c1">;; then, when you want archive some messages, move them to</span>
<span class="c1">;; the 'All Mail' folder by pressing ``ma''.</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">mu4e-maildir-shortcuts</span>
<span class="o">'</span><span class="p">(</span> <span class="p">(</span><span class="s">"/INBOX"</span> <span class="o">.</span> <span class="nv">?i</span><span class="p">)</span>
<span class="p">(</span><span class="s">"/[Gmail].Sent Mail"</span> <span class="o">.</span> <span class="nv">?s</span><span class="p">)</span>
<span class="p">(</span><span class="s">"/[Gmail].Trash"</span> <span class="o">.</span> <span class="nv">?t</span><span class="p">)</span>
<span class="p">(</span><span class="s">"/[Gmail].All Mail"</span> <span class="o">.</span> <span class="nv">?a</span><span class="p">)))</span>
<span class="c1">;; allow for updating mail using 'U' in the main view:</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">mu4e-get-mail-command</span> <span class="s">"offlineimap"</span><span class="p">)</span>
</pre></div>
<p>Note that I had to add the first two lines, because without them Emacs
doesn't know about mu4e, and about where to find the mu executable. I
know it because I tried evaluating the config many times time, without
mu4e loading...</p>
<p>And now, finally, when I run <code>M-x mu4e</code>, Hooray!</p>
<p><img alt="mu4e_first_screen.png" src="http://media.prodissues.com/images/2015/12/mu4e_first_screen.png"></p>
<p>Now that I have all my emails in Emacs, I'll start learning the
ins-and-outs of mu4e, and customize it further.</p>
<h2>Update</h2>
<p>Couple of weeks ago, Gmail asked that I change my password, due to a
suspicious login attempt to my account. I did, and updated the password
in my <code>.offlineimaprc</code> file. But since then, although incoming emails
worked fine, I was unable to send emails from mu4e, and kept
getting this error message:</p>
<div class="highlight"><pre><span></span>smtpmail-send-it: Sending failed: <span class="m">535</span>-5.7.8 Username and Password not accepted. Learn more at
<span class="m">535</span> <span class="m">5</span>.7.8 https://support.google.com/mail/answer/14257 64sm1217489qhf.40 - gsmtp in response to AUTH PLAIN AHlhbml2ZGxsADExODc3WWFu
</pre></div>
<p>I spent days trying to sort this problem out. I went through <a href="https://support.google.com/mail/answer/14257">Google's
detailed checklist</a> numerous times, read and posted in Google's support forum, looked in stack-overflow, but
found nothing to help me solve that error.</p>
<p>Finally, I found an EmacWiki's article about <a href="https://www.emacswiki.org/emacs/SendingMail">sending mail</a> in Emacs. It mentions the <code>$(HOME)/.authinfo</code> file and I suspected it had something to do with
the problem I had... I opened this file, and lo and behold... it had my
Gmail credentials, including my old password in it. I updated the
password and now I can use mu4e to send emails again.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>I was writing this post while going through the installation process,
although I published it just now. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>My WordPress Development Workflow2016-02-10T00:00:00-05:002016-02-10T00:00:00-05:00yanivtag:prodissues.com,2016-02-10:/2016/02/wordpress-development-workflow.html<p>I currently use a child-theme for this site<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>, its parent being
<a href="https://wordpress.org/themes/twentysixteen/">twentysixteen</a>. I keep
modifying this theme on my local machine and push updates to my live
site. But in parallel, I want to start building a completely new theme,
based on the starting <a href="http://underscores.me/">_s</a> theme. I'm
uncomfortable developing …</p><p>I currently use a child-theme for this site<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>, its parent being
<a href="https://wordpress.org/themes/twentysixteen/">twentysixteen</a>. I keep
modifying this theme on my local machine and push updates to my live
site. But in parallel, I want to start building a completely new theme,
based on the starting <a href="http://underscores.me/">_s</a> theme. I'm
uncomfortable developing this new theme within the same local
environment; I want, instead, to create a playground where I can
experiment, knowing it's completely isolated from my production
environment.</p>
<!--more-->
<p>With that goal in mind, I installed a second instance of WordPress on my
local machine, and now I have 3 environments - production(that's where
my live site reside), staging and development.</p>
<h2>Running two WordPress instances on the same machine</h2>
<h3>Folder structure</h3>
<p>Initially, I had WordPress installed in a folder called <code>wordpress</code>. To
prepare for the second install, I created the following hierarchy:</p>
<p><img alt="wp-folders.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/wp-folders.png"></p>
<p>I moved the content of my original WordPress to the
<code>/prodissues-staging</code> folder. I then had to go to
<a href="https://www.mamp.info/en/">MAMP</a> and change the "Document Root"
setting, to point to the new location, so that when I visit
<code>localhost:8888</code>, I still land on my site.</p>
<p><img alt="mamp-prodissues-staging.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/mamp-prodissues-staging.png"></p>
<p>Next, I downloaded WordPress to the <code>prodissues-dev</code> folder. To start
the installation process, I had to go back to MAMP and change the
"Document Root" to point to that folder:</p>
<p><img alt="mamp-prodissues-dev.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/mamp-prodissues-dev.png"></p>
<p>At that point I was ready to install WordPress in my development
environment. This is the same process as installing WordPress for the
first time, including the creation of a new database<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>. To refresh your memory on how to do it, here's WordPress
<a href="https://codex.wordpress.org/Installing_WordPress#Famous_5-Minute_Install">"Famous 5-Minute Install"</a>
guide.</p>
<h2>Switching between environments</h2>
<p>I now had two WordPress installations on my local machine (and one
hosted). Switching from one to the other is as simple as changing the
"Document Root" in MAMP, as was shown above.</p>
<p>What left to be done is to define a workflow that will help me keeping
the different environments fresh, while making sure the live site (i.e.
production environment) is safe from what's going on in the development
environment.</p>
<h2>Development workflow</h2>
<p>I now have 3 WordPress environments:</p>
<ul>
<li>Production (hosted)</li>
<li>Staging (local)</li>
<li>Development (local)</li>
</ul>
<p>My plan is to make sure that staging is always in sync with production.
I'll build my new theme in the development environment, and push it to
staging when it's ready. If everything works fine in staging (which is,
again, almost identical to the live site) then I'll push the new theme
to production.</p>
<p>Here's a sketch that illustrates the separation and interaction among
the 3 environments:</p>
<p><img alt="wp-environments.jpeg" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/wp-environments.jpeg"></p>
<p>And here's the logic behind this architecture:</p>
<ul>
<li>The most important resource that I would like to protect is the
production database, since it holds the content of my blog. I might
be missing something here, but I see no reason to ever override it
with a version of the database from other environments. Therefore,
the production database can only be pulled to the staging or
development environments<sup id="fnref-3"><a class="footnote-ref" href="#fn-3">3</a></sup>.</li>
<li>I shouldn't push files from development directly to production. I
should move them instead to staging. This will protect my live site
from un-tested or broken code.</li>
<li>Staging is where new code is tested. From there it can be pushed
only one way - to production via ftp. Again, there's no upload of
the database to production.</li>
</ul>
<p>This one-way streets architecture should give me the peace of mind to
build and breaking stuff, knowing that whatever I do won't affect the
other 2 sane environments.</p>
<h2>Open question:</h2>
<ul>
<li>Is there any reason that I haven't thought of to push database from
staging to production?</li>
</ul>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>Feel free fork it on GitHub -
<a href="https://github.com/yanivdll/twentysixteen-child">https://github.com/yanivdll/twentysixteen-child</a> <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>With one exception - the name of the new database should be unique. I
called mine <code>prodissues-dev</code>. <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn-3">
<p>I use <a href="https://github.com/wp-sync-db/wp-sync-db">wp-sync-db</a> to pull the
database and files from production to dev and staging. <a class="footnote-backref" href="#fnref-3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>No Exuses To Blogging2016-02-04T10:13:00-05:002016-02-04T10:13:00-05:00yanivtag:prodissues.com,2016-02-04:/2016/02/no-exuses-to-blogging.html<p><img alt="No-Excuses-Guide-to-Blogging-Sacha_Chua-v2.jpg" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/No-Excuses-Guide-to-Blogging-Sacha_Chua-v2.jpg"></p>
<p>Awhile back I wrote about my experience <a href="http://prodissues.com/2015/10/on-touch-typing-and-failure.html">learning to touch
type</a>.
While writing it, I found <a href="//sachachua.com/blog/2011/09/deliberate-practice-typing-faster-and-emacs/">this related
article</a>
by Sacha Chua, which helped me rationalize to myself <em>why</em> it is such an
important skill to learn. I ended up spending almost an hour browsing
Sacha's site. The amount of …</p><p><img alt="No-Excuses-Guide-to-Blogging-Sacha_Chua-v2.jpg" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/No-Excuses-Guide-to-Blogging-Sacha_Chua-v2.jpg"></p>
<p>Awhile back I wrote about my experience <a href="http://prodissues.com/2015/10/on-touch-typing-and-failure.html">learning to touch
type</a>.
While writing it, I found <a href="//sachachua.com/blog/2011/09/deliberate-practice-typing-faster-and-emacs/">this related
article</a>
by Sacha Chua, which helped me rationalize to myself <em>why</em> it is such an
important skill to learn. I ended up spending almost an hour browsing
Sacha's site. The amount of resources, posts, tips and tutorials that
she shares is humongous!</p>
<!--more-->
<p>Now, it's not that I wouldn't have landed on her blog at some point. Few
days earlier, I had started my Emacs adventure. As it turned out, Sacha
writes <em>alot</em> about Emacs, and is super involved in the Emacs community.
So now I had two reasons to listen to what she has to say.</p>
<p>Yet, that wasn't all. Both touch-typing and Emacs were only means to an
end, that end being writing. I wanted to write better and blog more
often. And so, when I landed on Sacha's <a href="http://sachachua.com/blog/series/a-no-excuses-guide-to-blogging/">"No Excuses For
Blogging"</a>
ebook, I was intrigued.</p>
<p>After reading just a couple of chapters, I dropped everything, including
that book, and started writing. I didn't stop since. Reading this book
was like cracking a hole in a wall that kept my thoughts caged within my
head. Without exaggerations, here's how reading this book felt:</p>
<p><img alt="V64Vgdw_-_Imgur.gif" src="http://media.prodissues.com/images/2015/11/V64Vgdw_-_Imgur.gif"></p>
<p>Not only that Sacha articulates the excuses that stopped me from writing
so accurately, but the tips and tricks to overcome those excuses are dead
simple and easy to follow. You don't know where to start a post? write
it as an answer to an email. You want to write about something, but not
sure you know enough? write about what you don't know, and document the
way you go about learning it. Can't decide <em>what</em> you should write
about? don't decide; just write about whatever you're doing or learning.
Focus will come in time, and by that time you're already a blogger.</p>
<p>And Sacha's site is a perfect implementation of her own tips and tricks.
It feels like her blog mirroring what goes inside her head, and that's
exactly how I wanted my writing to be - fully synced with my thoughts.</p>
<p>So here are few of the things I've learned and implemented as a result
of reading that book:</p>
<h2>"I don't know what to write about"</h2>
<ul>
<li>I create an entry for everything I want to learn, explore or
do<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>. Not only that it creates an endless
pool of ideas, but it also keeps me focused, by forcing me to
document the path of exploration.</li>
<li>I keep those entries in one org file, called <code>posts_drafts</code>. My goal
is to develop each of those entries to a blog post.</li>
<li>This draft file is public. <a href="http://prodissues.com/2015/11/drafts.html">Here it
is</a>.</li>
</ul>
<h2>"There's much I <em>can't</em> write about"</h2>
<ul>
<li>I've stopped waiting until I know the in-and-out of a subject before
writing about it. I found that when I get to that point, I'm not
interested anymore at going back and write about it. Instead, I
document the journey toward that knowledge. Not only that I write
and post more often, but its a better way to retain what I learn. A
fun way I think about documenting while learning is kinda like
running:</li>
</ul>
<div class="highlight"><pre><span></span>git commit -a -m <span class="s2">"[post content]"</span>
git push master brain/master
</pre></div>
<h2>"I don't know where to start"</h2>
<ul>
<li>I use Sacha's tip to phrase my posts as an answer to a question, or
an email. Usually, the question, and the subject of the entry I put
in the draft file is the search term I google. This habit helps me
stay focused on the subject and the point I'm trying to make.</li>
</ul>
<h2>"I feel scattered and distracted"</h2>
<ul>
<li>I don't try to create a theme for my blog. Instead, I try to write
and post as much as possible. No one is going to read my blog post
by post, and so there is no reason to think of it like a list of
sequential posts.</li>
</ul>
<p>This short book helped me more than many of the books I read about
writing in general, and blogging in particular. It also inspired me to
start a <a href="http://www.meetup.com/Blog-writing/">Blog Writing meetup</a>, and
circle myself with people who write for their living.</p>
<p>So, if you're looking for ways to overcome your blogging
procrastination, or just get some pithy writing tips, do yourself a
favor, and make sure to read that book.</p>
<p>Here's the link again:
<a href="http://sachachua.com/blog/2014/02/excuses-guide-blogging-pdf-epub-mobi-free-also-notes-publishing/">http://sachachua.com/blog/2014/02/excuses-guide-blogging-pdf-epub-mobi-free-also-notes-publishing/</a></p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>If it's a topic I'm going to google, or read about - it becomes an
entry. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Back To Input2016-02-02T16:18:00-05:002016-02-02T16:18:00-05:00yanivtag:prodissues.com,2016-02-02:/2016/02/back-to-input.html<p>Now that I moved to Wordpress, I can finally set Emacs' font to
Input. Wait, <em>what</em>? what does an Emacs font has to do with WordPress?</p>
<!--more-->
<p>Well, in a previous post, I documented how to <a href="http://prodissues.com/2015/11/changing-the-default-font-in-emacs.html">modify fonts in
Emacs</a>.
However, I had to rollback the new font, because it broke …</p><p>Now that I moved to Wordpress, I can finally set Emacs' font to
Input. Wait, <em>what</em>? what does an Emacs font has to do with WordPress?</p>
<!--more-->
<p>Well, in a previous post, I documented how to <a href="http://prodissues.com/2015/11/changing-the-default-font-in-emacs.html">modify fonts in
Emacs</a>.
However, I had to rollback the new font, because it broke Pelican's
org-reader plugin, which relied on Emacs' configuration. For some reason
it didn't like the new font, and decided it doesn't generate HTML files
until I revert to <code>Menlo</code>.</p>
<p>In fact, this is one of the reasons I gave up on Pelican. It was too
brittle. So now that I'm on WordPress, I'm free to configure Emacs
however I want. Here's how my new font looks like:</p>
<p><img alt="Input font in emacs" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/emacs-input-font.png"></p>Apple Watch - 6 Months Later. Not That Great.2016-01-29T00:00:00-05:002016-01-29T00:00:00-05:00yanivtag:prodissues.com,2016-01-29:/2016/01/apple-watch-6-months-later-not-that-great.html<p>When I shared my <a href="http://prodissues.com/2015/06/the-watch-first-impressio.html">first impression on the
Watch</a>, it
was all hail of fanfare. I had nothing bad to say about it, and even if
I had, I ignored or minimized it.</p>
<p>Six months of daily use later, and I become annoyed with it. If it
wasn't too big …</p><p>When I shared my <a href="http://prodissues.com/2015/06/the-watch-first-impressio.html">first impression on the
Watch</a>, it
was all hail of fanfare. I had nothing bad to say about it, and even if
I had, I ignored or minimized it.</p>
<p>Six months of daily use later, and I become annoyed with it. If it
wasn't too big of a statement, I would have gone back to my Polar
RS-100.</p>
<!--more-->
<p>Before I go on, I need to put things into perspective. I've just went
back to that first impression post that I wrote. Turns out I wasn't
blind to its limitations, and I didn't expect it to be much more than a
beautifully designed, simple watch.</p>
<p>I still don't. I <em>do</em> use it for the most basic functions, and rarely
switch from the main screen. Taking a glance at the time and my next
meeting, getting a feel of the temperature outside, and making sure that
I have my alarm set, are really my main functions I use it for.</p>
<p>I have almost no 3rd party app installed on it, other than Duo, which
makes VPN authentication a bit easier. I use the Workout app when I run,
and the navigation's haptic signals when I drive out of the city - it
<em>does</em> help me with keeping my eyes on the road.</p>
<p>Those uses are illustrated in the screenshots bellow:</p>
<p><img alt="the-watch-uses.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/01/the-watch-uses.png"></p>
<p><span class="figure-number">Figure 1:</span> Those screenshots capture
99% of what I use the Watch for</p>
<p>And that's not what getting my upset, and leading me to write this.</p>
<p>What bothers me is that the Watch fails at being a simple watch. Take
charging for example - I need to do it every night. "You stupid Apple
fanboy, didn't you read the spec before you bought it?". I did. I knew
about it, and yet I've discounted it. I thought it will be as simple as
charging my iPhone. I was wrong - it isn't. Having to take off your
watch, every night, is like a Chinese torture - it impinges you one drop
at a time, until you can't stand it anymore.</p>
<p>As I'm writing this, I'm on vacation. I'm wearing the Watch, but it's
dead. I brought its charger with me, yet I'm too lazy to connect it to
the outlet, take off my watch and connect it to the charger. You know
what - no, it's not because I'm lazy. It's because I don't suppose to
take off my watch every night and charge it!</p>
<p>Another example - the sport band, which doesn't make it easier to take
the Watch off and put it back on. It's a clumsy mechanism that causes me
to drop the Watch on the floor too often, when trying to fasten it on my
hand. And I'm not going to spend $149 on a <a href="http://www.apple.com/shop/product/MLHL2/42mm-midnight-blue-leather-loop-medium">Leather
Loop</a>
that suppose to do better job at that.</p>
<p>It might have been the <a href="http://prodissues.com/2015/12/i-can-live-without-a-mac.html">post
Apple-ohilic</a>
of me who wrote this, but now that I let it go, I can go back to be the
acquiescence user that I am. I'll go out of bed to set up the charger,
and keep telling myself it's the best watch ever designed...</p>Two Out Of Three2016-01-27T22:22:00-05:002016-01-27T22:22:00-05:00yanivtag:prodissues.com,2016-01-27:/2016/01/two-out-of-three.html<p>When I served in the air-force, we used to make fun of the meteorology
unit, which was responsible to provide us with weather information
before going on a mission. You see, know the weather conditions at the
location of the target, at the time we suppose to attack it is …</p><p>When I served in the air-force, we used to make fun of the meteorology
unit, which was responsible to provide us with weather information
before going on a mission. You see, know the weather conditions at the
location of the target, at the time we suppose to attack it is critical
to the success of that mission.</p>
<p><strong>What. When. Where</strong></p>
<p>Our issue with the meteorological unit was that they were very accurate
at predicting only two out of the three parameters.</p>
<p>They could say, for example, that it's going to be sky overcast at 7am,
but not where; it will be sunny and clear within 10 miles of our target,
but not sure when. No need to be a meteorologist to make a forecast with
that level of (in)accuracy.</p>
<p>Many times I come across those types of predictions/assertions. I don't
have a good example now, though. But if you have, feel to share...</p>On Starting A Blog2016-01-27T16:20:00-05:002016-01-27T16:20:00-05:00yanivtag:prodissues.com,2016-01-27:/2016/01/on-starting-a-blog.html<p>My experience with starting a blog reminds me that of becoming a parent.</p>
<!--more-->
<p>For years the idea of having a child was something my wife and I
repressed. We knew we will eventually have one (or two), but never spoke
about it. When time started to press, and we had …</p><p>My experience with starting a blog reminds me that of becoming a parent.</p>
<!--more-->
<p>For years the idea of having a child was something my wife and I
repressed. We knew we will eventually have one (or two), but never spoke
about it. When time started to press, and we had to start planning for
it, we tried to figure the exact day to go about it. "Next week is too
soon, I'm busy at work", "maybe after the holidays, or the month after?"
We felt as if getting pregnant means that the baby will arrive the day
after. Well, it isn't. It takes, like, 9 months or so.</p>
<p>During those long months we did a lot of planning; we bought stuff for
the baby, rearrange the house and set up a room for her. We slowly
turned into parents. And somewhere during the last trimester I started
to have strong craving for that baby to come already.</p>
<p>Now what does it have to do with starting a blog? For years you might
have thought about starting one. At a certain point you got over
yourself and decided to actually create one. But making that decision is
only the first step. Actually launching it is another. And that you
postponed as much as possible. You hatch on couple of posts you intend
to publish; you edit them over and over, afraid of making even a single
error. You're terrified that someone, out of the millions of readers,
who wait to read whatever you're about to post, won't like what you
wrote.</p>
<p>But then, when you finally plunge yourself into the water and post
something, you notice that no one came. You post again, and still no one
cares.</p>
<p>Months go by and you start realizing that you're writing to yourself.
This realization, though is liberating. It leads you to become more
comfortable, to share more and express yourself better. After all,
you're your only reader.</p>
<p>If you haven't given up yet, and you keep posting, your writing and way
of communicating your thoughts and ideas will improve. And as that
happens you'll start craving for audience, for people to read what you
share. Not too long after that, almost magically, readers do start
coming. It turned out that your posts made their ways across the
internet, and found interested readers. They show on search results,
picked up by someone, or referred to by a fellow blogger. Your site is
coming to life.</p>
<p>Starting a blog, just like getting pregnant, is only the beginning of a
long, long, process. It takes months for it to evolve and attract
readers. So don't worry about that exact moment in time when you'll
publish your first post, and don't think too much about that first post.
Just do it.</p>Moving to Wordpress2016-01-26T00:00:00-05:002016-01-26T00:00:00-05:00yanivtag:prodissues.com,2016-01-26:/2016/01/moving-to-wordpress.html<p><img alt="pelican-to-wordpress.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/pelican-to-wordpress.png"></p>
<p>That was quick.</p>
<p>Couple of weeks ago I wrote about thinking to <a href="http://prodissues.com/2016/01/should-i-keep-using-pelican-or-move-to-wordpress.html">move my blog to
Wordpress</a>.
Since then, I've used Wordpress<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup> in
conjunction with my static blog, and published posts to both sites. This
experiment helped me to reaffirm the pros and cons of using Wordpress,
especially the …</p><p><img alt="pelican-to-wordpress.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/pelican-to-wordpress.png"></p>
<p>That was quick.</p>
<p>Couple of weeks ago I wrote about thinking to <a href="http://prodissues.com/2016/01/should-i-keep-using-pelican-or-move-to-wordpress.html">move my blog to
Wordpress</a>.
Since then, I've used Wordpress<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup> in
conjunction with my static blog, and published posts to both sites. This
experiment helped me to reaffirm the pros and cons of using Wordpress,
especially the part about concentrating on writing rather than site
administration. During those two weeks I posted more, and became
comfortable working with, and in, Wordpress.</p>
<p>When I realized that I started to publish first to my dummy Wordpress
blog, and then reluctantly to my static blog, I made the decision to
switch. Yesterday I completed the migration.</p>
<p>Following is the checklist I've used to manage the migration. It helped
me going through the process with no downtime, and no prodissues :-)</p>
<!--more-->
<h4>Decide between hosted an self-hosted</h4>
<p>Initially I wanted to keep it as simple as possible, by paying for the
basic plan on <a href="https://store.wordpress.com/plans/">Wordpress.com</a>. I
wanted to avoid technical setup. Eventually, though, I went the
self-hosting route for one simple reason - I wanted to keep the same URL
format I had with the static site, but Worpress.com doesn't let you
define the permalink format.</p>
<h4>Select a hosting provider</h4>
<p>There are tons of comparisons between every possible hosting provider,
enough to get me confused about the pricing and the different features.
Since my site is small and simple, and without a lot of traffic, I
decided to take the economical route, and go with a shared hosting
service. I then narrowed the list to Godaddy and Bluehost, and finally
decided on Bluehost<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>, mainly because it's
<a href="https://wordpress.org/hosting/">endorsed by Wordpress</a>.</p>
<h4>Local installation of WP</h4>
<p>Wordpress famous claim for 5 minute installation isn't a cliche. I just
had to follow <a href="https://codex.wordpress.org/Installing_WordPress_Locally_on_Your_Mac_With_MAMP">this guide</a>.</p>
<h4>Import all of my posts to the local install</h4>
<p>My plan to export and import an RSS feed from my static blog to
Wordpress didn't work. WordPress RSS importer didn't recognize my
Pelican generated RSS feed, so I had to spend some time researching for
an alternative.</p>
<p>My posts are written in one of two formats - markdown or
<a href="http://orgmode.org/">org-mode</a>. Migrating the org-mode based posts was
easy, using Emacs' <a href="https://github.com/punchagan/org2blog/">org2blog</a>
package. Pushing the markdown files was a little trickier. Eventually,
with the help of <a href="http://emacs.stackexchange.com/q/5465/10150">this stack-overflow
answer</a>, I converted those
markdown posts into org-mode, using pandoc. I had to make a little bit
of cleaning<sup id="fnref-3"><a class="footnote-ref" href="#fn-3">3</a></sup> to the output, but overall that
process wasn't too complicated.</p>
<h4>Connect to Bluehost</h4>
<p>Now that I had my local installation of Wordpress up and running with
all my posts, it was time to set Wordpress on Bluehost.</p>
<p>Logging-in to my Bluehost panel for the first time was intimidating. The
endless list of tools got me thinking that I might end up doing even
more site administration work than I did before. I hoped, though, that
this will be the case only during the initial setup<sup id="fnref-4"><a class="footnote-ref" href="#fn-4">4</a></sup>, and that I will not have to log in to that panel again after
I deploy my site.</p>
<p><img alt="bluehost-cpanel.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/bluehost-cpanel.png"></p>
<p><span class="figure-number">Figure 2:</span> The cPanel - lots of tools,
though I had to use only few to get my site live</p>
<h4>Connect to WP with a temporary URL</h4>
<p>When I signed up with Bluehost, I got an email with a list of temporal
IPs and ftp configuration. This way I could set up my Wordpress blog
before having to point my domain to it. At first, I wasn't able to
access my temporary URL, even after reading <a href="http://www.expression-web-tips.com/accessing-bluehost-domains-from-a-temporary-web-address/">this detailed
article</a>.
It probably took time for the URL to be activated and link to my
account, because I was able to access it eventually (after couple of
hours) without doing anything special.</p>
<p>As soon as I connected to the temporary URL, a Wordpress installation
process started, and 5 minutes later I had Wordpress installed on my
production environment. Exciting!</p>
<p>The first thing I've noticed when logging in to my fresh self-hosted
Wordpress was this gaudy green icon - the Mojo market place. I didn't
know what Mojo is, and didn't care to know. I just wanted it out of my
dashboard. Googling it, I
<a href="https://wordpress.org/support/topic/how-do-i-remove-mojo-marketplace-from-admin-header">found</a>
that it's just a plugin that can be removed. Removed it I
had <sup id="fnref-5"><a class="footnote-ref" href="#fn-5">5</a></sup>.</p>
<h4>Set FTP access</h4>
<p>With a little hand holding from the Bluehost support team, I was able to
connect to my temporary URL via ftp. Here's the FileZilla configuration
I had to set:</p>
<p><img alt="filezilla-setup.png" src="http://media.prodissues.com/images/2016/01/filezilla-setup.png"></p>
<p><span class="figure-number">Figure 3:</span> My FileZilla Configuration
- note the non-default Encryption type</p>
<p>FTP connection will be useful later on, when I'll need to push my local
environment and database to production.</p>
<h4>Themes that I like</h4>
<p>Back to my localhost Wordpress, I need to chose a theme, and get ready
to push everything to Bluehost. Here's the list of themes I liked:</p>
<ul>
<li><a href="https://theme.wordpress.com/themes/big-brother/">Big brother</a></li>
<li><a href="https://theme.wordpress.com/themes/big-brother/">Twenty twelve</a> - I
don't like the font though.</li>
<li><a href="http://p2theme.com/">P2</a></li>
<li><a href="https://theme.wordpress.com/themes/everyday/">Everyday</a> (75\$)</li>
<li><a href="https://wordpress.org/themes/twentysixteen/">Twenty Sixteen</a>
(that's the one I chose.)</li>
</ul>
<h4>Import the local installation to the hosting service</h4>
<p>I used <a href="https://www.bluehost.com/blog/wordpress-2/faq-how-do-i-move-my-wordpress-website-to-bluehost-1787/">Bluehost's excellent
guide</a>
for that. At first, I messed things up by not following it step-by-step
- I pushed my local database before copying my local Wordpress
installation and overriding that on the host. As a result I had to run
the Wordpress installation on Bluehost again. Not a big deal, but a
reminder about the complexity behind the scene...</p>
<h4>Set the permalink format</h4>
<p>My blog is up and running on a temporary URL. This post for example was
accessible with the following URL (not anymore, though):</p>
<p><code>http://69.195.124.143/~prodissu/2016/02/moving-to-wordpress.html</code></p>
<p>I now had to make sure that my URLs are formatted correctly. That was
easily done within the wp-admin. The setting is under
setting->permalink.</p>
<p><img alt="wp-admin-set-permalink.png" src="http://media.prodissues.com.s3.amazonaws.com/images/2016/02/wp-admin-set-permalink.png"></p>
<p><span class="figure-number">Figure 4:</span> Setting the permalink
format</p>
<p>Now I had to make sure that when I switch to Wordpress, all of my
existing posts will maintain the same URL. So, I run through a sample of
posts, replaced the temporary part of the URL (the
<code>http://69.195.124.143/~prodissu/</code> in the example above), which led to
the Wordpress installation, with my domain name. Doing so I've expected
to land on the same post on my static, and still live, site. When I made
sure this is the case, I was ready for the final part - the cut-off.</p>
<h4>Figure how to transfer my domain</h4>
<p>My domain registrar is Godaddy, and my static site was running on AWS
S3. To move my domain to link to Bluehost instead of AWS, I had to
change the configuration of the nameservers on Godaddy. <a href="https://my.bluehost.com/cgi/help/432">Here's a
guide</a> for how to do that.</p>
<p>One small consideration at that point - I have a bucket on S3 dedicated
to all the media file I use in posts. I wanted to keep this bucket and
not move those media files into the Wordpress database. Just in case I
change my mind again, and decide to switch back to static blog at some
point. I also kind of wanted to keep that neat workflow I created to
<a href="http://prodissues.com/2016/01/uploading-images-to-amazon-s3.html">upload media files to
S3</a>...</p>
<p>To maintain that bucket and sub-domain, I had to <a href="https://my.bluehost.com/cgi/help/559#add">define a
CNAME</a>, now on the Bluehost
console.</p>
<p>With that, my site is up and running on Wordpress. Hooray!</p>
<p>There's only one open task left:</p>
<h4>Import the disqus comments</h4>
<p>I exported the comments from disqus, but didn't find a way to import
them into Wordpress.</p>
<h2>Helpful links</h2>
<ul>
<li><a href="https://codex.wordpress.org/Installing_WordPress_Locally_on_Your_Mac_With_MAMP">Installing Wordpress Locally on Your Mac With
MAMP</a></li>
<li><a href="http://www.expression-web-tips.com/accessing-bluehost-domains-from-a-temporary-web-address/">Accessing Bluehost Domains and ftp from a Temporary Web
Address</a></li>
<li><a href="https://my.bluehost.com/cgi/help/wordpress_url">Using Your Temporary URL with
Wordpress</a></li>
<li><a href="https://www.bluehost.com/blog/wordpress-2/faq-how-do-i-move-my-wordpress-website-to-bluehost-1787/">How Do I Transfer My Wordpress Website To
Bluehost?</a></li>
</ul>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>First, I created a blog in Wordpress.com. Then I installed Wordpress on
my local machine. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>So far I'm happy with Bluehost. I had to chat with their support twice,
once to help me with connecting to the ftp, and then to white-list my IP
for remote publishing. Support was prompt and helpful in both cases. <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn-3">
<p>I had to add the headers to the org file and fix some of the footnotes'
references. <a class="footnote-backref" href="#fnref-3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn-4">
<p>It's probably too early to answer this question, but since making the
cut-off, I didn't have to log in to the cPanel. <a class="footnote-backref" href="#fnref-4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn-5">
<p>I removed it so quickly, that I didn't even take a screen shot to
include here. <a class="footnote-backref" href="#fnref-5" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>Uploading Images To Amazon S32016-01-19T00:00:00-05:002016-01-19T00:00:00-05:00yanivtag:prodissues.com,2016-01-19:/2016/01/uploading-images-to-amazon-s3.html<p>Here's a cool little workflow that I use to automate the usage of images
in my posts<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup></p>
<h2>The flow</h2>
<ul>
<li>Move the image I would like to use to my <code>black-hole</code> folder</li>
<li>When a new file is added to the folder, or existing file is
modified, a <a href="https://www.noodlesoft.com/hazel.php">Hazel</a> is
triggered …</li></ul><p>Here's a cool little workflow that I use to automate the usage of images
in my posts<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup></p>
<h2>The flow</h2>
<ul>
<li>Move the image I would like to use to my <code>black-hole</code> folder</li>
<li>When a new file is added to the folder, or existing file is
modified, a <a href="https://www.noodlesoft.com/hazel.php">Hazel</a> is
triggered</li>
<li>This Hazel rule fires up a python script</li>
<li>The python script:<ul>
<li>Pushes updates to my Amazon S3</li>
<li>Returns a link to the uploaded file</li>
<li>Place the link in the clipboard</li>
<li>Add a log entry that includes the timestemp and the link to that
file</li>
</ul>
</li>
</ul>
<!--more-->
<h2>The Porcelain</h2>
<p>Here's how the flow in action:</p>
<iframe width="420" height="315" src="https://www.youtube.com/embed/IKt3MdXRfXo" frameborder="0" allowfullscreen>
</iframe>
<h2>The Plumbing</h2>
<p>And here are the ingredients in more detail:</p>
<h3>The Hazel rule</h3>
<p><img alt="upload_to_s3.png" src="http://media.prodissues.com/images/2016/01/upload_to_s3.png"></p>
<p><span class="figure-number">Figure 1:</span> Note that I rename the
filename, such that spaces replaced by <code>_</code>. Otherwise the upload to S3
doesn't work</p>
<h3 id="orgheadline5">The python script</h3>
<div class="highlight"><pre><span></span><span class="c1">#+BLOG: yanivgilad</span>
<span class="c1">#+POSTID: 57</span>
<span class="c1">#+DATE: [2016-01-19 Tue 20:42]</span>
<span class="c1"># Source: https://github.com/yanivdll/python-scripts/blob/master/s3_upload.py</span>
<span class="c1"># This script upload files (at the moment images and slideshows) to S3. </span>
<span class="c1">#</span>
<span class="c1"># Credits:</span>
<span class="c1"># This script is inspired by macdrifter script, which can be found at:</span>
<span class="c1"># http://www.macdrifter.com/2012/05/upload-to-amazon-s3-from-dropbox-using-hazel.html</span>
<span class="kn">import</span> <span class="nn">boto</span>
<span class="kn">from</span> <span class="nn">boto.s3.connection</span> <span class="kn">import</span> <span class="n">S3Connection</span>
<span class="kn">import</span> <span class="nn">pyperclip</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">date</span><span class="p">,</span> <span class="n">datetime</span>
<span class="c1"># This is how Hazel passes in the file path</span>
<span class="n">hazelFilePath</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">contentType</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
<span class="c1"># This is where I store my log file for these links. It's a Dropbox file in my NVAlt notes folder</span>
<span class="n">logFilePath</span> <span class="o">=</span> <span class="s2">"~/Dropbox/Notes/Linkin_Logs.txt"</span>
<span class="n">nowTime</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">())</span>
<span class="c1"># This is the method that does all of the uploading and writing to the log file.</span>
<span class="c1"># The method is generic enough to work with any S3 bucket that is passed.</span>
<span class="k">def</span> <span class="nf">uploadToS3</span><span class="p">(</span><span class="n">localFilePath</span><span class="p">,</span> <span class="n">localFileType</span><span class="p">,</span> <span class="n">S3Bucket</span><span class="p">):</span>
<span class="n">fileName</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">localFilePath</span><span class="p">)</span>
<span class="c1"># Determine the current month and year to create the upload path</span>
<span class="n">today</span> <span class="o">=</span> <span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">()</span>
<span class="n">datePath</span> <span class="o">=</span> <span class="n">today</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"/%Y/%m/"</span><span class="p">)</span>
<span class="c1"># Connect to S3</span>
<span class="n">s3</span> <span class="o">=</span> <span class="n">boto</span><span class="o">.</span><span class="n">connect_s3</span><span class="p">()</span>
<span class="n">bucket</span> <span class="o">=</span> <span class="n">s3</span><span class="o">.</span><span class="n">get_bucket</span><span class="p">(</span><span class="n">S3Bucket</span><span class="p">)</span>
<span class="c1"># Set the folder name based on the content type image\slideshow</span>
<span class="k">if</span> <span class="n">localFileType</span> <span class="o">==</span> <span class="s1">'slideshow'</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">bucket</span><span class="o">.</span><span class="n">new_key</span><span class="p">(</span><span class="s1">'slideshows/'</span> <span class="o">+</span> <span class="n">fileName</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">key</span> <span class="o">=</span> <span class="n">bucket</span><span class="o">.</span><span class="n">new_key</span><span class="p">(</span><span class="s1">'images'</span> <span class="o">+</span> <span class="n">datePath</span> <span class="o">+</span> <span class="n">fileName</span><span class="p">)</span>
<span class="c1"># Upload file to S3</span>
<span class="n">key</span><span class="o">.</span><span class="n">set_contents_from_filename</span><span class="p">(</span><span class="n">localFilePath</span><span class="p">)</span>
<span class="n">key</span><span class="o">.</span><span class="n">set_acl</span><span class="p">(</span><span class="s1">'public-read'</span><span class="p">)</span>
<span class="c1"># Log the url of the hosted file</span>
<span class="n">logfile</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">logFilePath</span><span class="p">,</span> <span class="s2">"a"</span><span class="p">)</span>
<span class="c1"># Create the URL for the image</span>
<span class="n">imageLink</span> <span class="o">=</span> <span class="s1">'http://'</span> <span class="o">+</span> <span class="n">S3Bucket</span> <span class="o">+</span> <span class="s1">'/'</span> <span class="o">+</span> <span class="n">key</span><span class="o">.</span><span class="n">name</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># encode the file name and append the URL to the log file</span>
<span class="n">logfile</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">nowTime</span><span class="o">+</span><span class="s1">' '</span><span class="o">+</span><span class="n">imageLink</span><span class="o">+</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
<span class="n">pyperclip</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">imageLink</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
<span class="n">logfile</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="c1"># The body of the script.</span>
<span class="n">uploadToS3</span><span class="p">(</span><span class="n">hazelFilePath</span><span class="p">,</span> <span class="n">contentType</span><span class="p">,</span><span class="s1">'media.prodissues.com'</span><span class="p">)</span>
</pre></div>
<h3>Few remarks about boto</h3>
<ul>
<li>If you're new to boto, a python interface to Amazon AWS, read
through <a href="http://boto.readthedocs.org/en/latest/boto_config_tut.html">this
tutorial</a>.</li>
<li>Boto's credentials file lives in <code>~/.boto</code> file. However, I found
that when not running the <code>s3_upload.py</code> from a python environment
such as IDLE, but from a terminal, the credential file that is being
used is the <code>~/.aws/credentials</code> file. So I just made sure that my
AWS credentials exist in both files.</li>
<li>Since my bucket has dots in it (<code>media.prodissues.com</code>) I had to
define the S3 bucket format<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup> explicitly:</li>
</ul>
<div class="highlight"><pre><span></span><span class="o">[</span>default<span class="o">]</span>
<span class="nv">aws_access_key_id</span> <span class="o">=</span> <span class="o">[</span>my_aws_access_key<span class="o">]</span>
<span class="nv">aws_secret_access_key</span> <span class="o">=</span> <span class="o">[</span>my_aws_secret_access_key<span class="o">]</span>
<span class="o">[</span>s3<span class="o">]</span>
<span class="nv">calling_format</span> <span class="o">=</span> boto.s3.connection.OrdinaryCallingFormat
</pre></div>
<h3>The log file</h3>
<p><img alt="Screen_Shot_2016-01-19_at_15.18.16.png" src="http://media.prodissues.com/images/2016/01/Screen_Shot_2016-01-19_at_15.18.16.png"></p>
<h2>Summary</h2>
<p>Setting this workflow might look more intimidating than it really is.
But even if it is, the gratifing feeling of throwing a file into a
folder and getting a live link in exchange is totally worth it.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>Heavily inspiered by Macdrifter's "<a href="http://www.macdrifter.com/2012/05/upload-to-amazon-s3-from-dropbox-using-hazel.html">Upload to Amazon S3 from Dropbox
using Hazel</a>" <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>See this thread for more details:
<a href="https://github.com/boto/boto/issues/2836">https://github.com/boto/boto/issues/2836</a> <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Should I Keep Using Pelican Or Move To Wordpress2016-01-18T00:00:00-05:002016-01-18T00:00:00-05:00yanivtag:prodissues.com,2016-01-18:/2016/01/should-i-keep-using-pelican-or-move-to-wordpress.html<p>I'm currently using <a href="http://docs.getpelican.com/en/3.6.3/">Pelican</a> to
power this site. Pelican is a static site generator (SSG) that takes
markdown files as an input and generate html pages as an output; no
database, no server-side logic; just simple, static HTML.</p>
<p>When I created this blog, using Wordpress or Tumblr wasn't an option …</p><p>I'm currently using <a href="http://docs.getpelican.com/en/3.6.3/">Pelican</a> to
power this site. Pelican is a static site generator (SSG) that takes
markdown files as an input and generate html pages as an output; no
database, no server-side logic; just simple, static HTML.</p>
<p>When I created this blog, using Wordpress or Tumblr wasn't an option,
simply because every geeky blogger I follow wrote about how much those
platforms suck, and how using SSG to run their blog were the best move
they have ever made. I chose Pelican<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>,
because of its popularity and because it is written in Python.</p>
<!--more-->
<p>Recently, though, I've started to question my decision. I found that I
spend more time on site administration than on writing. Tinkering with
the plumbing of the site meant that I have less time to write. And since
getting more productive with my writing is a <a href="http://prodissues.com/2015/12/thinking-with-words.html">personal
goals</a>, I've
started to play with the idea of switching to Wordpress.</p>
<p>The first thing that I've learned was that moving <em>from</em> SSG <em>to</em>
Wordpress meant swimming against the current. It isn't the cool thing to
do. Yet. As such, no one writes about it, except for Martin, who shares
in his post <a href="http://ronn-bundgaard.dk/blog/the-static-site-generator-pelican-vs-wordpress/#comment-14937">"The Static Site Generator Pelican VS
WordPress"</a><sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup> many of the pains I'll be discussing here in a moment.</p>
<p>With that, here's is my assessment of what I like and dislike about
Pelican, and what I expect to get (or not) from Wordpress. I hope this
will help me make up my mind, and get clearer on what should be my next
steps.</p>
<h2>Things that I like about Pelican</h2>
<ul>
<li><strong><em>*The coding experience</em></strong><em> - I'm not a full time developer.
Building this site helps me maintain </em>some* level of
coding proficiency.</li>
<li><strong><em>*Writing in markdown</em></strong>* - when writing a post, I can focus on
the content and not on the format and styling.</li>
<li><strong><em>*No database and no server side logic</em></strong>* - pages load faster,
and my site is supposed to be more secure (since everything is
static, there is almost no way to hack it).</li>
<li><strong><em>*Absolute control</em></strong>* - the entire site is encapsulated in one
<a href="https://github.com/yanivdll/prodissues">git repository</a> that
includes the content and the HTML template. It means that moving to
another hosting or SSG is easy.</li>
<li><strong><em>*Cost</em></strong>* - running a static site is almost free. All I have to
pay for is the domain name (\~13\$/year) and the Amazon S3
storage (\~0.5\$/month).</li>
</ul>
<h2>Things that I don't like</h2>
<ul>
<li><strong><em>*Generating the HTML pages is slow</em></strong>* - every time I'm adding a
new post, or editing an existing one, I have to regenerate the site.
This process takes time, and gets longer as I accumulate more and
more posts. Pankaj More put it nicely in his article <a href="http://blog.pankajmore.in/static-site-generators-focus-on-the-wrong-thing">Static Site
Generators Focus On The Wrong
Thing</a>.</li>
<li><strong><em>*Too much friction</em></strong>* - no matter how automated my process is,
it's still cumbersome. Just take a look at all the touch-points in
my publishing workflow:</li>
</ul>
<p><img alt="posting-workflow-with-pelican.png" src="http://media.prodissues.com/images/2016/01/posting-workflow-with-pelican.png"></p>
<ul>
<li><strong><em>*No mobile support</em></strong>* - since Pelican runs on the desktop, I
have no way to write a post on my iPhone and publish it directly to
my blog. This adds friction to my writing workflow, and hinders me
from writing more spontaneously.</li>
<li><strong><em>*Maintenance and site administration</em></strong>* - I'm getting tired of
running 2 terminals at all times, just to regenerate the site and
keep a development server live.</li>
<li><strong><em>*Slow iterations</em></strong>* - adding new functionality, improving
existing one, or making some UI changes takes a lot of time. Again,
this is valuable time that I prefer spending on writing.</li>
<li><strong><em>*Flaky org-mode integration</em></strong>* - I write most of my posts in
<a href="http://orgmode.org/">Org-mode</a>, using Emacs. Pelican and org-mode
doesn't work very well together. While there's a plugin for Pelican
that reads org files(org_reader), it relies on my
Emacs configuration. And since I'm experimenting with Emacs a lot,
this plugin constantly breaks. And when that's happens, most of my
posts (those that are in org-mode), won't be generated, and
disappeared from the site.</li>
</ul>
<p><img alt="error-make-html.png" src="http://media.prodissues.com/images/2016/01/error-make-html.png"></p>
<p><span class="figure-number">Figure 2:</span> Working with org and
Pelican isn't a smooth sail</p>
<p>And when it comes to Wordpress, here are the goods and the bad:</p>
<h2>The Goods</h2>
<ul>
<li><strong><em>*The writing experience</em></strong>* - starting, writing and publishing a
new post is frictionless.</li>
<li><strong><em>*Functionality</em></strong>* - comments, search, categories and tags
filtering, social functionality, and advanced post status
management, are all part of the platform.</li>
<li><strong><em>*Native commenting system</em></strong>* - if you'll read <a href="http://prodissues.com/2015/11/adding-a-commenting-system.html">this
post</a>,
you'll find that I'm not a big fan of disqus. Using the native
Wordpress commenting system is a big plus for me.</li>
<li><strong><em>*One dashboard</em></strong>* - I use Google analytics to monitor traffic,
and disqus dashboard to manage comments. I like the idea of getting
all this information in one place. Additionally, I currently don't
have a way to manage posts and drafts, since they are just files in
a folder. Having a dashboard where I can take a glimpse and see how
my site looks like is another benefit.</li>
<li><strong><em>*Community</em></strong>* - I'm getting warmer to the idea of being part of
the Wordpress community; of following, and being followed by, other
interesting bloggers, and having my posts discoverable across the
Wordpress ecosystem.</li>
</ul>
<h2>Concerns</h2>
<ul>
<li><strong><em>*Lack of control</em></strong>* - that's my biggest concern. When I <a href="http://prodissues.com/2015/06/why-i-decided-to-move-away-from-evernote.html">left
Evernote</a>,
I've decided that I'll never use proprietary formats; that I will
keep my information in plain text. I didn't want my data to be
reliant on a company that can go bust, or mess up with my it. I'm
not sure this is the case with Wordpress, because people seem to not
have issues exporting their blogs and moving elsewhere, and because
it's open source. So there will always be a way to gain control over
my data if needed. But still, having a black box that I know not how
it operates is bothering.</li>
<li><strong><em>*Complexity</em></strong>* - I won't be able to wrap my site with a bunch of
markdown files.</li>
<li><strong><em>*Cost</em></strong>* - Wordpress will cost much more, regardless if I use
Wordpress.com for hosting, or going the wp-admin route.</li>
<li>Performance - not high on my priority, at least for now, but still,
this is one of the main issues people mention when talking about
their decision to switch from Wordpress to static sites.</li>
</ul>
<h2>Conclusion</h2>
<p>As I'm writing this post, my gut feeling tells me that I've already made
a decision, and that I use this post as a way to rationalize the
decision to myself. <strong><em>*I'm going to migrate my blog to Wordpress</em></strong>*.</p>
<p>I'll do it gradually, though, and make a "cut-off" only when I'm sure
the benefits out-weight the drawbacks. I've already opened a blog in
Wordpress. It uses the default settings and URL
(<a href="http://yanivgilad.wordpress.com/">yanivgilad.wordpress.com</a>). I will
start pushing there everything I post<sup id="fnref-3"><a class="footnote-ref" href="#fn-3">3</a></sup> some
stuff there, including new posts that I push to pelican, to play around
with the system, and see how it feels.</p>
<h2>Updates</h2>
<ol>
<li>Fixed the issue.</li>
<li>Pelican refuses to generate this post. There's probably something
wrong with the org-reader plugin, or my Emacs config... but that's
an example for the friction and site administration work I'm trying
to avoid.</li>
</ol>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>For a list of almost every SSG available, check out
<a href="https://www.staticgen.com/">StaticGen</a>. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>Martin, by the way, decided to move to Wordpress. <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn-3">
<p>I installed <a href="https://github.com/punchagan/org2blog/">org2blog</a> in my
Emacs, and plan to use it to push my org-mode based posts to Wordpress. <a class="footnote-backref" href="#fnref-3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Fixing My Apple Extended Keyboard II2016-01-15T00:00:00-05:002016-01-15T00:00:00-05:00yanivtag:prodissues.com,2016-01-15:/2016/01/fixing-my-apple-extended-keyboard-ii.html<p>Couple of months ago I bought the Apple Extended Keyboard from EBay. I
fell in-love with it immediately, and enjoyed typing in it more than I
do with my WASD Code<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>.</p>
<p>To my disappointment, though, few days after I got it, several keys
started to show signs of weakness …</p><p>Couple of months ago I bought the Apple Extended Keyboard from EBay. I
fell in-love with it immediately, and enjoyed typing in it more than I
do with my WASD Code<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>.</p>
<p>To my disappointment, though, few days after I got it, several keys
started to show signs of weakness. The '8' key spouted multiple letters
in every stroke. The 't' worked sporadically, and the '.' stopped
responding altogether.</p>
<!--more-->
<h2>First Aid</h2>
<p>I looked up how to fix an AEK. Most of the articles I found helped me
with dissembling the case and the board, pulling out key-caps and crack
opening the alps switches. I learned to clean, scratch oxide and
lubricate the switch internals to improve conductivity.</p>
<p>These measures didn't work. I thought about buying a new AEK, but
figured it will make no sense. It's a 30 years old model, and chances
are each keyboard I'll buy will have similar chances of having broken
keys. Yet, this is too good of a keyboard to abandon.</p>
<h2>Intensive Care</h2>
<p>And so, I got myself deeper into the world of mechanical keyboards. I
learned that I can desolder switches from the board and replace them
with new ones, but I didn't find alps switches to buy. What I did find
were Matias switches, which claim to be identical to the classic white
Alps switches.</p>
<p>I found a sample pack of Matias switches at
<a href="https://mechanicalkeyboards.com/shop/index.php?l=product_detail&p=483">mechanicalkeyboards.com</a>.
It includes 5 switches, and costs 5.99\$. I then ordered a <a href="http://www.amazon.com/gp/product/B00KR1CXTS?psc=1&redirect=true&ref_=oh_aui_search_detailpage">soldering
kit</a>
from Amazon<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>. My plan was to replace the
malfunctioned keys. But when I got the Matias switches, I noticed that
they are much clickier than the AEK's alps. I didn't want to have
different typing experience, so I decided to replace the broken switches
with functioning ones from keys I never use. I will then install the
Matias switches for those rarely used keys.</p>
<p>Now that I had a plan, I went on to learn about soldering. I found
through <a href="http://reddit.com/r/mechanical_keyboards/">the
/r/MechanicalKeyboards</a>
subreddit a series of YouTube videos about soldering<sup id="fnref-3"><a class="footnote-ref" href="#fn-3">3</a></sup>. I think those videos were made around the time my AEK was
manufactured, but they are as timeless as this keyboard. If you're into
it, then take a look also at that video. I found it very helpful in
figuring out how to melt the soldering in order to take off existing
switches, and how to use the soldering pump for sucking away the solder
from the circuit board.</p>
<p>Armed with the acquired knowledge, the whole process turned out to be
easy, quick and actually, quit fun. In less than 10 minutes I had a
renovated keyboard. And now, not only that I have the rolls-royce of
keyboards back in shape, I also know how to take care of it the next
time one of its parts shows signs of fatigue.</p>
<h2>The Gallery</h2>
<p>Here are some pictures that illustrate the process (I also included at
the bottom of the article helpful links for further support):</p>
<p><img alt="IMG_6290.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6290.jpg"></p>
<p><span class="figure-number">Figure 1:</span> The ingredients - the
soldering kit</p>
<p><img alt="IMG_6286.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6286.jpg"></p>
<p><span class="figure-number">Figure 2:</span> The ingredients - the
Matias clicky switches pack (2 out of the 5 that arrived in the pack)</p>
<p><img alt="IMG_6291.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6291.jpg"></p>
<p><img alt="IMG_6287.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6287.jpg"></p>
<p><span class="figure-number">Figure 4:</span> After opening the case</p>
<p><img alt="IMG_6269.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6269.jpg"></p>
<p><span class="figure-number">Figure 5:</span> This is how the board looks
from the back. That's where the soldering work will take place. Locate
the soldering that connects the switches we want to remove. Notice the
horizontal lines of solder pairs. Each line represent a row. Each pair
connecting a switch. That should help you locate the switches to work
on.</p>
<p><img alt="IMG_6270.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6270.jpg"></p>
<p><span class="figure-number">Figure 6:</span> When locating the solders,
mark them. Otherwise it's easy to get confused and remove the wrong
switch.</p>
<p><img alt="IMG_6281.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6281.jpg"></p>
<p><span class="figure-number">Figure 7:</span> Starting to work - remove
the '8' key</p>
<p><img alt="IMG_6273.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6273.jpg"></p>
<p><span class="figure-number">Figure 8:</span> Melting the solder at
around the '8' key switch</p>
<p><img alt="IMG_6284.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6284.jpg"></p>
<p><span class="figure-number">Figure 9:</span> That's how the rotten '8'
switch looks like. Notice the oxide at the legs of the switch that
causing this key to not work</p>
<p><img alt="IMG_6276.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6276.jpg"></p>
<p><span class="figure-number">Figure 10:</span> Now, move to pulling away
the function keys that I don't use. I plan to use the switches of the
num-lock, '=' and '/'</p>
<p><img alt="IMG_6272.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6272.jpg"></p>
<p><span class="figure-number">Figure 11:</span> Look at the soldering of
the num-lock - the legs are twisted. I don't want to apply physical
force to straighten them so I can take them out. I'll take out the '-'
switch instead</p>
<p><img alt="IMG_6282.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6282.jpg"></p>
<p><span class="figure-number">Figure 12:</span> Plugging in the new Matias
switches (don't have picture of the actual soldering process)</p>
<p><img alt="IMG_6283.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6283.jpg"></p>
<p><span class="figure-number">Figure 13:</span> Putting the key-caps back
(can you notice what's wrong in this picture?)</p>
<p><img alt="IMG_6289.jpg" src="http://media.prodissues.com/images/2016/01/IMG_6289.jpg"></p>
<p><span class="figure-number">Figure 14:</span> Putting the board back
into the case, and testing the keyboard with
<a href="https://itunes.apple.com/us/app/typist/id415166115?mt=12">Typist</a></p>
<h2>Updates:</h2>
<ul>
<li>Few things that I learned from readers, after posting this:<ul>
<li>I can find genuine AEK II alps at the
<a href="https://www.reddit.com/r/mechmarket">/r/mechmarket</a> subreddit.
I looked it out and found someone who have them.</li>
<li>The Matias Quiet Tactiles are the closest match to my AEK
II keys. Not the Matias Standard Clicky that I bought.</li>
<li>It is possible to replace the clicky leaves in the Matias
Standard Clicky with the ALPS ones. That will supposadly turn
the typing experience on the Matias that I have closer to that
on the alps.</li>
</ul>
</li>
</ul>
<h2>Other Useful Links</h2>
<ul>
<li><a href="https://ifixit.org/blog/4468/hack-it-better-apple-extended-keyboard-ii/">Hack It Better: Apple Extended Keyboard
II</a></li>
<li><a href="https://www.ifixit.com/Teardown/Apple+Extended+Keyboard+II+Teardown/42138">Apple Extended Keyboard II
Teardown</a></li>
<li><a href="http://lowendmac.com/2006/apples-extended-keyboard-ii-sequel-to-a-legend/">Apple’s Extended Keyboard II: Sequel to a
Legend</a></li>
<li><a href="https://github.com/cfenollosa/aekii">Tuning an Apple Extended Keyboard
II</a></li>
<li><a href="http://deskthority.net/wiki/Apple_Extended_Keyboard_II">Apple Extended Keyboard
II (Deskthority)</a></li>
<li><a href="http://www.mactech.com/articles/mactech/Vol.05/05.01/Keyboardrepair/index.html">Keyboard
Repair</a></li>
</ul>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>That might change, though. I have high hopes from the <a href="https://www.massdrop.com/buy/granite-keycap-set">Granite
Key-caps Set</a> I've just
committed to on Massdrop. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>Can't be more satisfied with that kit. <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn-3">
<p><a href="https://www.youtube.com/watch?v=vIT4ra6Mo0s">Basic Soldering Lesson 1 - "Solder &
Flux"</a> - but I recommend
that you'll also watch lessons 2 and 3. <a class="footnote-backref" href="#fnref-3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Blog Writing - Our First Meeting2016-01-10T00:00:00-05:002016-01-10T00:00:00-05:00yanivtag:prodissues.com,2016-01-10:/2016/01/blog-writing-our-first-meeting.html<p>Our Blog Writing meetup has taken off to a great start! Last Wednesday
18 of us met for the first time to discuss the vision of our group,
share personal goals and talk about writing and blogging.</p>
<p>In case you've missed it, want to learn about our group, or just …</p><p>Our Blog Writing meetup has taken off to a great start! Last Wednesday
18 of us met for the first time to discuss the vision of our group,
share personal goals and talk about writing and blogging.</p>
<p>In case you've missed it, want to learn about our group, or just
reminisce, here's the presentation we went through, followed by a
turn-by-turn summary of the meeting<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>.</p>
<iframe src="https://docs.google.com/presentation/d/19fXAyS8pZob0vJL6byLrFEUoZSizO3LncBuWJp1-oTQ/embed?start=false&loop=false&delayms=3000" frameborder="0" width="600" height="366" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
<!--more-->
<h2>A Round of Introductions</h2>
<p>I was taken aback by the level of experience and talent in the room -
published authors, professional bloggers, writers and people for whom
writing is a second nature. My selfish plan to surround myself with
people, who, unlike me, know a thing or two about writing, and from whom
I can nurture, succeeded beyond expectations!</p>
<p>Yet, I've learned that no matter how skillful writer you are, we
probably share similar excused for not blogging as much as we would have
liked to: we don't know what to write about, we're too afraid of what
people will say<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>, we accumulate more drafts
than our drawer can hold, and we keep promising ourselves that <em>this</em>
week <em>is</em> the week. The week when we'll finally launch our blog.</p>
<p>Next, we talked about the definition of our group.</p>
<h2>Our mission</h2>
<p>We would like to create a support group, which will encourage its
members to maintain a blog, and post to it regularly and
frequently<sup id="fnref-3"><a class="footnote-ref" href="#fn-3">3</a></sup>. Our motto:</p>
<p><strong><em>*Write. Post. Repeat.</em></strong>*</p>
<p>We also stated what's not part of our mission. Promoting, monetizing and
making business out of our blogs are not what we'll focus on in this
group.</p>
<p>Knowing the "what", it was time to talk about the "how".</p>
<h2 id="orgheadline3">Meeting format</h2>
<p>We'll meet once a month. Each meeting will have a theme. Examples for
themes might be: setting up a blog, knowing our audience, writing style,
voice, tone and authority.</p>
<p>At the fist part of the meeting we'll talk about the theme. We might
have someone from the group leading the discussion, external speaker or
just an open discussion.</p>
<p>At the second part of the meeting, we will read posts, written by
members of the group, and then share our feedback (more on that
bellow...)</p>
<h2 id="orgheadline4">Reading And Providing Feedback - Dry Run</h2>
<p>Since it was the first meeting, we started off by reading couple of blog
posts by other bloggers. Here are the links to these posts:</p>
<ul>
<li><a href="http://www.joelonsoftware.com/news/fog0000000244.html">Example post 1 - No
Title</a></li>
<li><a href="http://sethgodin.typepad.com/seths_blog/2002/01/index.html">Example post 2 -
Boring</a></li>
</ul>
<p>If you'll read them, you might share the same perception as people in
the team had - these will probably not be nominated for the best blog
posts of all times. They are short, lacking in style, superficial in
their description and leave the reader hanging when it comes to the
point they are trying to get across.</p>
<p>And yet, I started with them because of the influence they had on me.
You see, when <em>I</em> was procrastinating the launch of my site, working for
more than a month on a <a href="http://prodissues.com/2015/05/ekko-for-ios.html">two paragraphs
post</a>, putting
deadlines just to see how they're being pushed from one week to the
next, I needed inspiration.</p>
<p>I decided to check the archives on Joel Spolsky's and Seth Godin's
blogs. Those are two prolific bloggers, whom I follow, and I wanted to
see how <em>their</em> beginning looked like. I found that they sucked. Maybe
even more than I do!</p>
<p>I realized that unless I push that post live, even if it's crappy, I'll
never be able to improve. Improvement, I understood, rely not only on
the writing, but also on posting. Even more importantly, it will happen
only if I do the writing and posting again and again. Hence the motto:</p>
<p><strong>Write. Post. Repeat</strong></p>
<h2>5 Tips For Writing</h2>
<p>We continued with a post by a member of the team - Sue Hollister Barr
(known as Holly). I thought that will be the most interesting part of
our meeting. I was right. Holly's post, "<a href="http://suehollisterbarr.com/my-personal-top-five-writing-tips/">Top Five Writing
Tips</a>"<sup id="fnref-4"><a class="footnote-ref" href="#fn-4">4</a></sup>, led to a passionate (at times heated) discussion on
feedback. What type of feedback should we give? should it be pungent,
critical and direct, or rather compassionate, positive and supportive,
even if we think the post isn't that great?</p>
<p>Our guiding mission - support and encourage members to maintain a blog -
made the answer clear. We should stick with the latter approach, and
provide feedback that is as constructive as encouraging.</p>
<p>Unfortunately, at the height of the discussion, one of the participants
concluded that the group isn't the right fit for her, and decided to
leave. That spoiled our excitement and enthusiasm, but served as
reminder that keeping true to a vision might not be appealing to
everyone.</p>
<p>Overall, though, the evening was a big success. The RSVP list for our
next meeting is probably the best evidence for that - it got fully
booked couple of hours after announcing the date!</p>
<p>I can't be more excited about the future of that team.</p>
<h2>Other Group Resources</h2>
<p>When not meeting, member of the group can still communicate, share
posts, feedback, tips and learning with other members. Here's a link to
our online hubs:</p>
<ul>
<li><a href="https://www.facebook.com/groups/548895981933905">Facebook group</a></li>
<li><a href="http://www.meetup.com/Blog-writing/">Meetup page</a></li>
</ul>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>Here's what participants <a href="http://www.meetup.com/Blog-writing/events/227048354/">had to
say</a> about the
meeting. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>Hack - now that I know that some of the members in that team will read
that post, I'm thinking twice than I would of, on every word I type... <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn-3">
<p>To be more precise about it, we want each of the members to own a live
blog, and to post to that blog at least once between our monthly
meeting. <a class="footnote-backref" href="#fnref-3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn-4">
<p>I use Holly's post as a reference while writing those lines... <a class="footnote-backref" href="#fnref-4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Should I Move My Blog Here?2016-01-08T23:40:00-05:002016-01-08T23:40:00-05:00yanivtag:prodissues.com,2016-01-08:/2016/01/should-i-move-my-blog-here.html<p>I'm currently blogging using Pelican as my static site generator
(<a href="http://prodissues.com">here's a link</a>). I started with that because it
seemed like the cool thing to do - write your own blog, control
everything, and write posts in plain text, or markdown.</p>
<p>But as time went by, and I wrote more and …</p><p>I'm currently blogging using Pelican as my static site generator
(<a href="http://prodissues.com">here's a link</a>). I started with that because it
seemed like the cool thing to do - write your own blog, control
everything, and write posts in plain text, or markdown.</p>
<p>But as time went by, and I wrote more and more, I got annoyed with the
constant need to maintain and manage Pelican. I start getting bored,
tinkering its internals. What's more, it started to take longer to post
new entries. Pelican generate the entire site, every time a post is
edited. So as I've accumulated posts, making changes and seeing their
results became a long process. With 26 posts now, it takes almost 2
minutes to a see a change I made in the development site.</p>
<p>So I want to give WP a try. Don't know if I'll like it, and if I'll be
ok with loosing some of my control. But who knows...</p>
<p>That's it for a test page, right...?</p>
<hr>
<p><em>Update 02/18/2018:</em> This was written in Wordpress, just before I decided to move from Pelican...</p>Get The Current File's Path in Emacs2016-01-04T00:00:00-05:002016-01-04T00:00:00-05:00yanivtag:prodissues.com,2016-01-04:/2016/01/get-the-current-files-path-in-emacs.html<p>Here's a small function I borrowed from <a href="http://stackoverflow.com/questions/3669511/the-function-to-show-current-files-full-path-in-mini-buffer">this
question</a>
on stack-overflow. It returns the full path of the file I currently edit
in the buffer:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nb">defun</span> <span class="nv">show-file-name</span> <span class="p">()</span>
<span class="s">"Show the full path file name in the minibuffer."</span>
<span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
<span class="p">(</span><span class="nv">message</span> <span class="p">(</span><span class="nv">buffer-file-name</span><span class="p">))</span>
<span class="p">(</span><span class="nv">kill-new</span> <span class="p">(</span><span class="nv">file-truename</span> <span class="nv">buffer-file-name</span><span class="p">))</span>
<span class="p">)</span>
<span class="p">(</span><span class="nv">global-set-key</span> <span class="s">"\C-cz"</span> <span class="ss">'show-file-name</span><span class="p">)</span>
</pre></div>
<p>You'll note that this function …</p><p>Here's a small function I borrowed from <a href="http://stackoverflow.com/questions/3669511/the-function-to-show-current-files-full-path-in-mini-buffer">this
question</a>
on stack-overflow. It returns the full path of the file I currently edit
in the buffer:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nb">defun</span> <span class="nv">show-file-name</span> <span class="p">()</span>
<span class="s">"Show the full path file name in the minibuffer."</span>
<span class="p">(</span><span class="nv">interactive</span><span class="p">)</span>
<span class="p">(</span><span class="nv">message</span> <span class="p">(</span><span class="nv">buffer-file-name</span><span class="p">))</span>
<span class="p">(</span><span class="nv">kill-new</span> <span class="p">(</span><span class="nv">file-truename</span> <span class="nv">buffer-file-name</span><span class="p">))</span>
<span class="p">)</span>
<span class="p">(</span><span class="nv">global-set-key</span> <span class="s">"\C-cz"</span> <span class="ss">'show-file-name</span><span class="p">)</span>
</pre></div>
<p>You'll note that this function is bind to <code>C-c z</code>. So when typing it,
you should see the path showing in the minibuffer. As a bonus, it stores
the path in the kill ring, so <code>C-y</code> (<code>CMD-v</code> works as well on my mac)
will paste the value.</p>My Post-Evernote Life2015-12-31T05:00:00-05:002015-12-31T05:00:00-05:00yanivtag:prodissues.com,2015-12-31:/2015/12/my-post-evernote-life.html<h1>Table of Contents</h1>
<ol>
<li><a href="#note-taking">Note taking</a></li>
<li><a href="#bookmarks">Bookmarks and references</a></li>
<li><a href="#scans">Scans</a></li>
<li><a href="#passwords">Passwords and secure notes</a></li>
<li><a href="#annotations">Image annotations</a></li>
<li><a href="#lists">List and Todos</a></li>
<li><a href="#images">Images</a></li>
<li><a href="#journal">Journal/diary</a></li>
</ol>
<p>Few months ago I wrote about my decision to <a href="http://prodissues.com/2015/06/why-i-decided-to-move-away-from-evernote.html">move away from
Evernote</a>.
Recently, few readers^<a class="footref" href="#fn.1" id="fnr.1">1</a>^ emailed me to ask
whether I actually stooped using Evernote, and if …</p><h1>Table of Contents</h1>
<ol>
<li><a href="#note-taking">Note taking</a></li>
<li><a href="#bookmarks">Bookmarks and references</a></li>
<li><a href="#scans">Scans</a></li>
<li><a href="#passwords">Passwords and secure notes</a></li>
<li><a href="#annotations">Image annotations</a></li>
<li><a href="#lists">List and Todos</a></li>
<li><a href="#images">Images</a></li>
<li><a href="#journal">Journal/diary</a></li>
</ol>
<p>Few months ago I wrote about my decision to <a href="http://prodissues.com/2015/06/why-i-decided-to-move-away-from-evernote.html">move away from
Evernote</a>.
Recently, few readers^<a class="footref" href="#fn.1" id="fnr.1">1</a>^ emailed me to ask
whether I actually stooped using Evernote, and if I did, what's my
alternative solution.</p>
<!--more-->
<p>So yes, I've stopped using Evernote (although I <em>do</em> use some of its
satellite apps, as you'll note bellow). I still have it installed,
because I didn't migrated my notes somewhere else, and therefore, every
now and then I'll have to pull out a note from it, usually a password or
a certain id number.</p>
<p>And yes, I have an alternative. But rather than one tool that inherited
everything I use Evernote for, I use a set of specialized apps and
services, each dedicated to a certain function or use-case.</p>
<p>I've tried to summaries those tools bellow. Drop a comment or<a href="mailto:yanivdll@gmail.com">email
me</a> for other use-cases, or if you want to
suggest other apps. Let's start:</p>
<p><a name="note-taking"></a></p>
<h2>Note taking</h2>
<ul>
<li>I store all my notes in plain text based files. If I've learned
anything from my experience with Evernote is that never again will I
keep my notes and documents in a proprietary format. Everything I
produce must be agnostic to the tool I create it with.</li>
<li>All of my notes are stored in a Dropbox folder (\~/Dropbox/Notes).
That way I can access them from anywhere.</li>
<li>I use several apps to create, edit, search and manage my notes,
depending on the platform I'm on:<ul>
<li>iOS<ul>
<li>I start almost every new notes in
<a href="http://agiletortoise.com/drafts/">Drafts</a> because it opens
quickly, ready to accept my input. It also serves as a
terminal, from which my notes depart to their
final destination. Those destinations might be an email,
calendar event, document or a blog post. There are many
more, though. Take a look at <a href="http://drafts4-actions.agiletortoise.com/">Drafts' action
directory</a> to get
a sense of them.</li>
<li><a href="http://omz-software.com/editorial/">Editorial</a> - a
comprehensive editor for iOS. I use it to edit existing
notes, or to elaborate on a note I've started in Drafts.</li>
</ul>
</li>
<li>Mac ^<a class="footref" href="#fn.2" id="fnr.2">2</a>^<ul>
<li>I use an app called
<a href="http://brettterpstra.com/projects/nvalt/">nvAlt</a> to manage
those notes. I use it to search for (it has great
searching capabilities) or start new notes.</li>
<li><a href="http://multimarkdown.com/">MultiMarkdown Composer</a> - full
blown multimarkdown editor (but it can be used for many more
formats as well). When thinking about it, my workflow on mac
resemble that on mobile - I usually start my notes in nvAlt,
which is good for taking quick and short notes. Then, if I
want to expand on a document, I'll open it in MMD.</li>
<li>Google Docs - for sharing and collaborate with colleagues.
Usually I'll write a first draft in nvAlt or MMD, and then
export it to google docs.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><a name="bookmarks"></a></p>
<h2>Bookmarks and references</h2>
<ul>
<li>I use <a href="https://pinboard.in/u:yanivdll">Pinboard</a> as my
bookmarks manager. It's a paid service, offering a simple, no
fluff service. 11\$ a year and it has you covered.</li>
</ul>
<p><a name="scans"></a></p>
<h2>Scans</h2>
<ul>
<li>I use a service called <a href="https://filethis.com/">FileThis</a> to download
invoices and store them in a another Dropbox folder. This service
connects to providers, such as my bank, cable company or mobile
provider, and download my invoices once a month. This service is
free when connecting up to 6 providers (I've connected 4 so far).</li>
<li>I still use one of Evernote mobile apps -
<a href="https://evernote.com/products/scannable/">scannable</a> for on the
go scans. Frankly, I love this app; it's fast, accurate and produce
superb images. It does much better job, and much faster than, say, a
physical scanner. It also allow me to save scan wherever I want. I
usually either send a copy of the scans and discard the original, or
save them to my Dropbox.</li>
</ul>
<p><a name="passwords"></a></p>
<h2>Passwords and secure notes</h2>
<ul>
<li>Very simple - I use <a href="https://agilebits.com/onepassword">1password</a>
for that.</li>
</ul>
<p><a name="annotations"></a></p>
<h2>Image annotations</h2>
<p>Sometimes I need to take a screen-grab and add annotate it. I don't do
it often, and therefore didn't switch from Evernote's
<a href="https://evernote.com/skitch/">Skitch</a>. Skitch saves my annotated images
to Evernote, but I don't care about it. If I need them for future use,
I'll either upload them to Amazon S3 (where I store this site), or save
them to my Dropbox.</p>
<p><a name="lists"></a></p>
<h2>List and Todos</h2>
<p>I've rarely used Evernote for reminders and todos, as it never excelled
in managing them. In addition, todos and GTD are completely different
beast, with separate workflows, and with their own set of tools. Let me
know if you're interested, and I'll expand on that in a separate post.
In essence, though, here are the main tools I use to manage my todos:</p>
<ul>
<li>Apple Reminders - that's my repository for everything with a due
date, and include no more than one atomic task. I then add reminders
from my mac, iPad or iPhone, as well as from 3rd party apps, such as
<a href="https://flexibits.com/fantastical">Fantastical</a>.</li>
<li><a href="http://www.hogbaysoftware.com/products/taskpaper">Taskpaper</a> -
simple, yet robust, text based task manager. I use it for my
GTD workflow. It can hold huge amount of data, and has powerful
search capabilities. Here's a<a href="http://www.macdrifter.com/2014/02/the-taskpaper-rd-notebook.html">good
review</a>
of that tool. Only caveat is that the app is somewhat deprecated,
with limited to no support from the developer.</li>
</ul>
<p><a name="images"></a></p>
<h2>Images</h2>
<p>I used to store select images in Evernote. Kind of like a journal. I
didn't find a solution for that use-case yet. But it is also not a
priority.</p>
<p><a name="journal"></a></p>
<h2>Journal/diary</h2>
<p>I used to throw journaling notes into Evernote. For example, if I
changed my mobile data plan, I would add a note, just to mark the date
of the change, for future reference. Now I have one file in my Dropbox
notes folder, to which I append entries, preceded with the date they
were entered.</p>
<p>I think that covers most of what I used Evernote for. Again, happy to
learn about more tools you find as good alternatives to Evernote.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>Their number is still much, much, smaller than that of the users I
converted into using Evernote over the years... <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>Now, if you have the heart for it (and to be honest, I don't recommend
taking that path), I moved everything text based to
<a href="https://www.gnu.org/software/emacs/">Emacs</a>... I still store all my
notes in Dropbox, but access, manage and edit them (and lots more) in
Emacs. <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Quotes: Little Gidding2015-12-28T05:00:00-05:002015-12-28T05:00:00-05:00yanivtag:prodissues.com,2015-12-28:/2015/12/quotes-little-gidding.html<p>Couple of weeks ago I was vacationing with my family at the Dominican Republic. One night, at about midnight, while I was lying half asleep in-front of the TV, watching a show about Vietnam on the Discovery Channel (the only English channel), I caught this quote:</p>
<blockquote>
<p>We shall not cease …</p></blockquote><p>Couple of weeks ago I was vacationing with my family at the Dominican Republic. One night, at about midnight, while I was lying half asleep in-front of the TV, watching a show about Vietnam on the Discovery Channel (the only English channel), I caught this quote:</p>
<blockquote>
<p>We shall not cease from exploration, and the end of all our exploring
will be to arrive where we started and know the place for the first
time.</p>
</blockquote>
<p>This line stirred me, and I had to find the source. It was taken from T.S Eliot's poem - <a href="http://www.columbia.edu/itc/history/winter/w3206/edit/tseliotlittlegidding.html">Little Gidding</a>.</p>
<p>The next day, I read the entire poem. It wasn't an easy read<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>, but several more parts of it moved me just as much. Here are couple of them:</p>
<blockquote>
<p>... last year's words belong to last year's language And next year's
words await another voice.</p>
<p>Let me disclose the gifts reserved for age ... Second, the conscious
impotence of rage At human folly, and the laceration Of laughter at
what ceases to amuse.</p>
</blockquote>
<p>Mysterious are the ways of knowledge and inspiration... one should
always be willing and ready to absorb more of them...</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>Here are <a href="http://www.sparknotes.com/poetry/eliot/section10.rhtml">some analyses and commentary</a>, in case you would like to get deeper. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Thinking With Words2015-12-28T05:00:00-05:002015-12-28T05:00:00-05:00yanivtag:prodissues.com,2015-12-28:/2015/12/thinking-with-words.html<p>I want to capture more thoughts in text. I have lots of ideas and
thoughts lately, but I forget most of them, let alone follow up or act
on them.</p>
<p>Well, I've started moving at that direction - a year ago I wrote
nothing; now I write <em>something</em> almost everyday, even …</p><p>I want to capture more thoughts in text. I have lots of ideas and
thoughts lately, but I forget most of them, let alone follow up or act
on them.</p>
<p>Well, I've started moving at that direction - a year ago I wrote
nothing; now I write <em>something</em> almost everyday, even if most of what I
write isn't being published, and at best added to my growing
<a href="http://prodissues.com/drafts/">draft</a> section.</p>
<p>Anyway, I built an infrastructure that enables me to think-write
efficiently. I leaned touch-typing, so now I can, potentially,
disconnect my hands from my conscious side of the brain, and let my
thoughts transcribe themselves directly into text. I still type slower
than I think, and that will probably always be the case, but I can
already let my thoughts flow with less friction.</p>
<p>I also surrounded myself with editors and tools that are there for me
whenever a new thought emerges, so I can quickly log it. Here's a short
list of those tools:</p>
<ol>
<li>Emacs - this is the main editor I use on my laptop. I still have to
make some tweaks so I can start a new note from anywhere (and not
only from within Emacs).</li>
<li>Drafts - I use it on my iPhone to quickly jot notes on the fly.</li>
<li>Editorial - a richer iOS editor. I use it to edit existing
documents, though I rarely actually do it (edit existing files on my
phone, I mean).</li>
</ol>
<p>One set of tools that is missing from that list is, well, pen and
paper... Regardless of how many editors I have at my disposable, I still
miss the immediacy and flexibility of a simple notebook that takes
whatever I throw on it, without having to think about format, syntax or
styling. If I want to sketch something, I should be able to just take a
pen and draw it. If I want to create a quick chart, I don't want to
start looking for the right tool for the exact type of chart I want to
illustrate. For some reason though, I can't find a way to incorporate
pen and paper in my writing workflow.</p>
<p>But that's not the only reason why I still don't have an efficient way
to capture my thoughts[^1]. I also lack self-discipline. I don't insist on capturing things - too often, when an
idea comes up, I tell myself that I should log it and expand on it late.
That later never comes... This post, on the other hand, is an example
for how I <em>should</em> do it. I started to think about why I don't capture
more thoughts, and insisted on writing this thought live, as it happens.
Not sure if anyone but myself can read the outcome or find something
valuable in it, but it's a start.</p>
<p>Now I need to train myself to do it more often, and get better in it,
for two main reasons:</p>
<ol>
<li>To be able to capture things, I should avoid creating a backlog of
half baked scribbles. The more partial thoughts that I accumulate,
the higher the chance that I will never get back to them.</li>
<li>When I do capture a thought, let my sub-conscious lead the writing,
and edit what I came up with later, I tend to screw up that outcome.
My thought is being mutilated by my conscious self to the point it
makes no sense anymore, and. If I get better at capturing a thought
as it appears, I will need less post-processing, and the thought
will remain fresh and true to its original meaning.</li>
</ol>
<p>So, to summarize, what I want to be able to do is capture a meaningful
thought when it shows. The write up should be legible. It can take any
form, and be in any format - digital or analog.</p>
<p>The KPI I can monitor to measure progress is the time it takes from a
"meaningful thought" to a published post. It means that I should capture
the time when a thought or an idea emerged (12/28/15 9:05am for this
one), and the time it went live (in this case - 10:50am, which is
probably a record!)</p>
<p>[1]: Obviously, I don't intend to capture <em>every</em> thought that pops randomly,
only those that are "capture worthy".</p>I Can Live Without A Mac2015-12-20T05:00:00-05:002015-12-20T05:00:00-05:00yanivtag:prodissues.com,2015-12-20:/2015/12/i-can-live-without-a-mac.html<p>Couple of months ago I listened to an episode of the <a href="http://technicaldifficulties.us/episodes/080-a-history-of-computing">technical
difficulties</a>
podcast. In that episode Gabe Weatherhead
(<a href="http://macdrifter.com/">macdrifter.com</a>) and Erik Hess hosted <a href="https://twitter.com/drdrang">Dr.
Drang</a> and talked about the history of
computing.</p>
<p>At some point <sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>, Gabe asked Dr. Drang what
will he do if he can't use …</p><p>Couple of months ago I listened to an episode of the <a href="http://technicaldifficulties.us/episodes/080-a-history-of-computing">technical
difficulties</a>
podcast. In that episode Gabe Weatherhead
(<a href="http://macdrifter.com/">macdrifter.com</a>) and Erik Hess hosted <a href="https://twitter.com/drdrang">Dr.
Drang</a> and talked about the history of
computing.</p>
<p>At some point <sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>, Gabe asked Dr. Drang what
will he do if he can't use Mac anymore. I don't remember exactly what
Dr. Drang's answer was, but for awhile, the question kept echoing in my
head. The thought about Mac not being around at some point was
terrifying. I can't go back to Windows. Never. And Linux never seen as
an adventure I would have like taking.</p>
<p>Since then, though, much have changed.</p>
<p>At first, I was reintroduced to old fashion mechanical
keyboards<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>. I bought a couple of them; one
for home and one for my office. Suddenly, typing using my laptop's
keyboards <sup id="fnref-3"><a class="footnote-ref" href="#fn-3">3</a></sup> feels awkward and unsatisfying,
and I now do it as little as possible.</p>
<p>Then, I took a step into the rabbit hole of Emacs, the timeless editor
which is backed by a strong and lively community. It's built around the
keyboard, so I stopped using the Apple's "magic" mouse as much as I used
to.</p>
<p>Lastly, since Emacs requires tinkering with Mac's internals, I got more
comfortable and familiar with the terminal application, and with
"UI-less" experiences.</p>
<p>Slowly, I've learned that my Mac is nothing but a strong processing
device with a Retina display. With that realization, the idea of using a
different platform, Windows is still not an option, stopped scaring me.
To the contrary, that thought sparks curiosity in me...</p>
<p>While switching away is still not an option, I feel as if I was cured
from Apple's spell. I regained my ability to think critically on its
products, and look more objectively on their alternatives.</p>
<p>It's probably only me, though, <a href="http://prodissues.com/2015/11/leap-into-the-past-irc.html">cuddling with the
past</a>. Most
users are probably welcoming the intersecting paths of Mac and iPad into
a comp-let mongrel that will lock developers out of its internals. But
now, at least, I'm less anxious about that trajectory. I <em>will</em> be able
to find my way elsewhere...</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p><a href="http://soundcloud.com/techdiffpodcast/080-a-history-of-computing#t%253D77:12">Here's</a>
a link to this section in the podcast. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>Typing on mechanical keyboard makes me not wanting to stop writing... I
learned about them in yet another podcast -
<a href="https://www.relay.fm/cortex/1">Cortex</a> <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn-3">
<p>Except for the <a href="https://en.wikipedia.org/wiki/Apple_Extended_Keyboard">Apple Extended
Keyboard</a>. I
actually bought one, and am loving it. <a class="footnote-backref" href="#fnref-3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Bunch of Emacs Tweaks2015-12-04T05:00:00-05:002015-12-04T05:00:00-05:00yanivtag:prodissues.com,2015-12-04:/2015/12/bunch-of-emacs-tweaks.html<h2>Comment\Uncomment a Line</h2>
<p>Few useful commands for commenting\uncommenting lines in emacs. Taken
from the <a href="http://www.gnu.org/software/emacs/manual/html_node/emacs/Comment-Commands.html">Emacs
tutorial</a>.
Sure, I can go back to the manual, but I want to ducument and keep them
here, for quicker reference.</p>
<blockquote>
<p><code>M-;</code> Insert or realign comment on current line; if the region is …</p></blockquote><h2>Comment\Uncomment a Line</h2>
<p>Few useful commands for commenting\uncommenting lines in emacs. Taken
from the <a href="http://www.gnu.org/software/emacs/manual/html_node/emacs/Comment-Commands.html">Emacs
tutorial</a>.
Sure, I can go back to the manual, but I want to ducument and keep them
here, for quicker reference.</p>
<blockquote>
<p><code>M-;</code> Insert or realign comment on current line; if the region is
active, comment or uncomment the region instead (comment-dwim).</p>
<p><code>C-u M-;</code> Kill comment on current line (comment-kill).</p>
<p><code>C-x ;</code> Set comment column (comment-set-column).</p>
<p><code>C-M-j</code> <code>M-j</code> Like RET followed by inserting and aligning a comment
(comment-indent-new-line). See Multi-Line Comments.</p>
<p><code>M-x comment-region</code></p>
</blockquote>
<p>Mastering this command takes me one step further into Emacs, as it used
to be one of those functionalities that keep drawing me back to Sublime
Text.</p>
<h2 id="orgheadline2">Quick reload of init.el file</h2>
<p>I'm constantly customizing my emacs. I have an <code>init.el</code> file, but most
of the configuration in a more literal way, in an org <a href="https://github.com/yanivdll/.emacs.d/blob/master/config.org">config
file</a>.</p>
<p>When I make changes to Emacs settings, I need to reload the init file
activate the changes. So far, I typed <code>C-x C-f</code> to find the init file
and then <code>M-x [RET] eval-buffer</code> to reload it. Repeating this flow
hundreds of times became annoying.</p>
<p>A quick inquery <a href="http://prodissues.com/2015/11/leap-into-the-past-irc.html">in IRC</a>, and now
I know that I can call <code>load-file</code> and give it the name of the file I
would like to load. Having a function to load a file, means that I can
wrap it with my own function, and reload my init file with a customized
keybind.</p>
<p>And with the help of <a href="http://stackoverflow.com/a/12558095/1424287">this
answer</a> at stack-overflow,
I came up with the following shortcut to reload my Emacs configuration:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nv">global-set-key</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">"<f6>"</span><span class="p">)</span> <span class="p">(</span><span class="k">lambda</span><span class="p">()</span> <span class="p">(</span><span class="nv">interactive</span><span class="p">)(</span><span class="nv">load-file</span> <span class="s">"~/.emacs.d/init.el"</span><span class="p">)))</span>
</pre></div>
<h2>New line bellow</h2>
<p>I wondered if there's a command to creat a new line bellow the line my
point is on. Here's what I found in
<a href="http://superuser.com/a/331661/525565">superuser</a>:</p>
<p><code>C-e C-m</code> - go to the end of the line, create a new line and move the
point to that line.</p>
<p>or</p>
<p><code>C-e C-j</code> - same as the command above, only that the point will indent
if neccessery.</p>
<p>There is also a keybind for creating a new line above the current line,
and move the point to that line - <code>C-a C-o</code>.</p>
<h2>Quick Open a specific file</h2>
<p>Now days I start most of my writing in my <a href="http://prodissues.com/posts_drafts/">draft
file</a>. I need a quick way to access
this file, whether I'm in Emacs or any other application. I know Emacs
has the concept of registers, which are special memory slots, that can
be accessed with a command. Those registers can store any type of data,
such as strings, integers, files and paths.</p>
<p>It's time to learn how to work with them. When thinking about it, there
are other files that I would have liked to access quicker, such as the
<a href="https://github.com/yanivdll/.emacs.d/blob/master/init.el">init.el</a> or
<a href="https://github.com/yanivdll/.emacs.d/blob/master/config.org">config.org</a>.</p>
<p>Google's first search result was EmacsWiki. Again, it proved to be a
great source of information, had I wanted to confuse myself. So I
passed. The second result was from <a href="https://www.gnu.org/software/emacs/manual/html_node/emacs/File-Registers.html#File-Registers">Emacs
tutorial</a>,
which again proved to be clear, concise and informative.</p>
<p>Here are the commands for storing a filename in and loading it from a
register:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nv">set-register</span> <span class="nv">r</span> <span class="o">'</span><span class="p">(</span><span class="nv">file</span> <span class="o">.</span> <span class="nv">name</span><span class="p">))</span>
</pre></div>
<p>For example,</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nv">set-register</span> <span class="nv">?r</span> <span class="o">'</span><span class="p">(</span><span class="nv">file</span> <span class="o">.</span> <span class="s">"~/Dropbox/Notes/posts/pages/posts_drafts.org"</span><span class="p">))</span>
</pre></div>
<p>To load this file, I should type <code>C-x r j r</code></p>
<p>In the code examples above, <code>r</code> is the name of the register. It can be
replaced with any character.</p>
<p>And to see what's stored in a specific register:</p>
<div class="highlight"><pre><span></span><span class="nv">M-x</span> <span class="nv">view-register</span> <span class="nv">RET</span> <span class="nv">r</span>
</pre></div>
<p>Again, <code>r</code> is the register I'm querying.</p>
<h2>Change cases</h2>
<p><code>M-l</code> Convert following word to lower case (downcase-word).</p>
<p><code>M-u</code> Convert following word to upper case (upcase-word).</p>
<p><code>M-c</code> Capitalize the following word (capitalize-word).</p>
<p><code>C-x C-l</code> Convert region to lower case (downcase-region).</p>
<p><code>C-x C-u</code> Convert region to upper case (upcase-region).</p>Changing the default font in Emacs2015-11-30T05:00:00-05:002015-11-30T05:00:00-05:00yanivtag:prodissues.com,2015-11-30:/2015/11/changing-the-default-font-in-emacs.html<p>Josh Stella wrote a <a href="https://blog.fugue.co/2015-11-11-guide-to-emacs.html">delightful
post</a> about how he
uses Emacs, not necessarily for development work. I found quite a few
configuration tips, and already implemented few of them. One of those
tweaks is using the Input font family. Visiting
<a href="http://input.fontbureau.com/">fontbureau</a> made me want this font too!</p>
<p>I thought it …</p><p>Josh Stella wrote a <a href="https://blog.fugue.co/2015-11-11-guide-to-emacs.html">delightful
post</a> about how he
uses Emacs, not necessarily for development work. I found quite a few
configuration tips, and already implemented few of them. One of those
tweaks is using the Input font family. Visiting
<a href="http://input.fontbureau.com/">fontbureau</a> made me want this font too!</p>
<p>I thought it will be as simple as <code>copy-paste</code> (I'm still not used to
the appropriate <code>kill-yank</code> terminology) Josh's configuration. It wasn't
- after reloading my init, the font didn't pick up.</p>
<p>Few experimentations later, though, and it <em>did</em> work. First, I had to
download and install the font in my mac, dahhh... Then, I had to modify
the name of the font (Josh used <code>InputSerif</code>; I had to change it to
<code>Input</code>). Here's my configuration:</p>
<div class="highlight"><pre><span></span><span class="c1">;; set up fonts for different OSes. OSX toggles to full screen.</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">myfont</span> <span class="s">"Input"</span><span class="p">)</span>
<span class="p">(</span><span class="nb">cond</span>
<span class="p">((</span><span class="nb">string-equal</span> <span class="nv">system-name</span> <span class="s">"ygilad.local"</span><span class="p">)</span>
<span class="p">(</span><span class="nv">set-face-attribute</span> <span class="ss">'default</span> <span class="no">nil</span> <span class="ss">:font</span> <span class="nv">myfont</span> <span class="ss">:height</span> <span class="mi">144</span><span class="p">)</span>
<span class="p">(</span><span class="nv">toggle-frame-fullscreen</span><span class="p">)))</span>
</pre></div>
<p>Indeed, it looks beautiful. Here's a screen grab of this post in Input:
<img alt="emacs_with_input_font.png" src="http://media.prodissues.com/images/2015/11/emacs_with_input_font.png"></p>
<p>There's still one problem - this modification to my config broke the
org-reader plugin, and I can't export my org files to Pelican. Sadly,
I'll have to resort to the default font (Menlo), until I figure out a
fix.</p>Leap Into The Past - IRC2015-11-29T16:42:00-05:002015-11-29T16:42:00-05:00yanivtag:prodissues.com,2015-11-29:/2015/11/leap-into-the-past-irc.html<p>So <a href="https://www.whitehouse.gov/blog/2015/10/21/email-michael-j-fox-today-were-future">we're living in the
future</a>,
yet I'm traversing the past. It started with this blog, when I decided
to build it from scratch rather than using one of the modern blogging
platforms, such as Wordpress and tumblr. Not only that, but I also
insisted on writing it in pure …</p><p>So <a href="https://www.whitehouse.gov/blog/2015/10/21/email-michael-j-fox-today-were-future">we're living in the
future</a>,
yet I'm traversing the past. It started with this blog, when I decided
to build it from scratch rather than using one of the modern blogging
platforms, such as Wordpress and tumblr. Not only that, but I also
insisted on writing it in pure, static HTML. No real-time rendering, no
dynamic libraries, no Ajax nor server-side scripts. Just HTML, CSS and a
little of JavaScript.</p>
<p>Then, I <a href="http://prodissues.com/2015/06/why-i-decided-to-move-away-from-evernote.html">stopped using
Evernote</a>
and started to manage my life with plain text files. That transition
opened the door to a search for a new text editor. <em>New</em> is just a
figure of speech, because in the course of that search I fell under the
spells of Emacs and Vim, two of the oldest pieces of software out there.</p>
<p>And now, I'm taking another step into the past, to the Internet's cave
era. Instead of embracing Twitter or Reddit (although Reddit <em>do</em> start
to win me over), I resorted to... <a href="http://www.irc.org/">IRC</a>.</p>
<p>I won't get into <em>why</em> I've started to use IRC, or <em>what</em> I find in it
that I don't in modern social networks; I'll do it in a different post.
I'll just note that I'm starting a new journey, a journey of learning. I
have no idea how to navigate and use IRC, let alone how follow its
protocols (technical and communal). I'll have to
<a href="https://xkcd.com/293/">RTFM</a>...</p>
<p>But the journey I ought taking, is also what attracts me to IRC and all
those archaic beasts. They come with manuals, and I, a simple user, has
to surrender my time and my mind to them, and learn. Read manuals upon
manuals, posts, email lists and discussion boards. Follow the rules of
communication, listen and learn how to interact before pressing to
transmit. Only then, after substantial amount of time, will I feel
comfortable using the basics of the said app/software. Years will pass
by before I will be able to take full advantage of it. It might not
happen during these life, though, so I must be a good servant for a
chance to see the light in the after life.</p>
<p>Yeah, there is something magical, almost religious, with those apps,
their communities and the philosophies behind them. There is something
special in learning, and committing to them. If not the efficiency gain,
then at least the resistance to the modern world that do anything to
<a href="http://www.theatlantic.com/magazine/archive/2008/07/is-google-making-us-stupid/306868/">dummify my mind for
attention</a>.</p>
<p>But I've drifted too far already. I suspect the imminent next step will
be to move this site to a
<a href="http://firstarkansasnews.net/2013/06/no-the-bbs-is-not-extinct/">BBS</a>...</p>Developer for a day2015-11-19T05:00:00-05:002015-11-19T05:00:00-05:00yanivtag:prodissues.com,2015-11-19:/2015/11/developer-for-a-day.html<p>Earlier today I demoed a simple search page that I developed as part of
a 24 hour hackathon here at Outbrain. What makes this search page unique
is that it uses the Sphere platform <sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup> to find
content that isn't only relevant to the search query, but also caters to …</p><p>Earlier today I demoed a simple search page that I developed as part of
a 24 hour hackathon here at Outbrain. What makes this search page unique
is that it uses the Sphere platform <sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup> to find
content that isn't only relevant to the search query, but also caters to
the user's interests. So, for example, if I search for "python", I'll
get articles about python, the programming language. If my mom, on the
other hand, do the same search, she'll get articles <a href="http://www.cnn.com/videos/us/2015/11/10/alligator-python-photo-florida-dnt-wftx.wftx">like this
one</a>.</p>
<p>But <em>what</em> I developed isn't the subject of this article (I might write
about it in a separate post). What I <em>do</em> want to share is my experience
at putting a developer hat for a day. As a product manager, who works
very closely with engineers, this turned out to be an invaluable lesson.</p>
<p>I had no intention of building anything in that hackathon. My plan was
to help and support the hacking teams<sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>. A
few minutes after the hackathon began, though, I thought it will be cool
to build this search page. Unfortunately, at that point there were no
developers around to whom I could pitch my idea. All of them were
already assigned to other teams. But I got this impulse to build
something, so I decided to challenge my lack of development skills, and
form a team of one.</p>
<p>Well, saying that I'm not a developer isn't entirely true. After-all, I
graduated as a software engineer, I understand technology, I can speak
intelligently about software architecture and design patterns, and I was
intimately involved in designing and building the Sphere platform. I
even do some coding in my spare time<sup id="fnref-3"><a class="footnote-ref" href="#fn-3">3</a></sup>. But,
I've never coded with a mission or under a strict deadline. So I
thought, this would be an opportunity to get serious about coding.
Indeed, serious I became, spending the next 24 hours (minus 6 hours of
sleep) hacking my way toward something I'll be proud to present.</p>
<p>Here's how my next 24 hours have looked like:</p>
<p><strong>10:20am</strong> - 20 minutes into the hackathon I'm having this idea, and
yada yada yada I decide to code.</p>
<p><strong>10:40am</strong> - I can see what the architecture of the solution should
look like, and what APIs I'll have to use. It's going to be easier than
I thought...</p>
<p><strong>11:30am</strong> - Hitting a dead-end. My initial approach won't work,
because I don't have access, from the environment I'm using, to the API
I rely on. Need to think of a new direction.</p>
<p><strong>12:00pm</strong> - Found a new direction. I'm not sure it's the right one,
and I'll have to learn a framework that I didn't use before (well, I
didn't use <em>any</em> framework before...), but I'm running out of options,
so I'm taking the chance. I find a tutorial, and hope to learn
everything I need to know before the hackathon is over.</p>
<p><strong>1:30pm</strong> - Urr... this is the longest tutorial ever, and it's not even
related to the use-case I'm trying to solve.</p>
<p><strong>2:15pm</strong> - OK, good news and bad news. The good - I finally finished
the tutorial. The bad - I still don't have a clue how to work with this
framework to build what I have in mind.</p>
<p><strong>3:00pm</strong> - 5 hours have passed, and I still have nothing. What's worse
- people around me have high expectations of me. I have no idea why, but
I know I'm going to disappoint them. I'm loosing my patience, and even
the quietest chatter in the room distracts me. I'm agitated, and my fuse
shortens by the minute. I hope no one will talk to me. I need silence.
Maybe I should put headphones on, or go to a secluded room...</p>
<p><strong>4:10pm</strong> - Half a day went by, and I'm farther away from my initial
idea than I was 6 hours ago. Maybe some coffee and fresh air will help
me regain energy and spirit.</p>
<p><strong>4:20</strong> - I don't know if it's the coffee or the time off the computer,
but I'm thinking more clearly now. In fact, I have an idea. I need to
run back to the office.</p>
<p><strong>5:30pm</strong> - I have a working solution! It looks awful, but works....
all I have to do now is take care of the front-end. Easy breezy.</p>
<p><strong>9:15pm</strong> - <strong>I hate CSS</strong>. I'm about to loose my mind. I must eat.</p>
<p><strong>10:00pm</strong> - I need to have <em>some</em> sleep. I'm sure things will look
easier tomorrow.</p>
<p><strong>8:10am</strong> - CSS is still CSS.</p>
<p><strong>9:55am</strong> - 5 minutes to my demo. With some help, hand-holding and a
lot of duct-tape my work is somewhat presentable. I hope people see the
potential, and won't get caught-up with the UI.</p>
<p><strong>10:10am</strong> - I've just presented my thing. <strong>I feel awesome</strong>. I built
something and got people's applause.</p>
<p>Now, what did I learn from this schizophrenic experience:</p>
<h2>I don't want to be a developer.</h2>
<p>Yeah, as simple as that. I'll keep doing it as a hobby, but I'll never
do it professionally. I mean, I love the problem solving, and creating
something with my own hands is amazing. But, getting sucked into the
smallest of details, spending hours trying to figure out what I did
wrong, only to find a missing <code>;</code>, and wasting tons of time on
configuration before I can do <em>anything</em>, make me go nuts...</p>
<p>OK, so as this door is now closed, what did I learn about coding that
will help me understand engineers better?</p>
<h2>Coding requires focus</h2>
<p>Soooo much of it. Even the slightest distraction can throw your thought
process miles away. It then takes a lot of time to regain your thoughts,
and get back to where you were before. I now understand even better
Joel's <a href="http://www.joelonsoftware.com/articles/fog0000000022.html">"Human Task Switches Considered
Harmful"</a>
post.</p>
<h2>Tools are important</h2>
<p>Don't ask why, but I've started to learn
<a href="https://www.gnu.org/software/emacs/">Emacs</a> recently, and so far I love
it. But, Emacs isn't the most dummy proof app out there. Here's a funny
chart, that actually stops being that funny when you start learning
Emacs:</p>
<p><img alt="3251176498_c3485a55fb.jpg" src="http://media.prodissues.com/images/2015/11/3251176498_c3485a55fb.jpg"></p>
<p>So, since I'm somewhere at the bottom of the learning curve still, I
thought this hackathon would be an opportunity to learn the tool better
and faster. But as soon as time started to press on me, and at the first
instance when I didn't know how to do something in Emacs that was
trivial in other tools, I closed it and opened the other tools I feel
comfortable with (<a href="https://www.sublimetext.com/">Sublime</a> and
<a href="https://coderunnerapp.com/">CodeRunner</a>).</p>
<h2>Knowing what's the expected outcome is key</h2>
<p>Having a clear idea of what my end product should do, and to some extent
- how it should look like, was crucial. I had so much to learn in a very
short time, but knowing what my end goal was kept me focused. It also
helped me stay on course and learn only what was relevant to getting my
project done (otherwise I have the tendency to drift away quickly).</p>
<p>And lastly, I experienced first hand how deadlines and quality [don't]
play [well] together:</p>
<h2>Code becomes crappier as deadline approaches</h2>
<p>You might think that my experience isn't a good enough example, and I
might agree. I'm just saying that now I can better relate to this
<a href="https://twitter.com/hashtag/NOdeadlines?src=hash">#NoDeadlines</a> trend.</p>
<p>If you're involved, at any capacity, in product development, you already
know this lesson, because crappy code keeps bouncing back at you and
eats the time and resources you need in order to build new stuff. Don't
be fooled by fancy terms, such as "tech-debt" and "refactoring" - these
are politically correct ways to refer to crappy code. And the stricter
the deadlines, the more of it you'll get<sup id="fnref-4"><a class="footnote-ref" href="#fn-4">4</a></sup>.</p>
<p>So with that, I'll put my developer hat down. It's too big for me...</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>Check out the platform <a href="http://developers.sphere.com/#/">here</a>, and
leave a comment if you're interested to learn more. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>There were 19 internal and external teams hacking. <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn-3">
<p>In case you're interested, here's <a href="https://github.com/yanivdll">my GitHub
account</a>. <a class="footnote-backref" href="#fnref-3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn-4">
<p>No, it doesn't mean I won't ask for time-lines and set deadlines in the
future... <a class="footnote-backref" href="#fnref-4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Adding a Commenting System2015-11-13T05:00:00-05:002015-11-13T05:00:00-05:00yanivtag:prodissues.com,2015-11-13:/2015/11/adding-a-commenting-system.html<p>I decided to add comments to this blog. Initially, I didn't want
comments, because I didn't see their value, and thought of them mainly
as spam. Now I know, though, that the real reason was an anxiety from
having other people commenting on my writing. But as I started to …</p><p>I decided to add comments to this blog. Initially, I didn't want
comments, because I didn't see their value, and thought of them mainly
as spam. Now I know, though, that the real reason was an anxiety from
having other people commenting on my writing. But as I started to post
more frequently, and share my learning and experiences, an urge to hear
other people thoughts and opinions emerged. I know I'm making a lot of
mistakes along the way. Letting other <sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup> to
comment and point to those mistakes seems like a good way to improve.</p>
<p>And so, I begun to search for a commenting system.</p>
<p>My first option was disqus. Why? first, because it's synonymous to
comments. Second, because
<a href="http://docs.getpelican.com/en/latest/">Pelican</a>, which generates this
site, supports it by default. I created an account with disqus, but
changed my mind just before implementing their widget. I was always
reluctant to install 3rd party services in my site, and having to
disable "cookie targeting" and "merchant code" related settings, when
configuring the commenting widget, didn't help.</p>
<p>Therefore, I started to look for a less obvious solution. Googling
"pelican comments" and "static site comment system" reeled few options:</p>
<ul>
<li><a href="https://github.com/getpelican/pelican-plugins/tree/master/pelican_comment_system">Pelican comment
plugin</a></li>
<li><a href="http://tildehash.com/?page=hashover">Hashover</a></li>
<li><a href="https://posativ.org/isso/">ISSO</a></li>
</ul>
<p>After doing some research, I decided that those plugins won't work for
me. To explain why, I should mention that my site is static. It means
that it includes nothing but simple HTML pages, and static files like
images and css. Those pages live in a dumb Amazon-S3 storage, and are
served "as is". There are no dynamic elemnts, such as database, involved
in generating and serving them.</p>
<p>In order to enable comments, though, there must be a dynamic component
somewhere in the flow. This component should intercept new comments,
store them in a database or files, and tie them together with the
relevant post. So, if I don't want to use a cloud service, like disqus,
I should either add logic to my hosting server, or become that logic
myself.</p>
<p>Since, as I mentioned, S3 is nothing but storage, I have no way to run
server-side scripts on it. Nor do I want to, since it will dilute the
whole concept of static website... That took Hashover and ISSO off the
table, because both require server-side PHP scripts.</p>
<p>I then tried the pelican comment plugin. Installation was quick and
smooth, but eventually, like the other options, this plugin didn't work
for me either. Well, not that it didn't work, just that I had to work
for it.</p>
<p>Unlike the other plugins, this one requires no back-end service. It's
truly static. But as I mentioned, there must be a dynamic component
<em>somewhere</em>. In this case, this component was me. With this plugin,
comments are sent over email. I had to save each email as a file in a
specific folder and give it a specific name. I then had to render the
site and push it to S3. I had to repeat this process for every new
comments. I don't expect many comments, but still, this doesn't look
like a scalable or sustainable solution.</p>
<p>And so, disappointed of my failure to find an alternative, I went back
to the first option. In less than 5 minutes I got a disqus commenting
widget live on my article pages. I'm still uncomfortable having that 3rd
party component hosted in my site, but I will keep it until I find a
better solution.</p>
<p>Leave a comment if you know of any alternatives I should take a look
at...</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>Not that I think anyone reads this blog, except for my wife when I ask
her to proof read something, or friend whom I force into reading an
article here and then. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Copy Git Changes to a New Branch2015-11-12T05:00:00-05:002015-11-12T05:00:00-05:00yanivtag:prodissues.com,2015-11-12:/2015/11/copy-git-changes-to-a-new-branch.html<p>I'm still not fluent with git and version control. I manage repositories
for projects I'm working on, but sill have hard time managing my
changes, commits and branches.</p>
<p>For example, I'm currently working on integrating Emacs's org-mode
support to Pelican, a static web-page generator I use for this blog. I …</p><p>I'm still not fluent with git and version control. I manage repositories
for projects I'm working on, but sill have hard time managing my
changes, commits and branches.</p>
<p>For example, I'm currently working on integrating Emacs's org-mode
support to Pelican, a static web-page generator I use for this blog. I
was proud of myself for remembering to create a new branch when starting
the work. Somewhere in the middle of the integration, I drift away, and
started to explore a new idea - adding a commenting system to the site.
Before I knew it I was already working on it. Unfortunately, not only
that I didn't work on that feature in a dedicated branch, I was still on
the branch I created for the org integration.</p>
<p>I wondered if there is a way to take the changes I made since the last
commit, and pour them over into a new branch. Luckily, there is. Here's
how, thank to <a href="http://stackoverflow.com/a/4746696/1424287">this answer in
stack-overflow</a>:</p>
<blockquote>
<p>You can simply check out a new branch, and then commit:</p>
</blockquote>
<div class="highlight"><pre><span></span>git checkout -b my_new_branch
git commit
</pre></div>
<blockquote>
<p>Checking out the new branch will not discard your changes.</p>
</blockquote>
<p>Tried it and it worked.</p>Swapping Buffers in Emacs2015-11-08T03:39:00-05:002015-11-08T03:39:00-05:00yanivtag:prodissues.com,2015-11-08:/2015/11/swapping-buffers-in-emacs.html<p>It took me awhile to find a way to swap the position of two buffers in
emacs. Yes, there is a description in <a href="http://www.emacswiki.org/emacs/SwitchingBuffers">emacs
wiki</a>, and the code
bellow is actually taken from there, but it's not that easy to find
through the tons of irrelevant information around it.</p>
<p>So …</p><p>It took me awhile to find a way to swap the position of two buffers in
emacs. Yes, there is a description in <a href="http://www.emacswiki.org/emacs/SwitchingBuffers">emacs
wiki</a>, and the code
bellow is actually taken from there, but it's not that easy to find
through the tons of irrelevant information around it.</p>
<p>So if you're looking to simply get the right buffer show on the right,
and vice versa, here's what you should add to your init file:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nb">defun</span> <span class="nv">transpose-buffers</span> <span class="p">(</span><span class="nv">arg</span><span class="p">)</span>
<span class="s">"Transpose the buffers shown in two windows."</span>
<span class="p">(</span><span class="nv">interactive</span> <span class="s">"p"</span><span class="p">)</span>
<span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">selector</span> <span class="p">(</span><span class="k">if</span> <span class="p">(</span><span class="nb">>=</span> <span class="nv">arg</span> <span class="mi">0</span><span class="p">)</span> <span class="ss">'next-window</span> <span class="ss">'previous-window</span><span class="p">)))</span>
<span class="p">(</span><span class="k">let</span> <span class="p">((</span><span class="nv">this-win</span> <span class="p">(</span><span class="nv">window-buffer</span><span class="p">))</span>
<span class="p">(</span><span class="nv">next-win</span> <span class="p">(</span><span class="nv">window-buffer</span> <span class="p">(</span><span class="nb">funcall</span> <span class="nv">selector</span><span class="p">))))</span>
<span class="p">(</span><span class="nv">set-window-buffer</span> <span class="p">(</span><span class="nv">selected-window</span><span class="p">)</span> <span class="nv">next-win</span><span class="p">)</span>
<span class="p">(</span><span class="nv">set-window-buffer</span> <span class="p">(</span><span class="nb">funcall</span> <span class="nv">selector</span><span class="p">)</span> <span class="nv">this-win</span><span class="p">)</span>
<span class="p">(</span><span class="nv">select-window</span> <span class="p">(</span><span class="nb">funcall</span> <span class="nv">selector</span><span class="p">)))</span>
<span class="p">(</span><span class="k">setq</span> <span class="nv">arg</span> <span class="p">(</span><span class="k">if</span> <span class="p">(</span><span class="nb">plusp</span> <span class="nv">arg</span><span class="p">)</span> <span class="p">(</span><span class="nb">1-</span> <span class="nv">arg</span><span class="p">)</span> <span class="p">(</span><span class="nb">1+</span> <span class="nv">arg</span><span class="p">))))))</span>
</pre></div>
<p>I have no idea what this code means <sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>, but it
does what I expected it to do. I also didn't create a keybinding for it,
but you can if you would like to. Here's how to bind it to, say, <code>f8</code>:</p>
<div class="highlight"><pre><span></span><span class="p">(</span><span class="nv">global-set-key</span> <span class="nv">[f8]</span> <span class="ss">'transpose-buffers</span><span class="p">)</span>
</pre></div>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>Learning elisp is on my todo list… <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>On Touch Typing and Failure2015-10-12T02:25:00-04:002015-10-12T02:25:00-04:00yanivtag:prodissues.com,2015-10-12:/2015/10/on-touch-typing-and-failure.html<p>I've started to learn touch typing. It's embarrassing to admit that I
still haven't learned it, given the amount of time I spend on a keyboard
everyday. But it's better to do it later than never.</p>
<p>My goals in doing so are 1) to become more efficient and proficient with …</p><p>I've started to learn touch typing. It's embarrassing to admit that I
still haven't learned it, given the amount of time I spend on a keyboard
everyday. But it's better to do it later than never.</p>
<p>My goals in doing so are 1) to become more efficient and proficient with
my writing and 2) to reduce friction in my thought process. I want to be
able to capture thoughts as soon and as they appear, and as accurately
as possible.</p>
<p>I use an app, called <a href="https://itunes.apple.com/us/app/typist/id415166115?mt=12">typist</a>, to
walk me through the process, and monitor the two main KPIs that infer
progress: accuracy (or error ratio) and words per minute (wpm).</p>
<p>Initially, everything went smoothly. I advanced quickly through the
exercises, and felt I'm doing well. I thought it will take no time
before I master the new skill. But then, this encouraging trend
withered. My improvement stagnated, plateaued, and turned backward.
Soon, I typed worst than I did before starting the exercises.</p>
<p>Not knowing how this can happen, I decided to sacrifice speed, and focus
instead on accuracy. Once I type fluently, I thought, it will be easier
to pick up speed. That didn't work, though. I spent hours trying to type
the same paragraph over and over again, as slow as possible, but I just
couldn't complete the task without making any mistake.</p>
<blockquote>
<p>"...it be came clear that it was not only pointless to continue these
exercises but positively dangerous, since I was oppressed more and
more by a premonition of failure..." <em>Zen in the Art of Archery, Eugen
Herrigel</em></p>
</blockquote>
<p>My conscious attempts to avoid mistakes actually also contributed to
them. It was as if I had knew a mistake is imminent, and thus imminent
it became.</p>
<p>I'm still learning, and fighting my anticipation of mistypings. But I
<em>did</em> modify my strategy, aiming at crossing this chasm. Instead of
focusing on an entire paragraph, I'm now trying to concentrate on only
one word at a time, absorb this word, touch type it, return my fingers
to the home row, move my attention to the next word, and repeat. This
new routine improved my accuracy, and more importantly, redressed the
anxious wait for a mistake to happen.</p>
<p>This pattern isn't new to me. I experienced it many times before, when
acquiring various new skills. It's the accumulation of new knowledge
that uncover subtleties I wasn't aware of before. Learning english was,
and still is, one such experience. The more I learn, read and
communicate, the more aware I become to the mistakes I make.</p>
<blockquote>
<p>"Among swordmasters, on the basis of their own and their pupils'
experience, it is taken as proved that the beginner, however strong
and pugnacious he is, and however courageous and fearless he may be at
the outset, loses not only his lack of self−consciousness, but his
self−confidence, as soon as he starts taking lessons. He gets to know
all the technical possibilities by which his life may be endangered in
combat...", <em>Daisetz Teitaro Suzuki</em></p>
</blockquote>
<p>As frustrating as this progress is, I keep reminding myself that those
mistakes are signs of improvement and progress. He who does not fail,
nor makes mistakes, will not get anywhere.</p>On KPIs and Building Blocks2015-10-06T05:00:00-04:002015-10-06T05:00:00-04:00yanivtag:prodissues.com,2015-10-06:/2015/10/on-kpis-and-building-blocks.html<p>Few days ago I presented our product vision and roadmap to our R&D
group. At the end of my presentation I was asked what gives me
confidence that we build the right stuff. I didn't think too much, and
answered that our vision and product roadmap define the <em>what …</em></p><p>Few days ago I presented our product vision and roadmap to our R&D
group. At the end of my presentation I was asked what gives me
confidence that we build the right stuff. I didn't think too much, and
answered that our vision and product roadmap define the <em>what</em>. Knowing
our partners and users, I added, and listening to their feedback,
problems, and goals help us plan the <em>when</em>. That's a typical product
guy's answer, yet it's not a satisfactory one.</p>
<p>The truth is that vision and users' feedback alone don't ensure
fail-proof products, and you shouldn't rely on them for that. In fact,
much of what you build <em>will</em> fail. The trick isn't to make perfect
predictions, but to take small risks with possible high return. To that
end you should obsess yourself over KPIs and building blocks.</p>
<p>Good KPIs are numeric representation of a vision, and therefore serve as
your lighthouse. Build something that advances you toward your vision,
and your KPIs will encourage you to scale and keep investing in it. If a
feature you built, on the other hand, takes you off-course, your KPIs
will signal that you should cut your loses short and kill it
immediately.</p>
<p>Building blocks means developing stuff that can be reused. This is
crucial if you want to minimize risk while moving fast and experimenting
with many new features. You can move fast because when you have enough
blocks in your arsenal, introducing new features becomes mere
integration of existing components, like playing LEGO. The faster you
move, the lower your risk is. This is true not only because you have to
invest less time and resources in each features, but also because you
incur less sunk costs. Say a new feature doesn't improve your KPIs, you
don't throw it all away. You can remove the feature while keeping its
components for later use. Your failure becomes a future investment. On
the upside, if a new feature turns out to be successful, you can scale
it immediately, since it's reusable.</p>
<p>Use KPIs to make sure you're going in the right direction towards your
vision. Insist on developing building blocks and you'll get there at the
fastest and most efficient way.</p>Combine Multiple PDF Files Into One2015-09-28T04:00:00-04:002015-09-28T04:00:00-04:00yanivtag:prodissues.com,2015-09-28:/2015/09/combine-multiple-pdf-files-into-one.html<p>I often have to send pdf documents via email. When I do, I prefer to
send one document that merges all those pdfs. Form a recipient
point-of-view, I find it better to receive one attachment, because it's
easier to manage and to keep track of. The problem is that I've …</p><p>I often have to send pdf documents via email. When I do, I prefer to
send one document that merges all those pdfs. Form a recipient
point-of-view, I find it better to receive one attachment, because it's
easier to manage and to keep track of. The problem is that I've yet to
find an easy way to stitch together multiple pdf files. Preview suppose
to let you do it, but I usually can't get it to work, and when I do, the
process is painful<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>.</p>
<p>Recently, I came up with way to do just that, thanks to a python script
I found in the <a href="https://automatetheboringstuff.com/chapter13/">"Automate the Boring Stuff with
Python"</a> book. This
script takes a folder of documents as an input, search for all the pdf
files in that folder, and combine them into one pdf file.</p>
<p>However, I had to modify this script to fit my workflow better. My pdf
files are all over the place, and I don't want to move them around just
for the sake of merging them together. I therefore made a little
tinkering to the original script, so it can take a list of files' paths
as an input. Here's my modified version:</p>
<div class="highlight"><pre><span></span><span class="ch">#! /usr/local/bin/python3</span>
<span class="c1"># combinePdfsFromFiles.py - </span>
<span class="c1"># Script gets a list of pdf files' paths and combine them into one file</span>
<span class="c1"># I use it together with keyboard maestro</span>
<span class="kn">import</span> <span class="nn">PyPDF2</span>
<span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="kn">import</span> <span class="nn">pyperclip</span>
<span class="n">pdfFiles</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># Get PDF filenames from the clipboard</span>
<span class="k">for</span> <span class="n">filename</span> <span class="ow">in</span> <span class="n">pyperclip</span><span class="o">.</span><span class="n">paste</span><span class="p">()</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">','</span><span class="p">):</span>
<span class="k">if</span> <span class="n">filename</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'.pdf'</span><span class="p">)</span> <span class="ow">and</span> <span class="n">filename</span> <span class="o">!=</span> <span class="s1">''</span><span class="p">:</span>
<span class="n">pdfFiles</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="n">pdfFiles</span><span class="o">.</span><span class="n">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="nb">str</span><span class="o">.</span><span class="n">lower</span><span class="p">)</span>
<span class="n">pdfWriter</span> <span class="o">=</span> <span class="n">PyPDF2</span><span class="o">.</span><span class="n">PdfFileWriter</span><span class="p">()</span>
<span class="c1">#Loop through all the PDF files.</span>
<span class="k">for</span> <span class="n">filename</span> <span class="ow">in</span> <span class="n">pdfFiles</span><span class="p">:</span>
<span class="n">pdfFileObj</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s1">'rb'</span><span class="p">)</span>
<span class="n">pdfReader</span> <span class="o">=</span> <span class="n">PyPDF2</span><span class="o">.</span><span class="n">PdfFileReader</span><span class="p">(</span><span class="n">pdfFileObj</span><span class="p">)</span>
<span class="c1">#Loop through all the pages (except the first) and add them.</span>
<span class="c1"># If first page should be discarded, change firt param of range to 1</span>
<span class="k">for</span> <span class="n">pageNum</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">pdfReader</span><span class="o">.</span><span class="n">numPages</span><span class="p">):</span>
<span class="n">pageObj</span> <span class="o">=</span> <span class="n">pdfReader</span><span class="o">.</span><span class="n">getPage</span><span class="p">(</span><span class="n">pageNum</span><span class="p">)</span>
<span class="n">pdfWriter</span><span class="o">.</span><span class="n">addPage</span><span class="p">(</span><span class="n">pageObj</span><span class="p">)</span>
<span class="c1">#TODO: add an argument that determine whether cover should be included.</span>
<span class="c1">#Save the resulting PDF to a file.</span>
<span class="n">pdfOutput</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">'/Users/ygilad/Desktop/allminutes.pdf'</span><span class="p">,</span> <span class="s1">'wb'</span><span class="p">)</span>
<span class="n">pdfWriter</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">pdfOutput</span><span class="p">)</span>
<span class="n">pdfOutput</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</pre></div>
<p>I created a simple keyboard maestro macro that goes along with this
script and serves as an interface with it:</p>
<p><img alt="combine_pdfs_macro.jpg" src="http://media.prodissues.com/images/2015/09/combine_pdfs_macro.jpg"></p>
<p>Now, All I have to do is select in Finder the files I want to stitch:</p>
<p><img alt="stich_pdf_-_select_files.png" src="http://media.prodissues.com/images/2015/09/stich_pdf_-_select_files.png"></p>
<p>I can then execute the KM macro, which pass the list of files to the
python script for processing.</p>
<p>I know this process might sound tedious, and even more painful than
using Preview for that job. But that's the beauty of automation - you
pay once use freely ever after.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>To get it done with Preview, you'll have to open each of the pdfs,
expose the thumbnails' sidebar, and start dragging and dropping the
pages you would like to combine. If you're still interested,
<a href="https://support.apple.com/en-us/HT202945">here's</a> Apple's support
guide. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>A Recipe To Work-In-Progress Documents2015-09-12T01:58:00-04:002015-09-12T01:58:00-04:00yanivtag:prodissues.com,2015-09-12:/2015/09/a-recipe-to-work-in-progress-documents.html<p>I recently <a href="http://prodissues.com/2015/06/why-i-decided-to-move-away-from-evernote.html">stopped using
Evernote</a>
and started to manage my notes exclusively in Dropbox. My configuration
revolves around a <code>Notes</code> folder. I use
<a href="http://brettterpstra.com/projects/nvalt/">nvAlt</a> to browse through the
notes in that folder and add new ones. If I want to do more than just a
scribble, I use the <code>command-e …</code></p><p>I recently <a href="http://prodissues.com/2015/06/why-i-decided-to-move-away-from-evernote.html">stopped using
Evernote</a>
and started to manage my notes exclusively in Dropbox. My configuration
revolves around a <code>Notes</code> folder. I use
<a href="http://brettterpstra.com/projects/nvalt/">nvAlt</a> to browse through the
notes in that folder and add new ones. If I want to do more than just a
scribble, I use the <code>command-e</code> key binding in nvAlt to open the
document in <a href="http://multimarkdown.com/">MultiMarkdown Composer</a>.</p>
<p>Storing all my notes in one folder has a major limitation, though. As
notes accumulate, looking for a specific note becomes impossible. This
is actually one of the main reasons to my departure from Evernote. To
avoid this problem, I set <a href="http://www.noodlesoft.com/hazel.php">Hazel</a>
to monitor my <code>Notes</code> folder and move everything that wasn't modified in
the last 30 days to a designated archive folder. Archived notes don't
show in nvAlt, yet easily accessible through Finder.</p>
<p>Now that I have a home to my notes, I would like to add some logic to
streamline my writing workflow. To begin with, I would like to aggregate
documents I'm working on, and are in other folders, to my main notes'
repository.</p>
<p>For example, I'm currently writing a readme file for one of my git
repositories. This repo lives within its own folder, where the readme
file resides as well. Keeping this file out of my <code>Notes</code> folder means
that it's a hassle to go back and open it when needed. It also means
that I can't work on it when I'm on my iPhone ^<a href="#fn.1">1</a>{#fnr.1
.footref}^.</p>
<p>So, what I needed was a way to mark a document, and have it magically
show up in my <code>Notes</code> folder, hence available in nvAlt. Following is the
recipe I came up with to address this need.</p>
<p>Let's start with the ingredients:</p>
<ul>
<li>Finder</li>
<li>Hazel</li>
<li>Python</li>
</ul>
<p>And here's how to mix these components together:</p>
<ol>
<li>Open Finder and tag <code>wip</code> the document I want to work on and make
available in
nvAlt.<img alt="tag_wip.png" src="http://media.prodissues.com/images/2015/09/tag_wip.png"></li>
<li>Configure a Hazel rule that monitors my home folder, looking for
files containing the <code>wip</code> tag ^<a class="footref" href="#fn.2" id="fnr.2">2</a>^.
<img alt="hazel_3.png" src="http://media.prodissues.com/images/2015/09/hazel_3.png"></li>
<li>Create a python script that takes a file's path as an input and
place a symbolic link to it in my <code>Notes</code> folder.</li>
</ol>
<div class="highlight"><pre><span></span><span class="ch">#! /usr/local/bin/python3</span>
<span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">sys</span><span class="o">,</span> <span class="nn">shutil</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="c1"># Configuring logging to be written into a file in the system's log folder</span>
<span class="n">logging</span><span class="o">.</span><span class="n">disable</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">CRITICAL</span><span class="p">)</span>
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">filename</span><span class="o">=</span><span class="s1">'/Users/ygilad/Library/Logs/Python/myPythonLogs.log'</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s1">' </span><span class="si">%(asctime)s</span><span class="s1"> - </span><span class="si">%(levelname)s</span><span class="s1"> - </span><span class="si">%(message)s</span><span class="s1">'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">moveFileToNote</span><span class="p">(</span><span class="n">filePath</span><span class="p">):</span>
<span class="c1"># Set the link name to the original file.</span>
<span class="c1"># Path to the original file is included for two reasons</span>
<span class="c1"># 1) Avoid naming conflicts and</span>
<span class="c1"># 2) remind myself where this file came from</span>
<span class="n">fileName</span> <span class="o">=</span> <span class="s1">'link'</span> <span class="o">+</span> <span class="n">filePath</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">'/'</span><span class="p">,</span><span class="s1">'_'</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="n">logging</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'Filename: '</span> <span class="o">+</span> <span class="n">fileName</span><span class="p">)</span>
<span class="c1"># Make sure that the input is a file and not a folder</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">fileName</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Add the link to my central note repository</span>
<span class="n">os</span><span class="o">.</span><span class="n">symlink</span><span class="p">(</span><span class="n">filePath</span> <span class="p">,</span> <span class="s1">'/Users/ygilad/Dropbox/Notes/link-'</span><span class="o">+</span> <span class="n">fileName</span><span class="p">)</span>
<span class="n">logging</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'Created a file link'</span><span class="p">)</span>
<span class="k">except</span> <span class="n">FileExistsError</span><span class="p">:</span>
<span class="n">logging</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'File already exists at the target folder'</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">logging</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">'Input is not a file'</span><span class="p">)</span>
<span class="c1"># Accept the path coming from Hazel</span>
<span class="n">hazelLocalFile</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">logging</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">hazelLocalFile</span><span class="p">)</span>
<span class="c1"># The body of the script</span>
<span class="n">moveFileToNote</span><span class="p">(</span><span class="n">hazelLocalFile</span><span class="p">)</span>
</pre></div>
<p>There is one drawback I wasn't able to solve - nvAlt doesn't show the
content of the link. All it <em>does</em> show is the path of the original
document.<img alt="nvAlt_and_linked_files.png" src="http://media.prodissues.com/images/2015/09/nvAlt_and_linked_files.png"></p>
<p>While I can't edit the file directly in nvAlt, I can still do it in
MultiMarkdown Composer or
<a href="http://omz-software.com/editorial/">Editorial</a> on my iPhone.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>I keep git repositories in a local folder out of Dropbox reach, because
I heard that <a href="http://scripting.com/2014/01/24/githubAndDropboxDoNotPlayWellTogether.html">you shouldn't mix the two
together</a>. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>I found that creating a rule that monitors a folder and its sub-folders
is a bit tricky, but eventually learned how to do it thanks to <a href="http://www.noodlesoft.com/forums/viewtopic.php?f=4&t=470">this
post</a>. <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Find Repetitive Words Using Python2015-09-02T04:00:00-04:002015-09-02T04:00:00-04:00yanivtag:prodissues.com,2015-09-02:/2015/09/find-repetitive-words-using-python.html<p>Read this question from
<a href="http://stackoverflow.com/questions/2823016/regular-expression-for-consecutive-duplicate-words">stackoverflow</a>:</p>
<blockquote>
<p>Paris in the<br>
the spring. Not that<br>
that is related.</p>
<p>Why are you laughing? Are my my regular expressions THAT bad??</p>
</blockquote>
<p>Have you notice the repetitions? chances are you haven't. The eye sees
what the eye wants to see, and it'll take away any obstacle …</p><p>Read this question from
<a href="http://stackoverflow.com/questions/2823016/regular-expression-for-consecutive-duplicate-words">stackoverflow</a>:</p>
<blockquote>
<p>Paris in the<br>
the spring. Not that<br>
that is related.</p>
<p>Why are you laughing? Are my my regular expressions THAT bad??</p>
</blockquote>
<p>Have you notice the repetitions? chances are you haven't. The eye sees
what the eye wants to see, and it'll take away any obstacle to let your
brain comprehend. I too often catch myself writing the same word twice.
The problem is that when I do, it's usually too late. The email was sent
or post got published.</p>
<p>To make sure I find those repetitions in time, I wrote a simple Python
script that removes superfluous spaces and highlight words'
duplications, using <a href="http://criticmarkup.com/">CriticMarkup</a>. I run this
script as soon as I finish writing. It works much better than my eyes in
finding those elusive duplications.</p>
<p>Here's the script:</p>
<div class="highlight"><pre><span></span><span class="ch">#! /usr/local/bin/python3</span>
<span class="c1"># removeRepeatWords.py - find and remove repeat words</span>
<span class="kn">import</span> <span class="nn">logging</span>
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">filename</span><span class="o">=</span><span class="s1">'/Users/ygilad/Library/Logs/Python/myPythonLogs.log'</span><span class="p">,</span> <span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">,</span> <span class="n">format</span><span class="o">=</span><span class="s1">' </span><span class="si">%(asctime)s</span><span class="s1"> - </span><span class="si">%(levelname)s</span><span class="s1"> - </span><span class="si">%(message)s</span><span class="s1">'</span><span class="p">)</span>
<span class="n">logging</span><span class="o">.</span><span class="n">disable</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">CRITICAL</span><span class="p">)</span>
<span class="kn">import</span> <span class="nn">pyperclip</span><span class="o">,</span> <span class="nn">re</span>
<span class="n">text</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">pyperclip</span><span class="o">.</span><span class="n">paste</span><span class="p">())</span>
<span class="c1">#regex definitions for reapeated spaces</span>
<span class="n">repeatSpacesRegex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">'\b(\s)+\1+\b'</span><span class="p">)</span>
<span class="c1">#regex definitions for reapeated words</span>
<span class="n">repeatWordsRegex</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">'\b(\w+)\b[\s\r\n]*(\1[\s\r\n])+'</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">IGNORECASE</span><span class="o">|</span><span class="n">re</span><span class="o">.</span><span class="n">DOTALL</span><span class="p">)</span>
<span class="c1">#remove the extra spaces</span>
<span class="n">repeatSpces</span> <span class="o">=</span> <span class="n">repeatSpacesRegex</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">repeatSpces</span><span class="p">)</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">repeatSpacesRegex</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s1">'\1'</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">repeatSpces</span><span class="p">))</span> <span class="o">+</span> <span class="s1">' repeat spaces were removed.'</span><span class="p">)</span>
<span class="c1">#remove repeated words</span>
<span class="n">repeatWords</span> <span class="o">=</span> <span class="n">repeatWordsRegex</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
<span class="n">logging</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="n">repeatWords</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">repeatWords</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">repeatWordsRegex</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="sa">r</span><span class="s1">'{~~\1 \2~>\1 ~~}{>>repeating words<<}'</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span>
<span class="n">pyperclip</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</pre></div>
<p>To use it, copy the text you want to check into the clipboard. You then
run the script and its output will be ready for you back in the
clipboard. Just past it over the original text. Note that if the script
finds repetitions it won't remove them, but mark them using
CriticMarkup. If your editor supports CM, you can decide whether to
accept or reject those changes.</p>
<p>Running this script on the quote from stackoverflow above produces the
following output:</p>
<div class="highlight"><pre><span></span>Paris in <span class="o">{</span>~~the the ~>the~~<span class="o">}{</span>>>repeating words<<<span class="o">}</span>spring. Not <span class="o">{</span>~~that that ~>that~~<span class="o">}{</span>>>repeating words<<<span class="o">}</span>is related.
Why are you laughing? Are <span class="o">{</span>~~my my ~>my~~<span class="o">}{</span>>>repeating words<<<span class="o">}</span>regular expressions THAT bad??
</pre></div>On Collection and Vision2015-08-08T18:15:00-04:002015-08-08T18:15:00-04:00yanivtag:prodissues.com,2015-08-08:/2015/08/on-collection-and-vision.html<p>Marimekko is one of my favorite stores <sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>.
Whenever I go in there, I get filled with excitement
and urge to swallow the entire collection. I’m fascinated by the vibrant
colors and the unique, yet simple, patterns. I’m compelled by the layout
of the store and by the …</p><p>Marimekko is one of my favorite stores <sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>.
Whenever I go in there, I get filled with excitement
and urge to swallow the entire collection. I’m fascinated by the vibrant
colors and the unique, yet simple, patterns. I’m compelled by the layout
of the store and by the arrangement of the items. When I’m there, all
I’m thinking about is how to make my home a replica of that
store.</p>
<p><img alt="IMG_5090.jpg" src="http://media.prodissues.com/images/2015/09/IMG_5090.jpg">
</p>
<p>Unfortunately, I can't afford taking over Marimekko yet, and even if I
could, I don't know what would I do with hundreds of yards of beautiful
fabric <sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>. And so I have to limit my focus to only one, maybe couple, of items at a time. But when doing so, much of
the early excitement vanishes.</p>
<p>When looking at each of the items separately, they don't look as
compelling. A colorful serving plate loses its charm when I figure it
won't fit our current portfolio of dull white dinnerware. A
Puisto-osasto print bag looks great, only until I see it's a tote style
bag, which I would never dare to carry. A sofa pillow with colorful
flowers' print, which is Marimekko's signature, is stunning, yet won't
make it to our subtle, minimalist living room.</p>
<p>So beautiful as a whole, less so when zooming in. And so I usually leave
the store empty handed (sometimes with yet another espresso cup).</p>
<p>I use this metaphor occasionally when talking about the difference
between vision and the parts that make this vision a whole. I use it to
explain to my team why is it that an inspiring vision turns into a list
of less exciting projects: improving our api by exposing more resources'
types or adding attributes to existing ones, keeping high standards with
our internal tools, even if they don't add direct value to our users, or
designing and developing pixel perfect internal reporting dashboards.
These are efforts that don't always make sense if you look at them in
disjunction from the bigger picture, and see how they become part of a
comprehensive product in aggregate.</p>
<p>At other times I use it to give some perspective to a feature owner who
feels disappointed when the feature she just released didn't take the
Internet by storm. I explain that when building a platform, it's
unlikely that a single feature will "steal the show".</p>
<p>A vision, like the Marimekko store, excites and inspires only when
viewed in its entirety. When you dive into the details, the products and
features that comprise it, you might loose your initial enthusiasm.</p>
<p>If you're in a leadership position, remember that while you live and
breathe vision, your team is soaking in the details, and in the day to
day tedious work that is anything but exciting. Your challenge will be
to inspire them, and keep them inhaling the dream. Otherwise, your
team's morale and its motivation to follow your lead towards fulfilling
your vision will quickly evaporate. Thus, the collection you envision
will turn into an incoherent pile of items that look bad anyway from
near and far.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>I'm referring to Marimekko NYC Flagship Store.
<a href="https://www.google.com/maps/place/Marimekko+NYC+Flagship+Store/@40.7419618,-73.9896784,15z/data=!4m2!3m1!1s0x0:0xd61b0f9793581e4a?sa=X&ved=0CIYBEPwSMApqFQoTCLO4rOvNoccCFYOSHgod4SwCyg">Here's</a>
where it located. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>I <em>do</em> try to find uses for their fabric, often as a gift wrap for
special people in my life. <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Just Do It, But Start With a Small Step2015-07-13T07:41:00-04:002015-07-13T07:41:00-04:00yanivtag:prodissues.com,2015-07-13:/2015/07/just-do-it-but-start-with-a-small-step.html<p>If you're reading this sentence, it means that I proved my point without
even getting you through the rest of the</p>
<!-- more -->
<p>I've just got back from a run, which reminded me of a principle that is
etched in my mind and serves as one of my mottoes in life.</p>
<p>I …</p><p>If you're reading this sentence, it means that I proved my point without
even getting you through the rest of the</p>
<!-- more -->
<p>I've just got back from a run, which reminded me of a principle that is
etched in my mind and serves as one of my mottoes in life.</p>
<p>I didn't really want to go running today. I had an eventful weekend,
which included many miles of walking. I was tired and hungry and had a
presentation for a lecture I'm giving tomorrow to prepare. Many good
reasons to call it a day and give up on this one run. After all I run
3-4 times a week; skipping one day won't be the end of the world.</p>
<p>But then again, giving up on even one run is a slippery slope. You
resonate it once, and soon you find even better explanations for why you
shouldn't run the next time, and the one after. Before you know it,
you're not running anymore. So no, I wasn't willing to give up on this
one.</p>
<p>To overcome my weariness I set myself with a humble goal - put running
shoes on. I then pleaded myself to walk out the door and jog just for a
little. Any distance, I promised myself, will do. Even a mile or two
will be better than not running at all.</p>
<p>It worked. As soon as I took just a few steps the earlier fatigue
evaporated, and I started to feel invigorated; a feeling that strengthen
as I gulped more steps. After a mile or so I had no doubt I'll run my
regular 3 miles.</p>
<p>So far, nothing special. I'm used to that routine. Every time I have to
do something that requires attention and focus, like replying to a long
email, writing a new blog post, or do something that I'm not excited
about, such as taking the dishes out of the dish washer, I have to
deliberate and negotiate with that side of me that wants to rest and be
left alone. The most effective weapon I use to avoid procrastination is
taking the smallest possible step. Click the "reply" button, write the
first line of the potential post, or open the dish washer door. Chances
are this small step is enough to push me through the completion of the
task.</p>
<p>But today's run was special, in that it illustrated how powerful the
"small step" principle is.</p>
<p>As I mentioned, few steps were enough to push me for to run my regular
distance. But then, before reaching half way to that goal, I felt a
surge of energy. I don't know why it suddenly emerged, maybe a good idea
that I came up with for my presentation, but it made me feel ambitious.
I now wanted to hit the 5 miles' mark. Remarkably, when I got to the 5
miles turning point, I wanted to go even further. I didn't though,
because I had to go back home, since dinner was on its way <sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>.</p>
<p>Nike's slogan, "Just do it", is inspiring. Yet it doesn't solve for how
you <em>get</em> yourself to "do it". Taking a small, modest and non-committing
step is the most effective way to get things done. But I'm not saying
something new here. Much was already written about the power of a small
step. Kaizen <sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup> is built around this concept. I'm just attesting that
it really works.</p>
<p>Back to the first sentence of this post. I though about all of this
during my run, and figured it might make an interesting post. But by the
time I got home, had dinner and set to finish my presentation, I was too
tired to start writing. I also wasn't too encouraged to do it, given the
finale of that run (more on it in a sec). I convinced myself, though, to
write only one sentence, the one that opens this post.The power of small
steps...</p>
<p>Now let me conclude with an anti-climax: this heroic run. I got to the
2.5 miles mark and turned back for the second half. But then, about a
mile before the finish line, my legs failed me, and vetoed my
aspirations. They forced me to stop at once, and did me a favor by
carrying me that last mile, clumping and aching. This breakdown, which I
never experienced before, left me confused: should I be happy for not
giving up on this run, or disappointed for stopping before reaching my
goal. I'm too tired though, so I'll leave it for you to decide.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>By now I should have stakes in Seamless. Ordering every night for
the last 2 years makes me an angle investors, at least... <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>Kaizen is the practice of continuous improvement. <a href="http://www.kaizen.com/about-us/definition-of-kaizen.html">Read more about
it</a>. <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>One Ineffective Review2015-07-11T08:26:00-04:002015-07-11T08:26:00-04:00yanivtag:prodissues.com,2015-07-11:/2015/07/one-ineffective-review.html<p>Earlier today when I went to grab launch, I came across a lady who stood
at the entrance to a fitness club trying to engage with passer byes. I
think she was an ex-employee or a past customer of this club; either
ways sensed she wasn't very pleased with it …</p><p>Earlier today when I went to grab launch, I came across a lady who stood
at the entrance to a fitness club trying to engage with passer byes. I
think she was an ex-employee or a past customer of this club; either
ways sensed she wasn't very pleased with it. I probably got that
impression because she kept chanting profanities, and urged people to
avoid entering it.</p>
<!-- more -->
<p>Her scheme worked - no one seemed to enter the place.</p>
<p>Well, if you think about it, this scene took place on 14th street, which
is swarmed with people, especially around lunch time. And so 99.99% of
those people have no intention to get a workout. This lady was trying to
convince the convinced. Or maybe she was hoping that her ferocious
exhortation will keep them from even thinking about it in the future.</p>
<p>But for some reason this surreal sight of this poor lady, who I don't
think is crazy, but who was for some reason offended by something or
someone in this place, so much that she took upon herself to review it
physically and vocally to anyone she could have reached, got me
thinking. It seemed to remind me of something else, but I'm not sure
what.</p>When 2 Weeks Are Faster Than 2 Hours2015-07-03T07:41:00-04:002015-07-03T07:41:00-04:00yanivtag:prodissues.com,2015-07-03:/2015/07/when-2-weeks-are-faster-than-2-hours.html<p>Few weeks ago I bought my wife a set of lenses for her iPhone. Usually I
buy everything on amazon, but this time I ordered from B&H, a brick and
mortar retailer with an online store, because it sold what I wanted for
25% less.</p>
<p>When I received the …</p><p>Few weeks ago I bought my wife a set of lenses for her iPhone. Usually I
buy everything on amazon, but this time I ordered from B&H, a brick and
mortar retailer with an online store, because it sold what I wanted for
25% less.</p>
<p>When I received the item I found that I ordered the wrong model - one
for the iPhone 4s instead of the 5s. I submitted a request for an
exchange, which was approved. I wasn't clear on how B&H's exchange
process works, so I called their customer care. The guy I spoke with,
who was super nice, explained the process and said that it might take
about two weeks to get a replacement. To avoid the long wait, he
suggested I'll swing by the store and make the exchange there. It will
be faster, he said, and I agreed.</p>
<p>Today I went to the store. But when I got there I found that I'm not the
only one thinking they can "game" the system. About 20 other customers
had the same idea, creating an expected waiting time of about 2 hours. I
loathe lines. Just the idea of waiting for an hour at the DMV gives me
more agitations than that of going through a root canal procedure. So no
way I'm going to wait 2 hours to replace merchandise.</p>
<p>And so I went back home with the wrong model. I plan to ship it back to
B&H, and buy the correct one on Amazon. It will cost more, but at least
I know I can't go wrong.</p>
<p>This experience made me think about the concept of "speed" and about
trust.</p>
<h1>Is faster really faster?</h1>
<p>The guy from B&H assumed I would prefer waiting 2 hours in store than
couple of weeks for a delivery. He was thinking about speed in absolute
terms - 2 hours vs. 2 weeks. I, on the other hand, think about speed
differently. I take into account other variables, such as the actual -
physical and mental - waiting time, and the total of the transaction.</p>
<p>Let's think about actual waiting time first. At almost any given moment,
I have Amazon packages en-route to me. I don't really wait for or keep
thinking about them. They create zero mental load on me. But when I'm
standing in line, crammed between 20 other customers, lamenting the lose
of a Friday, I feel the wait with every fiber in my body. For me, 2
hours of wait are like a pure torture. They feel worst, and hence
longer, than a shipment that will land on my door eventually.</p>
<p>But even if you think about speed in absolute terms, in-store exchange
isn't much faster. I talked with the B&H representative more than a week
ago. Since then I've tried to find time to visit the store (more mental
effort). Turned out the only day I could made it was today, a vacation
day. Overall then, I waited almost the same amount of time I would have,
if I shipped the item.</p>
<p>And here's where the second and more important insight. You might ask
why <em>did</em> I go to the store and didn't send the item back?</p>
<h1>Trust is in the details</h1>
<p>B&H has an amazing store. If you haven't been there and you're in NYC,
you must pay it a visit. And if you have kids, take them with you. It's
like an amusement park for electronic devices, where gadgets take rides
from the automated warehouse to the checkout. They're doing it in
electric plastic carts that run on rails across the entire ceiling of
the store. The constant bustling and rattling sounds of the moving carts
feels like there's a roller coaster running over your head.</p>
<p>This design instills confidence. When I'm in this store, all I can think
of is "boy, those guys know their craft and understand technology." But
then, when I tried to return an item online, this confidence vanished. I
didn't feel that I can send the item and forget about it, as is the case
with Amazon.</p>
<p>Let me explain. When you decide to return an item to B&H, you have to
fill-up a form online. You then submit it, and wait for a representative
to reply. This simple flow creates immediate concerns. Waiting for a
reply means that someone has to process my request. But will anyone pick
it up? will they approve it? how long should I wait for a response?</p>
<p>Fortunately, my exchange was approved. I got an RMA form <sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup> the
following day. It noted that I agreed to receive a replacement instead
of a refund. This form, though, raised more concerns - how can I be sure
someone will read this form, see that I asked for a replacement and ship
back the correct item? I started to think about the workflow this form
triggers, and became aware of all the possible points of failure in that
process. In addition, the form indicates the address where the item
should be returned to. That's another point of failure, since I have to
fill-out a return label, and hope the package will then ship to its
destination.</p>
<p>Thinking about this process, I can see why the B&H representative
suggested I will go to the store, and why I thought that's the right
thing to do. To make sure I return the product and get a replacement, I
should go to the store in person.</p>
<p>Now, think about Amazon, where all of this complexity is hidden from the
user. You want to return an item? no problem - here's the label. Print
and attach it to you're item. Drop the item at the closest UPS store,
and a refund will hit your account (minus delivery fee), or a
replacement process will initiate as soon as you exist the door. The
whole process is automated, done using printers, scanners and emails. No
human intervention, hence no place for error. At least that's how you
feel. And just like a magic, few days later a new package delivery is
waiting at your door.</p>
<p>And so, here are my take aways:</p>
<ol>
<li>As a customer - trust worth money.</li>
<li>As someone who builds products - keep your users in Wonderland, and
don't ever let them see through your challenges, problems and
complexities.</li>
</ol>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>They keep referring to this form as RMA, which I have no clue what
it means. Using internal lingo with your customers is a horrible
idea. Don't ever do it! <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Why I Decided to Move Away From Evernote2015-06-21T06:24:00-04:002015-06-21T06:24:00-04:00yanivtag:prodissues.com,2015-06-21:/2015/06/why-i-decided-to-move-away-from-evernot.html<p>For the last few months things between Evernote and I weren't as good as
they used to be. The direction the company is taking, <a href="http://www.newsfactor.com/news/Evernote+Renews+Focus+on+Biz+Users/story.xhtml?story_id=100009Z18N6S">focusing on
enterprise
customers</a>,
and <a href="http://techcrunch.com/2014/10/02/evernote-unveils-evernote-context-an-ai-play-that-surfaces-content-from-ouside-sources-as-you-write/">monetizing its users'
data</a>,
eroded my trust in it. Since I use Evernote as the repository for my
most personal and …</p><p>For the last few months things between Evernote and I weren't as good as
they used to be. The direction the company is taking, <a href="http://www.newsfactor.com/news/Evernote+Renews+Focus+on+Biz+Users/story.xhtml?story_id=100009Z18N6S">focusing on
enterprise
customers</a>,
and <a href="http://techcrunch.com/2014/10/02/evernote-unveils-evernote-context-an-ai-play-that-surfaces-content-from-ouside-sources-as-you-write/">monetizing its users'
data</a>,
eroded my trust in it. Since I use Evernote as the repository for my
most personal and precious data, trust is invaluable. And as this factor
is gradually taken away, I've stopped adding new notes, and sadly
started looking for alternatives.</p>
<p>My relationship with Evernote goes way back. I fancy myself one of
Evernote's early users. A productivity nerd, I've used it since v.1 back
in 2005, when apps were called softwares. Evernote looked a lot
different back then. It was designed as one continuous note, imitating a
cash register paper roll. This design eased my transition from the
physical notepad I used to carry, and turned me quickly into a “power
user”, accumulating hundreds of notes every year.</p>
<p>Soon Evernote became the hub for my digital life. I used it to take
notes, log ideas, summaries meetings, manage todo lists, maintain
contacts information, capture screenshots and whiteboards, and stash
passwords. I also created workflows to forward information I wanted to
keep track of, such as calendar appointments, text messages, scanned
document, invoices, receipts, and workout logs using services such as
<a href="https://ifttt.com/p/yanivdll/shared">IFTTT</a> and
<a href="https://filethis.com/">FileThis</a>. It grew to become an extension of my
brain, just what it was built for.</p>
<p>I was a delighted user; so much that I decided to pay for a premium
account, even though I didn't meet my free account's quota <sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>, and
didn't need the premium features. Yet I <em>wanted</em> to pay, because I
admired the product, and wanted to express my support and loyalty to the
team behind it. And more than paying, I became an advocate. I often used
Evernote as a showcase for how you <em>can</em> build a big company by focusing
your strategy and product roadmap on the user.</p>
<p>Of course, not everything was perfect. I never liked the note taking
editor, and even less so as I started to write markdown, which Evernote
doesn't support, and witnessed the proliferation of innovative markdown
editors. Keeping track of my notes became another source of grievance.
Not being able to organize my notes the way I wanted meant that the more
notes I've created, the harder it become to keep track of them or find
the right note when I needed it. The hundreds of tags and dozens of
notebooks I accumulated didn't make things easier. And my biggest
concern was always the lack of portability of my data. Once I put it in
Evernote, it was hard to take out. But I wasn't deterred by these
shortcomings, because I knew Evernote's vision is in line with mine, and
therefore trusted those issues will be sorted out eventually.</p>
<p>That's why when Evernote shifted its roadmap, I started to feel that we
don't share the same vision anymore. At first, there were those small
annoyances, such as promoting <a href="http://blogs.imediaconnection.com/blog/2014/06/04/physical-digital-evernote/">Evernote's physical
stuff</a>
inside the app, and introducing features that work only with Evernote
branded hardware. Then more concerning intrusive features, such as
<a href="http://www.512pixels.net/blog/2014/10/on-evernotes-new-context-feature-and-why-its-a-problem">“Context”</a>
followed. But it wasn't until Evernote has gone full throttle on sharing
and collaboration that I realized it's time for me to move on.</p>
<p>I'm not very surprised with the change Evernote is going through. You
see, for 10 long years Evernote worked diligently to develop an amazing
app, believing that's the only way to build an engaged audience. You
can't build such a user base with less than exceptional product. But as
it grew bigger, it got under pressure to show how it translates users
into \$s. This pressure became unbearable when it started to <a href="http://www.wsj.com/articles/note-taking-app-evernote-considering-ipo-in-next-few-years-1411563762">plan for
an
IPO</a>.</p>
<p>My speculation is that when Evernote took the IPO route, it found that
100 million users, 5% of them are paying customers, won't get it the
valuation it desires. It won't, because when evaluating companies, Wall
Street doesn't care about reality and past achievements. It is much more
interested in future potential, in dreams. So for Evernote to be priced
10x it's revenue, it must convince investors that such a dream exists.
Now, due to the amount of users it already has, Evernote can't project
an exponential user growth. It can, alternatively, prove it can increase
its users' LTV <sup id="fnref-2"><a class="footnote-ref" href="#fn-2">2</a></sup>, or show growth in new markets or segments.</p>
<p>Evernote went both ways. On the one hand, it took more aggressive
conversion tactics, such as the introduction of a new system of Plus and
Premium plans, reduction of the monthly storage of the free plan by 94%,
and a new communication strategy that nudges users to convert into one
of those paid plans. On the other hand Evernote shifted its focus
towards business users, with features such as “Work Chat” and “Team
Workspace” that have crept into central position within the app.</p>
<p>As Evernote got itself into the race of cashing in on its users, I lost
trust that this will be a service I can rely on for years to come. Hence
my decision to jump ship, and seemingly <a href="http://sethclifford.me/2014/11/moving-from-evernote-to-dropbox/">I'm not
alone</a>.</p>
<p>I used to quote <a href="http://www.wsj.com/articles/SB10001424052970204755404578101270204307986">Phil Libin's
reference</a>
to Gus Levy's brilliant “long-term greedy” strategy. Unfortunately,
Evernote's long-term has arrived, and I don't want to take part in it.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>Back then Evernote offered 1GB to it's free accounts. Now it's
only 60MB. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn-2">
<p>Stands for <a href="https://en.wikipedia.org/wiki/Customer_lifetime_value">user's life time
value</a>, and is a
prediction of net profit you'll make out of every user you acquire until
this user churns. <a class="footnote-backref" href="#fnref-2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>The Watch - First Impression2015-06-13T05:01:00-04:002015-06-13T05:01:00-04:00yanivtag:prodissues.com,2015-06-13:/2015/06/the-watch-first-impressio.html<p>I'm sold on it. Yeah, it might be a hasty conclusion based on less than
24 hours with it, but the Watch is here to stay. Well, probably not the
exact one I used, because I passed it over to my wife, trying to get her
drinking the quaalude as …</p><p>I'm sold on it. Yeah, it might be a hasty conclusion based on less than
24 hours with it, but the Watch is here to stay. Well, probably not the
exact one I used, because I passed it over to my wife, trying to get her
drinking the quaalude as well.</p>
<!--more-->
<p>First off, I should say that I had very low expectations. I'm not the
kind of guy who's crazy about watches. I don't even know why I'm wearing
one <sup><a id="fnr.1" class="footref" href="#fn.1">1</a></sup>. I bought the Apple Watch, and did it so early, simply because I
knew I <em>will</em> buy it eventually. After all, I can't resist Apple's
incredible marketing machine. Forking the $350 now, I thought, will save
me the agonizing deliberations and endless reading of equivocal reviews.
And I'm happy I did, because I found it to be a beautiful, useful and
humble timepiece.</p>
<p>Much was already written about <a href="http://9to5mac.com/2015/05/04/review-apple-watch-as-a-design-piece/">its design</a>, so there is no point for me to come up with more superlatives
to describe its allure. Trust me, it looks just like in the pictures - a
charming gadgety garment that will give your hand a bionic yet chichi
and fashionable look.</p>
<p>Aside from design, it's surprisingly useful, exactly when you want it
to. In my company we use <a href="https://www.duosecurity.com">Duo</a> for security services. Duo has a cool feature that allows you to
authenticate by responding to a push notification on your phone. As cool
as this feature is, you still have to find your phone, usually
scrambling to take it out of your front pocket <sup><a id="fnr.2" class="footref" href="#fn.2">2</a></sup>. Getting and
accepting the request using your watch can't be more natural and
convenient.</p>
<p>What strikes me the most about the Watch, though, is its humbleness. Unlike
other devices, it doesn't grapple my attention. I don't turn it on 150
times a day, as I'm conditioned to with my phone. It isn't swamped with
red badges that cry "tap me", and it doesn't vibrate erratically
whenever my mom send a WhatsApp to a family group I've been trying to
mute forever. Obviously, I can make it as obnoxious as I want by
fiddling with the notification settings or loading useless apps. But out
of the box it's as polite as I would have expected such a close and personal
companion to be. It's like, well, a watch. You look at it when you
want to. And when you do, it lits gently to share the time with you.
Simple. And when it <em>does</em> have something important to say, it does it
shyly and politely, using its haptic feedback. This is one of those gems
that no one pay too much attention to <sup><a id="fnr.3" class="footref" href="#fn.3">3</a></sup>. The tactile sensation it
emits is so gentle you might mistake it with a human touch.</p>
<p>The one thing that put me off was the learning curve I went through
before getting what each of the knob and gesture do. I'm embarrassed to
say that I had to skim through the short help-page that comes with it.
That's not something I'm used to do with other Apple products.</p>
<p>But overall, I'm happy with the Watch. I think it'll be a good
replacement for my current watch, and I see how it can help me break the
unhealthy ties with my iPhone. Now, all I have to do is get one of my
own, assuming my wife will come up with the same conclusion.</p>
<p><strong>Update</strong> - She didn't. After 2 days with the watch my wife concluded
that it's beautiful and humble, but not useful enough to justify the
expense.</p>
<h1>Footnotes</h1>
<p><sup><a id="fn.1" href="#fnr.1">1</a></sup> I wear a simple <a href="http://www.amazon.com/Polar-RS100-Heart-Monitor-Stopwatch/dp/B000FW3Z6O">polar watch</a></p>
<p><sup><a id="fn.2" href="#fnr.2">2</a></sup> If you use the <a href="http://store.apple.com/us/product/MGQF2ZM/A/iphone-6-silicone-case-black">silicon case</a> you know what a hassle it is</p>
<p><sup><a id="fn.3" href="#fnr.3">3</a></sup> TheVerge did a good job highlighting this delightful feature in its <a href="http://www.theverge.com/a/apple-watch-review">exceptional review</a></p>Focus - Not Only Steve Jobs2015-05-18T12:07:00+00:002015-05-18T12:07:00+00:00yanivtag:prodissues.com,2015-05-18:/2015/05/focus-not-only-steve-jobs.html<p>It seems that Steve Jobs attained a monopoly on the idea of being focused, as many of the articles I read lately on the subject refer to or quote him. <a href="http://themindfulbit.com/blog/focus">Here's the latest one</a> of them. </p>
<!-- more -->
<p>I might be breaking some unwritten law now, quoting someone else's take on what …</p><p>It seems that Steve Jobs attained a monopoly on the idea of being focused, as many of the articles I read lately on the subject refer to or quote him. <a href="http://themindfulbit.com/blog/focus">Here's the latest one</a> of them. </p>
<!-- more -->
<p>I might be breaking some unwritten law now, quoting someone else's take on what being focused means. I ran into this line in <a href="http://en.m.wikipedia.org/wiki/Ayn_Rand">Ayn Rand</a>'s book <a href="http://www.goodreads.com/book/show/2112.The_Art_of_Nonfiction">The Art of Nonfiction</a>: </p>
<blockquote>
<p>When I was writing Atlas Shrugged, I accepted neither day nor evening appointments, with rare exceptions, for roughly thirteen years.</p>
</blockquote>
<p>I like this example because not only does it demonstrate extreme focus, suitable for an extreme individual as Rand, but also discipline and persistency. These are complementary qualities without them focus is meaningless. Indeed, Rand's isolation wasn't in vain, as it allowed the creation of a book that became an instant bestseller. </p>
<p>Steve Jobs would have liked this example as well, as he himself <a href="http://www.theatlasphere.com/metablog/1325.php">may have been inspired</a> by Atlas Shrugged when starting Apple...</p>Ekko for iOS2015-05-01T15:33:00+00:002015-05-01T15:33:00+00:00yanivtag:prodissues.com,2015-05-01:/2015/05/ekko-for-ios.html<p><a href="https://itunes.apple.com/us/app/ekko-Player/id969512337">Ekko</a> is a true "news reader" app - it actually reads the news to you. Not only will it speak headlines and stories, but it will also listen to your voice instructions. Say "headlines", and it will read the top headlines; "play"<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>, and it will read an entire article; "ekko …</p><p><a href="https://itunes.apple.com/us/app/ekko-Player/id969512337">Ekko</a> is a true "news reader" app - it actually reads the news to you. Not only will it speak headlines and stories, but it will also listen to your voice instructions. Say "headlines", and it will read the top headlines; "play"<sup id="fnref-1"><a class="footnote-ref" href="#fn-1">1</a></sup>, and it will read an entire article; "ekko" and it will stop reading and wait for your next instruction. It's like having Siri as your personal news anchor.</p>
<!-- more -->
<p>The company that developed Ekko is Intelligence Interactive. It's a small NYC based startup, and I'm part of its advisory board. My help revolves mainly around product strategy, and Ekko is the first fruit of that collaboration. There's hardly anything as satisfying as turning an idea into a real product, especially one that's getting <a href="http://9to5mac.com/2015/04/30/ekko-player-ios/">warm reviews</a>.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn-1">
<p>When you say "play", you should add a keyword from the headline, so Ekko can infer which headline you're trying to select. <a class="footnote-backref" href="#fnref-1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>