<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>I make Mac and iPhone software at my own company in Taipei, Taiwan.</description><title>tumblilarius lukhnos</title><generator>Tumblr (3.0; @lukhnos)</generator><link>http://blog.lukhnos.org/</link><item><title>Lithoglyphics: LadyBugz 1.6.9: More Bug Fixes</title><description>&lt;a href="http://blog.lithoglyph.com/post/976901518/ladybugz-1-6-9-more-bug-fixes"&gt;Lithoglyphics: LadyBugz 1.6.9: More Bug Fixes&lt;/a&gt;: &lt;blockquote&gt;&lt;p&gt;We’ve just released &lt;a href="http://lithoglyph.com/ladybugz/"&gt;LadyBugz&lt;/a&gt; 1.6.9. It turns out that 1.6.7 didn’t completely fix the crashing bugs, and from the crash reports we’ve received (thanks everyone for letting us know!), it concentrated in one specific area. We’ve revamped that part of the code, and version 1.6.9 should clear that issue now.&lt;/p&gt;&lt;/blockquote&gt;</description><link>http://blog.lukhnos.org/post/976967772</link><guid>http://blog.lukhnos.org/post/976967772</guid><pubDate>Thu, 19 Aug 2010 20:22:33 +0800</pubDate></item><item><title>Another Mile to Go in the GC-back-to-NonGC Transition</title><description>&lt;a href="http://blog.lithoglyph.com/post/921302735/ladybugz-1-6-6-fixes-the-crashing-bugs"&gt;Another Mile to Go in the GC-back-to-NonGC Transition&lt;/a&gt;: &lt;p&gt;From &lt;a href="http://blog.lithoglyph.com/"&gt;Lithoglyphics&lt;/a&gt;, the blog of my company:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We have just released LadyBugz 1.6.6, available from &lt;a href="http://lithoglyph.com/ladybugz/"&gt;our website&lt;/a&gt; and through auto update.&lt;/p&gt;
  
  &lt;p&gt;After we released LadyBugz 1.6.1, we have received a number of bug reports that it crashed at various places. We realized that our &lt;a href="http://blog.lithoglyph.com/post/894232657/ladybugz-1-6-better-memory-usage-bug-fixes-and"&gt;garbage collection transition&lt;/a&gt; was not completely done, and there were loose ends that we overlooked. We take those issues seriously, and after a week of testing, we believe 1.6.6 should behave way better.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I have written previously &lt;a href="http://blog.lukhnos.org/post/828780709/why-my-next-mac-app-will-not-use-garbage-collection"&gt;why we chose to go back from garbage collection to manual memory management&lt;/a&gt;, and while it was absolutely necessary, I really wish we could have found the crashing bugs earlier with a broader range of testing data set. Quitting the perks of garbage collection is a hard process (not having to worry about complex object relationship and ownership is especially addictive), and hard-to-reproduce crashing bugs suck. We have learned a thing or two the hard way.&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/921355783</link><guid>http://blog.lukhnos.org/post/921355783</guid><pubDate>Sun, 08 Aug 2010 15:25:00 +0800</pubDate></item><item><title>Cyclic Retention Pitfall in Objective-C Blocks</title><description>&lt;p&gt;Is it tempting to write the following code:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    NSBlockOperation *op = [[[NSBlockOperation alloc] init] autorelease];

    [op addExecutionBlock:^(void) {
        if (![op isCancelled]) {
            // run the block if the operation is not cancelled
        }
    }];

    [someOperationQueue addOperation:op];
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you don’t use garbage collection (gc), the snippet above will eat up memory, and the Leaks Instrument will not be able to discover it as a leak. Why?&lt;/p&gt;

&lt;p&gt;In Objective-C, blocks behave like objects. In non-gc runtime, they have retain count, can be copied&lt;sup id="fnref:p897176864-1"&gt;&lt;a href="#fn:p897176864-1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt; and must be released when you want to discard them.&lt;/p&gt;

&lt;p&gt;When a block is created, it &lt;em&gt;implicitly&lt;/em&gt; retains every Objective-C object referenced in its scope. When the block is &lt;em&gt;deallocated&lt;/em&gt;, it sends &lt;code&gt;-release&lt;/code&gt; to all those retained objects. In Objective-C, those extra calls are done for you by the compiler. If you set breakpoints to &lt;code&gt;-retain&lt;/code&gt; and &lt;code&gt;-release&lt;/code&gt;, you’ll be able to observe this behavior as blocks are created or deallocated.&lt;/p&gt;

&lt;p&gt;Usually you don’t need to worry about those things, and that’s how you can use blocks as good closures that many other modern languages have.&lt;/p&gt;

&lt;p&gt;But here’s the problem: Because blocks only send &lt;code&gt;-release&lt;/code&gt; when they are deallocated, &lt;em&gt;not&lt;/em&gt; when their scope exits, it is possible for them to retain the objects which retain them. The code snippet above is a case in point. The &lt;code&gt;NSBlockOperation&lt;/code&gt; object &lt;code&gt;op&lt;/code&gt; retains an execution block, but then the block implicitly retains &lt;code&gt;op&lt;/code&gt;. The result of such cyclic retention is that the retain count of &lt;code&gt;op&lt;/code&gt; will never reach zero, and hence &lt;code&gt;op&lt;/code&gt; will eat up a chuck of unreclaimable memory. And because &lt;code&gt;op&lt;/code&gt; is retained by another object, it is not a lone wanderer that you forget to call &lt;code&gt;-release&lt;/code&gt;, therefore the Leaks Instrument will never discover it as a leak.&lt;/p&gt;

