<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>Julian Yap</title>
 <link href="http://julianyap.com/atom.xml" rel="self"/>
 <link href="http://julianyap.com"/>
 <updated>2018-09-27T22:02:34+00:00</updated>
 <id>http://julianyap.com/</id>
 <author>
   <name>Julian Yap</name>
 </author>

 
 <entry>
   <title>GNU Privacy Guard (GPG) examples using Golang</title>
   <link href="http://julianyap.com//2014/07/04/gnu-privacy-guard-gpg-examples-using-golang.html"/>
   <updated>2014-07-04T14:35:00+00:00</updated>
   <id>http://julianyap.com//2014/07/04/gnu-privacy-guard-gpg-examples-using-golang</id>
   <content type="html">&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;Someone wrote to me today that they found some of my public Github Gists “public_key_decrypt&lt;/td&gt;
      &lt;td&gt;encrypt_gpg_base64.go and encrypt_decrypt_gpg_armor.go - incredibly helpful! Thanks for sharing those. I’m using the latter for storing bitcoin private keys.”&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;I originally wrote them as there weren’t any good examples on the web that ran through different scenarios.&lt;/p&gt;

&lt;p&gt;As part of the process I wrote a program called &lt;a href=&quot;https://github.com/jyap808/jaeger&quot;&gt;Jaeger&lt;/a&gt; which is a JSON encoded GPG encrypted key value store. It is useful for generating and keeping configuration files secure.&lt;/p&gt;

&lt;p&gt;Here is a compilation of my code examples.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/jyap808/8250067&quot;&gt;Decrypting an ASCII armored GPG encrypted string in Golang&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/jyap808/8250124&quot;&gt;Symmetrically encrypting a string into ASCII armored GPG format and then Decrypting it in Golang&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/jyap808/8309947&quot;&gt;Decrypting an ASCII armored GPG encrypted string using a passphrase protected private key in ASCII armor format&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/jyap808/8310117&quot;&gt;Decrypting an ASCII armored GPG encrypted string using a private key (no passphrase) in ASCII armor format&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/jyap808/8324818&quot;&gt;Public key encrypting a string into GPG format and outputting it in base64 encoding&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/jyap808/8341483&quot;&gt;Decrypting a base64 GPG public key encrypted string using a passphrase protected private key in ASCII armor format&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</content>
 </entry>
 
 <entry>
   <title>Enhancing security through signed Mac Wallet builds</title>
   <link href="http://julianyap.com//2014/07/03/enhancing-security-through-signed-mac-wallet-builds.html"/>
   <updated>2014-07-03T15:02:00+00:00</updated>
   <id>http://julianyap.com//2014/07/03/enhancing-security-through-signed-mac-wallet-builds</id>
   <content type="html">&lt;p&gt;Presently the vast majority of cryptocurrency Mac Wallet applications are distributed in an insecure fashion which opens end users up to potential security issues such as malware.&lt;/p&gt;

&lt;p&gt;Trust is essential when using cryptocurrency wallet applications as reducing your operating system’s security settings and allowing yourself to install a software application from an unverified source could have disastrous effects.  It is quite feasible that a wallet application you install today may contain “malware that steals Bitcoins”:http://www.darkreading.com/attacks-breaches/more-than-100-flavors-of-malware-are-stealing-bitcoins/d/d-id/1141396.&lt;/p&gt;

&lt;p&gt;One way to combat this in the Mac OS X system is to use “code signing”:https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/CodeSigningGuide.pdf.&lt;/p&gt;

&lt;p&gt;From the “Wikipedia”:http://en.wikipedia.org/wiki/Code_signing entry:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;Code signing&lt;/em&gt; is the process of digitally signing executables and scripts to confirm the software author and guarantee that the code has not been altered or corrupted since it was signed by use of a cryptographic hash.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I have started a “Signed Mac Wallet Builds Program”:http://julianyap.com/pages/macwalletbuilds.html which provides coins the service of having their Mac Wallets built and signed by me.  Please note that there is nothing preventing coin developers from directly signing up for an Apple Mac developer account, going through the verification process and providing this service themselves.&lt;/p&gt;

