<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0"><id>tag:blogger.com,1999:blog-5903482920942648511</id><updated>2025-11-06T18:51:17.527+08:00</updated><category term="Play"/><category term="Work"/><category term="In-between"/><category term="linux"/><category term="status"/><category term="fun"/><category term="google"/><category term="web"/><category term="tech"/><category term="cli"/><category term="opensource"/><category term="family"/><category term="blogging"/><category term="pfi"/><category term="humor"/><category term="internet"/><category term="geek"/><category term="cool"/><category term="design"/><category term="lego"/><category term="howto"/><category term="julian"/><category term="mobile"/><category term="books"/><category term="ict4d"/><category term="news"/><category term="toys"/><category term="flickr"/><category term="robotsunday"/><category term="ubuntu"/><category term="fedora"/><category term="personal"/><category term="robots"/><category term="tips"/><category term="art"/><category term="minifigures"/><category term="network"/><category term="rss"/><category term="wordpress"/><category term="feeds"/><category term="gmail"/><category term="movies"/><category term="programming"/><category term="research"/><category term="security"/><category term="agriculture"/><category term="javascript"/><category term="life"/><category term="tools"/><category term="watching"/><category term="comics"/><category term="firefox"/><category term="gabriel"/><category term="gadget"/><category term="ltsp"/><category term="photography"/><category term="qotd"/><category term="reading"/><category term="science"/><category term="search"/><category term="unix"/><category term="wireless"/><category term="bash"/><category term="cms"/><category term="funny"/><category term="games"/><category term="maps"/><category term="microsoft"/><category term="redhat"/><category term="scripting"/><category term="wifi"/><category term="writing"/><category term="yahoo"/><category term="email"/><category term="gaiman"/><category term="geocoding"/><category term="hacks"/><category term="mac"/><category term="media"/><category term="pinoytech"/><category term="robotics"/><category term="ssh"/><category term="suse"/><category term="apple"/><category term="delicious"/><category term="feedburner"/><category term="hardware"/><category term="pinoy"/><category term="politics"/><category term="productivity"/><category term="space"/><category term="tagging"/><category term="tumblog"/><category term="twitter"/><category term="xml"/><category term="atom"/><category term="birthday"/><category term="china"/><category term="colors"/><category term="coredump"/><category term="css"/><category term="food"/><category term="im"/><category term="jobhunt"/><category term="mapping"/><category term="music"/><category term="plug"/><category term="scifi"/><category term="typography"/><category term="astronomy"/><category term="blog"/><category term="certification"/><category term="coding"/><category term="corporate"/><category term="eee"/><category term="film"/><category term="hacking"/><category term="health"/><category term="mashup"/><category term="math"/><category term="mozilla"/><category term="peng"/><category term="perl"/><category term="photos"/><category term="pipes"/><category term="python"/><category term="review"/><category term="series1"/><category term="series2"/><category term="sms"/><category term="svn"/><category term="2007"/><category term="3g"/><category term="apache"/><category term="christmas"/><category term="cisco"/><category term="college"/><category term="diecasts"/><category term="digitalpinay"/><category term="domains"/><category term="drupal"/><category term="elearning"/><category term="flickrdl"/><category term="gab"/><category term="gps"/><category term="intel"/><category term="journalism"/><category term="links"/><category term="literature"/><category term="natalieportman"/><category term="openoffice.org"/><category term="philippines"/><category term="philosophy"/><category term="php"/><category term="picasa"/><category term="poetry"/><category term="reference"/><category term="remote"/><category term="resume"/><category term="school"/><category term="spam"/><category term="starwars"/><category term="stupid"/><category term="subversion"/><category term="usability"/><category term="vi"/><category term="visualization"/><category term="wiki"/><category term="windows"/><category term="xhtml"/><category term="yum"/><category term="zhangziyi"/><category term="God"/><category term="aix"/><category term="android"/><category term="antivirus"/><category term="aol"/><category term="aprilfools"/><category term="asthma"/><category term="authentication"/><category term="authors"/><category term="avg"/><category term="aws"/><category term="baby"/><category term="barcampmanila"/><category term="bayan"/><category term="braille"/><category term="browsers"/><category term="canon"/><category term="captcha"/><category term="cars"/><category term="cartoonnetwork"/><category term="causes"/><category term="censorship"/><category term="children"/><category term="chromium"/><category term="cloud"/><category term="connectivity"/><category term="coverflow"/><category term="craft"/><category term="cyberpunk"/><category term="dell"/><category term="desktop"/><category term="digg"/><category term="dilbert"/><category term="diy"/><category term="dotph"/><category term="dsl"/><category term="e63"/><category term="earth"/><category term="easter"/><category term="edge"/><category term="education"/><category term="electronics"/><category term="eraserheads"/><category term="events"/><category term="expresscard"/><category term="extensions"/><category term="football"/><category term="free"/><category term="freebie"/><category term="friendfeed"/><category term="friends"/><category term="gadgets"/><category term="geeks"/><category term="gifts"/><category term="github"/><category term="globe"/><category term="gnome"/><category term="gprs"/><category term="greasemonkey"/><category term="hack"/><category term="help"/><category term="holidays"/><category term="hype"/><category term="i18n"/><category term="identity"/><category term="illustrations"/><category term="infoviz"/><category term="ipad"/><category term="ipod"/><category term="iptables"/><category term="jeonjihyun"/><category term="k2"/><category term="kerberos"/><category term="kernel"/><category term="kids"/><category term="l10n"/><category term="labels"/><category term="linkedin"/><category term="macbookair"/><category term="madness"/><category term="madonna"/><category term="minicooper"/><category term="minis"/><category term="moleskine"/><category term="movabletype"/><category term="mutt"/><category term="mythbusting"/><category term="nagios"/><category term="nicolekidman"/><category term="nokia"/><category term="nostalgia"/><category term="notebook"/><category term="notebooks"/><category term="office"/><category term="offline"/><category term="olpc"/><category term="openshift"/><category term="origami"/><category term="party"/><category term="paul"/><category term="pcmcia"/><category term="phishing"/><category term="photoshop"/><category term="pldt"/><category term="plugin"/><category term="prayers"/><category term="proxy"/><category term="rails"/><category term="recipe"/><category term="rememberthemilk"/><category term="rfc"/><category term="rh300"/><category term="rhce"/><category term="ror"/><category term="ruby"/><category term="safari"/><category term="sassy"/><category term="screen"/><category term="secondhand"/><category term="series3"/><category term="shopping"/><category term="singlesignon"/><category term="smtp"/><category term="socialexperiment"/><category term="society"/><category term="software"/><category term="solaris"/><category term="sports"/><category term="sql"/><category term="stats"/><category term="sugar"/><category term="summer"/><category term="tags"/><category term="telnet"/><category term="tor"/><category term="toy"/><category term="trendmicro"/><category term="troll"/><category term="updates"/><category term="usb"/><category term="verisign"/><category term="versioncontrol"/><category term="visibility"/><category term="weroam"/><category term="wired"/><category term="wishlist"/><category term="wolframalpha"/><category term="wordcamp"/><category term="workplace"/><category term="xkcd"/><category term="youth"/><title type="text">Coredump</title><subtitle type="html">Hi, I'm Ian, and this is my blog. Here, I mostly rant and rave about life and technology, and how it affects me at work, at play, and in anything in-between.</subtitle><link href="http://blog.iandexter.net/feeds/posts/default" rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/" rel="alternate" type="text/html"/><link href="http://pubsubhubbub.appspot.com/" rel="hub"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default?start-index=26&amp;max-results=25" rel="next" type="application/atom+xml"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><generator uri="http://www.blogger.com" version="7.00">Blogger</generator><openSearch:totalResults>689</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-2697365556603937050</id><published>2014-12-09T12:01:00.000+08:00</published><updated>2014-12-09T12:10:40.765+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="android"/><category scheme="http://www.blogger.com/atom/ns#" term="cli"/><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><category scheme="http://www.blogger.com/atom/ns#" term="Play"/><title type="text">Pull files off Android phone</title><content type="html">&lt;p&gt;This assumes you have &lt;a href="http://developer.android.com/tools/help/adb.html"&gt;Android Debug Bridge (ADB)&lt;/a&gt; installed. This will pull all files from a directory in an Android phone.&lt;/p&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;cd /path/to/destination/directory
adb pull /path/to/source .&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;As Julian says, "Easy-peasy, lemon squeezy."&lt;/p&gt;&lt;br /&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJTwdriHgsrrtURjNcBMD1ipm3IxpLpB-xnrT93vS7kQsYjflr0yJae_Ei4rKuoPFARZ5iR_VTI7_8_FFLDAdUeVJuqWLapqre5V8UERqgwgg_DlLJ0j5IG81Fq_Y6Upd5UmRcb_KMC5Nl/s1600/Screenshot+2014-12-09+11.51.13.png" imageanchor="1" &gt;&lt;img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJTwdriHgsrrtURjNcBMD1ipm3IxpLpB-xnrT93vS7kQsYjflr0yJae_Ei4rKuoPFARZ5iR_VTI7_8_FFLDAdUeVJuqWLapqre5V8UERqgwgg_DlLJ0j5IG81Fq_Y6Upd5UmRcb_KMC5Nl/s1600/Screenshot+2014-12-09+11.51.13.png" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;(I use this, by the way, since the Nexus 5 and OS X Mavericks refuse to work together in USB mode.)&lt;/p&gt;</content><link href="http://blog.iandexter.net/feeds/2697365556603937050/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2014/12/pull-files-off-android-phone.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/2697365556603937050" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/2697365556603937050" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2014/12/pull-files-off-android-phone.html" rel="alternate" title="Pull files off Android phone" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJTwdriHgsrrtURjNcBMD1ipm3IxpLpB-xnrT93vS7kQsYjflr0yJae_Ei4rKuoPFARZ5iR_VTI7_8_FFLDAdUeVJuqWLapqre5V8UERqgwgg_DlLJ0j5IG81Fq_Y6Upd5UmRcb_KMC5Nl/s72-c/Screenshot+2014-12-09+11.51.13.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-1785314177303714286</id><published>2014-12-06T00:20:00.002+08:00</published><updated>2014-12-06T00:24:57.367+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cli"/><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><category scheme="http://www.blogger.com/atom/ns#" term="Play"/><title type="text">Open URL in Chrome incognito mode from Terminal</title><content type="html">&lt;blockquote&gt;&lt;pre&gt;/usr/bin/open -a "Google Chrome Canary" &amp;lt;url&amp;gt; --args --incognito&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
&lt;p&gt;(Works in 10.10.1, at least.)&lt;/p&gt;</content><link href="http://blog.iandexter.net/feeds/1785314177303714286/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2014/12/open-url-in-chrome-incognito-mode-from.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/1785314177303714286" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/1785314177303714286" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2014/12/open-url-in-chrome-incognito-mode-from.html" rel="alternate" title="Open URL in Chrome incognito mode from Terminal" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-3134219856029095284</id><published>2014-06-07T00:00:00.000+08:00</published><updated>2018-01-09T11:24:24.540+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="family"/><category scheme="http://www.blogger.com/atom/ns#" term="God"/><category scheme="http://www.blogger.com/atom/ns#" term="In-between"/><category scheme="http://www.blogger.com/atom/ns#" term="life"/><category scheme="http://www.blogger.com/atom/ns#" term="personal"/><title type="text">Answered prayers</title><content type="html">&lt;div&gt;
&lt;span style="color: #1d2129; letter-spacing: -0.12px;"&gt;[tl;dr: God delivers. :-)]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;We started the year full of plans filled with hope and expectations. Some plans fell through, others were fulfilled in ways beyond what we imagined.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;In January, I went to Amsterdam for a job interview. It was exhilarating: my first time in Europe, interviewing for a dream job. I got to travel for free! Sadly, the offer didn't materialize.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;But, a few days after that, we received better news: kuya Gab got accepted to Pisay. That started the ball rolling as we brainstormed on whether to have him reside in a dorm or relocate with the entire family. We decided on the latter.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;After that, it was a mad scramble to look for a suitable place. There were doubts, for sure: can we financially support this, how will the kids cope? But one by one, the pieces fell into place.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;Through a church friend, we met people in Clark who helped point us in the right direction. We leased a unit inside Clark, very near Pisay. In a matter of days, we closed the deal.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;It took a while to kink out the details, and after the turnover during the first week of May, we found out that we had a lot of work ahead to improve the house: the air-conditioning unit was missing, the kitchen sink and counter were damaged, plumbing in the bathroom didn't work. The house wasn't lived in for more than a year so one can imagine all the gunk we had to strip off the place.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;Again, it was a mad dash with lots of hand-waving and hair-pulling, until we got our acts together, and systematically, in a matter of days -- just last week! -- began in the home improvement marathon that would rival reality TV shows.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;In between these events, we had to contend with anxiety on the results of Peng's medical examination -- we had nothing to worry about, she didn't need new treatment; and Julian's new school (we narrowed down our choices to two, until another one, with tuition closer to our budget and nearer to where we'll live, popped out).&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;And then there was my plan to work in Clark. My client has a facility in Clark, and I was planning to ask my manager if I can work from there instead of travelling to the main office. I was still formulating my pitch, when, during a casual conversation with him, I mentioned our move to Clark. He asked if it would make more sense for me to work from Clark instead. (!!!) I could barely contain my joy, but I held back and controlled myself, and nonchalantly said that that would be a great idea, and will be a win-win situation for all parties involved.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;Throughout all these -- my aborted job prospect, kuya Gab's acceptance to Pisay, Peng's continuing improvement, Julian's new adventure, and our move to Clark -- there was a common thread: that of hope and anticipation. Because all the plans we made, we prayed for first. We set out our plans, keeping in mind -- and believing in our hearts -- that God will guide us, and will not forsake us. At times, when it appeared our plans will not fall through, by some twist, right at the last moment, an opportunity will appear -- better and more than what we expected.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;Those who know me well, know that I'm not prone to superstition, nor am I deeply religious. But the events that transpired -- opportunities suddenly opening up; people going out of their way, for no apparent logical reason; to help us -- point to a power far greater than what I can imagine. Hipsters will say that the universe conspired to help us out. My activist friends will say that objective conditions are ripe that led to these situations. Me, I believe that God was -- and is -- at work.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;We laid out our plans to Him, asked Him for guidance and providence, and He delivered, amply and beyond what we had imagined.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;There's this oft-repeated passage in the Bible, in Jeremiah. To paraphrase: "For I know the plans I have for you: plans to prosper you and not to harm you; plans to give you hope and a future." It's so often cited in church, it tended to be a cliche. (The context, of course, was God's promise of deliverance of His people from exile, but I digress.) There's a reason why the Bible is called the "Living Word": this cliche, this "mantra", still resonates deep within those who sincerely believe that God has a plan, and that His will is "good, acceptable, and perfect."&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span style="color: #1d2129; font-family: &amp;quot;sf optimized&amp;quot; , , , , , sans-serif;"&gt;&lt;span style="letter-spacing: -0.12px;"&gt;We laid out our plans to God, and He initiated, He facilitated, He consummated, and He continues to deliver.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
</content><link href="http://blog.iandexter.net/feeds/3134219856029095284/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2014/06/answered-prayers.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/3134219856029095284" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/3134219856029095284" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2014/06/answered-prayers.html" rel="alternate" title="Answered prayers" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-7324191262111472269</id><published>2014-03-19T12:04:00.001+08:00</published><updated>2014-03-19T12:07:18.337+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="redhat"/><category scheme="http://www.blogger.com/atom/ns#" term="Work"/><title type="text">FIX: Postfix without MySQL dependency</title><content type="html">&lt;p&gt;MySQL client libraries has been &lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=502412"&gt;bundled with Postfix in RHEL 5&lt;/a&gt;. Unfortunately, this conflicts with the Oracle MySQL libraries when we try to update Postfix:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;---&gt; Package postfix.x86_64 2:2.3.3-6.el5 set to be updated
--&gt; Processing Dependency: mysql for package: postfix
--&gt; Running transaction check
---&gt; Package mysql.x86_64 0:5.0.95-5.el5_9 set to be updated
--&gt; Processing Conflict: MySQL-client conflicts mysql
--&gt; Processing Conflict: MySQL-server conflicts mysql
--&gt; Processing Conflict: mysql conflicts MySQL
--&gt; Finished Dependency Resolution
mysql-5.0.95-5.el5_9.x86_64 from Updates has depsolving problems
  --&gt; mysql conflicts with MySQL-server