&lt;p&gt;A solution to this problem would be:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    NSBlockOperation *op = [[[NSBlockOperation alloc] init] autorelease];

    NSValue *weakOpValue = [NSValue valueWithNonretainedObject:op];
    [op addExecutionBlock:^(void) {
        if (![[weakOpValue nonretainedObjectValue] isCancelled]) {
            // run the block if the operation is not cancelled
        }
    }];

    [someOperationQueue addOperation:op];
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The &lt;code&gt;NSValue&lt;/code&gt; object used above is effectively a weak reference to &lt;code&gt;op&lt;/code&gt;. This breaks the retention cycle, so the &lt;code&gt;-dealloc&lt;/code&gt; of &lt;code&gt;op&lt;/code&gt; will now be called, and the block will also be released.&lt;/p&gt;

&lt;p&gt;Cyclic retention is not a problem for Objective-C runtime’s garbage collector, so the first code snippet will not be a problem if you use gc.&lt;/p&gt;

&lt;p&gt;Another incomplete solution is for Apple to change the timing of calling &lt;code&gt;-release&lt;/code&gt; in a block. Releasing retained objects when a block exits seems to be a reasonable expectation. But, given the nature of the use case above (an &lt;code&gt;NSBlockOperation&lt;/code&gt; might never get executed), plus the fact that referenced objects must be retained before a block is entered, it’s not an encompassing solution, although it would make blocks behave more to such expectation.&lt;/p&gt;

&lt;p&gt;One final note: Because of the potential risk of cyclic retention, you must be very careful if you use blocks within a block. This is one place where gc can liberate us from such a blocking issue (pun intended), but gc is not available on the iOS and has &lt;a href="http://blog.lukhnos.org/post/828780709/why-my-next-mac-app-will-not-use-garbage-collection"&gt;its issues&lt;/a&gt; on Mac, too.&lt;/p&gt;

&lt;div class="footnotes"&gt;
&lt;hr&gt;&lt;ol&gt;&lt;li id="fn:p897176864-1"&gt;
&lt;p&gt;But not retained. The reason is that when a block is first created, its scope refers to the values residing in the nearest outer scope on the stack. If you toss it around (i.e. passing it as an object), it must first make a (const) copy of those values onto the heap. If you just retain a block then pass it around, chances are it’s still referring to the stack. And you know what will happen when dangling stack references are passed around. &lt;a href="#fnref:p897176864-1" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;&lt;/div&gt;</description><link>http://blog.lukhnos.org/post/897176864</link><guid>http://blog.lukhnos.org/post/897176864</guid><pubDate>Tue, 03 Aug 2010 16:20:00 +0800</pubDate></item><item><title>As my favorite French saying goes, jamais deux sans trois, or...</title><description>&lt;img src="http://25.media.tumblr.com/tumblr_l5t0v5zcYQ1qz57z1o1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;As my favorite French saying goes, &lt;em&gt;jamais &lt;a href="http://log.emonk.net/post/831647814/this-is-what-actually-happened"&gt;deux&lt;/a&gt; &lt;a href="http://kurafire.tumblr.com/post/831281552/antennagate-animation"&gt;sans&lt;/a&gt; &lt;a href="http://cocoa.zonble.net/post/831066374/epic-taiwanese-news-iphone-4-subbed-via"&gt;trois&lt;/a&gt;&lt;/em&gt;, or literally in English, “never twice without thrice”.&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/831820228</link><guid>http://blog.lukhnos.org/post/831820228</guid><pubDate>Mon, 19 Jul 2010 20:18:00 +0800</pubDate></item><item><title>Update: Replaced the video with a new version with English...</title><description>&lt;object width="400" height="336"&gt;&lt;param name="movie" value="http://www.youtube.com/v/YNSHA3FBW2U&amp;rel=0&amp;egm=0&amp;showinfo=0&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/YNSHA3FBW2U&amp;rel=0&amp;egm=0&amp;showinfo=0&amp;fs=1" type="application/x-shockwave-flash" width="400" height="336" allowFullScreen="true" wmode="transparent"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Replaced the video with a new version with English subtitles.&lt;/p&gt;

&lt;p&gt;Earlier this year, a Taiwanese newspaper, &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Apple_Daily"&gt;Apple Daily&lt;/a&gt;&lt;/em&gt; (蘋果日報, not affiliated with Apple Inc.), made an Animation News (動新聞) clip on &lt;a href="http://www.youtube.com/watch?v=lJ9m1an-pQ8"&gt;the Jay Leno-Conan O’Brien spat&lt;/a&gt;, which I also &lt;a href="http://blog.lukhnos.org/post/343819163/i-dont-watch-tv-and-i-dont-have-access-to"&gt;re-posted&lt;/a&gt;. But &lt;em&gt;Apple Daily&lt;/em&gt;’s real fame started with its animated Tiger Woods &lt;a href="http://www.youtube.com/watch?v=fGfVB9kA5QQ"&gt;tabloid series&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Anyway, this is the new one on Apple’s &lt;a href="http://www.youtube.com/watch?v=Tn-YesqzvNk"&gt;Antennagate&lt;/a&gt;. And once again you don’t need to know any Mandarin Chinese (the official language in Taiwan) in order to understand the gist of the story. Now I must warn you not to eat or drink in front of your laptop while watching this clip…&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/831807110</link><guid>http://blog.lukhnos.org/post/831807110</guid><pubDate>Mon, 19 Jul 2010 20:13:00 +0800</pubDate></item><item><title>Why My Next Mac App Will Not Use Garbage Collection</title><description>&lt;p&gt;Among the many things I have learned from the past few years’ experience of developing desktop applications, here’s one: Implement your app conservatively. This often translates to using only proven technologies. Cocoa’s garbage collection (gc), alas, does not seem to be one of them. My next Mac app will not use garbage collection. In fact, we are actually even taking the pain of modifying &lt;a href="http://lithoglyph.com/ladybugz/"&gt;an existing garbage collected app&lt;/a&gt; to non-gc.&lt;/p&gt;

