<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"> <channel><title>A Quantum Immortal</title> <link>http://ripper234.com</link> <description>Stuff Ron Gross Finds Interesting</description> <lastBuildDate>Fri, 18 May 2012 06:59:33 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.2</generator> <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/AQuantumImmortal" /><feedburner:info uri="aquantumimmortal" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Why you should write a blog post today</title><link>http://feedproxy.google.com/~r/AQuantumImmortal/~3/rrfLU98vqRc/</link> <comments>http://ripper234.com/p/why-you-should-write-a-blog-post-today/#comments</comments> <pubDate>Fri, 18 May 2012 06:59:33 +0000</pubDate> <dc:creator>ripper234</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[blogging]]></category> <guid isPermaLink="false">http://ripper234.com/?p=1742</guid> <description><![CDATA[Blogging was quite a trend a few years ago, but with the rise of Facebook &#38; Twitter, it&#8217;s fallen out of favor with some. Well, I&#8217;m here to tell you that you should open your own blog today, and if you own a blog but haven&#8217;t posted in a while &#8230; you should come back [...]]]></description> <content:encoded><![CDATA[<p>Blogging was quite a trend a few years ago, but with the rise of Facebook &amp; Twitter, it&#8217;s fallen out of favor with some. Well, I&#8217;m here to tell you that you should open your own blog today, and if you own a blog but haven&#8217;t posted in a while &#8230; you should come back to it and post some more.</p><p>There are several reasons for maintaining a blog, some of which I&#8217;m sure are relevant to you:</p><p><strong>Reason 1 &#8211; A technical memento to your future self</strong></p><p>I found out today how to do something cool. In a year, I won&#8217;t remember how to do it &#8230; but I might remember it enough to know what to look for. Once I&#8217;ve blogged about something, if I Google for it in the future I often find my own blog post, and save myself a considerable amount of time.</p><p>There are other venues for such mementos-to-self, but none as indexable and expressive as a blog post. Facebook content is poorly searchable &#8230; I searched for something I posted 2 days ago on Facebook and failed to find it except going over my stream/timeline. Twitter is very limiting &#8230; I guess it might be good for something, but not for keeping concrete knowledge about how to solve a problem, except that knowledge is just a link.</p><p>You could post a Stack Overflow or Quora question, and answer it, but that feels kind of akward. Actually, Quora has <a
href="http://www.quora.com/Boards-on-Quora-product/What-are-Quora-boards">Boards</a> which are rather similar to blogs for this purpose.</p><p><strong>Reason 2 &#8211; Why not share the love?</strong></p><p>An immediate followup to Reason#1 &#8211; if you worked hard and found out something, why not share it and save some time for other people who might run into the same problem? It&#8217;s just being a good citizen, and it doesn&#8217;t cost you more effort to share it rather than keep it in a private knowledge base e.g. Evernote / Google Docs. If you&#8217;ve ever Googled and found a blog post that solved your problem &#8211; now is your time to give something back.</p><p><strong>Reason 3 &#8211; Professional Resume</strong></p><p>Your blog tells the world about you. Whenever I interview for a job, the first thing on my resume is my blog. It shows that I am <a
href="http://www.mymoneyblog.com/how-to-be-happy-with-your-work.html">passionate</a> about my profession. Even if your blog is <a
href="http://read-it-or-throw-it.blogspot.com/">just a collection of links</a>, it shows what kind of technology stack you&#8217;re using or interested in, what your beliefs are, and what makes you tick. I&#8217;ll give a candidate with a personal blog a big +1 over a candidate without a blog any time. It takes courage to go out there and say &#8220;Even though <a
href="http://www.hanselman.com/blog/ImAPhonyAreYou.aspx">I&#8217;m not worthy</a>, I&#8217;m still out here, doing, writing, and sharing. I&#8217;m not the best software engineer / <a
href="labmeme.com">biologist</a> / whatever in the world &#8230; but I&#8217;m trying my best, and I want to share it with you&#8221;.</p><p><strong>Reason 4 - Alzheimer</strong></p><p>This is an extension of reason 1. Reason 1 was about forgetting technical stuff &#8230; but as the years pass, you don&#8217;t just forget technical stuff, you forget who you were. Your life isn&#8217;t lived by a single personality, but is rather experienced by an endless series (or continuum) of personalities, each slightly different than the ones before it. I hardly remember what things we like twenty years ago &#8230; but I do know that 5 years ago, I felt the immense joy of <a
href="http://ripper234.com/p/welcome/">leaving the army</a>, <a
href="http://ripper234.com/p/i-dont-like-google-today/">didn&#8217;t like Google for a day</a>, and <a
href="http://ripper234.com/p/portal/">had loads of fun playing Portal</a>.</p><p>I recently started maintaining, in addition to this blog and social media accounts, a personal record of how each day worked out for me. My setup is simple &#8211; I setup a Google Calendar event to send me a daily reminder at 7 PM each day. I forward this reminder to Evernote, and prefix it with a number between 1 and 5 of &#8220;how much I enjoyed this day&#8221;, plus a one liner of key events that happened. I have a grand plan to one day go over these notes, chart out my happiness graph, and note any specific events &#8230; but for the time being I&#8217;m recording.</p><p>A blog can serve to record part of your history &#8211; the part you&#8217;re willing to be public about, of course. I picture my kids, ten or twenty years from now, reading through my blog (yeah right, all hundreds of entries <img
src='http://ripper234.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , to learn who their father was back on 2012, when we didn&#8217;t have hovercrafts and teleportation. Maybe it will happen, maybe it won&#8217;t, but I know that I would have been happy if my parents had kept such a diary.</p><p><strong>Reason 5 &#8211; Helping semi-distant friends keep in touch</strong></p><p>I have 267 friends on Facebook &#8230; guess with how many I actually keep in touch in real life? I guess maybe ten-fifteen max, and the real number is probably more close to five. But, thanks to Facebook, I get to not lose my other friends completely. Even though I don&#8217;t spend enough time with them, I get occasional glimpses of their lives.</p><p>The problem with social networks is you can&#8217;t possibly keep up with everything &#8230; I even miss <a
href="http://www.facebook.com/aviv.revach/posts/10150808744015248">cool posts like this one</a> because they&#8217;re swallowed up in a huge stream of noise.</p><p>A part of the fix is blogging. When you have a blog, I&#8217;ll follow it with my trusty <a
href="http://www.google.com/reader/view/">Google Reader</a>, and it won&#8217;t get swallowed up, because I do read or glance everything in my reader stream. So please, if you&#8217;re a friend of mine, do me a personal favor and blog &#8211; I want to keep in touch with you!</p><p><strong>Summary</strong></p><p>Please, don&#8217;t give me bullshit like &#8220;You don&#8217;t have anything worth writing about&#8221; or &#8220;You&#8217;re not a good enough writer&#8221;. Perfect is the enemy of good &#8230; just start by writing <em>something</em>, it&#8217;s better by any definition than not writing anything. If you care about it, work on your writing and save up interesting bits to write later (I was saving the idea for this post for a couple of months now, until I got the time and energy to write it). Stuff happens in your life, both personal &amp; professional. Save up the good parts, and write &#8230; your future self + children will thank you later.</p> <img src="http://feeds.feedburner.com/~r/AQuantumImmortal/~4/rrfLU98vqRc" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://ripper234.com/p/why-you-should-write-a-blog-post-today/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://ripper234.com/p/why-you-should-write-a-blog-post-today/</feedburner:origLink></item> <item><title>First Java &amp; JVM Tel Aviv Tools Night!</title><link>http://feedproxy.google.com/~r/AQuantumImmortal/~3/yAeWY8dbdE0/</link> <comments>http://ripper234.com/p/first-java-jvm-tel-aviv-tools-night/#comments</comments> <pubDate>Mon, 23 Apr 2012 20:08:09 +0000</pubDate> <dc:creator>ripper234</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[jjtv]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[Programming]]></category> <guid isPermaLink="false">http://ripper234.com/?p=1743</guid> <description><![CDATA[After a few months of gathering forces, we have a critical mass of people interesting in learning and teaching about Java &#38; JVM related technologies. Our first Tools Night is this upcoming Sunday (29/04), in Sears Israeli (Hertzelia Pituah). Please check out the schdeule on EventBrite, and subscribe if you&#8217;re interested. Also don&#8217;t forget to [...]]]></description> <content:encoded><![CDATA[<p>After a few months of gathering forces, we have a critical mass of people interesting in learning and teaching about Java &amp; JVM related technologies.</p><p>Our first Tools Night is this upcoming Sunday (29/04), in Sears Israeli (Hertzelia Pituah).</p><p>Please check out <a
href="http://jjtv-tools1.eventbrite.com/">the schdeule on EventBrite</a>, and subscribe if you&#8217;re interested. Also don&#8217;t forget to subscribe to <a
href="https://groups.google.com/forum/?fromgroups#!forum/jjtv">the google group</a>.</p> <img src="http://feeds.feedburner.com/~r/AQuantumImmortal/~4/yAeWY8dbdE0" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://ripper234.com/p/first-java-jvm-tel-aviv-tools-night/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://ripper234.com/p/first-java-jvm-tel-aviv-tools-night/</feedburner:origLink></item> <item><title>How UserVoice use Trello</title><link>http://feedproxy.google.com/~r/AQuantumImmortal/~3/15Zykl5Q02w/</link> <comments>http://ripper234.com/p/how-does-uservoice-use-trello/#comments</comments> <pubDate>Wed, 18 Apr 2012 10:15:45 +0000</pubDate> <dc:creator>ripper234</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[Project Management]]></category> <category><![CDATA[Trello]]></category> <guid isPermaLink="false">http://ripper234.com/?p=1738</guid> <description><![CDATA[(Via Joel Spolsky) Read this bit on how UserVoice use Trello. Takeways: They use six+ dedicated board Whenever a list gets to be so long that you&#8217;re scrolling down &#8211;&#62; you&#8217;re doing it wrong. Developer only works on 1-2 things at a time: One Major feature and sometimes one Minor feature. Don&#8217;t pre-assign ownership before [...]]]></description> <content:encoded><![CDATA[<p>(Via <a
href="http://www.joelonsoftware.com/items/2012/04/17.html">Joel Spolsky</a>)</p><p>Read this bit on how <a
href="http://www.uservoice.com/blog/index.php/founders/trello-google-docs-product-management/?utm_campaign=blog&amp;utm_medium=rare&amp;utm_source=joelonsoftware">UserVoice use Trello</a>.</p><p><strong>Takeways</strong>:</p><ol><li>They use six+ dedicated board</li><li>Whenever a list gets to be so long that you&#8217;re scrolling down &#8211;&gt; you&#8217;re doing it wrong.</li><li>Developer only works on 1-2 things at a time: One Major feature and sometimes one Minor feature. Don&#8217;t pre-assign ownership before you work on something &#8230; it&#8217;s flexbile.</li><li>Don’t have a separate system for bugs</li><li>They don’t try to do project estimates &#8211; it just does&#8217;t work <img
src='http://ripper234.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></li><li>Celebrate deployments &#8211; each week/sprint, review what was achieved in that week, and celebrate the good stuff. Keeps the product team connected to R&amp;D.</li></ol> <img src="http://feeds.feedburner.com/~r/AQuantumImmortal/~4/15Zykl5Q02w" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://ripper234.com/p/how-does-uservoice-use-trello/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://ripper234.com/p/how-does-uservoice-use-trello/</feedburner:origLink></item> <item><title>Introducing GoProxy – a light, customizable HTTP Proxy written in Go</title><link>http://feedproxy.google.com/~r/AQuantumImmortal/~3/j2iGl8WsnJI/</link> <comments>http://ripper234.com/p/introducing-goproxy-light-http-proxy/#comments</comments> <pubDate>Sun, 08 Apr 2012 21:47:54 +0000</pubDate> <dc:creator>elazarl</dc:creator> <category><![CDATA[Uncategorized]]></category> <guid isPermaLink="false">http://ripper234.com/?p=1704</guid> <description><![CDATA[This is a guest post by Elazar Leibovich (Google+, Github). Many thanks for Ron, for giving me this stage. Why not Fiddler2? Ron once asked me how to cause a few files on the server to load more slowly, in order to test many patterns of page loading clients might see and debug css races. [...]]]></description> <content:encoded><![CDATA[<p>This is a <strong>guest post</strong> by Elazar Leibovich (<a
href="https://plus.google.com/104461599292167546826/posts">Google+</a>, <a
href="https://github.com/elazarl">Github</a>). Many thanks for Ron, for giving me this stage.</p><h2>Why not Fiddler2?</h2><p>Ron once asked me how to cause a few files on the server to load more slowly, in order to test many patterns of page loading clients might see and debug css races.</p><blockquote><p>Any idea how to selectively slow down transfer of some but not all files from a web server?<br
/> I want to simulate a &#8220;css race&#8221; that happens when csses are delivered slowly.</p></blockquote><p>Eventually, Ron found a <a
href="http://fiddlerdelayext.codeplex.com/" target="_blank">fiddler extension</a> doing just that. But it lead me to the question &#8211; how would one tweak with traffic to his servers in general?</p><p>The obvious answer is writing a <a
href="http://www.fiddler2.com/fiddler/dev/IFiddlerExtension.asp" target="_blank">Fiddler extension</a>, however I find this solution lacking. The usual complaints apply here: Fiddler is a heavy GUI app, it doesn&#8217;t run on Linux, it&#8217;s not open source. The main technical point is that Fiddler is not designed to run as a real proxy. Fiddler is designed to listen on :8080 on my box, for looking at the traffic I&#8217;m generating myself. However I often want more than that, for instance I want my QA team use a proxy that emulates a flaky mobile connection. I want to record the traffic my QA team generated, so that I can replay it, and use real user input for load testing.</p><p>I was looking for a framework, a-la ruby on rails, that would allow me to write custom HTTP proxies, and I found none. So I decided to write one (<a
href="https://github.com/elazarl/goproxy">open source on github</a>, of course).</p><h2>A taste of GoProxy</h2><p><a
title="GoProxy" href="http://github.com/elazarl/goproxy" target="_blank">GoProxy</a>, is a <a
href="http://golang.org/">Go</a> library allowing you to build a custom HTTP proxy. By default you can create a basic transparent proxy, that would simply deliver the request from the proxy client to the remote server, and write the response back</p><pre>proxy := goproxy.NewProxyHttpServer()</pre><p>proxy is a net/http handler, start it just as you start any other Go HTTP handler</p><pre>http.ListenAndServe(":8080", proxy)</pre><p>How do we customize it? We&#8217;ll add &#8220;handlers&#8221;, request handlers and response handlers. The request handler will receive the request after it is received from the proxy client, but before it is sent to the remote server, and they return another (maybe the same) request. Here is a simple request handler that simply adds a header:</p><pre>proxy.OnRequest().DoFunc(func(r *http.Request, ctx *goproxy.ProxyCtx) (*http.Request,*http.Response) {
    r.Header.Set("X-Proxy","yxorP-X")
    return r,nil})</pre><p>Note that the request handler can return an HTTP response. If the HTTP response is not nil, the proxy will never send the request to the remote client, and return the handler&#8217;s response to the client.</p><p>The case of response handlers is almost identical:</p><pre>proxy.OnRequest().DoFunc(func(r *http.Response, ctx *goproxy.ProxyCtx) *http.Response {
    r.Header.Set("X-Proxy-Resp","pseR-yxorP-X")
    return r})</pre><p>Here we&#8217;re adding a header to every response sent back to the client, leaving the request untouched.</p><p>Inside the OnRequest or OnResponse function, we can use a RequestCondition or ResponseCondition accordingly. Those conditions are interfaces that are able to Handle a request or a response and return a boolean &#8211; their decision whether or not to activate the handler given to the DoFunc method right afterwards.</p><pre>proxy.OnRequest(goproxy.IsLocalHost).DoFunc(func(r *http.Response, ctx *goproxy.ProxyCtx) *http.Response {
    r.Header.Set("X-Proxy-Resp","pseR-yxorP-X")
    return r})</pre><p>This will add the X-Proxy-Resp header only to requests sent to local host.</p><p>Another aspect of HTTP proxy is the HTTPS connections. Generally speaking, when a proxy client wants to use HTTPS over a proxy, it sends the proxy the http request &#8220;CONNECT remotehost.com:443\r\n\r\n&#8221; and the proxy then will forward all bytes sent to it by the client to remotehost.com:443. We allow you to eavesdrop the connection with the same mechanism of the OnRequest request handler.</p><pre>proxy.OnRequest(goproxy.ReqHostIs("example.com:443")).HandleConnect(goproxy.AlwaysMitm)