&lt;p&gt;I encourage all coins which believe in the longevity and public trust of their coin to provide signed Mac Wallets.  You owe it to your users and the community.&lt;/p&gt;

&lt;p&gt;I encourage all cryptocurrency users to demand signed Mac Wallet builds from their coin developers.  In order for alt coins to compete on the same level as Bitcoin, they must offer the same if not better level of trustworthiness.&lt;/p&gt;

&lt;p&gt;I have discussed this program with Pinkcoin and Razorcoin who have agreed to be apart of the launch of this program.  The “signed Pinkcoin wallet”:http://crypto.pink/wallet/ and the “signed Razorcoin wallets”:http://razorco.in are both available for immediate download.&lt;/p&gt;

&lt;p&gt;Here is a screen shot of the signed Pinkcoin Mac Wallet along with my developer ID verified by Apple:&lt;/p&gt;

&lt;p&gt;!/images/pinkcoin_signed_verification.png!&lt;/p&gt;

&lt;p&gt;Please read my “Signed Mac Wallet Builds Program”:http://julianyap.com/pages/macwalletbuilds.html page which goes into more detail.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UPDATE, July 9 2014:&lt;/em&gt; The “Nautiluscoin”:http://www.nautiluscoin.com Mac Wallet is now signed.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;UPDATE, July 29 2014:&lt;/em&gt; The “Sync”:http://www.synclub.net Mac Wallet is now signed.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Digital Ocean - First impressions</title>
   <link href="http://julianyap.com//2013/10/08/digital-ocean-first-impressions.html"/>
   <updated>2013-10-08T23:12:00+00:00</updated>
   <id>http://julianyap.com//2013/10/08/digital-ocean-first-impressions</id>
   <content type="html">&lt;p&gt;I signed up for &lt;a href=&quot;https://www.digitalocean.com/?refcode=571ac31ec1b5&quot;&gt;Digital Ocean&lt;/a&gt; the other day since I was planning on using it for some online services. I also felt the service had reached a point of growth and maturity where it felt like they were “sticking around”.&lt;/p&gt;

&lt;p&gt;Here are some first impressions.&lt;/p&gt;

&lt;p&gt;You can choose to create a virtual machine (a “droplet”) in 1 of 4 data centers (a “region”).  Only the “New York 2” data center supports Private Networking so for example if you create a VM in “San Francisco 1”, the VM will only have a public IP interface.  If you are thinking of deploying a permanent system which will use N+1 servers then deploying to the “New York 2” data center is your only option so you don’t need to expose services on a public IP just to talk to another one of your servers.  When creating a VM, “New York 2” is the default data center selected.&lt;/p&gt;

&lt;p&gt;Ubuntu 12.04 x32 is the default distribution selected when creating a VM.  You should change this to a 64-bit distribution so that you have less hassles in case you want to resize your VM.  I had initially installed an Ubuntu 13.04 x64 VM but I had issues starting up the IPTables firewall and noticed that all of the documentation refers to 12.04 which would then be considered their best supported and maintained Ubuntu distribution version.&lt;/p&gt;

&lt;p&gt;You should add a SSH key first in the web console so that you can select this during the install.  The installer only installs with a ‘root’ user and emails you the created password.  Having your SSH key pre-installed means you can automate additional install process items such creating another user account and disabling remote ‘root’ access.  Digital Ocean also has a nice REST API which spits back JSON.&lt;/p&gt;

&lt;p&gt;On the default Ubuntu 12.04 x64 install there was no firewall installed by default.  You should definitely &lt;a href=&quot;https://www.digitalocean.com/community/articles/how-to-setup-a-firewall-with-ufw-on-an-ubuntu-and-debian-cloud-server&quot;&gt;install UFW&lt;/a&gt; and implement a security policy for SSH access at a bare minimum.&lt;/p&gt;

&lt;p&gt;I ran some quick tests and benchmarks and Digital Ocean lives up to the hype.  Performance is fast and consistent.&lt;/p&gt;