&lt;p&gt;Since Mac OS X 10.5, you can choose to use &lt;a href="http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/GarbageCollection/Introduction.html"&gt;automatic garbage collection&lt;/a&gt; in your Cocoa app. Apple’s take on gc is a brilliant engineering feat, which makes Objective-C a more modern language (and it’s even &lt;a href="http://www.opensource.apple.com/source/libauto/libauto-77.1/"&gt;open source&lt;/a&gt;). Before gc, memory management is much like manual transmission and requires a lot of mental arithmetic — you need to retain an object (to increase its refcount) when you start using it, and release it (to decrease its refcount) when you relinquish its ownership. With gc, no more such mental arithmetic is required. It’s great that you are saved the burden of memory management, particularly when you have other more nasty things to worry about, such as multithreading (which makes manual management harder) and binding (which complicates object graph).&lt;/p&gt;

&lt;p&gt;Unfortunately, I have found a few instances that Cocoa’s gc doesn’t work that well. This has particularly to do with libraries that are beyond gc’s reach. I’ll name three: &lt;a href="http://developer.apple.com/mac/library/documentation/Security/Reference/secureTransportRef/Reference/reference.html"&gt;Secure Transport&lt;/a&gt; (which handles things like HTTPS), &lt;a href="http://site.icu-project.org/"&gt;icucore&lt;/a&gt; (which handles localization and date/time formatting), and XML parsers (I have tried both NSXMLParser and expat). These three can already leak from time to time when being called from the main thread alone, and almost gurantee to leak if used in different threads, even if proper locks and one-instance-per-thread-at-a-time policies are enforced.&lt;/p&gt;

&lt;p&gt;You might be tempted to think, big deal, if those stacks have their baggage and work best in a non-gc app, I’ll just write a separate app, and use &lt;a href="http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/DistrObjects/DistrObjects.html"&gt;distributed objects&lt;/a&gt; (DO), another fancy technology, to bridge between the gc and non-gc processes. Here’s the bad news: There is apparently a bug in Apple’s DO implementation under gc, and all proxies objects that ever created to communicate with the remote process &lt;a href="http://stackoverflow.com/questions/201404/cocoa-distributed-objects-gc-client-non-gc-server"&gt;will not be destroyed&lt;/a&gt; until the app’s termination.&lt;/p&gt;

&lt;p&gt;So for the time being my conclusion is, if your app is network-intesive, needs to do a lot of things in parallel, and happens to parse a lot of XML and has a fairly complex user interface that relies on binding, then garbage collection probably isn’t for you.&lt;/p&gt;

&lt;p&gt;Now the only big question that I have is, how did Xcode manage it? Xcode, as we know it, is a garbage collected app&lt;sup id="fnref:p828780709-1"&gt;&lt;a href="#fn:p828780709-1" rel="footnote"&gt;1&lt;/a&gt;&lt;/sup&gt;. It’s also said to be Apple’s most complicated application. Now, unlike Mail.app, Xcode doesn’t seem to do lots of date/time formatting. It reads plist (for which Apple has a faster parser implemetation) but not really XML. The only network-bound parts seem to be the documentation fetcher and the recently-added automatic iPhone provisioning. Much of the IDE seems to be there already in OS X 10.3 days. All told, Xcode seems to stand well.&lt;/p&gt;

&lt;p&gt;I’d like to know to make those non-Cocoa parts work with gc. But before that, I’ll take the more conservative path.&lt;/p&gt;

&lt;div class="footnotes"&gt;
&lt;hr&gt;&lt;ol&gt;&lt;li id="fn:p828780709-1"&gt;
&lt;p&gt;I know this because the previous generation of our Adobe Kuler color picker, &lt;a href="http://lithoglyph.com/mondrianum/"&gt;Mondrianum&lt;/a&gt;, used (and still uses) a cover flow image view, which doesn’t work under gc. In the previous generation, we used some NSGarbageCollector hacks (don’t ask) to manage to make the plug-in work within Xcode. In the current version we have decided not to support gc apps like Xcode, because those hacks never worked perfectly. &lt;a href="#fnref:p828780709-1" rev="footnote"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;&lt;/div&gt;</description><link>http://blog.lukhnos.org/post/828780709</link><guid>http://blog.lukhnos.org/post/828780709</guid><pubDate>Mon, 19 Jul 2010 03:32:00 +0800</pubDate></item><item><title>LadyBugz 1.5</title><description>&lt;a href="http://blog.lithoglyph.com/post/827596934/ladybugz-1-5-case-history-view-got-a-facelift"&gt;LadyBugz 1.5&lt;/a&gt;: &lt;p&gt;My company’s FogBugz client application for Mac, LadyBugz, has a new version. We have given the case history view a facelift, along with many improvements and bug fixes. We weren’t sure if we were on the right direction when we started to make the major interface change, so we asked a few of our customers if they’d like to try out a beta version. The initial response was positive, and so we sent the merge command, and the tentative branch became the main. This enables us to take on implementing other frequently requested features, and we believe this version is a substantial improvement.&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/828612409</link><guid>http://blog.lukhnos.org/post/828612409</guid><pubDate>Mon, 19 Jul 2010 02:37:19 +0800</pubDate></item><item><title>A great example of the 30+ year old “Y/N” interface.</title><description>&lt;img src="http://29.media.tumblr.com/tumblr_l3ygcxhYnu1qz57z1o1_500.png"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;A great example of the 30+ year old “Y/N” interface.&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/693807917</link><guid>http://blog.lukhnos.org/post/693807917</guid><pubDate>Sun, 13 Jun 2010 21:34:09 +0800</pubDate></item><item><title>SQLite Turns 10</title><description>&lt;p&gt;D. Richard Hipp, creator of &lt;a href="http://sqlite.org/"&gt;SQLite&lt;/a&gt;, in &lt;code&gt;sqlite-users&lt;/code&gt; mailing list:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Some of the code in SQLite (such as the Lemon parser generator and the printf implementation) dates back to the late 1980s.  But the core of SQLite was not started until 10 years ago.  Ten years is not that long ago, though it has been long enough to amass 7114 check-ins - an average of 2.1 check-ins per day.  If you are overseeing such a project, 10 years seems like forever.  It has hard for me to remember a time when I wasn’t working on SQLite.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;SQLite is my favorite software project and a role model. It is lightweight, efficient, self-contained, and vastly powerful. Not many software projects can be said of the all four, especially in terms of self-containedness. SQLite now states it status as public domain in a more official manner (out of institutional use considerations), but I believe all of us can learn a lot from the blessing  in its source code:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;May you do good and not evil&lt;br/&gt;
  May you find forgiveness for yourself and forgive others&lt;br/&gt;
  May you share freely, never taking more than you give.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also had the opportunity to work on a client project that used SQLite’s both paid versions—&lt;a href="http://www.hwaci.com/sw/sqlite/see.html"&gt;SEE&lt;/a&gt; and &lt;a href="http://www.hwaci.com/sw/sqlite/cerod.html"&gt;CEROD&lt;/a&gt;—and SQLite never disappointed.&lt;/p&gt;

