[Valid RSS] This is a valid RSS feed.


This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <rss version="2.0" xmlns:atom="">
  3. <channel>
  4.   <title></title>
  5.   <description>A personal weblog by ckunte</description>
  6.   <atom:link href="" rel="self" type="application/rss+xml"/>
  7.   <link></link>
  8.   <language>en-us</language>
  10.    <item>
  11.      <title>-No- TLS</title>
  12.      <link></link>
  13.      <guid></guid>
  14.      <pubDate>Tue, 06 Feb 2018 00:00:00 GMT</pubDate>
  15.      <description>
  16.        &lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I&amp;rsquo;ve now enabled TLS on this site, and url auto-redirection to https is now in effect. This should now all be seamless.&lt;/p&gt;
  17. &lt;hr /&gt;
  18. &lt;p&gt;About a month ago, I turned-down the no-index switch on my site &amp;mdash; a directive it carried since 2010, and Google like clock-work promptly &lt;a href=&#34;;amp;tbs=qdr:y&#34;&gt;elevated it&lt;/a&gt; to the top of its &amp;ldquo;Past year&amp;rdquo; search results. It looked fine, until I noticed https prefixed to my site URL. But I am not serving my site over https, so this is annoying. Let me explain.&lt;/p&gt;
  19. &lt;p&gt;If a site seeks visitor&amp;rsquo;s inputs &amp;mdash; secret or otherwise, then &lt;a href=&#34;;&gt;TLS&lt;/a&gt; (encrypting user information/query before transmission) is warranted. But my site is just a catalogue of information, and it seeks no information from a visitor, and so there&amp;rsquo;s no user interaction to protect. As a result, there is no need for transport layer security. In other words, I serve my site over http by design.&lt;/p&gt;
  20. &lt;p&gt;But when a non-https site is accessed through https protocol (thanks Google for incorrectly prefixing my site with https), the browser throws up a cautionary security warning &amp;mdash; usually forcing an unsuspecting visitor to backtrack. So, going from complete-obscurity to being-warned-to-stay-away must be progress, I guess.&lt;/p&gt;
  21.        &lt;hr&gt;
  22.        &lt;p&gt;
  23.          &lt;i&gt;Terms of use: &lt;a href=""&gt;;/a&gt;&lt;/i&gt;
  24.        &lt;/p&gt;
  25.      </description>
  26.    </item>
  28.    <item>
  29.      <title>TLP</title>
  30.      <link></link>
  31.      <guid></guid>
  32.      <pubDate>Sun, 07 Jan 2018 00:00:00 GMT</pubDate>
  33.      <description>
  34.        &lt;p&gt;While recuperating from an injury, I scoured the internet for information on &lt;a href=&#34;; title=&#34;Tension-leg platform&#34;&gt;TLPs&lt;/a&gt; at the behest of a colleague &amp;mdash; anything to distract myself from the pain. By Friday, I was able to assemble &lt;a href=&#34;; title=&#34;TLPs&#34;&gt;a list&lt;/a&gt;. Here&amp;rsquo;s a summary.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:1&#34; rel=&#34;footnote&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
  35. &lt;p&gt;&lt;img alt=&#34;TLP: Displacement v. Topside weight&#34; class=&#34;screen&#34; src=&#34;/images/tlp_disp_vs_topsidewt.png&#34;&gt;
  36. &lt;img alt=&#34;TLP: Water depth v. Topside weight&#34; class=&#34;screen&#34; src=&#34;/images/tlp_depth_vs_topsidewt.png&#34;&gt;&lt;/p&gt;
  37. &lt;p&gt;It is interesting to note that the largest TLPs, viz., Snorre A and Heidrun are both owned by Statoil. In terms of weights and displacements, these two are literally off the chart when compared with the rest &amp;mdash; an incredible feat.&lt;/p&gt;
  38. &lt;p&gt;Here is the plot code:&lt;/p&gt;
  39. &lt;pre&gt;&lt;code&gt;#!/usr/bin/env python
  40. # -*- coding: UTF-8 -*-
  41. &#34;&#34;&#34;
  44. Created by ckunte on 01/07/2018.
  45. &#34;&#34;&#34;
  46. import numpy as np
  47. import matplotlib.pyplot as plt
  49. tlpdata = np.loadtxt(&#39;tlp.csv&#39;, dtype=&#39;int,int,int&#39;, \
  50.    delimiter=&#39;,&#39;, usecols=(2, 3, 4), \
  51.    unpack=True, skiprows=1)
  53. disp = tlpdata[0]
  54. topside = tlpdata[1]
  55. depth = tlpdata[2]
  57. def topside_disp():
  58.    plt.scatter(topside, disp, c=&#39;blue&#39;, alpha=0.45)
  59.    plt.ylabel(&#39;Displacement (t)&#39;)
  61. def topside_depth():
  62.    plt.scatter(topside, depth, c=&#39;red&#39;, alpha=0.45)
  63.    plt.ylabel(&#39;Water depth (m)&#39;)
  65. def plotoptions():
  66.    plt.xlabel(&#39;Topside weght (t)&#39;)
  67.    plt.xlim(xmin=0)
  68.    plt.ylim(ymin=0)
  69.    plt.grid()
  71. if __name__ == &#39;__main__&#39;:
  72.    print
  73.    print &#34;Options:&#34;
  74.    print &#34; 0: Exit&#34;
  75.    print &#34; 1: Plot topside v. displacement&#34;
  76.    print &#34; 2: Plot topside v. water depth&#34;
  77.    ptype = input(&#34;Select option: &#34;)
  78.    if ptype == 1:
  79.        topside_disp()
  80.        plotoptions()
  81.        plt.savefig(&#39;tlp_disp_vs_topsidewt.png&#39;)
  82.    elif ptype == 2:
  83.        topside_depth()
  84.        plotoptions()
  85.        plt.savefig(&#39;tlp_depth_vs_topsidewt.png&#39;)
  86.    else:
  87.        print &#34;No plot options were chosen.&#34;
  88. &lt;/code&gt;&lt;/pre&gt;
  89. &lt;div class=&#34;footnote&#34;&gt;
  90. &lt;hr /&gt;
  91. &lt;ol&gt;
  92. &lt;li id=&#34;fn:1&#34;&gt;
  93. &lt;p&gt;There may be a few more than listed; I just don&amp;rsquo;t have enough info. without going through paid subscriptions like WoodMac.&amp;#160;&lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:1&#34; rev=&#34;footnote&#34; title=&#34;Jump back to footnote 1 in the text&#34;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
  94. &lt;/li&gt;
  95. &lt;/ol&gt;
  96. &lt;/div&gt;
  97.        &lt;hr&gt;
  98.        &lt;p&gt;
  99.          &lt;i&gt;Terms of use: &lt;a href=""&gt;;/a&gt;&lt;/i&gt;
  100.        &lt;/p&gt;
  101.      </description>
  102.    </item>
  104.    <item>
  105.      <title>NAS</title>
  106.      <link></link>
  107.      <guid></guid>
  108.      <pubDate>Mon, 25 Dec 2017 00:00:00 GMT</pubDate>
  109.      <description>
  110.        &lt;p&gt;QNAP TS-251+ would be an ideal choice for a personal &lt;a href=&#34;;&gt;NAS&lt;/a&gt;, but at &amp;euro;500.-, it&amp;rsquo;s expensive for my humble needs. Someday I might upgrade to one of these with all the bells and whistles, and may even have it run &lt;a href=&#34;;&gt;ZFS&lt;/a&gt;; just not today. For now, I&amp;rsquo;ve opted to build one from scratch at one-twelfth its cost.&lt;/p&gt;
  111. &lt;p&gt;Functional requirements:&lt;/p&gt;
  112. &lt;ol&gt;
  113. &lt;li&gt;Low cost and tiny footprint&lt;/li&gt;
  114. &lt;li&gt;Setup on an &lt;a href=&#34;;&gt;Apple Airport&lt;/a&gt; powered home router&lt;/li&gt;
  115. &lt;li&gt;Secure personal cloud with access worldwide&lt;/li&gt;
  116. &lt;li&gt;Very low power consumption&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:1&#34; rel=&#34;footnote&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, so that it can stay alive by sharing a low capacity UPS with my wireless network router&lt;/li&gt;
  117. &lt;/ol&gt;
  118. &lt;p&gt;I realised I could satisfy the above requirements by simply re-purposing my &amp;euro;40.- Raspberry Pi for this task. It took the following 3 workflows to get it working&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:2&#34; rel=&#34;footnote&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
  119. &lt;h3&gt;1. Raspberry Pi setup&lt;/h3&gt;
  120. &lt;ol&gt;
  121. &lt;li&gt;Raspbian lite image installed&lt;/li&gt;
  122. &lt;li&gt;Defaults changed&lt;/li&gt;
  123. &lt;li&gt;&lt;a href=&#34;;&gt;SSH&lt;/a&gt; enabled with &lt;a href=&#34;;&gt;access via public key&lt;/a&gt;, and &lt;/li&gt;
  124. &lt;li&gt;Hardened for security&lt;/li&gt;
  125. &lt;/ol&gt;
  126. &lt;h3&gt;2. Home router setup&lt;/h3&gt;
  127. &lt;ol&gt;
  128. &lt;li&gt;Pi&amp;rsquo;s local IP address reserved under &lt;em&gt;Network tab &amp;rarr; DHCP Reservations&lt;/em&gt;&lt;/li&gt;
  129. &lt;li&gt;Port-forwarding set up under &lt;em&gt;Network tab &amp;rarr; Port Settings&lt;/em&gt;&lt;/li&gt;
  130. &lt;/ol&gt;
  131. &lt;h3&gt;3. DDNS setup&lt;/h3&gt;
  132. &lt;ol&gt;
  133. &lt;li&gt;DDNS records updated on service provider&amp;rsquo;s control panel to map a private domain I own&lt;/li&gt;
  134. &lt;li&gt;Pi&amp;rsquo;s IP address setup to refresh periodically using Anacron&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:3&#34; rel=&#34;footnote&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
  135. &lt;/ol&gt;
  136. &lt;h3&gt;NAS access&lt;/h3&gt;
  137. &lt;p&gt;Currently set up to be accessible only via a shell on a custom port. For login, I run a command like below:&lt;/p&gt;
  138. &lt;pre&gt;&lt;code&gt;ssh &amp;lt;userid&amp;gt;@&amp;lt;privatedomain&amp;gt; -p &amp;lt;custom port&amp;gt;
  139. &lt;/code&gt;&lt;/pre&gt;
  140. &lt;p&gt;But mostly, I use &lt;a href=&#34;;&gt;rsync&lt;/a&gt; to download or upload files (or folders), and &lt;a href=&#34;;&gt;git&lt;/a&gt; to push or pull code from my private repositories &amp;mdash; since my NAS also functions as a private git server.&lt;/p&gt;
  141. &lt;pre&gt;&lt;code&gt;rsync -auvz -e &#39;ssh -p &amp;lt;custom port&amp;gt;&#39; &amp;lt;userid&amp;gt;@&amp;lt;privatedomain&amp;gt;:/home/&amp;lt;userid&amp;gt;/d/somefile.pdf ./somefile.pdf
  142. &lt;/code&gt;&lt;/pre&gt;
  143. &lt;p&gt;Unlike most NAS, my drives stay disconnected and need a human to connect it physically before I can mount a drive virtually and then access files on it &amp;mdash; this is by design.&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:4&#34; rel=&#34;footnote&#34;&gt;4&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
  144. &lt;h3&gt;NAS access from restricted networks&lt;/h3&gt;
  145. &lt;p&gt;Occasionally, I have to deal with networks that restrict outgoing SSH connections. For this, I use &lt;a href=&#34;;&gt;Corkscrew&lt;/a&gt; to tunnel through https proxies via ports, e.g., 443, which restricted networks do not typically block to avoid service disruptions. So, if I use port 443 as an example to tunnel through a proxy, then the login command becomes:&lt;/p&gt;
  146. &lt;pre&gt;&lt;code&gt;ssh &amp;lt;userid&amp;gt;@&amp;lt;privatedomain&amp;gt; -D 443 -p &amp;lt;custom port&amp;gt;
  147. &lt;/code&gt;&lt;/pre&gt;
  148. &lt;p&gt;Configuring is very simple, just add a &lt;code&gt;config&lt;/code&gt; file to &lt;code&gt;.ssh&lt;/code&gt; folder with the following details:&lt;/p&gt;
  149. &lt;pre&gt;&lt;code&gt;ProxyCommand /usr/local/bin/corkscrew &amp;lt;proxy server&amp;gt; 80 %h %p
  150. &lt;/code&gt;&lt;/pre&gt;
  151. &lt;p&gt;Replace &lt;code&gt;&amp;lt;proxy server&amp;gt;&lt;/code&gt; with the actual proxy address, and you&amp;rsquo;re good to go. For a select host, this can be as follows:&lt;/p&gt;
  152. &lt;pre&gt;&lt;code&gt;Host &amp;lt;privatedomain&amp;gt;
  153. ProxyCommand /usr/local/bin/corkscrew &amp;lt;proxy server&amp;gt; 80 %h %p
  154. &lt;/code&gt;&lt;/pre&gt;
  155. &lt;p&gt;When not needed to tunnel-through, I just rename &lt;code&gt;config&lt;/code&gt; to &lt;code&gt;_config&lt;/code&gt; to turn-off http(s) tunnelling.&lt;/p&gt;
  156. &lt;h3&gt;Mosh&lt;/h3&gt;
  157. &lt;p&gt;The NAS is also &lt;a href=&#34;; title=&#34;Mosh: the mobile shell&#34;&gt;mobile shell&lt;/a&gt; enabled &amp;mdash; to allow roaming + intermittent connectivity.&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a class=&#34;footnote-ref&#34; href=&#34;#fn:5&#34; rel=&#34;footnote&#34;&gt;5&lt;/a&gt;&lt;/sup&gt; As mosh works over UDP, I had to allow a port range, and install &lt;code&gt;iptables-persistent&lt;/code&gt;.&lt;/p&gt;
  158. &lt;pre&gt;&lt;code&gt;sudo iptables -I INPUT 1 -p udp --dport 60000:61000 -j ACCEPT
  159. sudo service iptables save
  160. sudo apt install iptables-persistent
  161. &lt;/code&gt;&lt;/pre&gt;
  162. &lt;div class=&#34;footnote&#34;&gt;
  163. &lt;hr /&gt;
  164. &lt;ol&gt;
  165. &lt;li id=&#34;fn:1&#34;&gt;
  166. &lt;p&gt;In a country where power fluctuates like flashing lights on a Christmas tree, the only way to stay alive during critical differential backup routines is to consume less power.&amp;#160;&lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:1&#34; rev=&#34;footnote&#34; title=&#34;Jump back to footnote 1 in the text&#34;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
  167. &lt;/li&gt;
  168. &lt;li id=&#34;fn:2&#34;&gt;
  169. &lt;p&gt;You&amp;rsquo;ll note that this is not a step-wise how-to post. Instead, I&amp;rsquo;m keeping it high-level with key steps that matter for a successful setup, and by which I mean some steps may require one to research and follow instructions elsewhere.&amp;#160;&lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:2&#34; rev=&#34;footnote&#34; title=&#34;Jump back to footnote 2 in the text&#34;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
  170. &lt;/li&gt;
  171. &lt;li id=&#34;fn:3&#34;&gt;
  172. &lt;p&gt;I use Anacron since I don&amp;rsquo;t necessarily find the need to keep the Pi accessible 24&amp;times;7, but only on days I think I need access. Periodic update is needed for home internet connections with dynamically assigned IP addresses by ISPs.&amp;#160;&lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:3&#34; rev=&#34;footnote&#34; title=&#34;Jump back to footnote 3 in the text&#34;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
  173. &lt;/li&gt;
  174. &lt;li id=&#34;fn:4&#34;&gt;
  175. &lt;p&gt;Also to conserve power, I&amp;rsquo;ve turned off display power circuitry on the Pi by disabling HDMI (via &lt;em&gt;/usr/bin/tvservice -o&lt;/em&gt;; &lt;em&gt;-p&lt;/em&gt; would enable it again).&amp;#160;&lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:4&#34; rev=&#34;footnote&#34; title=&#34;Jump back to footnote 4 in the text&#34;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
  176. &lt;/li&gt;
  177. &lt;li id=&#34;fn:5&#34;&gt;
  178. &lt;p&gt;&lt;em&gt;mosh&lt;/em&gt; is installed on both the client and the server.&amp;#160;&lt;a class=&#34;footnote-backref&#34; href=&#34;#fnref:5&#34; rev=&#34;footnote&#34; title=&#34;Jump back to footnote 5 in the text&#34;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
  179. &lt;/li&gt;
  180. &lt;/ol&gt;
  181. &lt;/div&gt;
  182.        &lt;hr&gt;
  183.        &lt;p&gt;
  184.          &lt;i&gt;Terms of use: &lt;a href=""&gt;;/a&gt;&lt;/i&gt;
  185.        &lt;/p&gt;
  186.      </description>
  187.    </item>
  189.    <item>
  190.      <title>Perth</title>
  191.      <link></link>
  192.      <guid></guid>
  193.      <pubDate>Sun, 01 Oct 2017 00:00:00 GMT</pubDate>
  194.      <description>
  195.        &lt;p&gt;It was my first visit to Australia. I arrived on Sunday, September 17 at the Perth international airport. While passing through immigration, the officer at the counter did not stamp my passport. I had the presence of mind to ask, and she replied, &amp;ldquo;We don&amp;rsquo;t do it anymore.&amp;rdquo;&lt;/p&gt;
  196. &lt;p&gt;Next day, I walked in to the office to see this gorgeous Lego model in the lobby. About ten years ago, I worked on its mooring system, sitting in another corner of the world between 2008-11, when it was still just a concept. It&amp;rsquo;s &lt;a href=&#34;; title=&#34;Mooring the largest floating facility ever built | Shell&#39;s Prelude - YouTube&#34;&gt;being moored&lt;/a&gt; at its intended final location &amp;mdash; as we speak.&lt;/p&gt;
  197. &lt;p&gt;&lt;img alt=&#34;Prelude FLNG&#34; src=&#34;/images/perth-prelude-lego.jpg&#34; /&gt;&lt;/p&gt;
  198. &lt;p&gt;After pleasantries and security clearances, I was given building access. I worked from 8am until 7pm on most days, and so there wasn&amp;rsquo;t much of an opportunity to visit the CBD after work, since it would be closed after 5pm. I thought Thursday would be open until 9pm, but it wasn&amp;rsquo;t so when I did &amp;mdash; shops were all closed. I later learned that CBD would be open until 9pm on Friday instead. &lt;/p&gt;
  199. &lt;p&gt;My plan was to stay the weekend, work part of the following week, and catch a return flight on Wednesday. However, I soon realised that Monday (Sep 21) was a holiday in Perth. To avoid staying the long weekend, I managed to rearrange my return flight to be on Saturday.&lt;/p&gt;
  200. &lt;p&gt;The layover was long at Singapore, but apparently not long enough. I killed time between walking the three terminals and sitting long stretches in two transit lounges. Had lunch in one, and supper in the other. My onward flight to Bangalore was at 20:05. I arrived at the gate half-hour ahead of time, boarded the flight, and waited. The flight began to taxi towards the runway, and got stopped mid-way. The reason: the flight ahead of us was experiencing some mechanical problems, and needed to be towed away. &lt;/p&gt;
  201. &lt;p&gt;Towing the flight in front of us took close to two hours. Finally, the Captain spoke to inform us that our flight had lost enough fuel waiting, and had to return back to refuelling station. After another half-hour, we were on our way. I landed in Bangalore without incident albeit two hours later than expected.&lt;/p&gt;
  202.        &lt;hr&gt;
  203.        &lt;p&gt;
  204.          &lt;i&gt;Terms of use: &lt;a href=""&gt;;/a&gt;&lt;/i&gt;
  205.        &lt;/p&gt;
  206.      </description>
  207.    </item>
  209.    <item>
  210.      <title>Make</title>
  211.      <link></link>
  212.      <guid></guid>
  213.      <pubDate>Sat, 19 Aug 2017 00:00:00 GMT</pubDate>
  214.      <description>
  215.        &lt;p&gt;Returning from &lt;a href=&#34;; title=&#34;The Tamara Coorg&#34;&gt;the Tamara in Coorg&lt;/a&gt; last week, my only vacation this year, I knew my following week would be nothing short of a back-breaking stone quarry work. So on Monday, just as I was about to get-on, my otherwise reliable work notebook began flashing BSOD. Post frantic calls to IT helpdesk, they dispatched a helpful hardware engineer at running speed. While he patiently went through system diagnostics, I kept my crushed look in-check. In the end, he said it&amp;rsquo;s software, and the book needs a wipe + reimage routine. I lifted my hands up in exasperation, thinking about my planned work week that just got flushed. &lt;/p&gt;
  216. &lt;p&gt;The good thing is that on any given day, I am fully backed-up and up to speed. Ten years ago when I got hit by a bad crash, I vowed to never let this happen to me again. So, everyday my scripts run for about ten minutes before I call it a day, differentially backing everything-up with the ever reliable &lt;a href=&#34;; title=&#34;rsync&#34;&gt;rsync&lt;/a&gt;. So when he asked if I needed more time to manage my data on disk, I said no, and that he should continue. The engineer then proceeded to reimage my machine, while I sat twiddling pencil on print-outs, still hoping to get some work done. Here&amp;rsquo;s the thing though, and I am trying very hard not to swear, the official images are &lt;em&gt;never&lt;/em&gt; up to speed! This makes any freshly reimaged machine all but usable for the next 48 hours, as auto-downloading updates and profiled software, punctuated by countless reboots, completely consumes the computer. It&amp;rsquo;s often longer as these down-the-wire updates need the corporate hose.&lt;/p&gt;
  217. &lt;p&gt;While waiting for my machine to be back on its feet, my thoughts wandered around about the backup routine, the tools I&amp;rsquo;ve been using, and our pleasant stay at the Tamara. Then I remembered &lt;a href=&#34;; title=&#34;Add makefile by lexruee - Pull Request #3 for ckunte/sfware&#34;&gt;merging a pull request&lt;/a&gt; (on my phone) from R&amp;uuml;edlinger, while still on vacation, who wrote a helpful &lt;code&gt;Makefile&lt;/code&gt; for the repo. Inspired by this, and by &lt;a href=&#34;; title=&#34;Afraid of Makefiles? Don&#39;t be! - Matthias Endler&#34;&gt;Endler&amp;rsquo;s wonderful post&lt;/a&gt;, I thought of making one for all my backup/restore routines too, which would simplify my scattered backup shell scripts into just one &lt;code&gt;Makefile&lt;/code&gt;. So, I &lt;a href=&#34;; title=&#34;My Makefile for backups&#34;&gt;wrote one&lt;/a&gt; this week.&lt;/p&gt;
  218. &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;code&gt;Makefile&lt;/code&gt; is fussy about its format: [i] Tabs only (no spaces!) of indent-size 4; [ii] No inline comments to ensure predictable behaviour.&lt;/p&gt;
  219. &lt;p&gt;Now instead of running different shell scripts, I just have to run &lt;code&gt;make backup&lt;/code&gt; (or &lt;code&gt;time make backup&lt;/code&gt; to also know the time taken) or &lt;code&gt;make restore&lt;/code&gt; (or &lt;code&gt;time make restore&lt;/code&gt;) in the terminal and be done with it. The &lt;a href=&#34;; title=&#34;My Makefile for backups&#34;&gt;Makefile&lt;/a&gt; also can run only select pre-defined folders, e.g., I can only choose to backup current projects with &lt;code&gt;make curr&lt;/code&gt;, and so on. If I run only &lt;code&gt;make&lt;/code&gt;, then it offers these options:&lt;/p&gt;
  220. &lt;pre&gt;&lt;code&gt;ckunte at air in ~
  221. $ make
  222. Makefile for backup and restore routines
  224. Usage:
  225.    make backup    backup all mail projects references
  226.    make restore   restore all mail projects references
  227.    make mail      backup all mail
  228.    make proj      backup all projects
  229.    make curr      backup only current projects
  230.    make past      backup only past projects
  231.    make ref       backup all references
  232.    make cref      backup only current references
  233.    make pref      backup only past references
  234. &lt;/code&gt;&lt;/pre&gt;
  235. &lt;p&gt;With &lt;code&gt;time&lt;/code&gt; option (as in &lt;code&gt;time make backup&lt;/code&gt;), &lt;code&gt;5:44.57&lt;/code&gt; in the example below is the real (clock) time (listed in in this example) the job takes to complete.&lt;/p&gt;
  236. &lt;pre&gt;&lt;code&gt;sent 1,382,904,905 bytes  received 118 bytes  4,014,238.09 bytes/sec
  237. total size is 4,753,411,072  speedup is 3.44
  238. make mail  17.20s user 48.51s system 19% cpu 5:44.57 total
  239. &lt;/code&gt;&lt;/pre&gt;
  240. &lt;p&gt;This downtime gave me a pause, and an opportunity to &lt;a href=&#34;;&gt;make&lt;/a&gt; my workflow simpler, which I think isn&amp;rsquo;t bad at all.&lt;/p&gt;
  241. &lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; If one has symlinks with name same as the command in make file (e.g., if one has &lt;em&gt;curr&lt;/em&gt; symlink in the same folder as &lt;em&gt;Makefile&lt;/em&gt;), then &lt;code&gt;rsync&lt;/code&gt; says &lt;code&gt;curr&lt;/code&gt; is up to date, even if source and destination &lt;code&gt;curr&lt;/code&gt; folders are not identical! To avoid this error, ensure symlink names are not identical to make commands in &lt;em&gt;Makefile&lt;/em&gt;.&lt;/p&gt;
  242.        &lt;hr&gt;
  243.        &lt;p&gt;
  244.          &lt;i&gt;Terms of use: &lt;a href=""&gt;;/a&gt;&lt;/i&gt;
  245.        &lt;/p&gt;
  246.      </description>
  247.    </item>
  249. </channel>
  250. </rss>

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda