unethical blogger - Linux http://unethicalblogger.com/taxonomy/term/8/0 en Catch me at SCALE! http://unethicalblogger.com/posts/2011/01/catch_me_scale <p><center><em>This is a <a href="http://omgsuse.com/content/catch-me-scale">cross-post</a> from another silly blog I run called<a href="http://www.omgsuse.com">OMG! SUSE!</a></em></center></p> <p>Let's all pretend I have a Geeko-related pun for "SCALE." Anyhoo, <a href="http://www.socallinuxexpo.org/scale9x/">SCALE</a>, otherwise known as the Southern California Linux Expo, is coming up in February (25th - 27th) and yours truly will be present and accounted for.</p> <p><center><a href="http://www.flickr.com/photos/agentdero/5380855797/" title="Tickets to SCALE! by agentdero, on Flickr"><img src="http://farm6.static.flickr.com/5043/5380855797_1cb16be43c.jpg" width="500" height="376" alt="Tickets to SCALE!" /></a></center></p> <p>Yes, those are <strong><em>bus tickets</em></strong> you see there. I will be heading down from Oakland to Los Angeles by <strong><em>bus</em></strong> instead of flying for ideological reasons, so I'll <em>try</em> to be in a good mood when I arrive!</p> <p>At this year's SCALE, the openSUSE project is making a <a href="http://www.socallinuxexpo.org/scale9x/exhibitors/opensuse"><em>big</em> splash</a>. Contributors and ambassadors will be showing up from all over the globe to show off openSUSE, talk nerdy, socialize and eat tasty snacks supplied by Cruise Director, GNOME Accessibility contributor and openSUSE Board Member <a href="http://twitter.com/BryenY">Bryen Yunashko</a>, who just got his <a href="http://twitter.com/omgsuse/status/26004394378010624">annual haircut</a> in preparation for the momentous occasion! ;) <!--break--> If you're in the area, check out this <a href="http://www.socallinuxexpo.org/scale9x/speakers">amazing speakers listing</a> and be sure to <strong><a href="https://www.socallinuxexpo.org/reg7/">register</a></strong> as soon as possible!</p> <p>I'll be covering the specifics of SCALE more in the coming weeks on <a href="http://www.omgsuse.com">OMG! SUSE!</a>, so stay tuned and I hope to see you there!</p> <hr /> http://unethicalblogger.com/posts/2011/01/catch_me_scale#comments Linux Mon, 24 Jan 2011 19:00:00 +0000 R. Tyler Croy 307 at http://unethicalblogger.com GNU/Parallel changed my life http://unethicalblogger.com/posts/2010/11/gnuparallel_changed_my_life <p><a href="http://www.flickr.com/photos/agentdero/5082431682/" title="The @Apture Elephants by agentdero, on Flickr"><img src="http://farm5.static.flickr.com/4025/5082431682_0fef51e059_m.jpg" width="240" height="180" alt="The @Apture Elephants" align="right" /></a>Over the past month or so I've fallen in love with an incredibly simple command line tool: <a href="http://www.gnu.org/software/parallel/">GNU/Parallel</a>. Parallel has more or less replaced my use of <a href="https://secure.wikimedia.org/wikipedia/en/wiki/xargs">xargs</a> when piping data around on the many machines that I use. Unlike <code>xargs</code> however, Parallel lets me make use of the <strong>many</strong> cores that I have access to, either on my laptop or the many quad and octocore machines we have lying around the <a href="http://twitter.com/apture">Apture</a> office.</p> <p>Using Parallel is <em>incredibly</em> easy, in fact the <a href="http://savannah.gnu.org/projects/parallel/">docs</a> enumerate just about every possible incantation of Parallel you might want to use, but starting simple you can just pipe stuff to it:</p> <blockquote> <p><code>cat listofthings.txt | parallel --max-procs=8 --group 'echo "Thing: {}"'</code></p> </blockquote> <p>The command above will run at most eight concurrent processes and group the output of each of the processes when the entire thing completes, simple and in this case not too much different than running with <code>xargs</code></p> <p>With some simple Python scripting, Parallel becomes infinitely more useful:</p> <blockquote> <p><code>python generatelist.py | parallel --max-procs=8 --group 'wget "{}" -O - | python processpage.py'</code></p> </blockquote> <p>There's not really a whole lot say about GNU/Parallel other than <strong>you should use it</strong>. I find myself increasingly impatient when a single process takes longer than a couple minutes to complete, so I've been using GNU/Parallel in more and more different ways across almost all the machines that I work on to make things <em>faster</em> and <em>faster</em>. So much so that I've started to pine for a quad-core notebook instead of this weak dual core Thinkpad of mine :)</p> <h3>GNU/Parallel Demo</h3> <p><center><object width="560" height="340"><param name="movie" value="http://www.youtube.com/v/OpaiGYxkSuQ?fs=1&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/OpaiGYxkSuQ?fs=1&amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="560" height="340"></embed></object></center> <!--break--></p> http://unethicalblogger.com/posts/2010/11/gnuparallel_changed_my_life#comments Linux Software Development Thu, 11 Nov 2010 17:48:32 +0000 R. Tyler Croy 303 at http://unethicalblogger.com Keyboard Synergy http://unethicalblogger.com/posts/2010/06/keyboard_synergy <p>Over the past year or two I've become quite fond of tiled window managers, the jump to Awesome (which I've <a href="http://unethicalblogger.com/posts/2009/07/awesomely_bad">since dropped</a>) to <a href="http://xmonad.org">XMonad</a> was a logical one. My gratuitous use of GNU/screen and <a href="http://vim.org">Vim</a>'s tabs and split window support, already provided a de-facto tiled window manager within each one of my many terminals. The tiled window manager on top of all those terminals has served to improve my heavily-terminal biased workflow.</p> <p>One computer has never been enough for me, at the office my work spans three screens and two computers, I've not yet discovered a Thinkpad that can drive three screens alone; at home I typically span three screens and two laptops (let's conveniently ignore the question of <em>why</em> I feel I need so much screen real estate). Tying these setups together I use <a href="http://synergy2.sourceforge.net">synergy</a> to provide my "software KVM" switch. As long as I've used synergy, I've had to switch from one screen to the other with a mouse, which is one of the <strong>few</strong> reasons I still keep one on the desk.</p> <p>Until I discovered a way around that, thanks to Jean Richard (a.k.a <a href="http://github.com/geemoo">geemoo</a>) who posted <a href="http://geemoo.ca/blog/241/synergy-tricks-switch-screens-with-a-keyboard-shortcut">this little configuration change</a> to <code>synergy.conf</code>:</p> <div class="geshifilter"><pre class="geshifilter-bash"><ol><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">section: options</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> keystroke<span style="color: #7a0874; font-weight: bold;">&#40;</span>control+alt+l<span style="color: #7a0874; font-weight: bold;">&#41;</span> = switchInDirection<span style="color: #7a0874; font-weight: bold;">&#40;</span>right<span style="color: #7a0874; font-weight: bold;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> keystroke<span style="color: #7a0874; font-weight: bold;">&#40;</span>control+alt+h<span style="color: #7a0874; font-weight: bold;">&#41;</span> = switchInDirection<span style="color: #7a0874; font-weight: bold;">&#40;</span>left<span style="color: #7a0874; font-weight: bold;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">end</div></li></ol></pre></div> <p>With this minor configuration change, combined with XMonad, <a href="http://github.com/philc/vimium">Vimium</a> (Vim-bindings for Chromium) and my usual bunch of terminal-based applications, I can go <em>nearly</em> mouse-less for almost everything I need to do during the day.</p> http://unethicalblogger.com/posts/2010/06/keyboard_synergy#comments Linux Miscellaneous Mon, 14 Jun 2010 16:45:00 +0000 R. Tyler Croy 288 at http://unethicalblogger.com Virtual Hosting with HAProxy and WSGI http://unethicalblogger.com/posts/2010/01/virtual_hosting_haproxy_and_wsgi <p>Lately I've fallen in love with a couple of fairly simple but powerful technologies: <a id="aptureLink_MG9e1mBPnu" href="http://haproxy.1wt.eu/">haproxy</a> and <a id="aptureLink_h4s21gIvSE" href="http://en.wikipedia.org/wiki/Web%20Server%20Gateway%20Interface">WSGI</a> (web server gateway interface). While the latter is more of a specification (<a id="aptureLink_J39ynRlO1s" href="http://en.wikipedia.org/wiki/Wsgi">PEP 333</a>) the concepts it puts forth have made my life significantly easier. In combination, the two of them make for a powerful combination for serving web applications of all kinds and colors.</p> <p>HAProxy is a robust, reliable piece of load balancing software that's <strong>very</strong> easy to get started with, For the uninitiated, load balancing is a common means of distributing the load of a number of inbound requests across a pool of processes, machines, clusters and so on. Whenever you hit any web site of non-trivial size, your HTTP requests are invariably transparently proxied through a load balancer to a pool of web machines.</p> <p>I started looking into haproxy when I began to move <a href="http://urlenco.de">Urlenco.de</a> away from my franken-setup of <a id="aptureLink_JfNVXqw8zi" href="http://en.wikipedia.org/wiki/Lighttpd">Lighttpd</a>/<a id="aptureLink_VtVTJkexMb" href="http://en.wikipedia.org/wiki/FastCGI">FastCGI</a>/<a id="aptureLink_M8XmGBHeCs" href="http://en.wikipedia.org/wiki/Mono%20%28software%29">Mono</a>/<a id="aptureLink_vg9xXC8F19" href="http://www.asp.net/">ASP.NET</a> to a pure <a id="aptureLink_RkZQSvmVt3" href="http://en.wikipedia.org/wiki/Python%20%28programming%20language%29">Python</a> stack. After poking around some articles about haproxy I discovered it can be used for <strong>virtual hosts</strong> as well as simple load balancing. Using a haproxy's ACLs feature (see Section 7 in the <a href="http://haproxy.1wt.eu/download/1.4/doc/configuration.txt">configuration.txt</a>), you can redirect requests to one backend or another. While my "virtual hosting" with haproxy is using the ability to inspect the HTTP headers of inbound requests, you can use a number of different criterion to determine the right backend for serving a request: url matching, request method matching (GET/POST), protocol matching (haproxy can load balance any kind of TCP connection) and so on.</p> <p>WSGI (pronounced: <em>whiskey</em>) comes into play on the backend side of haproxy, using the <a id="aptureLink_2I1tbDf9Uh" href="http://eventlet.net/doc/modules/wsgi.html">eventlet.wsgi</a> module which provides a WSGI interface I can build web applications <strong>very</strong> quickly, test them and deploy them. When deployed, I can run them as "nobody" in userspace on the server, binding to some higher numbered port (i.e. 8080) and haproxy will do the work routing to the appropriate WSGI process.</p> <p>Below is a simple haproxy configuration that I'm using to run <a href="http://urlenco.de">Urlenco.de</a> and a site for <a href="http://erinandtylerswedding.com">my wedding</a> and many more as soon as I finish them. The section to note is <code>frontend http-in</code> in which the ACLs are defined for the different virtually hosted domains and the conditionals for selecting a backend based on those ACLs.</p> <pre><code>global maxconn 20000 ulimit-n 16384 log 127.0.0.1 local0 uid 200 gid 200 chroot /var/empty nbproc 4 daemon defaults log global mode http option httplog option dontlognull retries 3 option redispatch maxconn 2000 contimeout 5000 clitimeout 50000 srvtimeout 50000 frontend http-in bind *:80 acl is_urlencode hdr_end(host) -i urlenco.de acl is_wedding hdr_end(host) -i erinandtylerswedding.com use_backend urlencode if is_urlencode use_backend wedding if is_wedding default_backend urlencode backend urlencode balance roundrobin cookie SERVERID insert nocache indirect option httpchk HEAD /check.txt HTTP/1.0 option httpclose option forwardfor server Local 127.0.0.1:8181 cookie Local backend wedding balance roundrobin cookie SERVERID insert nocache indirect option httpchk HEAD /check.txt HTTP/1.0 option httpclose option forwardfor server Local 127.0.0.1:8081 cookie Local </code></pre> http://unethicalblogger.com/posts/2010/01/virtual_hosting_haproxy_and_wsgi#comments Linux Python Software Development Sun, 17 Jan 2010 00:29:38 +0000 R. Tyler Croy 258 at http://unethicalblogger.com 5 tips for traveling with Tux http://unethicalblogger.com/posts/2009/12/5_tips_traveling_tux <p>After running a <a id="aptureLink_WzTQaeWnm6" href="http://en.wikipedia.org/wiki/Linux%20%28kernel%29">Linux</a> laptop for a number of years and having mostly negative travel experiences from messing something up along the way, this holiday season I think I've finally figured out how to optimally travel with a Linux notebook. The following tips are some of the lessons I've had to learn the hard way through trial and error over the course of countless flights spanning a few years.</p> <h3>Purchase a small laptop or netbook</h3> <p>Far and away the best thing I've done for my travel experience thus far has been the purchase of my new <a id="aptureLink_uIjthatTxd" href="http://www.amazon.com/gp/product/B002SG7LX8?tag=apture-20">Thinkpad X200</a> (12.1"). My previous laptops include a <a id="aptureLink_s6vu8e48ui" href="http://en.wikipedia.org/wiki/MacBook%20Pro">MacBook Pro</a> (15"), a <a id="aptureLink_dnFWnkUnhf" href="http://www.youtube.com/watch?v=3jW1LrmqelA">Thinkpad T43</a> (14") and a Thinkpad T64 (14"). Invariably I have the same problems with all larger laptops, their size is unwieldy in economy class and their power consumption usually allows me very little time to get anything done while up in the air. Being 6'4" and consistently cheap, I'm always in coach, quite often on redeye flights where the passenger in front of me invariably leans their seat back drastically reducing my ability to open a larger laptop and see the screen. With a 12" laptop or a netbook (I've traveled with an <a id="aptureLink_mU2JeNLHtG" href="http://en.wikipedia.org/wiki/ASUS%20Eee%20PC">Eee PC</a> in the past as well) I'm able to open the screen enough to see it clearly and actually type comfortbaly on it. Additionally, the smaller screen and size of the laptop means less power consumption, allowing me to use it for extended periods of time.</p> <h3>Use a basic window manager</h3> <p>Personally, I prefer <a id="aptureLink_M4NdgfWBrW" href="http://en.wikipedia.org/wiki/Xmonad">XMonad</a>, but I believe any simplistic window manager will save a noticable number of cycles compared to the <a id="aptureLink_HQAAfwpj0K" href="http://en.wikipedia.org/wiki/GNOME">Gnome</a> and <a id="aptureLink_x1OYbfAPbc" href="http://en.wikipedia.org/wiki/KDE">KDE</a> "desktop environments." Unlike Gnome, for example, XMonad does not run a number of background daemons to help provide a "nice" experience in the way of applets, widgets, panels and menus.</p> <h3>Disable unneeded services and hardware</h3> <p>Reducing power consumption is a pretty important goal for me while traveling with a Linux laptop, I love it when I have sufficient juice to keep myself entertained for an entire cross-country flight. Two of the first things I disable before boarding a plane are Wireless and Bluetooth via the <a id="aptureLink_HGDfMqRe03" href="http://en.wikipedia.org/wiki/NetworkManager">NetworkManager</a> applet that I run. If I'm on a redeye, I'll also set my display as dark as possible which not only saves power but also eye strain. It's also important to make sure your laptop is running its CPU in "power-save" mode, which means the clockspeed of the chip is reduced, allowing you to save even more power. Finally I typically take a look at <a id="aptureLink_OHiPMhRsuG" href="http://en.wikipedia.org/wiki/Htop%20%28Unix%29">htop(1)</a> to see if there are any unneeded processes taking up cycles/memory that I either don't need or don't intend to use for the flight. The flight I'm currently on (Miami to San Francisco) I discovered that <a id="aptureLink_O2QBe4kx4C" href="http://en.wikipedia.org/wiki/Google%20Chrome">Chrome</a> was churning some unnecessary cycles and killed it (no web browsing on American Airlines).</p> <h3>Use an external device for music/video</h3> <p>If you're like me, you travel with a good pair of headphones and a desire to not listen to babies crying on the plane. I find a dedicated device purely for music can help avoid wasting power on music since most devices can play for 12-40 hours depending on the device. It's generally better (in my opinion) to use your $100 iPod for music and your $2000 computer for computing, that might just be personal bias though.</p> <h3>Load applications you'll need ahead of time</h3> <p>I generally have an idea of what I want to do before I board a plane, I have a project that I'd like to spend some time hacking on or something I want to write out or experiment with. Having a "game plan" before I get onto the plane means I can load up any and all applications while plugged in at the airport. This might be a minor power saver but after I've lowered the CPU clockspeed and disabled some services, I certainly don't want to wait around for applications to load up while I sit idly in coach.</p> <p><strong>Update</strong>: As <a href="http://www.reddit.com/user/Etni3s">Etni3s</a> from reddit points out, <a id="aptureLink_i5FkxIYBZk" href="http://en.wikipedia.org/wiki/PowerTOP">powertop(1)</a> is a pretty handy utility for watching power consumption.</p> <p>As I write this article, I'm probably an hour into my five and half hour flight and the battery monitor for my X200 is telling me I have an estimated <strong>eight</strong> hours of juice left.</p> <p>I'm proud to say, Tux is my copilot.</p> http://unethicalblogger.com/posts/2009/12/5_tips_traveling_tux#comments Linux Opinion Sun, 27 Dec 2009 11:19:41 +0000 R. Tyler Croy 248 at http://unethicalblogger.com Awesomely Bad http://unethicalblogger.com/posts/2009/07/awesomely_bad <p>A coworker of mine, <a href="http://twitter.com/teepark">@teepark</a> and I recently fell in love with tiling window managers, <a id="aptureLink_cBdTGh5mhu" href="http://en.wikipedia.org/wiki/Awesome%20%28window%20manager%29">Awesome</a> in particular. The project has been interesting to follow, to say the least. When I first installed Awesome, from the <a href="http://software.opensuse.org/search">openSUSE package directory</a>, I had version 2, it was fairly basic, relatively easy to configure and enough to hook me on the idea of a tiling window manager. After conferring with <a href="http://twitter.com/teepark">@teepark</a>, I discovered that he had <strong>version 3</strong> which was much better, had some new fancy features, and an incremented version number, therefore I required it.</p> <p>In general, I'm a fairly competent open-source contributor and user. <a id="aptureLink_JtLnexfCQX" href="http://en.wikipedia.org/wiki/Autoconf">Autoconf</a> and <a id="aptureLink_tFM3XdzbUg" href="http://en.wikipedia.org/wiki/Automake">Automake,</a> while I despise them, aren't mean and scary to me and I'm able to work with them to fit my needs. I run Linux on two laptops, and a few workstations, not to mention the myriad of servers I'm either directly or peripherally responsible for. I grok open sources. Thusly, I was not put off by the idea of grabbing the latest "<em>stable</em>" tarball of Awesome to build and install it. That began my slow and painful journey to get this software built, and installed.</p> <ul> <li>Oh, it needs <a id="aptureLink_7epjSjKClG" href="http://en.wikipedia.org/wiki/Lua%20programming%20language">Lua</a>, I'll install that from the repositories.</li> <li>Hm, what's this <a href="http://xcb.freedesktop.org/">xcb</a> I need, and isn't in the repositories. I guess I'll have to build that myself, oh but wait, there's different subsets of xcb? xcb-util, xcb-proto, libxcb-xlib, xcb-kitchensink, etc.</li> <li>Well, I need <a href="http://xorg.freedesktop.org/archive/individual/proto/">xproto</a> as well, which isn't in the repositories either.</li> <li>CMake? Really guys? Fine.</li> <li>ImLib2, I've never even heard of that!</li> <li>libstartup-notification huh? Fine, i'll build this too.</li> </ul> <p>After compiling what felt like an eternity of subpackages, I discovered a number of <em>interesting</em> things about the varying versions of Awesome v3. The configuration file format has changed a few times, even between one release candidate to another. I ran across issues that <a href="http://spiralofhope.wordpress.com/2009/04/14/awesome-window-manager-installation-misadventure/">other people had</a> that effectively require recompilling X11's libraries to link against the newly built xcb libraries in order to work (<code>/usr/lib/libxcb-xlib.so.0: undefined reference to _xcb_unlock_io</code>). Nothing I seemed to try worked as I might expect, if I couldn't recompile the majority of my system to be "bleeding edge" I was screwed. The entire affair was absolutely infuriating.</p> <p>There were a few major things that I think the team behind Awesome failed miserably at accomplishing, that every open source developer should consider when releasing software:</p> <ul> <li><strong>If you depend on a hodge-podge of libraries, don't make your dependency on the bleeding edge of each package</strong></li> <li><strong>Maintain an open dialogue with those that package your software, don't try to make their job hell.</strong></li> <li><strong>When a user cannot build your packages with the latest stable versions of their distribution without almost rebuilding their entire system, perhaps you're "doin' it wrong"</strong></li> <li><strong>Changing file formats, or anything major between two release candidates is idiocy.</strong></li> <li><strong>If you don't actually care about your users, be sure to state it clearly, so then we don't bother using or trying to improve your poor quality software</strong></li> </ul> <p>In the end, I decided that <a id="aptureLink_9yLUGUwEJ0" href="http://en.wikipedia.org/wiki/Haskell%20%28programming%20language%29">Haskell</a> isn't scary enough not to install <a id="aptureLink_IqW50ui9RW" href="http://en.wikipedia.org/wiki/Xmonad">XMonad</a>, so I've started replacing machines that run Awesome, with XMonad, and I'm not looking back. Ever.</p> http://unethicalblogger.com/posts/2009/07/awesomely_bad#comments Linux Miscellaneous Opinion Sun, 26 Jul 2009 03:52:18 +0000 R. Tyler Croy 220 at http://unethicalblogger.com Using Glib's gtester Results in Hudson http://unethicalblogger.com/posts/2009/06/using_glibs_gtester_results_hudson <p>For one of the projects I've been working on lately, I've been making use of <a href="http://library.gnome.org/devel/glib/unstable/glib-Testing.html">Glib's Testing</a> functionality to write unit tests for a C-based project. I'm a fairly big fan of the <a href="http://hudson-ci.org">Hudson Continuous Integration Server</a> and I wanted to run tests for my C-based project.</p> <p>Unfortunately, the <code>gtester</code> application generates XML in a custom format that Hudson cannot understand (i.e. JUnit formatted XML). In order to come up with some JUnit XML, I spent about an hour and a half toying with XSLT for transforming the XML <code>gtester</code> generates (see the snippet below).</p> <p>I added a shell script build step to the end of the build process that runs:</p> <pre><code>gtester test_app --keep-going -o=Tests.xml xsltproc -o tests.junit.xml gtester.xsl Tests.xml </code></pre> <p>Then I just specified "tests.junit.xml" in the <strong>Publish JUnit test result report</strong> section of the <strong>Post-build Actions</strong> and then Hudson would properly process and post the test results when the job was finished.</p> <script src="http://gist.github.com/131727.js"></script> http://unethicalblogger.com/posts/2009/06/using_glibs_gtester_results_hudson#comments Hudson Linux Miscellaneous Software Development Thu, 18 Jun 2009 08:02:02 +0000 R. Tyler Croy 218 at http://unethicalblogger.com Extremely brief review of the Nokia n810 http://unethicalblogger.com/posts/2009/01/extremely_brief_review_nokia_n810 <p>A coworker of mine was kind enough to let me borrow his Nokia n810 for a couple days to try it out as he know I was considering purchasing one for myself. I'm <strong>very</strong> glad I tried it before buying it, since I'm not going to buy it now (sorry Nokia! The princess is in another castle!)</p> <p>The thought of a handheld, wireless capable, Linux device is very intriguing for me. That said, I'm not sure what I would even do with it! As I mentioned in my <a href="http://unethicalblogger.com/posts/2009/01/im_using_git_because_it_makes_me_feel_cool" target="_blank">previous post</a>, I like to feel cool, and the prospect of answering the question "is that Linux in your pocket or are you just happy to see me" is far to enticing to pass up. Regardless, I think the n810 suffers from some critical hardware, and software, deficiencies. </p> <p><strong><big>Hardware</big></strong><br /> The n810 is powered by a 400Mhz ARM processor, and comes equipped with either 128MB or 256MB or RAM (from what I can tell), I'm not entirely certain which is to blame for the sluggishness of the experience, but my guess is on the RAM. Particularly when running the browser (Gecko-based) I would experience "hiccups" where the device spent a few seconds registering input, before actually following a clicked link. This may be more at fault of the software, but for an internet tablet, the sluggishness of the browser in both user interaction and rendering time was absolutely infuritating. </p> <p>The built-in keyboard is smooth, a little too smooth for my taste; I found myself constantly struggling to hit the right keys with my fingers (my thumb is the width of 2.5 columns of keys). Unlike most US keyboard layouts, the n810 keyboard has a lot of keys in "weird" places that I could not get a hang of over the course of a weekend. I eventually gave up on trying to chat or use SSH on the device because I found it so painful to try to type on the device.</p> <p>The battery life was nothing to write home about, closer to a laptop battery life, instead of a phone's battery life.</p> <p><strong><big>The Software</big></strong><br /> Despite being Linux-based, the device doesn't <em>feel</em> like Linux at all, which I think is a good thing for the mass-market. The "Home" screen was pretty slick, with the ability to add applets to the "desktop" to report things like weather, time, VPN status, etc. A cross-between systray and Dashboard, the Home screen was where I felt most comfortable in the device (the "home" screen in my Smartphone is set up with similar informational panels). Once leaving "Home" I was soon frustrated again, I still haven't figured out whether or not the "Accounts" preference in the Control Panel (for IM accounts) and the installation of Pidgin are the same thing or not. Email and IM, the two other foundations of what I would expect from an "internet tablet" were <strong>weak</strong>. Neither of them cooperated with any of the IMAP/SSL or Jabber/SSL servers I use, and they both seemed to be targeted at webmail and chat services like GMail and GTalk. </p> <p>Maemo does use .deb packages for installation, so I could pretty easily find some of my favorite open source applications in the Maemo repositories, unfortunately the GUI frontend for apt-get on Maemo allows for only one operation at a time (no checking multiple boxes and then clicking "Install") so adding new software was <strong>literally</strong> a 30 minute operation.</p> <p><strong><big>Conclusion</big></strong><br /> I don't think I'm being too negative in saying that I'm disappointed in Nokia for releasing what I think is such a substandard product. With the ubiquity of wireless in San Francisco, having a nice solid ultra-portable machine that I can actually fit into my pocket is exciting, The Nokia n810 is certainly not that machine. </p> <p>This week I'm shipping my ASUS Eee PC off for my little sister, so I'm starting to look more and more for something even more portable to fill the void, right now the leader is the <a href="http://www.oqo.com/" target="_blank">OQO model 02</a> which is about 2 times the price of the n810, and ships with Vista by default, but with Ubuntu and close to 6 hours of battery life I think it could be the ultra-portable that I've been looking for.</p> http://unethicalblogger.com/posts/2009/01/extremely_brief_review_nokia_n810#comments Linux Opinion Mon, 05 Jan 2009 09:22:14 +0000 R. Tyler Croy 203 at http://unethicalblogger.com I'm using Git because it makes me feel cool http://unethicalblogger.com/posts/2009/01/im_using_git_because_it_makes_me_feel_cool <p>Let's be honest for a second, anybody who knows me knows that I'm clearly an insecure person; I spend the majority of my time trying my best to appear cool. I've owned a lot of Macs in my life, not because they're solid machines with a fantastic operating system, but because I felt so damn smug and cool whenever I was doing anything on my Macs. I also developed Mac software for a while, not because it was my passion or Objective-C and Cocoa are practically God's gift to software, but because Mac developers are so cool, what with the <a href="http://iamthewalr.us/2009/01/04/my-new-company/about" target="_blank">black-rimmed glasses</a> and fancy coffees. Hell, I remember when I finally traded my MacBook Pro for a Thinkpad running Linux; it had nothing to do with an ideological stance against Apple's treatment of developers or frustrations with Leopard, it was all about the new <em>geek-chic</em> that was Linux. Thus far, my life has basically been one big quest for more leet-points.</p> <p><big>Then came Git.</big></p> <p>When I started out in the software world, I was using CVS, which was a notch less cool than a slim IBM salesman's tie. The constant moaning and groaning of fellow developers using CVS, combined with the shame that I felt when I finally told my parents about my use of CVS was too much to bear. I had to switch. </p> <p>I remember the first time I tried <a href="http://subversion.tigris.org/" target="_blank">Subversion</a>, I remember talking to <a href="http://redterror.net/" target="_blank">Dave</a> and saying "Meh, I'll stick with CVS!" Soon enough, just like the Macarena, Subversion swept the nation up. Subversion was the newest, coolest thing ever, developers rushed into the streets exclaiming "it sucks less than CVS! It sucks less than CVS!" I switched over to Subversion and all of a sudden I was cool again. One by one, open source projects I knew about switched over to Subversion, then <a href="http://sf.net" target="_blank">Source Forge</a> switched over to Subversion and in an instant, Subversion replaced CVS and became the mainstream version control system. Subversion had grown up, gotten married, a 401k and health insurance, how uncool.</p> <p>After joining <a href="http://www.slide.com" target="_blank">Slide</a>, which used Subversion, I found myself burning up inside. Here I was at this hip start-up, really feeling cool, but still using the same version control system that uncool companies like, <a href="http://developers.yahoo.com" target="_blank">Yahoo!</a> and <a href="http://www.sun.com" target="_blank">Sun</a> use. I would not stand for this. As 2007 became 2008 the writing was on the wall, Git was <a href="http://blogs.chicagotribune.com/news_columnists_ezorn/2008/02/my-new-bicycle.html" target="_blank">our new bicycle</a>. It had been blessed by Saint Torvalds and clearly we needed to get in on the ground floor of the new cool before it became mainstream.</p> <p>We needed to switch to Git immediately. Who cares if Git is extremely fast, it's not like time is money or something ridiculous like that. What do I care if Git handles branches and merge histories unlike CVS or Subversion? With its immense coolness-factor, I didn't even consider that Git will allow us to work in a decentralized workflow <strong>or</strong> a centralized workflow, nope, didn't even cross my mind. If one were to make a list of Pros and Cons of Git versus whichever other version control system, you could just put "Pro: <strong><u>Cool</u></strong>" at the top of the list, underlined, in bold, and the rest would be moot as far as I'm concerned. </p> <p>Unlike Subversion or <a href="http://perforce.com" target="_blank">Perforce</a>, Git doesn't have corporate backing, Git is distributed, like a guerilla-force sweeping through the jungle ready to pownce on an unsuspecting platoon; that's freakin' cool. Git rides a motorcycle, wears a leather jacket, makes women swoon and kicks ass and/or jukeboxes. </p> <p><a href="http://whygitisbetterthanx.com/" target="_blank">Git</a> is the Fonz. Cool.</p> <p>Don't make any false assumptions about my feelings towards Git, it's not like it's a clearly superior version control system or anything, I'm using it only because I want to be cool too.<br /> <!--break--></p> http://unethicalblogger.com/posts/2009/01/im_using_git_because_it_makes_me_feel_cool#comments Git Linux Miscellaneous Opinion Software Development Sun, 04 Jan 2009 14:42:02 +0000 R. Tyler Croy 202 at http://unethicalblogger.com Hudson notifications with libnotify http://unethicalblogger.com/posts/2008/09/hudson_notifications_with_libnotify <p>I've been using a Gnome-based desktop for about the past 8-9 months and one of the things I've come to really appreciate is that most Gnome applications integrate with "<a href="http://www.galago-project.org/news/index.php" target="_blank">libnotify</a>". <a href="http://www.galago-project.org/news/index.php" target="_blank">Libnotify</a> is a simple Windows taskbar-like notification system that presents status messages at the bottom of your screen. Like all great pieces of software, it has a solid Python interface which allows for incorporating it in those little 10-minutes scripts I find myself writing every now and again.</p> <p>One of the things I wanted to script was the notification of the build status of the numerous jobs that we're running in our <a href="http://hudson.dev.java.net" target="_blank">Hudson</a> instance here at <a href="http://www.slide.com" target="_blank">Slide</a>. Using the <a href="http://feedparser.org/" target="_blank">Universal Feed Parser</a> and <a href="http://www.galago-project.org/downloads.php" target="_blank">pynotify</a> (listed under "notify-python"), I had a good little Gnome Hudson Notifier running in less than 10 minutes.<br /> <center><img src="http://agentdero.cachefly.net/unethicalblogger.com/images/hudson_more.jpeg"/></center> </p> <p>Source code after the jump.<br /> <!--break--><br /> <div class="geshifilter"><pre class="geshifilter-python"><ol><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #ff7700;font-weight:bold;">import</span> feedparser</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #ff7700;font-weight:bold;">import</span> pynotify</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">&nbsp;</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">BASE_TITLE = <span style="color: #483d8b;">'Hudson Update!'</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">&nbsp;</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #ff7700;font-weight:bold;">def</span> success<span style="color: black;">&#40;</span>job<span style="color: black;">&#41;</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> n = pynotify.<span style="color: black;">Notification</span><span style="color: black;">&#40;</span>BASE_TITLE, </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #483d8b;">'&quot;%s&quot; successfully built :)'</span> <span style="color: #66cc66;">%</span> job,</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #483d8b;">'file:///usr/share/pixmaps/gnome-suse.png'</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> n.<span style="color: black;">set_urgency</span><span style="color: black;">&#40;</span>pynotify.<span style="color: black;">URGENCY_LOW</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #ff7700;font-weight:bold;">return</span> n</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">&nbsp;</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #ff7700;font-weight:bold;">def</span> unstable<span style="color: black;">&#40;</span>job<span style="color: black;">&#41;</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #ff7700;font-weight:bold;">return</span> pynotify.<span style="color: black;">Notification</span><span style="color: black;">&#40;</span>BASE_TITLE, </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #483d8b;">'&quot;%s&quot; is unstable :-/'</span> <span style="color: #66cc66;">%</span> job,</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #483d8b;">'file:///usr/share/pixmaps/gnome-suse.png'</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">&nbsp;</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #ff7700;font-weight:bold;">def</span> failure<span style="color: black;">&#40;</span>job<span style="color: black;">&#41;</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> n = pynotify.<span style="color: black;">Notification</span><span style="color: black;">&#40;</span>BASE_TITLE, </div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #483d8b;">'&quot;%s&quot; failed!'</span> <span style="color: #66cc66;">%</span> job,</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #483d8b;">'file:///usr/share/pixmaps/gnome-suse.png'</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> n.<span style="color: black;">set_urgency</span><span style="color: black;">&#40;</span>pynotify.<span style="color: black;">URGENCY_CRITICAL</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #ff7700;font-weight:bold;">return</span> n</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">&nbsp;</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> pynotify.<span style="color: black;">init</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Hudson Notify'</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> old_items = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> feed = feedparser.<span style="color: black;">parse</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'http://hudson/rssLatest'</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> items = <span style="color: black;">&#91;</span>t<span style="color: black;">&#91;</span><span style="color: #483d8b;">'title'</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> t <span style="color: #ff7700;font-weight:bold;">in</span> feed<span style="color: black;">&#91;</span><span style="color: #483d8b;">'entries'</span><span style="color: black;">&#93;</span><span style="color: black;">&#93;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> new_items = <span style="color: #008000;">list</span><span style="color: black;">&#40;</span><span style="color: #008000;">set</span><span style="color: black;">&#40;</span>old_items<span style="color: black;">&#41;</span>.<span style="color: black;">difference</span><span style="color: black;">&#40;</span>items<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">&nbsp;</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> new_items:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> i = i.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">' '</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> job, build, status = <span style="color: black;">&#40;</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, i<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, i<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> status = status.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'('</span>, <span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">')'</span>,<span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #ff7700;font-weight:bold;">if</span> status == <span style="color: #483d8b;">'SUCCESS'</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> success<span style="color: black;">&#40;</span>job<span style="color: black;">&#41;</span>.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #ff7700;font-weight:bold;">elif</span> status == <span style="color: #483d8b;">'UNSTABLE'</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> unstable<span style="color: black;">&#40;</span>job<span style="color: black;">&#41;</span>.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #ff7700;font-weight:bold;">elif</span> status == <span style="color: #483d8b;">'FAILURE'</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> failure<span style="color: black;">&#40;</span>job<span style="color: black;">&#41;</span>.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">&nbsp;</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> old_items = items</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> <span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">60</span><span style="color: black;">&#41;</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">&nbsp;</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></li></ol></pre></div></p> <p>It's pretty basic right now, but does everything I really wanted it to do. I may add it into a public Git repository in the near future if I spend any more time on the project. Hope you like it :)</p> http://unethicalblogger.com/posts/2008/09/hudson_notifications_with_libnotify#comments Hudson Linux Miscellaneous Software Development Fri, 19 Sep 2008 06:40:20 +0000 R. Tyler Croy 189 at http://unethicalblogger.com Dashboard for Linux users http://unethicalblogger.com/posts/2008/03/dashboard_linux_users <p>With the release of Mac OS 10.5 (Leopard) I found myself in a tough spot, I liked certain features added into Leopard, but I couldn't stand some of the stability issues I was having and the other bugs that would interrupt my normal workflow during the day. In an effort to alleviate some of my frustrations with Leopard, I experimented for a week with running <a href="http://www.gnome.org/" target="_blank">Gnome</a> (with <a href="http://www.compiz-fusion.org/" target="_blank">Compiz</a>) on my <a href="http://www.opensuse.org/" target="_blank">openSUSE</a> workstation. In general all the important bits were there, By this point, I had already switched from using any sort of GUI editor to work, but instead had switched over to using <a href="http://www.vim.org/" target="_blank">vim</a> on a shared development server here at <a href="http://slide.com" target="_blank">the office</a>. <a href="http://tyler.geekisp.com/images/compiz/pidgin.png" rel="lightbox"><img src="http://tyler.geekisp.com/images/compiz/pidgin.png" height="150" align="right" alt="Pidgin in Gnome" title="Pidgin in Gnome"/></a> Given that <a href="http://webkit.org/blog/61/introducing-drosera/" target="_blank">Drosera</a> still wasn't fast enough for my normal day-to-day web development debugging, I was also using Firefox and Opera for most of my web browsing as well. Chat was covered by <a href="http://www.adiumx.com/" target="_blank">Adium</a>, so using it's Linux/Windows counter-part, <a href="http://www.pidgin.im/" target="_blank">Pidgin</a> was no trouble at all. </p> <p>After switching for a week and falling in love with Compiz and some of the features it offers, I feel like I can accomplish far more now on Linux than I was on Mac OS X. For me Mac OS X became the new Windows, I was fighting the system to work almost as much as I was do actual work (between the IMAP code in Mail.app crashing and Safari leaking, I was not a happy camper). The one missing feature however was <strong>Dashboard</strong>. I'm not a religious user of Dashboard, but I always used it to keep little chunks of information stored away either in post-it notes, via clocks, or tickers, etc. I'd not found a good solution until recently, by way of Opera and a combination of widgets and one of the default Compiz Fusion plugins.<br /> <center><a href="http://tyler.geekisp.com/images/compiz/widgets.png" rel="lightbox"><img src="http://tyler.geekisp.com/images/compiz/widgets.png" height="350"/></a><br/><small>(click to enlarge)</small></center></p> <p>The concept behind <a href="http://widgets.opera.com/" target="_blank">Opera Widgets</a> is the exact same as behind Dashboard widgets, tiny little web applications running on your desktop, by default however they run <strong>on</strong> your desktop. This wasn't going to work for me, I like to stash widgets away, and access them through the trusty F12 button as per usual with Dashboard.</p> <p>In enters the "Widget Layer" plugin for Compiz Fusion <img src="http://tyler.geekisp.com/images/compiz/widget_layer.png" align="left"/>, which allows you to assign rules for placing regular windows sitting in the window manager, into this special widget layer that appears just like Dashboard does on Mac OS X (with the actual desktop faded out in the background). In order to group <strong><em>all</em></strong> Opera Widgets in the Widget Layer, you can set the "Widget Windows" field to:<br /> <center><strong>role=opera-widget</strong></center><br /> Which will cause all enabled Opera Widgets to be availabe at a keypress of F12, if you're on Linux, I highly suggest you try it out, it's <em>extremely</em> useful, especially if you grab some of the more developer focused widgets from the <a href="http://widgets.opera.com/" target="_blank">widget directory</a></p> <p>Of course, there's plenty of reasons to use Compiz. One of my favorite plugins is the "Annotate" plugin that allows you to draw on your screen, which comes in handy for going over interfaces with coworkers. <a href="http://tyler.geekisp.com/images/compiz/annotate.png" rel="lightbox"><img src="http://tyler.geekisp.com/images/compiz/annotate.png" height="175" align="right"/></a></p> <p>In general the addition of Compiz to the Linux desktop I feel is an important one, it drastically improves the rendering of windows since it's essentially doing what Quartz Extreme is doing on Mac OS X in terms of offloading some rendering on the graphics card's GPU. Having really bitching eye-candy certainly doesn't hurt either, So far with Compiz I have what equates to "Spaces", "Expose", and "Dashboard" from Leopard, along with a myriad of other goodies like "Wobbly Windows", true transparency and reflections on arbitrary UI elements and of course, a <a href="http://www.youtube.com/watch?v=wG1UY5hhExQ" target="_blank">fish tank inside my desktop</a>. (If you're using openSUSE, the one-click packages for Compiz Fusion can be found <a href="http://en.opensuse.org/Compiz_Fusion" target="_blank">here on the wiki</a>).</p> http://unethicalblogger.com/posts/2008/03/dashboard_linux_users#comments Linux Miscellaneous Wed, 26 Mar 2008 07:55:35 +0000 R. Tyler Croy 174 at http://unethicalblogger.com Video: Hello Moko http://unethicalblogger.com/posts/r_tyler_ballance/video_hello_moko <p>I thought I'd dork around a little bit with recording videos featuring the Neo1973, running OpenMoko. This video is running an older version of OpenMoko (2007.1) so it isn't current. It's also worth noting, to use the phone, you don't have to do a full shutdown and bootup, you should really only ever need to do either if you're a developer, or when you first receive the phone.<br /> Hello Moko.</p> <p><center></p> <div><embed src="http://widget-bc.slide.com/widgets/sf.swf" type="application/x-shockwave-flash" quality="high" scale="noscale" salign="l" wmode="transparent" flashvars="cy=gn&amp;il=1&amp;channel=144115188086519740&amp;site=widget-bc.slide.com" style="width:400px;height:356px" name="flashticker" align="middle"></embed></div> <p></center></p> http://unethicalblogger.com/posts/r_tyler_ballance/video_hello_moko#comments Linux OpenMoko Sun, 12 Aug 2007 12:55:00 +0000 R. Tyler Croy 90 at http://unethicalblogger.com OpenMoko 2007.2 Preview http://unethicalblogger.com/posts/r_tyler_ballance/openmoko_2007_2_preview <p>I bit the bullet last thursday and started playing with some of the 2007.2 OpenMoko snapshot images, 2007.2 denoting the next iteration of the software. Whereas my previous photos were from 2007.1, the interface was a bit weak, and wasn't much to be proud of. The direction that the interface is <em>now</em> heading in is not only sleek, but much more usable. One of the most important changes, in my opinion, is the addition of acceleration-incluenced scrolling throughout the interface. The new scrolling allows you to do a quick swipe with your finger and have the interface scroll quickly and then slow to a stop, as if your scroll had momentum behind it.</p> <h2><small>OpenMoko Boot screen</small></h2> <p><center></p> <table border="0" style="margin-top: -10px;"> <tr> <td align="center"> <h3>2007.1</h3> </td> <td align="center"> <h3>2007.2</h3> </td> </tr> <tr> <td valign="top"> <a href="http://farm2.static.flickr.com/1095/1057454094_4e21dfa78d_o.jpg" rel="lightbox"><img src="http://farm2.static.flickr.com/1095/1057454094_4e21dfa78d_o.jpg" width="200" alt="Welcome to OpenMoko" /></a> </td> <td valign="top"> <a href="http://farm2.static.flickr.com/1258/1069954322_739074b046_o.jpg" rel="lightbox"><img src="http://farm2.static.flickr.com/1258/1069954322_739074b046_o.jpg" width="200" alt="2007.2 Boot screen" /></a> </td> </tr> </table> <p></center><br /> <!--break--></p> <h2><small>OpenMoko Desktop</small></h2> <p><center></p> <table border="0" style="margin-top: -10px;"> <tr> <td align="center"> <h3>2007.1</h3> </td> <td align="center"> <h3>2007.2</h3> </td> </tr> <tr> <td valign="top"> <a href="http://farm2.static.flickr.com/1050/1056594013_e71865c721_o.jpg" rel="lightbox"><img src="http://farm2.static.flickr.com/1050/1056594013_e71865c721_o.jpg" width="200" alt="OpenMoko Menu" /></a> </td> <td valign="top"> <a href="http://farm2.static.flickr.com/1286/1069954604_9d88c17f7b_o.jpg" rel="lightbox"><img src="http://farm2.static.flickr.com/1286/1069954604_9d88c17f7b_o.jpg" width="200" alt="2007.2 &quot;Today&quot; (Desktop)" /></a> </td> </tr> </table> <p></center></p> <h2><small>OpenMoko Applications</small></h2> <p><center></p> <table border="0" style="margin-top: -10px;"> <tr> <td align="center"> <h3>2007.1</h3> </td> <td align="center"> <h3>2007.2</h3> </td> </tr> <tr> <td valign="top"> <a href="http://farm2.static.flickr.com/1050/1056594013_e71865c721_o.jpg" rel="lightbox"><img src="http://farm2.static.flickr.com/1050/1056594013_e71865c721_o.jpg" width="200" alt="OpenMoko Menu" /></a> </td> <td valign="top"> <a href="http://farm2.static.flickr.com/1371/1069954246_4a06926ad0_o.jpg" rel="lightbox"><img src="http://farm2.static.flickr.com/1371/1069954246_4a06926ad0_o.jpg" width="200" alt="2007.2 Applications Browser" /></a> </td> </tr> </table> <p></center></p> <h2><small>OpenMoko Dialer</small></h2> <p><center></p> <table border="0" style="margin-top: -10px;"> <tr> <td align="center"> <h3>2007.1</h3> </td> <td align="center"> <h3>2007.2</h3> </td> </tr> <tr> <td valign="top"> <a href="http://farm2.static.flickr.com/1068/1057453718_d2afbe5382_o.jpg" rel="lightbox"><img src="http://farm2.static.flickr.com/1068/1057453718_d2afbe5382_o.jpg" width="200" alt="OpenMoko Dialing." /></a> </td> <td valign="top"> <a href="http://farm2.static.flickr.com/1094/1069954414_19998097b9_o.jpg" rel="lighti=box"><img src="http://farm2.static.flickr.com/1094/1069954414_19998097b9_o.jpg" width="200" alt="2007.2 Dialer" /></a> </td> </tr> </table> <p></center></p> <p>Overall things are progressing quite nicely, but as a developer I feel that I'm teetering between bricking my OpenMoko phone, and making beautiful music with it, either way, I'm along for the ride. The last picture I'll leave you with is one from when my friend <a href="http://talk.bmc.com/blogs/blog-whurley/whurley/" target="_blank">whurley</a> and I met up this past week since he was in town representing <a href="http://www.bmc.com" target="_blank">BMC</a> at Linux World. whurley was one of the organizers of the first <a href="http://barcamp.org/iPhoneDevCamp" target="_blank">iPhoneDevCamp</a> and is a proud owner of an iPhone, regardless, he thought the OpenMoko phone was pretty cool :)</p> <p><center><br /> <a href="http://farm2.static.flickr.com/1195/1090300496_cda67ec193_b.jpg" rel="lightbox"><img src="http://farm2.static.flickr.com/1195/1090300496_cda67ec193_b.jpg" width="400" alt="whurley and OpenMoko" /></a></center></p> <p><strong>You can find all my OpenMoko photos <a href="http://www.flickr.com/photos/agentdero/tags/openmoko/" target="_blank">on Flickr</a></strong></p> http://unethicalblogger.com/posts/r_tyler_ballance/openmoko_2007_2_preview#comments Linux OpenMoko Sun, 12 Aug 2007 06:58:53 +0000 R. Tyler Croy 89 at http://unethicalblogger.com Meet OpenMoko http://unethicalblogger.com/posts/r_tyler_ballance/meet_openmoko <p>I'm not going to try to explain too much here, but I received my Neo 1973, the OpenMoko-based Smart phone today. While it's a developer preview, it's <strong>incredibly</strong> exciting. So far I've been able to use my Cingular SIM card, if you use AT&amp;T/Cingular, you can check if yours is supported on <a href="http://wiki.openmoko.org/wiki/Carriers/ATT" target="_blank">the wiki</a>. I can run the general built in suite of applications without too much trouble, I also made a phone call, which <em>worked!</em> Unfortunately however the latest build that I have on my Neo doesn't have sound properly working, which <span class="geshifilter"><code class="python geshifilter-python">sagacis</code></span> from the #openmoko channel on Freenode is helping me with currently. I'm a bit over-excited so I'll let the images do the rest of the talking for me.</p> <p><center></p> <h3>Meet OpenMoko</h3> <p><a href="http://www.flickr.com/photos/agentdero/1053119243/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1112/1053119243_7f2069a9c7_o.jpg" width="400" alt="Meet OpenMoko" /></a><br /> <br/></p> <h3>Some Assembly Required</h3> <p><a href="http://www.flickr.com/photos/agentdero/1054195462/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1147/1054195462_95e1b6f95d_o.jpg" width="400" alt="Some Assembly Required" /></a><br /> <br/><br /> </center><br /> <!--break--><br /> <center></p> <h3>Welcome to OpenMoko</h3> <p><a href="http://www.flickr.com/photos/agentdero/1057454094/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1095/1057454094_4e21dfa78d_o.jpg" width="398" height="478" alt="Welcome to OpenMoko" /></a><br /> <br/></p> <h3>Yes, It Does</h3> <p><a href="http://www.flickr.com/photos/agentdero/1056593833/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1150/1056593833_f9dc5fa633_o.jpg" width="397" height="478" alt="OpenMoko, Runs Linux" /></a><br /> <br/></p> <h3>Browsing around OpenMoko</h3> <p><a href="http://www.flickr.com/photos/agentdero/1056594013/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1050/1056594013_e71865c721_o.jpg" width="400" alt="OpenMoko Menu" /></a><br /> <br/></p> <h3>Dialing with OpenMoko</h3> <p><a href="http://www.flickr.com/photos/agentdero/1057453718/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1068/1057453718_d2afbe5382_o.jpg" width="354" height="477" alt="OpenMoko Dialing." /></a><br /> <br/></p> <h3>Sizing up OpenMoko</h3> <p><a href="http://www.flickr.com/photos/agentdero/1057818038/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1198/1057818038_712b8f7f14_o.jpg" width="400" alt="OpenMoko, Sizing It Up" /></a><br /> <br/></p> <h3>Running applications "on" your desktop</h3> <p><a href="http://www.flickr.com/photos/agentdero/1057163265/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1308/1057163265_556c144b69_o.jpg" width="400" alt="Running OpenMoko Applications" /></a><br /> </center></p> <p>In general, it's a bit slow, but the developer preview is probably about half as powerful as the planned public-released version. so I'm not exceedingly worried about that. This phone is just all around cool, and will hopefully be a fun device to carry around with me. You can check up on the OpenMoko community by adding <a href="http://planet.openmoko.org/" target="_blank">Planet OpenMoko</a> to the feed reader of your choice. This is just the beginning.</p> http://unethicalblogger.com/posts/r_tyler_ballance/meet_openmoko#comments Linux OpenMoko Thu, 09 Aug 2007 04:24:27 +0000 R. Tyler Croy 87 at http://unethicalblogger.com Hacking with IronPython http://unethicalblogger.com/posts/r_tyler_ballance/hacking_with_ironpython <p>I've been wanting to play with <a href="http://www.codeplex.com/IronPython">IronPython</a> for a <strong>very</strong> long time, but never really got around to it since most of my days are either consumed with <a href="http://www.python.org">Python</a> or <a href="http://www.mono-project.com">Mono</a> to some capacity, but never both.</p> <p>Despite my initial instinct to flee in terror after looking over some of the IronPython examples I found on various blogs, I decided it would at the very least be worth an install just to check out the interpreter, and to see how well it performs on top of Mono. <div class="geshifilter"><pre class="geshifilter-python"><ol><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">ccnet<span style="color: #66cc66;">%</span> ipy</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">IronPython <span style="color: #ff4500;">1.0</span><span style="color: #ff4500;">.2467</span> on .<span style="color: black;">NET</span> <span style="color: #ff4500;">2.0</span><span style="color: #ff4500;">.50727</span><span style="color: #ff4500;">.42</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">Copyright <span style="color: black;">&#40;</span>c<span style="color: black;">&#41;</span> Microsoft Corporation. <span style="color: black;">All</span> rights reserved.</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> </div></li></ol></pre></div></p> <p><strong>Scary!</strong> But familiar, so I forged ahead undaunted, wanting to start hashing some strings, I figured I'd import the md5 module and get to work.<br /> <div class="geshifilter"><pre class="geshifilter-python"><ol><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">ccnet<span style="color: #66cc66;">%</span> ipy</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">IronPython <span style="color: #ff4500;">1.0</span><span style="color: #ff4500;">.2467</span> on .<span style="color: black;">NET</span> <span style="color: #ff4500;">2.0</span><span style="color: #ff4500;">.50727</span><span style="color: #ff4500;">.42</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">Copyright <span style="color: black;">&#40;</span>c<span style="color: black;">&#41;</span> Microsoft Corporation. <span style="color: black;">All</span> rights reserved.</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">md5</span></div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal">Traceback <span style="color: black;">&#40;</span>most recent call last<span style="color: black;">&#41;</span>:</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> File <span style="color: #dc143c;">md5</span>, line unknown, <span style="color: #ff7700;font-weight:bold;">in</span> Initialize</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> File hashlib, line unknown, <span style="color: #ff7700;font-weight:bold;">in</span> Initialize</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"> File hashlib, line unknown, <span style="color: #ff7700;font-weight:bold;">in</span> __get_builtin_constructor</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #008000;">ImportError</span>: No module named _md5</div></li><li style="font-family: monospace; font-weight: normal;"><div style="font-family: monospace; font-weight: normal; font-style: normal"><span style="color: #66cc66;">&gt;&gt;&gt;</span> </div></li></ol></pre></div></p> <p>Alright, so there are still some holes in the IronPython bridge into Python, but this is fine by me, I can call into .NET code! One other thing that seemed to be missing was the 'select' built-in module, which in turn made my little 'telnetlib' based project fall on it's head. </p> <p>I run an <a href="http://www.icecast.org/">icecast2</a> server on my workstation, so I can just tune in with my MacBook Pro, and get whatever stream is being served up by the server. The source for the icecast2 server is a script using <a href="http://savonet.sourceforge.net/wiki/Liquidsoap">Liquidsoap</a> which allows for shuffling, bumps, and a couple of other things to make my music-listening experience better. One of the nice things about Liquidsoap is that it has a telnet interface, so I can glean meta-data about what's playing, or control the playlist through the telnet interface. With this telnet interface in tow, I set out to hack up a Windows Forms and IronPython-based controller for already scripted radio station. And thus, my little IronRadio Controller was born:<center><a href="http://www.flickr.com/photos/agentdero/953004545/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1331/953004545_b2e1f6aa41_o.jpg" width="400" alt="IronRadio Controller" /></a></center></p> <p>Unfortunately, I couldn't use Python's native "telnetlib" so I rolled my own IronTelnet class that would permit basic reads and writes to the telnet server, but other than that, the IronRadio Controller is mostly WIndows Forms code and some events cobbled together. The interface is unfortunately poor, as I don't have an <a href="http://developer.apple.com/tools/interfacebuilder.html">Interface Builder</a> for WIndows Forms, let alone IronPython-based Forms (not to mention I could care less about spit-and-polish for anything in X11.app).</p> <p>The source for the script can <a href="http://trac.geekisp.com/bleep/browser/trunk/IronPython/IronRadio.py">be found here</a>, and will require IronPython and Mono to run (or .NET if you're on a Windows machine).</p> <p>I'm still trying to figure out if I can use IronPython with mod_mono to replace fighting with mod_python, but there are no guarantees as to whether that will work or be worth the trouble.</p> http://unethicalblogger.com/posts/r_tyler_ballance/hacking_with_ironpython#comments Linux Mono Mon, 30 Jul 2007 13:24:08 +0000 R. Tyler Croy 82 at http://unethicalblogger.com Starting with OpenMoko. http://unethicalblogger.com/posts/tyler/starting_with_openmoko <p>I've already ordered my <a href="http://openmoko.com/">OpenMoko</a>-based phone already and anxiously await its arrival to the U.S. from <a href="http://www.fic.com.tw/">FIC</a>. The first order of business will of course to see if I can use it as a real phone, which I'm not holding out for since it's very obviously both beta hardware and software. More importantly however, I'm very excited at the idea of getting <a href="http://mono-project.com">Mono</a> running on the mobile, Linux/arm-based device.</p> <p>In the meantime, I've been playing around with the OpenMoko platform inside of the <a href="http://fabrice.bellard.free.fr/qemu/">QEMU</a>-arm emulator. Enjoy :)</p> <p><center></p> <h3>Meet OpenMoko</h3> <p><a href="http://www.flickr.com/photos/agentdero/863492910/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1140/863492910_6f264e179c_o.jpg" width="440" alt="Welcome to OpenMoko" /></a><br /> <!--break--></p> <h3>Booting Linux</h3> <p><a href="http://www.flickr.com/photos/agentdero/863492920/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1159/863492920_d4749cab8a_o.jpg" width="440" alt="Booting OpenMoko" /></a></p> <h3>The OpenMoko Interface</h3> <p><a href="http://www.flickr.com/photos/agentdero/863492924/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1428/863492924_c8db6bb737_o.jpg" width="440" alt="OpenMoko Home" /></a></p> <h3>Running a Terminal</h3> <p><a href="http://www.flickr.com/photos/agentdero/863551934/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1091/863551934_44195048bb_o.jpg" width="440" alt="OpenMoko Terminal" /></a></p> <h3>OpenMoko Mail</h3> <p><a href="http://www.flickr.com/photos/agentdero/863551952/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1026/863551952_233319c009_o.jpg" width="440" alt="OpenMoko Messages" /></a></p> <h3>Ordering Take-out</h3> <p><a href="http://www.flickr.com/photos/agentdero/863551980/" title="Photo Sharing"><img src="http://farm2.static.flickr.com/1024/863551980_5ca4479e22_o.jpg" width="440" alt="OpenMoko Dialing Out for Thai" /></a><br /> </center></p> <p>All in all the interface definitely needs some work, but as my iPhone toting coworker <a href="http://stuffonfire.com">David Young</a> said "how cute!"</p> <p>The platform in general has a lot of potential in my opinion, it's still up for grabs whether FIC will completely miscarry on producing decent hardware to run the phone, but you never know. The biggest key will be whether open source developers, notable for producing some of the most horrid user-interfaces since Windows 95, can cope with the new design paradigm that a smaller touch screen interface creates. I'm going to be doing my part, and for that much I'm very excited.</p> <p><strong>Is that a penguin in your pocket or are you just happy to see me?</strong></p> http://unethicalblogger.com/posts/tyler/starting_with_openmoko#comments Linux OpenMoko Sat, 21 Jul 2007 09:45:39 +0000 R. Tyler Croy 77 at http://unethicalblogger.com