&lt;p&gt;I wish the best for the project, and look forward to its 20th and 30th birthdays.&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/646478318</link><guid>http://blog.lukhnos.org/post/646478318</guid><pubDate>Sun, 30 May 2010 19:14:00 +0800</pubDate></item><item><title>Formosana, a Collection of C++ Libraries for Processing Taiwanese Languages</title><description>&lt;p&gt;&lt;a href="http://github.com/lukhnos/formosana"&gt;Formosana&lt;/a&gt; is a C++ library collection that provides basic building blocks for processing Taiwanese languages. Currently three languages are supported: &lt;a href="http://en.wikipedia.org/wiki/Mandarin_Chinese"&gt;Mandarin&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Min_Nan"&gt;Holo&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Hakka_Chinese"&gt;Hakka&lt;/a&gt;. It also provides a language-agnostic, bigram-based word segmentation library. It has no external dependencies and can be built on most platforms I know of. It is available on github under the MIT License.&lt;/p&gt;

&lt;p&gt;My &lt;a href="http://lithoglyph.com/about/"&gt;day job&lt;/a&gt; is commercial iPhone and Mac software development. In addition to that, I also develop open source software, mostly in the form of libraries. Designing libraries and frameworks is both a good exercise in itself and an important part of software development. It pushes you to think and plan head for future consumption, and it also gives you a good opportunity to think about the fundamentals of a given problem set.&lt;/p&gt;

&lt;p&gt;Formosana currently has three major components:&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;Formosa::Mandarin&lt;/strong&gt;: A library for processing Mandarin syllables and handling text input keyboard layouts. An abstract data type represents Mandarin syllable. The syllable data type accepts both &lt;a href="http://en.wikipedia.org/wiki/Pinyin"&gt;Pinyin&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Bopomofo"&gt;Bopomofo&lt;/a&gt; as input, and can be used to convert to either form as output. Its internal representation guarantees that the syllable in always in the CVC&lt;super&gt;T&lt;/super&gt; form, although it does not guarantee that the produced syllable is always phonetically grammatical (i.e. it can be used to produce syllables not found in the actual Mandarin). It also support &lt;a href="http://zh.wikipedia.org/zh/%E6%B3%A8%E9%9F%B3%E8%BC%B8%E5%85%A5%E6%B3%95"&gt;four major keyboard layouts&lt;/a&gt; (expandable) that map a standard US keyboard to Bopomofo symbols.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Formosa::TaiwaneseRomanization&lt;/strong&gt;: A library for processing Romanized Holo and Hakka. An abstract data type represents Holo or Hakka syllable. Internally it uses &lt;a href="http://en.wikipedia.org/wiki/Pe%CC%8Dh-%C5%8De-j%C4%AB"&gt;POJ&lt;/a&gt; (pe̍h-oē-jī, also called Church Romanization by some). It accepts POJ for both input and output. &lt;a href="http://en.wikipedia.org/wiki/Taiwanese_Romanization_System"&gt;Tâi-lô&lt;/a&gt; (TL, or Taiwanese Romanization System),  technically a POJ variation that is the standard for Romanized Holo used by Taiwan’s Ministry of Education, can also be used as both input and output. This syllable library has a normalization member function that guarantees only the composed tonal mark is placed on the correct vowel character according to the resonance in the Holo language. It is weaker than its Mandarin counterpart in that the syllable class does not guarantee the represented syllable is always in the Initial+Vowel+Final+Tone form. It accepts both “composed” form (syllable with diacritics) and “uncomposed” form (tone in numerals, also called database query form in the library) for input, and can also produce output in either forms. This library also supports keyboard layout mappings. Both numerical tone input and dead key combinations are supported.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Formosa::Gramambular&lt;/strong&gt; (literally, “gram walking”): A language-agnostic, bigram-based word segmentation library. It accepts an input set of weight unigram and bigram key-value pairs, and output a best-scored path. If the key is input syllables and value is a Chinese phrase that the syllables represent, the walk is an input method. If we reverse the key and value, it becomes a word segmentation tool. As the library works without any grammatical knowledge, the quality of the dictionary (that provides the data source for weighted nodes) is the deciding factor of the output quality. I have mentioned the principal of the library’s design in &lt;a href="http://lukhnos.org/talks/20080412-lukhnos-OSDCtw2008Talk.pdf"&gt;a talk&lt;/a&gt; at Open Source Developer Conference, Taipei, Taiwan, in 2008. As a bonus, Gramambular has a debug helper that can produce outputs in the &lt;a href="http://www.graphviz.org/"&gt;Graphviz&lt;/a&gt; DOT format, which you can then feed into the tool and get visualizations like &lt;a href="http://www.flickr.com/photos/lukhnos/4382978536/"&gt;this&lt;/a&gt; and &lt;a href="http://www.flickr.com/photos/lukhnos/4382978434/"&gt;this&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Each of the components comes with its own demo code. I have also supplied Makefiles (for Mac OS X and other UNIX platforms) and Microsoft Visual C++ solution files for those sample projects.&lt;/p&gt;