proxy.OnRequest(goproxy.UrlIs("example.com/")).DoFunc(...) // now we will handle encrypted traffic to example.com</pre><p>I tried to include a decent documentation and examples in the source code, please let me know if anything is unclear.</p><p>One important note, since the project is still in its infancy, in a pre-alpha stage, I reserve the right to change and break the API occasionally, until I&#8217;ll figure out what&#8217;s the best API. I hope to stabilize the code in a few months, and ensure no breaking changes are introduced, but to do that I need users input.</p><p>Do visit <a
href="http://github.com/elazarl/goproxy">http://github.com/elazarl/goproxy</a> and let me what you think about the code, documentation &amp; usage examples.</p><h2>Key Take-Aways from The Project</h2><h3>Go</h3><p>Google&#8217;s <a
href="http://golang.org">Go</a> is a very pleasant language, which was just released. I have no doubt this project would have taken much more time in other languages.</p><p>There are many merits to the language itself, but I think that what really made the difference was the absolutely excellent standard library for HTTP connections and data streams. I&#8217;ve never seen such a nicely layered abstraction, allowing you to use http.Get(&#8220;http://example.com&#8221;) as a quick replacement for wget on the one hand, and on the other hand allow you to read part of the response and then drop the connection.</p><p>The go tool is an excellent plus. It does an excellent job with managing dependencies, however it is not as strong as maven. So for example, you must have internet connection when building a package for the first time, you cannot rely on a local repository. Moreover, it cannot manage the versions of software packages, ensuring all developers are using the same version.</p><p>A weak point of the language is immature parts in the standard library. For example, JPEG encoding performance was not adequate to re-encode many jpegs on the fly (check out the <a
href="https://github.com/elazarl/goproxy/blob/master/examples/upside-down-ternet/main.go">40 LOC image flipper proxy</a>!), lack of documentation to some parts of the library, and unstable eco-system. A certain library I was using which was mentioned in the official golang blog had changed its API in the middle of  development (hey, I have no complaints for the author &#8211; he did an excellent job, but it&#8217;s important to know that such issues may exist). In another case a stray printf remained in a library causing weird printouts from time to time.</p><p>A peculiar benefit of Go, as I see it, is that it is a statically typed memory safe language, yet, it can produce a standalone executable, depending on nothing at all, and with fast startup time. There are <a
href="http://nimrod-code.org/" target="_blank">some</a> <a
href="http://live.gnome.org/Vala" target="_blank">programming</a> <a
href="http://ooc-lang.org/" target="_blank">languages</a> trying to do that, but which one of those have a profiler? They are compiled to C, Go compiles to assembly. (D might be an example for such a language, but I don&#8217;t know it enough to form an opinion).</p><h3>Software design</h3><p>The most important lesson I learned is, never ever design an API without writing real world useful software that uses it. I found most of the API gotchas while writing small <a
href="http://github.com/elazarl/goproxy/examples" target="_blank">examples</a>.</p><p>The second important lesson is, as Joshua Bloch put it &#8220;when in doubt &#8211; leave it out&#8221;. Deleting code is the most effective way of improving it. Look at your API and try to see what you can delete without major consequences. Then delete it. Yes, you definitely have at least one function which is not needed, and is best left out.</p><p>The third lesson is, write documentation, try to cover a lot of the code. When explaining how to use your API, you&#8217;ll find out that the API doesn&#8217;t make a lot of sense.</p><p>The fourth lesson is, the API will never be perfect, you&#8217;d better release it and get feedback from real users, than endlessly &#8220;improve&#8221; it in the lab without getting input from real users.</p><p>(Heck, while writing it, I noticed I didn&#8217;t give any way to block CONNECT requests without MITM the https connection. Now it is fixed, but there are probably more problems to come).</p> <img src="http://feeds.feedburner.com/~r/AQuantumImmortal/~4/j2iGl8WsnJI" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://ripper234.com/p/introducing-goproxy-light-http-proxy/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://ripper234.com/p/introducing-goproxy-light-http-proxy/</feedburner:origLink></item> <item><title>bitcoin.org.il – a site for the Hebrew/Israeli Bitcoin Community</title><link>http://feedproxy.google.com/~r/AQuantumImmortal/~3/dl13CwpapQs/</link> <comments>http://ripper234.com/p/bitcoin-org-il-a-site-for-the-hebrewisraeli-bitcoin-community/#comments</comments> <pubDate>Sat, 07 Apr 2012 08:25:32 +0000</pubDate> <dc:creator>ripper234</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[bitcoin]]></category> <guid isPermaLink="false">http://ripper234.com/?p=1707</guid> <description><![CDATA[In the last Bitcoin meetup with had in Tel Aviv, a bunch of us decided to create a place for the Israeli Bitcoin Community. So, if you&#8217;re in Israel (or just read Hebrew), and dig Bitcoin, drop by the site and subscribe. The site is of course non-profit, and its goal is to build and [...]]]></description> <content:encoded><![CDATA[<p>In the last Bitcoin meetup with had in Tel Aviv, a bunch of us decided to create a place for the Israeli Bitcoin Community.</p><p>So, if you&#8217;re in Israel (or just read Hebrew), and dig Bitcoin, drop by <a
href="http://bitcoin.org.il/">the site</a> and subscribe. The site is of course non-profit, and its goal is to build and strengthen the Israeli Bitcoin Community, ranging from &#8220;Bitcoin Curious&#8221; through users to developers and investors.</p><p>P.S. We are looking for content writers &#8211; if you&#8217;d like to write articles about Bitcoin in Hebrew (and maybe even earn a few BTC in the process), be in touch.</p> <img src="http://feeds.feedburner.com/~r/AQuantumImmortal/~4/dl13CwpapQs" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://ripper234.com/p/bitcoin-org-il-a-site-for-the-hebrewisraeli-bitcoin-community/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://ripper234.com/p/bitcoin-org-il-a-site-for-the-hebrewisraeli-bitcoin-community/</feedburner:origLink></item> <item><title>Easy linux backup with duplicity</title><link>http://feedproxy.google.com/~r/AQuantumImmortal/~3/3MhUWhx5t_o/</link> <comments>http://ripper234.com/p/easy-linux-backup-with-duplicity/#comments</comments> <pubDate>Fri, 16 Mar 2012 19:16:46 +0000</pubDate> <dc:creator>ripper234</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[backup]]></category> <category><![CDATA[duplicity]]></category> <category><![CDATA[linux]]></category> <category><![CDATA[s3]]></category> <guid isPermaLink="false">http://ripper234.com/?p=1688</guid> <description><![CDATA[After looking at several backup solutions for a linux-based project of mine, ranging from more advanced systems like bacula to a range of python/bash scripts, I finally found the ultra simple duplicity. Don&#8217;t get me wrong, bacula and its brethren really seem more powerful overall, but when you just need a simple solution, you can&#8217;t [...]]]></description> <content:encoded><![CDATA[<p>After looking at several backup solutions for a linux-based project of mine, ranging from more advanced systems like bacula to a range of python/bash scripts, I finally found the ultra simple <strong>duplicity</strong>. Don&#8217;t get me wrong, bacula and its brethren really seem more powerful overall, but when you just need a simple solution, you can&#8217;t compete with duplicity&#8217;s simplicity.</p><p>duplicity is drop-dead simple backup system that does incremental/full backups, and supports a wide variety of backup targets from the box, including file, ftp, scp, s3, and a dozen others. The usage is simply</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;">duplicity <span style="color: #000000; font-weight: bold;">/</span>folder<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>backup <span style="color: #c20cb9; font-weight: bold;">file</span>:<span style="color: #000000; font-weight: bold;">///</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>target<span style="color: #000000; font-weight: bold;">/</span>folder</pre></div></div><p>You can have the target folder be a local or S3-mounted folder (with the excellent <a
href="http://code.google.com/p/s3fs/wiki/FuseOverAmazon">s3fs</a>), or use other supported URIs. The default is an incremental backup, by you can override by choosing a full backup. It even has support for &#8220;keep the last N full backups and delete the rest&#8221;.</p><p>The only feature that I required, and duplicity didn&#8217;t have, is automatically choosing when to do full vs automatic backups. I would like to tell it &#8220;every 100 runs, do a full backup&#8221;, and this is not supported out of the box &#8230; although easily fixed with a wrapper script. Put that in crontab and you&#8217;re set. Oh, by default it requires setting a PGP key, but if you&#8217;re lazy you can skip it with the &#8211;no-enc option.</p> <img src="http://feeds.feedburner.com/~r/AQuantumImmortal/~4/3MhUWhx5t_o" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://ripper234.com/p/easy-linux-backup-with-duplicity/feed/</wfw:commentRss> <slash:comments>5</slash:comments> <feedburner:origLink>http://ripper234.com/p/easy-linux-backup-with-duplicity/</feedburner:origLink></item> <item><title>A few jQuery tricks from a newb</title><link>http://feedproxy.google.com/~r/AQuantumImmortal/~3/hCy7s1G32y4/</link> <comments>http://ripper234.com/p/a-few-jquery-tricks-from-a-newb/#comments</comments> <pubDate>Fri, 09 Mar 2012 14:15:34 +0000</pubDate> <dc:creator>ripper234</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[javascript]]></category> <category><![CDATA[jQuery]]></category> <category><![CDATA[Programming]]></category> <category><![CDATA[Web Development]]></category> <guid isPermaLink="false">http://ripper234.com/?p=1686</guid> <description><![CDATA[Hi all, this is your newb web developer talking again. While some of the following might be obvious to the more experienced web devs among you, this is a post that I wish I&#8217;d read when I just started using jQuery. Write your own jQuery plugins The word &#8220;plugin&#8221; usually entails something complicated and with [...]]]></description> <content:encoded><![CDATA[<p>Hi all, this is your newb web developer talking again. While some of the following might be obvious to the more experienced web devs among you, this is a post that I wish I&#8217;d read when I just started using jQuery.</p><p><strong>Write your own jQuery plugins</strong></p><p>The word &#8220;plugin&#8221; usually entails something complicated and with some non-trivial learning curve (e.g. how many of you ever wrote a Chrome of Firefox plugin?) Well, in jQuery, this is really not the case. Here is how you write a simple jQuery plugin:</p><div
class="wp_syntax"><div
class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">fn</span>.<span style="color: #660066;">enable</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">prop</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;disabled&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
$.<span style="color: #660066;">fn</span>.<span style="color: #660066;">disable</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">prop</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;disabled&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div><p>I find it useful to wrap even simple one liners such as .prop(&#8220;disabled&#8221;, false) with a plugin, because the semantics of writing $(&#8220;#foo&#8221;).disable() is much nicer than playing with properties/attributes directly. I haven&#8217;t written a lot of plugins yet, but it&#8217;s something to keep in mind as a useful tool to wrap actions on specific DOM elements.</p><p><strong>Know the commonly used plugins</strong><br
/> There are a ton &#8230; I still know very few of them. Here are <a
href="http://www.quora.com/What-are-the-most-useful-jQuery-plugins">a bunch of useful ones</a> (and the ones <a
href="http://www.quora.com/What-are-the-most-useful-jQuery-plugins/answer/Ron-Gross">I personally know and use</a>).</p><p>A lot of plugins are very easy to use, and have good documentation and demos, so not using them and rolling your own solution is usually just a result of ignorance. Take the time to educate yourself!</p><p><strong>UI Queues</strong><br
/> For a long time I&#8217;ve that you can do things like $(&#8220;#mydiv&#8221;).show(), $(&#8220;#mydiv&#8221;).hide() and even $(&#8220;#mydiv&#8221;).show(1000) for a simple animation. Only recently I discovered you can actually chain these using <a
href="http://api.jquery.com/queue/">Event Queues</a>:</p><div
class="wp_syntax"><div
class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#mydiv&quot;</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #660066;">delay</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">500</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">200</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #660066;">fadeOut</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div><p>Each call to an animation method gets queued up and executes after the previous one.</p><p><strong>Deferred</strong><br
/> jQuery <a
href="http://api.jquery.com/category/deferred-object/">Deferred</a> is a little gem. It lets you write fluent code similar to the queue example above. Here is how you use it:</p><div
class="wp_syntax"><div
class="code"><pre class="javascript" style="font-family:monospace;">$.<span style="color: #660066;">when</span><span style="color: #009900;">&#40;</span>$.<span style="color: #660066;">post</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'http://api.com/request_1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
       $.<span style="color: #660066;">post</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'http://api.com/request_2'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
  .<span style="color: #660066;">then</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Got two responses&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div><p>You can also use them with the event queue:</p><div
class="wp_syntax"><div
class="code"><pre class="javascript" style="font-family:monospace;">  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#mydiv&quot;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">show</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">delay</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">500</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">promise</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">then</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #006600; font-style: italic;">/*do something */</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div><p>That&#8217;s all I have for now. Have any essential tips &#038; tricks that I&#8217;m missing out on?</p> <img src="http://feeds.feedburner.com/~r/AQuantumImmortal/~4/hCy7s1G32y4" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://ripper234.com/p/a-few-jquery-tricks-from-a-newb/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://ripper234.com/p/a-few-jquery-tricks-from-a-newb/</feedburner:origLink></item> <item><title>Javascript refactoring is hard</title><link>http://feedproxy.google.com/~r/AQuantumImmortal/~3/j4TcFZe1NNw/</link> <comments>http://ripper234.com/p/javascript-refactoring-is-hard/#comments</comments> <pubDate>Sat, 25 Feb 2012 05:47:01 +0000</pubDate> <dc:creator>ripper234</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[javascript]]></category> <category><![CDATA[Programming]]></category> <category><![CDATA[Refactoring]]></category> <category><![CDATA[Web Development]]></category> <guid isPermaLink="false">http://ripper234.com/?p=1669</guid> <description><![CDATA[I&#8217;ve been refactoring code all my professional career. I started from C/C++, and when I hit C# (Resharper) and Java (IntelliJ), my productivity at refactoring was boosted by a few factors by the wonderful IDEs and refactoring tools that these languages have. I am rather confident when I write &#8220;dirty code&#8221; in Java or C#, [...]]]></description> <content:encoded><![CDATA[<p>I&#8217;ve been <a
href="http://ripper234.com/tag/refactoring/">refactoring</a> code all my professional career. I started from C/C++, and when I hit C# (Resharper) and Java (IntelliJ), my productivity at refactoring was boosted by a few factors by the wonderful IDEs and refactoring tools that these languages have.</p><p>I am rather confident when I write &#8220;dirty code&#8221; in Java or C#, because I know that I can swiftly refactor it into beautiful code without too much trouble. Both aforementioned IDEs are so great at this, that it&#8217;s painless. You can take an ugly 300 line method and break it into several methods, break a long class into several classes, inline, move, and otherwise shape your code.</p><p>Enters javascript and web development.</p><p>Last year I&#8217;ve made the plunge and officially started working on front end web development, first <a
href="http://ripper234.com/p/how-i-got-hired-by-google-this-time/">at Google</a>, and recently at <a
href="http://ripper234.com/p/commerce-sciences-is-hiring/">Commerce Sciences</a>. And I&#8217;ve recently discovered that &#8230; refactoring javascript and frontend code is hard.</p><p><strong>The language is dynamically typed</strong></p><p>Compilers and IDEs can help you less when the language is dynamic. They can make less assurances about your code, making reasoning and refactoring harder. Safely moving a method from class Foo to class Baz is an easy feat in a statically typed language, and a difficult or impossible one in a dynamic language.</p><p><strong>Classes are not first-class citizens</strong></p><p>While you can do OOP in javascript, classes are not first class citizens, but rather they&#8217;re implemented using functions, objects and prototypes. Automatically reasoning about &#8220;classes&#8221; without having an equivalent of keyword <strong>class</strong> is difficult.</p><p><strong>Your code is not just Javascript, it&#8217;s HTML &amp; CSS as well</strong></p><p>Web development is not just about javascript, it&#8217;s a combination of JS, HTML &amp; CSS (not to mention other potential technologies such as LESS/SCSS, HAML, JSON, and whatever language your backend is written in). Unless you&#8217;re already a web development ace and perfectly design your codebase &#8230; you will get these mixed up. Refactoring is about changing the design of your program, and when that design is split up between three or four different technology domains, design mistakes are harder to rectify.</p><p>You can&#8217;t (at least not yet) do an automatic refactoring to &#8220;move inline css into an external css file&#8221;, or to &#8220;convert static html snippet into a javascript DOM manipulation method&#8221;. The makers of IDEs and refactoring tools don&#8217;t have javascript completely figured out yet, no wonder they haven&#8217;t gotten around to building cross-domain refactoring!</p><p>Again, if you &#8220;know what you&#8217;re doing&#8221;, you can structure your program perfectly in the first place, and won&#8217;t ever have to do this kind of &#8220;cross domain refactoring&#8221;. Sadly, we&#8217;re not all born with this kind of experience.</p><p><strong>It&#8217;s harder to know when you&#8217;ve broken something</strong></p><p>Backend code is so much easier to test than frontend code. While frontend testing is important, and growing, it is by no means as well understood or practiced as classical &#8220;backend TDD, this is a calculator, assertEquals(30, calc.plus(10, 20))&#8221;.</p><p>So, since BE code has much wider test coverage than FE code, and is <strong>bloody compiled</strong> for Java &amp; C#, when you refactor FE code it has a much greater chance of breaking down, often in subtle ways you&#8217;ll only notice on IE 8, or when the network is slow, or whatever edge case surfaces your particular bug.</p><p>&nbsp;</p><p>&nbsp;</p><p>So &#8230; how do we manage?</p><ul><li>Refactor less &#8211; Since we know refactoring is hard, we try to do less refactoring and more pre-factoring. Think a little more than usual before coding. While I&#8217;ve grown the habit of &#8220;code first, think about design later&#8221; over the years due to power of refactoring, it&#8217;s less useful in FE dev, so I need to take the time before coding and try harder to get it the design right on my first attempt.</li><li>Still .. refactor &#8211; IntelliJ and Resharper both offer some refactoring capabilities. I&#8217;m most comfortable with &#8220;limited scope refactoring&#8221; &#8211; those that affect one function like Extract Variable. Use the tools you do have, instead of whining about the tools you don&#8217;t.</li><li>Try to think harder about the different problem domains (JS/HTML/CSS), and to develop a better understanding of how to structure your program in a way that won&#8217;t force you do to refactoring across problem domains.</li></ul><div></div><p>Please do share your own experience with refactoring in web dev!</p> <img src="http://feeds.feedburner.com/~r/AQuantumImmortal/~4/j4TcFZe1NNw" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://ripper234.com/p/javascript-refactoring-is-hard/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://ripper234.com/p/javascript-refactoring-is-hard/</feedburner:origLink></item> <item><title>Commerce Sciences Is Hiring!</title><link>http://feedproxy.google.com/~r/AQuantumImmortal/~3/453U_YfkHtU/</link> <comments>http://ripper234.com/p/commerce-sciences-is-hiring/#comments</comments> <pubDate>Tue, 17 Jan 2012 12:00:14 +0000</pubDate> <dc:creator>ripper234</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[Career]]></category> <category><![CDATA[Commerce Sciences]]></category> <category><![CDATA[Startups]]></category> <guid isPermaLink="false">http://ripper234.com/?p=1664</guid> <description><![CDATA[As most of you know, I left Google a few months ago to join a hot new eCommerce startup (I can finally reveal it&#8217;s Commerce Sciences). So far it&#8217;s been just Eyal, Aviv and myself working here at our Herzliya office. &#160; Well &#8230; &#160; We are pleased to announce that we secured an investment of [...]]]></description> <content:encoded><![CDATA[<p>As most of you know, I <a
href="http://ripper234.com/p/leaving-so-soon/">left Google</a> a few months ago to join a hot new eCommerce startup (I can finally reveal it&#8217;s <a
href="http://www.commercesciences.com/">Commerce Sciences</a>).</p><p>So far it&#8217;s been just Eyal, Aviv and myself working here at our Herzliya office.</p><p>&nbsp;</p><p>Well &#8230;</p><p>&nbsp;</p><p>We are pleased to announce that we <a
href="http://www.calcalist.co.il/internet/articles/0,7340,L-3559026,00.html">secured an investment of more than 1.5 million dollars</a>, and are now ready to spend that money on you!</p><p>That is &#8230; if you&#8217;re a really top notch developer looking for adventure, learning, teaching, cutting edge tools and challenges, a terrific product (still stealth mode, but we already have some clients) that will change the way we do eCommerce, together with a superior team.</p><p>You will be our second or third employee &#8230; plenty of room to grow, influence the team, the code/architecture and the product.<br
/> I was actually just planning to write a post about &#8220;why I love startups so much&#8221; when the news of the investment round was made public .. look forward to it.</p><p>I can&#8217;t elaborate publicly about the product, but technology wise I can say we&#8217;re working with Java 7 (thinking about Scala), Groovy, <a
href="http://www.playframework.org/">Play! Framework</a>, Javascript/HTML/<a
href="http://lesscss.org/">LessCss</a> (will integrate <a
href="http://coffeescript.org/">Coffee Script</a> first chance we get) Amazon EC2, git, and Trello.</p> <img src="http://feeds.feedburner.com/~r/AQuantumImmortal/~4/453U_YfkHtU" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://ripper234.com/p/commerce-sciences-is-hiring/feed/</wfw:commentRss> <slash:comments>1</slash:comments> <feedburner:origLink>http://ripper234.com/p/commerce-sciences-is-hiring/</feedburner:origLink></item> <item><title>Do you want to start a Java/JVM group in the Tel Aviv area?</title><link>http://feedproxy.google.com/~r/AQuantumImmortal/~3/N78n2RgUzgc/</link> <comments>http://ripper234.com/p/do-you-want-to-start-a-javajvm-group-in-the-tel-aviv-area/#comments</comments> <pubDate>Sat, 14 Jan 2012 16:31:50 +0000</pubDate> <dc:creator>ripper234</dc:creator> <category><![CDATA[Uncategorized]]></category> <category><![CDATA[Israel]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[jjtv]]></category> <category><![CDATA[JVM]]></category> <category><![CDATA[Tel Aviv]]></category> <guid isPermaLink="false">http://ripper234.com/?p=1659</guid> <description><![CDATA[There&#8217;s a new group in town. If you&#8217;re a Java/JVM developer, and live in the Tel Aviv (or Israel) area, please join. I don&#8217;t like repeating myself, so please, if you fit the above criteria, read the linked post.]]></description> <content:encoded><![CDATA[<p><a
href="https://groups.google.com/forum/?hl=en#!topic/jjtv/hD_t0D-NBFQ">There&#8217;s a new group in town</a>.</p><p>If you&#8217;re a Java/JVM developer, and live in the Tel Aviv (or Israel) area, please join.</p><p>I don&#8217;t like repeating myself, so please, if you fit the above criteria, read the linked post.</p> <img src="http://feeds.feedburner.com/~r/AQuantumImmortal/~4/N78n2RgUzgc" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://ripper234.com/p/do-you-want-to-start-a-javajvm-group-in-the-tel-aviv-area/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://ripper234.com/p/do-you-want-to-start-a-javajvm-group-in-the-tel-aviv-area/</feedburner:origLink></item> </channel> </rss>