&lt;p&gt;The main issue I have with VM online providers is inconsistent performance, be it disk, CPU or network IO.  Inconsistent performance means you need to implement less than ideal workarounds such as overprovisioning your servers or performing workarounds like &lt;a href=&quot;http://blog.9minutesnooze.com/raid-10-ebs-data/&quot;&gt;implementing software RAID 10&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Imagine: The flexibility of virtual machines with the predictability of bare metal.&lt;/p&gt;

&lt;p&gt;Another thing I see myself doing is spinning up a VM just for quick testing.  Creating a VM literally takes a minute.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.digitalocean.com/?refcode=571ac31ec1b5&quot;&gt;Digital Ocean&lt;/a&gt; looks to have a great differentiator with SSD disks, pricing and overall impressive virtual machine performance.  At this early stage I can definitely recommend checking them out.&lt;/p&gt;

&lt;p&gt;Here is a quick ApacheBench test of a &lt;a href=&quot;https://github.com/jyap808/g0bin&quot;&gt;Go application&lt;/a&gt; serving up a static template.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; sysctl &lt;span class=&quot;nt&quot;&gt;-w&lt;/span&gt; net.netfilter.nf_conntrack_max&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;131072
&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; ab &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; 20000 &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; 20 http://myserver/new/
&lt;span class=&quot;gp&quot;&gt;This is ApacheBench, Version 2.3 &amp;lt;$&lt;/span&gt;Revision: 655654 &lt;span class=&quot;nv&quot;&gt;$&amp;gt;&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;…

Document Path:          /new/
Document Length:        4022 bytes

Concurrency Level:      20
Time taken for tests:   29.186 seconds
Complete requests:      20000
Failed requests:        0
Write errors:           0
Total transferred:      82740000 bytes
HTML transferred:       80440000 bytes
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;Requests per second:    685.27 [#&lt;/span&gt;/sec] &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;mean&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;go&quot;&gt;Time per request:       29.186 [ms] (mean)
Time per request:       1.459 [ms] (mean, across all concurrent requests)
Transfer rate:          2768.51 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       5
Processing:     2   29   3.0     29      53
Waiting:        0   29   3.0     29      53
Total:          2   29   3.0     29      53

Percentage of the requests served within a certain time (ms)
  50%     29 
  66%     30 
  75%     31 
  80%     31 
  90%     32 
  95%     33 
  98%     34 
  99%     35 
 100%     53 (longest request)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Here is a test of downloading a 100MB file from various locations from a VM created at the “San Francisco 1” data center.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-console&quot; data-lang=&quot;console&quot;&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; curl &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; http://speedtest.fremont.linode.com/100MB-fremont.bin
&lt;span class=&quot;go&quot;&gt;  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  100M  100  100M    0     0  44.7M      0  0:00:02  0:00:02 --:--:-- 51.2M
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; curl &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; http://speedtest.tokyo.linode.com/100MB-tokyo.bin
&lt;span class=&quot;go&quot;&gt;  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  100M  100  100M    0     0  12.5M      0  0:00:07  0:00:07 --:--:-- 16.4M
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; curl &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; http://speedtest.london.linode.com/100MB-london.bin
&lt;span class=&quot;go&quot;&gt;  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  100M  100  100M    0     0  8459k      0  0:00:12  0:00:12 --:--:-- 10.0M
&lt;/span&gt;&lt;span class=&quot;gp&quot;&gt;#&lt;/span&gt; curl &lt;span class=&quot;nt&quot;&gt;-O&lt;/span&gt; http://speedtest.dallas.linode.com/100MB-dallas.bin
&lt;span class=&quot;go&quot;&gt;  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  100M  100  100M    0     0  21.9M      0  0:00:04  0:00:04 --:--:-- 22.8M&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;!-- LINKS:
http://lost-and-found-narihiro.blogspot.com/2011/02/kernel-error-nfconntrack-table-full.html 
http://pc-freak.net/blog/resolving-nf_conntrack-table-full-dropping-packet-flood-message-in-dmesg-linux-kernel-log/
--&gt;

</content>
 </entry>
 
 <entry>
   <title>Using Anonymous Structs to pass data to templates in GoLang</title>
   <link href="http://julianyap.com//2013/09/23/using-anonymous-structs-to-pass-data-to-templates-in-golang.html"/>
   <updated>2013-09-23T22:40:00+00:00</updated>
   <id>http://julianyap.com//2013/09/23/using-anonymous-structs-to-pass-data-to-templates-in-golang</id>
   <content type="html">&lt;p&gt;One thing that is quite common with Python web frameworks like Django, Flask or Bottle is passing multiple objects to a view.&lt;/p&gt;

&lt;p&gt;Something like this in Django is common where a context dictionary with multiple objects is passed back to the template for rendering:&lt;/p&gt;

&lt;div class=&quot;language-python highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kn&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;django.shortcuts&lt;/span&gt; &lt;span class=&quot;kn&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;render&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;my_view&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;'poll'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'error_message'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;You didn't select a choice.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;'polls/detail.html'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;While reading through some examples in GoLang is seemed strange that all the tutorials and examples only passed a single object back to the template.&lt;/p&gt;

&lt;p&gt;Here is an example:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;html/template&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;net/http&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;strings&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Paste&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Expiration&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Content&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;byte&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UUID&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;       &lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pasteHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paste_id&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TrimPrefix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/paste&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paste&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Paste&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UUID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paste_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paste&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ParseFiles&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;templates/paste.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Execute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Your template code would then look something like this:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Expiration: {{ .Expiration }}
UUID: {{ .UUID }}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;What if we want to pass multiple objects to the template?&lt;/p&gt;

&lt;p&gt;A really clean solution I found was to use an &lt;a href=&quot;http://nf.wh3rd.net/10things/#2&quot;&gt;anonymous struct&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the following example, we are now modifying the pasteHandler function in the above example to pass extra boolean flags to the template.&lt;/p&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;pasteHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ResponseWriter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paste_id&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;strings&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TrimPrefix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;URL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/paste&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paste&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Paste&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;UUID&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paste_id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keep_alive&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;burn_after_reading&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Paste&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Paste&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;KeepAlive&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BurnAfterReading&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;paste&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;keep_alive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;burn_after_reading&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ParseFiles&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;templates/paste.html&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Execute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We then need to modify out template code to access the objects like this:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Expiration: {{ .Paste.Expiration }}
UUID: {{ .Paste.UUID}}
{{ if .BurnAfterReading }}
BurnAfterReading: True
{{ else }}
BurnAfterReading: False
{{ end }}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

</content>
 </entry>
 
 <entry>
   <title>Setting up a Ruby rbenv environment on OS X</title>
   <link href="http://julianyap.com//2013/03/26/setting-up-a-ruby-rbenv-environment-on-os-x.html"/>
   <updated>2013-03-26T21:52:00+00:00</updated>
   <id>http://julianyap.com//2013/03/26/setting-up-a-ruby-rbenv-environment-on-os-x</id>
   <content type="html">&lt;p&gt;rbenv is the best way to set up a Ruby environment.  It’s pretty essential since you can test your stack against different versions of Ruby and gems such as Rails.&lt;/p&gt;

&lt;p&gt;… It’s pretty much like virtualenv for Python.&lt;/p&gt;

&lt;p&gt;I don’t always use Ruby but when I do I use rbenv (said in the Dos Equis man voice).&lt;/p&gt;

&lt;p&gt;Install rbenv and ruby-build via brew&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;brew update
brew install rbenv
brew install ruby-build&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Add rbenv init to your shell to enable shims and autocompletion.&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'eval &quot;$(rbenv init -)&quot;'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bash_profile&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Select the version of Ruby to install.  First list all the available versions&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;rbenv install &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;For example, let’s install the latest version in the 1.9.3 branch&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;VERSION&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;1.9.3-p392&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Build and install Ruby without documentation (saves time)&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nv&quot;&gt;CONFIGURE_OPTS&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;--disable-install-doc&quot;&lt;/span&gt; rbenv install &lt;span class=&quot;nv&quot;&gt;$VERSION&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Set the global Ruby version&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;rbenv global &lt;span class=&quot;nv&quot;&gt;$VERSION&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Disable ri and rdoc documentation for Gems.  Add to ~/.gemrc&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;install: &lt;span class=&quot;nt&quot;&gt;--no-rdoc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--no-ri&lt;/span&gt;
update: &lt;span class=&quot;nt&quot;&gt;--no-rdoc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--no-ri&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;nb&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;EOT&lt;/span&gt;&lt;span class=&quot;sh&quot;&gt; &amp;gt; ~/.gemrc
install: --no-rdoc --no-ri
update: --no-rdoc --no-ri
EOT&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

&lt;p&gt;Bonus points.  Install Rails&lt;/p&gt;

&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;gem install rails&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;

</content>
 </entry>
 
 <entry>
   <title>Mac Pro users and their sense of entitlement</title>
   <link href="http://julianyap.com//2012/06/11/mac-pro-users-and-their-sense-of-entitlement.html"/>
   <updated>2012-06-11T19:49:00+00:00</updated>
   <id>http://julianyap.com//2012/06/11/mac-pro-users-and-their-sense-of-entitlement</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;. I bet this is the last Mac Pro. If you wanted to kill a product line, an “update” like today’s would be a good way to clear out parts and keep selling to a few desperate buyers for a bit longer without any real investment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is pathetic.&lt;/p&gt;

&lt;p&gt;p. No. What’s pathetic is the sense of entitlement that certain Mac users have.&lt;/p&gt;

&lt;p&gt;Relax, the Mac Pro will get a proper update next year. It’s as if the 2012 debut of an iPad with retina display, the debut of a MacBook Pro with retina display and new form factor for the future of that line and an upcoming iPhone 5 wasn’t good enough for some people.&lt;/p&gt;

&lt;p&gt;“According to Tim Cook”:http://www.macrumors.com/2012/06/11/david-pogue-new-imacs-and-mac-pros-coming-probably-in-2013/:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Our pro customers are really important to us…don’t worry as we’re working on something really great for later next year.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Apple hasn’t forgotten about ‘pros’.  They fully understand their roots in the desktop publishing market and other professional industries.  It’s just that Apple has changed as a company and is now the biggest technology company in the world with a different product line from 10 years ago.  With that new found status comes priorities, increased shareholder interest and increased competition.  Perhaps the picture of where Apple is now with the general computing market is where Apple always wanted to be when they first began in the late 70’s?  I think so.&lt;/p&gt;

&lt;p&gt;Nonetheless, Apple will always give you the power to create.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>Senator Al Franken on antitrust laws and privacy</title>
   <link href="http://julianyap.com//2012/03/30/senator-al-franken-on-antitrust-laws.html"/>
   <updated>2012-03-30T11:24:00+00:00</updated>
   <id>http://julianyap.com//2012/03/30/senator-al-franken-on-antitrust-laws</id>
   <content type="html">&lt;p&gt;United States Senator Al Franken spoke to the American Bar Association last night on the topic of antitrust laws and privacy in the US. Page 18 to 27 discuss Google and Facebook.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;… accumulating data about you isn’t just a strange hobby for these corporations. It’s their whole business model. And you are not their client. You are their product.&lt;/p&gt;
&lt;/blockquote&gt;

</content>
 </entry>
 
 <entry>
   <title>iOS versus Android fragmentation</title>
   <link href="http://julianyap.com//2012/03/06/ios-versus-android-fragmentation.html"/>
   <updated>2012-03-06T13:58:00+00:00</updated>
   <id>http://julianyap.com//2012/03/06/ios-versus-android-fragmentation</id>
   <content type="html">&lt;p&gt;Chris Sauve on Android apologists:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Some folks have told me that it is unfair to compare iOS and Android on this metric because iOS is effectively just three devices (iPod Touch, iPad, iPhone), whereas Android is a multi-manufacturer ecosystem with dozens of devices. This line of thinking is extremely frustrating to me. Developers and users don’t care that the two platforms aren’t the same. Users want the most recent features and security updates, and will demand them either directly (by complaining) or indirectly (by making a different purchasing decision), and developers want a unified base to minimize testing. Android apologists can list off the differences between the two all day long but it doesn’t change the fact that more versions with smaller share is worse for, at the very least, developers and users.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For all the press that Android’s recent release Ice Cream Sandwich has received, the fact remains that from latest figures it only runs on 1.6% of devices.&lt;/p&gt;

&lt;p&gt;iOS 5 is the operating system’s most important release as it offers over the air updates.  The adoption curve for any major or minor release of iOS is now measured in days as opposed to weeks.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>The story of the compromised Linode VPS and further analysis</title>
   <link href="http://julianyap.com//2012/03/01/compromised-linode-vps.html"/>
   <updated>2012-03-01T17:40:00+00:00</updated>
   <id>http://julianyap.com//2012/03/01/compromised-linode-vps</id>
   <content type="html">&lt;p&gt;An interesting story found on Hacker News where a VPS running on Linode was compromised.  Most interesting was Marek’s “support ticket log”:http://pastebin.com/UW7iT5fj since it sounds like he is well versed technically.  Here is some of my analysis and thoughts.&lt;/p&gt;

&lt;p&gt;From the article, the root passwords were changed through the “Linode Manager” which would initially suggest a compromised Linode Manager account.&lt;/p&gt;

&lt;p&gt;The support person rules out the possibility of a brute force login attempt and Marek then asks for the records of Linode Manager logins and notices no false login records.  This would indicate to me a security compromise across Linode Manager itself through an alternative access method.  Linode has also just released a “status update”:http://status.linode.com/2012/03/manager-security-incident.html to this security incident which indicates that 8 customers had their Linode Manager account compromised which would indicate what I said is true.  The Linode Manager compromise then meant the attacker was able to target customers who ran Bitcoin servers.&lt;/p&gt;

&lt;p&gt;The support ticket then concludes with Linode admitting that yes, the Linode Manager was accessed through compromised credentials through Linode’s customer support interface.  Yes, this does mean that any Linode customer was vulnerable.&lt;/p&gt;

&lt;p&gt;Through further research, the Linode wiki “mentions”:http://www.linode.com/wiki/index.php/FAQ#How_do_I_recover_or_reset_the_root_password.3F the functionality of the root password reset:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Log into the Linode Manager and select the Linode that you wish to reset the password on. Shut down the Linode and navigate to the “Rescue” tab. From this tab, you can use the “Reset Root Password” utility to enter your desired password and apply the change. After the task has completed, you may boot your Linode and log in.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This sounds like the Linode VPS root password is reset through single user mode.&lt;/p&gt;

&lt;p&gt;Linode should immediately disable root password resets through the Linode Manager.  Root passwords should only be reset by a customer service representative and only after the identidy of the authorized user for that Linode VPS has been confirmed.&lt;/p&gt;

&lt;p&gt;Linode also states that they are further reviewing their policies which is the correct course of action.&lt;/p&gt;

</content>
 </entry>
 
 <entry>
   <title>How GitHub Tamed Free Software</title>
   <link href="http://julianyap.com//2012/02/25/how-github-tamed-free-software.html"/>
   <updated>2012-02-25T23:34:00+00:00</updated>
   <id>http://julianyap.com//2012/02/25/how-github-tamed-free-software</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;“GitHub has changed the way that people approach development,” says Tom Preston-Werner, the company’s chief technology officer. “They realize that it doesn’t have to be so complex.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From my experience, GitHub has really revolutionized the sharing of libraries and smaller code sets that you can easily clone and integrate into your own projects.  Previously free software was about monolithic standalone projects (and larger code bases) and didn’t have the emphasis on smaller libraries.  The structure of GitHub has also greatly simplified the process of contributing and importantly accepting code changes to an upstream project.&lt;/p&gt;

&lt;p&gt;The other site I use often is “Stack Overflow”:http://stackoverflow.com which in one sense further breaks down code in a social question and answer format.  With Stack Overflow code is broken down into individual functions, modules and lines of code.&lt;/p&gt;

&lt;p&gt;Interestingly the Wired article has a recent picture of Linus Torvalds and it looks like he is running Linux on an 11” MacBook Air.&lt;/p&gt;

</content>
 </entry>
 
 
</feed>