&lt;p&gt;The library collection makes use of a few helper classes from &lt;a href="http://github.com/lukhnos/openvanilla-renaissance"&gt;The OpenVanilla Project&lt;/a&gt;. I have included those class files (also written by me) in the source to make the collection buildable with no external dependencies.&lt;/p&gt;

&lt;p&gt;Formosana was first designed for developing input methods, and both the Mandarin and the Taiwanese Romanization modules have been used in actual products. Although Gramambular has not yet been used in production, I have previously worked on an implementation based on similar principles for an internal project at my company. The commit history of the project will tell you that Gramambular was written pretty fast (2 days) from ground-up. For me it was also an exercise to start over from scratch to see if the design is solid.&lt;/p&gt;

&lt;p&gt;The library collection has many other uses in processing Taiwanese languages. There is also space for improvement. For example, a syllable class that can validate against the phonetic grammar is highly desirable. Currently the Taiwanese Romanization class instances are mutable. Normalization changes internal representation instead of returning a new immutable object. In addition, for the libraries to be useful for building language-related web applications, bindings to major scripting languages are also desirable. These are the things that developers interested in the field can work on.&lt;/p&gt;

&lt;p&gt;I’ll be highly interested in hearing from you if you use or plan to use Formosana in your own projects. My contact info regarding to this project can be found on &lt;a href="http://github.com/lukhnos/"&gt;my github profile&lt;/a&gt;.&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/577338909</link><guid>http://blog.lukhnos.org/post/577338909</guid><pubDate>Fri, 07 May 2010 08:09:00 +0800</pubDate></item><item><title>Photo</title><description>&lt;img src="http://27.media.tumblr.com/tumblr_l0yw06xlgD1qz57z1o1_r1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;</description><link>http://blog.lukhnos.org/post/525597291</link><guid>http://blog.lukhnos.org/post/525597291</guid><pubDate>Fri, 16 Apr 2010 19:31:17 +0800</pubDate></item><item><title>Jamreilly: Lewis Thomas on the etymology of etymology</title><description>&lt;a href="http://jamreilly.tumblr.com/post/479551483/lewis-thomas-on-the-etymology-of-etymology"&gt;Jamreilly: Lewis Thomas on the etymology of etymology&lt;/a&gt;: &lt;p&gt;&lt;blockquote&gt;
The connection of soothe to yes is strange but true; it takes a bit of relaxing to get it straight in the mind. I suppose that if something is, and is true, and leads to nodding of the head, and brings the archaic response sooth, or the modern answer yes, it is a soothing experience. The truth is not always soothing, but in a better world it ought to be.
&lt;/blockquote&gt;&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/493493214</link><guid>http://blog.lukhnos.org/post/493493214</guid><pubDate>Sat, 03 Apr 2010 23:26:43 +0800</pubDate></item><item><title>New Work: LadyBugz, a FogBugz Client for Mac</title><description>&lt;p&gt;&lt;img src="http://lithoglyph.com/ladybugz/images/main-screenshot.jpg"/&gt;&lt;/p&gt;

&lt;p&gt;I’m happy that my company just released the version 1.0 of &lt;a href="http://ladybugzapp.com"&gt;LadyBugz&lt;/a&gt;, a &lt;a href="http://www.fogcreek.com/FogBUGZ/"&gt;FogBugz&lt;/a&gt; client for Mac.&lt;/p&gt;

&lt;p&gt;If you just heard FogBugz for the first time, it is a “bug and issue tracking, project management, help desk software” service. FogBugz is a product of &lt;a href="http://www.fogcreek.com/"&gt;FogCreek&lt;/a&gt;, one of whose founders is &lt;a href="http://www.joelonsoftware.com/"&gt;Joel Spolsky&lt;/a&gt;, the software luminary behind &lt;a href="http://www.joelonsoftware.com/"&gt;Joel on Software&lt;/a&gt; and &lt;a href="http://stackoverflow.com/"&gt;Stack Overflow&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What Zonble and I like about FogBugz is that it fits the needs of a software company well. The nature of our work requires a good issue tracking tool, but we also need to communicate with clients and customers. Many issue tracking tools are not designed with support department in mind, and this is where FogBugz does it just right.&lt;/p&gt;

&lt;p&gt;As we used FogBugz more and more, it became natural that we wanted to create a native Mac client for it. It’s interesting that many good Mac and iPhone applications these days are client software to well established services. &lt;a href="http://www.atebits.com/tweetie-mac/"&gt;Tweetie&lt;/a&gt; is a good example. We also happened to know one thing or two about &lt;a href="http://lithoglyph.com/about/portfolio/"&gt;working with successful web services&lt;/a&gt;. So we decided to create a Mac client to FogBugz that we want to have the best of the two worlds: good web service delivered with a fast native interface.&lt;/p&gt;