MySQL-client-5.6.10-1.rhel5.i386 from installed has depsolving problems
  --&gt; MySQL-client conflicts with mysql
MySQL-server-5.6.10-1.rhel5.i386 from installed has depsolving problems
  --&gt; MySQL-server conflicts with mysql
Error: MySQL-server conflicts with mysql
Error: mysql conflicts with MySQL-server
Error: MySQL-client conflicts with mysql
 You could try using --skip-broken to work around the problem
 You could try running: package-cleanup --problems
                        package-cleanup --dupes
                        rpm -Va --nofiles --nodigest
&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;&amp;lt;rant&amp;gt;Adding MySQL support to Postfix introduced an unneccessary dependency. Clearly, the people who pushed for this did not think about the use case for those who install upstream MySQL packages.&amp;lt;/rant&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Fortunately&lt;/strong&gt;, someone in Red Hat noticed this abomination, and &lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=802483"&gt;removed it in RHEL 6&lt;/a&gt;. But those still using RHEL 5 are out-of-luck: they either have to stick with the MySQL packages provided by Red Hat if they want to use it with Postfix, or use a different MTA if they want to use upstream MySQL.&lt;/p&gt;&lt;p&gt;This won't hold in our case. Our only recourse was to remove the MySQL dependency in Postfix. So, after downloading the source RPM, it was a simple matter of adding this to &lt;code&gt;.rpmmacro&lt;/code&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;%MYSQL 0&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;and running&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;rpmbuild --rebuild SRPMS/postfix-2.3.3-6.el5.src.rpm&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;The binary RPM was then added to our local repository. We had to remove Postfix first, update the rest of the packages, then re-install Postfix, but this time without the pesky MySQL dependency.&lt;/p&gt;</content><link href="http://blog.iandexter.net/feeds/7324191262111472269/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2014/03/fix-postfix-without-mysql-dependency.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/7324191262111472269" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/7324191262111472269" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2014/03/fix-postfix-without-mysql-dependency.html" rel="alternate" title="FIX: Postfix without MySQL dependency" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-3869757471762489264</id><published>2013-11-15T12:28:00.001+08:00</published><updated>2013-11-15T12:28:42.258+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Play"/><category scheme="http://www.blogger.com/atom/ns#" term="python"/><category scheme="http://www.blogger.com/atom/ns#" term="security"/><title type="text">Tough nut to crack</title><content type="html">&lt;p&gt;To exercise my (almost-non-existent) Python skillz, I wrote a script to generate passwords and passphrases from common words. The script (&lt;a href="https://gist.github.com/iandexter/7476990"&gt;in Github&lt;/a&gt;) also computes the &lt;a href="https://en.wikipedia.org/wiki/Entropy_(information_theory)"&gt;bit entropy&lt;/a&gt; of the generated passwords, and compares them against the plain words (without obfuscation).&lt;/p&gt;&lt;p&gt;As a bonus, I also wrote a generator for &lt;a href="http://xkcd.com/936"&gt;XKCD's passphrase scheme&lt;/a&gt;: choose four random words from a word list, resulting in a higher entropy and better recall.&lt;/p&gt;&lt;p&gt;The script uses four schemes -- well, three, actually, if you don't count the plain text version (for control): simple character substitutions (e.g. "@" for "a", "3" for "e", similar to "&lt;em&gt;l337 $p3a|&amp;lt;&lt;/em&gt;") and padding in-between words; padding short passwords with random characters; and the XKCD algorithm.&lt;/p&gt;&lt;p&gt;Here's a test run using the word list from Linux, &lt;code&gt;/usr/share/dict/words&lt;/code&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;
Cryptogamia738314396617973004177668             35   208.40
0nl3pYUG%/50$?9&amp;(.)+.70:01&lt;[=_:                 31   203.19
resoaked16166235184403414647125208              34   202.44
flophouses37070490830801046024                  30   178.63
nontaxonomic1968304520123681                    28   166.72
ferrocerium42507400944791500                    28   166.72
^#fILLIPIng/@-2/1;.                             19   124.54
?&amp;p5y(HROM37rI(2l                               17   111.43
]NigHt-cELlAr\]4?                               17   111.43
squads-leftpertestself-regulatedecarburized     43    75.68
arienzomiscounselingtritheocracyreverberantly   45    75.68
pseudepigraphic                                 15    70.51
bubble-and-squeakMariandDorkus                  30    56.76
Lyonaisquadriannulatebumblepuppy                32    56.76
re-excitelactoidununderstandable                32    56.76
subthreshold                                    12    56.41
bioscientist                                    12    56.41
francisca                                        9    42.30
apyrene                                          7    32.90
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The padding scheme produces passwords with higher bit entropy, understandably, because of the length. Complexity-wise, though, they won't cut it since they don't have enough character classes (mix of upper- and lower-case, punctuation marks, and digits). The character-substitution-plus-padding scheme does a better job, while XKCD-style is good enough.&lt;/p&gt;&lt;p&gt;(Caveat: I'm not a mathematician. This is a purely "pedestrian", hence loose, &lt;a href="http://security.stackexchange.com/questions/21143/confused-about-password-entropy"&gt;interpretation of entropy&lt;/a&gt; based on my limited understanding of the concept, but I'd like to think that the math is sound. :-)&lt;/p&gt;&lt;p&gt;Take note that I used a different algorithm for calculating the entropy for XKCD and the other schemes. For XCKD, for example, I assumed a fixed-sized data set from which to derive the passphrases, so the calculation is:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;$$E = l * {log_2{R}}$$&lt;/p&gt;&lt;p&gt;where $E$ = entropy&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$l$ = number of words in the passphrase&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$R$ = total number of words in the data set&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;For the other schemes, I use the classic definition for &lt;a href="http://security.stackexchange.com/questions/21050/calculating-complex-password-entropy/"&gt;calculating entropy&lt;/a&gt;, which is the same as above, but $l$ is the length of the password, and $R$ is the range of possible characters.&lt;/p&gt;&lt;p&gt;I also tested the generated passwords against &lt;a href="http://www.passwordmeter.com/"&gt;several&lt;/a&gt; &lt;a href="http://rumkin.com/tools/password/passchk.php"&gt;online&lt;/a&gt; &lt;a href="https://www.grc.com/haystack.htm"&gt;strength&lt;/a&gt; &lt;a href="http://password-checker.online-domain-tools.com/"&gt;testers&lt;/a&gt;. Interestingly, &lt;a href="http://www.wolframalpha.com/input/?i=password+_%3Ehard-IRONmA858%26%3B7%2B9%22%7C11%3E3%3C%26"&gt;Wolfram Alpha&lt;/a&gt; provides a great password strength tester. It also suggests passwords, based on your input.&lt;/p&gt;&lt;p&gt;Next step is to write a generator for the &lt;a href="https://www.schneier.com/blog/archives/2013/06/a_really_good_a.html"&gt;Schneier&lt;/a&gt; &lt;a href="https://www.schneier.com/essay-246.html"&gt;scheme&lt;/a&gt;: take a memorable sentence, add some memorable tricks (character substitutions, padding), then turn it into a password. That should be fun.&lt;/p&gt;</content><link href="http://blog.iandexter.net/feeds/3869757471762489264/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/11/tough-nut-to-crack.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/3869757471762489264" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/3869757471762489264" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/11/tough-nut-to-crack.html" rel="alternate" title="Tough nut to crack" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-2167687290704283615</id><published>2013-11-11T12:23:00.000+08:00</published><updated>2013-11-11T12:23:22.780+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="suse"/><category scheme="http://www.blogger.com/atom/ns#" term="tips"/><category scheme="http://www.blogger.com/atom/ns#" term="Work"/><title type="text">FIX: Cannot boot after vmware-tools installation</title><content type="html">&lt;p&gt;Ugh, more SLES 10 SP4 woes!&lt;/p&gt;&lt;p&gt;A bunch of SLES 10 SP4 servers failed to boot after VMware tools were installed. Apparently, &lt;code&gt;initrd&lt;/code&gt; did not load the necessary drivers and modules. This was a &lt;a href="http://www.novell.com/support/kb/doc.php?id=7005233"&gt;known issue&lt;/a&gt; that was fixed in a later version of &lt;code&gt;vmware-tools&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;The VMware tools installer takes apart &lt;code&gt;/etc/sysconfig/kernel&lt;/code&gt;, specifically the &lt;code&gt;INITRD_MODULES&lt;/code&gt; directive, and reconstructs it by adding its modules (&lt;code&gt;vmxnet&lt;/code&gt; and &lt;code&gt;vmxnet3&lt;/code&gt;). However, the new configuration removes the rest of the original modules:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;- INITRD_MODULES="piix mptspi processor thermal fan reiserfs dm_mod edd"
+ INITRD_MODULES="vmxnet vmxnet3"
&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;and rebuilds the initial ramdisk image with only these drivers. Hence, the server will fail to boot without the other devices.&lt;/p&gt;&lt;p&gt;The workaround in the Novell site was to boot from a rescue disk, reconstruct the configuration file, and run &lt;code&gt;mkinitrd&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;To prevent the boot failure, what we did was edit the config file right &lt;strong&gt;after&lt;/strong&gt; the installer finishes. We then run&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;/usr/bin/vmware-tools-config.pl&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;to let &lt;code&gt;vmware-tools&lt;/code&gt; rebuild &lt;code&gt;initrd&lt;/code&gt; -- this time with the correct drivers.&lt;/p&gt;&lt;p&gt;After reboot, it should be good to go.&lt;/p&gt;&lt;p&gt;We also filed a bug report with the vendor regarding this. Note that this does not happen in RHEL, as it doesn't use &lt;code&gt;/etc/sysconfig/kernel&lt;/code&gt; for building &lt;code&gt;initrd&lt;/code&gt;.&lt;/p&gt;</content><link href="http://blog.iandexter.net/feeds/2167687290704283615/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/11/fix-cannot-boot-after-vmware-tools.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/2167687290704283615" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/2167687290704283615" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/11/fix-cannot-boot-after-vmware-tools.html" rel="alternate" title="FIX: Cannot boot after vmware-tools installation" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-6362550019761915502</id><published>2013-11-10T20:19:00.000+08:00</published><updated>2013-11-11T10:05:37.740+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="suse"/><category scheme="http://www.blogger.com/atom/ns#" term="tips"/><category scheme="http://www.blogger.com/atom/ns#" term="Work"/><title type="text">FIX: Hung suse_register when connecting to local repo</title><content type="html">&lt;p&gt;We have legacy SLES 10 SP4 servers that needed to be rebuilt. After the usual AutoYaST unattended builds, we had to register it to a local repo managed using SMT (Subscription Management Tool, Novell's version of Red Hat Satellite). However, the registration to the Novell Customer Center hung.&lt;/p&gt;&lt;p&gt;As it turned out, it was waiting for data from ZMD, the Zen Management daemon. However, the ZMD service thinks it's still busy and fails to respond accordingly. &lt;code&gt;suse_register&lt;/code&gt; needs data from ZMD to determine the installed products to be sent to the Customer Center, and with a broken ZMD, it cannot continue and just hangs there.&lt;/p&gt;&lt;p&gt;So, the ZMD service had to be restarted, but since it thinks it's still busy, the normal&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;/etc/init.d/novell-zmd stop&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;or&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;rczmd stop&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;invocations won't work. It had to be forcibly killed:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;killall -9 zmd&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;After that, its cache, DB and log file needed to be removed:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;rm -rf /var/cache/zmd/web/*
rm /var/lib/zmd/zmd.db /var/log/zmd-messages.log
&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;(The log file had to be deleted to avoid sharing contention error.)&lt;/p&gt;&lt;p&gt;When everything is cleaned up, the daemon can be started again:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;rczmd start&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;the repository can be fetched:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;rug ping -a&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;and then registration process can continue:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;clientSetup4SMT.sh
yast2 inst_suse_register
&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;I'm not sure how it's done now in SLES 11 (we've since moved on to RHEL), but hopefully, they got rid of this abomination called the "Zen Management" suite.&lt;/p&gt;</content><link href="http://blog.iandexter.net/feeds/6362550019761915502/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/11/fix-hung-suseregister-when-connecting.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/6362550019761915502" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/6362550019761915502" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/11/fix-hung-suseregister-when-connecting.html" rel="alternate" title="FIX: Hung suse_register when connecting to local repo" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-7985017585445954183</id><published>2013-08-19T20:55:00.001+08:00</published><updated>2013-08-19T20:55:35.889+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="openshift"/><category scheme="http://www.blogger.com/atom/ns#" term="opensource"/><category scheme="http://www.blogger.com/atom/ns#" term="Play"/><category scheme="http://www.blogger.com/atom/ns#" term="redhat"/><title type="text">ownCloud on OpenShift</title><content type="html">&lt;p&gt;Last July,&amp;nbsp;&lt;a href="http://googlereader.blogspot.com/2013/07/a-final-farewell.html" target="_blank"&gt;Google shut down Reader&lt;/a&gt;, one of my most favorite apps, and to ease off my Reader withdrawal, I decided to host my own RSS reader. There were several alternatives out there, but I opted for &lt;a href="http://owncloud.org/" target="_blank"&gt;ownCloud&lt;/a&gt;'s &lt;a href="http://apps.owncloud.com/content/show.php?content=news" target="_blank"&gt;News&lt;/a&gt; app, hosted on &lt;a href="https://www.openshift.com/" target="_blank"&gt;OpenShift&lt;/a&gt;. I've outlined the steps I took below.&lt;/p&gt;
&lt;p&gt;ownCloud is a cloud storage app that runs on a LAMP stack. OpenShift is &lt;a href="http://www.redhat.com/%E2%80%8E" target="_blank"&gt;Red Hat&lt;/a&gt;'s &lt;a href="https://en.wikipedia.org/wiki/Platform_as_a_service" target="_blank"&gt;Platform as a Service&lt;/a&gt; (Paas) offering that allows rapid application deployment using various software stacks.&lt;/p&gt;
&lt;p&gt;The steps below have been liberally taken from Isaac Christoffersen's &lt;a href="https://github.com/ichristo/owncloud-openshift-quickstart" target="_blank"&gt;OpenShift ownCloud quickstart&lt;/a&gt;. I've also &lt;a href="https://github.com/iandexter/owncloud-openshift-quickstart"&gt;forked Isaac's quickstart&lt;/a&gt; that incorporates the steps. Feel free to fork and submit pull requests.&lt;/p&gt;
&lt;p&gt;This guide assumes that you have an &lt;a href="https://www.openshift.com/get-started" target="_blank"&gt;OpenShift account&lt;/a&gt;, and the requisite client tools. This also assumes that the app is located in the project directory.&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;
mkdir -p ~/projects
cd ~/projects
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Create app.
&lt;blockquote&gt;&lt;pre&gt;
rhc app create owncloud php-5.3 mysql-5.1
rhc alias add owncloud your.alias.goes.here
rhc app show owncloud
rm owncloud/php/*.php
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Get ownCloud.
&lt;blockquote&gt;&lt;pre&gt;
mkdir ~/projects/owncloud-dist 
cd ~/projects/owncloud-dist
wget http://download.owncloud.org/community/owncloud-5.0.10.tar.bz2
tar xjvf owncloud-5.0.10.tar.bz2
cd owncloud
rsync -av . ~/projects/owncloud/php/
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Add script to auto-configure ownCloud.
&lt;p&gt;In &lt;code&gt;~/projects/owncloud/php/config/autoconfig.php&lt;/code&gt;:&lt;/p&gt;
&lt;script src="https://gist.github.com/iandexter/6268790.js?file=autoconfig.php"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre&gt;
&amp;lt;?php
    define("DIRECTORY",$_SERVER['OPENSHIFT_DATA_DIR'] );
    define("DBNAME",$_SERVER['OPENSHIFT_APP_NAME'] );
    define("DBUSER",$_SERVER['OPENSHIFT_MYSQL_DB_USERNAME'] );
    define("DBPASS",$_SERVER['OPENSHIFT_MYSQL_DB_PASSWORD'] );
    define("DBHOST",$_SERVER['OPENSHIFT_MYSQL_DB_HOST'] . ':' . $_SERVER['OPENSHIFT_MYSQL_DB_PORT'] );
    $AUTOCONFIG = array(
        'installed' =&gt; false,
        'dbtype' =&gt; 'mysql',
        'dbtableprefix' =&gt; 'oc_',
        'adminlogin' =&gt; 'admin',
        'adminpass' =&gt; 'OpenShiftAdmin',
        'directory' =&gt; DIRECTORY,
        'dbname' =&gt; DBNAME,
        'dbuser' =&gt; DBUSER,
        'dbpass' =&gt; DBPASS,
        'dbhost' =&gt; DBHOST
    );
?&amp;gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;
&lt;/li&gt;
&lt;li&gt;Add OpenShift-specific action hooks.
&lt;p&gt;Add the following &lt;a href="https://www.openshift.com/developers/deploying-and-building-applications" target="_blank"&gt;action hooks&lt;/a&gt; to be executed at specific points in the deployment process of the OpenShift app. The scripts are located in &lt;code&gt;~/projects/owncloud/.openshift/action_hooks&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;pre_build&lt;/b&gt; - Restores an existing configuration file and removes the autoconfig script above for succeeding pushes.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;deploy&lt;/b&gt; - Ensures that the MySQL cartridge is available.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;post_deploy&lt;/b&gt; - During the first push, it will autoconfigure the ownCloud instance. For succeeding deployments, it will ensure that an existing configuration is used.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Use cron.
&lt;p&gt;The News app requires background jobs that need to run regularly, so add OpenShift's Cron cartridge.&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;
rhc cartridge-add cron-1.4 -a owncloud
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Cron jobs go in &lt;code&gt;~/projects/owncloud/.openshift/cron/&lt;/code&gt; under the respective periods. Add the following job that runs
every 15 minutes (in &lt;code&gt;~/projects/owncloud/.openshift/cron/minutely/owncloud.sh&lt;/code&gt;):
&lt;script src="https://gist.github.com/iandexter/6268790.js?file=owncloud.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre&gt;
#!/bin/bash

if [[ -f  $OPENSHIFT_REPO_DIR/php/cron.php ]] ; then
    if [[ $(( $(date +%M) % 15 )) -eq 0 ]] ; then
        printf "{\"app\":\"Cron\",\"message\":\"%s\",\"level\":1,\"time\":%s}\n" "Running cron job" $(date +%s) &gt;&gt; $OPENSHIFT_DATA_DIR/owncloud.log
        pushd $OPENSHIFT_REPO_DIR/php &amp;&gt; /dev/null
        php -f cron.php
        if [[ $? -ne 0 ]] ; then
            printf "{\"app\":\"Cron\",\"message\":\"%s\",\"level\":2,\"time\":%s}\n" "Error running cron job" $(date +%s) &gt;&gt; $OPENSHIFT_DATA_DIR/owncloud.log
        fi
        popd &amp;&gt; /dev/null
    fi
fi
&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;
&lt;p&gt;Make sure to enable the system cron in ownCloud's &lt;code&gt;Admin&lt;/code&gt; settings page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;Deploy ownCloud.
&lt;blockquote&gt;&lt;pre&gt;
cd ~/projects/owncloud
git add .
git commit -a -m "Deploy to OpenShift"
git push
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Log in and start using ownCloud on OpenShift.
&lt;p&gt;Go to &lt;code&gt;https://your.alias.goes.here&lt;/code&gt;, and use &lt;code&gt;admin/OpenShiftAdmin&lt;/code&gt; as the default first-time credentials. (Make sure to change this ASAP.)&lt;/p&gt;
&lt;/ol&gt;</content><link href="http://blog.iandexter.net/feeds/7985017585445954183/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/08/owncloud-on-openshift.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/7985017585445954183" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/7985017585445954183" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/08/owncloud-on-openshift.html" rel="alternate" title="ownCloud on OpenShift" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-3455370658548168813</id><published>2013-02-16T10:38:00.000+08:00</published><updated>2018-01-09T12:12:57.640+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="funny"/><category scheme="http://www.blogger.com/atom/ns#" term="lego"/><category scheme="http://www.blogger.com/atom/ns#" term="minifigures"/><category scheme="http://www.blogger.com/atom/ns#" term="Play"/><title type="text">Be my Valentine</title><content type="html">I know, it's late, but still...&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhprYJk0-kmyHxpxP-4vUDrUmfC3Wx6GIpB3G-wq7UqP2zC4pdWFVt_49NElhEHxN7JGtMdGqAGy7K8LDQmRU5LjpgtAyLl8MDBVL3gdQdqxq0UPDIcceGRGRE5yvjs8mO8PcxA2Q8ZbdZS/s1600/DSC04590.JPG" imageanchor="1"&gt;&lt;img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhprYJk0-kmyHxpxP-4vUDrUmfC3Wx6GIpB3G-wq7UqP2zC4pdWFVt_49NElhEHxN7JGtMdGqAGy7K8LDQmRU5LjpgtAyLl8MDBVL3gdQdqxq0UPDIcceGRGRE5yvjs8mO8PcxA2Q8ZbdZS/s400/DSC04590.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
</content><link href="http://blog.iandexter.net/feeds/3455370658548168813/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/02/be-my-valentine.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/3455370658548168813" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/3455370658548168813" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/02/be-my-valentine.html" rel="alternate" title="Be my Valentine" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhprYJk0-kmyHxpxP-4vUDrUmfC3Wx6GIpB3G-wq7UqP2zC4pdWFVt_49NElhEHxN7JGtMdGqAGy7K8LDQmRU5LjpgtAyLl8MDBVL3gdQdqxq0UPDIcceGRGRE5yvjs8mO8PcxA2Q8ZbdZS/s72-c/DSC04590.JPG" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-8710823735205118597</id><published>2013-02-10T14:12:00.000+08:00</published><updated>2013-02-10T21:02:16.827+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="diy"/><category scheme="http://www.blogger.com/atom/ns#" term="family"/><category scheme="http://www.blogger.com/atom/ns#" term="food"/><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="life"/><category scheme="http://www.blogger.com/atom/ns#" term="Play"/><category scheme="http://www.blogger.com/atom/ns#" term="recipe"/><title type="text">Baking on a microwave</title><content type="html">&lt;p&gt;...was a fail, sort of. :-P&lt;/p&gt;
&lt;p&gt;So we bought a cheap stand mixer (Philips kitchen appliances were 50% off in Manila shops), and were trying to come up with recipes we can do with it. First in our list was &lt;a href="https://www.evernote.com/shard/s57/sh/2f86d02f-41ba-41cc-b684-d88c05dbb4f4/60c8c940ab22038ea569a7620daa095d"&gt;mocha frosting&lt;/a&gt;, which turned out quite well.&lt;/p&gt;
&lt;p&gt;Next up was bread made from rice flour. But we didn't have an oven. I scrounged the internet for instructions, found a few gems, and made up my own recipe.&lt;/p&gt;
&lt;iframe height="300px" src="https://www.evernote.com/shard/s57/sh/574babc3-018e-4fd4-9f3e-e58aca37c14a/2797bb98d6848910f94a0bec519928e3" width="495px"&gt;&lt;/iframe&gt;
&lt;p&gt;The bread was a bit too hard, probably because the microwave took out all the moisture, but it tasted like &lt;em&gt;puto&lt;/em&gt; (native rice cake). It wasn't that bad.&lt;/p&gt;</content><link href="http://blog.iandexter.net/feeds/8710823735205118597/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/02/baking-on-microwave.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/8710823735205118597" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/8710823735205118597" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/02/baking-on-microwave.html" rel="alternate" title="Baking on a microwave" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-744090800106112172</id><published>2013-01-08T09:34:00.000+08:00</published><updated>2013-01-08T09:34:36.919+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cli"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Work"/><title type="text">Get disk size in Linux</title><content type="html">&lt;p&gt;Usually, you'll need &lt;code&gt;root&lt;/code&gt;, like so:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;sudo /sbin/fdisk -l | grep -E "^Disk"&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;But you can also use this:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;printf "%.1f GB\n" $(echo "`cat /sys/block/sd*/size` * 512 / 1000000000" | bc -l)&lt;/pre&gt;&lt;/blockquote&gt;</content><link href="http://blog.iandexter.net/feeds/744090800106112172/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/01/get-disk-size-in-linux.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/744090800106112172" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/744090800106112172" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2013/01/get-disk-size-in-linux.html" rel="alternate" title="Get disk size in Linux" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-7740056811486235735</id><published>2012-12-13T17:02:00.000+08:00</published><updated>2012-12-13T17:15:03.629+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="fedora"/><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="redhat"/><category scheme="http://www.blogger.com/atom/ns#" term="Work"/><category scheme="http://www.blogger.com/atom/ns#" term="yum"/><title type="text">Create a local EPEL mirror</title><content type="html">&lt;p&gt;We use some add-on packages from &lt;a href="http://fedoraproject.org/wiki/EPEL/FAQ"&gt;EPEL&lt;/a&gt;. Since we want to peg packages to specific versions only, and to reduce the number of servers that connect directly to the internet, we decided to build a local mirror for the EPEL repository.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install dependencies.&lt;br /&gt;&lt;br /&gt;
&lt;script src="https://gist.github.com/4273697.js?file=1-install-dependencies.sh"&gt;&lt;/script&gt;

&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;yum install httpd yum-utils createrepo&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Patch &lt;code&gt;reposync&lt;/code&gt; to add option for "flattened" directories. (By default, &lt;code&gt;reposync&lt;/code&gt; creates a directory named after the repo ID for placing the downloaded packages.)&lt;br /&gt;&lt;br /&gt;

&lt;script src="https://gist.github.com/4273697.js?file=2-patch-reposync.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;
cat &gt; reposync.patch
--- /usr/bin/reposync.bak       2012-11-13 13:30:37.000000000 +0800
+++ /usr/bin/reposync   2012-11-13 13:34:47.000000000 +0800
@@ -117,6 +117,8 @@ def parseArgs():
         help="enable yum plugin support")
     parser.add_option("-m", "--downloadcomps", default=False, action="store_true",
         help="also download comps.xml")
+    parser.add_option("-f", "--flatdir", dest='flatdir', default=False, action="store_true",
+        help="flatten directory; do not add repoid")

     (opts, args) = parser.parse_args()
     return (opts, args)
@@ -186,7 +188,11 @@ def main():
         else:
             download_list = list(reposack)

-        local_repo_path = opts.destdir + '/' + repo.id
+        if opts.flatdir:
+            local_repo_path = opts.destdir;
+        else:
+            local_repo_path = opts.destdir + '/' + repo.id
+
         if opts.delete and os.path.exists(local_repo_path):
             current_pkgs = localpkgs(local_repo_path)

cp /usr/bin/reposync{,.bak}
patch &lt; reposync.patch&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Create the repository directories.&lt;br /&gt;&lt;br /&gt;

&lt;script src="https://gist.github.com/4273697.js?file=3-create-repo-directories.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;mkdir -p /srv/repos/epel{,.staging}/5/{x86_64,i386,noarch}&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Start downloading the repo.&lt;br /&gt;&lt;br /&gt;

&lt;script src="https://gist.github.com/4273697.js?file=4-download-repo.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;
reposync -a x86_64 -r epel -p /srv/repos/epel.staging -l -m -f&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Copy the packages to staging first.&lt;br /&gt;&lt;br /&gt;

&lt;script src="https://gist.github.com/4273697.js?file=5-copy-packages.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;
cd /srv/repos/epel.staging/
for a in {x86_64,i386,noarch} ; do \
   find . -maxdepth 1 -iname "*$a*" -exec cp -v {} 5/$a/ \; ; \
   cp -f comps.xml 5/$a/ ;
done&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Create repo metadata.&lt;br /&gt;&lt;br /&gt;

&lt;script src="https://gist.github.com/4273697.js?file=6-create-repo-metadata.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;
for a in {x86_64,i386,noarch} ; do \
   createrepo -v -g comps.xml 5/$a/ ; \
done&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Add the following configuration file to &lt;code&gt;/etc/httpd/conf.d/&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;

&lt;script src="https://gist.github.com/4273697.js?file=local-repo.conf"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;
&lt;VirtualHost _default_:80&gt;
   ServerAdmin admin@email.org
   ServerName fqdn.of.repo.server
   DocumentRoot /srv/repos

   KeepAlive On
   KeepAliveTimeout 2
   MaxKeepAliveRequests 100

   AddType application/octet-stream .iso
   AddType application/octet-stream .rpm

   &lt;Directory "/srv/repos"&gt;
      Options +Indexes +FollowSymLinks
      AllowOverride None
      Order allow,deny
      Allow from all
   &lt;/Directory&gt;

   &lt;LocationMatch "\.(xml|xml\.gz|xml\.asc|sqlite)$"&gt;
      Header set Cache-Control "must-revalidate"
      ExpiresActive On
      ExpiresDefault "now"
   &lt;/LocationMatch&gt;

   LogFormat "%h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" %I %O \"%{User-Agent}i\"" combined
&lt;/VirtualHost&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;

Restart Apache.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;

&lt;li&gt;Use the following &lt;code&gt;yum&lt;/code&gt; repo config in &lt;code&gt;/etc/yum.repos.d/&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;

&lt;script src="https://gist.github.com/4273697.js?file=epel.repo"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;
[epel]
name=Extra Packages for Enterprise Linux 5 - $basearch
baseurl=http://fqdn.of.repo.server/epel/5/$basearch
### mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5&amp;arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=0&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To test:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre lang="bash"&gt;sudo yum repolist&lt;/pre&gt;&lt;/blockquote&gt;</content><link href="http://blog.iandexter.net/feeds/7740056811486235735/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/12/create-local-epel-mirror.html#comment-form" rel="replies" title="2 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/7740056811486235735" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/7740056811486235735" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/12/create-local-epel-mirror.html" rel="alternate" title="Create a local EPEL mirror" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-478870339822283460</id><published>2012-12-03T13:47:00.000+08:00</published><updated>2012-12-03T19:00:19.050+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="family"/><category scheme="http://www.blogger.com/atom/ns#" term="health"/><category scheme="http://www.blogger.com/atom/ns#" term="In-between"/><category scheme="http://www.blogger.com/atom/ns#" term="life"/><category scheme="http://www.blogger.com/atom/ns#" term="personal"/><title type="text">Clinical</title><content type="html">&lt;p&gt;Now that the &lt;em&gt;&lt;a href="http://blog.iandexter.net/2012/11/the-hope-which-has-no-opposite-in-fear.html"&gt;senti&lt;/a&gt;&lt;/em&gt; post is done, on to the heart of the matter.&lt;/p&gt;

&lt;p&gt;We discovered a lump last October 21, and had the tumor excised immediately afterwards, on October 25. Peng was diagnosed with &lt;a href="https://en.wikipedia.org/wiki/Invasive_ductal_carcinoma"&gt;invasive ductal carcinoma&lt;/a&gt; last November 5.&lt;/p&gt;

&lt;p&gt;We sought another opinion from a specialist in Metro Manila, and the initial diagnosis was confirmed on November 7. The oncologist scheduled another consultation on November 15, where we decided on the treatment: modified radical mastectomy.&lt;/p&gt;

&lt;p&gt;The procedure was performed on November 19, and we stayed in the hospital until November 21. We left for the province on November 23.&lt;/p&gt;

&lt;p&gt;The pathology report on the breast mass as well as the review of the first excision were released and discussed on November 29. There were no residues from the tumor, no lymphovascular invasion, and no lymph node involvement. The &lt;a href="https://en.wikipedia.org/wiki/Breast_cancer_classification#Receptor_status"&gt;hormone receptor assay&lt;/a&gt; for estrogen, progesterone and HER2/neu turned negative, too. The diagnosis was stage II, triple-negative breast cancer.&lt;/p&gt;

&lt;p&gt;Peng will undergo chemotherapy sessions every three weeks, starting on December 21, for six cycles.&lt;/p&gt;

&lt;p&gt;The prognosis is quite good. We're very confident that we can effectively knock off this condition. The test results were great confidence boosters, and succeeding treatments will ensure that this will all be over and behind us soon.&lt;/p&gt;</content><link href="http://blog.iandexter.net/feeds/478870339822283460/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/12/clinical.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/478870339822283460" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/478870339822283460" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/12/clinical.html" rel="alternate" title="Clinical" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-6146277577842990290</id><published>2012-11-17T13:09:00.000+08:00</published><updated>2012-11-17T14:34:11.939+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="family"/><category scheme="http://www.blogger.com/atom/ns#" term="health"/><category scheme="http://www.blogger.com/atom/ns#" term="In-between"/><category scheme="http://www.blogger.com/atom/ns#" term="life"/><category scheme="http://www.blogger.com/atom/ns#" term="personal"/><title type="text">'the hope which has no opposite in fear'</title><content type="html">&lt;p&gt;The words were stark:&lt;/p&gt;

&lt;blockquote&gt;"Histology of the first slide showed fibrocystic change while the other slide revealed neoplastic proliferation of epithelium [... that] appears to be of ductular origin."&lt;/blockquote&gt;

&lt;p&gt;The report screamed: "HISTOPATHOLOGIC DIAGNOSIS: INVASIVE DUCTAL CARCINOMA".&lt;/p&gt;

&lt;p&gt;As I read each line, I was silently muttering, "no, no, no...". My wife, Peng, just stared at the page -- the words might not have sunk in yet.&lt;/p&gt;

&lt;p&gt;After discussing the findings with the doctor, we sat on the bench outside the clinic, the early morning light seeping into the dimly lit corridor.&lt;/p&gt;

&lt;p&gt;"Why?" Peng asked. I usually have quick replies to all her questions, but this time, I had nothing.&lt;/p&gt;

&lt;p&gt;We consulted another specialist, who confirmed the diagnosis and provided options for treatment, which were the same as what the previous doctor recommended: "modified radical mastectomy". The words seemed all muddled up, the meaning hidden in jargon: "hormone receptor tests", "lymphatic-vascular invasion", "cellular differentiation".&lt;/p&gt;

&lt;p&gt;They all boiled down to this: Peng has breast cancer, she would have to lose her left breast, and undergo chemotherapy.&lt;/p&gt;

&lt;p&gt;The words finally sunk in.&lt;/p&gt;

&lt;p&gt;At night, while huddled in the darkness, she would ask, "Why? Why me?" I would tell her, it may be something in the way her body reacted; it could be in her genes; we may never know, but really, the important thing is that it's treatable, there's a big chance of recovery, she will get well.&lt;/p&gt;

&lt;p&gt;Yes, I try to convince myself, too: Peng -- my wife, the mother of my kids, love of my life -- will get well. We will get rid of the cancer, we will go through all the treatments, we will beat this.&lt;/p&gt;

&lt;p&gt;We're scared. But we're not alone. Our families and friends, as soon as they heard the news, formed a protective cocoon around us, giving solace, telling us, "Everything will be alright." We're grateful.&lt;/p&gt;

&lt;p&gt;* * *&lt;/p&gt;

&lt;p&gt;At times, when I feel scared, I recite the "Litany Against Fear" from &lt;em&gt;Dune&lt;/em&gt;: "I shall not fear / Fear is the mind-killer [...] / Where fear has gone there will be nothing / Only I will remain."

&lt;p&gt;Yes, there is still fear, but it will soon be gone. This time, it won't be just me replacing it in the silent void. As e. e. cummings wrote:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;
love is the voice under all silences,
the hope which has no opposite in fear;
the strength so strong mere force is feebleness:
the truth more first than sun more last than star

---do lovers love?why then to heaven with hell.
Whatever sages say and fools, all’s well 
&lt;/pre&gt;&lt;/blockquote&gt;

Everything will be alright. All is well.</content><link href="http://blog.iandexter.net/feeds/6146277577842990290/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/11/the-hope-which-has-no-opposite-in-fear.html#comment-form" rel="replies" title="1 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/6146277577842990290" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/6146277577842990290" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/11/the-hope-which-has-no-opposite-in-fear.html" rel="alternate" title="'the hope which has no opposite in fear'" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-5023297706669882841</id><published>2012-07-29T10:43:00.000+08:00</published><updated>2012-07-29T10:43:47.507+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cli"/><category scheme="http://www.blogger.com/atom/ns#" term="In-between"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="opensource"/><title type="text">Add EXIF timestamps to photos</title><content type="html">&lt;p&gt;My car got sideswiped yesterday. Worst, the driver neither had insurance nor a license. We had to go through the hassle of filing a report with the police, complete with photo evidence of the accident.&lt;/p&gt;

&lt;p&gt;I only had my phone with me, which unfortunately isn't very feature rich (it's an old Android phone flashed with CM7, but I digress...), so there wasn't any timestamp on the photos.&lt;/p&gt;

&lt;p&gt;ImageMagick to the rescue! ImageMagick can extract basic EXIF data from images, as well as annotate them on the fly. I used the following script:&lt;/p&gt;

&lt;script src="https://gist.github.com/3195809.js?file=add-exif.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre&gt;
for img in IMG*.jpg; do
   fn=$(basename ${img} .jpg)
   convert ${fn}.jpg ${fn}.exif
   tstamp=$(strings ${fn}.exif | grep -E "^[0-9].*\:.*")
   convert ${fn}.jpg -fill red -gravity South -pointsize 72 -annotate +0+5 "${tstamp}" annotated_${fn}.jpg
   rm -f ${fn}.exif
done
&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;

&lt;p&gt;So it went from this:&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzRlE_4ojpWWB9fskEAIKLk-twLM6wsOlpqmNwf0mLd2RWeHpv52qbVR3t8Nq2SIXi5N7fjdw9sa5__kag0rjkDj29ybUOgrO3JqDpS_5-SbYtA-9qA7L9L-6RALMD7OwJqXf-jYRn4wSr/s1600/IMG_20120728_131340.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzRlE_4ojpWWB9fskEAIKLk-twLM6wsOlpqmNwf0mLd2RWeHpv52qbVR3t8Nq2SIXi5N7fjdw9sa5__kag0rjkDj29ybUOgrO3JqDpS_5-SbYtA-9qA7L9L-6RALMD7OwJqXf-jYRn4wSr/s400/IMG_20120728_131340.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;to this:&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0PomDmk9smyB6efQQkkOeFw4vdFXki6QgtRWuDFgI7PbpZcWqD6Rp8XRpCbnb4TXrdomQHqf8QUyk4yZ_T_CXQnaTR3tT1ScNLnQgFYf219KZgrVspLF5rPLyOHUj5fAvjp2hM2wIqHJP/s1600/annotated_IMG_20120728_131340.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="300" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0PomDmk9smyB6efQQkkOeFw4vdFXki6QgtRWuDFgI7PbpZcWqD6Rp8XRpCbnb4TXrdomQHqf8QUyk4yZ_T_CXQnaTR3tT1ScNLnQgFYf219KZgrVspLF5rPLyOHUj5fAvjp2hM2wIqHJP/s400/annotated_IMG_20120728_131340.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;


&lt;p&gt;Ugh! That scratch would have to wait.&lt;/p&gt;</content><link href="http://blog.iandexter.net/feeds/5023297706669882841/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/07/add-exif-timestamps-to-photos.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/5023297706669882841" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/5023297706669882841" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/07/add-exif-timestamps-to-photos.html" rel="alternate" title="Add EXIF timestamps to photos" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzRlE_4ojpWWB9fskEAIKLk-twLM6wsOlpqmNwf0mLd2RWeHpv52qbVR3t8Nq2SIXi5N7fjdw9sa5__kag0rjkDj29ybUOgrO3JqDpS_5-SbYtA-9qA7L9L-6RALMD7OwJqXf-jYRn4wSr/s72-c/IMG_20120728_131340.jpg" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-2023388273013131656</id><published>2012-07-07T18:26:00.001+08:00</published><updated>2012-07-07T18:26:36.077+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="fedora"/><category scheme="http://www.blogger.com/atom/ns#" term="ipad"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Play"/><title type="text">Sync iPad with Fedora</title><content type="html">&lt;p&gt;I don't have a Mac anymore, and we don't have any Windows desktop at home (yes, we're a Linux-desktop household, yay!), so one itty bitty issue is syncing the iPad, which has become the mobile entertainment device &lt;em&gt;du jour&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Good thing there's &lt;a href="http://www.libimobiledevice.org/"&gt;libimobiledevice&lt;/a&gt;, a worthy project that "talks the protocols to support [Apple] devices." The software library doesn't depend on any proprietary library, and doesn't require jailbreaking -- it Just Works (TM). Hooray for open source!&lt;/p&gt;

&lt;p&gt;Unfortunately, we're still on Fedora 15 (Lovelock) -- yeah, I know, it's end-of-support already, but I'm a bit queasy about upgrading to "Beefy Miracle" -- and its &lt;code&gt;libimobiledevice&lt;/code&gt; version doesn't support iOS 5 out-of-the-box.&lt;/p&gt;

&lt;p&gt;So I did what any self-respecting Linux user would do: build my own package from upstream. (Well, maybe not all Linux users would do that...) It was the usual &lt;code&gt;download-configure-make-make install&lt;/code&gt; combo.&lt;/p&gt;

&lt;p&gt;Then I &lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=750363"&gt;found out&lt;/a&gt; that there's an &lt;a href="http://koji.fedoraproject.org/koji/buildinfo?buildID=276689"&gt;existing build for F16&lt;/a&gt; that works just as nicely. D'oh!&lt;/p&gt;

&lt;p&gt;I'm a bit O.C. so I opted for that (much cleaner) build instead:&lt;/p&gt;

&lt;script src="https://gist.github.com/3065749.js?file=yum-localinstall.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre&gt;# cd /var/tmp
# wget http://kojipkgs.fedoraproject.org//packages/libimobiledevice/1.1.1/3.fc16/i686/libimobiledevice-1.1.1-3.fc16.i686.rpm
# yum localinstall libimobiledevice-1.1.1-3.fc16.i686.rpm&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;

&lt;p&gt;I plugged in the iPad, fired up Banshee, and I haz iPad syncing:&lt;/p&gt;

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7C_r7MGik5KZ_cLywscqPkHwjR1kb6_bT3oXKEQB4r8G3B-HxUYi9HlLVYXTnDJ6ffzalQ5i2pOvZUoSk3AEMUXG9vLuKk39xF7t4Kp4bKfWv-zmQi6V_QawcZT-1EXKv9u51aMTnE-RQ/s1600/fedora-ipad-sync.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="283" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7C_r7MGik5KZ_cLywscqPkHwjR1kb6_bT3oXKEQB4r8G3B-HxUYi9HlLVYXTnDJ6ffzalQ5i2pOvZUoSk3AEMUXG9vLuKk39xF7t4Kp4bKfWv-zmQi6V_QawcZT-1EXKv9u51aMTnE-RQ/s400/fedora-ipad-sync.png" /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;p&gt;One downside, though, is that video syncing is not yet available in this version of Banshee. Perhaps &lt;a href="http://koji.fedoraproject.org/koji/packageinfo?packageID=1368"&gt;2.2 or 2.4&lt;/a&gt; has that functionality, but I don't want to go through dependency hell. I'll just upgrade to F16 (or F17 -- it's inevitable, I guess...) instead.&lt;/p&gt;</content><link href="http://blog.iandexter.net/feeds/2023388273013131656/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/07/sync-ipad-with-fedora.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/2023388273013131656" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/2023388273013131656" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/07/sync-ipad-with-fedora.html" rel="alternate" title="Sync iPad with Fedora" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7C_r7MGik5KZ_cLywscqPkHwjR1kb6_bT3oXKEQB4r8G3B-HxUYi9HlLVYXTnDJ6ffzalQ5i2pOvZUoSk3AEMUXG9vLuKk39xF7t4Kp4bKfWv-zmQi6V_QawcZT-1EXKv9u51aMTnE-RQ/s72-c/fedora-ipad-sync.png" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-7764197313435327254</id><published>2012-06-25T17:50:00.001+08:00</published><updated>2012-06-27T12:39:17.580+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="howto"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="suse"/><category scheme="http://www.blogger.com/atom/ns#" term="Work"/><title type="text">HOWTO: Build driver update disk for SLES</title><content type="html">&lt;p&gt;Okay, so we have this humongous ERP server we call the "Monster", with a, well, not-so-esoteric network card. We were in the process of upgrading it to SLES 10 SP4, but we hit a snag since SP4 doesn't have the most recent driver.&lt;/p&gt;

&lt;p&gt;So it was off to HP we go, to &lt;a href="http://h20566.www2.hp.com/portal/site/hpsc/template.PAGE/public/psi/swdDetails/?sp4ts.oid=4268691&amp;amp;spf_p.tpst=psiSwdMain&amp;amp;spf_p.prp_psiSwdMain=wsrp-navigationalState%3Dlang%253Den%257Ccc%253DUS%257CprodSeriesId%253D4268690%257CprodNameId%253D4268691%257CswEnvOID%253D2065%257CswLang%253D8%257CswItem%253DMTX-d3e920d5ea224d32b0900418c8%257Caction%253DdriverDocument&amp;amp;javax.portlet.begCacheTok=com.vignette.cachetoken&amp;amp;javax.portlet.endCacheTok=com.vignette.cachetoken"&gt;search for the latest driver&lt;/a&gt;, which was in the form of a kernel module package (KMP). Using &lt;a href="http://www.novell.com/developer/creating_a_driver_update_disk_(dud).html"&gt;Novell's reference&lt;/a&gt; as a guide, we built a driver update disk (DUD).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build the KMP to a usable RPM.
&lt;script src="https://gist.github.com/3001410.js?file=1-build-kmp.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;zypper in kernel-source kernel-syms
cd /var/tmp &amp;&amp; wget http://path/to/src/rpm
rpm -ivh hp-be2net-4.1.402.6-2.src.rpm
rpmbuild -bb /usr/src/packages/SPECS/hp-be2net.spec
ls -l /usr/src/packages/RPMS/x86_64&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Create a build directory and extract the module.
&lt;script src="https://gist.github.com/3001410.js?file=2-extract-module.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;mkdir /var/tmp/dud &amp;&amp; cd /var/tmp/dud
rpm2cpio /srv/packages/hp/hp-be2net-kmp-default-4.1.402.6_2.6.16.60_0.85.1-2.x86_64.rpm | cpio -idv ./lib/modules/2.6.16.60-0.85.1-default/updates/hp-be2net/be2net.ko&lt;/pre&gt;&lt;/noscript&gt;&lt;/blockquote&gt;&lt;/li&gt;

&lt;li&gt;Create the staging tree.
&lt;script src="https://gist.github.com/3001410.js?file=3-create-tree.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;mkdir -p /var/tmp/dud/HP_ProLiant_BL680c_G7_Driver_Kit &amp;&amp; cd /var/tmp/dud/HP_ProLiant_BL680c_G7_Driver_Kit
while read line; do mkdir -p $line; done &lt;&lt; EOF
linux
linux/suse
linux/suse/i386-sled10
linux/suse/i386-sled10/modules
linux/suse/i386-sled10/install
linux/suse/i386-sles10
linux/suse/i386-sles10/modules
linux/suse/i386-sles10/install
linux/suse/x86_64-sled10
linux/suse/x86_64-sled10/modules
linux/suse/x86_64-sled10/install
linux/suse/x86_64-sles10
linux/suse/x86_64-sles10/modules
linux/suse/x86_64-sles10/install
media.1/
suse/
suse/i586
suse/nosrc
suse/setup
suse/setup/descr
suse/src
suse/x86_64
EOF

find . -type d&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Populate the tree.
&lt;script src="https://gist.github.com/3001410.js?file=4-populate-tree.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;cp /var/tmp/dud/lib/modules/2.6.16.60-0.85.1-default/updates/hp-be2net/be2net.ko linux/suse/x86_64-sles10/modules/
cp /usr/src/packages/RPMS/x86_64/hp-be2net-kmp-{default,smp,xen}*x86_64.rpm \ linux/suse/x86_64-sles10/install/
cp linux/suse/x86_64-sles10/install/*rpm suse/x86_64/&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Create post-update script to workaround a SuSE bug in processing multiple RPMs.
&lt;script src="https://gist.github.com/3001410.js?file=5-create-post-update.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;cd linux/suse/x86_64-sles10/install/
cat &gt; update.post &lt;&lt;"EOF"
#!/bin/sh
pushd `dirname $0` &gt;/dev/null
rpm -U
yast -i *.rpm
popd &gt;/dev/null
EOF&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Create MD5 sums.
&lt;script src="https://gist.github.com/3001410.js?file=6-get-md5sums.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;cd suse/x86_64/
md5sum * &gt; MD5SUMS
cd -&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Create package description.
&lt;script src="https://gist.github.com/3001410.js?file=7-create-package-description.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;cd suse/
create_package_descr -C
cd setup/descr/
sha1sum * | sed 's/^/META\ SHA1\ /'
cd -&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Create information file.
&lt;script src="https://gist.github.com/3001410.js?file=8-create-info-file.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;cat &gt; media.1/media &amp;lt;&amp;lt;EOF
Vendor ID
`date +%Y%m%d%H%M%S`
1
EOF

cat &gt; media.1/products &amp;lt;&amp;lt;EOF
/ HP_ProLiant_BL680c_G7_Driver_Kit 1.0
EOF

cat &gt; content &amp;lt;&amp;lt;EOF
PRODUCT HP_ProLiant_BL680c_G7_Driver_Kit
VERSION 1.0
PRODUCT HP_ProLiant_BL680c_G5_Driver_Kit
VERSION 1.0
DISTPRODUCT HPProLiant-BL680c-G5-sle10-sp4
DISTVERSION 1.0
VENDOR VendorID
ARCH.i686 i686 i586 noarch
ARCH.i586 i586 noarch
ARCH.x86_64 x86_64 noarch
DEFAULTBASE i586
REQUIRES product:SUSE_SLE &gt;= 10.4
DESCRDIR suse/setup/descr
DATADIR suse
META SHA1 ...
EOF&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;Build ISO.
&lt;script src="https://gist.github.com/3001410.js?file=9-build-iso.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;cd /var/tmp/dud
mkisofs -o HP_ProLiant_BL680c_G7_Driver_Kit.iso -J -r /var/tmp/dud/HP_ProLiant_BL680c_G7_Driver_Kit/
mount -o loop /var/tmp/dud/HP_ProLiant_BL680c_G7_Driver_Kit.iso /mnt/iso/
find /mnt/iso -ls&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;&lt;/li&gt;

&lt;li&gt;To use, add
&lt;blockquote&gt;&lt;pre lang="bash"&gt;dud=1&lt;/pre&gt;&lt;/blockquote&gt;
in the linuxrc boot option.&lt;/li&gt;
&lt;/ol&gt;</content><link href="http://blog.iandexter.net/feeds/7764197313435327254/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/06/howto-build-driver-update-disk-for-sles.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/7764197313435327254" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/7764197313435327254" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/06/howto-build-driver-update-disk-for-sles.html" rel="alternate" title="HOWTO: Build driver update disk for SLES" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-6607297154247744329</id><published>2012-06-12T12:41:00.000+08:00</published><updated>2012-06-12T12:41:04.652+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="In-between"/><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><title type="text">Goodbye, MBP</title><content type="html">The recently concluded Apple WWDC 2012 keynote left a bitter taste in the mouth. I can hear fanboys ooh-ing and ahh-ing, going cazy over the newfangled gadgets pandered before them; I can almost hear their eyeballs pop and their jaws drop. The raves about the new MacBook Pro (slimmer, more powerful, with better displays) was especially gritty, and set my teeth on edge.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Okay, it *is* bitter -- *I* am bitter. The wounds from my &lt;a href="http://blog.iandexter.net/2012/03/borked-mbp-keyboard.html"&gt;recent woes with the MBP&lt;/a&gt; are still fresh. And I'm afraid I might have lost the MBP for good.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Water was accidentally spilled on the MBP, while I was carrying it home on my bag, inside its sleeve. It was only when I got home that I discovered that the sleeve and the MBP was soaked. It took every ounce of control not to scream, and the first thing I did was set the MBP on its side to let the water drip.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://lh5.googleusercontent.com/-xM9MDH-eztE/T8Dz-5MlZEI/AAAAAAAA61M/BOuVNkXI0hc/s512/12%2520-%25201.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="https://lh5.googleusercontent.com/-xM9MDH-eztE/T8Dz-5MlZEI/AAAAAAAA61M/BOuVNkXI0hc/s640/12%2520-%25201.jpg" width="480" /&gt;&lt;/a&gt;&lt;/div&gt;
&amp;nbsp; 

&lt;br /&gt;
&lt;br /&gt;
I took it to the service center. A week later, they told me that the logic board needs to be replaced. The replacement board was worth Php 55,000. Uhm, let's see: I bought the 2010 MBP for Php 65,000, renewed AppleCare for Php 13,000, had the keyboard assembly replaced for Php 10,000, and bought an assortment of accessories for it. Do the math.&lt;br /&gt;
&lt;br /&gt;
There was no way in the coldest place in hell I would shell out that much to get this... thing... back to life.

So I took the MBP home. I can use an external display with it, but the battery won't charge. It won't use the power adapter either. When I got it, only five minutes of battery life were left, so I did a quick rsync to back up whatever files I can salvage.&lt;br /&gt;
&lt;br /&gt;
As I shut the MBP down, I wondered when -- if ever -- I will get a new one. The specs of the new MBPs are enticing. Wait, this is me not being a fanboy: I need a laptop, and the Mac fits my requirements at the moment. I was actually saving up for an iMac to replace the only desktop PC left in the house, but now, I don't know.&lt;br /&gt;
&lt;br /&gt;
I've always known that the cost of ownership of an Apple product can burn a hole in my pocket. I accepted that risk. I was a willing victim. I drank the Kool-Aid, too -- well, not the whole pitcher, but enough to make me chant, "Once you go Mac, there's no turning back". Now, I just feel so... empty and uncertain.&lt;br /&gt;
&lt;br /&gt;
(Not that I have an emotional attachment to the MBP, nor to any gadgets for that matter, but it did help me through some of the most crucial moments in my career. I developed and wrote my whole thesis on the thing, for one. Plus, I can run Linux pretty well on it.)&lt;br /&gt;
&lt;br /&gt;
So yeah, I'm a bit bitter, but I can move on. Goodbye, MBP. It's been a good (almost) two years.</content><link href="http://blog.iandexter.net/feeds/6607297154247744329/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/06/goodbye-mbp.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/6607297154247744329" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/6607297154247744329" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/06/goodbye-mbp.html" rel="alternate" title="Goodbye, MBP" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://lh5.googleusercontent.com/-xM9MDH-eztE/T8Dz-5MlZEI/AAAAAAAA61M/BOuVNkXI0hc/s72-c/12%2520-%25201.jpg" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-1231240805557498036</id><published>2012-05-05T11:16:00.001+08:00</published><updated>2012-06-27T12:43:55.886+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bash"/><category scheme="http://www.blogger.com/atom/ns#" term="cli"/><category scheme="http://www.blogger.com/atom/ns#" term="google"/><category scheme="http://www.blogger.com/atom/ns#" term="linux"/><category scheme="http://www.blogger.com/atom/ns#" term="picasa"/><category scheme="http://www.blogger.com/atom/ns#" term="Play"/><title type="text">Picasa uploads via command line</title><content type="html">(The tool described here has been around for a while. This is a "memo-to-self" post, as I tend to forget a lot of things these days. {Sign of old age, maybe. Heh.})&lt;br /&gt;&lt;br /&gt;I've been using Picasa for quite some time now, even opting for additional Google storage just so I can back up my photos "in the cloud". (Which reminds me to keep my current storage plan -- US$ 5 for 20 GB -- lest it be overtaken by the &lt;a href="https://support.google.com/drive/bin/answer.py?hl=en&amp;amp;answer=2374993&amp;amp;ctx=cb&amp;amp;src=cb&amp;amp;cbid=aj2kracjtl4n&amp;amp;cbrank=0"&gt;egregious Google Drive plans&lt;/a&gt;. But I digress...)&lt;br /&gt;
&lt;br /&gt;
Unfortunately, Picasa does not offer a native uploader for Linux. (Yes, there's a Wine -- yuck! -- alternative, but it's severely outdated.) So I was stuck to using the iPhoto plugin on the Mac. Most of our photos, however, are in the Linux boxes, so it gets pretty messy sharing the albums in Mac, opening them in iPhoto, and creating new albums from there.&lt;br /&gt;
&lt;br /&gt;
Enter &lt;a href="http://code.google.com/p/googlecl/"&gt;googlecl&lt;/a&gt;, which exposes Google Data APIs in a command-line interface. It's written in Python, and requires Python &amp;gt;= 2.5, and the &lt;a href="http://code.google.com/p/gdata-python-client/"&gt;gdata-python-client&lt;/a&gt;, Google Data APIs' Python client library. Setting it up is a breeze: it's as simple as downloading and unpacking the latest tar ball, running &lt;code&gt;setup.py&lt;/code&gt;, and adding the appropriate &lt;code&gt;PYTHONPATH&lt;/code&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/3001508.js?file=install-google-cl.sh"&gt;&lt;/script&gt;
&lt;noscript&gt;&lt;blockquote&gt;&lt;pre lang="bash"&gt;
cd ~/bin
curl -0 http://gdata-python-client.googlecode.com/files/gdata-2.0.17.tar.gz | tar -xz
cd gdata-2.0.17
python setup.py install --home=~
cd ..
curl -0 http://googlecl.googlecode.com/files/googlecl-0.9.13.tar.gz | tar -xz
cd googlecl-0.9.13
python setup.py install --home=~
&lt;/pre&gt;&lt;/blockquote&gt;&lt;/noscript&gt;

(&lt;b&gt;Nifty trick alert&lt;/b&gt;! Download and decompress &lt;code&gt;.tar.gz&lt;/code&gt; files using the &lt;code&gt;curl | tar -xv&lt;/code&gt; combo.)&lt;br /&gt;&lt;br /&gt;

After that, uploading to Picasa is as easy as invoking&lt;br /&gt;&lt;br /&gt;
&lt;blockquote&gt;&lt;pre lang="bash"&gt;PYTHONPATH=~/bin/gdata-2.0.17/src:~/bin/googlecl-0.9.13/src google picasa create "Album Name" /local/path/to/album/*.jpg&lt;/pre&gt;&lt;/blockquote&gt;

During the first run, an OAuth link is displayed, which would have to be opened from a browser so googlecl will be authorized to access the Picasa account.&lt;br /&gt;&lt;br /&gt;Since this is now in the command line, automation is possible for, say, uploading new photos once they're stored in a certain path, or running a &lt;code&gt;cron&lt;/code&gt; job to post new photos to an album.</content><link href="http://blog.iandexter.net/feeds/1231240805557498036/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/05/picasa-uploads-via-command-line.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/1231240805557498036" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/1231240805557498036" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/05/picasa-uploads-via-command-line.html" rel="alternate" title="Picasa uploads via command line" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-7711151584542027979</id><published>2012-03-03T15:55:00.000+08:00</published><updated>2012-03-03T16:11:59.291+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="apple"/><category scheme="http://www.blogger.com/atom/ns#" term="In-between"/><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><title type="text">Borked MBP keyboard</title><content type="html">So the Macbook Pro's keyboard broke: the kids spilled juice on it, and several keys got stuck. The laptop booted properly but I couldn't log in (I did not configure SSH).&lt;br /&gt;
&lt;br /&gt;
I took it to Digital Hub in Greenhills for repair. After a week, Digital Hub reported that the Macbook's top case was due for replacement. Since liquid damage was not covered under Apple Care, the replacement part would set me back Php10,450. Ouch. They also said that the keyboard backlight doesn't work anymore, and that the logic board also needs to be replaced because of that. The logic board replacement was quoted as Php55,000. WOW!&lt;br /&gt;
&lt;br /&gt;
No way I'm gonna replace the logic board just so I can have the fancy keyboard lights, so I opted to have the top case replaced instead.&lt;br /&gt;
&lt;br /&gt;
Two weeks later, I went back to Greenhills, claimed the Macbook, and while testing it, confirmed that the keyboard light no longer worked. I also got the old top case, and hesitantly parted with Php10,450. (That was worth some people's monthly salary already!)&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzJLn2H1Sd-JAzEJopWu1oQQJ4F7XE1aG9Q3dVlxC-PD42FYij4S4s5eV1_1hfqlBPlx_ZICdD3kaNNhJ0_6-riD-FrBp5hnaHEVCzYWCQ3EXMpTqFeqTwQI9gAX89hJmfor36zARpzg9O/s1600/03032012.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzJLn2H1Sd-JAzEJopWu1oQQJ4F7XE1aG9Q3dVlxC-PD42FYij4S4s5eV1_1hfqlBPlx_ZICdD3kaNNhJ0_6-riD-FrBp5hnaHEVCzYWCQ3EXMpTqFeqTwQI9gAX89hJmfor36zARpzg9O/s320/03032012.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;This was worth Php10,450.00&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR0eSxPI4woKnfumGgUH0Z1Y3MYqaKCoQHK_6GGZwk-rRvcn8Z5jG8vsTWQLNPNRPKXR7IlTSSSCeNxfVphaI5AVJCGRaqXbDQuMUdR8iw374w2lHnq_0l8ys5zx4hN2Y5uH6wLTx8Zuoo/s1600/03032012(001).jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR0eSxPI4woKnfumGgUH0Z1Y3MYqaKCoQHK_6GGZwk-rRvcn8Z5jG8vsTWQLNPNRPKXR7IlTSSSCeNxfVphaI5AVJCGRaqXbDQuMUdR8iw374w2lHnq_0l8ys5zx4hN2Y5uH6wLTx8Zuoo/s320/03032012(001).jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The sad Macbook's top case (back)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
The next day, I was surprised to find out the the keyboard backlight still worked. So I called up Greenhills to verify, and asked them why they also recommended to have the logic board replaced to have that functionality back. I wondered out loud if the top case replacement was really necessary.&lt;br /&gt;
&lt;br /&gt;
Digital Hub sent me an email detailing the work done on the laptop, including photos of the liquid damage. Apparently, the keyboard connectors to the logic board were already corroded, and the tech's (kneejerk) "worst-case" recommendation was to have the logic board replaced. The report also mentioned that the old keyboard has become unusable because of stuck keys.&lt;br /&gt;
&lt;br /&gt;
Okay, fine: the top case replacement may have been necessary, but for the logic board?&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_bsvIei6HNUreHy0CrXrG-ypU58ZtFjxpjjCWj-x09h4aobsCU-u8uTXF5ubo0nVTRsJKWkY78TWEGG5Kfd-eewip81Y3jFEUnOUJp056WE4iLZdFQUQ_CQG7z1GjJB1K5uwQuHQIdaGW/s1600/IMG_0001.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_bsvIei6HNUreHy0CrXrG-ypU58ZtFjxpjjCWj-x09h4aobsCU-u8uTXF5ubo0nVTRsJKWkY78TWEGG5Kfd-eewip81Y3jFEUnOUJp056WE4iLZdFQUQ_CQG7z1GjJB1K5uwQuHQIdaGW/s320/IMG_0001.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;"Evidence" of the kids' shenanigans&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmhW1jJWvzXRVWg_TF-RVpFzyzt0ormGHVZ-Espz1C5NFEPY4P2tFiiRwRaXK2caNtC_P7Lj4DCPGg6k8R0lGdGBpPTkfdZ2v8cCPmH70R9G-E0CsNwNYI6lUn0ikB6724YCwHUDSMZEPg/s1600/IMG_0002.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmhW1jJWvzXRVWg_TF-RVpFzyzt0ormGHVZ-Espz1C5NFEPY4P2tFiiRwRaXK2caNtC_P7Lj4DCPGg6k8R0lGdGBpPTkfdZ2v8cCPmH70R9G-E0CsNwNYI6lUn0ikB6724YCwHUDSMZEPg/s320/IMG_0002.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Here's another&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQfwW5qYJZpitsUFlqlwJQqa6l7T64pG0UpRuzXcRFE_uv5ZJwPvrfPBhWtQX7xCrGvCdX7ldqAGyAmqCMcc5H__hxX7VN-qYS6h8X1LKSKe31hqCGjGKN0FTvc5PJCXYY0L-VQvwjzheG/s1600/IMG_0003.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQfwW5qYJZpitsUFlqlwJQqa6l7T64pG0UpRuzXcRFE_uv5ZJwPvrfPBhWtQX7xCrGvCdX7ldqAGyAmqCMcc5H__hxX7VN-qYS6h8X1LKSKe31hqCGjGKN0FTvc5PJCXYY0L-VQvwjzheG/s320/IMG_0003.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;...and another&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlCKFkDHlmX3ecc6Ebx3ngTOC4HtngLIKVaCesOVTdIfDh_eYPcVKvXgjgujU6KW16ocADr_HcHns2vKiC-HQR1T8p93qRzAZtNPS2SfE6AXDcTIhEJaTB9i8qA-e9L5tfoMCOv8C474ms/s1600/IMG_0004.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlCKFkDHlmX3ecc6Ebx3ngTOC4HtngLIKVaCesOVTdIfDh_eYPcVKvXgjgujU6KW16ocADr_HcHns2vKiC-HQR1T8p93qRzAZtNPS2SfE6AXDcTIhEJaTB9i8qA-e9L5tfoMCOv8C474ms/s320/IMG_0004.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The "corrosion" in the logic board connectors&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKRrlyzJU3xl2Q8idt-RE0PHoh7G8SE2ude9XdYt_abmY4ojDZlykpDLOMBJ2RMWirkV3AfbhMgEzjk9G8Gt6ZcQdSwOd_f4AjV9Frxm3-wvyjqRUKtlD7U0FYBPkfxt0htiIDrCftOyCi/s1600/IMG_0005.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgKRrlyzJU3xl2Q8idt-RE0PHoh7G8SE2ude9XdYt_abmY4ojDZlykpDLOMBJ2RMWirkV3AfbhMgEzjk9G8Gt6ZcQdSwOd_f4AjV9Frxm3-wvyjqRUKtlD7U0FYBPkfxt0htiIDrCftOyCi/s320/IMG_0005.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Corrosion due to liquid damage?&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipxE9MlOU9_SgTnyeoOZWxXOgkBP1GENY-gcKH5Awh0Nr1c5MuFEnU5CRPnaNe2guexBho2gWdi7DgClQPwFNVqtcoy-6BEU9LEtniE6DjNinfek3Fj66rp81Q4kgv8EuGT_mR86aJZo1G/s1600/IMG_0006.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipxE9MlOU9_SgTnyeoOZWxXOgkBP1GENY-gcKH5Awh0Nr1c5MuFEnU5CRPnaNe2guexBho2gWdi7DgClQPwFNVqtcoy-6BEU9LEtniE6DjNinfek3Fj66rp81Q4kgv8EuGT_mR86aJZo1G/s320/IMG_0006.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;More evidence!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
My takeaway from this sad episode:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;The cost of owning an Apple product is ridiculous. Ah, the perils of being a fanboy!&lt;/li&gt;
&lt;li&gt;Apple Care is worth diddly-squat. (Well, I did RTF-fine-print, but should've paid more attention about that section on "accidental" and liquid damages.) Which brings me to...&lt;/li&gt;
&lt;li&gt;Getting a silicone keyboard protector (Php350 on CashCash Pinoy) could've saved me from this aggravation. That protector is now worth Php10,450.&lt;/li&gt;
&lt;/ol&gt;</content><link href="http://blog.iandexter.net/feeds/7711151584542027979/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/03/borked-mbp-keyboard.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/7711151584542027979" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/7711151584542027979" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2012/03/borked-mbp-keyboard.html" rel="alternate" title="Borked MBP keyboard" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzJLn2H1Sd-JAzEJopWu1oQQJ4F7XE1aG9Q3dVlxC-PD42FYij4S4s5eV1_1hfqlBPlx_ZICdD3kaNNhJ0_6-riD-FrBp5hnaHEVCzYWCQ3EXMpTqFeqTwQI9gAX89hJmfor36zARpzg9O/s72-c/03032012.jpg" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-94166900990813541</id><published>2011-09-04T10:19:00.001+08:00</published><updated>2011-09-04T10:22:51.939+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cli"/><category scheme="http://www.blogger.com/atom/ns#" term="mac"/><category scheme="http://www.blogger.com/atom/ns#" term="unix"/><title type="text">View hidden files in Mac OS X</title><content type="html">Just plunk the following in a file:&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1192112.js?file=view-hidden.sh"&gt;&lt;/script&gt;

&lt;noscript&gt;&lt;pre&gt;#!/bin/sh

defaults write com.apple.Finder AppleShowAllFiles `echo $1 | tr '[a-z]' '[A-Z]'`
killall Finder&lt;/pre&gt;&lt;/noscript&gt;

Change the file's mode to executable, then invoke using

&lt;pre&gt;view-hidden.sh yes&lt;/pre&gt;

Hidden files (including "dot" Unix files) will be viewable in Finder.</content><link href="http://blog.iandexter.net/feeds/94166900990813541/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2011/09/view-hidden-files-in-mac-os-x.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/94166900990813541" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/94166900990813541" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2011/09/view-hidden-files-in-mac-os-x.html" rel="alternate" title="View hidden files in Mac OS X" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-408901179981520101</id><published>2011-06-03T13:59:00.000+08:00</published><updated>2011-09-04T10:22:31.104+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cli"/><category scheme="http://www.blogger.com/atom/ns#" term="kerberos"/><category scheme="http://www.blogger.com/atom/ns#" term="windows"/><category scheme="http://www.blogger.com/atom/ns#" term="Work"/><title type="text">Create Kerberos keytab file for single sign-on</title><content type="html">On a Windows 200[38] server:&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/1192130.js?file=create-keytab.bat"&gt;&lt;/script&gt;

&lt;noscript&gt;&lt;pre lang="bash"&gt;ktpass -princ HTTP/[fully.qualified.domain.name]@[REALM] -mapuser [AD_user]@[REALM] -ptype KRB5_NT_PRINCIPAL -pass [password] -out c:\path\to\keytab.file&lt;/pre&gt;&lt;/noscript&gt;</content><link href="http://blog.iandexter.net/feeds/408901179981520101/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2011/06/create-kerberos-keytab-file-for-single.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/408901179981520101" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/408901179981520101" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2011/06/create-kerberos-keytab-file-for-single.html" rel="alternate" title="Create Kerberos keytab file for single sign-on" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-1318936248195222503</id><published>2011-05-20T13:07:00.000+08:00</published><updated>2011-05-20T13:07:14.601+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cars"/><category scheme="http://www.blogger.com/atom/ns#" term="lego"/><category scheme="http://www.blogger.com/atom/ns#" term="movies"/><category scheme="http://www.blogger.com/atom/ns#" term="Play"/><category scheme="http://www.blogger.com/atom/ns#" term="toys"/><title type="text">Cars 2 trailer, in LEGO</title><content type="html">ZOMGWTFBBQ! I'm *almost* through in my LEGO City Space collection (just one more set!). Will this be the next one?&lt;br /&gt;
&lt;br /&gt;
&lt;object width="500" height="314"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/hLovCmzydUg?fs=1&amp;amp;hl=en_US&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/hLovCmzydUg?fs=1&amp;amp;hl=en_US&amp;amp;hd=1" type="application/x-shockwave-flash" width="500" height="314" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;small&gt;PS. &lt;a href="http://blog.iandexter.net/2011/05/paean-to-letterpress.html"&gt;Yesterday's post&lt;/a&gt; was my 666th. Just saying.&lt;/small&gt;</content><link href="http://blog.iandexter.net/feeds/1318936248195222503/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2011/05/cars-2-trailer-in-lego.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/1318936248195222503" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/1318936248195222503" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2011/05/cars-2-trailer-in-lego.html" rel="alternate" title="Cars 2 trailer, in LEGO" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-6930516788562134790</id><published>2011-05-19T10:39:00.000+08:00</published><updated>2011-05-19T10:39:00.294+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="art"/><category scheme="http://www.blogger.com/atom/ns#" term="fun"/><category scheme="http://www.blogger.com/atom/ns#" term="nostalgia"/><category scheme="http://www.blogger.com/atom/ns#" term="Play"/><category scheme="http://www.blogger.com/atom/ns#" term="typography"/><title type="text">Paean to the letterpress</title><content type="html">(I missed the smell of ink and the sound of rolling presses. Heidelbergs, Bodoni and Blueback are personal favorites. I loved the way I can lay out pages on a grid, and then mess it up by extending beyond the column guides {the old technician laying out the leads always threw a fit!}. Photogravures were "cutting-edge" and novelties. {Yes, Pagemaker was still in its infancy when I started, and I didn't want anything to do with Ventura Publisher.} {I'm showing my age...:P})&lt;br /&gt;
&lt;br /&gt;
&lt;iframe src="http://player.vimeo.com/video/22639018?portrait=0&amp;amp;color=ffffff" width="500" height="281" frameborder="0"&gt;&lt;/iframe&gt;&lt;p&gt;&lt;small&gt;&lt;a href="http://vimeo.com/22639018"&gt;Letterpress&lt;/a&gt; from &lt;a href="http://vimeo.com/naomieross"&gt;Naomie Ross&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</content><link href="http://blog.iandexter.net/feeds/6930516788562134790/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2011/05/paean-to-letterpress.html#comment-form" rel="replies" title="1 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/6930516788562134790" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/6930516788562134790" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2011/05/paean-to-letterpress.html" rel="alternate" title="Paean to the letterpress" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5903482920942648511.post-628503748735170347</id><published>2011-05-18T10:35:00.001+08:00</published><updated>2011-05-18T15:04:24.123+08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="opensource"/><category scheme="http://www.blogger.com/atom/ns#" term="perl"/><category scheme="http://www.blogger.com/atom/ns#" term="Work"/><title type="text">Customize fatal error messages in Perl CGI apps</title><content type="html">We all know Carp and CGI::Carp, and they're quite useful when catching errors in your apps. But, the messages are butt-ugly, sorry to say. &lt;a href="http://perldoc.perl.org/CGI/Carp.html"&gt;CGI::Carp&lt;/a&gt; to the rescue. It has some nifty functions that can be used to make the error messages friendlier.&lt;br /&gt;
&lt;br /&gt;
To &lt;a href="http://perldoc.perl.org/CGI/Carp.html#Changing-the-default-message"&gt;set a custom message&lt;/a&gt; when fatal errors are encountered:&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/976257.js?file=customfatalsToBrowser.pl"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;noscript&gt;&lt;pre lang="perl"&gt;use CGI::Carp qw(fatalsToBrowser warningsToBrowser set_message);


### Custom fatals browser message
BEGIN {
    sub handle_errors {
        my $msg = shift;
        my $err_mail = "Error%20message:%0A%0A\
-------------------------------------------------------------------------------%0A\
$msg%0A\
-------------------------------------------------------------------------------%0A";
        my $err_msg = "&lt;div class=\"warning\"&gt;\
  &lt;h2&gt;Encountered an error:&lt;/h2&gt;\
  &lt;tt&gt;$msg&lt;/tt&gt;\
  &lt;p&gt;&lt;strong&gt;&lt;a href=\"mailto:email\@ddre.ss?subject=Error%20encountered&amp;body=$err_mail\"&gt;Click here&lt;/a&gt;&lt;/strong&gt; to send a report.&lt;/p&gt;\
&lt;/div&gt;";
        print($err_msg);
    }
    set_message(\&amp;handle_errors);
}
&lt;/pre&gt;&lt;/noscript&gt;&lt;br /&gt;
(Side note: The &lt;code&gt;&lt;a href="http://www.ianr.unl.edu/internet/mailto.html"&gt;mailto&lt;/a&gt;&lt;/code&gt; URI scheme has some great extensions as well.)</content><link href="http://blog.iandexter.net/feeds/628503748735170347/comments/default" rel="replies" title="Post Comments" type="application/atom+xml"/><link href="http://blog.iandexter.net/2011/05/customize-fatal-error-messages-in-perl.html#comment-form" rel="replies" title="0 Comments" type="text/html"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/628503748735170347" rel="edit" type="application/atom+xml"/><link href="http://www.blogger.com/feeds/5903482920942648511/posts/default/628503748735170347" rel="self" type="application/atom+xml"/><link href="http://blog.iandexter.net/2011/05/customize-fatal-error-messages-in-perl.html" rel="alternate" title="Customize fatal error messages in Perl CGI apps" type="text/html"/><author><name>iandexter</name><uri>http://www.blogger.com/profile/10017528709326283379</uri><email>noreply@blogger.com</email><gd:image height="16" rel="http://schemas.google.com/g/2005#thumbnail" src="https://img1.blogblog.com/img/b16-rounded.gif" width="16"/></author><thr:total>0</thr:total></entry></feed>