&lt;p&gt;The version 1.0 of LadyBugz gives users an integrated case and event browser, a case editor, and a mail composer. Those three components correspond to the three areas in which FogBugz excels: project management, bug and issue tracking, and help desk / customer service integration. It also comes with snippet support, an important feature for people who do frontline support services. Good help desk features are what make FogBugz stand out among similar services, and we would also like to design LadyBugz with both engineering and support departments in mind.&lt;/p&gt;

&lt;p&gt;We had the first beta version up and running in mid-November last year, and since then we used it every day for our project management and product support. Like many applications with ambitious feature sets, LadyBugz also underwent architectural changes and total rewrites. We’ve also decided to target solely on the latest Mac OS X (10.6) so that we can leverage great tools like Grand Central Dispatch-backed NSOperationQueue, blocks, and many user interface improvements. The aim is to create smooth user experience with good technical performances.&lt;/p&gt;

&lt;p&gt;Since this is our first full-featured Mac application, and also our first commercial product developed as an independent software vendor, we really hope LadyBugz brings good value to FogBugz users. And just like any version 1.0 software, this is really just the beginning of many great plans ahead. We want to spread the words, and will continue bringing out great things to our users.&lt;/p&gt;

&lt;p&gt;Finally, I’d like to thank Mike Ash, Jeff Johnson and Lee Falin of &lt;a href="http://www.rogueamoeba.com/"&gt;Rogue Amoeba&lt;/a&gt;, Joe Goh of &lt;a href="http://www.funkeemonk.com/phonejournal/"&gt;Phone Journal&lt;/a&gt;, Pierre Bernard of &lt;a href="http://www.houdah.com/"&gt;Houdah Software&lt;/a&gt;, Justin Williams of &lt;a href="http://www.secondgearsoftware.com/"&gt;Second Gear&lt;/a&gt;, and Evadne Wu of Iridia Productions for having given us many suggestions that shaped the application. I’d also like to express my gratitude to the authors of &lt;a href="http://lithoglyph.com/ladybugz/credits/"&gt;the open source libraries that we use&lt;/a&gt;, including &lt;a href="http://sparkle.andymatuschak.org/"&gt;Sparkle&lt;/a&gt; and many others—they are a major force that makes the Mac developer community strong and vibrant.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ladybugzapp.com/"&gt;LadyBugz&lt;/a&gt; is commercial software, with an individual license for US$55. You can &lt;a href="http://ladybugzapp.com/"&gt;download and try it&lt;/a&gt; with full features for free for 21 days. It also has a presence on &lt;a href="http://twitter.com/ladybugzapp"&gt;Twitter&lt;/a&gt;, so follow us and let us know how we do.&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/474863917</link><guid>http://blog.lukhnos.org/post/474863917</guid><pubDate>Fri, 26 Mar 2010 22:53:00 +0800</pubDate></item><item><title>LLVM Wallpaper and OS X's xattr</title><description>&lt;p&gt;For the past few months I’ve been using &lt;a href="http://www.sunsetlakesoftware.com/sites/default/files/SnowLeopard-Server-LLVM.jpg"&gt;this&lt;/a&gt; as my wallpaper/desktop background. I’m seldom a fan of any personality or any project, but hey it’s &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I finally found out the source of the picture. It’s made by putting the &lt;a href="http://llvm.org/Logo.html"&gt;LLVM logo&lt;/a&gt; over one of &lt;a href="http://blog.cocoia.com/category/wallpapers/"&gt;Cocoia’s wallpapers&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;How did I find out the source? I must have seen the link from some friend’s twitter long time ago, but the friend’s tweets are locked, and Twitter’s search is not really helpful.&lt;/p&gt;

&lt;p&gt;So how did I finally find out? Surprisingly, via Get Info in Finder! Essentially, it’s the xattr (extended attributes) in the file. Since 10.5, all files downloaded by Safari carry an xattr called &lt;code&gt;com.apple.metadata:kMDItemWhereFroms:&lt;/code&gt;. You can use the command line tool &lt;code&gt;xattr&lt;/code&gt; to inspect those attributes. The attribute values are in the form of property lists.&lt;/p&gt;

&lt;p&gt;I find this a good point to show the importance of file system advance and why metadata matters.&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/465959868</link><guid>http://blog.lukhnos.org/post/465959868</guid><pubDate>Tue, 23 Mar 2010 01:26:00 +0800</pubDate></item><item><title>The Afterbuzz</title><description>&lt;p&gt;Jacqui Cheng of &lt;a href="http://arstechnica.com/tech-policy/news/2010/02/google-works-to-clean-up-buzz-privacy-mess-after-launch.ars"&gt;ars technica&lt;/a&gt;, my emphasis:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;These swift and widespread changes to Buzz’s automatic-everything behaviors are certainly commendable, and it’s clear that Google does listen to user feedback in ways that other companies don’t. However, the sheer extent to which the company had to back off from its initial launch functionality goes to show &lt;em&gt;how delusional Google was when it came to its assumptions about user privacy&lt;/em&gt;.&lt;/p&gt;
  
  &lt;p&gt;Just because I share something somewhere else on the Internet doesn’t mean I want it auto-linked to something else I use, and just because I choose to use Gmail doesn’t mean I even necessarily want to be involved in Buzz at all. Those should be choices that are left up to the user, not Google on behalf of the user. End result: Google is left cleaning up its messes when it could be moving forward.&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://blog.lukhnos.org/post/392553686</link><guid>http://blog.lukhnos.org/post/392553686</guid><pubDate>Tue, 16 Feb 2010 18:28:11 +0800</pubDate></item><item><title>Reblog: A conversation Dan Wineman has every month or so</title><description>&lt;p&gt;&lt;a href="http://mrgan.tumblr.com/post/389906525/a-conversation-dan-wineman-has-every-month-or-so" class="tumblr_blog"&gt;mrgan&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Even if Flash were the world’s best-engineered animation and interaction technology (which, lol, it’s not) scorn would be heaped on it for what it has allowed people to do to restaurant websites.&lt;/p&gt;
&lt;p&gt;That said, I recommend that you write a nice email to your local Flash-webbed business and suggest to them, as nicely as you can, that they offer a one-page summary of what you need to know: hours, location, menu if possible. My &lt;a href="http://www.apizzascholls.com/"&gt;favorite restaurant&lt;/a&gt; in the world has an eye-gouging website which nevertheless tells you all you need to know in the first three seconds of browsing.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;I can’t agree more. So many times I had to pick a random place to eat because the one I wanted to go had, darn, a Flash-only website. Flash is even more entrenched in Taiwan because business owners find it flashy, and flashy things mean they’re getting the money’s worth.&lt;/p&gt;

&lt;p&gt;What restaurant owners don’t realize is Flash-only websites actually hurt their business.  Responsible designers should remind their clients that. Although I’d say the exact opposite is at work here. It’s the incentive thing.&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/389921188</link><guid>http://blog.lukhnos.org/post/389921188</guid><pubDate>Mon, 15 Feb 2010 10:05:00 +0800</pubDate></item><item><title>Imagine If Your Bank Did That to You...</title><description>&lt;p&gt;This is from the leader article, “&lt;a href="http://www.economist.com/opinion/displayStory.cfm?Story_ID=E1_JSNVNSN"&gt;Who’s Afarid of Google?&lt;/a&gt;”, of &lt;em&gt;The Economist&lt;/em&gt;, August 30, 2007, my emphasis:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Google is often compared to Microsoft (another enemy, incidentally); but its evolution is actually closer to that of the banking industry. Just as financial institutions grew to become repositories of people’s money, and thus guardians of private information about their finances, Google is now turning into a custodian of a far wider and more intimate range of information about individuals. […]&lt;/p&gt;
  
  &lt;p&gt;[…] That said, conflicts of interest will become inevitable—especially with privacy.&lt;/p&gt;
  
  &lt;p&gt;[…] The answer, as with banks in the past, must lie somewhere in the middle; and the right point for the dial is likely to change, as circumstances change. That will be the main public interest in Google. […]&lt;/p&gt;
  
  &lt;p&gt;One obvious strategy is to allay concerns over Google’s trustworthiness by becoming more transparent and opening up more of its processes and plans to scrutiny. But it also needs a deeper change of heart. Pretending that, just because your founders are nice young men and you give away lots of services, society has no right to question your motives no longer seems sensible. &lt;em&gt;Google is a capitalist tool—and a useful one. Better, surely, to face the coming storm on that foundation, than on a trite slogan that could be your undoing&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think many of us in the tech industry, who are supposed to know better, are actually confused about the multiple definitions of the term “openness”. Promoting open source technology and openness in tech standards is usually a good thing. Crossing the border to make your life open, without qualification, prior notice or warning, is not. Imagine if your bank did what Google Buzz did to you, making your account history open and trackable by others (say, those you recently wired money to, or received wires from), what your reaction would be? I’d say the bank would be in big trouble.&lt;/p&gt;

&lt;p&gt;Google has improved Buzz’s privacy settings for the past few days. Still, there are questions on how the whole thing happened at all. I’m also troubled by the fact that Google’s PR machine doesn’t sound a bit apologetic—so the inconveniences and confusions (to say the least) that many users had endured for the past few days were whitewashed.&lt;/p&gt;

&lt;p&gt;Counternotions, a blog that often raises sharp questions on big players’ strategies, &lt;a href="http://counternotions.com/2010/02/12/buzz/#comments"&gt;comments&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Yes, someone at Google […] thought it was alright AND excellent business practice to graft Buzz over Gmail simply for expediency. Now, we hear they may separate the two. But not only the damage is done, but we also know that there’s not enough deep thinking about and appreciation of the customer experience at all at Google. It’s naive beyond belief, for a $150B company.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If a company starts to think it’s beyond reproach and its customers accept whatever new thing it gives them, it’s a bad sign indeed.&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/389310225</link><guid>http://blog.lukhnos.org/post/389310225</guid><pubDate>Mon, 15 Feb 2010 02:36:00 +0800</pubDate></item><item><title>Thank You, Google, for Wasting One Hour of My Precious Working Time Rescuing My Friends' and My Privacy, for Making Me Unable to Sleep Well from Now On.</title><description>&lt;p&gt;As I said in &lt;a href="http://blog.lukhnos.org/post/383210072/social-network-and-email-dont-go-together"&gt;a previous post&lt;/a&gt;, I turned off Google Buzz immediately when it was enabled onto my gmail account. I was annoyed by the fact that I was not asked to opt in, shocked by the fact that many of my email contacts were automatically added in, and deeply troubled by the fact that, from a quick glance, &lt;em&gt;I have absolutely no control&lt;/em&gt; over the whole thing: access control and privacy level settings.&lt;/p&gt;

&lt;p&gt;I turned off Buzz by clicking on the very small text link at the very bottom of my gmail page. Who would have thought that it is put in the very sheepish place where privacy policy and other legal prints are? And that’s not even the end of the story.&lt;/p&gt;

&lt;p&gt;A few friends have reported that many of your online traces are still there even if you turned off Buzz. I had a hunch that it was going to be bad. So I re-enabled Buzz and did some experiments with other friends. &lt;strong&gt;It was worse&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A quick summary of a few very troubling facts.&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;&lt;p&gt;&lt;strong&gt;People can see who you are inadvertently following&lt;/strong&gt;. That mostly includes contacts you’ve recently writing to. Good luck if you were writing to an old flame, to a competitor, to a potential client that asks to remain confidential, or to a potential new employer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You’re inadvertently added to people’s follow list&lt;/strong&gt;. And you have absolutely no control over who can see you and who can add you.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;People can see who you’re inadvertently following and who are inadvertently following you&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blocking people takes you away from people’s follow list. If I block Alice, I’m now gone from Alice’s follower list. So when Bob looks at Alice’s follower list, he won’t see me. But,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You have to re-enable Buzz to block people&lt;/strong&gt;. If you don’t block people, they’ll stay on your follower list forever.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Even if you have turned off Buzz, people are still able to find you—and as a result are able to comb through your “social network”—through other people’s follower/following lists&lt;/strong&gt;. I’ve heard that if you have ever created a Google Profile, or is sharing your Google Reader feeds to Buzz, the situation is worse.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;If someone disabled Buzz, you can’t block them&lt;/strong&gt;. Because there is no longer a profile link for you to click into, and that’s the only place to unfollow people. And they’ll stay in your “following you” list forever.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Confusing? I’m as confused as you are.&lt;/p&gt;

&lt;p&gt;The damage is already done. Evgeny Morozov of &lt;em&gt;Foreign Policy&lt;/em&gt; has written on the &lt;a href="http://neteffect.foreignpolicy.com/posts/2010/02/11/wrong_kind_of_buzz_around_google_buzz"&gt;political ramification of Google’s careless rollout of Buzz&lt;/a&gt;, especially in oppressive countries.&lt;/p&gt;

&lt;p&gt;What deeply troubled me is that I had to learn about how Buzz worked in order to thwart potential invasions to my privacy, over which I used to think I’ve had good control &lt;em&gt;with&lt;/em&gt; Google’s trusted mail service. And now I start to worry, even start to fret if I have missed anything to plug the holes.&lt;/p&gt;

&lt;p&gt;I had spent an hour unfollowing everyone that I was “following” and &lt;em&gt;blocking&lt;/em&gt; everyone that Buzz said was followed me. I assume this is for now the only way to keep my friends and I from the mess.&lt;/p&gt;

&lt;p&gt;But now I know I won’t sleep well and have to come back to check (by re-enabling Buzz then turning it off again) to see if I’ve missing anything, or if another place catches on fire, another item of my private information was inadvertently leaked. And the entire world might still think if such information is revealed with my consent and authorization.&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/384250289</link><guid>http://blog.lukhnos.org/post/384250289</guid><pubDate>Fri, 12 Feb 2010 04:43:00 +0800</pubDate></item><item><title>"Because in the business also known as social network, he who asketh not users’ consent, careth..."</title><description>“Because in the business also known as social network, he who asketh not users’ consent, careth not if they resent.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;My reply to a friend’s comment on my tweet that I turned off Google Buzz. She asked, “Why can’t the world be simpler?” Above was my thought.&lt;/em&gt;</description><link>http://blog.lukhnos.org/post/383236662</link><guid>http://blog.lukhnos.org/post/383236662</guid><pubDate>Thu, 11 Feb 2010 13:55:00 +0800</pubDate></item><item><title>Social Network and Email Don't Go Together</title><description>&lt;p&gt;I turned off &lt;a href="http://www.google.com/buzz"&gt;Google Buzz&lt;/a&gt; the moment I saw its advertisement blocking my gmail page. And I had to google it to learn how to turn it off. And I thought only Yahoo! and Microsoft did stupid things when it comes to email.&lt;/p&gt;

&lt;p&gt;People, &lt;em&gt;your email is not your social network&lt;/em&gt;. Just because you own a phone number, that doesn’t mean you have to invite everyone you ever called to call you to say hello, nor does it mean you are interested in hearing other people’s calls. &lt;strong&gt;The worst thing is, what Google Buzz is doing is to equivalent to publishing the names of a few dozens of people you’ve recently called to the entire world&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A few weeks ago, I logged into my long deserted Yahoo! email account to see if there was still anyone I knew emailing to that abandoned address. I used to do that every few months. To my horror, I discovered I was enrolled in many social networks I didn’t care about without my prior consent. I could even saw updates (equally inadvertent) from some contacts that I really only contacted once in like… what, 10 years ago? I immediately cancelled my already disused Yahoo! email for good. Microsoft does similiar things if you happen to use both its whatsitsname Messenger and its Live Mail.&lt;/p&gt;

&lt;p&gt;Google’s email used to work for me very well because that was the only service that didn’t try to be a sucker. For all its good reputation on thwarting email spam, this is the biggest surprise I’ve had from them yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: What annoyed me was how Buzz was deployed. It was opt-out by default, not opt-in. I can understand the rationale Google wants to do this. Books like &lt;a href="http://www.amazon.com/Nudge-Improving-Decisions-Health-Happiness/dp/0300122233"&gt;Nudge&lt;/a&gt; show opt-in and opt-out can make huge differences. Also, the nature of web app means new features are enabled automatically to everyone. The problem lies in the fact inadvertently joined social network &lt;em&gt;can&lt;/em&gt; disrupt your ongoing design to compartmentalize your communication channels.&lt;/p&gt;</description><link>http://blog.lukhnos.org/post/383210072</link><guid>http://blog.lukhnos.org/post/383210072</guid><pubDate>Thu, 11 Feb 2010 13:37:00 +0800</pubDate></item></channel></rss>
