<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Kev009.com</title><link href="http://kev009.com/wp/" rel="alternate"></link><link href="http://kev009.com/wp/feed/all.atom.xml" rel="self"></link><id>http://kev009.com/wp/</id><updated>2024-07-03T20:52:00-07:00</updated><subtitle>Speed and accuracy are fine, kev009 is final:  projects and ventures of Kevin Bowling</subtitle><entry><title>Lucent 7 R/E 5ESS Telephone Switch Rescue</title><link href="http://kev009.com/wp/2024/07/Lucent-5ESS-Rescue/" rel="alternate"></link><published>2024-07-03T20:52:00-07:00</published><updated>2024-07-03T20:52:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2024-07-03:/wp/2024/07/Lucent-5ESS-Rescue/</id><summary type="html">&lt;p&gt;I am still recovering from the fairly challenging logistical project of saving a
Lucent 5ESS. This is a whale of a project and I am still in a state of disbelief
that I have gotten to this point. Thanks to my wife, brother, and a few friends
for their help …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I am still recovering from the fairly challenging logistical project of saving a
Lucent 5ESS. This is a whale of a project and I am still in a state of disbelief
that I have gotten to this point. Thanks to my wife, brother, and a few friends
for their help and the University of Arizona which has a very dedicated and
professional Information Technology Services staff.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2024/5ESS/5ESS_Rows.JPG"&gt;&lt;img alt="5ESS Rows" src="http://kev009.com/wp/assets/2024/5ESS/5ESS_Rows_thumbnail.jpg" title="5ESS move"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It started when I saw some telephone history enthusiasts post about a
construction bid at the University of Arizona. It turns out, U of A installed
the 5ESS in the late 1980s in a rather forward thinking move that netted a phone
system that handled the growth of the University, medium speed data anywhere a
phone may be located (ISDN BRI or PRI), and copper and fiber plant that will
continue to be used indefinitely.&lt;/p&gt;
&lt;p&gt;At peak, it served over 20,000 lines. They've done their own writeup, &lt;a href="https://it.arizona.edu/news/end-era-telecommunications"&gt;The End
of An Era in Telecommunications&lt;/a&gt;, that is worth a read. In particular, the
machine had an uptime of approximately 35 years including two significant
retrofits to newer technology culminating in the current Lucent-dressed 7 R/E
configuration that includes an optical packet-switched core called the
Communications Module 3 (CM3) or Global Messaging Server 3 (GMS3).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2024/5ESS/5ESS_diagram.JPG"&gt;&lt;img alt="5ESS diagram" src="http://kev009.com/wp/assets/2024/5ESS/5ESS_diagram_thumbnail.jpg" title="5ESS diagram"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Moving 40 frames of equipment, this required a ton of planning and muscle. The
whole package took up two 26' straight-trucks, which is just 1' short of an
entire standard US semi-trailer.&lt;/p&gt;
&lt;p&gt;Coming from the computing and data networking world, the construction of the
switch was quite bewildering at first. It is physically made up of standard
frames which are interconnected into rows not unlike datacenter equipment, but
the frames are integrated into an overhead system for cable management.
Internally, they are wired up usually within the row and quite a few cables
route horizontally beween frames, but some connections have to transit up and
over to other rows.&lt;/p&gt;
&lt;p&gt;Line Trunk Peripherals hook up to a Switching Module Controller (SMC) directly
or an OXU (Optical Cross Connect Unit) which hooks up to an SMC and reduces the
amount of copper cabling going between rows. Alarm cables run directly to an OAU
(Office Alarm Unit) or form rings in between rows that eventually end at the
OAU. Optical connections go from OXUs to SMCs and then to the CM, copper test
circuits home run to a Metallic Test Service Unit shelf. Communications Cables
come out the top and route toward the wire frame, usually in large 128 wire
cables but occasionally in smaller quantity for direct or cross connect of
special services. A pair of Power Distribution Frames distribute -48V throughout
the entire footprint, taking into account redundancy at every level.&lt;/p&gt;
&lt;p&gt;All of this was neatly cable laced with wax string. Moving a single frame
required hundreds of distinct actions that vary from quick, like cutting cable
lace, to time consuming removal of copper connections and bolts in all
directions.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2024/5ESS/5ESS_move.JPG"&gt;&lt;img alt="5ESS move" src="http://kev009.com/wp/assets/2024/5ESS/5ESS_move_thumbnail.jpg" title="5ESS move"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We were able to complete the removal in a single five day workweek, and I was
able to unload it to my receiving area in two days over the weekend where it now
safely resides.&lt;/p&gt;
&lt;p&gt;The next step will be to acquire some AC and DC power distribution equipment,
which will have to wait for my funds to recover.&lt;/p&gt;
&lt;p&gt;I should be able to boot the Administrative Module (AM), a 3B21D computer, up
relatively soon by acquiring a smaller DC rectifier and that alone will be very
interesting as it is the only use I know of the &lt;a href="https://en.wikipedia.org/wiki/Multi-Environment_Real-Time"&gt;DMERT or UNIX-RTR&lt;/a&gt; operating
system, a fault tolerant micro-kernel realtime UNIX from Bell Labs.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2024/5ESS/3B21D.JPG"&gt;&lt;img alt="3B21D" src="http://kev009.com/wp/assets/2024/5ESS/3B21D_thumbnail.jpg" title="3B21D Front View"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The system came with a full set of manuals and schematics which will help
greatly in rewiring and reconfiguring the machine. After the AM is up, I need to
"de-grow" the disconnected equipment and I will eventually add back in an
assortment of line, packet, and service units so that I can demonstrate POTS as
well as ISDN voice and data. In particular, I am looking forward to
interoperating with other communication and computing equipment I have.&lt;/p&gt;
&lt;p&gt;I will have to reduce the size of the system quite a bit for power and space
reasons so will have spare parts to sell or trade.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2024/5ESS/"&gt;Additional Pictures&lt;/a&gt; are available here until I have a longer term project page
established.&lt;/p&gt;
&lt;p&gt;This is too much machine for one man, and it is part of a broader project I am
working on to build a computing and telecommunications museum. If you are
interested in working on the system with me, please feel free to reach out.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2024/5ESS/5ESS_receiving.JPG"&gt;&lt;img alt="5ESS receiving" src="http://kev009.com/wp/assets/2024/5ESS/5ESS_receiving_thumbnail.jpg" title="5ESS move"&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="misc"></category><category term="5ESS"></category><category term="retrocomputing"></category><category term="Computing"></category><category term="Hardware"></category><category term="Projects"></category></entry><entry><title>FreeBSD on PowerNV</title><link href="http://kev009.com/wp/2017/12/freebsd-on-powernv/" rel="alternate"></link><published>2017-12-06T18:09:00-07:00</published><updated>2017-12-06T18:09:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2017-12-06:/wp/2017/12/freebsd-on-powernv/</id><content type="html">&lt;p&gt;At the Netflix vendor summit I gave a talk about FreeBSD on PowerNV,
the bare metal firmware of POWER8 and POWER9.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2017/12/FreeBSD-PowerNV.pdf"&gt;PDF slides&lt;/a&gt;&lt;/p&gt;</content><category term="misc"></category><category term="FreeBSD"></category><category term="Computing"></category><category term="Datacenter"></category></entry><entry><title>The Art of Software Development Management</title><link href="http://kev009.com/wp/2016/10/the-art-of-software-development-management/" rel="alternate"></link><published>2016-10-14T02:24:00-07:00</published><updated>2016-10-14T02:24:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2016-10-14:/wp/2016/10/the-art-of-software-development-management/</id><summary type="html">&lt;p&gt;A fallacy in software development and management thereof is the idea that
software developers are fungible.&lt;/p&gt;
&lt;p&gt;This is not intuitive for folks to reason about because programming does entail
at a fundamental level accounting and bookkeeping.  Put this into a container,
grab this lock in this order, call this function …&lt;/p&gt;</summary><content type="html">&lt;p&gt;A fallacy in software development and management thereof is the idea that
software developers are fungible.&lt;/p&gt;
&lt;p&gt;This is not intuitive for folks to reason about because programming does entail
at a fundamental level accounting and bookkeeping.  Put this into a container,
grab this lock in this order, call this function with these parameters, free
this file handle when done with it.  We are describing contracts for execution
and flow for data.&lt;/p&gt;
&lt;p&gt;Why then is software development not a simple matter of accounting?  Because
that is the easy part.  It has defined boundaries and someone will either
succeed or fail in finding them.  A program either compiles or does not.  The
software encounters runtime errors or runs through.  It has incorrect logic or
does what is expected by the user.&lt;/p&gt;
&lt;p&gt;If one person is working on the software and is the sole user, as long as they
understand it and can use it, all is well.&lt;/p&gt;
&lt;p&gt;Efficiency and time to delivery begin to part from these true and false answers.
Everything breaks down when more people are added or the software outlasts the
original developer's grasp.&lt;/p&gt;
&lt;p&gt;What now dominates the difficulty is not the objective truths of algorithms, but
the subjective qualities of their implementation and surrounding infrastructure
like maintainability, composition, documentation and deployment.  This is
governed by people.  People understand, in vector space rather than Boolean, the
intent of a function, module, library, piece of software, and entire system.
People, in vector space, have the ability to explain the implementations, the
trade offs, the false starts and the success.  People, in vector space, have the
ability to effect changes, and at vastly different rates.  Developers can negate
progress and value.&lt;/p&gt;
&lt;p&gt;These vector space attributes are why software developers are not fungible.&lt;/p&gt;
&lt;p&gt;When someone works on a piece of software long enough, they have a vision for
what it should be and a history of what the problems have been along the way.&lt;/p&gt;
&lt;p&gt;Someone who is well read and has written similar sized systems will have a
faster rate of learning and confidence on a new code base.&lt;/p&gt;
&lt;p&gt;Someone with a sense of ownership and quality will imbue quality in their work.
Another, with little interest in the task at hand will not, because quality is
not accidental.&lt;/p&gt;
&lt;p&gt;Are the folks maintaining the software able to work by, with, and through any
obstacle they encounter?  Have they proven the ability to predict and meet
deadlines?  Can they bring new people in?  Might someone leave and the overall
direction be maintained?  Is the organization willing to remove code and
features?  These compose shared values.&lt;/p&gt;
&lt;p&gt;In order:  a developer, team, organization, company, product and community carry
subjective vector space qualities.  Comparisons between developers, teams,
organizations, companies, products and communities are increasingly more
difficult in like order.&lt;/p&gt;
&lt;p&gt;It is foolish to think any one of these are a simple interchange with so many
continua.  The dynamics are more akin to organ transplant.&lt;/p&gt;
&lt;p&gt;Yet a grandmaster of software development has intuition for evaluating the
performance of these different scale actors, selecting and nurturing high
performance.  This is the Art of Software Development Management.&lt;/p&gt;
&lt;p&gt;Few people live it.  Everywhere I've been has retained negative performance on
teams because someone just might do something useful eventually, they are here
and headcount is hard to get, or the employee is just a nice person without
consideration for the consequence.  I've seen enough entire teams that would do
better to be on a permanent paid vacation than working on product for a company.
Every company I know of pays developers at opposite ends of the overall vector a
low multiple difference at most, while a management chain that undermines The
Art of Software Development Management to the point of institutional devalue may
easily earn two and three orders of magnitude more.&lt;/p&gt;
&lt;p&gt;When we look at human performance in sport, it is somehow obvious even to the
layman.  It would be cruel to swap children in on an NFL offensive line.  Yet in
software development organizations, this kind of wholesale swapout happens all
the time with largely the same result - the entire product gets battered,
frustrated, and losses result.  A more empathetic strategy for the gradient of
performance is to have separate leagues and deliberate transition points.  Mixed
performance can happen by exception only on a very mature team, with a product
that is stable enough so mentorship can occur without stressing the mentor or
mentee.&lt;/p&gt;
&lt;p&gt;This is largely why commercial software development quality is abysmal.  I don't
know how to effect change en masse from where I stand now, but I am doing my
best to live to it.&lt;/p&gt;</content><category term="misc"></category><category term="the craft"></category><category term="software quality"></category><category term="software development"></category><category term="management"></category><category term="leadership"></category></entry><entry><title>Software Quality and the Table Saw</title><link href="http://kev009.com/wp/2016/10/software-quality-and-the-table-saw/" rel="alternate"></link><published>2016-10-14T01:35:00-07:00</published><updated>2016-10-14T01:35:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2016-10-14:/wp/2016/10/software-quality-and-the-table-saw/</id><summary type="html">&lt;p&gt;Consider the table saw.  If you are not familiar with woodworking, this is a
type of shop saw.  A circular blade comes out from a table surface.  It can be
adjusted with a decent amount of precision to make cuts of a specified depth and
angle.&lt;/p&gt;
&lt;p&gt;One might naively think …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Consider the table saw.  If you are not familiar with woodworking, this is a
type of shop saw.  A circular blade comes out from a table surface.  It can be
adjusted with a decent amount of precision to make cuts of a specified depth and
angle.&lt;/p&gt;
&lt;p&gt;One might naively think this piece of equipment is easy to use.  Dial in the
settings and push the stock through.  In the best case, you end up with sloppy
cuts.  In the worst case, you incur bodily harm.&lt;/p&gt;
&lt;p&gt;The skilled worker will understand kickback and feeding all the way through.
They will be mentally prepared to use the equipment, ensuring the space is
clean, dust collection is working, that they have no loose clothing or jewelry
to cause themselves danger.&lt;/p&gt;
&lt;p&gt;A seasoned woodworker will build "jigs" - small projects designed to brace and
feed stock through the table in a precise and safe manor.  They will know when
their job is complete, and when to throw away scrap and try again.&lt;/p&gt;
&lt;p&gt;The tools available to build software today are about as complicated and usable
as this table saw.  An experienced software developer is demonstrable by their
jigs and willingness to throw away swaths of code.  The stakes are different,
but too many developers do not bring to bear a respect for the tool, nor the
harm they cause to other developers and users with sloppy use because the
reaction time and blame assignment are so far removed.&lt;/p&gt;</content><category term="misc"></category><category term="the craft"></category><category term="software quality"></category></entry><entry><title>FreeBSD UEFI Root on ZFS and Windows Dual Boot</title><link href="http://kev009.com/wp/2016/07/freebsd-uefi-root-on-zfs-and-windows-dual-boot/" rel="alternate"></link><published>2016-07-29T06:30:00-07:00</published><updated>2016-07-29T06:30:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2016-07-29:/wp/2016/07/freebsd-uefi-root-on-zfs-and-windows-dual-boot/</id><summary type="html">&lt;p&gt;Somehow I've managed to mostly not care about UEFI until now.  On my new laptop,
I decided I should give it a go.  There are some small benefits, nothing life
changing, but booting multiple OSes is a lot easier especially if they are UEFI
native, and you get a nice …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Somehow I've managed to mostly not care about UEFI until now.  On my new laptop,
I decided I should give it a go.  There are some small benefits, nothing life
changing, but booting multiple OSes is a lot easier especially if they are UEFI
native, and you get a nice frame buffer the boot manager can use as will the OS
before starting graphically (and after, if you don't have accelerated graphics
drivers).&lt;/p&gt;
&lt;p&gt;For reference, how I run FreeBSD desktop/laptop:  &lt;a href="https://github.com/kev009/digital-life"&gt;digital-life&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Thanks to&lt;/h3&gt;
&lt;p&gt;Most of this was cribbed from the following sources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ericmccorkleblog.wordpress.com/2016/05/15/freebsd-efi-bootloader-refactor/"&gt;Eric McCorkle&lt;/a&gt;, Steve Hartland and others for adding ZFS boot and a ton of
other improvements (GELI) to the FreeBSD UFI loader&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ximalas.info/2015/03/19/uefi-gpt-windows-10-freebsd-10-and-refind/"&gt;Trond Endrestøl&lt;/a&gt;'s blog, for mentioning refind and the overall UEFI
landscape on FreeBSD&lt;/li&gt;
&lt;li&gt;Calomel, for a decent overview of manual &lt;a href="https://calomel.org/zfs_freebsd_root_install.html"&gt;ZFS on root installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://svnweb.freebsd.org/base/head/usr.sbin/bsdinstall/scripts/zfsboot?view=markup"&gt;/usr/src/usr.sbin/bsdinstall/scripts/zfsboot&lt;/a&gt; for some ZFS specifics&lt;/li&gt;
&lt;li&gt;An imaging script my colleague Jason Wolfe did for ZFS and boot envs at work&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Install Windows 10 or other UEFI OS&lt;/h3&gt;
&lt;p&gt;It's easiet if you install any other co-habiting OS first.  Most OS installers
assume they own the entire computer, and don't let you know much about what they
are really doing, especially when manipulating booting.&lt;/p&gt;
&lt;p&gt;Windows creates a large 100MB EFI partition, plenty of room for refind and other
boot loaders.&lt;/p&gt;
&lt;p&gt;Leave free space during the installer or shrink the partition using Windows Disk
Manager.&lt;/p&gt;
&lt;h3&gt;Boot into a FreeBSD 11+ live environment&lt;/h3&gt;
&lt;p&gt;We just need a live FreeBSD enviroment to conduct our manual install.  Make sure
it is 11.0 or newer for UEFI boot1 zfs support.&lt;/p&gt;
&lt;p&gt;The USB images with FreeBSD 11.0 and later -CURRENT snapshots have UEFI support
integrated so they are directly bootable on UEFI machines.  You could also use a
CD/DVD or netboot.&lt;/p&gt;
&lt;h3&gt;Enable sshd, if needed&lt;/h3&gt;
&lt;p&gt;If you want to copy/paste from this blog to the machine being installed, bring
up SSH.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mkdir&lt;span class="w"&gt; &lt;/span&gt;/tmp/etc&lt;span class="w"&gt; &lt;/span&gt;/tmp/root
mount_unionfs&lt;span class="w"&gt; &lt;/span&gt;/tmp/etc&lt;span class="w"&gt; &lt;/span&gt;/etc
mount_unionfs&lt;span class="w"&gt; &lt;/span&gt;/tmp/root&lt;span class="w"&gt; &lt;/span&gt;/root
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;PermitRootLogin yes&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/etc/ssh/sshd_config
passwd
service&lt;span class="w"&gt; &lt;/span&gt;sshd&lt;span class="w"&gt; &lt;/span&gt;onestart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Bring up a network interface&lt;/h3&gt;
&lt;p&gt;We'll need to grab refind during the installation.&lt;/p&gt;
&lt;p&gt;Get a dhcp lease on your NIC or see the &lt;a href="https://www.freebsd.org/doc/handbook/network-wireless.html"&gt;handbook for wireless setup&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;dhclient&lt;span class="w"&gt; &lt;/span&gt;em0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Partition the drive&lt;/h3&gt;
&lt;p&gt;Add a couple GPT partitions.  I'm doing a non-ZFS swap so I can coredump the
kernel when doing FreeBSD development.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;gpart&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;4K&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;swap0&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;16G&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;freebsd-swap&lt;span class="w"&gt; &lt;/span&gt;nvd0
gpart&lt;span class="w"&gt; &lt;/span&gt;add&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;4K&lt;span class="w"&gt; &lt;/span&gt;-l&lt;span class="w"&gt; &lt;/span&gt;zfs0&lt;span class="w"&gt; &lt;/span&gt;-t&lt;span class="w"&gt; &lt;/span&gt;freebsd-zfs&lt;span class="w"&gt; &lt;/span&gt;nvd0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Create a 4k aligned zpool&lt;/h3&gt;
&lt;p&gt;Standard practice these days, 4k align everything even if it's not a 4k-native
disk.&lt;/p&gt;
&lt;p&gt;Create a mountpoint and the inital zpool.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;kldload&lt;span class="w"&gt; &lt;/span&gt;zfs
sysctl&lt;span class="w"&gt; &lt;/span&gt;vfs.zfs.min_auto_ashift&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;
mkdir&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot
zpool&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;altroot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/zroot&lt;span class="w"&gt; &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;compress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lz4&lt;span class="w"&gt; &lt;/span&gt;-O&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;atime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;-m&lt;span class="w"&gt; &lt;/span&gt;none&lt;span class="w"&gt; &lt;/span&gt;zroot&lt;span class="w"&gt; &lt;/span&gt;/dev/gpt/zfs0
zpool&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;zroot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Boot environment compatible ZFS datasets&lt;/h2&gt;
&lt;p&gt;Nest the root dataset under ROOT so we can use boot environments in the 
future with &lt;a href="http://www.freshports.org/sysutils/beadm/"&gt;beadm&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;zpool&lt;span class="w"&gt; &lt;/span&gt;import&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;altroot&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/zroot&lt;span class="w"&gt; &lt;/span&gt;zroot
zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;none&lt;span class="w"&gt; &lt;/span&gt;zroot/ROOT
zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/&lt;span class="w"&gt; &lt;/span&gt;zroot/ROOT/default
zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;setuid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;zroot/tmp
zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;canmount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;zroot/usr
zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;zroot/usr/home
zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;setuid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;zroot/usr/ports
zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;mountpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;canmount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;zroot/var
zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;setuid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;zroot/var/audit
zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;setuid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;zroot/var/crash
zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;setuid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;zroot/var/log
zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;atime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;on&lt;span class="w"&gt; &lt;/span&gt;zroot/var/mail
zfs&lt;span class="w"&gt; &lt;/span&gt;create&lt;span class="w"&gt; &lt;/span&gt;-o&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;setuid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;off&lt;span class="w"&gt; &lt;/span&gt;zroot/var/tmp
zpool&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;bootfs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;zroot/ROOT/default&lt;span class="w"&gt; &lt;/span&gt;zroot
chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1777&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot/tmp
chmod&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1777&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot/var/tmp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Perform a manual install of the distribution&lt;/h2&gt;
&lt;p&gt;This is pretty easy.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot
ln&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;usr/home&lt;span class="w"&gt; &lt;/span&gt;home
tar&lt;span class="w"&gt; &lt;/span&gt;xvJpf&lt;span class="w"&gt; &lt;/span&gt;/usr/freebsd-dist/base.txz
tar&lt;span class="w"&gt; &lt;/span&gt;xvJpf&lt;span class="w"&gt; &lt;/span&gt;/usr/freebsd-dist/lib32.txz
tar&lt;span class="w"&gt; &lt;/span&gt;xvJpf&lt;span class="w"&gt; &lt;/span&gt;/usr/freebsd-dist/kernel.txz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Set a few things up&lt;/h3&gt;
&lt;p&gt;Set some common configuration.  You may also wish to set up networking,
enable SSH, etc in the altroot rc.conf.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;zfs_enable=&amp;quot;YES&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot/etc/rc.conf
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dumpdev=&amp;quot;AUTO&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot/etc/rc.conf
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;powerd_enable=&amp;quot;YES&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot/etc/rc.conf
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sendmail_enable=&amp;quot;NONE&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot/etc/rc.conf
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;zfs_load=&amp;quot;YES&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot/boot/loader.conf
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;kern.geom.label.disk_ident.enable=&amp;quot;0&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot/boot/loader.conf
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;kern.geom.label.gptid.enable=&amp;quot;0&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot/boot/loader.conf
&lt;span class="nb"&gt;printf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/dev/gpt/swap0\tnone\tswap\tsw\t0\t0\n&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot/fstab
tzsetup&lt;span class="w"&gt; &lt;/span&gt;-C&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot
chroot&lt;span class="w"&gt; &lt;/span&gt;/tmp/zroot/&lt;span class="w"&gt; &lt;/span&gt;passwd
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Install refind&lt;/h3&gt;
&lt;p&gt;UEFI has lots of bells and whistles.  We're going to use the &lt;a href="http://www.rodsbooks.com/refind/"&gt;refind&lt;/a&gt; boot
manager.  I'm relying on the "fallback" efi loader, bootx64.efi.  You may need
to toggle things around in your system's firmware for that to work, or teach the
EFI NVRAM about refind.  See the refind site for more details.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp
fetch&lt;span class="w"&gt; &lt;/span&gt;http://downloads.sourceforge.net/project/refind/0.10.3/refind-bin-0.10.3.zip
unzip&lt;span class="w"&gt; &lt;/span&gt;refind-bin-0.10.3.zip
rm&lt;span class="w"&gt; &lt;/span&gt;refind-bin-0.10.3.zip
mkdir&lt;span class="w"&gt; &lt;/span&gt;/tmp/efi
mount_msdosfs&lt;span class="w"&gt; &lt;/span&gt;/dev/gpt/EFI%20system%20partition&lt;span class="w"&gt; &lt;/span&gt;/tmp/efi/
&lt;span class="nb"&gt;cd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;/tmp/efi/EFI/Boot
mv&lt;span class="w"&gt; &lt;/span&gt;bootx64.efi&lt;span class="w"&gt; &lt;/span&gt;bootx64-windows-10.efi
cp&lt;span class="w"&gt; &lt;/span&gt;/boot/boot1.efi&lt;span class="w"&gt; &lt;/span&gt;bootx64-freebsd.efi
cp&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;/tmp/refind-bin-0.10.3/refind/icons&lt;span class="w"&gt; &lt;/span&gt;.
cp&lt;span class="w"&gt; &lt;/span&gt;-a&lt;span class="w"&gt; &lt;/span&gt;/tmp/refind-bin-0.10.3/refind/refind_x64.efi&lt;span class="w"&gt; &lt;/span&gt;bootx64.efi
cp&lt;span class="w"&gt; &lt;/span&gt;/tmp/refind-bin-0.10.3/refind/refind.conf-sample&lt;span class="w"&gt; &lt;/span&gt;refind.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;As good hygiene, you might consider updating bootx64-freebsd.efi whenever a
point release is done.  You could also keep an eye out for refind updates.  This
is easily done since it's just a DOS filesystem.&lt;/p&gt;
&lt;h3&gt;Configure refind and add menu entries&lt;/h3&gt;
&lt;p&gt;Set the values of timeout, and scanfor to manual to speed things
up a bit in refind.conf.&lt;/p&gt;
&lt;p&gt;Then add a couple entries:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cat&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;&amp;lt; EOF &amp;gt;&amp;gt; refind.conf&lt;/span&gt;

&lt;span class="s"&gt;menuentry &amp;quot;FreeBSD/amd64 -CURRENT&amp;quot; {&lt;/span&gt;
&lt;span class="s"&gt;    loader \EFI\Boot\bootx64-freebsd.efi&lt;/span&gt;
&lt;span class="s"&gt;    icon \EFI\Boot\icons\os_freebsd.png&lt;/span&gt;
&lt;span class="s"&gt;}&lt;/span&gt;

&lt;span class="s"&gt;menuentry &amp;quot;Windows 10 Professional x64&amp;quot; {&lt;/span&gt;
&lt;span class="s"&gt;    loader \EFI\Boot\bootx64-windows-10.efi&lt;/span&gt;
&lt;span class="s"&gt;    icon \EFI\Boot\icons\os_win.png&lt;/span&gt;
&lt;span class="s"&gt;}&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Finish, reboot and enjoy!&lt;/h3&gt;
&lt;p&gt;That's it.  Unmount the efi partition and reboot.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;
umount&lt;span class="w"&gt; &lt;/span&gt;/tmp/efi
reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You should be greeted by
refind, otherwise take a look through your firmware boot order and make sure
the firmware nvram for Windows Bootmanager isn't first.&lt;/p&gt;
&lt;h3&gt;GELI&lt;/h3&gt;
&lt;p&gt;Keep an eye out for &lt;a href="https://ericmccorkleblog.wordpress.com/2016/05/28/freebsd-geli-support/"&gt;GELI full disk encryption&lt;/a&gt; on top of ZFS on root.&lt;/p&gt;
&lt;p&gt;Don't forget to do the swap partition as well.&lt;/p&gt;</content><category term="misc"></category><category term="freebsd"></category><category term="uefi"></category><category term="zfs"></category><category term="windows"></category></entry><entry><title>Do one thing</title><link href="http://kev009.com/wp/2015/12/do-one-thing/" rel="alternate"></link><published>2015-12-11T10:46:00-07:00</published><updated>2015-12-11T10:46:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2015-12-11:/wp/2015/12/do-one-thing/</id><summary type="html">&lt;p&gt;&lt;em&gt;Do&lt;/em&gt; one thing per day.  Make that thing meaningful.  Commit a bugfix.  Land a
feature.  Close a sale.  Apply security patches.  Write a blog post.&lt;/p&gt;
&lt;p&gt;Do this and you will be more productive than most people.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Don't&lt;/em&gt; just go to meetings, and especially don't just "work".  If you are
currently …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Do&lt;/em&gt; one thing per day.  Make that thing meaningful.  Commit a bugfix.  Land a
feature.  Close a sale.  Apply security patches.  Write a blog post.&lt;/p&gt;
&lt;p&gt;Do this and you will be more productive than most people.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Don't&lt;/em&gt; just go to meetings, and especially don't just "work".  If you are
currently "working", you are in a rut, your brain is idle, and you are not
&lt;em&gt;doing&lt;/em&gt;.  You do not have a clearly defined objective in your mind's eye.&lt;/p&gt;</content><category term="misc"></category><category term="retrospective"></category><category term="work"></category></entry><entry><title>Goodbye Wordpress, hello Pelican</title><link href="http://kev009.com/wp/2014/04/goodbye-wordpress-hello-pelican/" rel="alternate"></link><published>2014-04-06T07:40:00-07:00</published><updated>2014-04-06T07:40:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2014-04-06:/wp/2014/04/goodbye-wordpress-hello-pelican/</id><summary type="html">&lt;p&gt;I spent some time converting my Wordpress blog over to &lt;a href="http://getpelican.com/"&gt;Pelican&lt;/a&gt;. Overall, it wasn't effortless and 
required quite a lot of manual clean up of links and images. But, I'm a pack rat
and want to preserve my writings even if they are dated or silly now, so I pressed …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I spent some time converting my Wordpress blog over to &lt;a href="http://getpelican.com/"&gt;Pelican&lt;/a&gt;. Overall, it wasn't effortless and 
required quite a lot of manual clean up of links and images. But, I'm a pack rat
and want to preserve my writings even if they are dated or silly now, so I pressed on.&lt;/p&gt;
&lt;p&gt;But it's for the better. It's very comforting to ditch the massive security
vulnerability of Wordpress. I no longer have any MySQL apps on any of
my servers which makes administration simpler with just Postgres.&lt;/p&gt;
&lt;p&gt;Static blog generators seem so blindingly obvious in retrospect.&lt;/p&gt;
&lt;p&gt;I migrated comments to Disqus, which I'm more ambivalent about. On one hand, dealing with spam is tough and 
outsourcing basic protection is nice. On the other, I'm a fan of self-hosting and self-sufficent systems.&lt;br&gt;
Disqus could become undesirable at any point in time. With an export, it wouldn't be too much
effort to self-host those again though.&lt;/p&gt;
&lt;p&gt;Speaking of retrospect, I launched this blog over seven years ago.  Crazy how time flies.&lt;/p&gt;
&lt;p&gt;Useful references:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.jasonantman.com/2014/02/converting-wordpress-posts-to-pelican-markdown/"&gt;http://blog.jasonantman.com/2014/02/converting-wordpress-posts-to-pelican-markdown/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.jasonantman.com/2014/03/wordpress-to-pelican-with-disqus-comments/"&gt;http://blog.jasonantman.com/2014/03/wordpress-to-pelican-with-disqus-comments/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"></category><category term="blogging"></category><category term="wordpress"></category><category term="pelican"></category><category term="retrospective"></category></entry><entry><title>Armed to the gills - Dell C6100 build out</title><link href="http://kev009.com/wp/2013/12/armed-to-the-gills-dell-c6100-build-out/" rel="alternate"></link><published>2013-12-18T12:49:00-07:00</published><updated>2013-12-18T12:49:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2013-12-18:/wp/2013/12/armed-to-the-gills-dell-c6100-build-out/</id><summary type="html">&lt;p&gt;The fine folks over at ServeTheHome have done a fantastic job
documenting the Dell C6100. This is a rather interesting system because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It packs quite a bit of compute power into 2U for colocation&lt;/li&gt;
&lt;li&gt;They are surprisingly cheap on the secondary markets&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I'll lead you over to the ServeTheHome blog …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The fine folks over at ServeTheHome have done a fantastic job
documenting the Dell C6100. This is a rather interesting system because:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It packs quite a bit of compute power into 2U for colocation&lt;/li&gt;
&lt;li&gt;They are surprisingly cheap on the secondary markets&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I'll lead you over to the ServeTheHome blog posts which deliver a nice
overview:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.servethehome.com/Server-detail/dell-poweredge-c6100-xs23-ty3-cloud-server-2u-4-node-8-sockets/"&gt;Dell PowerEdge C6100 XS23-TY3 Cloud Server - 2U 4 Node 8 Sockets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.servethehome.com/dell-c6100-xs23-ty3-update-community-findings/"&gt;Dell C6100 XS23-TY3 Update - Community Findings&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My ideal config is a redundant set of servers running border services
including routing, NAT, firewall, VPN and a redundant set of servers
running a variety of applications, VMs, etc.&lt;/p&gt;
&lt;p&gt;The C6100 comes in either a 12 disk 3.5" chassis, or a 24 disk 2.5"
chassis. The disks are factory split between the systems in either three
3.5" per node, or six 2.5" per node.&lt;/p&gt;
&lt;p&gt;My border networking nodes don't need a lot of disk space. In fact, they
don't even really need RAID thanks to the magic of &lt;a href="http://www.openbsd.org/faq/pf/carp.html"&gt;PF and CARP&lt;/a&gt;. So
preferably I don't want to waste the hot swap bays on them. There are
several options here.. PXE or iSCSI boot, USB thumb disk boot, or figure
out how to cram some storage inside the unit. Turns out the last option
isn't that hard if you need traditional local storage.&lt;/p&gt;
&lt;p&gt;Using info from the ServeTheHome forums, I built a 5V power tap. I bound
the two 5V rails and two grounds from the internal USB header to a donor
4-pin Molex to SATA power converter. I recommend sticking with a low
power SSD like the Crucial M500 or certain Samsung units as this is
stretching the USB-standard power envelope a bit at .5A per port.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2013/12/IMG_20131214_210328_101.jpg"&gt;&lt;img alt="Dell c6100 5v USB to SATA power tap" src="http://kev009.com/wp/assets/2013/12/IMG_20131214_210328_101-150x150.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Dell c6100 5v USB to SATA power tap&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Here's a parts list per node:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Qty: 4 - Molex 12" picoblade precrimped wire - &lt;a href="http://www.mouser.com/ProductDetail/Molex/06-66-0013/?qs=haxXlyRKjHTiMwJDJkSlEg=="&gt;Mouser link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Qty: 1 - Molex 8 position picoblade connector - &lt;a href="http://www.mouser.com/ProductDetail/Molex/51021-0800/?qs=zi95yC3thwEO31wDz4TQLA=="&gt;Mouser link&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Qty: 1 - SATA power connectors salvaged from a 4-pin Molex converter&lt;/li&gt;
&lt;li&gt;Qty: 1 - 6" SATA cables&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2013/12/IMG_20131214_210345_478.jpg"&gt;&lt;img alt="Dell c6100 internal SSD storage" src="http://kev009.com/wp/assets/2013/12/IMG_20131214_210345_478-150x150.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Dell c6100 internal SSD storage&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I mounted the internal SSDs with a stack of automotive trim tape on top
of the Southbridge heatsink. A block of foam usually sits here to
support mezzanine cards so I'm not too concerned. If need be, I can cold
swap these disks without too much trouble while the other nodes continue
to run.&lt;/p&gt;
&lt;p&gt;This in turn frees up the hot swap bays to be split between the two app
nodes. This is great because six 3.5" disks gives me the right balance
of flexibility, capacity, performance, and cost. Rewiring this is a bit
of a chore. You need to order two SFF-8087 to 4x SATA 7pin breakout
cables (check Monoprice). You can reuse the two original cables with
some creative wiring (altering the numbering of the front bays so they
are right-to-left numbered), or purchase four of the aforementioned
cables for correct numbering.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2013/12/IMG_20131214_215512_794.jpg"&gt;&lt;img alt="Full c6100 loadout" src="http://kev009.com/wp/assets/2013/12/IMG_20131214_215512_794-150x150.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Full c6100 loadout&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you're running SSDs in an array, I recommend hunting down the LSI
SAS2008 based "XX2X2" mezzanine card which runs at 6gbps and supports
&amp;gt;2TB disks. You need various bits to install this, including new SATA
cables, PCI-E riser, and metal brackets. At the time of my purchase, the
easiest way to get this was buying the older "Y8Y69" mezzanine card with
all those bits and buying a bare "XX2X2" card.&lt;/p&gt;
&lt;p&gt;These hacks probably don't make much sense in all settings as they're
fairly time consuming. If you have the budget, the 24 2.5" disk chassis
is the way to go. But for personal use, this is a great build for me!&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Hardware"></category><category term="Projects"></category><category term="dell c6100"></category></entry><entry><title>Reusable Pagination in Play! 2</title><link href="http://kev009.com/wp/2012/12/reusable-pagination-in-play-2/" rel="alternate"></link><published>2012-12-04T13:42:00-07:00</published><updated>2012-12-04T13:42:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2012-12-04:/wp/2012/12/reusable-pagination-in-play-2/</id><summary type="html">&lt;p&gt;On the &lt;a href="http://www.playframework.org/"&gt;Play! Framework&lt;/a&gt; mailing lists I've seen reference to the
sample &lt;a href="https://github.com/playframework/Play20/tree/master/samples/scala/computer-database"&gt;Computer Database&lt;/a&gt; as a canonical example of paginating data.
It's a good start but it's pretty specific to one data type. Follow
along and we'll make a more general utility.&lt;/p&gt;
&lt;p&gt;If we think abstractly about paginating a web …&lt;/p&gt;</summary><content type="html">&lt;p&gt;On the &lt;a href="http://www.playframework.org/"&gt;Play! Framework&lt;/a&gt; mailing lists I've seen reference to the
sample &lt;a href="https://github.com/playframework/Play20/tree/master/samples/scala/computer-database"&gt;Computer Database&lt;/a&gt; as a canonical example of paginating data.
It's a good start but it's pretty specific to one data type. Follow
along and we'll make a more general utility.&lt;/p&gt;
&lt;p&gt;If we think abstractly about paginating a web application using
&lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"&gt;Model-View-Controller&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;M&lt;/strong&gt; - A way to filter the dataset&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;V&lt;/strong&gt; - A UI element for displaying the pagination and linking to
    others&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C&lt;/strong&gt; - A way to get Request parameters that define the page, the
    length of the page, and other filters&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="A screenshot of what we will be creating" src="http://kev009.com/wp/assets/2012/12/pagination.png" title="Pagination example"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A screen shot of what we will be creating&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Model&lt;/h2&gt;
&lt;p&gt;The specifics here depend upon how you are retrieving the data to
display.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://squeryl.org/"&gt;Squeryl&lt;/a&gt; provides a &lt;a href="http://squeryl.org/pagination.html"&gt;page(offset, pageLength)&lt;/a&gt; method that uses the
DB's LIMIT and OFFSET. I use this to create a subset collection that I
pass to view for iterating over. I also have a helper method to get a
total data count.&lt;/p&gt;
&lt;h2&gt;Controller&lt;/h2&gt;
&lt;p&gt;Play's route and reverse routes take care of passing the page number
around:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;GET&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="n"&gt;controllers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Notifications&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;GET&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;controllers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Notifications&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;help&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;NOTE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MUST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;COME&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AFTER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;/[&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;due&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;priorities&lt;/span&gt;
&lt;span class="k"&gt;GET&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;controllers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Notifications&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;We get pretty URLs like /list /list/2 list/3 etc. Note that
@routes.Notification.query(1) will result in /list, which is a nice
touch. If /list/1 is your preference you may consolidate to one route.
Also note that route priority (order) may affect things depending on the
URL parameters you are using.&lt;/p&gt;
&lt;p&gt;In the application controller, you need to pass an offset and pageLength
to the Model. This returns a collection of a page worth of items.&lt;/p&gt;
&lt;p&gt;Then, pass it all through to the view:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nx"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nx"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;withUser&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;implicit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pageLength&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;notifications&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getNotifiactionsByUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;pageLength&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pageLength&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getCountByUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;views&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notifications&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;notifications&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pageLength&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;View&lt;/h2&gt;
&lt;p&gt;In our list view, we pass some variables through and iterate over the
filtered collection of data to display. Then, we call a helper which
creates the pagination UI element. The biggest thing to note here is
the use of Scala's first class functions, specifically &lt;a href="http://en.wikipedia.org/wiki/Partial_application"&gt;partial
application&lt;/a&gt;, to delegate the page parameter to the paginate helper:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;@(notifications:List[models.Notification],&lt;span class="w"&gt; &lt;/span&gt;count:Int,&lt;span class="w"&gt; &lt;/span&gt;page:Int,&lt;span class="w"&gt; &lt;/span&gt;pageLength:Int)
&lt;span class="w"&gt;  &lt;/span&gt;@for(n&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;notifications)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;li&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;@n&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;}
&lt;span class="w"&gt;  &lt;/span&gt;@includes.paginate(page,&lt;span class="w"&gt; &lt;/span&gt;pageLength,&lt;span class="w"&gt; &lt;/span&gt;count,&lt;span class="w"&gt; &lt;/span&gt;routes.Notification.index(_))
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;View helper&lt;/h2&gt;
&lt;p&gt;"I am sorry I have had to write you such a long letter, but I did not
have time to write you a short one" -- Blaise Pascal&lt;/p&gt;
&lt;p&gt;This template code is pretty awful. I may refine it on the gist if time
permits. Please comment if you have suggestions!&lt;/p&gt;
&lt;p&gt;We take the page we're on, the items per page, the total query count,
and the partial route and build a UI wiget. The lowbound and highbound
helpers functions define how many pages to link.&lt;/p&gt;
&lt;p&gt;
&lt;script src="https://gist.github.com/4213593.js"&gt; &lt;/script&gt;
&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I'm very interested in your take, as well as ways to clean this up!
I'll update the post with good suggestions.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="java"></category><category term="Play Framework"></category><category term="Programming"></category><category term="scala"></category><category term="pagination"></category><category term="play"></category><category term="playframework"></category><category term="reusable"></category></entry><entry><title>Playing with Play Framework and Plivo</title><link href="http://kev009.com/wp/2012/12/playing-with-play-framework-and-plivo/" rel="alternate"></link><published>2012-12-01T11:03:00-07:00</published><updated>2012-12-01T11:03:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2012-12-01:/wp/2012/12/playing-with-play-framework-and-plivo/</id><summary type="html">&lt;p&gt;One of the interesting things about &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; is how well it composes.
This is the primary "Scalable" in Scalable Language. I'm writing this
up to share my experience and track my progression in a partially
contrived but interesting example.&lt;/p&gt;
&lt;p&gt;So I'm playing around with &lt;a href="https://www.plivo.com/"&gt;Plivo&lt;/a&gt;, which is a telecoms IaaS …&lt;/p&gt;</summary><content type="html">&lt;p&gt;One of the interesting things about &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; is how well it composes.
This is the primary "Scalable" in Scalable Language. I'm writing this
up to share my experience and track my progression in a partially
contrived but interesting example.&lt;/p&gt;
&lt;p&gt;So I'm playing around with &lt;a href="https://www.plivo.com/"&gt;Plivo&lt;/a&gt;, which is a telecoms IaaS web
service (similar to Twilio), and the &lt;a href="http://www.playframework.org/"&gt;Play! Framework&lt;/a&gt;. It uses a
&lt;a href="http://en.wikipedia.org/wiki/REST"&gt;RESTful&lt;/a&gt; API, and we want to make sure the API callbacks are
authentic. &lt;a href="http://en.wikipedia.org/wiki/Hash-based_message_authentication_code"&gt;HMAC&lt;/a&gt; as usual.&lt;/p&gt;
&lt;p&gt;
&lt;script src="https://gist.github.com/4185782.js"&gt; &lt;/script&gt;
&lt;/p&gt;
&lt;h2&gt;This is your brain on Functional Programming&lt;/h2&gt;
&lt;p&gt;Scala makes it very easy to break up your problems into functions.
Rather than loops with counters, mutable variables, and such, Scala
encourages (but doesn't mandate) a functional style with immutable
variables, first class functions, nested functions, etc. It generally
leads to code that is both more concise and contains less bugs.&lt;/p&gt;
&lt;h3&gt;Nested functions&lt;/h3&gt;
&lt;p&gt;Play! provides an HMAC implementation (&lt;em&gt;play.api.libs.Crypto.sign&lt;/em&gt;), but
it converts the signature into a Hex ASCII string. Plivo Base64 encodes
the HMAC byte (non-ASCII) signature. We have a few options to get the
keys into equivalent formats. I chose to make some nested helper
functions and encode my signature in their format. Since the functions
are unlikely to be used elsewhere, the nesting keeps the namespace clean
and locally reenforces that we have a specific format.&lt;/p&gt;
&lt;h3&gt;&lt;em&gt;for&lt;/em&gt; comprehension (syntactic sugar around map)&lt;/h3&gt;
&lt;p&gt;One of the interesting things here is the use of Scala's &lt;em&gt;for&lt;/em&gt;
comprehension as a control structure, a technique I learned on the Play!
mailing list. In the body, we have two variables that return &lt;em&gt;Option&lt;/em&gt;
type. If both are defined, the &lt;em&gt;yield&lt;/em&gt; block fires with the params
defined directly. Otherwise, the &lt;em&gt;getOrElse&lt;/em&gt; block fires and handles
errors.&lt;/p&gt;
&lt;h3&gt;List fun[ctions]&lt;/h3&gt;
&lt;p&gt;Play! returns the url-encoded POST data as a &lt;em&gt;Map[String, Seq[String]]&lt;/em&gt;
(because forms keys can have multiple values, i.e. check boxes).
Plivo's signature is based on the full URL of the callback, and all the
POST parameters, sorted by key, concatenated together.&lt;/p&gt;
&lt;p&gt;I convert the parameter &lt;em&gt;Map&lt;/em&gt; into a &lt;em&gt;List[String, Seq[String]]&lt;/em&gt; (List
of Tuples) because Maps don't have a sort operation. We'll soon be
flattening it anyway, so the List is a pretty good structure (aside..
another approach superior in more general circumstances would be to
convert the Map to a TreeMap which is always sorted)&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;_&lt;/strong&gt; is an interesting character in Scala and is used in a few
different ways. &lt;a href="http://www.amazon.com/Programming-Scala-Comprehensive-Step-Step/dp/0981531644"&gt;Programming in Scala&lt;/a&gt; calls it, in passing, "filling
in the blank" which generally holds true. Ultimately, we are "filling
in" the &lt;em&gt;sortBy&lt;/em&gt; with the key of our List. Finally, we flatten the
list, providing a flatten with a means of combining the key and the
&lt;em&gt;Seq&lt;/em&gt; of values. &lt;em&gt;mkString&lt;/em&gt; works perfectly here since it just
concatenates everything. &lt;strong&gt;x =&amp;gt;&lt;/strong&gt; indicates &lt;em&gt;x&lt;/em&gt; as a placeholder for
each of the List items and is analogous to &lt;strong&gt;_&lt;/strong&gt;, which won't work here
since we need to reference it twice.&lt;/p&gt;
&lt;h2&gt;OO Design tradeoffs&lt;/h2&gt;
&lt;p&gt;So I'm using &lt;a href="http://www.playframework.org/documentation/2.0/ScalaActionsComposition"&gt;Action Composition&lt;/a&gt; to take a Request, validate the HMAC
key, and first class functions to pass on Response responsibility or
otherwise respond with BadRequest if there is a problem with the
signature or params.&lt;/p&gt;
&lt;p&gt;A more Java-influenced design might throw Exceptions on error and in the
delegated chain of command. This has the benefit of being more
abstract.. if this function isn't called in response to an HTTP request,
the invoking Exception handler could do something other than responding
BadRequest as we do here. The cool thing about Scala is that I could
just as well do that, but I make a more opinionated choice since I know
how my class will be used in all cases.&lt;/p&gt;
&lt;p&gt;Scala keeps OO, but turns the use on it's head and makes it always
possible to ask: "gee, does this REALLY need to be abstracted?" More
often than not, a more elegant and concise answer is to reach in the
functional bag of tricks.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Play Framework"></category><category term="Programming"></category><category term="scala"></category><category term="Plivo"></category></entry><entry><title>Zabbix 1.8.9 Debian Squeeze Backport</title><link href="http://kev009.com/wp/2012/01/zabbix-1-8-9-debian-squeeze/" rel="alternate"></link><published>2012-01-18T20:18:00-07:00</published><updated>2012-01-18T20:18:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2012-01-18:/wp/2012/01/zabbix-1-8-9-debian-squeeze/</id><summary type="html">&lt;p&gt;I was beginning to get hit by many bad things in the Debian Squeeze
&lt;a href="http://www.zabbix.com/"&gt;zabbix&lt;/a&gt; 1.8.2 package. If you aren't aware, zabbix is a nifty data
center monitoring system and is only slightly annoying compared to most
other systems which are very annoying to set up and use …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I was beginning to get hit by many bad things in the Debian Squeeze
&lt;a href="http://www.zabbix.com/"&gt;zabbix&lt;/a&gt; 1.8.2 package. If you aren't aware, zabbix is a nifty data
center monitoring system and is only slightly annoying compared to most
other systems which are very annoying to set up and use.&lt;/p&gt;
&lt;p&gt;Most notably, this package will safely run on PostgreSQL 9.1 from
&lt;a href="http://packages.debian.org/squeeze-backports/"&gt;squeeze-backports&lt;/a&gt; and contains many performance improvements. It
should be a drop in upgrade for the distro package.&lt;/p&gt;
&lt;p&gt;Get it here:&lt;br&gt;
&lt;a href="http://kev009.com/files/zabbix-1.8.9-squeeze.tar.gz"&gt;http://kev009.com/files/zabbix-1.8.9-squeeze.tar.gz&lt;/a&gt;&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Linux"></category><category term="backports"></category><category term="debian"></category><category term="postgresql"></category><category term="squeeze"></category><category term="zabbix"></category></entry><entry><title>Configuration Management Software Sucks</title><link href="http://kev009.com/wp/2012/01/configuration-management-software-sucks/" rel="alternate"></link><published>2012-01-10T06:14:00-07:00</published><updated>2012-01-10T06:14:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2012-01-10:/wp/2012/01/configuration-management-software-sucks/</id><summary type="html">&lt;p&gt;&lt;strong&gt;Yes. Configuration Management Software Sucks. Horribly.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The main problem is that &lt;strong&gt;n-th
order tweakability&lt;/strong&gt; is preferred over
&lt;strong&gt;convention&lt;/strong&gt; It's just
stupid. There are a core set of things that just about everybody needs
to do. Those should be dead simple. Ready to uncomment and run. The
set operating systems used …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Yes. Configuration Management Software Sucks. Horribly.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The main problem is that &lt;strong&gt;n-th
order tweakability&lt;/strong&gt; is preferred over
&lt;strong&gt;convention&lt;/strong&gt; It's just
stupid. There are a core set of things that just about everybody needs
to do. Those should be dead simple. Ready to uncomment and run. The
set operating systems used in the enterprise is fairly small: RHEL5,
RHEL6, Debian 6, Ubuntu LTS. A configuration system should be
opinionated and have complete out of the box support for these
platforms. Simple rulesets for the basics that nearly everyone uses
should be ready to go.. package management, process initialization,
file management, ssh, sudo, DNS, Apache, PAM, PostgreSQL, MySQL,
OpenLDAP, etc. Keep it simple. Keep it simple. Keep it simple.
Resist all urges to add complexity.&lt;/p&gt;
&lt;p&gt;That's not the case.&lt;/p&gt;
&lt;p&gt;You'd think after 30 years of Unix, BSD and Linux network deployments
this would be pretty well trodden ground. Wrong. It's a complete
crapshoot and everybody does things differently. Pick your poisons and
reinvent the stack ad infinitum.&lt;/p&gt;
&lt;p&gt;This is one of the few areas I'm green with envy of the Microsoft side
of the fence. Between Active Directory, Group Policy, and maybe a
third party tool or two for cloning and installs and such, Microsoft
environments can easily be set up and managed well by complete morons
(and often are).&lt;/p&gt;
&lt;h2&gt;Puppet&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://puppetlabs.com/"&gt;Puppet&lt;/a&gt; seems to have potential. Of course, out of the box you're
pissing in the wind with a blank slate and most books and sites will
have you following tutorials to rewrite rulesets that thousands of other
people before you have similarly cobbled poorly together. As a Ruby
project, it unsurprisingly has vocal hipster fanboys. Unfortunately,
they forgot to parrot their DRY principle to each other.&lt;/p&gt;
&lt;p&gt;It centers around a domain specific convention which isn't so bad.. but
in no time flat you'll start seeing full blown Ruby programs
intermingled. Ugh. But it's not so bad if you stick to the basics.&lt;/p&gt;
&lt;p&gt;If you look around you can find reasonably complete module sets, i.e.
&lt;a href="http://www.example42.com/"&gt;http://www.example42.com/&lt;/a&gt;. It's not all gravy as these are heavily
interdependent and kludgy. If you want a clean, simple solution you're
back to rolling your own with some healthy copy and paste.&lt;/p&gt;
&lt;p&gt;Since it's a Ruby project, aside from the annoying fanboys, you're also
going to run into scalability problems past a few hundred nodes. There
are mitigation strategies, but it's a joke compared to something like
Cfengine.&lt;/p&gt;
&lt;p&gt;Due to hype, you'll find decent versions in the Debian and Ubuntu
backports repos. RHEL 5 and 6 are covered by a Puppet Labs repo. 2.6
and 2.7 are therefore readily available and as long as your master is
running the later version you shouldn't have interop problems.&lt;/p&gt;
&lt;p&gt;All things considered, Puppet is probably the best choice at the
moment. It sucks, but it's got a lot of momentum behind it. There are
mountains of docs, books, and tutorials to get you going and nothing is
too foreign or hard to grasp.&lt;/p&gt;
&lt;h2&gt;Cfengine 3&lt;/h2&gt;
&lt;p&gt;I really want to like &lt;a href="http://cfengine.com/"&gt;Cfengine&lt;/a&gt;. It's incredibly light weight and
hardcore ROFLscale. It's got serious theory behind it and older
versions have been used in massive deployments. But it's not just a
blank slate. It's even lower level and incomplete compared to the
others.&lt;/p&gt;
&lt;p&gt;You really need to add a promise library to get features that should be
included by default. These are all stagnate though, and still leave
much to be desired.&lt;/p&gt;
&lt;p&gt;There's a company behind it doing something or another, but the open
source version is raw. If you have more than one Linux distribution,
I'll pretty much guarantee the packages are incompatible.&lt;/p&gt;
&lt;p&gt;The repo choices aren't great either. Uncle Bob's PPA on Ubuntu, out of
luck on Debian. RPMs in the EL repos look out of date. You can of
course get source and binaries from the Cfengine company, but it's not
my preferred way to install things and makes bootstrapping harder than
it needs to be.&lt;/p&gt;
&lt;p&gt;I haven't tried the latest release, but quickly gave this one up when I
found severe incompatibilities between point releases. Madness. You'd
think people inventing something like promise theory could handle
something as simple as version stability.&lt;/p&gt;
&lt;p&gt;Ping me when a corporation backs Cfengine with a good promise library,
some standard tasks, and repos for the common operating systems.&lt;/p&gt;
&lt;h2&gt;Bcfg2&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://trac.mcs.anl.gov/projects/bcfg2"&gt;Bcfg2&lt;/a&gt; made the most sense to me out of the box. XML is yucky and
out of fashion these days, but Bcfg2 manages to use it acceptably.
Consequently, most things are declarative, easily read, and overall easy
to mimic. Beyond that, you can tap into some Python template and
generator stuff. But yes, these guys finally didn't put n-th order
above the common cases! Installing packages and ensuring services are
on is a snap.&lt;/p&gt;
&lt;p&gt;They've got their own repos for many distros so installation isn't bad.&lt;/p&gt;
&lt;p&gt;The client and server are Python so you'll have similar scaling problems
to Puppet in large environments.&lt;/p&gt;
&lt;p&gt;My biggest grievance with Bcfg2 is that the server needs intimate
knowledge of each operating system version's package repos. You'll
fumble around writing a good bit of XML definitions for this in a
heterogeneous environment.&lt;/p&gt;
&lt;p&gt;The main thing Bcfg2 is lacking right now is community momentum.
Including repo definitions by default and some more doc work.. I think
this would be a great system for small to medium deployments.&lt;/p&gt;
&lt;h2&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;The lot of this stuff is really terrible. End to end system management
under *nix is a major pain point. On top of this, you'll need a fairly
free form monitoring framework (these also all suck) and directory
service. Mix and match an impossible array of projects and eventually
you'll find your own recipe that sort of works. Except everyone does it
differently so you'll constantly be learning and redoing the same things
over and over anyway.&lt;/p&gt;
&lt;p&gt;It's not fun. What we need is end to end integrated thinking. This
area is still ripe for picking. Oh RedHat, where art thou?&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Linux"></category><category term="Programming"></category><category term="python"></category><category term="Redhat"></category><category term="bcfg2"></category><category term="Cfengine"></category><category term="Puppet"></category></entry><entry><title>GUNNAR Optiks Computer Glasses Review</title><link href="http://kev009.com/wp/2011/07/gunnar-optiks-computer-glasses-review/" rel="alternate"></link><published>2011-07-19T23:00:00-07:00</published><updated>2011-07-19T23:00:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2011-07-19:/wp/2011/07/gunnar-optiks-computer-glasses-review/</id><summary type="html">&lt;h3&gt;Intro&lt;/h3&gt;
&lt;p&gt;As one might expect from a computing professional, I spend a lot of time
in front of LCD screens. This is coupled to the modern assault of
Compact Florescent Lights (CFL). These are both heavy on the blue
spectrum. Depending on what you read and believe [1], this can …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;Intro&lt;/h3&gt;
&lt;p&gt;As one might expect from a computing professional, I spend a lot of time
in front of LCD screens. This is coupled to the modern assault of
Compact Florescent Lights (CFL). These are both heavy on the blue
spectrum. Depending on what you read and believe [1], this can have a
number of health implications.&lt;/p&gt;
&lt;p&gt;For the past few weeks, I've been swapping yellow lenses into my sport
sunglasses while at the computer. I've been pleased with the result and
noted an easier time going to bed at night and subjectively my eyes feel
less tired.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2011/07/img095.jpg"&gt;&lt;img alt="gunnar optiks" src="http://kev009.com/wp/assets/2011/07/img095-300x225.jpg" title="GUNNAR Rocket Onyx"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Swapping the lenses so often became a bit tedious. I had to
clean them every use. I began looking for a dedicated pair of glasses.
&lt;a href="http://www.gunnars.com/"&gt;GUNNAR Optiks&lt;/a&gt; has a decent marketing machine that swooned me into
purchasing their purpose-built product. I was eager to try them out and
see if there were any benefits to the specialty computer glasses.&lt;/p&gt;
&lt;h3&gt;Pros&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Amber tint reduces blue shift as expected.&lt;/li&gt;
&lt;li&gt;Look decent. I would comfortably wear these at my desk in an office
    environment. The GUNNAR lens coating gives off a bluish reflection
    that tones down the impact of the yellow lens to onlookers.&lt;/li&gt;
&lt;li&gt;Comfortable frame. No problems here, I could wear the frames all
    day.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cons&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Magnification. Deal breaker. I wasn't expecting a product like
    this to alter my eye's focus, especially without ample warning. I
    wasn't sure about the magnification until reading another review
    [2].&lt;/li&gt;
&lt;li&gt;Quality. Chinese made, feel flimsy, and other reviews say the
    finish can flake off.&lt;/li&gt;
&lt;li&gt;Cost. For the relative quality, these are retailing for 2-3x the
    price they should be.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Conclusion and Verdict&lt;/h3&gt;
&lt;p&gt;I'm not afraid to spend money a decent product, even if a good chunk of
that is marketing and brand name. However, the GUNNARs fall short in
both quality and execution and I would advise looking elsewhere.&lt;/p&gt;
&lt;p&gt;The magnification is a deal breaker for me. I don't need it, I'm not
used to it, and it gave me a headache. I find it borderline negligent
[3] to not mention this beyond fine print about "diopters" (note: I'm
not an Rx wearer; this wasn't a familiar term) on the bottom of the
packaging. It made taking eyes off the monitor and looking around
awkward -- a tried and true ergonomic tip.&lt;/p&gt;
&lt;p&gt;I'm going to stop by an optometrist and see if they can do a neutral
real glass lens (superior optics and scratch resistance) with a slight
yellow or orange tint and anti-reflective coating for a reasonable
price. Alternatively, sport, safety, or shooting glasses from a
reputable vendor can be cheaper than the GUNNARs and do a fine job.
Prescription glasses wearers should consult their optometrist but I saw
passing discussion that the anti-reflective coatings are great and of
course they have the expertise to adjust the power and focal length
directly to your needs.&lt;/p&gt;
&lt;p&gt;The GUNNARs are getting returned.&lt;/p&gt;
&lt;h3&gt;Further Readings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[1] &lt;a href="http://texyt.com/bright+blue+leds+annoyance+health+risks"&gt;Article and discussion on blue LEDs and light effects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.gunnars.com/"&gt;GUNNAR Optiks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2] &lt;a href="http://pogue.blogs.nytimes.com/2008/10/09/high-performance-eyewear-guess-again/"&gt;New York Times review and discussion of these glasses (pretty funny!)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3] &lt;a href="http://www.visionclinics.com/faq.html#reading"&gt;Can drugstore-reading glasses be harmful to my eyes?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/3M-Metaliks-Sport-Safety-Eyewear/dp/B000NPALQU"&gt;Cheap pair of 3M amber lens glasses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"></category><category term="Computing"></category><category term="product review"></category><category term="Computer Glasses"></category><category term="GUNNAR"></category><category term="GUNNAR Optiks"></category><category term="review"></category></entry><entry><title>Something good about every language I used in 2010</title><link href="http://kev009.com/wp/2011/01/something-good-about-every-language-i-used-in-2010/" rel="alternate"></link><published>2011-01-01T03:38:00-07:00</published><updated>2011-01-01T03:38:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2011-01-01:/wp/2011/01/something-good-about-every-language-i-used-in-2010/</id><summary type="html">&lt;p&gt;Inspired by &lt;a href="http://www.rfc1149.net/blog/2010/12/09/something-nice-about-every-language-i-use/"&gt;Samuel Tardieu's post&lt;/a&gt;, I want to do a year in review of
all the languages I have used this year. A lot of times we prima donna
programmers complain about anything and everything. I really enjoyed the
positive outlook of Samuel's post and want to take note of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Inspired by &lt;a href="http://www.rfc1149.net/blog/2010/12/09/something-nice-about-every-language-i-use/"&gt;Samuel Tardieu's post&lt;/a&gt;, I want to do a year in review of
all the languages I have used this year. A lot of times we prima donna
programmers complain about anything and everything. I really enjoyed the
positive outlook of Samuel's post and want to take note of my
experiences with similar attitude.&lt;/p&gt;
&lt;h3&gt;Bread &amp;amp; Butter&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Python - My language of choice for the year. Whether prototyping,
    experimenting, developing a Facebook application, maintaining a test
    framework I wrote for my workplace, or implementing cryptographic
    algorithms for a security course, Python continued to serve me
    well. Between a copy of "Python Essential Reference" and PyPI, I
    feel there are very few problems beyond my means thanks to the power
    of this beautiful language and its surrounding community.&lt;/li&gt;
&lt;li&gt;Java - As a student, I pounded out many a line of Java throughout
    the wee hours of the morning in my capstone classes. Java seems to
    be the New Age language of academia and I can speak it universally
    to my classmates and professors as a lingua franca. I've noticed
    that my Java programs tend to structure themselves well without much
    effort thanks to the strong object influence forced by Java and
    expansive standard library and Collections classes. Also used at
    two collegiate programming competitions which is an entirely
    different experience than normal software development where the
    large standard library again came in handy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Good Progress&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;C - I launched a &lt;a href="https://github.com/kev009/craftd"&gt;good sized networking project&lt;/a&gt; in C as my first
    big project in the language and contributed a number of portability
    fixes to the &lt;a href="http://monkey.org/~provos/libevent/"&gt;libevent&lt;/a&gt; project. Fast to compile, fast at
    runtime, and full low level control, C is a great language for Unix
    Systems Programming. I greatly expanded my knowledge of the POSIX
    interfaces this year and really enjoy programming at this level.
    I've noticed that some principles from other higher order languages
    have rubbed off on my C style; namely, data hiding and well
    formed/adaptable interfaces (see the post right before this one).&lt;/li&gt;
&lt;li&gt;C++ - Been putting this one off because of all the FUD and
    intimidation at the sheer size of it. C++ is pretty much the Latin
    of our field and is used in everything from safety-critical Jet
    aircraft systems, to GUIs, to games, to JITs, to cutting edge
    research. As some of the pundits say, C++ is the language for
    "Demanding Applications". If you consider Java as the Flight
    Engineer of a large aircraft, C++ is definitely in the Pilot seat.
    You have full control and high visibility of what is going on, but
    if you aren't careful you can crash and burn. I've probably
    progressed to the advanced beginner stage where I can use it as a
    better C but haven't endured the trials and tribulations of an
    expert in the art of C++, nor read important references like Scott
    Meyers' "Effective C++" series. I really like the power and
    efficiency of the STL and plan on knowing enough C++ to use it when
    called upon.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Breaking New Ground&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;VHDL - After a required Electrical Engineering course, I was exposed
    to the entirely different paradigm of programmable hardware
    (FPGAs). This was an eye opening experience. Fundamentally,
    digital design is concurrent. There may be valuable lessons here
    for both academic and professional Computer Science and I need to
    explore more here. In 2011, I'd like to buy my own FPGA development
    board and work through the design of a simple CPU to gain further
    appreciation of hardware and VHDL or Verilog.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Back Burner&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PHP - The first language I seriously learned and used some 12 years
    ago (I dabbled in Perl before that at the ripe age of 8, and
    probably Lego Logo a year before that :-P ). I've been keeping an
    eye on it and it seems some of the Framework movement that stole a
    lot of developers away to other languages has sprouted mature
    analogues in PHP land. No longer just C for the web, PHP 5.3
    continues the lineage of the 5-series as a serious object-oriented
    language for web development that is basically universally available
    and dead simple to scale. The extent of my PHP coding in 2010 was
    limited to maintaining some programs I'd written in years past
    (aside from merely installing/using PHP products like this blog).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;On to 2011&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;D - D2 has me really excited. For some intents and purposes, it
    seems like an evolution of C++ with a healthy removal of backward
    compatibility. Embracing fast compile times, integrating
    concurrency and message passing, allowing easy interfacing to C
    libraries, and more mean this is a language capable of "Demanding
    Applications". Perhaps most intriguing is the use of the language
    proper for metaprogramming and compile-time programs. I have Andrei
    Alexandrescu's book on my shelf and have thumbed through it a few
    times. The fact that he is involved speak volumes of D's potential
    and his book looks superbly written. 2011 means working my way
    through the book and working on at least one sizable project in D.&lt;/li&gt;
&lt;li&gt;Erlang - Erlang has been on my radar for a couple years now. The
    fact that the OTP has roots in the demanding and critical realm of
    telecom means this is a serious language and seems to deliver
    interesting take on concurrency. Erlang has already proven itself
    effective for XMPP servers and Message Queues. This may yet be one
    of the best languages around for scalable networking applications
    and I'd like to get some hands on experience with it in 2011.&lt;/li&gt;
&lt;li&gt;Haskell - I don't know much about Haskell other than playing around
    with TryHaskell. What I do know is that Haskell has a fairly mature
    Software Transactional Memory and that alone interests me. I've
    also heard the optimizing compiler is pretty good. Through
    investigation is due in the second half of the year.&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"></category><category term="c"></category><category term="Computing"></category><category term="java"></category><category term="Linux"></category><category term="Programming"></category><category term="python"></category><category term="Computer Science"></category><category term="D"></category><category term="Erlang"></category><category term="Php"></category><category term="Verilog"></category><category term="VHDL"></category></entry><entry><title>No Nonsense Logging in C (and C++)</title><link href="http://kev009.com/wp/2010/12/no-nonsense-logging-in-c-and-cpp/" rel="alternate"></link><published>2010-12-09T13:08:00-07:00</published><updated>2010-12-09T13:08:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2010-12-09:/wp/2010/12/no-nonsense-logging-in-c-and-cpp/</id><summary type="html">&lt;p&gt;A lot of times people do zany things and try and reinvent wheels when it
comes to programming. Sometimes this is good: when learning, when trying
to improve state of the art, or when trying to simplify when only
Two-Ton solutions are available.&lt;/p&gt;
&lt;p&gt;For a current daemon project I need …&lt;/p&gt;</summary><content type="html">&lt;p&gt;A lot of times people do zany things and try and reinvent wheels when it
comes to programming. Sometimes this is good: when learning, when trying
to improve state of the art, or when trying to simplify when only
Two-Ton solutions are available.&lt;/p&gt;
&lt;p&gt;For a current daemon project I need good, fast, thread-safe logging.
&lt;strong&gt;syslog&lt;/strong&gt; fits the bill to a tee and using anything else would be
downright foolish -- akin to implementing my own relational database.
There's one caveat. For development and debugging, I'd like to not
fork/daemonize and instead output messages to &lt;em&gt;stdout&lt;/em&gt;. Some
implementations of &lt;em&gt;syslog()&lt;/em&gt; define &lt;em&gt;LOG_PERROR&lt;/em&gt;, but this is not in
&lt;a href="http://www.opengroup.org/onlinepubs/9699919799/"&gt;POSIX.1-2008&lt;/a&gt; and it also logs to both stderr and wherever the syslog
sink is set. That may not be desired.&lt;/p&gt;
&lt;p&gt;So, the goals here are: continue to use &lt;em&gt;syslog()&lt;/em&gt; for the normal case
as it is awesome, but allow console output in a portable way. Non-goals
were using something asinine like a reimplementation of Log4Bloat or
other large attempt at thread-safe logging from scratch.&lt;/p&gt;
&lt;p&gt;Using function pointers, we can get a close approximation of an
Interface or Virtual Function of Object Oriented languages:  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;LOG_setmask&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;These are the same parameters that POSIX &lt;em&gt;syslog()&lt;/em&gt; and &lt;em&gt;setlogmask()&lt;/em&gt;
take. Now, at runtime, if we desire to use the the "real" syslog:  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;syslog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="n"&gt;LOG_setmask&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;setlogmask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If we wish to instead log to console, a little more work is in order.
Essentially, we need to define a console logging function "inheriting"
the &lt;em&gt;syslog()&lt;/em&gt; "method signature" (or arguments for non-OO types).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cm"&gt;/* In a header somewhere */&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;log_console&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;log_console_setlogmask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And finally, a basic console output format:  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Private storage for the current mask */&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;log_consolemask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;log_console_setlogmask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oldmask&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;log_consolemask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oldmask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cm"&gt;/* POSIX definition for 0 mask */&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;log_consolemask&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oldmask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;log_console&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;...)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kt"&gt;va_list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;arglist&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;va_start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arglist&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="cm"&gt;/* Return on MASKed log priorities */&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LOG_MASK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;log_consolemask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;priority&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;LOG_ALERT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ALERT: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;LOG_CRIT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;CRIT: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;LOG_DEBUG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;DEBUG: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;LOG_EMERG&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;EMERG: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;LOG_ERR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;ERR: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;LOG_INFO&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;INFO: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;LOG_NOTICE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;NOTICE: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;LOG_WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;WARNING: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;UNKNOWN: &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;%s&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;loglevel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;vprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;arglist&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;va_end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arglist&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Now, if console output is what you desire at runtime you could use
something like this:  &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;log_console&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="n"&gt;LOG_setmask&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;log_console_setlogmask&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="n"&gt;LOG_setmask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LOG_MASK&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LOG_DEBUG&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="n"&gt;LOG&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LOG_INFO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Program Started!&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;In about 60 lines of code we got the desired functionality by slightly
extending rather than reinventing things or pulling in a large external
dependency. If C++ is your cup of tea, it is left as a trivial
reimplementation where you can store the console logmask as a private
class variable.&lt;/p&gt;
&lt;p&gt;Some notes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You should still call openlog() at the beginning of your program in
    case syslog() is selected at runtime. Likewise, you should still
    call closelog() at exit.&lt;/li&gt;
&lt;li&gt;It's left as a trivial exercise to the reader to define another
    function to do logging to both &lt;em&gt;stdout&lt;/em&gt; and, using &lt;em&gt;vsyslog()&lt;/em&gt;, the
    syslog. This implements &lt;em&gt;LOG_PERROR&lt;/em&gt; in a portable way.&lt;/li&gt;
&lt;li&gt;I chose stdout because it is line buffered by default. If you use
    stderr, you should combine the loglevel, format, and newline with
    &lt;em&gt;sprintf&lt;/em&gt; before calling &lt;em&gt;vprintf&lt;/em&gt; on the variable arglist to
    prevent jumbled messages.&lt;/li&gt;
&lt;li&gt;Of course, make sure you are cognizant that the format string is
    passed in and do not allow any user-supplied format strings as
    usual.&lt;/li&gt;
&lt;/ol&gt;</content><category term="misc"></category><category term="c"></category><category term="Computing"></category><category term="Linux"></category><category term="Programming"></category><category term="logging"></category><category term="Object Oriented Programming"></category><category term="OOP"></category><category term="syslog"></category></entry><entry><title>Why VIM is not my favorite editor</title><link href="http://kev009.com/wp/2010/11/why-vim-is-not-my-favorite-editor/" rel="alternate"></link><published>2010-11-21T14:15:00-07:00</published><updated>2010-11-21T14:15:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2010-11-21:/wp/2010/11/why-vim-is-not-my-favorite-editor/</id><summary type="html">&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt;&lt;br&gt;
clang_complete is what the people want and what the doctor ordered:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Rip-Rip/clang_complete"&gt;https://github.com/Rip-Rip/clang_complete&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;let g:clang_snippets=1
let g:clang_conceal_snippets=1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;C^X, C^U, profit. Another awesome development for LLVM!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2010/11/vim-clang_complete.png"&gt;&lt;img alt="VIM clang_complete" src="http://kev009.com/wp/assets/2010/11/vim-clang_complete-300x209.png" title="vim-clang_complete"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;It sucks for C and C++ development.&lt;/p&gt;
&lt;p&gt;Popup code completion ("IntelliSense") is a godsend. Instead …&lt;/p&gt;</summary><content type="html">&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt;&lt;br&gt;
clang_complete is what the people want and what the doctor ordered:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/Rip-Rip/clang_complete"&gt;https://github.com/Rip-Rip/clang_complete&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;let g:clang_snippets=1
let g:clang_conceal_snippets=1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;C^X, C^U, profit. Another awesome development for LLVM!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2010/11/vim-clang_complete.png"&gt;&lt;img alt="VIM clang_complete" src="http://kev009.com/wp/assets/2010/11/vim-clang_complete-300x209.png" title="vim-clang_complete"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;It sucks for C and C++ development.&lt;/p&gt;
&lt;p&gt;Popup code completion ("IntelliSense") is a godsend. Instead of
flipping back and forth between an API reference and your code, a
non-invasive popup of available functions, method signature, struct
members, instance variables, etc is right at your fingertips. It's
especially useful when it contains the declaration's
comment/Doxygen/JavaDoc.&lt;/p&gt;
&lt;p&gt;Building a 'ctags' file of my system libraries takes ten minutes and
weighs 1.5GB for VIM's integrated omnicomplete. Any time the headers
are updated, it has to be manually rebuilt. The project's tags need to
be rebuilt per change. Unbearable.&lt;/p&gt;
&lt;p&gt;I also can't get inline function/method signatures or automatic struct
member completion without a three year old script, &lt;a href="http://www.vim.org/scripts/script.php?script_id=1520"&gt;omnicppcomplete&lt;/a&gt;.
Yes, this is true for plain old C too.&lt;/p&gt;
&lt;p&gt;The one editor I've found that provides the level of introspection I
expect yet otherwise stays out of the way is &lt;a href="http://www.kdevelop.org/"&gt;KDevelop&lt;/a&gt; 4.1. It
basically takes the Kate text editor, with awesome syntax highlighting
and standard editing features, and adds some of the best auto-completion
I've seen for C or C++. It's fast too, and doesn't require a ridiculous
manual scan or gigabyte symbol database. It just works - automatically.&lt;/p&gt;
&lt;p&gt;Well, editing from the console is pretty convenient, especially on slow
remote SSH connections. Lazyweb, am I missing something that VIM gurus
know and I don't? Does emacs provide the level of completion I'm
looking for on the console out of the box?&lt;/p&gt;
&lt;p&gt;I know the &lt;a href="http://www.llvm.org/"&gt;llvm&lt;/a&gt; devs have some code brewing that uses llvm for
syntax completion. Maybe there's light at the end of the tunnel.&lt;/p&gt;
&lt;p&gt;My .vimrc looks like this if anyone has any suggestions: &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;filetype&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;
&lt;span class="nx"&gt;filetype&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;plugin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;
&lt;span class="nx"&gt;filetype&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;indent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;
&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nocp&lt;/span&gt;
&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;expandtab&lt;/span&gt;
&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;smarttab&lt;/span&gt;
&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;textwidth&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;
&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;softtabstop&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;shiftwidth&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;omnifunc&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="nx"&gt;syntaxcomplete&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="nx"&gt;Complete&lt;/span&gt;
&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;completeopt&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="nx"&gt;longest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;menuone&lt;/span&gt;
&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;+=~/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vim&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;systags&lt;/span&gt;

&lt;span class="nx"&gt;autocmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FileType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;make&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;noexpandtab&lt;/span&gt;

&lt;span class="nx"&gt;augroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;csrc&lt;/span&gt;
&lt;span class="nx"&gt;au&lt;/span&gt;&lt;span class="p"&gt;!&lt;/span&gt;
&lt;span class="nx"&gt;autocmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FileType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;nocindent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;smartindent&lt;/span&gt;
&lt;span class="nx"&gt;autocmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;FileType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;cpp&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cindent&lt;/span&gt;
&lt;span class="nx"&gt;augroup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;END&lt;/span&gt;

&lt;span class="nx"&gt;syntax&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="misc"></category><category term="c"></category><category term="Computing"></category><category term="kde"></category><category term="Linux"></category><category term="Programming"></category><category term="autocompletion"></category><category term="intellisense"></category><category term="kdevelop"></category><category term="omnicomplete"></category><category term="vim"></category></entry><entry><title>Stop Social Distributed Version Control Diaspora!</title><link href="http://kev009.com/wp/2010/10/stop-distributed-version-control-diaspora/" rel="alternate"></link><published>2010-10-29T23:08:00-07:00</published><updated>2010-10-29T23:08:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2010-10-29:/wp/2010/10/stop-distributed-version-control-diaspora/</id><summary type="html">&lt;p&gt;A ton of people use &lt;a href="http://github.com/"&gt;github&lt;/a&gt;, &lt;a href="http://gitorious.org/"&gt;gitorious&lt;/a&gt;, and &lt;a href="http://bitbucket.org/"&gt;bitbucket&lt;/a&gt; these
days. Aside from the obvious benefits of dVCS, these sites have
excellent features such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code review&lt;/li&gt;
&lt;li&gt;Merge requests&lt;/li&gt;
&lt;li&gt;Repository "forking" (in a good way)/cloning and easy methods to let
    upstream know about your branch&lt;/li&gt;
&lt;li&gt;Project following/notification&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basically …&lt;/p&gt;</summary><content type="html">&lt;p&gt;A ton of people use &lt;a href="http://github.com/"&gt;github&lt;/a&gt;, &lt;a href="http://gitorious.org/"&gt;gitorious&lt;/a&gt;, and &lt;a href="http://bitbucket.org/"&gt;bitbucket&lt;/a&gt; these
days. Aside from the obvious benefits of dVCS, these sites have
excellent features such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code review&lt;/li&gt;
&lt;li&gt;Merge requests&lt;/li&gt;
&lt;li&gt;Repository "forking" (in a good way)/cloning and easy methods to let
    upstream know about your branch&lt;/li&gt;
&lt;li&gt;Project following/notification&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Basically, the buzzword they billet this as is &lt;strong&gt;social coding&lt;/strong&gt;. The
idea isn't entirely new considering mailing lists with patches have been
in use for ages, but the new interfaces are intuitive and visually
appealing.&lt;/p&gt;
&lt;p&gt;The problem? &lt;a href="http://en.wikipedia.org/wiki/Walled_garden_%28technology%29"&gt;Walled garden&lt;/a&gt;. One system doesn't work with the
other. Worse if you want to run your own project infrastructure. You'd
think as FOSS programmers we'd know better than this and not fall into
the same pitfall that social networks are currently in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I plead with you, social coding providers, come together and create a
universal API in which we can uniformly share and exchange
information&lt;/strong&gt;such as followers, branches, notifications, and merge
requests.&lt;/p&gt;
&lt;p&gt;I believe this situation is important enough to warrant the attention of
community leaders. I have sent email to the &lt;a href="http://www.fsf.org/"&gt;Free Software
Foundation&lt;/a&gt; and &lt;a href="http://www.linuxfoundation.org/"&gt;The Linux Foundation&lt;/a&gt; asking for guidance. If you
would kindly pass this along to them and members of &lt;a href="http://www.canonical.com/"&gt;Canonical&lt;/a&gt;,
&lt;a href="http://debian.org/"&gt;Debian&lt;/a&gt;, and other large FOSS groups we will stymie community
fragmentation and develop a way to further the openness that has allowed
the creation of such fantastic tools.&lt;/p&gt;
&lt;p&gt;Sincerely,
The Undersigned Free Software Advocates (place comment on this
entry)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Edit #1: Response to a couple frequently asked questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The idea is to keep the information open, free, and interchangeable
    as information is what these sites add. We've had public VCS repos
    and web interfaces for ages. The fact that gitorious is open source
    does not address this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The value of these sites is the social factor, and for the most part
    they bottle it up. If you prefer github, but a project you want to
    follow uses gitorious (like Qt), there is no means of exchanging the
    social factor. This is nearly identical to
    facebook-&amp;gt;&lt;a href="http://www.joindiaspora.com/"&gt;Diaspora&lt;/a&gt;.While some of these sites do have extended
    APIs, we need to come together and make sure that they inter-operate
    and also work with self-hosted systems like trac and redmine.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Edit #2: A good summary of what needs to be done on &lt;a href="http://www.reddit.com/r/opensource/comments/dylz2/stop_distributed_version_control_diaspora/c13x0mv"&gt;reddit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Edit #3: A response from Richard Stallman, Atlassian (bitbucket), and
github!&lt;/p&gt;
&lt;p&gt;An email from RMS:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;gt; There is a chance to increase openness and productivity by making
these&lt;br&gt;
 &amp;gt; systems as well as self-hosted solutions such as trac, redmine,
and&lt;br&gt;
 &amp;gt; reviewboard inter-operate. Developing a standard protocol for the
social&lt;br&gt;
 &amp;gt; features such as clone notification, merge requests, and commit
comments&lt;br&gt;
 &amp;gt; would also make integration into the commandline and GUI tools
easily&lt;br&gt;
 &amp;gt; possible.&lt;/p&gt;
&lt;p&gt;It seems like a good idea to me, to the extent it is feasible. I&lt;br&gt;
 don't know how these tools work, but I think that most of them use&lt;br&gt;
 communication protocols based on their data formats, which are
unique&lt;br&gt;
 to each program. So we could only unify the aspects of the protocols&lt;br&gt;
 which don't depend on those internal data formats. But that much&lt;br&gt;
 could be useful.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Both Atlassian and github saw this as a valid point and were not opposed
to such a standard but did not indicate they were working toward
anything. Can anyone advise on how to start a working group or RFC to
define such a protocol?&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="Programming"></category><category term="bitbucket"></category><category term="dvcs"></category><category term="FOSS"></category><category term="Free Software"></category><category term="git"></category><category term="github"></category><category term="gitorious"></category><category term="hg"></category><category term="mercurial"></category><category term="social coding"></category></entry><entry><title>Software Freedom Day 2010 - Gentoo Linux</title><link href="http://kev009.com/wp/2010/09/sfd-2010-gentoo-linux/" rel="alternate"></link><published>2010-09-18T08:37:00-07:00</published><updated>2010-09-18T08:37:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2010-09-18:/wp/2010/09/sfd-2010-gentoo-linux/</id><summary type="html">&lt;p&gt;I'm doing a presentation/Q&amp;amp;A for Software Freedom Day 2010 in
Charleston, SC. &lt;a href="http://csclug.org/"&gt;CSCLUG&lt;/a&gt; is putting on the event.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kev009.com/wp/assets/2010/09/GentooSFD2010.odp"&gt;Software Freedom Day 2010 - Gentoo Linux Presentation&lt;/a&gt; - .odp /
    Open Office Impress&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kev009.com/wp/assets/2010/09/GentooSFD2010.pdf"&gt;Software Freedom Day 2010 - Gentoo Linux PDF&lt;/a&gt; - .pdf / Portable
    Document Format&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is the presentation. Feel free to use …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I'm doing a presentation/Q&amp;amp;A for Software Freedom Day 2010 in
Charleston, SC. &lt;a href="http://csclug.org/"&gt;CSCLUG&lt;/a&gt; is putting on the event.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kev009.com/wp/assets/2010/09/GentooSFD2010.odp"&gt;Software Freedom Day 2010 - Gentoo Linux Presentation&lt;/a&gt; - .odp /
    Open Office Impress&lt;/li&gt;
&lt;li&gt;&lt;a href="http://kev009.com/wp/assets/2010/09/GentooSFD2010.pdf"&gt;Software Freedom Day 2010 - Gentoo Linux PDF&lt;/a&gt; - .pdf / Portable
    Document Format&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here is the presentation. Feel free to use or modify this under the
terms of CC-SA3.0.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="Linux"></category><category term="Programming"></category><category term="Projects"></category></entry><entry><title>Sun/Oracle Ultra 27 Workstation Discontinued?</title><link href="http://kev009.com/wp/2010/07/sunoracle-ultra-27-workstation-discontinued/" rel="alternate"></link><published>2010-07-22T19:30:00-07:00</published><updated>2010-07-22T19:30:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2010-07-22:/wp/2010/07/sunoracle-ultra-27-workstation-discontinued/</id><summary type="html">&lt;p&gt;I just noticed that the Sun/Oracle Ultra 27 is no longer listed on the
&lt;a href="http://www.oracle.com/us/products/servers-storage/desktop-workstations/index.html"&gt;Desktops section&lt;/a&gt; of Oracles products page. This is a shame because
I'm &lt;a href="http://kev009.com/wp/2009/12/sun-ultra-27-review-the-ultimate-linux-workstation/"&gt;quite pleased&lt;/a&gt; with mine.&lt;/p&gt;
&lt;p&gt;This sends a couple of messages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Oracle doesn't think Solaris/OpenSolaris is viable on the
    workstation&lt;/li&gt;
&lt;li&gt;Oracle can't deliver …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;p&gt;I just noticed that the Sun/Oracle Ultra 27 is no longer listed on the
&lt;a href="http://www.oracle.com/us/products/servers-storage/desktop-workstations/index.html"&gt;Desktops section&lt;/a&gt; of Oracles products page. This is a shame because
I'm &lt;a href="http://kev009.com/wp/2009/12/sun-ultra-27-review-the-ultimate-linux-workstation/"&gt;quite pleased&lt;/a&gt; with mine.&lt;/p&gt;
&lt;p&gt;This sends a couple of messages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Oracle doesn't think Solaris/OpenSolaris is viable on the
    workstation&lt;/li&gt;
&lt;li&gt;Oracle can't deliver low margin hardware (the prices on these boxes
    skyrocketed after the acquisition)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It could be a purge while they bump to a new model featuring 6-core
Xeons. Yet more than likely, another victim of the merger.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category><category term="java"></category><category term="Linux"></category><category term="Programming"></category><category term="OpenSolaris"></category><category term="Oracle"></category><category term="Solaris"></category><category term="Sun"></category><category term="Ultra 27"></category></entry><entry><title>But First, Write No Code</title><link href="http://kev009.com/wp/2010/05/but-first-write-no-code/" rel="alternate"></link><published>2010-05-27T23:28:00-07:00</published><updated>2010-05-27T23:28:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2010-05-27:/wp/2010/05/but-first-write-no-code/</id><summary type="html">&lt;p&gt;Something I see often in person and online are programmers constantly
implementing common solutions, reinventing wheels, or embracing
&lt;acronym title="Not Invented Here"&gt;NIH&lt;/acronym&gt;.&lt;/p&gt;
&lt;p&gt;Before you do this, please consider the &lt;em&gt;Kev009's Oath&lt;/em&gt; -  &lt;strong&gt;"But First,
Write No Code"&lt;/strong&gt;. This is a solution to a variety of problems in
software development, but today's article is specifically …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Something I see often in person and online are programmers constantly
implementing common solutions, reinventing wheels, or embracing
&lt;acronym title="Not Invented Here"&gt;NIH&lt;/acronym&gt;.&lt;/p&gt;
&lt;p&gt;Before you do this, please consider the &lt;em&gt;Kev009's Oath&lt;/em&gt; -  &lt;strong&gt;"But First,
Write No Code"&lt;/strong&gt;. This is a solution to a variety of problems in
software development, but today's article is specifically on using
external code.&lt;/p&gt;
&lt;p&gt;I've found that programmers who follow a system similar to mine
(detailed below) develop systems that are more stable, maintainable, and
sane. They likely write better code because it means they understand
their tools and also read others' code. They examine the problem first
rather than going in guns blazing.&lt;/p&gt;
&lt;p&gt;Steps to decide whether to use an existing solution or write your own
implementation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Scan the area.&lt;/strong&gt; &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt;, &lt;a href="http://www.freshmeat.net/"&gt;Freshmeat&lt;/a&gt;, &lt;a href="http://www.sf.net/"&gt;SourceForge&lt;/a&gt;,
    standard library, OS libraries, etc. are your friend. See if the
    problem you are trying to solve has been solved. I don't care how
    long you've been programming or how much you think you know. The
    ecosystem of a language is constantly changing. Make a list of hits
    that look similar to the problem you are trying to solve. Try and
    get a quick sense of the idiomatic methods of using your language,
    OS, etc.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Do research.&lt;/strong&gt; Are the solutions you found in step 1 suitable to
    the problem at hand? Consider the &lt;em&gt;pros&lt;/em&gt; and &lt;em&gt;cons&lt;/em&gt; of each item.
    Now, carefully evaluate how idiomatic the items are to your language
    and environment. If the item is open source, does the community seem
    active? If it doesn't fully map to your problem, does it look like
    you can modify it to do so?&lt;/p&gt;
&lt;p&gt;Even if you end up developing a solution from scratch, you should at
least now have some good references. Keep in mind, extending an
existing project may be considerably less work. You might even be
able to offload maintenance of that component.
3.  &lt;strong&gt;Consider the license.&lt;/strong&gt; This isn't just for the legal department.
What kind of project you are working on will weigh in heavily.
Commercial or open source? As a software professional, you need to
be abreast with the various licenses in the wild. As an open source
developer, you need to consider how licenses will affect your work
being packaged by distributions. An open source library licensed
under the GPL is not acceptable for static linking to commercial
software. However, you can link to an operating system provided
copy or bundle the dynamic library with your application. LGPL does
not have this restriction. With both of these, you must supply your
changes upon request from end users among other things.&lt;/p&gt;
&lt;p&gt;BSD, MIT, and Apache style licenses allow you to make changes and
redistribute under completely different licenses. Some just want
credit in your documentation. These are very compelling even in
commercial development.&lt;/p&gt;
&lt;p&gt;Commercial components may have a per-copy fee associated which may
dissuade their use by your organization. If you don't get the
source, you won't be able to effectively change or maintain it so
you will also be at mercy of that developer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Make a decision.&lt;/strong&gt; By now, your list should have been pared down
    based on licenses and research. Perform extensive evaluations of
    the remainder and eventually hone in on the one you think fits
    best. You're going to have to rely on your experience and intuition
    while making the critical decision. Perhaps the hardest part:
    weighing it against a mythical home-grown solution in your mind.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implement the decision.&lt;/strong&gt; Self explanatory. This either means
    bootstrapping your own project or fully integrating the external
    one. If you are extending an open source solution, consider
    submitting the patches back to the community for feedback and
    perhaps integration. If you are bootstrapping your own solution,
    you've got your work cut out. Is this only suitable for an internal
    project, or perhaps it would have its own merit as a new open source
    project?Be sure to reevaluate early and often. That library you
    chose might turn out to be a can of worms, just as the "easy" new
    solution you had in your head might require years of development.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subscribe to the announce mailing list.&lt;/strong&gt; &lt;em&gt;Only if you used an
    external solution&lt;/em&gt;. Does the project have an RSS feed for releases
    or a low volume announcement list? Don't be like Adobe. 
    &lt;a href="http://secunia.com/blog/76"&gt;Avoid embarrassing security problems&lt;/a&gt;. Also consider how enhancements
    and bug fixes to the external project might make your own project
    better, more stable, and more efficient. This is where the real
    lasting dividends of using an external solution come from.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This list is widely applicable. You've got a seriously high bar to
reach if you are developing containers of &amp;lt;T&amp;gt;, sorting methods, GUI
frameworks, parsers, text and binary file formats, and much more so try
and follow it the next time you code.&lt;/p&gt;</content><category term="misc"></category><category term="c"></category><category term="Computing"></category><category term="java"></category><category term="Programming"></category><category term="python"></category><category term="development"></category><category term="pragmatic"></category><category term="software engineering"></category></entry><entry><title>KDE SC 4.4 - Steady, Incremental Improvements</title><link href="http://kev009.com/wp/2010/02/kde-sc-4-4-steady-incremental-improvements/" rel="alternate"></link><published>2010-02-09T01:13:00-07:00</published><updated>2010-02-09T01:13:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2010-02-09:/wp/2010/02/kde-sc-4-4-steady-incremental-improvements/</id><summary type="html">&lt;p&gt;I haven't noticed any killer features in KDE SC 4.4 and I've been
running it since Beta 1. I've noticed a lot of subtle improvements.
Things like app stacking and selection in the task bar seem much more
responsive. All around, plasma looks subtly better and my favorite KDE …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I haven't noticed any killer features in KDE SC 4.4 and I've been
running it since Beta 1. I've noticed a lot of subtle improvements.
Things like app stacking and selection in the task bar seem much more
responsive. All around, plasma looks subtly better and my favorite KDE
apps seem to just keep getting better.&lt;/p&gt;
&lt;p&gt;KSysGuard is really impressive and now has the ability to connect to
remote hosts for monitoring. However, the biggest change is in the
&lt;a href="http://techbase.kde.org/Schedules/KDE4/Application_Porting_Status"&gt;greater ecosystem&lt;/a&gt;. It seems all the external apps like Amarok, K3b,
and digiKam are coming along to fruition.&lt;/p&gt;
&lt;p&gt;Other than that, this is a smooth release and shows that the platform is
starting to mature. I think the Summer release distros will be able to
do a good job delivering a nice desktop experience based on KDE 4.4.
I'll end with my obligatory "try KDE 4.4 if you had previous bad KDE4
experiences".&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="kde"></category><category term="Linux"></category><category term="Redhat"></category><category term="kde 4.4"></category><category term="kde sc 4.4"></category></entry><entry><title>2010 SpamAssasin Public Service Announcement</title><link href="http://kev009.com/wp/2010/01/2010-spamassasin-public-service-announcement/" rel="alternate"></link><published>2010-01-01T14:34:00-07:00</published><updated>2010-01-01T14:34:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2010-01-01:/wp/2010/01/2010-spamassasin-public-service-announcement/</id><summary type="html">&lt;p&gt;If you run a public mail server, there is a good chance you run
SpamAssassin.&lt;/p&gt;
&lt;p&gt;There is a New Year's SNAFU in which any dates 2010+ are marked "grossly
in the future".  That is a problem since it is now 2010.&lt;/p&gt;
&lt;p&gt;Run sa-update and restart SpamAssassin ASAP, or install the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;If you run a public mail server, there is a good chance you run
SpamAssassin.&lt;/p&gt;
&lt;p&gt;There is a New Year's SNAFU in which any dates 2010+ are marked "grossly
in the future".  That is a problem since it is now 2010.&lt;/p&gt;
&lt;p&gt;Run sa-update and restart SpamAssassin ASAP, or install the following
rule to local.cf:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;score FH_DATE_PAST_20XX 0.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Thanks to &lt;a href="http://lwn.net/Articles/368396/"&gt;LWN for pointing this out&lt;/a&gt; to me before too much damage was
done.&lt;/p&gt;</content><category term="misc"></category><category term="amavisd"></category><category term="mail"></category><category term="mail server"></category><category term="postfix"></category><category term="SpamAssassin"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Gentoo"></category><category term="Linux"></category><category term="News"></category><category term="Redhat"></category></entry><entry><title>Sun Ultra 27 Review - The Ultimate Linux Workstation</title><link href="http://kev009.com/wp/2009/12/sun-ultra-27-review-the-ultimate-linux-workstation/" rel="alternate"></link><published>2009-12-17T03:51:00-07:00</published><updated>2009-12-17T03:51:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-12-17:/wp/2009/12/sun-ultra-27-review-the-ultimate-linux-workstation/</id><summary type="html">&lt;p&gt;Sun Microsystems has a powerful and favorably priced entry in the x86
workstation space with the Ultra 27. Such is the power of this
workstation and its natural fit for *nix workloads, combined with a
compelling price tag, I pronounce it the Ultimate Linux Workstation in
its class. He's a …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Sun Microsystems has a powerful and favorably priced entry in the x86
workstation space with the Ultra 27. Such is the power of this
workstation and its natural fit for *nix workloads, combined with a
compelling price tag, I pronounce it the Ultimate Linux Workstation in
its class. He's a short overview and review as well as a &lt;a href="http://www.youtube.com/watch?v=3aSHA5ALcxM"&gt;video
entry&lt;/a&gt; at the end.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2009/12/PICT0019.JPG"&gt;&lt;img alt="Ultra 27 Front View" src="http://kev009.com/wp/assets/2009/12/PICT0019-203x300.jpg" title="Ultra 27 Front View"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Ultra 27 is a single socket system but packs a powerful quad core
punch. With the Nehalem Xeon (similar to the consumer Core i7), markets
that used to demand dual socket systems can now comfortably look to
cheaper single socket alternatives. With the return of HyperThreading,
the chip handles 8 hardware threads and unlike its previous guise in the
Pentium 4, HT contributes noticeably and favorably to performance. Due
to the extreme performance and number of execution threads, I think the
Nehalem Xeon represents a paradigm shift where most high end systems
will no longer carry two discrete CPUs.&lt;/p&gt;
&lt;p&gt;The Ultra 27 competes in the same league as the Lenovo ThinkStation S20,
HP Z400, Mac Pro Quad and various other boutique workstation
manufacturers. Through channel vendors, all but the Mac can be
comfortably configured for around $2000.&lt;/p&gt;
&lt;p&gt;The price of this system is attractive and affordable to anybody who
makes their livelihood off of professional computing. The components on
a workstation like this are well engineered and thoroughly tested
together. 3rd party vendors will also commonly certify software and
hardware against popular workstation offerings. The Ultra 27 is
comfortably expandable and can be equipped with Intel's best CPUs on the
market, plenty of disk, and high end graphics. With two PCIe2 16-lane
slots and ample cooling and power, the Ultra 27 has a lot to offer
anyone in digital content creation, CAD, CAM, CAE or other visualization
activities. With the speedy Nehalem chip and 4 disk bays programmers
doing large builds or staging large applications should be more than
content.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2009/12/PICT0031.JPG"&gt;&lt;img alt="Ultra 27 Rear View" src="http://kev009.com/wp/assets/2009/12/PICT0031-300x225.jpg" title="Ultra 27 Rear View"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Ultra 27 comes in a robust light gray case. The Spartan design is
free of all the unsightly plastic that usually adorns HP machines and
looks more substantial than either the Lenovo or HP competition. The
interior isn't quite as beautiful as the Mac Pro's, but there is plenty
of room and the internal drive bay keeps any need for user cable
management to a minimum.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2009/12/PICT0032.JPG"&gt;&lt;img alt="Ultra 27 Inside Overview" src="http://kev009.com/wp/assets/2009/12/PICT0032-300x225.jpg" title="Ultra 27 Inside Overview"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My configuration is as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel Xeon w3570 Quad Core at 3.20GHz (has intel Turbo Boost to
    3.46GHz)&lt;/li&gt;
&lt;li&gt;6GB RAM ECC DDR3-1333&lt;/li&gt;
&lt;li&gt;nVIDIA Quadro FX 380 graphics&lt;/li&gt;
&lt;li&gt;500GB 7200 RPM SATA hard disk&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2009/12/PICT0033.JPG"&gt;&lt;img alt="Ultra 27 Drive Bay" src="http://kev009.com/wp/assets/2009/12/PICT0033-300x225.jpg" title="Ultra 27 Drive Bay"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I am upgrading from a previous IBM IntelliStation A Pro which had two
physical single core AMD Opteron CPUs. The increase in performance is
remarkable.&lt;/p&gt;
&lt;p&gt;It is noteworthy that this system is much quieter than my previous.
Indeed, the large fan is seldom audible even under heavy load. The
heat output is negligible and the components have never been more than
warm to the touch even after hours of maximal CPU usage.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2009/12/PICT0034.JPG"&gt;&lt;img alt="Ultra 27 Main Board" src="http://kev009.com/wp/assets/2009/12/PICT0034-300x225.jpg" title="Ultra 27 Main Board"&gt;&lt;/a&gt;[/caption]&lt;/p&gt;
&lt;p&gt;The case is for the most part toolless and very clean and spacious
inside. Every aspect of the system can be easily upgraded so the Ultra
27 should be a good investment and grow with time and requirements.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2009/12/PICT0030.JPG"&gt;&lt;img alt="Ultra 27 Case Diagram" src="http://kev009.com/wp/assets/2009/12/PICT0030-300x225.jpg" title="Ultra 27 Case Diagram"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;With well engineered hardware and plenty of power, the Ultra 27 is
awesome as a general UNIX-class workstation. I am happily running
Gentoo and even the largest builds are a cakewalk for this box. I push
my computer harder than most people. Commonly running several browser
instances loaded with tabs, several terminals, email, music, the Eclipse
IDE, and more, interactivity has not diminished even when running
parallel compiles.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;
&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;param name="src" value="http://www.youtube.com/v/3aSHA5ALcxM&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en_US&amp;amp;feature=player_embedded&amp;amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;/param&gt;

&lt;embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/3aSHA5ALcxM&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en_US&amp;amp;feature=player_embedded&amp;amp;fs=1" allowscriptaccess="always" allowfullscreen="true"&gt;
&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;I'll conclude that anyone looking at the Mac Pro should consider the
alternative in machines like the Sun Ultra 27. This computer represents
a latest in a powerful linage of Sun workstations and is ideal for just
about any demanding workload you can throw at it.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Gentoo"></category><category term="Hardware"></category><category term="Linux"></category><category term="CAD"></category><category term="CAE"></category><category term="core i7"></category><category term="Nehalem"></category><category term="Sun"></category><category term="Ultra 27"></category><category term="Workstation"></category></entry><entry><title>Video of Windows 7 Black Screen of Death</title><link href="http://kev009.com/wp/2009/12/video-of-windows-7-black-screen-of-death/" rel="alternate"></link><published>2009-12-14T23:18:00-07:00</published><updated>2009-12-14T23:18:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-12-14:/wp/2009/12/video-of-windows-7-black-screen-of-death/</id><summary type="html">&lt;p&gt;Here's a video to accompany my previous blog post &lt;a href="http://kev009.com/wp/2009/12/windows-7-has-definite-backlight-problems-black-screen-of-death/"&gt;Windows 7 has
definite backlight problems ("Black Screen of Death")&lt;/a&gt;. As mentioned
before, I cannot reproduce this in Arch Linux. The problem began after
a recent "Patch Tuesday".&lt;/p&gt;
&lt;p&gt;Microsoft has been denying any problems like this in the media. Comment
if …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Here's a video to accompany my previous blog post &lt;a href="http://kev009.com/wp/2009/12/windows-7-has-definite-backlight-problems-black-screen-of-death/"&gt;Windows 7 has
definite backlight problems ("Black Screen of Death")&lt;/a&gt;. As mentioned
before, I cannot reproduce this in Arch Linux. The problem began after
a recent "Patch Tuesday".&lt;/p&gt;
&lt;p&gt;Microsoft has been denying any problems like this in the media. Comment
if you have had similar experience on Nvidia hardware or Intel graphics.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;
&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="445" height="364" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;param name="src" value="http://www.youtube.com/v/E_4E2DHQXbE&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6&amp;amp;border=1"&gt;&lt;/param&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;/param&gt;

&lt;embed type="application/x-shockwave-flash" width="445" height="364" src="http://www.youtube.com/v/E_4E2DHQXbE&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;rel=0&amp;amp;color1=0x2b405b&amp;amp;color2=0x6b8ab6&amp;amp;border=1" allowscriptaccess="always" allowfullscreen="true"&gt;
&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category><category term="IBM"></category><category term="Windows"></category><category term="Black Screen of Death"></category><category term="Microsoft"></category><category term="Windows 7"></category></entry><entry><title>Windows 7 has definite backlight problems ("Black Screen of Death")</title><link href="http://kev009.com/wp/2009/12/windows-7-has-definite-backlight-problems-black-screen-of-death/" rel="alternate"></link><published>2009-12-11T18:03:00-07:00</published><updated>2009-12-11T18:03:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-12-11:/wp/2009/12/windows-7-has-definite-backlight-problems-black-screen-of-death/</id><summary type="html">&lt;p&gt;There is definitely a problem in Windows 7 RTM with the "Black Screen of
Death" despite MS propaganda &lt;a href="http://www.reuters.com/article/idUSTRE5B050H20091201"&gt;stating otherwise&lt;/a&gt;. This one has
nothing to do with &lt;a href="http://www.informationweek.com/news/windows/microsoft_news/showArticle.jhtml?articleID=222000502"&gt;3rd party antivirus software&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The particular problem I am having and see lots of reports on forums is
that the backlight is not …&lt;/p&gt;</summary><content type="html">&lt;p&gt;There is definitely a problem in Windows 7 RTM with the "Black Screen of
Death" despite MS propaganda &lt;a href="http://www.reuters.com/article/idUSTRE5B050H20091201"&gt;stating otherwise&lt;/a&gt;. This one has
nothing to do with &lt;a href="http://www.informationweek.com/news/windows/microsoft_news/showArticle.jhtml?articleID=222000502"&gt;3rd party antivirus software&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The particular problem I am having and see lots of reports on forums is
that the backlight is not turning on after an LCD DPMS standby. What's
particularly bad is that some people are blaming their hardware and
buying new inverters for their displays. My problematic system dual
boots Arch Linux and no amount of LCD power on/off sequences will
trigger this in Arch.&lt;/p&gt;
&lt;p&gt;I suspect though cannot easily prove that the symptoms came after recent
"security patches". No MS, I don't have any virus scanners installed so
blaming others isn't going to cut it. It has gotten particularly bad in
my case after the most recent Patch Tuesday.&lt;/p&gt;
&lt;p&gt;I can trigger it readily with my &lt;a href="http://kev009.com/wp/2009/11/turn-windows-monitorlcd-off-assembly-language-version-announcing-lcdoff/"&gt;LCDoff utility&lt;/a&gt;, though it will also
happen organically with Windows' automatic power management.&lt;/p&gt;
&lt;p&gt;The question is, to whom or how do I report this? I don't want to be
told condescending things by a support drone. With FOSS, I have clear
and easy communications with developers. I'm not aware of an easy way
to get that level of interaction from MS.&lt;/p&gt;
&lt;p&gt;So, Microsoft, I invite &lt;strong&gt;YOU&lt;/strong&gt;to contact &lt;a href="http://kev009.com/wp/contact-me/"&gt;&lt;strong&gt;ME&lt;/strong&gt;&lt;/a&gt; if you want to take
care of this bug on an easy to reproduce testcase.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category><category term="Windows"></category><category term="Black Screen of Death"></category><category term="Microsoft"></category><category term="Windows 7"></category></entry><entry><title>DRBD merged with kernel 2.6.33</title><link href="http://kev009.com/wp/2009/12/drbd-merged-with-kernel-2-6-33/" rel="alternate"></link><published>2009-12-10T06:31:00-07:00</published><updated>2009-12-10T06:31:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-12-10:/wp/2009/12/drbd-merged-with-kernel-2-6-33/</id><summary type="html">&lt;p&gt;DRBD has been a long standing external patch in many distribution
kernels. It has finally been &lt;a href="http://fghaas.wordpress.com/2009/12/08/were-in/"&gt;merged&lt;/a&gt; in the 2.6.33 window.
Colloquially the "Distributed Redundant Block Device", this piece of
code allows you to mirror blocks of storage across multiple nodes.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.drbd.org/"&gt;&lt;img alt="drbd" src="http://kev009.com/wp/assets/2009/12/drbd_overview1-300x163.gif" title="drbd_overview"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is primarily useful in high availability …&lt;/p&gt;</summary><content type="html">&lt;p&gt;DRBD has been a long standing external patch in many distribution
kernels. It has finally been &lt;a href="http://fghaas.wordpress.com/2009/12/08/were-in/"&gt;merged&lt;/a&gt; in the 2.6.33 window.
Colloquially the "Distributed Redundant Block Device", this piece of
code allows you to mirror blocks of storage across multiple nodes.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.drbd.org/"&gt;&lt;img alt="drbd" src="http://kev009.com/wp/assets/2009/12/drbd_overview1-300x163.gif" title="drbd_overview"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is primarily useful in high availability setups. By synchronously
mirroring storage across two systems, you can run an active-passive
cluster where the backup machine will take over if the primary fails.
Using a more advanced clustering file system such as GFS2 or OCFS, you
can even do active-active setups although there are certain
considerations there.&lt;/p&gt;
&lt;p&gt;This is exciting because it alleviates the need for specialized hardware
like SAN storage. Standard Linux servers with direct attached storage
may be used and indeed even give &lt;a href="http://www.drbd.org/home/wiki/?tx_drwiki_pi1[keyword]=performance"&gt;appreciable performance&lt;/a&gt;. In
practice, redundancy will be even greater than all but the highest end
SAN equipment due to the lack of single point of failure.&lt;/p&gt;
&lt;p&gt;DRBD also allows for asynchronous mirroring, that is, writes to the
primary do not wait on completion to the secondary. This is useful for
cold site backups and perhaps meeting legal compliance in certain
industries as well.&lt;/p&gt;
&lt;p&gt;Take a look at the &lt;a href="http://www.drbd.org"&gt;DRBD site&lt;/a&gt; for more information and use cases.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Gentoo"></category><category term="Hardware"></category><category term="Linux"></category><category term="Redhat"></category><category term="2.6.33"></category><category term="DRBD"></category><category term="GFS2"></category><category term="high availibility"></category><category term="OCFS"></category><category term="SAN"></category></entry><entry><title>Getting Beautiful Fonts in Gentoo Linux</title><link href="http://kev009.com/wp/2009/12/getting-beautiful-fonts-in-gentoo-linux/" rel="alternate"></link><published>2009-12-04T01:29:00-07:00</published><updated>2009-12-04T01:29:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-12-04:/wp/2009/12/getting-beautiful-fonts-in-gentoo-linux/</id><summary type="html">&lt;p&gt;Here's my easy and modern guide to getting pleasant looking fonts on
Gentoo with minimal effort.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2009/12/wikipedia-fonts.png"&gt;&lt;img alt="Wikipedia rendered with the end result of this guide" src="http://kev009.com/wp/assets/2009/12/wikipedia-fonts-300x298.png" title="wikipedia-fonts"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Wikipedia rendered with the end result of this guide&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;USE Flags&lt;/h3&gt;
&lt;p&gt;Enable the following USE flags:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;euse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;truetype&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;type1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cleartype&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;corefonts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and make sure everything is built with them enabled:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;emerge -uDNa world …&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;Here's my easy and modern guide to getting pleasant looking fonts on
Gentoo with minimal effort.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2009/12/wikipedia-fonts.png"&gt;&lt;img alt="Wikipedia rendered with the end result of this guide" src="http://kev009.com/wp/assets/2009/12/wikipedia-fonts-300x298.png" title="wikipedia-fonts"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Wikipedia rendered with the end result of this guide&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;USE Flags&lt;/h3&gt;
&lt;p&gt;Enable the following USE flags:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;euse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="nx"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;truetype&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;type1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cleartype&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;corefonts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and make sure everything is built with them enabled:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;emerge -uDNa world
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Emerge Fonts&lt;/h3&gt;
&lt;p&gt;X.org and other apps should pull in some common fonts. Here are some
additional fonts useful for OpenOffice and other programs. Dejavu
provides excellent default fonts which we will enable in the next
section.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;admin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;eselect&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;fontconfig&lt;/span&gt;
&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;corefonts&lt;/span&gt;
&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;dejavu&lt;/span&gt;
&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bh&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;ttf&lt;/span&gt;
&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bh&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;type1&lt;/span&gt;
&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;freefonts&lt;/span&gt;
&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ttf&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;bitstream&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;vera&lt;/span&gt;
&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;unifont&lt;/span&gt;
&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;fonts&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;artwiz&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;aleczapka&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;en&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Enabling fontconfig options&lt;/h3&gt;
&lt;p&gt;Use '&lt;strong&gt;eselect fontconfig list&lt;/strong&gt;' to see a list of available
configuration options.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2009/12/eselect-fontconfig.png"&gt;&lt;img alt="eselect fontconfiglist" src="http://kev009.com/wp/assets/2009/12/eselect-fontconfig-298x300.png" title="eselect-fontconfig"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Try enabling the following with '&lt;strong&gt;eselect fontconfig enable&lt;/strong&gt; &amp;lt;num
from list above&amp;gt;':&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;autohint&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sub&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;pixel&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rgb&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="mf"&gt;20&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unhint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dejavu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sans&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mono&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="mf"&gt;20&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unhint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dejavu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sans&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="mf"&gt;20&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unhint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;small&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dejavu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;serif&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="mf"&gt;25&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unhint&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;nonlatin&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="mf"&gt;57&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dejavu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sans&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mono&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="mf"&gt;57&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dejavu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sans&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;span class="mf"&gt;57&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dejavu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;serif&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This will give you very nice hinted fonts suitable for the great
majority of RGB LCD displays.&lt;/p&gt;
&lt;p&gt;The &lt;em&gt;57-&lt;/em&gt; series rules enable dejavu fonts as the default Serif and Sans
Serif fonts. This will improve the look of your desktop environment and
programs like Firefox immediately.&lt;/p&gt;
&lt;h3&gt;~/.fonts.conf&lt;/h3&gt;
&lt;p&gt;This file controls your user fontconfig settings. We will reiterate RGB
hinting and disable it for bold fonts so they are not overly bold.
There are plenty of other tricks you can perform in this file to get
more Windows-like text, but I'm quite satisfied with the following and
find it very easy to read.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#39;1.0&amp;#39;?&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE fontconfig SYSTEM &amp;#39;fonts.dtd&amp;#39;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;fontconfig&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;font&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;assign&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;rgba&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;const&amp;gt;&lt;/span&gt;rgb&lt;span class="nt"&gt;&amp;lt;/const&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;font&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;assign&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;hinting&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;bool&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/bool&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;font&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;assign&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;hintstyle&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;const&amp;gt;&lt;/span&gt;hintfull&lt;span class="nt"&gt;&amp;lt;/const&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;font&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;assign&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;antialias&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;bool&amp;gt;&lt;/span&gt;true&lt;span class="nt"&gt;&amp;lt;/bool&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cm"&gt;&amp;lt;!-- Disable autohint for bold fonts so they are not overly bold --&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;match&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;target=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;font&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;test&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;compare=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;more&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;weight&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;const&amp;gt;&lt;/span&gt;medium&lt;span class="nt"&gt;&amp;lt;/const&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;edit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;mode=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;assign&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;autohint&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;bool&amp;gt;&lt;/span&gt;false&lt;span class="nt"&gt;&amp;lt;/bool&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/fontconfig&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Please share any thoughts and tips in the comments. I recommend
browsing the &lt;a href="http://en.gentoo-wiki.com/wiki/X.Org/Fonts"&gt;X.org Font Guide&lt;/a&gt; on Gentoo Wiki, though some of the
information there is out of date or more complex than the method I just
outlined.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="kde"></category><category term="Linux"></category><category term="fontconfig"></category><category term="fonts"></category><category term="subpixel hinting"></category><category term="x11"></category><category term="xorg"></category></entry><entry><title>boo2pdf Update</title><link href="http://kev009.com/wp/2009/11/boo2pdf-update/" rel="alternate"></link><published>2009-11-27T07:48:00-07:00</published><updated>2009-11-27T07:48:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-11-27:/wp/2009/11/boo2pdf-update/</id><summary type="html">&lt;p&gt;I did some minor updates to &lt;a href="http://kev009.com/wp/projects/boo2pdf/"&gt;boo2pdf&lt;/a&gt;. Graphics should now be within
the page margins. Please let me know if there are any other common
formatting mistakes.&lt;/p&gt;
&lt;p&gt;Unfortunately, IBM's "transmogrifier" utility doesn't work very well in
Wine, so you should preprocess older books in Windows before running
them through the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I did some minor updates to &lt;a href="http://kev009.com/wp/projects/boo2pdf/"&gt;boo2pdf&lt;/a&gt;. Graphics should now be within
the page margins. Please let me know if there are any other common
formatting mistakes.&lt;/p&gt;
&lt;p&gt;Unfortunately, IBM's "transmogrifier" utility doesn't work very well in
Wine, so you should preprocess older books in Windows before running
them through the &lt;a href="http://ps-2.kev009.com/boo2pdf/"&gt;boo2pdf web service&lt;/a&gt; (download is on that page).&lt;/p&gt;
&lt;p&gt;Source code is now available from &lt;a href="https://github.com/kev009/boo2pdf"&gt;boo2pdf github&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://kev009.com/wp/projects/boo2pdf/"&gt;boo2pdf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ps-2.kev009.com/boo2pdf/"&gt;boo2pdf web service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kev009/boo2pdf"&gt;boo2pdf github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"></category><category term="Computing"></category><category term="IBM"></category><category term="java"></category><category term="Linux"></category><category term="News"></category><category term="Programming"></category><category term="Projects"></category><category term="Retrocomputing"></category><category term="boo"></category><category term="boo2pdf"></category><category term="BookManager"></category></entry><entry><title>Turn Windows Monitor/LCD Off (Assembly Language Version) -- Announcing LCDoff</title><link href="http://kev009.com/wp/2009/11/turn-windows-monitorlcd-off-assembly-language-version-announcing-lcdoff/" rel="alternate"></link><published>2009-11-02T02:11:00-07:00</published><updated>2009-11-02T02:11:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-11-02:/wp/2009/11/turn-windows-monitorlcd-off-assembly-language-version-announcing-lcdoff/</id><summary type="html">&lt;p&gt;I recently upgraded my trusty ThinkPad T42 to Windows 7. Unfortunately,
the screen-off keystroke no longer works. Some quick Googling showed
that people made their [own handlers in C#][]. Well, that sucks if you
don't have the .net CLR. This is not a problem on Windows 7, but I also …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I recently upgraded my trusty ThinkPad T42 to Windows 7. Unfortunately,
the screen-off keystroke no longer works. Some quick Googling showed
that people made their [own handlers in C#][]. Well, that sucks if you
don't have the .net CLR. This is not a problem on Windows 7, but I also
wanted to try out my Assembly skills since they were all just calling
standard Win32 APIs.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/files/LCDoff.exe"&gt;Download LCDOff.exe&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This should work on fairly old systems, back to Windows NT 3.1 and
Windows 95, unlike the C# versions. It is also 7.5kb vs 85kb.&lt;/p&gt;
&lt;p&gt;I wrote it in MASM using the &lt;a href="http://kipirvine.com/asm/"&gt;Irvine library&lt;/a&gt; for convenience.
Optimized with &lt;a href="http://upx.sourceforge.net/"&gt;http://upx.sourceforge.net/&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nf"&gt;TITLE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Monitor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Off&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;main.asm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="c1"&gt;; Description: This program turns off your monitor (power saving mode)  &lt;/span&gt;
&lt;span class="c1"&gt;; Revision date: 2 November 2009&lt;/span&gt;

&lt;span class="nf"&gt;INCLUDE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Irvine32.inc&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="no"&gt;INCLUDELIB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Kernel32.lib&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="no"&gt;INCLUDELIB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;User32.lib&lt;/span&gt;

&lt;span class="nf"&gt;SendMessageA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;PROTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="no"&gt;DWORD&lt;/span&gt;&lt;span class="p"&gt;,:&lt;/span&gt;&lt;span class="no"&gt;DWORD&lt;/span&gt;&lt;span class="p"&gt;,:&lt;/span&gt;&lt;span class="no"&gt;DWORD&lt;/span&gt;&lt;span class="p"&gt;,:&lt;/span&gt;&lt;span class="no"&gt;DWORD&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="no"&gt;GetConsoleWindow&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;PROTO&lt;/span&gt;

&lt;span class="nf"&gt;WM&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="no"&gt;_SYSCOMMAND&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0112&lt;/span&gt;&lt;span class="no"&gt;h&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="no"&gt;SC&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="no"&gt;_MONITORPOWER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="no"&gt;F170h&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="no"&gt;OFF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="na"&gt;.data&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="no"&gt;msg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;BYTE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;Monitor off. Program from Kev009.com&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="no"&gt;dh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="no"&gt;ah&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="na"&gt;.code&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="no"&gt;main&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;PROC&lt;/span&gt;

&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;Clrscr&lt;/span&gt;

&lt;span class="c1"&gt;; Get our window handle to send the event to  &lt;/span&gt;
&lt;span class="nf"&gt;INVOKE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;GetConsoleWindow&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="c1"&gt;; The handle is now in eax  &lt;/span&gt;
&lt;span class="nf"&gt;INVOKE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;SendMessageA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;WM&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="no"&gt;_SYSCOMMAND&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;SC&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="no"&gt;_MONITORPOWER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;OFF&lt;/span&gt;

&lt;span class="nf"&gt;mov&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;edx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="no"&gt;OFFSET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;msg&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="no"&gt;call&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;WriteString&lt;/span&gt;

&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="no"&gt;main&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;ENDP&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="no"&gt;END&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;main&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I've set up a &lt;a href="http://kev009.com/wp/projects/boo2pdf/"&gt;project page&lt;/a&gt; at if there ever need to be updates.&lt;/p&gt;</content><category term="misc"></category></entry><entry><title>Xen 3.4.1 on RHEL/CentOS 5.4</title><link href="http://kev009.com/wp/2009/10/xen-3-4-1-on-rhelcentos-5-4/" rel="alternate"></link><published>2009-10-22T13:04:00-07:00</published><updated>2009-10-22T13:04:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-10-22:/wp/2009/10/xen-3-4-1-on-rhelcentos-5-4/</id><summary type="html">&lt;p&gt;I'm happy to report that the updated &lt;a href="http://www.gitco.de/repo/"&gt;Gitco&lt;/a&gt; Xen 3.4.1 repo is working
well on CentOS 5.4.&lt;/p&gt;
&lt;p&gt;If you are doing link bonding and bridging in accordance with my
previous post "&lt;a href="http://kev009.com/wp/2009/01/xen-33-in-rhelcentos-5-and-more-link-aggregation-fun/"&gt;Xen 3.3 in RHEL/CentOS 5 and more Link Aggregation
Fun&lt;/a&gt;", you no longer need …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I'm happy to report that the updated &lt;a href="http://www.gitco.de/repo/"&gt;Gitco&lt;/a&gt; Xen 3.4.1 repo is working
well on CentOS 5.4.&lt;/p&gt;
&lt;p&gt;If you are doing link bonding and bridging in accordance with my
previous post "&lt;a href="http://kev009.com/wp/2009/01/xen-33-in-rhelcentos-5-and-more-link-aggregation-fun/"&gt;Xen 3.3 in RHEL/CentOS 5 and more Link Aggregation
Fun&lt;/a&gt;", you no longer need to patch the network scripts as RedHat fixed
the initscripts package in RHEL 5.4.&lt;/p&gt;
&lt;h3&gt;Upgrade procedure for CentOS 5.3 to 5.4:&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yum clean all
yum update glibc\*
yum update yum\* rpm\* python\*
yum clean all
yum upgrade
reboot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Updated Xen Install Guide From My Previous Article:&lt;/h3&gt;
&lt;p&gt;Head over to &lt;a href="http://www.gitco.de/repo/"&gt;http://www.gitco.de/repo/&lt;/a&gt; and grab the repo for your
arch. (Most likely wget
http://www.gitco.de/repo/CentOS5-GITCO_x86_64.repo in
/etc/yum.repos.d/ for the uninitiated).&lt;/p&gt;
&lt;p&gt;If you already have Xen installed, you may need to remove and readd it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yum groupremove Virtualization
yum groupinstall Virtualization
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You'll also get some updated tools like Virtual Machine Monitor 0.7.0
that make it easier to install newer guests such as Fedora 11 or
Ubuntu. Sweet!&lt;/p&gt;
&lt;p&gt;Double check /etc/sysconfig/kernel. It should be set to kernel-xen.
Likewise, check /boot/grub.conf and make sure that the Xen kernel is the
default if the aforementioned was not done beforehand.&lt;/p&gt;
&lt;p&gt;Reboot!&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Hardware"></category><category term="Linux"></category><category term="Redhat"></category><category term="CentOS"></category><category term="gitco"></category><category term="RHEL"></category><category term="xen"></category></entry><entry><title>Linus and Windows 7</title><link href="http://kev009.com/wp/2009/10/linus-and-windows-7/" rel="alternate"></link><published>2009-10-22T11:25:00-07:00</published><updated>2009-10-22T11:25:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-10-22:/wp/2009/10/linus-and-windows-7/</id><content type="html">&lt;p&gt;&lt;img alt="Linus Torvalds posing with Windows 7" src="http://lh5.ggpht.com/_COt6T7Tmrok/SuAp5A54riI/AAAAAAAAAow/rWQ8NvS3wYk/s912/dsc_1576.jpg" title="Linus Torvalds posing with Windows 7"&gt;&lt;/p&gt;
&lt;p&gt;This is awesome.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Windows"></category><category term="Linus Torvalds"></category><category term="Windows 7"></category></entry><entry><title>Announcing boo2pdf</title><link href="http://kev009.com/wp/2009/10/announcing-boo2pdf/" rel="alternate"></link><published>2009-10-20T00:35:00-07:00</published><updated>2009-10-20T00:35:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-10-20:/wp/2009/10/announcing-boo2pdf/</id><summary type="html">&lt;p&gt;I've just uploaded a beta of &lt;a href="http://kev009.com/wp/projects/boo2pdf/"&gt;boo2pdf&lt;/a&gt;, an IBM BookManager to PDF
conversion app &amp;amp; web service. I'm currently experimenting with the HTML
to PDF backends and would like feedback with book files I haven't tried.
Once the code is cleaned up, I will dump it on my site.&lt;/p&gt;
&lt;h3&gt;Motivation&lt;/h3&gt;
&lt;p&gt;I …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've just uploaded a beta of &lt;a href="http://kev009.com/wp/projects/boo2pdf/"&gt;boo2pdf&lt;/a&gt;, an IBM BookManager to PDF
conversion app &amp;amp; web service. I'm currently experimenting with the HTML
to PDF backends and would like feedback with book files I haven't tried.
Once the code is cleaned up, I will dump it on my site.&lt;/p&gt;
&lt;h3&gt;Motivation&lt;/h3&gt;
&lt;p&gt;I have a large collection of old IBM machines and documentation. I want
this documentation indexed by my own search facilities and Google for
easy retrieval. PDF is widely read, while BookManager requires
proprietary software and no search engines I know of parse it. This will
probably be useful to Mainframers as well.&lt;/p&gt;
&lt;p&gt;Take the web service for a spin here: &lt;a href="http://ps-2.kev009.com/boo2pdf/"&gt;http://ps-2.kev009.com/boo2pdf/&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"></category><category term="BookManager"></category><category term="IBM"></category><category term="Linux"></category><category term="mainframe"></category><category term="Computing"></category><category term="Hardware"></category><category term="java"></category><category term="News"></category><category term="Programming"></category><category term="Projects"></category><category term="Retrocomputing"></category></entry><entry><title>Java: The Good Parts</title><link href="http://kev009.com/wp/2009/10/java-the-good-parts/" rel="alternate"></link><published>2009-10-14T22:31:00-07:00</published><updated>2009-10-14T22:31:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-10-14:/wp/2009/10/java-the-good-parts/</id><summary type="html">&lt;p&gt;&lt;img alt="javascript-the-good-parts" src="http://kev009.com/wp/assets/2009/10/javascript-the-good-parts.gif" title="javascript-the-good-parts"&gt;&lt;/p&gt;
&lt;p&gt;A while back, a book entitled &lt;a href="http://oreilly.com/catalog/9780596517748"&gt;JavaScript:
The Good Parts&lt;/a&gt; made waves on the internet, especially social
networking sites. This book purported to show the inner beauty of a
language that was long considered second or third rate, coming of age.
With the advent of toolkits like JQuery, Javascript/AJAX …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="javascript-the-good-parts" src="http://kev009.com/wp/assets/2009/10/javascript-the-good-parts.gif" title="javascript-the-good-parts"&gt;&lt;/p&gt;
&lt;p&gt;A while back, a book entitled &lt;a href="http://oreilly.com/catalog/9780596517748"&gt;JavaScript:
The Good Parts&lt;/a&gt; made waves on the internet, especially social
networking sites. This book purported to show the inner beauty of a
language that was long considered second or third rate, coming of age.
With the advent of toolkits like JQuery, Javascript/AJAX development has
become easy and even fun.&lt;/p&gt;
&lt;p&gt;I aim to do the same by showing "Java: The Good Parts" here at a high
level.&lt;/p&gt;
&lt;p&gt;&lt;img alt="java_powered_logo_rgb" src="http://kev009.com/wp/assets/2009/10/java_powered_logo_rgb.gif" title="java_powered_logo_rgb"&gt;&lt;/p&gt;
&lt;p&gt;When I was younger, I used to despise Java for political reasons and bad
memories of early applets and applications. I suspect many users and
developers (especially Libre software devs!) are on the same boat. By
the end of this article, I hope I swayed your opinion or at least caused
you to reevaluate your bias. I also wish to encourage further
discussion about these points and ways we can improve any deficiencies.&lt;/p&gt;
&lt;h2&gt;Rough and Tumble Upbringing&lt;/h2&gt;
&lt;p&gt;When Java first started gaining popularity, it was loudly hyped as the
end all language. It was expected that Java would take the "rich
client" by storm, and applets would be the go to solution for enhancing
web pages. What happened was a bit different. Java floundered and
struggled to find a niche. On the client side, AWT apps looked
horrendous despite using native widgets. Then Swing came about and
despite easing development, it looked equally bad on all platforms (by
default). Applets were basically a stillbirth. The ugly gray box,
loadtime sometime measuring in minutes, and no coordination with the DOM
and web browser made the average user hate Java.&lt;/p&gt;
&lt;p&gt;One area Java was able to develop and secure a foundation, however, was
the back end of large web applications. The Virtual Machine approach
provided a marked advantage over the CGI and interpreted scripts of the
day. Java's rich networking libraries, clean Object Oriented design,
and safety made this the language de jour for large web applications.&lt;/p&gt;
&lt;h2&gt;Open Source Matters&lt;/h2&gt;
&lt;p&gt;In my opinion, the open sourcing of Java during its early infancy would
have had little impact on most of the teething issues. The Virtual
Machine, JIT, and Garbage Collection required many years of tuning to
get acceptable performance and Sun did an acceptable job keeping it
under wing. The relatively limited CPU and RAM of the mid '90s also
made these concepts a bit ahead of their time. Somewhere in the
1999-2002 time frame, though, Sun really dropped the ball. An Open
Source Java would have led to ubiquity on the booming Linux platform and
a chance for all sorts of cross-platform software.&lt;/p&gt;
&lt;p&gt;Open Source matters, and not just for the source code. Open Source
projects naturally bring about very pragmatic and intelligent
developers. These are the folks that thoroughly enjoy their hobby,
work, and tools. The marketing guys and pointed haired bosses have much
less pull here. On one hand, a vibrant community built itself with the
many Apache Software Foundation projects. However, most of these were
squarely focused on web applications or low level things such as build
tools, testing frameworks, and message buses.&lt;/p&gt;
&lt;p&gt;&lt;img alt="ThumbsUp" src="http://kev009.com/wp/assets/2009/10/ThumbsUp.jpg" title="ThumbsUp"&gt;&lt;/p&gt;
&lt;p&gt;Due to the void, interpreted languages such as Python rose
to the challenge while C and C++ remained the mainstay for applications
programming. Microsoft started dominating Windows development with
their .NET CLR languages. The glib/Gtk+ and Qt toolkits brought about a
renaissance in cross-platform development with C and C++ respectively
[though not limited].&lt;/p&gt;
&lt;p&gt;It wasn't until the open-sourcing of SWT that GUI development in Java
became attractive. The obvious killer apps here were the &lt;a href="http://www.eclipse.org/"&gt;Eclipse
IDE&lt;/a&gt; and the Azureus (now &lt;a href="http://en.wikipedia.org/wiki/Vuze"&gt;Vuze&lt;/a&gt;) bittorrent client.&lt;/p&gt;
&lt;p&gt;Sun's closed grip of Java really stagnated any chance of abundant
expansion in these middle years (2001-2006). Microsoft leveraged this
weakness to create the excellent .NET platform and associated languages
to maintain their closed platform and market dominance. The
counterbalance that would have been Java was thus left playing catchup.&lt;/p&gt;
&lt;p&gt;We are just beginning to see the fruits of this labor from 2006 through
today. The OpenJDK project is now distributed with popular Linux
distributions such as Ubuntu and Fedora. We finally have decent browser
plugins and Java Web Start applications across 32 and 64-bit machines.
The Java deployment problem will slowly fade from memory.&lt;/p&gt;
&lt;h2&gt;Application Development&lt;/h2&gt;
&lt;p&gt;SWT made Java apps beautiful. OpenJDK should make them ubiquitous. We
finally have an Open Source platform that is widely deployed. The
strong built in standard library and clean OO design patterns of Java
make it a very pleasant host for developing rich client apps. Obvious
areas for improvement here include better layout/form design tools and
closer integration with upstream Linux distributors.&lt;/p&gt;
&lt;p&gt;&lt;img alt="qt-logo" src="http://kev009.com/wp/assets/2009/10/qt-logo.png" title="qt-logo"&gt;&lt;/p&gt;
&lt;p&gt;Somewhere along the line, Trolltech/&lt;a href="http://www.qtsoftware.com/"&gt;QT Software&lt;/a&gt; (now
owned by Nokia) released Jambi -- the complete Qt bindings, GUI
framework, and incredibly rich library -- for Java. Oddly, this
bombshell received little of the community and fanfare I thought it
would or deserves. Indeed, QT Software demoted Jambi from their teir-1
platforms and hopes the community will pick it up. I hope this project
isn't allowed to stagnate as there is a lot of potential here.&lt;/p&gt;
&lt;h2&gt;Web Apps&lt;/h2&gt;
&lt;p&gt;Along the "Enterprise Web Application" lineage of Java, we wound up with
some disgustingly overcomplicated and bloated frameworks for building
web apps. Ruby on Rails and Python Django came about and put a new spin
on the development of rapid and robust web apps. The learning curve of
these frameworks is much less than Java EE and I will go as far as
saying they are more capable because of it.&lt;/p&gt;
&lt;p&gt;By using Java, JSP, and Servlets directly on top of a light
Model-View-Controller, I believe Java is just as compelling as some of
the more popular scripting languages. Developers need to know they can
trim the fat and that there are many advantages to developing in Java,
namely because of the next topic...&lt;/p&gt;
&lt;h2&gt;Dynamic Languages, its all about the VM&lt;/h2&gt;
&lt;p&gt;It's all about the JVM stupid! One of the best features of Java and
.NET are the underlying Virtual Machines. By using JIT compiled VMs,
Java code has a distinct advantage over the common interpreted languages
such as Perl, Python, and PHP. In the case of Java, the resultant is
even naturally crossplatform.&lt;/p&gt;
&lt;p&gt;The really interesting developments here focus on extending the JVM to
syntax and paradigms other than the statically typed C++ lookalike.
&lt;a href="http://clojure.org/"&gt;Clojure&lt;/a&gt; and &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; deliver innovative new techniques while
&lt;a href="http://www.jython.org/"&gt;Jython&lt;/a&gt; and &lt;a href="http://www.jruby.org/"&gt;JRuby&lt;/a&gt; bring these excellent languages to the Java
software platform and virtual machine.&lt;/p&gt;
&lt;p&gt;In short, Java provides everyone with a counter to Microsoft's .NET
CLR. The Java VM has been around the block and tuned by giants such as
Sun, IBM, Oracle, SAP and more.&lt;/p&gt;
&lt;p&gt;I call on the community to discuss how we can encourage use of the JVM
for languages other than Java and build this into a defacto runtime.
Continued tuning and integration with Windows, Mac OS X, and Gnome/KDE
*NIX systems is paramount. Research for easy multi-core development is
also worthwhile. Meanwhile, distributions need to continue packaging
the JRE and make it a default. Individual developers need to be made
aware of "Java: The Good Parts" and myths debunked.&lt;/p&gt;
&lt;h2&gt;Applets, Rich Media, Native Code!?&lt;/h2&gt;
&lt;p&gt;&lt;img alt="javafx_logo" src="http://kev009.com/wp/assets/2009/10/javafx_logo.png" title="javafx_logo"&gt;&lt;/p&gt;
&lt;p&gt;With the release of &lt;a href="http://www.javafx.com/"&gt;Java FX&lt;/a&gt;, widespread deployment
of the JRE, and better browser integration, Java has set the stage for a
comeback to its roots.&lt;/p&gt;
&lt;p&gt;During the late '90s and 2000s, Adobe Flash became the tool of choice
for web animation and interactive pages. It really exploded with the
advent of Youtube and other internet streaming sites making use of the
Flash video format. Unfortunately, Flash player is notoriously
insecure, resource intensive, and crash-prone. It is also not widely
available for the millions of smartphones that have become more
accessible than computers.&lt;/p&gt;
&lt;p&gt;Luckily, there seems to be a shift back to the browser with new
developments in AJAX, JavaScript, and HTML. The \&amp;lt;video&amp;gt; tag will
hopefully make video as easy and portable as graphics are today in the
browser. Clean JavaScript libraries and fast JIT JS engines make it
practical to use this paradigm for many domains.&lt;/p&gt;
&lt;p&gt;Yet one must acknowledge that somewhere along the line, manipulating a
DOM/markup language with a scripting language isn't the most effective
development platform for everything. Google even thinks it poignant to
run x86 machine code in a sandboxed environment in your browser. I
personally fail to see the logic behind this. Java provides a well
evolved, cross-platform solution. Java can run on your ARM powered
Android. Requiring an x86 CPU just seems like the wrong track in this
modern age. Hopefully JavaFX will pick up the slack and return Java to
its roots. I would love to see the demise of the terrible Flash plugin.&lt;/p&gt;
&lt;h2&gt;Future and Conclusion&lt;/h2&gt;
&lt;p&gt;It's time we considered Java for The Good Parts.&lt;/p&gt;
&lt;p&gt;I hope some of my points caused you to reevaluate any bad preconceptions
or past experiences you may have had with Java. Java has undergone
great change since its birth and I think it is capable of becoming the
premier development platform for applications programming of all types.
Particularly interesting are some of the new languages such as Scala and
Clojure. Java has long been a staple in web development, but has
traditionally scared away amateur coders. If you cut the fat, Servlets
and JSP are not much harder to set up than common place scripting
languages. Frameworks such as Grails bring it to parity with Rails or
Django.&lt;/p&gt;
&lt;p&gt;Java underwent a sea change in 2006 with the releasing of the source
code and opening of the development process. Java and the JVM should be
championed by Libre software developers and users alike!&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Gentoo"></category><category term="java"></category><category term="News"></category><category term="Programming"></category><category term="Projects"></category><category term="development"></category><category term="jvm"></category><category term="openjdk"></category><category term="Sun"></category></entry><entry><title>Mobile phones spur cross-platform applications. Open Source is mainstream.</title><link href="http://kev009.com/wp/2009/09/mobile-phones-spur-cross-platform-applications-open-source-is-mainstream/" rel="alternate"></link><published>2009-09-24T01:42:00-07:00</published><updated>2009-09-24T01:42:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-09-24:/wp/2009/09/mobile-phones-spur-cross-platform-applications-open-source-is-mainstream/</id><summary type="html">&lt;p&gt;I had an interesting day today. At school, we had a social event with
an industry governing board and several local software companies in the
Charleston, South Carolina region. Aside from meeting a lot of new
people, I was able to ask some of the industry leaders present about the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I had an interesting day today. At school, we had a social event with
an industry governing board and several local software companies in the
Charleston, South Carolina region. Aside from meeting a lot of new
people, I was able to ask some of the industry leaders present about the
platform and languages they used.&lt;/p&gt;
&lt;p&gt;Perhaps the most interesting was that many Microsoft shops are moving
away from fat client apps to web apps, and not simply because it is a
buzzworthy thing to do. The primary driver is the proliferation of
advanced mobile devices, namely iPhone, Palm Pre, and Blackberry. Two
of the companies I talked to were VB.NET or C# shops and used to do
traditional fat client software. Due partially to the smartphone craze,
they are moving SaaS. They also mentioned the Mac as a rising
popularity, but no Linux or netbooks or anything like that. It's funny
how venerable HTML has become.. now the medium of choice for displaying
cross-platform applicaitons. I doubt anybody ever imagined just how
important HTML and JavaScript would become during their infancy.&lt;/p&gt;
&lt;p&gt;Surprising and delightful to me was the talk of Open Source in the
enterprise. I spoke with two gentlemen from different large defense
contractors and they were spot on with there assertions that Open Source
software is superior in many ways. Both were large Java EE shops and
mentioned how they could check and verify FOSS for security much better
than any proprietary software would allow. They mentioned that the US
Government is one of the largest purchasers of software but even then
working with COTS vendors is difficult and FOSS solves many of these
problems by allowing them to commit back changes. The thing that made
me the most happy was when one rep said that active participation in an
Open Source project was a surefire way to boost a resume to the top of a
stack.&lt;/p&gt;
&lt;p&gt;Another interesting tidbit was that virtualization is synonymous with
VMWare here (everyone specified this by name) even today. I'd go as far
as to say that I'd probably have received strange looks if I had
mentioned KVM or even a heavyweight like Xen or MS Virtual Server.
Aside from Windows, the defense guys talked a lot about Solaris. I
didn't get much reaction when mentioning Linux to anybody, sadly.
(somewhat comically) the non-profits were largely the 100% Microsoft
shops.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category><category term="Linux"></category><category term="Programming"></category></entry><entry><title>Mirroring Fedora</title><link href="http://kev009.com/wp/2009/06/mirroring-fedora/" rel="alternate"></link><published>2009-06-23T04:11:00-07:00</published><updated>2009-06-23T04:11:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-06-23:/wp/2009/06/mirroring-fedora/</id><summary type="html">&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;This post details setting up your own private mirror of Fedora's repos.
There are many ways to do this, but this method is by far the best for
heavy usage. By using MirrorManager, clients in your IP range need no
custom configuration. Roaming laptop users automagically hit your
mirror …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;This post details setting up your own private mirror of Fedora's repos.
There are many ways to do this, but this method is by far the best for
heavy usage. By using MirrorManager, clients in your IP range need no
custom configuration. Roaming laptop users automagically hit your
mirror while on the premises, yet use the public infrastructure
elsewhere. Setup isn't exactly hard, but it isn't well documented so
I'll write about my experience here.&lt;/p&gt;
&lt;p&gt;Some background info.. we have at least 50 Linux desktops, laptops,
servers and VMs running about half Fedora 10 and half Fedora 11 at
work. Due to the number of systems, breadth of packages used, and
desire to quickly update when new releases are out, I decided on a full
mirror setup. If you only have a handful of systems, you may be better
off simply using a general purpose caching proxy like Squid, perhaps
telling MirrorManager to point to it.&lt;/p&gt;
&lt;p&gt;This guide should be used in addition to
&lt;a href="http://fedoraproject.org/wiki/Infrastructure/Mirroring"&gt;http://fedoraproject.org/wiki/Infrastructure/Mirroring&lt;/a&gt; which has some
background info.&lt;/p&gt;
&lt;h3&gt;Initial setup and mirror&lt;/h3&gt;
&lt;p&gt;First, get prepared by installing MirrorManager-client, which contains
the report_mirror script you will need. If your mirror isn't running
Fedora, you can clone the source of this app from their GIT repo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yum install mirrormanager-client
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You'll be using rsync, a sysadmin's best friend, for efficient
mirroring.&lt;/p&gt;
&lt;p&gt;Set up a shell script like mine below (&lt;em&gt;d0mirror.sh&lt;/em&gt;) one level up from
where your mirror will be accessible (http, ftp, rsync, nfs - covered
later). This one mirrors against kernel.org. Choose a mirror close to
you on the Internet.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;rsync -vaH --exclude-from=fedora-excludes.txt --numeric-ids --delete --delete-delay   
--delay-updates rsync://mirrors.kernel.org/fedora-enchilada fedora-mirror
report_mirror
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;And a text file (&lt;em&gt;fedora-excludes.txt&lt;/em&gt;) excluding things you don't
want/need. Take a look through a public mirror and decide if you want
to eliminate anything else. You may want to remove the *.iso line
below if you want users to be able to pull disc images from this box.
Otherwise, this is probably a good list for most people. You can
exclude all of linux/updates/testing/ if you don't enable the testing
repo on any of your machines.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;**/debug/**
**/alpha/**
**/source/**
**/SRPMS/**
**/*.iso
**/ppc/**
**/ppc64/**
linux/core/**
linux/development/**
linux/releases/7/**
linux/releases/8/**
linux/releases/9/**
linux/releases/test/**
linux/updates/8/**
linux/updates/9/**
linux/updates/testing/7/**
linux/updates/testing/8/**
linux/updates/testing/9/**
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Run your shell script and sit back for up to a day or two depending on
your connection speed. My current mirror weighs in at about 80G.&lt;/p&gt;
&lt;h3&gt;Internal distribution&lt;/h3&gt;
&lt;p&gt;While you wait for sync, decide how you want to run the service
internally. HTTP is nice because it is easy for users to browse and
decently quick with keep-alive. Using NFS, rsync, or FTP may be a bit
more efficient if you are worried about this. You can list several URLs
in MirrorManager for the best of all worlds.&lt;/p&gt;
&lt;p&gt;Add the following to your Apache configuration if you decide to use
HTTP:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Alias&lt;span class="w"&gt; &lt;/span&gt;/fedora/&lt;span class="w"&gt; &lt;/span&gt;&amp;quot;/mnt/ar1/fedora-mirror/&amp;quot;

AddType&lt;span class="w"&gt; &lt;/span&gt;application/octet-stream&lt;span class="w"&gt; &lt;/span&gt;.rpm

&lt;span class="nt"&gt;&amp;lt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;/mnt/ar1/fedora-mirror&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;Options&lt;span class="w"&gt; &lt;/span&gt;Indexes&lt;span class="w"&gt; &lt;/span&gt;FollowSymLinks
&lt;span class="w"&gt;    &lt;/span&gt;Order&lt;span class="w"&gt; &lt;/span&gt;allow,deny
&lt;span class="w"&gt;    &lt;/span&gt;Allow&lt;span class="w"&gt; &lt;/span&gt;from&lt;span class="w"&gt; &lt;/span&gt;all
&lt;span class="nt"&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;LocationMatch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;quot;\.(xml|xml\.gz|xml\.asc|sqlite)&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;Header&lt;span class="w"&gt; &lt;/span&gt;set&lt;span class="w"&gt; &lt;/span&gt;Cache-Control&lt;span class="w"&gt; &lt;/span&gt;&amp;quot;must-revalidate&amp;quot;
&lt;span class="w"&gt;    &lt;/span&gt;ExpiresActive&lt;span class="w"&gt; &lt;/span&gt;On
&lt;span class="w"&gt;    &lt;/span&gt;ExpiresDefault&lt;span class="w"&gt; &lt;/span&gt;&amp;quot;now&amp;quot;
&lt;span class="nt"&gt;&amp;lt;/LocationMatch&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Set up any other services of you choice to push that directory out in
addition.&lt;/p&gt;
&lt;h3&gt;Working with MirrorManager client and server&lt;/h3&gt;
&lt;p&gt;Next, open up &lt;em&gt;/etc/mirrormanager-client/report_mirror.conf&lt;/em&gt;. Take
notice of the site name, password, and host name. You will need to set
these up in MirrorManager in a bit. The paths here are all local and
used by report_mirror to check what you have available.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="cp"&gt;# if enabled=0, no data is sent to the database&lt;/span&gt;
&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//admin.fedoraproject.org/mirrormanager/xmlrpc&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;site&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="cp"&gt;# if enabled=0, no data about this site is sent to the database&lt;/span&gt;
&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;yoursitename&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;yourhostpassword&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="cp"&gt;# if enabled=0, no data about this host is sent to the database&lt;/span&gt;
&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;x345&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;a2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;internal&lt;/span&gt;
&lt;span class="cp"&gt;# if user_active=0, no data about this category is given to the public&lt;/span&gt;
&lt;span class="cp"&gt;# This can be used to toggle between serving and not serving data,&lt;/span&gt;
&lt;span class="cp"&gt;# such enabled during the nighttime (when you have more idle bandwidth&lt;/span&gt;
&lt;span class="cp"&gt;# available) and disabled during the daytime.&lt;/span&gt;
&lt;span class="cp"&gt;# not passing it means leave it alone in the database.&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;stats&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="cp"&gt;# Stats are only sent when run with the -s option&lt;/span&gt;
&lt;span class="cp"&gt;# and when this section is enabled.&lt;/span&gt;
&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;apache&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;httpd&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;access_log&lt;/span&gt;
&lt;span class="n"&gt;vsftpd&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;vsftpd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;span class="cp"&gt;# remember to enable log file and transfer logging in rsyncd.conf&lt;/span&gt;
&lt;span class="n"&gt;rsyncd&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;rsyncd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fedora&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Linux&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;mnt&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ar1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fedora&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mirror&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fedora&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EPEL&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pub&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;epel&lt;/span&gt;
&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="cp"&gt;# lesser used categories below&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fedora&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Web&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pub&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fedora&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fedora&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Secondary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Arches&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pub&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fedora&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;secondary&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fedora&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Other&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pub&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;alt&lt;/span&gt;

&lt;span class="cp"&gt;# historical content&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fedora&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Core&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="cp"&gt;# if enabled=0, no data about this host is sent to the database&lt;/span&gt;
&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pub&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fedora&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;core&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Fedora&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Extras&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;enabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pub&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fedora&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;extras&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Log into &lt;a href="https://admin.fedoraproject.org/mirrormanager"&gt;https://admin.fedoraproject.org/mirrormanager&lt;/a&gt;, creating a new
account if you need to. Add a new site with the same name as the config
file from above. You'll set the site password here, and make sure to
check the 'private' box if this is only for internal users. Now, add a
host under this site. The name here should probably be a FQDN of your
actual mirror, even if it is internal only (i.e x345-a2.internal from my
example above). Once that is done, add a "site-local netblock". This
is your public IP network/netmask or network in CIDR notation. If you
only have one public IP, it will be in the format nnn.nnn.nnn.nnn/32.&lt;/p&gt;
&lt;p&gt;Almost done. Now, click Add Category. "Fedora Linux" is the only one
you are concerned with if you followed all the values in this guide so
far. Add the others if needed. Tell them your upstream source
(rsync://mirrors.kernel.org/fedora-enchilada from above) and then your
internal URL (http://x345-a2.internal/fedora/linux for my setup).&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Once your rsync is complete and report_mirror is done, you should see
clients start hitting your box. Don't forget to add your mirror script
(domirror.sh from above -- rsync and report_mirror) to cron! You may
wish to join the private 'fedora-mirrors' mail lists to be informed of
new releases and changes.&lt;/p&gt;
&lt;p&gt;The best thing is that it works across all package requests, including
new machines, roaming users, 'preupgrade', etc. All in all, pretty
nifty! Your users will love you when their upgrades are almost
instant! The Fedora infrastructure is set up very well for mirroring,
public and private, and this is how the project copes with the huge
demand for new releases. Comment away if you need clarification or
help.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Linux"></category><category term="Redhat"></category><category term="fedora 11"></category><category term="mirroring"></category><category term="MirrorManager"></category><category term="rsync"></category></entry><entry><title>Kernel 2.6.30 is a Go</title><link href="http://kev009.com/wp/2009/06/kernel-2630-is-a-go/" rel="alternate"></link><published>2009-06-14T17:46:00-07:00</published><updated>2009-06-14T17:46:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-06-14:/wp/2009/06/kernel-2630-is-a-go/</id><summary type="html">&lt;p&gt;I initially thought this would be a rather uninteresting release,
especially when we learned Xen dom0 didn't make the cut. Following the
changelog line-by-line, this one still didn't seem very interesting to
me. But analyzing the sum of parts, I have to consider 2.6.30 a 'golden'
kernel -- certainly …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I initially thought this would be a rather uninteresting release,
especially when we learned Xen dom0 didn't make the cut. Following the
changelog line-by-line, this one still didn't seem very interesting to
me. But analyzing the sum of parts, I have to consider 2.6.30 a 'golden'
kernel -- certainly the best in a while.&lt;/p&gt;
&lt;p&gt;There is solid improvement top to bottom here. A lot of the new KMS/DRM
stuff from Fedora 11 has worked its way up stream. File system work is
too much to mention, but highlights include relatime, writeback by
default for Extfs, NILFS2, Btrfs development and more. FSCache works as
advertised. Also some groundwork for NFS 4.1, which will eventually
bring us pNFS.&lt;/p&gt;
&lt;p&gt;Boot speed seems fast as ever, but I haven't taken the time to do any
empirical analysis. Your results here will be hardware dependent but
async initialization of certain subsystems is a welcome move in the
right direction.&lt;/p&gt;
&lt;p&gt;Basically, a solid release with a good balance of new stuff but mainly
refinement of existing systems and merging of longstanding patches.&lt;/p&gt;
&lt;p&gt;Kernel Newbies has, as usual, a great change summary:
&lt;a href="http://kernelnewbies.org/Linux_2_6_30"&gt;http://kernelnewbies.org/Linux_2_6_30&lt;/a&gt;&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Gentoo"></category><category term="Linux"></category><category term="Redhat"></category><category term="2.6.30"></category></entry><entry><title>Kernel developers don't get Xen</title><link href="http://kev009.com/wp/2009/06/kernel-developers-dont-get-xen/" rel="alternate"></link><published>2009-06-05T22:55:00-07:00</published><updated>2009-06-05T22:55:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-06-05:/wp/2009/06/kernel-developers-dont-get-xen/</id><summary type="html">&lt;p&gt;The recent bruhaha surrounding &lt;a href="http://xen.org/"&gt;Xen&lt;/a&gt; on &lt;a href="http://lkml.org/lkml/2009/6/2/475"&gt;LKML
(http://lkml.org/lkml/2009/6/2/475)&lt;/a&gt; is really disheartening.
Essentially, the Linux kernel devs are at a disconnect with users. Some
are proposing narrow-minded ideas such as DROPPING software paravirt or
merging Xen as a whole into the kernel.&lt;/p&gt;
&lt;p&gt;I use …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The recent bruhaha surrounding &lt;a href="http://xen.org/"&gt;Xen&lt;/a&gt; on &lt;a href="http://lkml.org/lkml/2009/6/2/475"&gt;LKML
(http://lkml.org/lkml/2009/6/2/475)&lt;/a&gt; is really disheartening.
Essentially, the Linux kernel devs are at a disconnect with users. Some
are proposing narrow-minded ideas such as DROPPING software paravirt or
merging Xen as a whole into the kernel.&lt;/p&gt;
&lt;p&gt;I use Xen for a few primary reasons: it bar none has the best speed --
full software paravirtualization pays dividends here; it is mature; it
works on perfectly good machines that don't happen to have the latest
chips; it does hardware passthrough on these same systems; it has
great live migration that actually works.&lt;/p&gt;
&lt;p&gt;Ingo Molnar wants you to send all your perfectly good enterprise iron to
the landfill even though these systems will last 10+ useful years
without boneheaded software decisions such as this.&lt;/p&gt;
&lt;p&gt;These same FUDsters want to strip the crossplatform nature of Xen dom0
out too. Xen dom0 runs on &lt;a href="http://www.netbsd.org/"&gt;NetBSD&lt;/a&gt; and Solaris. It is a true
hypervisor and will plug into exisiting architectures, and not force you
to use Linux for everything.&lt;/p&gt;
&lt;p&gt;I have to admire all the hoops Jeremy Fitzhardinge has jumped through to
date, as I know my patience is wearing thin.&lt;/p&gt;
&lt;p&gt;Xen powers huge sites such as &lt;a href="http://amazon.com"&gt;Amazon&lt;/a&gt; and services like
&lt;a href="http://linode.com"&gt;linode.com&lt;/a&gt;/&lt;a href="http://slicehost.com"&gt;slicehost.com&lt;/a&gt;. By not having dom0 in the kernel
where distros such as Ubuntu and Fedora can easily integrate it, kernel
devs are doing a disservice to users.&lt;/p&gt;
&lt;p&gt;I use KVM, VMWare, and Virtual Box at work in addition, but Xen is
firmly entrenched in my toolbox. The &lt;a href="http://wiki.xensource.com/xenwiki/XenRoadMap"&gt;roadmap&lt;/a&gt; they have looks great,
and I just don't see a reason for decline in Xen popularity. High
availability in Xen 4.0 is what I've always been waiting for.&lt;/p&gt;
&lt;p&gt;Jeremy has gone to great lengths to work with upstream but keeps getting
shot down and asked to do something else when he meets one requirement.
The solution is to merge Jeremy's conservative dom0 patch set and work
on a technical solution to the patches that the FUDsters consider bad.
It's what the users want!&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Gentoo"></category><category term="Linux"></category><category term="Projects"></category><category term="Redhat"></category><category term="2.6.31"></category><category term="dom0"></category><category term="paravirt_ops"></category><category term="xen"></category></entry><entry><title>El Reg Humor and Java in free software</title><link href="http://kev009.com/wp/2009/05/el-reg-humor-and-java-in-free-software/" rel="alternate"></link><published>2009-05-08T22:45:00-07:00</published><updated>2009-05-08T22:45:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-05-08:/wp/2009/05/el-reg-humor-and-java-in-free-software/</id><summary type="html">&lt;p&gt;The Register has a good &lt;a href="http://www.theregister.co.uk/2009/05/08/dziuba_sphinx/"&gt;article on Sphinx&lt;/a&gt; search with some
entertaining pop-shots at Java and "enterprise software" that got a rise
out of me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Solr is popular with the enterprise crowd, who love its Java. Being a
Java program, Solr includes no shortage of technology whose acronyms
contain the …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;The Register has a good &lt;a href="http://www.theregister.co.uk/2009/05/08/dziuba_sphinx/"&gt;article on Sphinx&lt;/a&gt; search with some
entertaining pop-shots at Java and "enterprise software" that got a rise
out of me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Solr is popular with the enterprise crowd, who love its Java. Being a
Java program, Solr includes no shortage of technology whose acronyms
contain the letters J and X.&lt;/p&gt;
&lt;p&gt;This tickles the enterprise pink, because these sorts of developers love
nothing more than hanging out around a whiteboard drawing boxes and
arrows and, from time to time, writing XML to make it look like they're
doing real work. Solr thrives in this environment, being an Apache
Foundation project, the Apache Foundation, of course, widely known as a
cruel experiment to see what happens when bureaucrats do open source.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Having a bit of experience with Java from academia and a few open source
projects I make use of, I can't help but laugh at how comically and
concisely the editor summed it up.&lt;/p&gt;
&lt;p&gt;By and large, successful open source projects tend to be written in
languages other than Java. The entire GNU/Linux OS stack is primarily C,
with some components using C++ like KDE, OpenOffice and Firefox. On the
ever popular web front, PHP, Ruby, and Python lead the pack.&lt;/p&gt;
&lt;p&gt;I think it turned out this way for a multitude of reasons. When working
on the OS stack, the power and control of C and C++ are hard to beat.
The plethora of libraries and raw speed of these compiled languages set
the bar high for any newcomers. Java exists as a kludge, mildly useful
for desktop apps and mildly useful for web apps while historically
having a lot of problems. Native look and feel have long been the
layman's complaint, though SWT has done a pretty good job there. Of
course, omnipresent Java in the Linux world is relatively new. I think
Java would have been the darling language of client apps had it been
open sourced sooner, but this came about 7 years too late to have a
large impact on shaping the common FOSS userland.&lt;/p&gt;
&lt;p&gt;It is interesting how the open source projects built with Java tend to
be highly bureaucratic and abstract. I think the bottom line is that
FOSS programmers do what they do because it is fun and demand
pragmatism. The "enterprise software" attitude/baggage that many Java
apps and libraries carry are a big turn off to pragmatism and the
hacking culture. The barrier to entry for Java web programming is also
much higher than its "scripting language" competitors, which carry light
and simple frameworks that focus on results, not procedure.&lt;/p&gt;
&lt;p&gt;Java itself isn't that of a bad language. I actually enjoy working with
it in school (...though I think it really isn't appropriate as an
introductory teaching language, shielding important concepts from
students. Maybe a future post?..). When it comes time for real work
though, I consider Python, C, C++ more pragmatic depending on the job
at hand. That, and the fact that most of the common scripting languages
are gaining JIT compilers may accelerate Java toward status as a legacy
language.&lt;/p&gt;
&lt;p&gt;Your thoughts?&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="java"></category><category term="kde"></category><category term="Linux"></category><category term="Programming"></category><category term="c"></category><category term="python"></category><category term="ruby"></category></entry><entry><title>To users that miss xorg.conf and complain about it</title><link href="http://kev009.com/wp/2009/05/to-users-that-miss-xorgconf-and-complain-about-it/" rel="alternate"></link><published>2009-05-07T23:38:00-07:00</published><updated>2009-05-07T23:38:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-05-07:/wp/2009/05/to-users-that-miss-xorgconf-and-complain-about-it/</id><summary type="html">&lt;p&gt;I get requests from users and see questions all the time for "where did
my xorg.conf go in the latest Ubuntu or Fedora?", though it is usually a
bit more of a flame.&lt;/p&gt;
&lt;p&gt;The quick answer... press &lt;strong&gt;Ctrl+Alt+F2&lt;/strong&gt; or similar to log into a TTY
console, or …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I get requests from users and see questions all the time for "where did
my xorg.conf go in the latest Ubuntu or Fedora?", though it is usually a
bit more of a flame.&lt;/p&gt;
&lt;p&gt;The quick answer... press &lt;strong&gt;Ctrl+Alt+F2&lt;/strong&gt; or similar to log into a TTY
console, or type 'init 3' into a root X terminal.&lt;/p&gt;
&lt;p&gt;If you haven't already, log in as root and kill X or type 'init 3' if
you want to be heavy handed. Then run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;X -configure
mv ~/xorg.conf.new /etc/X11/xorg.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;xorg.config in two commands. Run the 'init 5' command to get back to
your GUI login (or kdm or gdm or startx, etc if you know what you are
doing. Worst case remove the .conf and restart.)&lt;/p&gt;
&lt;p&gt;If you are advanced enough to edit an xorg.conf, the above should be a
cakewalk and you shouldn't complain about it.&lt;/p&gt;
&lt;p&gt;Regardless, you should investigate 'xrandr' which makes it simple to do
runtime adjustments.&lt;/p&gt;
&lt;p&gt;If you are a newbie, look into a gui. KDE has KRandRTray which makes
controlling outputs and resolutions a breeze. Don't forget to toggle
the output on with the &lt;strong&gt;Fn&lt;/strong&gt; key if you are a laptop user.&lt;/p&gt;
&lt;p&gt;Needless to say, Xorg is moving in the right direction. Stop
complaining about it.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="Hardware"></category><category term="kde"></category><category term="Linux"></category><category term="Redhat"></category><category term="xorg"></category><category term="xorg.conf"></category></entry><entry><title>FS-Cache merged in Kernel 2.6.30</title><link href="http://kev009.com/wp/2009/04/fs-cache-merged-in-kernel-2630/" rel="alternate"></link><published>2009-04-03T22:22:00-07:00</published><updated>2009-04-03T22:22:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-04-03:/wp/2009/04/fs-cache-merged-in-kernel-2630/</id><summary type="html">&lt;p&gt;FS-Cache has been &lt;a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3cc50ac0dbda5100684e570247782330155d35e0"&gt;merged&lt;/a&gt; into the upcoming kernel 2.6.30. This
allows for a generic caching interface in the kernel for other file
systems. For example, you can use local hard disks to cache data
accessed via NFS, AFS, or CD-Rom. Since these tend to be high-latency
while the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;FS-Cache has been &lt;a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3cc50ac0dbda5100684e570247782330155d35e0"&gt;merged&lt;/a&gt; into the upcoming kernel 2.6.30. This
allows for a generic caching interface in the kernel for other file
systems. For example, you can use local hard disks to cache data
accessed via NFS, AFS, or CD-Rom. Since these tend to be high-latency
while the disks are low latency, it should provide for a nice speedup.&lt;/p&gt;
&lt;p&gt;Of particular interest to me, I contacted maintainer David Howells who
is a Redhat employee. I asked whether this infrastructure would help
with large disk image files stored on NFS -- a common though not
particularly efficient case for VMWare, Xen, KVM, etc. His exact
response was "Quite feasible. As long as you have a local disk on which
to cache the files."&lt;/p&gt;
&lt;p&gt;I am quite happy as I run this setup at work for some production VMs
since it allows for easy migration and backup without the complexity and
cost of a SAN or cluster FS. I look forward to testing when 2.6.30 hits
the stable tree.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Hardware"></category><category term="Linux"></category><category term="Redhat"></category></entry><entry><title>Good Linux File System Developments</title><link href="http://kev009.com/wp/2009/04/good-linux-file-system-developments/" rel="alternate"></link><published>2009-04-01T23:25:00-07:00</published><updated>2009-04-01T23:25:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-04-01:/wp/2009/04/good-linux-file-system-developments/</id><summary type="html">&lt;p&gt;ext4 has sparked good controversy on the LKML. Aside from the recent
delayed alloc and fsync issues, the whole FS stack is getting some much
needed attention. Indeed, Linux file systems are starting to feel like
first class citizens again with ext4 and Btrfs (merged in 2.6.29 for …&lt;/p&gt;</summary><content type="html">&lt;p&gt;ext4 has sparked good controversy on the LKML. Aside from the recent
delayed alloc and fsync issues, the whole FS stack is getting some much
needed attention. Indeed, Linux file systems are starting to feel like
first class citizens again with ext4 and Btrfs (merged in 2.6.29 for
testing!) and the surrounding infrastructure being worked on. A lot of
long overdue problems are being mitigated. Jens Axboe claims 8% single
drive and 25% array speedup with some recent pdflush patches. This is
very good news for all users since disk I/O has had a fast growing gap
with CPU and main memory bandwidth, even with SSDs. The fruits of this
labor are quite visible with recent boot speedups in distros like the
upcoming Fedora 11.&lt;/p&gt;
&lt;p&gt;Mandatory reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://lwn.net/Articles/326471/"&gt;That massive file system thread&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://lwn.net/Articles/326552/"&gt;Flushing out pdflush&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Linux"></category><category term="btrfs"></category><category term="ext4"></category><category term="file systems"></category></entry><entry><title>Arora, a refreshing new Qt/WebKit browser</title><link href="http://kev009.com/wp/2009/02/arora-a-refreshing-new-qtwebkit-browser/" rel="alternate"></link><published>2009-02-26T18:40:00-07:00</published><updated>2009-02-26T18:40:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-02-26:/wp/2009/02/arora-a-refreshing-new-qtwebkit-browser/</id><summary type="html">&lt;p&gt;The Gentoo Qt maintainers have been doing a fantastic job of getting
cutting edge Qt software into shape with the &lt;a href="http://github.com/gentoo-qt/qting-edge/tree/master"&gt;qting-edge overlay&lt;/a&gt;.
I've been running Qt 4.5 since beta1 and am pleased with the direction
it is going. Recently the devs bumped the Arora ebuild to version 0.5 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;The Gentoo Qt maintainers have been doing a fantastic job of getting
cutting edge Qt software into shape with the &lt;a href="http://github.com/gentoo-qt/qting-edge/tree/master"&gt;qting-edge overlay&lt;/a&gt;.
I've been running Qt 4.5 since beta1 and am pleased with the direction
it is going. Recently the devs bumped the Arora ebuild to version 0.5.
&lt;a href="http://code.google.com/p/arora/"&gt;Arora&lt;/a&gt; is a lightweight browser based on Qt and WebKit.&lt;/p&gt;
&lt;p&gt;I must say, I am impressed. This browser is lightning fast. The
interface is pleasing, yet minimalist. You get all the benefits of
recent WebKit, and the nice cross-platform nature of Qt. It feels much
faster than Konqueror4.2, and the recent WebKit engine means better
compatibility.&lt;/p&gt;
&lt;p&gt;It works with all the sites I've thrown at it so far and performs great
on the Acid 3 test.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2009/02/acid31.png"&gt;&lt;img alt="Arora 0.5 Acid3 Test - 100/100" src="http://kev009.com/wp/assets/2009/02/acid31-300x243.png" title="Arora 0.5 Acid3 Test - 100/100"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All in all it reminds me of Firefox's early days. Very mean and lean.
Firefox 3.1 beta2 has served me pretty well, so I don't think I'll
abandon it yet, but WebKit browsers are becoming quite compelling.&lt;/p&gt;
&lt;p&gt;The WebKit devs are also pushing some interesting new ideas out with CSS
animation. This example gives &lt;a href="http://webkit.org/blog-files/leaves/index.html"&gt;Flash-esque falling leaves&lt;/a&gt;. Maybe we
will see less reliance on Flash in the future with the new video/audio
tags and work such as this. It would be nice to move presentation back
into structured [X]HTML and CSS, which is portable, easier to parse, and
light weight.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2009/02/arora-leaves.png"&gt;&lt;img alt="Leaves CSS Animation" src="http://kev009.com/wp/assets/2009/02/arora-leaves-300x290.png" title="Leaves CSS Animation"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you are on Gentoo, bump to Qt 4.5rc1 and take a look easily (both are
in portage):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;emerge -av arora
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;I've seen it hit Fedora Rawhide recently as well.&lt;/p&gt;
&lt;p&gt;Only one problem: icon is a bit conspicuous :-P&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/arora/"&gt;&lt;img alt="Arora Icon" src="http://i25.tinypic.com/2z8dlpv.png"&gt;&lt;/a&gt;&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="kde"></category><category term="Linux"></category></entry><entry><title>Good open source journalism</title><link href="http://kev009.com/wp/2009/02/good-open-source-journalism/" rel="alternate"></link><published>2009-02-21T23:40:00-07:00</published><updated>2009-02-21T23:40:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-02-21:/wp/2009/02/good-open-source-journalism/</id><summary type="html">&lt;p&gt;I have to hand it to the guys at &lt;a href="http://www.h-online.com/open/"&gt;The H Open&lt;/a&gt; (formally Heise Online
Open Source Edition). They have excellent coverage of the latest
happenings in FOSS software. They also have great coverage of software
releases and break it down to the important new bits. Finally, it is
not …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I have to hand it to the guys at &lt;a href="http://www.h-online.com/open/"&gt;The H Open&lt;/a&gt; (formally Heise Online
Open Source Edition). They have excellent coverage of the latest
happenings in FOSS software. They also have great coverage of software
releases and break it down to the important new bits. Finally, it is
not overburdened with legal BS or thoughtless benchmarks like many other
Linux news sites.&lt;/p&gt;
&lt;p&gt;In short, the content is very relevant and professional. It is worth
picking up their RSS feed.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Linux"></category></entry><entry><title>KDE 4.2 on Gentoo</title><link href="http://kev009.com/wp/2009/01/kde-42-on-gentoo/" rel="alternate"></link><published>2009-01-27T15:18:00-07:00</published><updated>2009-01-27T15:18:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-01-27:/wp/2009/01/kde-42-on-gentoo/</id><summary type="html">&lt;p&gt;&lt;a href="http://kde.org/announcements/4.2/index.php"&gt;KDE 4.2 is out&lt;/a&gt; officially. The ebuilds for Gentoo have been ready
for a while. This is a truly fantastic release. If you've ever made an
opinion about KDE in the past, I encourage you to give it another go.&lt;/p&gt;
&lt;p&gt;My &lt;a href="http://kev009.com/wp/2008/12/kde-4-2-on-gentoo/"&gt;beta1 review&lt;/a&gt; back in December sums up most …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://kde.org/announcements/4.2/index.php"&gt;KDE 4.2 is out&lt;/a&gt; officially. The ebuilds for Gentoo have been ready
for a while. This is a truly fantastic release. If you've ever made an
opinion about KDE in the past, I encourage you to give it another go.&lt;/p&gt;
&lt;p&gt;My &lt;a href="http://kev009.com/wp/2008/12/kde-4-2-on-gentoo/"&gt;beta1 review&lt;/a&gt; back in December sums up most of my thoughts on the
release. There isn't anything significantly changed since, just lots of
polish and bug fixing. Everything has been stable and functional since
I've been using it in the RC phase. This is a worthy opponent to KDE
3.5, GNOME, Windows and OS X.&lt;/p&gt;
&lt;p&gt;Thanks again to the Gentoo KDE team. The ebuilds are in great shape!&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="kde"></category><category term="News"></category></entry><entry><title>One Small Step for QT, One Giant Leap for Free Software</title><link href="http://kev009.com/wp/2009/01/one-small-step-for-qt-one-giant-leap-for-free-software/" rel="alternate"></link><published>2009-01-16T09:57:00-07:00</published><updated>2009-01-16T09:57:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-01-16:/wp/2009/01/one-small-step-for-qt-one-giant-leap-for-free-software/</id><summary type="html">&lt;p&gt;&lt;a href="http://www.qtsoftware.com/"&gt;QT Software&lt;/a&gt;, under the graces of Nokia, has released the superb QT
cross-platform toolkit under the LGPL.&lt;/p&gt;
&lt;p&gt;This. is. &lt;strong&gt;HUGE&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For the libre software purist, this still benefits you, if indirectly.
Companies that make changes to the toolkit must still submit patches.
More influential, GPL incompatible software may now readily …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://www.qtsoftware.com/"&gt;QT Software&lt;/a&gt;, under the graces of Nokia, has released the superb QT
cross-platform toolkit under the LGPL.&lt;/p&gt;
&lt;p&gt;This. is. &lt;strong&gt;HUGE&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For the libre software purist, this still benefits you, if indirectly.
Companies that make changes to the toolkit must still submit patches.
More influential, GPL incompatible software may now readily use QT for
free. This will likely foster more QT centric developers, boost
adoption of the underlying stack (Linux, etc), and lower the barrier for
vendors to release cross-platform tools.&lt;/p&gt;
&lt;p&gt;From a Nokia business perspective, it makes perfect sense and makes the
whole thing that much more beautiful. "QT Everywhere" is really a
possibility now. And, it's beneficial to Nokia as well as the ecosystem
they are enriching. The more QT developers, the bigger the talent pool
for Nokia software. The more contributors, the better the toolkit.
Win. A small company like Trolltech could not afford to do this, but to
a big dog like Nokia, the revenue from commercial licensing is
insignificant and unimportant compared to device sales.&lt;/p&gt;
&lt;p&gt;I know the company I work for, &lt;a href="http://www.analograils.com/"&gt;Analog Rails&lt;/a&gt;, will be able to take
advantage of the license switch. Being previous commercial QT
customers, it was expensive to juggle around machines to maintain
compliance. For companies like VMWare that deploy cross-platform
software and maintain their own cross-platform extensions, this surely
must be compelling. I say, the more the merrier!&lt;/p&gt;
&lt;p&gt;What a great day for free software, computing, and life in general :-) .&lt;/p&gt;
&lt;p&gt;Ars Technica has outstanding coverage of the news:
&lt;a href="http://arstechnica.com/news.ars/post/20090114-nokia-qt-lgpl-switch-huge-win-for-cross-platform-development.html"&gt;http://arstechnica.com/news.ars/post/20090114-nokia-qt-lgpl-switch-huge-win-for-cross-platform-development.html&lt;/a&gt;&lt;/p&gt;</content><category term="misc"></category><category term="Computer Music"></category><category term="Computing"></category><category term="Gentoo"></category><category term="kde"></category><category term="Linux"></category><category term="Programming"></category><category term="Project"></category></entry><entry><title>Welcome back, Palm! The New Palm Pre</title><link href="http://kev009.com/wp/2009/01/welcome-back-palm-the-new-palm-pre/" rel="alternate"></link><published>2009-01-08T20:10:00-07:00</published><updated>2009-01-08T20:10:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-01-08:/wp/2009/01/welcome-back-palm-the-new-palm-pre/</id><summary type="html">&lt;p&gt;I've always been a fan of Palm hardware, and even had a soft spot for
PalmOS until it was left to rot for so long.&lt;/p&gt;
&lt;p&gt;Indeed, my Palm 800w is a fine piece of hardware even though it was
quickly eclipsed by the Treo Pro, but Windows Mobile has been …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've always been a fan of Palm hardware, and even had a soft spot for
PalmOS until it was left to rot for so long.&lt;/p&gt;
&lt;p&gt;Indeed, my Palm 800w is a fine piece of hardware even though it was
quickly eclipsed by the Treo Pro, but Windows Mobile has been really
painful. It is slow, bloated, and crashes frequently. It has zero
intuition and single-handed operation is out of the question. Worst of
all, there seems to be a lack of useful or quality apps that were
abundant in PalmOS. I am a bit mad that I paid $500 for such a lemon.&lt;/p&gt;
&lt;p&gt;Enter the Pre, which looks like just the thing to get me back on board
with Palm and get them back in the game.&lt;/p&gt;
&lt;p&gt;The hardware design looks beautiful, giving a large screen but keeping
the tactile and speed of a keyboard (this is the iPhone's biggest weak
spot IMHO). It looks like typical form factor for this style of phone,
similar to the new Blackberry, so nothing earth shattering there, but
the OS looks top notch and is based on Linux. I think if Palm is able
to deliver, they will once again be competitive, and they will keep me
as a customer.&lt;/p&gt;
&lt;p&gt;Take a look at these links for a nice report:  &lt;/p&gt;
&lt;p&gt;&lt;a href="http://arstechnica.com/news.ars/post/20090108-palm-launches-new-handset-pre-operating-system-at-ces.html"&gt;http://arstechnica.com/news.ars/post/20090108-palm-launches-new-handset-pre-operating-system-at-ces.html&lt;/a&gt;&lt;br&gt;
&lt;a href="http://www.palm.com/us/products/phones/pre/index.html"&gt;http://www.palm.com/us/products/phones/pre/index.html&lt;/a&gt;&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category><category term="Linux"></category><category term="Palm"></category></entry><entry><title>I dream of pervasive virtualization...</title><link href="http://kev009.com/wp/2009/01/i-dream-of-pervasive-virtualization/" rel="alternate"></link><published>2009-01-02T12:09:00-07:00</published><updated>2009-01-02T12:09:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-01-02:/wp/2009/01/i-dream-of-pervasive-virtualization/</id><summary type="html">&lt;p&gt;I dream of a day where virtualization is pervasive.&lt;/p&gt;
&lt;p&gt;Instead of thinking about services in terms of servers, CPUs or directly
mapped resources, I should be able to to add virtual machines in terms
of guaranteed throughput rate over a whole grid. Scaling out should be
as easy as adding …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I dream of a day where virtualization is pervasive.&lt;/p&gt;
&lt;p&gt;Instead of thinking about services in terms of servers, CPUs or directly
mapped resources, I should be able to to add virtual machines in terms
of guaranteed throughput rate over a whole grid. Scaling out should be
as easy as adding a blade or racking another server.&lt;/p&gt;
&lt;p&gt;At the low level, I should have the option of running N+N redundancy.
That is, the VM should run in lockstep across multiple machines - so if
it is running on 2 vcpus, 4 in total would be used. This would allow
for any node to fail. And the VM should be an aggregate of the low
level hardware - e.g. a VM grid across 4 8-core servers should scale
near-linearly when a single OS instance is running 32 processes.&lt;/p&gt;
&lt;p&gt;Current solutions only attempt to do some of the tasks above, and most
fail miserably. IBM mainframes have been doing it for ages.&lt;/p&gt;
&lt;p&gt;If I had the time, I know I could build software to do this better than
anyone else. All the puzzle pieces are there, especially the tough ones
like hypervisors and Infiniband. This could have been done at least 3
years ago. I bet it will take the industry 3-4 years yet to get
anywhere close.&lt;/p&gt;
&lt;p&gt;This is a real virtual datacenter.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Hardware"></category><category term="Linux"></category><category term="Programming"></category><category term="Projects"></category></entry><entry><title>Xen 3.3 in RHEL/CentOS 5 and more Link Aggregation Fun</title><link href="http://kev009.com/wp/2009/01/xen-33-in-rhelcentos-5-and-more-link-aggregation-fun/" rel="alternate"></link><published>2009-01-01T07:12:00-07:00</published><updated>2009-01-01T07:12:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2009-01-01:/wp/2009/01/xen-33-in-rhelcentos-5-and-more-link-aggregation-fun/</id><summary type="html">&lt;p&gt;RHEL 5 includes the now ancient Xen 3.0 hypervisior. A lot has been
improved since then, especially in the current 3.3 release.
Additionally, RedHat now owns the company behind KVM, so it is unlikely
they will spend much time backporting Xen stuff for RHEL 5.3 or the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;RHEL 5 includes the now ancient Xen 3.0 hypervisior. A lot has been
improved since then, especially in the current 3.3 release.
Additionally, RedHat now owns the company behind KVM, so it is unlikely
they will spend much time backporting Xen stuff for RHEL 5.3 or the
likes.&lt;/p&gt;
&lt;h3&gt;Why Xen?&lt;/h3&gt;
&lt;p&gt;Xen is a proven hypervisor. It works well on lots of hardware,
including servers without hardware virtualization and older 64-bit
Opterons that wont run 64-bit guests in the likes of VMWare. Since the
OS is usually paravirtualized, performance is top notch. By making an
OS aware of the environment it is running in, you can optimize it for
virtualization. KVM is playing catchup here, realizing that
paravirtualization is still ideal for many things.&lt;/p&gt;
&lt;h3&gt;How..&lt;/h3&gt;
&lt;p&gt;Okay, so we are using or want to use Xen. Others have already built the
packages we need, thankfully!&lt;/p&gt;
&lt;p&gt;Head over to &lt;a href="http://www.gitco.de/repo/"&gt;http://www.gitco.de/repo/&lt;/a&gt; and grab the repo for your
arch. (Most likely wget
http://www.gitco.de/repo/CentOS5-GITCO_x86_64.repo in
/etc/yum.repos.d/ for the uninitiated).&lt;/p&gt;
&lt;p&gt;If you already have Xen installed, you may need to remove and readd it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yum groupremove Virtualization
yum groupinstall Virtualization
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You'll also get some updated tools like Virtual Machine Monitor 0.6.0
that make it easier to install newer guests such as Fedora 10 or
Ubuntu. Sweet!&lt;/p&gt;
&lt;p&gt;Double check /etc/sysconfig/kernel. It should be set to kernel-xen.
Likewise, check /boot/grub.conf and make sure that the Xen kernel is the
default if the aforementioned was not done beforehand.&lt;/p&gt;
&lt;p&gt;Reboot!&lt;/p&gt;
&lt;h3&gt;Xen 3.3 and Link Bonding&lt;/h3&gt;
&lt;p&gt;See my &lt;a href="http://kev009.com/wp/2008/12/link-bonding-craziness-in-rhelcentos-5/"&gt;previous post&lt;/a&gt; for general information, but it gets harder.&lt;/p&gt;
&lt;p&gt;This one is a nightmare. In my &lt;a href="http://kev009.com/wp/2008/12/link-bonding-craziness-in-rhelcentos-5/"&gt;previous post&lt;/a&gt;, I detailed how to get
Xen to work with link aggregation with Xen 3.0. Well, it doesn't work
in 3.3. Xen decides that it still owns eth0 and completely destroys
your bond0 setup.&lt;/p&gt;
&lt;p&gt;Like &lt;a href="http://henning.schmiedehausen.org/wingnut-diaries/archives/86"&gt;these people&lt;/a&gt;, I've come to the conclusion that the integrated
network scripts suck. This is alarming since you'd think link bonded
setups would be the norm for Xen setups.&lt;/p&gt;
&lt;p&gt;The quick fix is to let the OS handle networking. We do that like so:
add a br0 interface and tell the bond to bridge with it.&lt;/p&gt;
&lt;p&gt;File /etc/sysconfig/network-scripts/ifcfg-br0&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;DEVICE=br0
ONBOOT=yes
BOOTPROTO=none
IPADDR=10.0.6.201
NETMASK=255.255.255.0
GATEWAY=10.0.6.1
NO_ALIASROUTING=yes
TYPE=Bridge
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Then, edit your /etc/sysconfig/network-scripts/ifcfg-bond0 and add
"BRIDGE=br0" and comment out any IP related information (since you are
now defining that in the bridge. Head over to /etc/sysctl.conf and add:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;net.ipv4.ip_forward = 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Now, edit your Xen VMs in /etc/xen/ or /etc/xen/auto and change xenbr0
to br0:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;vif = [ 'mac=ee:cc:aa:88:66:44, bridge=br0', ]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Okay, now disable the Xen networking garbage. Open
/etc/xen/xend-config.sxp and comment out anything that looks like
(network-script ....).&lt;/p&gt;
&lt;p&gt;Almost done, but wait! RHEL 5.2 has a bug that prevents the bridge
coming up on a bonded interface. Hopefully this will make the 5.3 cut
or be pushed to 5.2, but until then go &lt;a href="https://bugzilla.redhat.com/show_bug.cgi?id=463014"&gt;here&lt;/a&gt;. Download the new patch
into /etc/sysconfig/network-scripts/ and run patch -p0 \&amp;lt; ifup-eth.patch
for instance.&lt;/p&gt;
&lt;h3&gt;Finish&lt;/h3&gt;
&lt;p&gt;Reboot. You now have Xen 3.3 goodness on a big Ethernet channel! Post
a comment if you have any trouble or questions.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Datacenter"></category><category term="Hardware"></category><category term="Linux"></category><category term="Redhat"></category></entry><entry><title>Link Bonding Craziness in RHEL/Centos 5</title><link href="http://kev009.com/wp/2008/12/link-bonding-craziness-in-rhelcentos-5/" rel="alternate"></link><published>2008-12-30T03:27:00-07:00</published><updated>2008-12-30T03:27:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-12-30:/wp/2008/12/link-bonding-craziness-in-rhelcentos-5/</id><summary type="html">&lt;p&gt;I just went through hell in a handbasket trying to get 802.3ad Link
Aggregation set up on a Centos 5.2 Xen box. Setting up link aggregation
itself isn't that bad -
&lt;a href="http://wiki.centos.org/TipsAndTricks/BondingInterfaces"&gt;http://wiki.centos.org/TipsAndTricks/BondingInterfaces&lt;/a&gt; for a simple
guide (after your managed switch is configd) - but what …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I just went through hell in a handbasket trying to get 802.3ad Link
Aggregation set up on a Centos 5.2 Xen box. Setting up link aggregation
itself isn't that bad -
&lt;a href="http://wiki.centos.org/TipsAndTricks/BondingInterfaces"&gt;http://wiki.centos.org/TipsAndTricks/BondingInterfaces&lt;/a&gt; for a simple
guide (after your managed switch is configd) - but what ever I did, I
was unable to get both interfaces simultaneously active.&lt;/p&gt;
&lt;p&gt;About the only useful debugging info I got was that the MAC was in use.
I was puzzled because as far as I know, link agg takes over the primary
MAC and sets that up for both NICs. Furthermore, the same exact
hardware was working great on Fedora 10.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nl"&gt;bonding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bond0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Warning&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;permanent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HWaddr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eth0&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ADDR&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;still&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;use&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bond0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HWaddr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eth0&lt;/span&gt;
&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;different&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;avoid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;conflicts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nl"&gt;bonding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bond0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;releasing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eth0&lt;/span&gt;
&lt;span class="nl"&gt;bonding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bond0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;making&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eth1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;one&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nl"&gt;bonding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bond0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Removing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slave&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eth1&lt;/span&gt;
&lt;span class="nl"&gt;bonding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bond0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;releasing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eth1&lt;/span&gt;
&lt;span class="n"&gt;ADDRCONF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NETDEV_UP&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bond0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ready&lt;/span&gt;
&lt;span class="nl"&gt;bonding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bond0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Adding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;slave&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Luckily, I stumbled across this &lt;a href="http://bugs.centos.org/view.php?id=2404"&gt;bug report&lt;/a&gt;. If you scroll down to
the last comment, this appears to be a Xen specific issue. By default
Xen tries to set its bridge up on eth0, and I assume this prevents the
kernel bonding driver from taking over the NIC. By opening up
/etc/xen/xend-config.sxp and adding:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;(network-script &amp;#39;network-bridge netdev=bond0&amp;#39;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Xen will bridge to the bond0 interface, and everything will work as
expected.&lt;/p&gt;
&lt;p&gt;Another trick I had to do was add a start delay to the networking
scripts. This is useful if your hardware is crap (cough Broadcom), you
need a dhcp lease and it fails, or you are running STP, link aggr.,
etc. On Fedora, RHEL, and derivitives this is accomplished by adding
the NETWORKDELAY directive to /etc/sysconfig/network:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;NETWORKING=yes
NETWORKDELAY=31
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you need more granularity, you can set delays to specific adapters in
the /etc/sysconfig/ifcfg-{x} files with the LINKDELAY directive.&lt;/p&gt;
&lt;p&gt;Just a couple of hard lesssons from the trenches, hopefully this will
save someone else some time.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category><category term="Linux"></category><category term="Redhat"></category></entry><entry><title>How to upgrade to ext4 in place</title><link href="http://kev009.com/wp/2008/12/how-to-upgrade-to-ext4-in-place/" rel="alternate"></link><published>2008-12-24T05:19:00-07:00</published><updated>2008-12-24T05:19:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-12-24:/wp/2008/12/how-to-upgrade-to-ext4-in-place/</id><summary type="html">&lt;p&gt;Here's how you upgrade to ext4. The process is pretty easy, but
requires an fsck which means unmounting or rebooting if the file system
is in use.&lt;/p&gt;
&lt;p&gt;Make sure you are using at least e2fstools 1.41.3 and kernel 2.6.28 (or
a vendor kernel with latest ext4 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Here's how you upgrade to ext4. The process is pretty easy, but
requires an fsck which means unmounting or rebooting if the file system
is in use.&lt;/p&gt;
&lt;p&gt;Make sure you are using at least e2fstools 1.41.3 and kernel 2.6.28 (or
a vendor kernel with latest ext4 patches applied)! Also, it's probably a
good idea to have proper backups (really!). ext4 has just been declared
stable, but what that really means is that the battle hardening has just
begun. I've done several heavily used systems without fault so far
though, so it's probably good enough for your desktop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WARNING: DON'T CONVERT YOUR /boot PARTITION.&lt;/strong&gt; Right now, there is no
stable version of grub with ext3 support. Even if there was, it really
won't gain you anything :-).&lt;/p&gt;
&lt;p&gt;Run tune2fs, e.g.:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;tune2fs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sparse_super&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;filetype&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;resize_inode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;dir_index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;ext_attr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;has_journal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;
&lt;span class="n"&gt;extents&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;huge_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;flex_bg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;uninit_bg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;dir_nlink&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;extra_isize&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sd&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;/blockquote&gt;
&lt;p&gt;Those are the default options for an ext4 file system if you were to
create it with mkfs.ext4 (e2fsprogs 1.41.3 - see /etc/mke2fs.conf). I'm
getting pretty damn good performance with this! The '-I 256' option
sets 256 bit inodes, which most recent ext3 FSs use already. If this is
the case, and you get a message telling you so, remove this option.
Note that extents will make the FS backwards &lt;strong&gt;INCOMPATIBLE&lt;/strong&gt; with ext3.&lt;/p&gt;
&lt;p&gt;Next, edit /etc/fstab, e.g.:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/dev/vg/home /home ext4 defaults 0 0&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Either unmount and mount or reboot your system. tune2fs marks the fs as
dirty and performs a fsck and conversion.&lt;br&gt;
&lt;strong&gt;NOTICE:&lt;/strong&gt; distros with initrds may need to be regenerated or you
won't be able to mount your root file system. In Fedora (replace kernel
version with your own):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cd /boot
mv initrd-2.6.27.7-134.fc10.i686.img initrd-2.6.27.7-134.fc10.i686.img.old
mkinitrd initrd-2.6.27.7-134.fc10.i686.img initrd-2.6.27.7-134.fc10.i686.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;That's all there is to it. Stay tuned for future ext4 developments like
online defragmentation.&lt;/p&gt;
&lt;p&gt;Also, ext{2,3,4} reserve 5% of space for root in case the drive fills
up. On large modern drives, this can be excessive (e.g: 50GB on a 1TB
disk). Consider running 'tune2fs -m 1 /dev/sd[x][n]' to reduce this to
1%.&lt;/p&gt;
&lt;p&gt;For more information and tweaking:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Documentation/filesystems/ext4.txt from the latest kernel sources&lt;/li&gt;
&lt;li&gt;&lt;a href="http://ext4.wiki.kernel.org/index.php/Main_Page"&gt;http://ext4.wiki.kernel.org/index.php/Main_Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;man tune2fs&lt;/li&gt;
&lt;li&gt;&lt;a href="http://e2fsprogs.sourceforge.net/"&gt;http://e2fsprogs.sourceforge.net/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="kde"></category><category term="Linux"></category><category term="Programming"></category><category term="Projects"></category></entry><entry><title>NIN Echoplex live rehearsal</title><link href="http://kev009.com/wp/2008/12/nin-echoplex-live-rehearsal/" rel="alternate"></link><published>2008-12-19T04:12:00-07:00</published><updated>2008-12-19T04:12:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-12-19:/wp/2008/12/nin-echoplex-live-rehearsal/</id><summary type="html">&lt;p&gt;One of my favorite blogs, &lt;a href="http://createdigitalmusic.com"&gt;Create Digital Music&lt;/a&gt;, ran a piece on NIN
doing a rehearsal for Echoplex.&lt;/p&gt;
&lt;p&gt;It's neat to see the Lemur, a touch screen MIDI controller, used live by
the drummer. Overall the song structure is relatively simple but it is
amazing how well they keep together …&lt;/p&gt;</summary><content type="html">&lt;p&gt;One of my favorite blogs, &lt;a href="http://createdigitalmusic.com"&gt;Create Digital Music&lt;/a&gt;, ran a piece on NIN
doing a rehearsal for Echoplex.&lt;/p&gt;
&lt;p&gt;It's neat to see the Lemur, a touch screen MIDI controller, used live by
the drummer. Overall the song structure is relatively simple but it is
amazing how well they keep together. Notice the dude manning their
monitoring setup full time and the in ear monitors 8-)?&lt;/p&gt;
&lt;p&gt;I need to get a hold of an old touchscreen PC and see if I can convert
it into a Linux MIDI controller with Open Sound Control and maybe some
custom Java. It's sad because I had something perfect for the task a
few years ago, an IBM Industrial panel PC, basically a laptop in a
bulletproof magnesium case with touchscreen :-(.&lt;/p&gt;
&lt;p&gt;If you are interested in this sort of thing, click through, otherwise
enjoy the tune below.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://createdigitalmusic.com/2008/12/17/how-they-work-nin-echoplex-rehearsing-live-with-lemur/"&gt;http://createdigitalmusic.com/2008/12/17/how-they-work-nin-echoplex-rehearsing-live-with-lemur/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also, check out &lt;a href="http://www.linuxjournal.com/content/java-sound-music-software-linux-part-1"&gt;Linux Journal's Java Sound and Music&lt;/a&gt; three part
series.&lt;/p&gt;
&lt;p&gt;
&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="400" height="225" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;
&lt;param name="allowfullscreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=2300016&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1"&gt;&lt;/param&gt;

&lt;embed type="application/x-shockwave-flash" width="400" height="225" src="http://vimeo.com/moogaloop.swf?clip_id=2300016&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"&gt;
&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://vimeo.com/2300016"&gt;NIN - Echoplex - Live at Rehearsals July 2008&lt;/a&gt; from &lt;a href="http://vimeo.com/ninofficial"&gt;Nine Inch Nails&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</content><category term="misc"></category><category term="Computer Music"></category><category term="Linux"></category></entry><entry><title>Linux and the PC Mentaility</title><link href="http://kev009.com/wp/2008/12/linux-and-the-pc-mentaility/" rel="alternate"></link><published>2008-12-17T22:41:00-07:00</published><updated>2008-12-17T22:41:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-12-17:/wp/2008/12/linux-and-the-pc-mentaility/</id><summary type="html">&lt;p&gt;Here's a minor thought dump of the moment: no hard numbers, just some
general observations over the past year or two.&lt;/p&gt;
&lt;p&gt;I've heard the comparison between Linux and other UNIX like OSes a few
times in the past. Of course it is a bit hard to compare "Linux" -
which is …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Here's a minor thought dump of the moment: no hard numbers, just some
general observations over the past year or two.&lt;/p&gt;
&lt;p&gt;I've heard the comparison between Linux and other UNIX like OSes a few
times in the past. Of course it is a bit hard to compare "Linux" -
which is a kernel - and the others which most often are complete
operating systems. Many times they even share a lot of GNU userland
tools, so I will disregard userland.&lt;/p&gt;
&lt;p&gt;The general feel I get from looking at some parts of Linux and its
development process is that of the PC world. Build cheap, throwaway
solutions and rip and replace later. Looking at things like the
scheduler, FreeBSD was able to grow similarly advanced solution in a
much more organized fashion without ripping and replacing this critical
component several times and has far less developers. *BSD has a more
traditional UNIX process from the days of the minicomputer and
professional workstation, while Linux is deeply rooted in PC culture.&lt;/p&gt;
&lt;p&gt;Aside from the scheduler, there seem to be other places where
development has tarnish before shine. hrtimers, dyntick, CFS, and SLUB
are some of the more controversial moves in the past year or so.
Indeed, kernels 2.6.23+ didn't "feel" as polished as the few leading up
to it and "felt" less responsive to me when playing audio or video
concurrent with other tasks like compiling - something CFS was supposed
to fix, but I never had a problem with before. Going into 2.6.28, these
big changes are starting to settle down. Things once again "feel"
better, more stable, and better performing - so I guess it is just a
phase.&lt;/p&gt;
&lt;p&gt;From a software engineering standpoint, it is interesting to ponder how
to improve the process. One thing Linux has that many other projects
don't is an enormous amount of contributors. A lot of people and
companies are trying to different things with the kernel. It is
important for them to get their code into the kernel as soon as
possible, because it is such a fast moving process, but new features
lead to bugs. Linux-next appears to be helping with keeping in progress
trees so that developers can explore ideas before pushing to mainline,
and Adrian Bunk's idea of the "long time support" kernels for those of
us that don't run large distro kernels seem like a step in the right
direction. I do wish he would forgo 2.6.27 and base it on 2.6.28 for
the next LTS though. 2.6.27 has had quite a lot of major patching done
since release and as I said earlier, 2.6.28 just looks better so far.&lt;/p&gt;
&lt;p&gt;Another point: technically superior solutions don't always get favored.
I've said before that I think there were better choices for file systems
than ext3 for the past 8 or so years. CFS vs. RDSL is another example.
The latest is SCST vs. SGST (&lt;a href="http://lwn.net/Articles/311344/"&gt;http://lwn.net/Articles/311344/&lt;/a&gt;). SCST
is clearly the only solution for the enterprise where Fibre Channel and
Infiniband are likely to be used. And Ingo and Thomas are at it again
reinventing the wheel with performance counters.&lt;/p&gt;
&lt;p&gt;The counterargument is that Linux runs on most of the worlds
supercomputers all the way down to small critical embedded systems.
Most of these are running obsolete kernels with heavy vendor backports
though.&lt;/p&gt;
&lt;p&gt;Running the latest kernel is fun; after all I am a Gentoo user so I
don't mind when things break, but for truly mission critical tasks I
would not be afraid to look outside of Linux to BSD. Ironically,
Solaris, once the stalwart of enterprise, seems to be embracing the
Linux mentality.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="Linux"></category></entry><entry><title>USB 3.0 on Linux</title><link href="http://kev009.com/wp/2008/12/usb-30-on-linux/" rel="alternate"></link><published>2008-12-14T17:10:00-07:00</published><updated>2008-12-14T17:10:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-12-14:/wp/2008/12/usb-30-on-linux/</id><summary type="html">&lt;p&gt;Take a look at this Intel developer's blog:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sarah.thesharps.us/2008-12-07-13-35.cherry"&gt;http://sarah.thesharps.us/2008-12-07-13-35.cherry&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;embed id="VideoPlayback" src="http://video.google.com/googleplayer.swf?docid=-6015621370324169356&amp;amp;hl=en&amp;amp;fs=true" style="width:400px;height:326px" allowfullscreen="true" allowscriptaccess="always" type="application/x-shockwave-flash"&gt;
&lt;/embed&gt;
&lt;/p&gt;
&lt;p&gt;The video &lt;strong&gt;shows a USB flash drive transfering video at 125MB/s&lt;/strong&gt;! To
give you an idea of this speed, it is likely more than your hard disk
can put out which is probably around 80MB …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Take a look at this Intel developer's blog:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://sarah.thesharps.us/2008-12-07-13-35.cherry"&gt;http://sarah.thesharps.us/2008-12-07-13-35.cherry&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;embed id="VideoPlayback" src="http://video.google.com/googleplayer.swf?docid=-6015621370324169356&amp;amp;hl=en&amp;amp;fs=true" style="width:400px;height:326px" allowfullscreen="true" allowscriptaccess="always" type="application/x-shockwave-flash"&gt;
&lt;/embed&gt;
&lt;/p&gt;
&lt;p&gt;The video &lt;strong&gt;shows a USB flash drive transfering video at 125MB/s&lt;/strong&gt;! To
give you an idea of this speed, it is likely more than your hard disk
can put out which is probably around 80MB/s. The rest of the article
gives a good overview of USB 3.0 and she states that the bus should have
about &lt;strong&gt;400MB/s&lt;/strong&gt; bandwidth in the real world. This is a breath of
fresh air for external devices of all sorts, and I can't wait to see
this on new computers.&lt;/p&gt;
&lt;p&gt;The Linux drivers are currently under development, with the subsystem
patches going into review. xHCI driver
will have to wait until Intel finalizes and releases the specs. 
Anyways, it's safe to say that Linux should have USB 3.0 support as soon
as products hit the market in the middle of 2009.  &lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category><category term="Linux"></category></entry><entry><title>Bulletproof your server to survive Digg/Slashdot</title><link href="http://kev009.com/wp/2008/12/bulletproof-your-server-to-survive-digg-slashdot/" rel="alternate"></link><published>2008-12-13T23:44:00-07:00</published><updated>2008-12-13T23:44:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-12-13:/wp/2008/12/bulletproof-your-server-to-survive-digg-slashdot/</id><summary type="html">&lt;h3&gt;implementing scale up for web 2.0 sites with current practices&lt;/h3&gt;
&lt;p&gt;This blog was recently &lt;a href="http://hardware.slashdot.org/article.pl?sid=08/11/29/1830214"&gt;featured on Slashdot&lt;/a&gt; over the Thanksgiving
holiday in the US. It was the perfect storm: commercial news
organizations were mostly dormant creating a slow news day, and geeks
like me were at home eager to …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;implementing scale up for web 2.0 sites with current practices&lt;/h3&gt;
&lt;p&gt;This blog was recently &lt;a href="http://hardware.slashdot.org/article.pl?sid=08/11/29/1830214"&gt;featured on Slashdot&lt;/a&gt; over the Thanksgiving
holiday in the US. It was the perfect storm: commercial news
organizations were mostly dormant creating a slow news day, and geeks
like me were at home eager to get the latest technology scoop. What
surprised me is how this relatively modest box, a &lt;a href="http://www.linode.com/?r=562f9c046a234bbffbef2119ca3510f67ec72901"&gt;Linode&lt;/a&gt; 540MB Xen
Virtual Machine, withstood up to &lt;strong&gt;100+&lt;/strong&gt; requests a second without even
breaking a sweat. Furthermore, I had only performed some of the tuning
I detail below. It scales to over &lt;strong&gt;1100&lt;/strong&gt; requests a second after
following my guide below!&lt;/p&gt;
&lt;p&gt;I will detail how to tune your server for optimum capacity, or what I
will call &lt;strong&gt;free scale up&lt;/strong&gt; (as opposed to scale up by adding hardware
or scale out - adding machines, database servers, application servers,
load balancing - which may come in a future article depending on
interest). Most of the ideas here are platform neutral - both OS and
application server - assuming you are using a UNIX style OS.&lt;/p&gt;
&lt;p&gt;The only tutorials I've found were dated and don't detail the latest
practices like varnish or Passenger, so read on for a fresh look.&lt;/p&gt;
&lt;h4&gt;Audience&lt;/h4&gt;
&lt;p&gt;The intended audience for this article is anyone running a web site. 
Running your own web server gives much greater flexibility in choice of
development environment. A dedicated server and certain virtual private
server providers give much more predictable performance and wont cancel
your service on a whim. (I'm looking at you MediaTemple... google for
horror stories). A Linode VDS is much more flexible and very powerful
for around the same cost.&lt;/p&gt;
&lt;h3&gt;Web Server&lt;/h3&gt;
&lt;p&gt;Most people use Apache. According to &lt;a href="http://news.netcraft.com/"&gt;Netcraft&lt;/a&gt;, over 50% of hosts
were as of November. For good reason, Apache has proven stability,
scalability, and security. Some folks are quick to rip out Apache due
to poor configuration and tuning. I personally find it to be an
excellent choice for most sites because of the aforementioned traits and
first-rate extensions. With proper setup, you will likely max your
transfer or tax your application sever before it ever becomes the
bottleneck.&lt;/p&gt;
&lt;h4&gt;Apache Tuning&lt;/h4&gt;
&lt;p&gt;The key to tuning Apache is to minimize RAM usage, especially on a
limited machine like my 512MB Linode. Memory swapping of applications
to disk is almost entirely unacceptable on modern servers. Disk I/O is
very expensive and the biggest bottleneck on modern computers, which is
why swap is so unappealing.&lt;/p&gt;
&lt;p&gt;Therefore, you need to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Limit overall Apache memory usage&lt;/li&gt;
&lt;li&gt;Minimize per thread/process memory usage&lt;/li&gt;
&lt;li&gt;Minimize disk I/O&lt;/li&gt;
&lt;/ol&gt;
&lt;h5&gt;Limit overall memory usage&lt;/h5&gt;
&lt;p&gt;Step one is very important. If your server begins swapping heavily, it
can be very difficult to even log on and perform administration. You
need to develop an idea of the RAM an average Apache process is using
via &lt;strong&gt;top&lt;/strong&gt;, &lt;strong&gt;ps&lt;/strong&gt;, or another monitoring framework. Make sure you are
looking at the &lt;strong&gt;RES&lt;/strong&gt; column in top, since shared libraries will be
used between all processes. Take this number and divide it by the
amount of availalbe RAM. Available RAM should take into account RAM
used by other processes including your database when under reciprocal
load. Set the MaxClients directive to a number close to the resultant,
and tune accordingly with benchmarks (&lt;em&gt;see Benchmarking section&lt;/em&gt;).&lt;/p&gt;
&lt;h5&gt;Minimize memory usage&lt;/h5&gt;
&lt;p&gt;Step two determines how many child processes you can handle. This is
important because the more children, the more in flight requests, and
lower end user latency. This is also a lot more environment dependent
than step one.&lt;/p&gt;
&lt;p&gt;A good way to reduce memory consumption is to unload unneeded modules. 
Most server operating systems default Apache with a wide range of
modules that are probably not used on your site including several basic
authentication methods. Using shared objects rather than static modules
will help memory usage as well, and most distributions ship this way.&lt;/p&gt;
&lt;p&gt;If you use an Apache module for your application server (mod_php,
mod_perl, mod_python, Passenger aka mod_rails), each child process
will consume the memory of that module regardless of whether or not it
is serving a static asset (images, css, etc.) or an application page. 
Mitigate this by using a proxy (&lt;em&gt;see next section&lt;/em&gt;) or moving
application serving to its own processes via FastCGI (PHP, most others),
AJP (Java, Python), WSGI (newer Python), proxy (Ruby, all).&lt;/p&gt;
&lt;h5&gt;Disable logging&lt;/h5&gt;
&lt;p&gt;I should take a moment to step back and hit on an important topic. Hard
disks have improved very little in regard to performance in recent
years. Disk I/O is an expensive task and therefore the primary
bottleneck you wish to avoid.&lt;/p&gt;
&lt;p&gt;When Apache logging is enabled, a write operation must occur for every
hit. If possible, consider completely disabling access logging. You
can outsource web statistics to Google Analytics. If you require
logging, make sure HostnameLookups is disabled (network I/O is even more
expensive than disk!) and batch look-ups on another machine or during
idle periods with a log analyzer. As your setups grows (scale-out), log
files will become more cumbersome and you will probably be logging to
database or a central server anyways. Varnish, a proxy/http accelerator
detailed below has an optimized design for logging.&lt;/p&gt;
&lt;h5&gt;mod_cache&lt;/h5&gt;
&lt;p&gt;Apache has an integrated cache module that will keep frequently hit
static assets in memory. For larger sites, forgo this and use a proxy
which will be more flexible and allow easier scale-out.&lt;/p&gt;
&lt;h5&gt;MPMs&lt;/h5&gt;
&lt;p&gt;Apache makes use of MPMs, or Multi-Processing Modules, for its core
functionality. The default on UNIX is &lt;strong&gt;prefork&lt;/strong&gt;, which makes a
separate process for each request. By switching to a threading MPM such
as &lt;strong&gt;worker&lt;/strong&gt; or &lt;strong&gt;event&lt;/strong&gt;, you can cut down overhead and memory use.
Some modules do not play well with threading (PHP), so you should
research before changing MPMs. &lt;strong&gt;prefork&lt;/strong&gt; works well for one and two
core servers.&lt;/p&gt;
&lt;h4&gt;Alternative Web Servers&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.lighttpd.net/"&gt;Lighttpd&lt;/a&gt; is the leading alternative FOSS web server. Users include
A-list web sites such as Youtube and wikipedia. &lt;a href="http://redmine.lighttpd.net/wiki/lighttpd"&gt;Benchmarks&lt;/a&gt; show
impressive performance. Keep in mind Apache is by no means slow nor
resource intensive and links on that page show that it is faster on some
workloads.&lt;/p&gt;
&lt;p&gt;When making comparisons, keep in mind that by design you will probably
be using a FastCGI application server and most of the optimizations
above will hold true for Lighty.&lt;/p&gt;
&lt;p&gt;For sites with long connection times (download servers, AJAX keep-alive)
or static content servers, I would definitely lean toward it
(scale-out).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.nginx.net/"&gt;Nginx&lt;/a&gt; has also been picking up steam (pun intended) and is being
used by large sites like Wordpress.com. I would consider it in the same
class as Lighty.&lt;/p&gt;
&lt;h3&gt;Reverse Proxying&lt;/h3&gt;
&lt;p&gt;A reverse proxy is very useful for modern web serving. Even with just
one server, a reverse proxy will keep common pages in memory - greatly
reducing disk I/O. They will also keep static requests from using
potentially heavy application server HTTPd processes. These are often
very fast at basic HTTP since they are not concerned with all the
features of a web server. When it comes time to scale-out, the proxy
can be moved to a separate server. Proxies can direct traffic to
different backend servers. Proxies can even be placed in geographically
disperse areas (think CDNs: Akamai, Limelight - Youtube, Google). 
Logging, compression, and SSL can be offloaded to the proxy. In short,
you want a proxy even on a single server (or at least mod_cache).&lt;/p&gt;
&lt;h4&gt;Varnish&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://varnish.projects.linpro.no/"&gt;Varnish&lt;/a&gt; bills itself as an HTTP accelerator. It was written from
the ground up to perform reverse proxying, and this it does well. The
&lt;a href="http://varnish.projects.linpro.no/wiki/ArchitectNotes"&gt;Varnish design philosophy&lt;/a&gt; is enlightened and leaves a lot of the
work like memory management to modern advanced operating systems. 
Logging is performed in a separate processes and is optimized. If you
need an advanced proxy and accelerator, this is likely the way to go.&lt;/p&gt;
&lt;h4&gt;Squid&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://www.squid-cache.org/"&gt;Squid&lt;/a&gt; has traditionally been used as the de facto FOSS forward and
reverse proxy. Many large sites such as Wikipedia are extensive users.&lt;/p&gt;
&lt;h4&gt;Apache and Lighttpd&lt;/h4&gt;
&lt;p&gt;Both Apache and Lighttpd have modules that will allow them to cache and
reverse proxy. For single server setups, it would probably be worth
reusing the components of your web server (think: shared memory) if your
application server is external. mod_proxy is very useful for
forwarding ruby requests to a Ruby web server like mongrel or thin.&lt;/p&gt;
&lt;h3&gt;Application Server&lt;/h3&gt;
&lt;p&gt;The application server is where most of the magic happens in today's web
2.0 sites. Gone are the days of static HTML files. Most sites are now
dynamically generated every visit, and customized per visitor. This is
an order of magnitude more complex, and a lot of CPU time is spent on
page generation. Therefore, tuning here is often one of the best things
you can do to improve site scalability.&lt;/p&gt;
&lt;h4&gt;PHP&lt;/h4&gt;
&lt;p&gt;PHP is the most widely deployed language on the web. Many extremely
popular applications are written in PHP, including: MediaWiki,
Wordpress, Drupal, and phpBB.&lt;/p&gt;
&lt;h5&gt;Opcode Cache&lt;/h5&gt;
&lt;p&gt;By default, PHP breaks a script down into opcodes every time it is
called. Opcode translation is necessary to simplify programs so they
can easily be parsed by the Zend Engine. It is unnecessary for this to
be done every time a script is called since the source code will rarely
change once deployed. Luckily, a cache can be added that will eliminate
this step. The net performance gain can be a factor of 2 to 10, very
impressive for a simple install!&lt;/p&gt;
&lt;p&gt;These days, you should chose &lt;a href="http://pecl.php.net/package/APC"&gt;APC - The Alternative PHP Cache&lt;/a&gt;. Once
upon a time, there were several choices here. Turck MMCache was notably
fast, beating even the commercial Zend Suite, but mysteriously died out
(the original author is now a Zend employee. hmm.. coincidence??).
Others have tried to revive it in the form of eAccelerator, but it isn't
stable nor active. Any other arguments are moot point since APC will be
part of PHP6 core as well as having PHP's founder as a developer.&lt;/p&gt;
&lt;h5&gt;Modules&lt;/h5&gt;
&lt;p&gt;Just as with Apache, removing unused extensions in PHP will help reduce
memory usage. These can be commented out in &lt;strong&gt;php.ini&lt;/strong&gt;.&lt;/p&gt;
&lt;h4&gt;Rails&lt;/h4&gt;
&lt;p&gt;Rails has gained a lot of steam (okay I'm wearing that one out) and is a
favorite among many Web 2.0 startups including Twitter.&lt;/p&gt;
&lt;p&gt;A lot of Rails scalability problems are due to the underlying Ruby
language. The garbage collector, threading and memory allocator have
been pinpointed to be particularly bad. Work is underway to fix these
in Ruby 1.9 (bytecode) and 2.0(threading). In the mean time, consider
&lt;a href="http://www.rubyenterpriseedition.com/"&gt;Ruby Enterprise Edition&lt;/a&gt; in tandem with &lt;a href="http://www.rubyenterpriseedition.com/comparisons.html#test_results"&gt;Passenger&lt;/a&gt;. Personally,
I'd rather avoid Ruby and all you kool-aid drinkers (but I've done a
large deployment of Passenger). Go Python :).&lt;/p&gt;
&lt;h4&gt;Python&lt;/h4&gt;
&lt;p&gt;Python is just a plain good language. With that out of the way, like
all the other scripting languages, Python is supposed to be getting a
bytecode implementation sooner or later. &lt;a href="http://psyco.sourceforge.net"&gt;Psyco&lt;/a&gt; can yield an average
4x performance improvement and is available now. &lt;a href="http://morepypy.blogspot.com/"&gt;PyPy&lt;/a&gt; should be
here sooner rather than later.&lt;/p&gt;
&lt;h4&gt;Java&lt;/h4&gt;
&lt;p&gt;Due to the Java language design, code is JIT (Just-In-Time) compiled and
you don't have the compilation problem that the dynamic languages above
do.&lt;/p&gt;
&lt;p&gt;Java web apps are immensely complex, and aside from the latest JDK
(1.6.0.10), your container will play a big role in speed. Jetty and
Tomcat are always good choices.&lt;/p&gt;
&lt;h3&gt;Databases and Database Caching&lt;/h3&gt;
&lt;p&gt;A large portion of modern web applications are database driven. To keep
your site running, this point of contention must be addressed. MySQL is
ubiquitous and known for its speed. PostgreSQL offers some advanced
features and is known as the DBA's FOSS database. If you need extreme
scalability, consider DB2 but prepare to pay dearly :-).&lt;/p&gt;
&lt;h4&gt;MySQL&lt;/h4&gt;
&lt;p&gt;MySQL comes configured fairly well out of the box in most
distributions. MySQL Performance Blog &lt;a href="http://www.mysqlperformanceblog.com/2006/09/29/what-to-tune-in-mysql-server-after-installation/"&gt;sums it up&lt;/a&gt; better than I can,
so head that way for basic tuning info.&lt;/p&gt;
&lt;p&gt;Probably one of the easiest things you can do is enable the integrated
query cache. The good news is your application doesn't need to do
anything to take advantage of this.&lt;/p&gt;
&lt;p&gt;in &lt;strong&gt;my.cnf&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;query_cache_size = 64M&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For single server web workloads, this simple change can work miracles
and prevent dreaded MySQL connection errors. This is especially true
since web apps are primarily read oriented. The query cache isn't
perfect in all &lt;a href="http://www.mysqlperformanceblog.com/2006/08/09/cache-performance-comparison/"&gt;situations&lt;/a&gt;, and in larger sites memcached is more
appropriate but has its own disadvantages (&lt;em&gt;see memcached section&lt;/em&gt;).&lt;/p&gt;
&lt;h4&gt;PostgreSQL&lt;/h4&gt;
&lt;p&gt;PostgreSQL should also be set up fairly well by your distribution. 
shared_buffers should probably be tuned, as well as max_connections. 
See the PostgreSQL wiki on &lt;a href="http://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server"&gt;tuning&lt;/a&gt; for a good overview.&lt;/p&gt;
&lt;p&gt;There is nothing strictly akin to the MySQL query cache, for better or
worse.&lt;/p&gt;
&lt;h3&gt;Applications and Application Caching&lt;/h3&gt;
&lt;p&gt;This is potentially the hardest step to implement, yet can also yield
the greatest reward. Caching common database queries, objects, modules,
or even writing static HTML versions of a page can cut server load to
nothing. If you are using a common FOSS (free) or COTS (commercial)
product, chances are the software already implements some of these
options and they may just need to be activated or downloaded as an
extension.&lt;/p&gt;
&lt;p&gt;Keep in mind not all things are effectively cached, and you may need to
perform a major rework to implement aggressive caching like this.&lt;/p&gt;
&lt;h4&gt;Generic Data Caching - memcached and APC&lt;/h4&gt;
&lt;p&gt;Many common applications contain backends for caching against memcached
or APC. Mediawiki is a prime example of this, which integrates nicely
with memcached or APC. If you are writing your own apps, using a memory
cache can greatly reduce dependency on the database.&lt;/p&gt;
&lt;h5&gt;memcached&lt;/h5&gt;
&lt;p&gt;Realizing that databases have a lot of constraints, the folks at
LiveJournal.com wrote a generic caching framework called &lt;a href="http://www.danga.com/memcached/"&gt;memcached&lt;/a&gt;. 
Most large sites such as Facebook, Wikipedia, and Slashdot are all using
this.&lt;/p&gt;
&lt;p&gt;The bad news is you have to port your application to store and check
against memcached. Database queries are a prime target, but just about
anything can be stored here.&lt;/p&gt;
&lt;p&gt;It is also handy for scale-out because you can add dedicated cache
severs.&lt;/p&gt;
&lt;h5&gt;APC user cache&lt;/h5&gt;
&lt;p&gt;PHP APC users can manually store information in APC's shared memory. 
This is ideal for single server solutions. Take a look at this
&lt;a href="http://www.mysqlperformanceblog.com/2006/08/09/cache-performance-comparison/"&gt;performance comparison&lt;/a&gt; vs memcached and files.&lt;/p&gt;
&lt;h4&gt;Application Caching&lt;/h4&gt;
&lt;p&gt;Although most pages are dynamically generated these days, a lot are
needlessly so. For example, a content management system might include a
header, content, comments and a footer. This output can be updated and
written as a static HTML pages when an author updates them. Static
pages are then served until a user comments on an article, which
triggers a cache invalidation and the page is rendered and stored
again. The output of generated menus, columns, and other objects can be
stored in cache form as well.&lt;/p&gt;
&lt;h5&gt;Wordpress Cache Plugins&lt;/h5&gt;
&lt;p&gt;Wordpress has a couple of plugins that are mandatory for large sites.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wordpress.org/extend/plugins/wp-super-cache/"&gt;WP Super Cache&lt;/a&gt; will generate static HTML files of posts on your
blog. They are automatically served via some mod_rewrite magic, and
will expire and update automatically. This can effectively reduce load
to almost nothing - it completely eliminated database access and PHP
execution.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wordpress.org/extend/plugins/wp-widget-cache/"&gt;WP Widget Cache&lt;/a&gt; is a nice addition that will cache output of widgets
(sidebar elements such as menus) that don't commonly change.&lt;/p&gt;
&lt;h3&gt;Benchmarking&lt;/h3&gt;
&lt;p&gt;It is important to benchmark your site after making changes to see if it
meets performance expectations. &lt;strong&gt;ab&lt;/strong&gt; is a common tool for this task.&lt;/p&gt;
&lt;p&gt;The following will run 10 concurrent requests for 3000 total against
localhost:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;ab -c10 -n3000 http://localhost/&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Be &lt;span style="text-decoration: underline;"&gt;very careful&lt;/span&gt; when
benchmarking a live site. You could effectively Denial of Service your
server while it is processing all those requests.&lt;/p&gt;
&lt;h3&gt;What do you think?&lt;/h3&gt;
&lt;p&gt;I'd be happy to hear your stories from the trenches. Please share your
tuning advice!&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Linux"></category><category term="Programming"></category></entry><entry><title>Tux3 by Christmas?</title><link href="http://kev009.com/wp/2008/12/tux3-by-christmas/" rel="alternate"></link><published>2008-12-10T17:43:00-07:00</published><updated>2008-12-10T17:43:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-12-10:/wp/2008/12/tux3-by-christmas/</id><summary type="html">&lt;p&gt;Development seem to be going well for Tux3.&lt;/p&gt;
&lt;p&gt;Daniel Phillips of &lt;a href="http://tux3.org/"&gt;Tux3&lt;/a&gt; just posted the following to the LKML:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The big goals for Christmas (this Christmas!) are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SMP locking&lt;/li&gt;
&lt;li&gt;Atomic commit&lt;/li&gt;
&lt;li&gt;Posixly complete&lt;/li&gt;
&lt;li&gt;Rudimentary fsck&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;With the following comical reference&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With atomic commit, we will progress from "buggy Ext2 equivalent …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;Development seem to be going well for Tux3.&lt;/p&gt;
&lt;p&gt;Daniel Phillips of &lt;a href="http://tux3.org/"&gt;Tux3&lt;/a&gt; just posted the following to the LKML:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The big goals for Christmas (this Christmas!) are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SMP locking&lt;/li&gt;
&lt;li&gt;Atomic commit&lt;/li&gt;
&lt;li&gt;Posixly complete&lt;/li&gt;
&lt;li&gt;Rudimentary fsck&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;With the following comical reference&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With atomic commit, we will progress from "buggy Ext2 equivalent with
missing features" to "buggy Ext3 equivalent with missing features".&lt;/p&gt;
&lt;p&gt;Not a bad place to arrive at in five months, starting from scratch.
Does anybody out there still doubt that the community process works,
and is the best way to develop really complex software? Believe it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;See the whole post here: &lt;a href="http://lkml.org/lkml/2008/12/10/358"&gt;http://lkml.org/lkml/2008/12/10/358&lt;/a&gt;&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Linux"></category></entry><entry><title>Retrocomputing for Fun and Profit</title><link href="http://kev009.com/wp/2008/12/retrocomputing-for-fun-and-profit/" rel="alternate"></link><published>2008-12-07T14:22:00-07:00</published><updated>2008-12-07T14:22:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-12-07:/wp/2008/12/retrocomputing-for-fun-and-profit/</id><summary type="html">&lt;ol&gt;
&lt;li&gt;Buy Old Computers&lt;/li&gt;
&lt;li&gt;???&lt;/li&gt;
&lt;li&gt;Profit&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;What is retrocomputing?&lt;/h3&gt;
&lt;p&gt;I define &lt;strong&gt;retrocomputing&lt;/strong&gt; [&lt;a href="http://en.wikipedia.org/wiki/Retrocomputing"&gt;wikipedia&lt;/a&gt;] as the collecting and use of
old computers. Why might one do this? Well, for one, enterprises cycle
out machines fairly frequently. 2,3,4 and 5 year old systems are often
sent out to scrappers in droves despite …&lt;/p&gt;</summary><content type="html">&lt;ol&gt;
&lt;li&gt;Buy Old Computers&lt;/li&gt;
&lt;li&gt;???&lt;/li&gt;
&lt;li&gt;Profit&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;What is retrocomputing?&lt;/h3&gt;
&lt;p&gt;I define &lt;strong&gt;retrocomputing&lt;/strong&gt; [&lt;a href="http://en.wikipedia.org/wiki/Retrocomputing"&gt;wikipedia&lt;/a&gt;] as the collecting and use of
old computers. Why might one do this? Well, for one, enterprises cycle
out machines fairly frequently. 2,3,4 and 5 year old systems are often
sent out to scrappers in droves despite still being plenty useful. Top
of the line systems for large companies often have more than enough
power for small and medium sized ones at pennies on the dollar compared
to new hardware. These machines are likely complete overkill for home
use, but none the less are very useful for fun and learning.&lt;/p&gt;
&lt;p&gt;
&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;param name="src" value="http://www.youtube.com/v/Cwj6pfhWBps&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;

&lt;embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/Cwj6pfhWBps&amp;amp;hl=en&amp;amp;fs=1" allowscriptaccess="always" allowfullscreen="true"&gt;
&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;IBM mainframe ops in the 1980s&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Why?!&lt;/h3&gt;
&lt;p&gt;A lot of what I know about computers has been learned on old machines.
Hooking up a couple of servers and desktops and trying to make something
useful out of them is a great exercise for the aspiring system
administrator. With open source software, it can all be done freely and
easily.&lt;/p&gt;
&lt;p&gt;Yes, you can run Linux, BSD, and Solaris from the comfort of your
Windows desktop in a virtual machine (weak sauce...). Yet there is
something much different when you cluster several high technology
servers together, tethered to a Fibre Channel storage array and have
them share a single distributed file system. The knowledge of setup,
installation, and troubleshooting I've gained from mock scenarios like
this I cannot compare to anyone else I've ever met. Breaking things
here usually means digging deep and fixing it. If you were to screw
something up at work like some of the things I've gotten into, it would
probably cost you your job.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2008/12/bench1.jpg"&gt;&lt;img alt="BENCHNET - where I rip into computers that cost as much as a
house and my &amp;quot;production&amp;quot; rack&amp;quot;" src="http://kev009.com/wp/assets/2008/12/bench1-300x225.jpg" title="BENCHNET"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Retrocomputing is also fun. I am personally into old IBM hardware,
though old UNIX workstations of all sorts are interesting to me. You
can see my collection of IBM PS/2 and RS/6000 knowledge here:
&lt;a href="http://ps-2.kev009.com/"&gt;http://ps-2.kev009.com/&lt;/a&gt;. There is a particular thrill to booting
up a machine that cost between $20,000 and $50,000 10 years ago.
Knowing that these same machine models were used to design the Boeing
777, composed the famous &lt;a href="http://en.wikipedia.org/wiki/Deep_Blue_%28chess_computer%29"&gt;Deep Blue&lt;/a&gt; machine, and were used in the
largest automotive and shipbuilding firms not to mention some of the
most important &lt;a href="http://en.wikipedia.org/wiki/RAD6000"&gt;space craft&lt;/a&gt; to date also brings a sense of power and
nostalgia. In some ways its similar to having a classic car, but
different. Maybe &lt;strong&gt;if that classic car was a big ass bulldozer, tank,
jet&lt;/strong&gt; or some other well engineered piece of equipment :-P.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2008/12/systems1.jpg"&gt;&lt;img alt="Old systems" src="http://kev009.com/wp/assets/2008/12/systems1-300x225.jpg" title="Systems"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Some old systems I had at one time or another. Left to right: IBM
PS/2e (first "green" environmental pc), RS/6000 43p (7043-140), Apple
PowerMac 7100/80, RS/6000 7006-42W, RS/6000 7012-397, HP Visualize
c360 (PARISC)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nostalgia is one of the biggest things I get out of using particularly
old hardware. I missed the mainframe days, the minicomputer days, the
PC and DOS days, the Apple II days (well, actually I used these a bit at
a very young age), and to a degree the early Windows days. Just like a
history class, studying these old machines gives me insight as to why
things are done the way they are today. It gives me appreciation for
modern systems and makes &lt;strong&gt;me write clean and well optimized code&lt;/strong&gt;.
The old computer games that captivated me as a child &lt;em&gt;(Sim City, Sim
Tower, Sim Ant, Sim Farm, Gizmos and Gadgets, The Incredible Machine,
Oregon Tail etc.)&lt;/em&gt; implanted a high degree of logic and understanding at
a young age and it is heartwarming to revisit these. I grew up a Mac
user as well, so seeing what I was&lt;em&gt;(or: was not :&amp;gt;)&lt;/em&gt; missing on PCs is
also interesting.&lt;/p&gt;
&lt;p&gt;
&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;param name="src" value="http://www.youtube.com/v/dLBeLKFsFCA&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;

&lt;embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/dLBeLKFsFCA&amp;amp;hl=en&amp;amp;fs=1" allowscriptaccess="always" allowfullscreen="true"&gt;
&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Old MIPS UNIX server booting and logging in&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Some of the benefits of retrocomputing:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Enterprise class hardware&lt;/li&gt;
&lt;li&gt;Cheap, possibly even free&lt;/li&gt;
&lt;li&gt;Different design philosophies - not everything is x86 - a lot of
    this gear is quite different. For example, UNIX workstations
    integrated most of what we enjoy on our PCs years before it became
    available to consumers. SGI machines were doing A/V and 3D in the
    early 90s. IBM midrange &lt;a href="http://en.wikipedia.org/wiki/AS/400"&gt;AS/400&lt;/a&gt;s have an advanced integrated
    database, programming languages, and environment that make PCs look
    like a joke for business programming. &lt;a href="http://en.wikipedia.org/wiki/Winfs"&gt;WinFS&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Object_storage_device"&gt;Object Storage Devices&lt;/a&gt;,
    etc are just now being talked about for PCs. The
    channel philosophy from mainframes is still pretty new to PC servers
    (&lt;a href="http://en.wikipedia.org/wiki/Fibre_channel"&gt;fibre channel&lt;/a&gt;), not to mention &lt;a href="http://en.wikipedia.org/wiki/VM_%28Operating_system%29"&gt;virtualization&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;If you break it, you can fix it and learn from it or toss it&lt;/li&gt;
&lt;li&gt;The engineering and craftsmanship in some of these systems is
    downright astonishing&lt;/li&gt;
&lt;li&gt;Old computers are works of art: they give you a window into the
    technology and culture of times past&lt;/li&gt;
&lt;li&gt;You should never trust a computer you can't lift&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is interesting that we as humans produce such elaborate machines,
only to discard them as scarp a few years later. It is humbling and
shows you the incredible progress we are making.&lt;/p&gt;
&lt;h3&gt;How?&lt;/h3&gt;
&lt;p&gt;eBay is your friend, but also look for local scrapyards or businesses
doing overhauls.&lt;/p&gt;
&lt;p&gt;If you are faint of heart, plenty of good abandonware sites exist for
games and operating systems that can be run on emulators or VMs. Check
out this IBM mainframe emulator, &lt;a href="http://www.hercules-390.org/"&gt;Hercules&lt;/a&gt;. Some of the original IBM
OSes are &lt;a href="http://www.ibiblio.org/jmaynard/"&gt;public domain&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you don't want old PCs and big iron overtaking your house, there is
plenty of good material on YouTube as well. &lt;a href="http://www.youtube.com/user/ComputerHistory"&gt;The Computer Museum&lt;/a&gt; is
a good start. Some of the consoles, offices, and outfits are hilarious.&lt;/p&gt;
&lt;p&gt;
&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;
&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;param name="src" value="http://www.youtube.com/v/Z45nbzMLk98&amp;amp;hl=en&amp;amp;fs=1"&gt;&lt;/param&gt;

&lt;embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/Z45nbzMLk98&amp;amp;hl=en&amp;amp;fs=1" allowscriptaccess="always" allowfullscreen="true"&gt;
&lt;/embed&gt;
&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Old SGI tech demo - pretty impressive!&lt;/em&gt;&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category><category term="Linux"></category><category term="Programming"></category><category term="Projects"></category></entry><entry><title>Phoronix Benchmarking.. Statistically Significant? And Other Performance Concerns</title><link href="http://kev009.com/wp/2008/12/phoronix-benchmarking-statistically-significant-and-other-performance-concerns/" rel="alternate"></link><published>2008-12-06T23:43:00-07:00</published><updated>2008-12-06T23:43:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-12-06:/wp/2008/12/phoronix-benchmarking-statistically-significant-and-other-performance-concerns/</id><summary type="html">&lt;p&gt;&lt;a href="http://www.phoronix.com/"&gt;Phoronix&lt;/a&gt; has been cranking out a slew of benchmarks recently,
pitting various different Linux distros against each other and even
different operating systems with their own automated test suite.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.phoronix.com/scan.php?page=article&amp;amp;item=ubuntu_bench_2008&amp;amp;num=1http://www.phoronix.com/scan.php?page=article&amp;amp;item=ubuntu_bench_2008&amp;amp;num=1"&gt;Ubuntu 7.04 to 8.10 Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phoronix.com/scan.php?page=article&amp;amp;item=ubuntu_macosx&amp;amp;num=1"&gt;Mac OS 10.5 vs. Ubuntu 8.10 Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phoronix.com/scan.php?page=article&amp;amp;item=os_threeway_2008&amp;amp;num=1"&gt;Ubuntu vs. OpenSolaris vs. FreeBSD …&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://www.phoronix.com/"&gt;Phoronix&lt;/a&gt; has been cranking out a slew of benchmarks recently,
pitting various different Linux distros against each other and even
different operating systems with their own automated test suite.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://www.phoronix.com/scan.php?page=article&amp;amp;item=ubuntu_bench_2008&amp;amp;num=1http://www.phoronix.com/scan.php?page=article&amp;amp;item=ubuntu_bench_2008&amp;amp;num=1"&gt;Ubuntu 7.04 to 8.10 Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phoronix.com/scan.php?page=article&amp;amp;item=ubuntu_macosx&amp;amp;num=1"&gt;Mac OS 10.5 vs. Ubuntu 8.10 Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phoronix.com/scan.php?page=article&amp;amp;item=os_threeway_2008&amp;amp;num=1"&gt;Ubuntu vs. OpenSolaris vs. FreeBSD benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phoronix.com/scan.php?page=article&amp;amp;item=ubuntu_810_vs_fedora_10&amp;amp;num=1"&gt;Fedora 10 vs Ubuntu 8.10 Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phoronix.com/scan.php?page=article&amp;amp;item=ext4_benchmarks&amp;amp;num=1"&gt;"Real World" Benchmarks of the EXT4 File-System&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.phoronix.com/scan.php?page=article&amp;amp;item=opensolaris_2008_benchmarks&amp;amp;num=1"&gt;OpenSolaris 2008.05 vs. 2008.11 Benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What I would like to know is... are they bullshit? I'm no statistician,
yet the proximity of the numbers and lack of error bars raise my own
bullshit detection meter. See this URL for some background on
statistical significance and error bars:
&lt;a href="http://www.graphpad.com/articles/errorbars.htm"&gt;http://www.graphpad.com/articles/errorbars.htm&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I spot plenty of outlandish things, such as FPS benchmarks for file
system tests and JDK version changes through product life cycles, also
to mention the somewhat unfairness of crappy binary graphics drivers
across versions. JDK 1.6.10 is &lt;strong&gt;SUPPOSED&lt;/strong&gt; to be faster; results from
benchmarking against this are insignificant unless it is run across all
versions. Yes.. GCC, glibc, and the kernel change between releases as
well but these are not typically components that a user can swap out as
easily as a JVM which should probably be bumped for security reasons
anyways.&lt;/p&gt;
&lt;p&gt;Furthermore, I realize all benchmarking should be taken with a grain of
salt - one particular set of hardware and software will never map
correctly to another set of hardware or software, but it should be
possible to set up tests to gain some useful intelligence.&lt;/p&gt;
&lt;p&gt;Can this kind of macro/micro benchmarking (depending on how you look at
it) help weed out regressions? GCC 4.0 was noticeably slower on x86
than 3.x (See: &lt;a href="http://www.coyotegulch.com/reviews/gcc4/index.html"&gt;http://www.coyotegulch.com/reviews/gcc4/index.html&lt;/a&gt;,
&lt;a href="http://people.redhat.com/bkoz/benchmarks/"&gt;http://people.redhat.com/bkoz/benchmarks/&lt;/a&gt;). At the same time I think
PowerPC saw significant improvement due to auto vectorization and use of
Altivec/VMX. But it also seems to be improving over time. I've heard
4.4 is supposed to be much better with a new register allocator
(&lt;a href="http://gcc.gnu.org/ml/gcc-patches/2008-04/msg01812.html"&gt;IRA&lt;/a&gt;). This probably the most important component of modern open
source operating systems, so some of the blame might be placed here if
the numbers have meaning.&lt;/p&gt;
&lt;p&gt;All of this makes LLVM look more and more appealing. &lt;a href="http://llvm.org/"&gt;LLVM&lt;/a&gt; is able
to do not only compile time, but also link and run time optimization.
This is very appealing for commercial software where you are given a
binary blob by the manufacturer that will likely that will not change
through its lifetime. It also reminds me of Java and speedup through
JVM upgrades, except this should work on any language.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;"LLVM is... designed to enable effective program optimization across
the entire lifetime of a program. LLVM supports effective optimization
at compile time, link-time (particularly interprocedural), run-time
and offline (i.e., after software is installed), while remaining
transparent to developers"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;One thing the Phoronix numbers do show is that things seemed to go down
hill coincident with CFS (&lt;a href="http://lwn.net/Articles/230574/"&gt;Completely Fair Scheduler&lt;/a&gt;), dyntick, and
SLUB merging as well.&lt;/p&gt;
&lt;p&gt;Evgeniy Polyakov of POHMELFS fame raised the alarm with some fairly
significant networking regressions - &lt;a href="http://www.ioremap.net/node/42"&gt;how financial crisis affects
tbench performance&lt;/a&gt; - that seem to support a general slowdown between
2.6.22 and 2.6.27. This resulted in noise on &lt;a href="http://lwn.net/Articles/304845/"&gt;LKML&lt;/a&gt; and hopefully we
will see improvements soon.&lt;/p&gt;
&lt;p&gt;I guess what I am getting at is that compute power is so cheap that it
seems stupid to not have automated tests against such things these
days. Diego Petteno of Gentoo fame has been doing such things recently
with &lt;a href="http://blog.flameeyes.eu/2008/11/15/building-the-whole-portage"&gt;Gentoo's excellent build system&lt;/a&gt;. I have set up &lt;a href="https://hudson.dev.java.net/"&gt;Hudson&lt;/a&gt;, a
Java Continuous Integration system, before to track commit regressions
and such a system seems ideal for all modern software testing.&lt;/p&gt;
&lt;p&gt;Anyways, I am interested in hearing your thoughts on benchmarking,
software testing, and automation and how it can be used to improve
modern software.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="Hardware"></category><category term="Linux"></category><category term="Programming"></category></entry><entry><title>KDE 4.2 beta 1 on Gentoo</title><link href="http://kev009.com/wp/2008/12/kde-4-2-on-gentoo/" rel="alternate"></link><published>2008-12-05T15:59:00-07:00</published><updated>2008-12-05T15:59:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-12-05:/wp/2008/12/kde-4-2-on-gentoo/</id><summary type="html">&lt;p&gt;KDE 4.2 is set for release on January 27th. Eager to see what is new
and improved, I installed beta 1 on my Gentoo box. KDE 4.1.80 was
tagged then released late last month after the feature freeze deadline.
This is a snapshot of the current development …&lt;/p&gt;</summary><content type="html">&lt;p&gt;KDE 4.2 is set for release on January 27th. Eager to see what is new
and improved, I installed beta 1 on my Gentoo box. KDE 4.1.80 was
tagged then released late last month after the feature freeze deadline.
This is a snapshot of the current development tree that will eventually
be released as KDE 4.2.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A quick blurb about KDE 4.1:&lt;/em&gt;&lt;br&gt;
Busy with other things, I never wrote about KDE 4.1 on Gentoo. I've
been using KDE 4.1 since 4.1.1 with the kde-testing overlay which has
since entered portage and been bumped to 4.1.3. This is a good release
and well worth at least testing if you are a KDE user. I've found it to
be quite stable and use it exclusively for every day work. The Gentoo
KDE team has done an excellent job creating ebuilds for it.&lt;/p&gt;
&lt;h3&gt;What's new?&lt;/h3&gt;
&lt;p&gt;Plasma received a lot of polish and is beginning to eclipse Kicker and
indeed all other desktop and panels that I have used. Much needed
features such as changing the panel height, auto-hide, and screen edge
selection have been added. The task bar is highly configurable in
typical KDE fashion, allowing you to define task grouping, sorting,
filtering based on current desktop or screen or minimized windows only,
as well as allowing manual grouping. The system tray also now allows
hiding of unwanted tray icons.&lt;/p&gt;
&lt;p&gt;Here's a screen shot cluttered with various plasmoids for
demonstration. It's nice to see the community thinking up some fun and
useful plasmoids.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2008/12/desktop-plasmoids.jpg"&gt;&lt;img alt="KDE Desktop and various plasmoids" src="http://kev009.com/wp/assets/2008/12/desktop-plasmoids-300x187.jpg" title="KDE Desktop and various plasmoids"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I wasn't the biggest fan of the KDE 4 default menu. Luckily, the
Lancelot menu has been accepted upstream and is now an option on stock
installs. This menu is great for finding new applications (esp. new
users) as well as thumbing through with the keyboard.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2008/12/lancelot.jpg"&gt;&lt;img alt="Lancelot menu" src="http://kev009.com/wp/assets/2008/12/lancelot-300x272.jpg" title="Lancelot menu"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I'm a Firefox user, but occasionally will fire up other browsers for
testing or to avoid restoring a large previous session if I am in a
hurry. I'm happy to say that Konqueror feels much faster. It also
seems to work much better on AJAX heavy sites such as Facebook. When I
spoofed the user agent to report Firefox 2, Facebook chat worked fine,
an improvement from 4.1. The continued merging of Webkit is clearly
beneficial here.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2008/12/konq-acid3.jpg"&gt;&lt;img alt="Konqueror 4.1.80 Acid3 test" src="http://kev009.com/wp/assets/2008/12/konq-acid3-300x194.jpg" title="Konqueror 4.1.80 Acid3 test"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One of my favorite KDE apps from 3.5, Ark, is also finally reaching
feature parity. I missed shell integration with Dolphin/Konqueror quite
a bit and am happy to say it has returned.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2008/12/ark-shell-integration.jpg"&gt;&lt;img alt="Ark shell integration" src="http://kev009.com/wp/assets/2008/12/ark-shell-integration-300x298.jpg" title="Ark shell integration"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Notifications are displayed and stack nicely in the lower right corner. 
Operations such as downloading and moving files will show their status
here.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2008/12/notifications.jpg"&gt;&lt;img alt="Notifications" src="http://kev009.com/wp/assets/2008/12/notifications-300x113.jpg" title="Notifications"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kontact gained usenet support by means of Akonadi, which now has support
many for data sources. I think I will switch from Thunderbird/Lightning
to Kontact with this release.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2008/12/kontact-usenet.jpg"&gt;&lt;img alt="Kontact usenet" src="http://kev009.com/wp/assets/2008/12/kontact-usenet-300x209.jpg" title="Kontact usenet"&gt;&lt;/a&gt; &lt;a href="http://kev009.com/wp/assets/2008/12/akonadi-sources.jpg"&gt;&lt;img alt="Akonadi data sources" src="http://kev009.com/wp/assets/2008/12/akonadi-sources-146x300.jpg" title="Akonadi data sources"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kate has a new VI editing mode. This is quite a nice text editor.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2008/12/kate-vi.jpg"&gt;&lt;img alt="Kate VI mode" src="http://kev009.com/wp/assets/2008/12/kate-vi-300x257.jpg" title="Kate VI mode"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Amarok is shaping up as well. This is 2.0 RC1, so it should be released
on a date close to KDE 4.2. Take a look at the different Internet media
sources. &lt;a href="http://www.last.fm/"&gt;Last.fm&lt;/a&gt; support is now top notch!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2008/12/amarok-internet-services.jpg"&gt;&lt;img alt="Amarok 2.0 RC1 Internet Services" src="http://kev009.com/wp/assets/2008/12/amarok-internet-services-300x194.jpg" title="Amarok 2.0 RC1 Internet Services"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Digikam 0.10-beta5, which seems to be stabilizing and evolving nicely,
is another nice app. Bonus points if you can identify all the retro
machines. The one on the left was probably the worlds first "green" PC.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2008/12/digikam-dot10beta5.jpg"&gt;&lt;img alt="digiKam 0.10-beta5" src="http://kev009.com/wp/assets/2008/12/digikam-dot10beta5-300x235.jpg" title="digiKam 0.10-beta5"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Okteta, an easy to use hex editior, has also been updated.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2008/12/okteta.jpg"&gt;&lt;img alt="Okteta hex editor" src="http://kev009.com/wp/assets/2008/12/okteta-300x291.jpg" title="Okteta hex editor"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I could go on and on showing the great progress. I hope I hit the
highlights, but you can check out the feature plan for yourself here:
&lt;a href="http://techbase.kde.org/Schedules/KDE4/4.2_Feature_Plan"&gt;http://techbase.kde.org/Schedules/KDE4/4.2_Feature_Plan&lt;/a&gt;. 
Noteworthy changes include improved multi-display, better desktop search
with Strigi, and integrated power management.&lt;/p&gt;
&lt;h3&gt;Gentoo Installation&lt;/h3&gt;
&lt;p&gt;First, a shout out to the Gentoo KDE maintainers and testers. Creating
ebuilds for fast moving snapshots and live sources for a project this
large is not an easy task.&lt;/p&gt;
&lt;p&gt;Installation on Gentoo is fairly easy if you have layman. 'layman -a
kde-crazy' will add the KDE crazy overlay which has KDE 4.2 unmasked and
ready for testing. If your box is ~arch, it should be as simple as
'emerge -av @kde-4.2' &lt;em&gt;(see comments below for more info)&lt;/em&gt;. I recommend
using the kdeprefix USE flag if you wish to test development releases so
you can fall back to stable if things aren't working correctly. This
will slot 4.x releases.&lt;/p&gt;
&lt;p&gt;If you want a stable and usable environment, I still recommend sticking
to 4.1.3 at the moment. If you run a mostly stable Gentoo with KDE3.5,
you can find a package.keywords file in the kde-testing overlay as well
as some other minor goodies. These versions slot effortlessly so it
isn't a problem switching back and forth.&lt;/p&gt;
&lt;h3&gt;Conclusions&lt;/h3&gt;
&lt;p&gt;KDE 4.2 has come a long way since 4.0 and is a nice steady improvement
over 4.1. As I stated earlier, I use KDE 4.1.3 as my only desktop
environment and am extremely pleased with it. I have had no major
issues and have had uptime of over a month in the past without
crashing/restarting KDE - so the good old KDE 3.5 stability seems to be
returning. By trying the current beta out, I have no doubt that 4.2
should be just as stable by release.&lt;/p&gt;
&lt;p&gt;Also, if you are an Nvidia user you owe it to yourself to try the latest
180.xx+ drivers. As people have long been saying, much of the
performance problems they were describing were related to Nvidia cards
and poor video drivers. With the new drivers, KDE is lightning fast.&lt;/p&gt;
&lt;p&gt;Here's to an on time and successful KDE 4.2 release. I can't wait to
see what QT 4.5 and KDE 4.3 will bring!&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="kde"></category><category term="Linux"></category></entry><entry><title>More Linux File Systems</title><link href="http://kev009.com/wp/2008/12/more-linux-file-systems/" rel="alternate"></link><published>2008-12-03T23:03:00-07:00</published><updated>2008-12-03T23:03:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-12-03:/wp/2008/12/more-linux-file-systems/</id><summary type="html">&lt;p&gt;It seems I caught the wave of interest in Linux file systems. Here are
some articles worth checking out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LWN has done an excellent overview of Tux3:
    &lt;a href="http://lwn.net/Articles/309094/"&gt;http://lwn.net/Articles/309094/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Phoronix subjects ext4 to performance tests against ext3, XFS, and
    reiser3:
    &lt;a href="http://www.phoronix.com/scan.php?page=article&amp;amp;item=ext4_benchmarks"&gt;http://www.phoronix.com/scan.php?page …&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;It seems I caught the wave of interest in Linux file systems. Here are
some articles worth checking out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LWN has done an excellent overview of Tux3:
    &lt;a href="http://lwn.net/Articles/309094/"&gt;http://lwn.net/Articles/309094/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Phoronix subjects ext4 to performance tests against ext3, XFS, and
    reiser3:
    &lt;a href="http://www.phoronix.com/scan.php?page=article&amp;amp;item=ext4_benchmarks"&gt;http://www.phoronix.com/scan.php?page=article&amp;amp;item=ext4_benchmarks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Btrfs performance analysis: &lt;a href="http://btrfs.boxacle.net/"&gt;http://btrfs.boxacle.net/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, there are some other file systems that I haven't talked about
that came up in the comments of my last post. Most of these are special
purpose, still on the fringes, or different in scope than the first
article which was about local storage.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The native flash file systems: &lt;a href="http://www.inf.u-szeged.hu/sed/ubifs"&gt;UBIFS&lt;/a&gt; and &lt;a href="http://www.logfs.org/logfs/"&gt;LogFS&lt;/a&gt;. In theory
    file systems like these would be ideal for SSDs, but we need
    manufactures to stop putting FAT/Hard disk emulation and wear
    leveling into their drives. Windows is the culprit for this. These
    file systems also seem keyed toward embedded device flash memories
    at the moment and not general purpose storage. Neither are upstream
    yet. This could be positive, as the disk format and code can be
    readily changed to make them compatible with future SSDs if there is
    a change in manufacturing. Val Henson, a Linux file system
    authority, has some interesting &lt;a href="http://valhenson.livejournal.com/25228.html"&gt;thoughts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;a href="http://en.wikipedia.org/wiki/Log-structured_file_system"&gt;Log file systems&lt;/a&gt;: LogFS (flash centric, see above),
    &lt;a href="http://en.wikipedia.org/wiki/Log-structured_file_system"&gt;NILFS&lt;/a&gt;. I believe ZFS and Tux3 share design
    philosophy from these. The idea has been around for a long time but
    none have ever really succeeded.&lt;/li&gt;
&lt;li&gt;The shared disk and distributed parallel file systems: &lt;a href="http://oss.oracle.com/projects/ocfs2/"&gt;OCFS2&lt;/a&gt;,
    &lt;a href="http://en.wikipedia.org/wiki/Lustre_%28file_system%29"&gt;Lustre&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Global_File_System"&gt;GFS&lt;/a&gt;, &lt;a href="http://www.pvfs.org/"&gt;PVFS&lt;/a&gt;. There&lt;br&gt;
    are a laundry list of these. Some implement entire disk file
    systems, while others add clustering or distributing properties to
    other file systems. SUSE [&lt;a href="http://www.novell.com/linux/filesystems/faq.html"&gt;link&lt;/a&gt;] and I think Red Hat even
    considered using one as the default file system but booting (Grub)
    is an issue.&lt;/li&gt;
&lt;li&gt;Network file systems: these add networking to other disk file
    systems. &lt;a href="http://www.ioremap.net/projects/pohmelfs"&gt;POHMELFS&lt;/a&gt; and &lt;a href="http://oss.oracle.com/projects/crfs/"&gt;CRFS&lt;/a&gt; (distributed extension for Btrfs)
    are interesting new ones here. Of course there are a laundry list
    network file systems for Linux. NFS, AFS, and CIFS are the old
    timers.&lt;/li&gt;
&lt;li&gt;The others: These are more experimental or research oriented.
    &lt;a href="http://www.valhenson.org/review/chunkfs.pdf"&gt;chunkfs&lt;/a&gt;, &lt;a href="http://artax.karlin.mff.cuni.cz/~mikulas/spadfs/"&gt;spadfs&lt;/a&gt;, and many more. Many others just don't have
    steam behind them yet or are dead in the water.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My overview is clearly Linux oriented, though I mentioned ZFS in passing
because I think it spurred a lot of these recent developments. That
isn't to say the BSDs are sitting still with &lt;a href="http://kerneltrap.org/DragonFlyBSD/HAMMER_Filesystem_Design"&gt;HAMMER&lt;/a&gt;, and FreeBSD is
keeping UFS2 moving forward while NetBSD has LFS - a log file system.&lt;/p&gt;
&lt;p&gt;P.S.:&lt;/p&gt;
&lt;p&gt;I plan on performing some benchmarking soon after 2.6.28 goes stable.
The list will include ext2/3/4, JFS, XFS, Reiser3 and Btrfs. The setup
will include single and multi-disk configs. If you have any requests or
suggestions for setup, please contact me.&lt;/p&gt;</content><category term="misc"></category><category term="Hardware"></category><category term="Linux"></category></entry><entry><title>On File Systems</title><link href="http://kev009.com/wp/2008/11/on-file-systems/" rel="alternate"></link><published>2008-11-29T03:07:00-07:00</published><updated>2008-11-29T03:07:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-11-29:/wp/2008/11/on-file-systems/</id><summary type="html">&lt;p&gt;&lt;em&gt;Update: &lt;a href="http://kev009.com/wp/2008/12/more-linux-file-systems/"&gt;More Linux File Systems&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tango File Manager" src="http://kev009.com/wp/assets/2008/11/120px-system-file-managersvg.png"&gt;&lt;/p&gt;
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Although the file system is one of the most important pieces of an
operating system, we generally put little thought into them these days.
Put bits in, pull bits out. It usually works well enough for desktop
systems - until the power fails - but even …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Update: &lt;a href="http://kev009.com/wp/2008/12/more-linux-file-systems/"&gt;More Linux File Systems&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Tango File Manager" src="http://kev009.com/wp/assets/2008/11/120px-system-file-managersvg.png"&gt;&lt;/p&gt;
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;Although the file system is one of the most important pieces of an
operating system, we generally put little thought into them these days.
Put bits in, pull bits out. It usually works well enough for desktop
systems - until the power fails - but even that is usually pretty
painless these days.&lt;/p&gt;
&lt;p&gt;On Linux, there are many contenders in the file system arena. ext2 had
been the standard for many years, though around 2001 and onward a few
other choices become mainstream. Without delving into too much history:
journaling support was added to ext2 in the form of ext3, ReiserFS is
released, SGI ported XFS, and IBM ported JFS in no specific order. For
a few reasons, mostly political, ext3 becomes the de facto file system
for Linux.&lt;/p&gt;
&lt;p&gt;&lt;img alt="UNIX - Live Free or Die" src="http://kev009.com/wp/assets/2008/11/unix_plate-small.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;Classic File Systems&lt;/h3&gt;
&lt;p&gt;In what I will refer to as "classic" file systems, the idea is basically
the same. They essentially bolt journaling to the traditional file
system UNIX layout. Here are the highlights from each of these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;XFS is hailed by some for its excellent support of large files and
    large file systems, and has some nice modern amenities like extents,
    delayed allocation, and online defragmentation.
    [&lt;a href="http://en.wikipedia.org/wiki/Xfs"&gt;http://en.wikipedia.org/wiki/Xfs&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;XFS is not without a fair share of faults though. It's a somewhat
half hearted port in my opinion. Mainly due to its IRIX roots,
performance is usually comparable to the other era file systems but
CPU usage is relatively high
[&lt;a href="http://www.debian-administration.org/articles/388"&gt;http://www.debian-administration.org/articles/388&lt;/a&gt;]. Data
atrocities after power outage or machine crashes seem to be common
and even design decision. This LKML posting really struck a nerve
with me: &lt;a href="http://lkml.org/lkml/2007/3/28/316"&gt;http://lkml.org/lkml/2007/3/28/316&lt;/a&gt;. A lot can go wrong
on the hardware side of things, and if a file system is not privy to
this it is a recipe for disaster. ZFS is a hero here with
checksumming, which I will touch lightly later.&lt;/p&gt;
&lt;p&gt;It is worth noting that XFS is still under active development and
has a decent roadmap forward [&lt;a href="http://www.xfs.org"&gt;http://www.xfs.org&lt;/a&gt;]&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ReiserFS (Reiser3) is one of the first journaling file systems for
    Linux. It has some initial growing pains, but is quite a nice file
    system by kernel 2.6.&lt;/p&gt;
&lt;p&gt;Performance is excellent with small files, but its scalability is
questioned by many of the Linux elite
[&lt;a href="http://en.wikipedia.org/wiki/Reiserfs"&gt;http://en.wikipedia.org/wiki/Reiserfs&lt;/a&gt;]. Hans Reiser then goes on
to work on Reiser4 which is essentially a rewrite. SUSE Linux keeps
a few developers on it, but it becomes pretty clear that this is a
doomed file system [&lt;a href="http://www.linux.com/feature/57788"&gt;http://www.linux.com/feature/57788&lt;/a&gt;].&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IBM's JFS is another of the UNIX ports. JFS traces its lineage back
    to IBM's AIX in 1990. An IBM team ports and improves it for use in
    OS/2 and later releases the code as free, open source software
    (FOSS).&lt;/p&gt;
&lt;p&gt;The resulting Linux file system is noted for being scalable,
resilient, and in particular easy on the CPU
[&lt;a href="http://en.wikipedia.org/wiki/JFS_(file_system)"&gt;http://en.wikipedia.org/wiki/JFS_(file_system)&lt;/a&gt;]. It also
includes extents support. For whatever reason the kernel community
and distros don't really latch on to it. JFS is basically just
slowly maintained throughout its life cycle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ext3 is a journaling extension of the Linux native ext2. Out of all
    the file systems in this generation, it is probably the least
    technologically advanced lacking features like extents. What makes
    up for this is the easy upgrade path for ext2 users, relatively
    simple code base, and broad upstream adoption.
    [&lt;a href="http://en.wikipedia.org/wiki/Ext3"&gt;http://en.wikipedia.org/wiki/Ext3&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;Broad upstream adoption makes ext3 winner for most users and
distributions, and it is now the most stable and supported Linux
file system.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In hindsight it seems somewhat tragic that JFS or even XFS didn't gain
the traction that ext3 did to pull us through the "classic" era, but
ext3 has proven very reliable and has received consistent care and
feeding to keep it performing decently.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Disk Layout" src="http://kev009.com/wp/assets/2008/11/ext4.png"&gt;&lt;/p&gt;
&lt;h3&gt;Nextgen File Systems&lt;/h3&gt;
&lt;p&gt;In 2005, Sun Microsystems released the bombshell ZFS file system. This
ushered in the era of what I will call "nextgen" file systems. As hard
disks have gotten larger, strategies for backup, integrity checking, and
support for large files have become much more important. These file
systems also aim to ease management by blurring the traditional VFS line
or offering tight integration with LVM and RAID. Silent corruption by
bad hardware is also cause for alarm, and checksumming has been baked
into some of these "nextgen" file systems to counter this.&lt;/p&gt;
&lt;p&gt;In many ways, Linux was caught completely off guard and most developers
weren't thinking very hard about the future of file systems prior to the
ZFS release. Reiser4 explored some interesting ideas and aimed to be a
killer file system (okay I'm really tasteless...) but Hans Reiser enjoyed
a particularly bitter relationship with other kernel devs. Luckily,
some even more advanced file systems have come into existence recently.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Reiser4 was the first effort for a next generation Linux file
    system. Introduced in 2004, it seemed to have some excellent new
    technology including transactions, delayed allocation, and an
    interesting plugin architecture for adding features like encryption
    and compression. Hans Reiser even advertised using the file system
    directly as a database with advanced metadata.&lt;/p&gt;
&lt;p&gt;Reiser, the primary developer, often rubbed other kernel developers
the wrong way when championing his new file system. Hans seemed to
get defensive when questioned about code style and design decisions
- particularly that of the plugin architecture. I think that a lot
of this was due to misunderstanding and bad tempers, but to this day
Reiser4 has yet to enter Linus' kernel tree. With Hans Reiser's
murder conviction in 2008, the future of Reiser4 was frequently
called into question. At this point it seems unlikely that Reiser4
will ever see upstream adoption, but some of the ideas explored have
already been integrated into other "nextgen" file systems.
[&lt;a href="http://en.wikipedia.org/wiki/Reiser4#Integration_with_Linux"&gt;http://en.wikipedia.org/wiki/Reiser4#Integration_with_Linux&lt;/a&gt;].&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ext4 was started as an effort to make a 64 bit ext3 to support large
    file systems. Later, others (Lustre, IBM, Bull - &lt;em&gt;see [Theodore
    T'so comment below, #25&lt;/em&gt; got involved and added extents, delayed
    allocation, online defragmentation, and more.
    [&lt;a href="http://en.wikipedia.org/wiki/Ext4"&gt;http://en.wikipedia.org/wiki/Ext4&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;ext4 enjoys forward compatibility with ext3, and limited backward
compatibility if extents are not enabled. Again the clear advantage
here is that it improves upon the stable ext3 base, provides an easy
migration path, and has many great developers working on it.
However, it needs to be said that ext4 is still somewhat of a
"classic" file system and doesn't have the level of features and
scalability that the other "nextgen" file systems do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Btrfs is clearly Linux's response to ZFS. Started by Oracle, this
    project has gained backing from all of the major Linux
    corporations. Traffic on LKML suggests that this will be the file
    system to carry on the torch from ext4.&lt;/p&gt;
&lt;p&gt;Btrfs' key design feature is copy-on-write which will allow for
inexpensive snapshots useful for backup and recovery. The goal is
to completely surpass ZFS however, and many exiting features such as
data/journal checksums, tight device-mapper integration, built in
RAID, online fsck, SSD optimization options and even in place ext3
upgrades are being worked on [&lt;a href="http://btrfs.wiki.kernel.org/"&gt;http://btrfs.wiki.kernel.org/&lt;/a&gt;].&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;On the tails of Btrfs, another advanced file system called Tux3 has
    been announced. The project's developers have been making use of
    FUSE to quickly prototype and test ideas. The initial work on a
    kernel port has just been posted
    [&lt;a href="http://lkml.org/lkml/2008/11/26/13"&gt;http://lkml.org/lkml/2008/11/26/13&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;This project aims to do away with traditional journaling, instead
playing back the logs (or recovering) on every mount. It will also
feature inexpensive snapshots and versioning. The project's
developers seem to be quite good at championing their ideas, but I
predict it will be up to 3 years before we see this ready for
mainstream use since coding has really just begun
[&lt;a href="http://tux3.org/"&gt;http://tux3.org/&lt;/a&gt;].&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Conclusions&lt;/h3&gt;
&lt;p&gt;With ext4 coming out in kernel 2.6.28, we should have a nice holdover
until Btrfs or Tux3 begin to stabilize. The Btrfs developers have been
working on a development sprint and it is likely that the code will be
merged into Linus's kernel within the next cycle or two
[&lt;a href="http://www.heise-online.co.uk/news/Kernel-Log-Ext4-completes-development-phase-as-interim-step-to-btrfs--/111742"&gt;http://www.heise-online.co.uk/news/Kernel-Log-Ext4-completes-development-phase-as-interim-step-to-btrfs--/111742&lt;/a&gt;].&lt;/p&gt;
&lt;p&gt;It seems pretty clear that Solid State Disks (SSD) will be here for
good. Theoretically these should blow magnetic storage away in terms of
speed. We are already starting to see competitive write performance,
and random access and IOPS are very impressive with the latest Intel
SSDs. It is good to know that Btrfs plans to incorporate SSD
optimization from the start, but these new devices may warrant yet
another file system to achieve maximum speed. I personally think that
wear leveling and FAT emulation are holding these devices back and would
be better implemented by the file system.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;P.S.:&lt;br&gt;
I'd been meaning to write this article for a while, but things have
been changing rapidly with the introduction of ZFS, Btrfs, and Tux3. I
plan on doing benchmarks soon with kernel 2.6.28 against all the classic
file systems, ext4, and Btrfs so subscribe to my RSS feed if you are
interested. Any comments, corrections, or questions would also be
appreciated!&lt;/p&gt;
&lt;p&gt;P.P.S.:&lt;br&gt;
Wordpress seems to mangle the format of this post so the bullet
justifications are off.&lt;/em&gt;&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Linux"></category></entry><entry><title>KDE4 on Gentoo</title><link href="http://kev009.com/wp/2008/05/kde4-on-gentoo/" rel="alternate"></link><published>2008-05-16T11:18:00-07:00</published><updated>2008-05-16T11:18:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-05-16:/wp/2008/05/kde4-on-gentoo/</id><summary type="html">&lt;p&gt;So I bit the bullet and installed KDE 4.0 on Gentoo. Version 4.0.4
recently hit the tree, and with some minor hackary to package.unmask and
package.keywords I have a nice spartan KDE 4.0.4 desktop that I am
typing this in.&lt;/p&gt;
&lt;p&gt;My observations:&lt;/p&gt;
&lt;p&gt;Like …&lt;/p&gt;</summary><content type="html">&lt;p&gt;So I bit the bullet and installed KDE 4.0 on Gentoo. Version 4.0.4
recently hit the tree, and with some minor hackary to package.unmask and
package.keywords I have a nice spartan KDE 4.0.4 desktop that I am
typing this in.&lt;/p&gt;
&lt;p&gt;My observations:&lt;/p&gt;
&lt;p&gt;Like Gentoo's KDE3 packaging, you are given KDE4 pretty much as it is
packaged upstream. It certainly lacks the polish that Fedora 9 and
OpenSUSE 11 have been able to apply.&lt;/p&gt;
&lt;p&gt;The desktop is somewhat of an afterthought at this point. Basic icon
grid alignment and drag selection don't work. Icons on the desktop are
treated as widgets which means you can rotate them and such which may be
something to build on in the future. However this area basically needs
work.&lt;/p&gt;
&lt;p&gt;Oxygen is beautiful. Seriously, everything looks stunning and it does
not get in the way. It's not gaudy. Very professional. Still room for
improvement though, I.E. icon set isn't complete, consistency.&lt;/p&gt;
&lt;p&gt;kwin's built in composting is awesome. This is exactly the kind of thing
I've been waiting for. It doesn't have the heavy weight and gaudy
appearance of Compiz or Vista. This will be a major productivity boost.
Tabbing through windows, expose-zoom overview, and a heads-up of virtual
desktops are the things I will use. The light shadowing and animation
are also refreshing and professional. Nothing to get in the way here, it
is stable and speedy.&lt;/p&gt;
&lt;p&gt;The application launcher is a major pain in the ass. The integrated
search is handy, but it just takes too many damn clicks to find an app
otherwise. This will be especially unwelcome by new users since you
might not know if the app you want is in 'Internet' or 'Development' or
'Multimedia' or even 'More Applications' under any of these. Every time
you click the menu it starts from the favorites pane and does not
remember the category you were in. I don't think the Windows 95 style
start menu is the final or best UI answer, but it beats this Vista style
menu and the OS X dock abomination hands down.&lt;/p&gt;
&lt;p&gt;Basically, plasma as a whole needs work. Widgets seem pretty glitchy.
Also responsible for the above desktop nuances.&lt;/p&gt;
&lt;p&gt;Apps are hit or miss. Gwenview is great for thumbing through pictures.
okular does the same for documents. Dolphin works very well for most
tasks, while Konqueror is there for you otherwise. Many of the games
have been updated and are pretty good. Marble, Kalzium - just plain
cool. Ark was one of my unsung heros on KDE3. It is severely lacking in
KDE 4.0. I hope that it gets some attention, and shell integration back
too! A lot of other utilities are either absent or need work as well.&lt;/p&gt;
&lt;p&gt;Amarok 2 has yet to be released, but this will be a major influence when
it is.&lt;/p&gt;
&lt;p&gt;Speed! KDE4 is quick. This is a welcome relief. Once KDE4 starts to gel,
I'd imagine it will run at least as well as KDE3 on old hardware. Build
speed was much quicker with cmake, which is very welcome on Gentoo.&lt;/p&gt;
&lt;p&gt;Stability is much improved in this release. It still is not
business-grade. Trivial apps seem to crash on exit and such.&lt;/p&gt;
&lt;p&gt;The Weird? The default window size for just about everything seems
unnecessarily small. I find myself having to resize pretty much
everything before I can use it.&lt;/p&gt;
&lt;p&gt;In conclusion, KDE 4.0 is a giant leap forward but it is a work in
progress...&lt;/p&gt;
&lt;p&gt;If you are migrating from KDE3 on an old install, best wait as there is
some adjustment. KDE 4.0 as packaged in Fedora 9 and OpenSUSE 11 seem
quite usable however. I wouldn't hesitate to install them on a new PC. I
will certainly keep KDE 4.0 installed and re-evaluate with 4.1, but KDE3
has a better work flow for my use at the moment.&lt;/p&gt;
&lt;p&gt;It reminds me a lot of Apple's OS 9 to OS X transition. I've been
following the development for some time. From the alphas, betas, and
release in January, I'm quite surprised by where we are at today. Things
are much better than they were just six short months ago. A lot of work
has taken place and we are really forging the foundation for a first
rate competitor in the PC desktop arena for the next 10 years. KDE 4.1
should be be released near the end of the summer. I believe it will be
enough to convert many KDE3 users over. Things should really calm down
and align by 4.2 and it will no doubt in my mind be the best desktop
environment whatsoever at this point.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="kde"></category><category term="Linux"></category></entry><entry><title>Ableton Live 7 MIDI Problems</title><link href="http://kev009.com/wp/2008/05/ableton-live-7-midi-problems/" rel="alternate"></link><published>2008-05-15T03:59:00-07:00</published><updated>2008-05-15T03:59:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-05-15:/wp/2008/05/ableton-live-7-midi-problems/</id><summary type="html">&lt;p&gt;A lot of people are having trouble with &lt;a href="http://ableton.com"&gt;Ableton&lt;/a&gt; Live 7.  This is
especially true with MIDI functionality.  It stems from the fact that
Live 7 defaults to the DirectMusic MIDI interface.  Apparently
DirectMusic then has to do emulation because the standard Microsoft MIDI
driver is not DirectMusic native (Microsoft …&lt;/p&gt;</summary><content type="html">&lt;p&gt;A lot of people are having trouble with &lt;a href="http://ableton.com"&gt;Ableton&lt;/a&gt; Live 7.  This is
especially true with MIDI functionality.  It stems from the fact that
Live 7 defaults to the DirectMusic MIDI interface.  Apparently
DirectMusic then has to do emulation because the standard Microsoft MIDI
driver is not DirectMusic native (Microsoft, we will never understand
you..).  This is true for most USB MIDI devices.&lt;/p&gt;
&lt;p&gt;This was affecting me by introducing high latency into MIDI I/O with my
Novation Remote 61 SL and Akai MPD24.  Initially all seemed well.&lt;br&gt;
Gradually, hitting a note on my keyboard would get slower and slower
until the point where it was unusable.  We're talking hit a key and wait
tens of seconds before the note plays.&lt;/p&gt;
&lt;p&gt;Luckily the fix is pretty easy.  Open up the MIDI preferences, and click
the small arrow next to all your inputs and outputs.  Now simply click
the port type and it will change from DirectMusic to MME.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Change all your MIDI port types from DirectMusic to MME" src="http://kev009.com/wp/assets/2008/05/ableton-midi-mme.png"&gt;&lt;/p&gt;
&lt;p&gt;According to the forums, there are no drawbacks to this approach.  It is
unfortunate that Ableton decided to make this a default since so many
people have had troubles with it.&lt;/p&gt;</content><category term="misc"></category><category term="Computer Music"></category></entry><entry><title>Fedora 9, KDE 4.0 done right</title><link href="http://kev009.com/wp/2008/05/fedora-9-kde-40-done-right/" rel="alternate"></link><published>2008-05-13T22:43:00-07:00</published><updated>2008-05-13T22:43:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2008-05-13:/wp/2008/05/fedora-9-kde-40-done-right/</id><summary type="html">&lt;p&gt;Wow!&lt;/p&gt;
&lt;p&gt;I just downloaded the &lt;a href="http://fedoraproject.org/en/get-fedora"&gt;Fedora 9&lt;/a&gt; KDE live spin. I am impressed. I
tried a few of the betas along the way, but this is very polished. Much
better than Ubuntu's try at KDE4.&lt;/p&gt;
&lt;p&gt;It feels very responsive and works very well, even as a LiveCD under
VMWare. This …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Wow!&lt;/p&gt;
&lt;p&gt;I just downloaded the &lt;a href="http://fedoraproject.org/en/get-fedora"&gt;Fedora 9&lt;/a&gt; KDE live spin. I am impressed. I
tried a few of the betas along the way, but this is very polished. Much
better than Ubuntu's try at KDE4.&lt;/p&gt;
&lt;p&gt;It feels very responsive and works very well, even as a LiveCD under
VMWare. This is KDE4.0 done right. I'm banking on OpenSUSE 11 having
an even better build from the betas I've seen.&lt;/p&gt;
&lt;p&gt;By KDE 4.1's arrival, I imagine KDE will be ready for prime time and
most users will be able to migrate over.&lt;/p&gt;
&lt;p&gt;But all in all, if you want a nice Linux desktop right now, Fedora 9
seems to have hit it pretty well.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Linux"></category></entry><entry><title>My thoughts on software and complexity</title><link href="http://kev009.com/wp/2007/06/my-thoughts-on-software-and-complexity/" rel="alternate"></link><published>2007-06-28T23:23:00-07:00</published><updated>2007-06-28T23:23:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2007-06-28:/wp/2007/06/my-thoughts-on-software-and-complexity/</id><summary type="html">&lt;p&gt;My thoughts on the growth of the Linux kernel and the status quo of
using and developing software..&lt;/p&gt;
&lt;p&gt;Prompted by discussion of this article: &lt;a href="http://hubpages.com/hub/_86_Mac_Plus_Vs_07_AMD_DualCore_You_Wont_Believe_Who_Wins"&gt;1986 Mac Plus Vs. 2007 AMD
DualCore. You Won't Believe Who Wins&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;p&gt;[Ed: My response to accusations of Linux Kernel bloat]&lt;/p&gt;
&lt;p&gt;The [Linux] kernel never has …&lt;/p&gt;</summary><content type="html">&lt;p&gt;My thoughts on the growth of the Linux kernel and the status quo of
using and developing software..&lt;/p&gt;
&lt;p&gt;Prompted by discussion of this article: &lt;a href="http://hubpages.com/hub/_86_Mac_Plus_Vs_07_AMD_DualCore_You_Wont_Believe_Who_Wins"&gt;1986 Mac Plus Vs. 2007 AMD
DualCore. You Won't Believe Who Wins&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;--&lt;/p&gt;
&lt;p&gt;[Ed: My response to accusations of Linux Kernel bloat]&lt;/p&gt;
&lt;p&gt;The [Linux] kernel never has really been the problem. In 1 to 2 MB of
compressed/compiled code on my computer (gentoo-sources + my custom
.config and a couple of patch sets from future merges), there is some of
the most advanced file system, networking, protocol, hardware and
scheduling code ever conceived. Indeed, there are many areas that need
work and are constantly being updated, but find me a kernel that
supports NUMA, scales quite linearly with SMP, implements fair queuing
of IO and CPU scheduling, has NO tick interval, virtualization and
supports a wide gamut of platforms and hardware. It runs on systems as
small as a microcontroller and as large as BlueGene/L. Did I mention it
is free and I can learn from and hack on it?&lt;/p&gt;
&lt;p&gt;The kernel isn't really expanding at a rate to be concerned with,
because only a small subset ends up being needed for most users and
systems. No, the problem really lies in user space on UNIX systems.
Modern UNIX userland involves many many layers of programs interacting
and building on top of each other. I really don't see it getting better
in the future either. As higher and higher levels of programing
languages are being used, more and more layers are added to the onion.
This can make a programmer's life easier and allows more complex systems
to be designed, but there are many drawbacks as well. Bug creep, feature
creep, usability, complexity, and resource usage all come to mind.&lt;/p&gt;
&lt;p&gt;Do I know the answer? Not at all. I don't think there is one. Software
will develop organically in the wake of hardware progress for the
foreseeable future. If and when this progress slows, perhaps things will
change course. A sea change of compiler optimization, small is beuatiful
engineering, and an emphasis on efficiency..&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category><category term="Linux"></category><category term="Programming"></category></entry><entry><title>Linux: Btrfs, File Data and Metadata Checksums</title><link href="http://kev009.com/wp/2007/06/linux-btrfs-file-data-and-metadata-checksums/" rel="alternate"></link><published>2007-06-14T13:57:00-07:00</published><updated>2007-06-14T13:57:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2007-06-14:/wp/2007/06/linux-btrfs-file-data-and-metadata-checksums/</id><content type="html">&lt;p&gt;Chris Mason announced an early alpha release of his new Btrfs
filesystem, "after the last FS summit, I started working on a new
filesystem that maintains checksums of all file data and metadata." The
Linux answer to ZFS?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kerneltrap.org/node/8376"&gt;read more&lt;/a&gt; | &lt;a href="http://digg.com/linux_unix/Linux_Btrfs_File_Data_and_Metadata_Checksums"&gt;digg story&lt;/a&gt;&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Linux"></category></entry><entry><title>Syncing Directories with Multiple Computers</title><link href="http://kev009.com/wp/2007/06/syncing-directories-with-multiple-computers/" rel="alternate"></link><published>2007-06-13T01:12:00-07:00</published><updated>2007-06-13T01:12:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2007-06-13:/wp/2007/06/syncing-directories-with-multiple-computers/</id><summary type="html">&lt;p&gt;I have a laptop, a workstation, and a server at home that I use daily. I
also have a collection of code, documents, and music that are useful to
have locally on all three -- especially the laptop when traveling. For a
while I would just copy files over the network …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I have a laptop, a workstation, and a server at home that I use daily. I
also have a collection of code, documents, and music that are useful to
have locally on all three -- especially the laptop when traveling. For a
while I would just copy files over the network (NFS and CIFS), or use
the server but this has gotten tedious as the amount of data has grown.
So I went looking for a syncing app.&lt;/p&gt;
&lt;p&gt;I had two requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It must not run as a service - I don't want yet another program
    loading at boot time or hogging RAM. Transfers should use NFS.
    Preferable since I am already running it and for speed.&lt;/li&gt;
&lt;li&gt;It must be initiated from the client side - I don't want to SSH into
    computer X to push or pull an update&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Unison&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.cis.upenn.edu/~bcpierce/unison/"&gt;Unison&lt;/a&gt; has received a lot of hype. It certainly shows a lot of
potential. Amongst notable features, it supports bi-directional syncing.
You can have changes in the local and remote directories and
interactively merge them. It also has a GUI for simplifying this and
handling collisions. During my test, performance was terrible and it
crashed during the merge. I read somewhere in the FAQ that using Unison
with NFS isn't ideal. It prefers to use SSH or a socket, which goes
against one of my requirements. In short, this is a program to watch and
it may be suitable for smaller file sets -- but it simply did not work
well here. The final strike is that it is no longer a research project
and only lightly maintained.&lt;/p&gt;
&lt;p&gt;rsync&lt;/p&gt;
&lt;p&gt;&lt;a href="http://rsync.samba.org/"&gt;rsync&lt;/a&gt; is a very powerful program. Its method of file transfer
minimizes I/O and is fast. It is essentially unidirectional, so it lacks
the power that Unison has in this regard. For my use case, this won't be
a problem since updates happen on one system at a time and are usually
pushed to the server. Gentoo users will be all to familiar with rsync
when updating portage with 'emerge --sync'.&lt;/p&gt;
&lt;p&gt;Using rsync is simple. 'rsync -av SOURCE DESTINATION' will be suitable
for most jobs. A quick view of the man page will give a rundown on the
options. Using a hub and spoke topology, I can sync all three in any
direction: laptop &amp;lt;--&amp;gt; server &amp;lt;--&amp;gt; workstation.&lt;/p&gt;
&lt;p&gt;I'm not sure why I waited so long to do this. It is incredibly efficient
and easy and I recommend a similar setup if you have two or more
computers. It nicely complements a version control system for things
that don't need to be tracked over time.&lt;/p&gt;</content><category term="misc"></category><category term="Linux"></category></entry><entry><title>Cheap fetchmail Trick</title><link href="http://kev009.com/wp/2007/06/cheap-fetchmail-trick/" rel="alternate"></link><published>2007-06-06T21:11:00-07:00</published><updated>2007-06-06T21:11:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2007-06-06:/wp/2007/06/cheap-fetchmail-trick/</id><summary type="html">&lt;p&gt;I've had a pretty advanced email system running at home (Postfix,
SpamAssassin, Dovecot, Fetchmail) for over a year. The original goal was
spam filtering for some 10 year old POP3 mail accounts from my old ISP
that were heavily spammed. I couldn't be more pleased with the system;
false positives …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I've had a pretty advanced email system running at home (Postfix,
SpamAssassin, Dovecot, Fetchmail) for over a year. The original goal was
spam filtering for some 10 year old POP3 mail accounts from my old ISP
that were heavily spammed. I couldn't be more pleased with the system;
false positives [not spam] are next to zero and very few false negatives
[spam] slide through. I might even write a guide for doing a similar
setup in the future, but not today.&lt;/p&gt;
&lt;p&gt;One of the kinks along the way involved fetchmail. There was an email
account that I needed delivered to two separate local user's inboxes.
fetchmail and alternative getmail have no way of doing this natively
from what I could tell. You simply can't have the same mail account
twice. The question on IRC brought about strange solutions such as using
procmail or aliases, but there were several disadvantage I could think
of, especially involving the per user Bayes learning provided by
SpamAssassin.&lt;/p&gt;
&lt;p&gt;So I got to thinking, what if I simply fooled fetchmail into thinking
that the account was actually two different accounts or servers. And
here it is, .fetchmailrc.&lt;/p&gt;
&lt;p&gt;poll bowling2-kev&lt;br&gt;
uidl&lt;br&gt;
proto pop3&lt;br&gt;
auth password&lt;br&gt;
via pop.isp.tld&lt;br&gt;
user "bowling@isp.tld"&lt;br&gt;
pass "supersecretpassword"&lt;br&gt;
keep&lt;br&gt;
is kev009&lt;/p&gt;
&lt;p&gt;poll bowling2-bowling&lt;br&gt;
proto pop3&lt;br&gt;
auth password&lt;br&gt;
via pop.isp.tld&lt;br&gt;
user "bowling@isp.tld."&lt;br&gt;
pass "supersecretpassword"&lt;br&gt;
is bowling&lt;/p&gt;
&lt;p&gt;There are two key things going on here. The first account uses the keep
attribute, similar to the "leave mail on server" option in client
software. The interesting bit is in the second account. If you look on
the line beginning with 'user', there is a trailing period. I am simply
taking advantage of the fact that fetchmail thinks this is a different
host. In reality the final period is the FQDN (Fully Qualified Domain
Name), including the root DNS zone so it is the same host.&lt;/p&gt;
&lt;p&gt;I speculate that if entries were added to the /etc/hosts file, this
could be scaled to more than two users. Also, uidl and keep across all
the accounts could prevent the chance of a mail going to only the final
fetchmail entry, if it arrives between fetches. The disadvantage would
be overflowing mailboxes if they are not externally pruned, and longer
fecthes.&lt;/p&gt;
&lt;p&gt;So there you have it, a quick and dirty hack for fetchmailing one remote
account to two local users.&lt;/p&gt;</content><category term="misc"></category><category term="Linux"></category></entry><entry><title>I Love IBM</title><link href="http://kev009.com/wp/2007/06/i-love-ibm/" rel="alternate"></link><published>2007-06-03T03:13:00-07:00</published><updated>2007-06-03T03:13:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2007-06-03:/wp/2007/06/i-love-ibm/</id><summary type="html">&lt;p&gt;Just taking a moment to express my appreciation for IBM. Yes, I'm a bit
of an IBM fanboy.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www-03.ibm.com/press/us/en/presskit/21546.wss"&gt;POWER6&lt;/a&gt; is geared for release, and it's badass. Check out this Ars
Technica article for a good run down:&lt;br&gt;
&lt;a href="http://arstechnica.com/news.ars/post/20070521-ibms-power6-flies-the-coop-at-4-7ghz.html"&gt;IBM's POWER6 flies the coop at 4.7GHz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Simply put, IBM is the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Just taking a moment to express my appreciation for IBM. Yes, I'm a bit
of an IBM fanboy.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www-03.ibm.com/press/us/en/presskit/21546.wss"&gt;POWER6&lt;/a&gt; is geared for release, and it's badass. Check out this Ars
Technica article for a good run down:&lt;br&gt;
&lt;a href="http://arstechnica.com/news.ars/post/20070521-ibms-power6-flies-the-coop-at-4-7ghz.html"&gt;IBM's POWER6 flies the coop at 4.7GHz&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Simply put, IBM is the only company competing with Intel on Silicon
process technology. IBM is part of an alliance with Freescale,
Chartered, Samsung, AMD and others so their innovation can and will
trickle down to the consumer market.&lt;/p&gt;
&lt;p&gt;This is what I'm talking about:&lt;br&gt;
&lt;a href="http://www-03.ibm.com/press/us/en/pressrelease/21474.wss"&gt;Made in IBM Labs: 10 Chip Breakthroughs in 10 Years&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thank you.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category></entry><entry><title>Gentoo 2007.0 Released!</title><link href="http://kev009.com/wp/2007/05/gentoo-20070-released/" rel="alternate"></link><published>2007-05-07T12:53:00-07:00</published><updated>2007-05-07T12:53:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2007-05-07:/wp/2007/05/gentoo-20070-released/</id><summary type="html">&lt;p&gt;"The Gentoo project is pleased to announce the much-delayed release of
Gentoo Linux 2007.0. This release met with several delays due to an
abnormally high number of security vulnerabilities in large packages
which had to be rebuilt using the newer, secure versions of the
packages." A new installer, and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;"The Gentoo project is pleased to announce the much-delayed release of
Gentoo Linux 2007.0. This release met with several delays due to an
abnormally high number of security vulnerabilities in large packages
which had to be rebuilt using the newer, secure versions of the
packages." A new installer, and much needed install media bumps round
this one out.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.gentoo.org/news/20070507-release-2007.0.xml"&gt;read more&lt;/a&gt; | &lt;a href="http://digg.com/linux_unix/Gentoo_2007_0_Released_DIRECT_LINK"&gt;digg story&lt;/a&gt;&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Gentoo"></category><category term="Linux"></category></entry><entry><title>Linux Kernel 2.6.21 and Tickless Kernel (CONFIG_NO_HZ)</title><link href="http://kev009.com/wp/2007/04/linux-kernel-2621-and-tickless-kernel-config_no_hz/" rel="alternate"></link><published>2007-04-26T23:35:00-07:00</published><updated>2007-04-26T23:35:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2007-04-26:/wp/2007/04/linux-kernel-2621-and-tickless-kernel-config_no_hz/</id><summary type="html">&lt;p&gt;So &lt;a href="http://www.kernel.org/"&gt;Linux kernel&lt;/a&gt; 2.6.21 is finally out and all the buzz is about the
&lt;a href="http://lwn.net/Articles/223185/"&gt;Tickless Kernel patches&lt;/a&gt;. Wanting to drink the kool aid, I downloaded
the freshly released &lt;a href="http://dev.gentoo.org/~dsd/genpatches"&gt;gentoo-sources&lt;/a&gt;. Unfortunately, it looks like
amd64 support has not yet made it in.&lt;/p&gt;
&lt;p&gt;I pulled some numbers on my main …&lt;/p&gt;</summary><content type="html">&lt;p&gt;So &lt;a href="http://www.kernel.org/"&gt;Linux kernel&lt;/a&gt; 2.6.21 is finally out and all the buzz is about the
&lt;a href="http://lwn.net/Articles/223185/"&gt;Tickless Kernel patches&lt;/a&gt;. Wanting to drink the kool aid, I downloaded
the freshly released &lt;a href="http://dev.gentoo.org/~dsd/genpatches"&gt;gentoo-sources&lt;/a&gt;. Unfortunately, it looks like
amd64 support has not yet made it in.&lt;/p&gt;
&lt;p&gt;I pulled some numbers on my main workstation, a dual Opteron machine.
The first command lists the number of interrupts. You'll notice that the
'timer' interrupt is primarily firing on CPU1. Below this is the output
of `sensors`. Here you can see CPU1, again which 'timer' is firing, is
running about 13°F higher than CPU0. These numbers are pretty consistent
when I let the machine idle, so I am going to postulate that the timer
interrupt is responsible for the thermal difference. It will be
interesting to revisit the issue once amd64 support is added to
CONFIG_NO_HZ, and I will post as soon as the results are in.&lt;/p&gt;
&lt;p&gt;kev009@kev-ws-amd64 ~ $ cat /proc/interrupts&lt;br&gt;
CPU0 CPU1&lt;br&gt;
0: 969 9294483 IO-APIC-edge timer&lt;br&gt;
1: 10545 28 IO-APIC-edge i8042&lt;br&gt;
6: 0 3 IO-APIC-edge floppy&lt;br&gt;
7: 0 0 IO-APIC-edge parport0&lt;br&gt;
8: 0 0 IO-APIC-edge rtc&lt;br&gt;
9: 0 2 IO-APIC-fasteoi acpi&lt;br&gt;
12: 5 127 IO-APIC-edge i8042&lt;br&gt;
15: 276725 718 IO-APIC-edge ide1&lt;br&gt;
16: 746315 1666 IO-APIC-fasteoi ehci_hcd:usb1, nvidia&lt;br&gt;
17: 59746 5990 IO-APIC-fasteoi libata&lt;br&gt;
18: 282186 1581 IO-APIC-fasteoi ohci_hcd:usb2&lt;br&gt;
19: 0 0 IO-APIC-fasteoi ohci_hcd:usb3&lt;br&gt;
26: 280054 128 IO-APIC-fasteoi EMU10K1&lt;br&gt;
28: 355905 111 IO-APIC-fasteoi eth0&lt;br&gt;
38: 0 15 IO-APIC-fasteoi aic79xx&lt;br&gt;
39: 160124 1762 IO-APIC-fasteoi aic79xx&lt;br&gt;
NMI: 2068 1916&lt;br&gt;
LOC: 9294591 9294562&lt;br&gt;
ERR: 0&lt;br&gt;
kev009@kev-ws-amd64 ~ $ sensors -f&lt;br&gt;
k8temp-pci-00c3&lt;br&gt;
Adapter: PCI adapter&lt;br&gt;
Core0 Temp:&lt;br&gt;
+120 F&lt;/p&gt;
&lt;p&gt;k8temp-pci-00cb&lt;br&gt;
Adapter: PCI adapter&lt;br&gt;
Core0 Temp:&lt;br&gt;
+133 F&lt;/p&gt;
&lt;p&gt;My x86 server was a bit more evenhanded with its interrupts, so I can't
do a thermal comparison like the above. So throwing caution to the wind
I compiled a pair of 2.6.21 kernels: one with CONFIG_NO_HZ and
CONFIG_HIGH_RES_TIMERS, and the other without. Armed with a
kill-a-watt meter, it's time to see if there is any empirical evidence on
power usage.&lt;/p&gt;
&lt;p&gt;Tickless/High Res: 98-101 ~100VA&lt;/p&gt;
&lt;p&gt;250Hz Tick/"Low Res": 99-103 ~102VA&lt;/p&gt;
&lt;p&gt;With this hardware (IBM x330, dual 1GHz PIII, ServerWorks OSB4 chipset)
I see about a 1-2 volt-ampere average drop.&lt;/p&gt;
&lt;p&gt;I'd be interested in seeing others results, particularly on mobile
hardware. Many laptops have a current discharge sensor that could be
used to monitor and measure the difference. I suspect that the
difference would be more noticeable if you run a 1000Hz tick as well.
Please leave a comment or trackback with your thoughts and results.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category><category term="Linux"></category></entry><entry><title>Linux Kernel 2.6.21 Released</title><link href="http://kev009.com/wp/2007/04/linux-kernel-2621-released/" rel="alternate"></link><published>2007-04-26T23:27:00-07:00</published><updated>2007-04-26T23:27:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2007-04-26:/wp/2007/04/linux-kernel-2621-released/</id><summary type="html">&lt;p&gt;Linux Kernel 2.6.21 has been announced. Linus writes: "So the big change
during 2.6.21 is all the timer changes to support a tickless system (and
even with ticks, more varied time sources). Thanks (when it no longer
broke for lots of people ;) go to Thomas Gleixner …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Linux Kernel 2.6.21 has been announced. Linus writes: "So the big change
during 2.6.21 is all the timer changes to support a tickless system (and
even with ticks, more varied time sources). Thanks (when it no longer
broke for lots of people ;) go to Thomas Gleixner and Ingo Molnar and a
cadre of testers and coders."&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.osnews.com/story.php/17768/Linux-Kernel-2.6.21-Released"&gt;read more&lt;/a&gt; | &lt;a href="http://digg.com/linux_unix/Linux_Kernel_2_6_21_Released"&gt;digg story&lt;/a&gt;&lt;/p&gt;</content><category term="misc"></category><category term="Linux"></category></entry><entry><title>Building NAS, Part 2</title><link href="http://kev009.com/wp/2007/04/building-nas-part-2/" rel="alternate"></link><published>2007-04-15T17:13:00-07:00</published><updated>2007-04-15T17:13:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2007-04-15:/wp/2007/04/building-nas-part-2/</id><summary type="html">&lt;p&gt;Building your own Network Attached Storage server&lt;/p&gt;
&lt;p&gt;In an earlier &lt;a href="http://kev009.com/wp/2007/03/ibm-xseries-330-x330-sata-retrofit/"&gt;post&lt;/a&gt;, I discussed what was necessary to cable 1U
servers up with power to run SATA drives. Next, you'll need some drives
and a controller if you have not already purchased them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Controllers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The SATA controller you select is one …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Building your own Network Attached Storage server&lt;/p&gt;
&lt;p&gt;In an earlier &lt;a href="http://kev009.com/wp/2007/03/ibm-xseries-330-x330-sata-retrofit/"&gt;post&lt;/a&gt;, I discussed what was necessary to cable 1U
servers up with power to run SATA drives. Next, you'll need some drives
and a controller if you have not already purchased them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Controllers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The SATA controller you select is one of the most important pieces of
the NAS box. It is my recommendation you get a high quality card, even
if you are just doing RAID-1 (Mirroring). There are basically three
types of controllers: standard, fakeraid, and hardware RAID. A standard
controller is just a host-bus adapter. Any advanced features like
striping and mirroring will need to be performed by your OS. Fakeraid
includes a RAID BIOS, but all processing is left to a software driver.
Hardware RAID is a complete subsystem with a dedicated CPU.&lt;/p&gt;
&lt;p&gt;Standard controllers and fakeraid cards are generally cheap and maybe
even integrated on your motherboard. However, these are rarely a good
choice for servers. Aside from requiring the host to perform a lot more
work, these can also cause a lot of trouble down the road. For instance,
if a hard disk fails with software RAID, the system may not be able to
reboot without intervention. Fakeraid may present the disks to the
machine as one logical disk to avoid this, but these cards are the most
evil. They tend to use closed drivers and proprietary disk formats which
basically means avoid these like the plague. The cards themselves are
fine, just use them like a standard controller and use the software RAID
of your operating system. That leaves us with hardware RAID controllers.&lt;/p&gt;
&lt;p&gt;Hardware RAID controllers are the only logical choice for a server.
Hardware RAID cards offload all RAID processing to a subsystem on the
card. These cards have an integrated CPU to perform parity calculations
for RAID-5, and usually a large amount of RAM to act as cache. The RAM
can even be used as write cache, but it is important to have a battery
&lt;strong&gt;ON THE CARD&lt;/strong&gt; in case of a power failure or crash to avoid potentially
much greater data loss. Hardware RAID controllers present their RAID
volumes as logical disks to the computer and operating system, so faults
are transparent to the host. They also tend to allow hot addition of
storage. Finally, since the card is handling all the I/O, bandwidth
requirements are heavily reduced. If I am writing to a hardware RAID-1
device, data only needs to be sent across the PCI bus once as opposed to
software RAID which will need to write the data to each disk. This is a
very important consideration for older machines that have limited bus
bandwidth and large arrays.&lt;/p&gt;
&lt;p&gt;All things considered, I went with a 3Ware 9500S. Cost:  $100 on eBay.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2007/04/3ware_9500s.jpg"&gt;&lt;img alt="3Ware 9500S" src="http://kev009.com/wp/assets/2007/04/3ware_9500s.thumbnail.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3Ware has good drivers in the Linux kernel, and has been manufacturing
SATA RAID controllers for some time. Other decent manufactures are
Adaptec and LSI Logic. Be sure to check for OS compatibility before
purchasing a card.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hard Drives&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Just because you are getting the price point of SATA, you should not
disregard the quality of drives you are purchasing. Although most
standard consumer drives will work fine, there is a much more attractive
option. Seagate and others offer what they call "nearline" drives which
are basically the consumer drives with a RAID friendly firmware and
continuous duty cycle. What's best is that these usually only have a
$10 or so premium over their consumer counterparts. When it comes to
selecting a manufacturer, take a look at the warranty and technology
integrated in the drives. Seagate and Hitachi are both good choices.
Take a look at reviews too, especially &lt;a href="http://storagereview.com/"&gt;StorageReview&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When most people purchase a hard disk, they make their choice simply on
size. For a server (and even desktop!), you should also consider the
spindle speed and size of the drive cache. 7,200RPM is enough for most
servers, but 10,000RPM will deliver far greater performance under
concurrent and random access. Of course, these usually come at a a heavy
price premium and lesser capacity.&lt;/p&gt;
&lt;p&gt;Here, I went with a pair of nearline Seagate Barracuda ES drives. The
320GB model was ample for my need, but these go all the way up to 750GB.
They use perpendicular magnetic recording which increases density and
speed, and feature a large 16MB cache. My initial testing shows nearly
80MB/s throughput! That level of speed has traditionally only been
available on expensive SCSI disks. Cost:  $100/drive.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2007/04/barracudaes.jpg"&gt;&lt;img alt="Seagate Barracuda ES 320GB" src="http://kev009.com/wp/assets/2007/04/barracudaes.thumbnail.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Networking&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Equally important to a NAS server is ample networking bandwidth. This
is largely dependent on the scale of services, but a decent gigabit NIC
should get you near disk performance. I picked up an Intel Pro/1000 MT
Server Adapter, which features various offloading schemes to free the
host's CPUs from networking tasks. If your needs are greater, consider
aggregating several gigabit ports together. Cost:  $20.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The total cost for storage hardware comes to about $320.&lt;/p&gt;
&lt;p&gt;Cabling the drives up and configuring the array is a pretty straight
forward task. If you chose software RAID, there are plenty of guides on
the internet to assist you in setting up md and device-mapper. Try
&lt;a href="http://linas.org/linux/raid.html"&gt;http://linas.org/linux/raid.html&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;When it comes to RAID levels, the choice depends on the number of drives
you have and the level of protection you need. RAID-1 is a great choice
for most applications in that you get true redundancy and greater read
performance, but at the cost of half the physical capacity. RAID-5 is
also commonly used in which you lose the capacity of one drive, with a
three drive minimum. It allows for the failure of a single drive. With
the size of modern hard disks, RAID-5 is less attractive than it once
was and also suffers from heavy write performance loss due to parity
calculations. Try &lt;a href="http://www.acnc.com/04_01_00.html"&gt;http://www.acnc.com/04_01_00.html&lt;/a&gt; for the lowdown on
various RAID levels.&lt;/p&gt;
&lt;p&gt;My next post will cover file system selection.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category><category term="Projects"></category></entry><entry><title>IBM NetVista 2800 Hacking</title><link href="http://kev009.com/wp/2007/03/ibm-netvista-2800-hacking/" rel="alternate"></link><published>2007-03-29T21:38:00-07:00</published><updated>2007-03-29T21:38:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2007-03-29:/wp/2007/03/ibm-netvista-2800-hacking/</id><summary type="html">&lt;p&gt;Similar to the &lt;a href="http://kev009.com/wp/2007/03/ibm-xseries-330-x330-sata-retrofit/"&gt;x330 SATA mod&lt;/a&gt;, I have some NetVista 2800s that I need
5v/12v accessory power from. I'm doing some experimentation with the
&lt;a href="http://www.asterisk.org/"&gt;Asterisk&lt;/a&gt; open source PBX and wanted to interface with the house
phone lines. I purchased a &lt;a href="http://www.digium.com"&gt;Digium&lt;/a&gt; TDM400P for this task.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2007/03/digium-tdm400p.jpg"&gt;&lt;img alt="Digium TDM400P" src="http://kev009.com/wp/assets/2007/03/digium-tdm400p.thumbnail.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a modular …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Similar to the &lt;a href="http://kev009.com/wp/2007/03/ibm-xseries-330-x330-sata-retrofit/"&gt;x330 SATA mod&lt;/a&gt;, I have some NetVista 2800s that I need
5v/12v accessory power from. I'm doing some experimentation with the
&lt;a href="http://www.asterisk.org/"&gt;Asterisk&lt;/a&gt; open source PBX and wanted to interface with the house
phone lines. I purchased a &lt;a href="http://www.digium.com"&gt;Digium&lt;/a&gt; TDM400P for this task.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2007/03/digium-tdm400p.jpg"&gt;&lt;img alt="Digium TDM400P" src="http://kev009.com/wp/assets/2007/03/digium-tdm400p.thumbnail.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a modular card, with up to 4 lines. Any combination of FXO or
FXS modules can be used. FXS modules to interface with analog telephones
require 5v/12v power. The NetVista 2800 has a 4 pin power header,
labeled "Hardfile Power" at J11.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2007/03/8634-pwr.jpg"&gt;&lt;img alt="NetVista J11 hardfile power" src="http://kev009.com/wp/assets/2007/03/8634-pwr.thumbnail.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The connector we need this time is a Molex 43025-0400. Here's the pin
out:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2007/03/8634-pwrpin.png"&gt;&lt;img alt="NetVista 2800 Power Connector" src="http://kev009.com/wp/assets/2007/03/8634-pwrpin.thumbnail.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I also found an IBM part for the xSeries 300. Note that this is not
wired correctly for either the x330 and Netvista 2800. It will require
reworking for both application. FRU 24P0622:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2007/03/24p0622.jpg"&gt;&lt;img alt="xSeries 300 Hard Drive Power" src="http://kev009.com/wp/assets/2007/03/24p0622.thumbnail.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And that brings me to my final point. I found a really cool product
today that would be useful for both the NetVista and 1U servers.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.upgradeware.com/"&gt;&lt;img alt="UpgradeWare HD25-I" src="http://kev009.com/wp/assets/2007/03/home_hd25i.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It takes power from the PCI bus to power a 2.5" notebook hard disk.
There are a few different models with different SATA and PATA connection
combos depending on your needs. The fact that this product uses a PCI
slot is its greatest advantage and disadvantage. PCI slots are usually
scarce on machines where this would be useful. None the less, at around
$25 it is basically the same price as the IDE adapter you would
otherwise need to use a notebook drive in a desktop machine.&lt;/p&gt;</content><category term="misc"></category><category term="Computing"></category><category term="Hardware"></category><category term="Projects"></category></entry><entry><title>IBM xSeries 330 (x330) SATA Retrofit</title><link href="http://kev009.com/wp/2007/03/ibm-xseries-330-x330-sata-retrofit/" rel="alternate"></link><published>2007-03-28T21:31:00-07:00</published><updated>2007-03-28T21:31:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2007-03-28:/wp/2007/03/ibm-xseries-330-x330-sata-retrofit/</id><summary type="html">&lt;p&gt;This post documents the process of putting SATA hard disks into older 1U
servers. At first, I thought it would be quick and easy but I
will share some of the pitfalls I experienced along the way.&lt;/p&gt;
&lt;p&gt;I acquired a pair of x330 servers this summer, basically missing only
the …&lt;/p&gt;</summary><content type="html">&lt;p&gt;This post documents the process of putting SATA hard disks into older 1U
servers. At first, I thought it would be quick and easy but I
will share some of the pitfalls I experienced along the way.&lt;/p&gt;
&lt;p&gt;I acquired a pair of x330 servers this summer, basically missing only
the CPUs and heatsinks. CPUs were not difficult to obtain, but it did
take some trial and error to get correctly oriented passive heatsinks.
Before putting these into service, I took the opportunity to bring some
much needed larger
&lt;acronym title="Network Attached Storage"&gt;NAS&lt;/acronym&gt; online for the
home network by adding some large SATA drives.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2007/03/x330-oldnew.jpg"&gt;&lt;img alt="x330 hard disks - old and new" src="http://kev009.com/wp/assets/2007/03/x330-oldnew.thumbnail.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After buying a good set of drives and a controller, I started running
into some snags. The most obvious was the lack of standard 5v/12v
accessory power. The x330 has a 24-pin header that provides power to the
SCSI backplane. Using a multi-meter, I was able to locate the necessary
contacts. If your server lacks molex power connectors as well, you will
need to trace these down. My best advice is to triple check your
readings and use an older drive to test the connection before you hook
up your new drives. Nothing like all that work, followed by a puff of
the magic black smoke flying out of your new drives :). The right eight
pins are the ones we want.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2007/03/x330-pwr.png"&gt;&lt;img alt="x330 J8 Power Header" src="http://kev009.com/wp/assets/2007/03/x330-pwr.thumbnail.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To make a nice cable, you will need a Molex 43025-2400 connector and 4
to 8 pins. While I waited for mine to come in, I just pressed a power
cable wire by wire into the connections to make contact.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2007/03/x330-pwrcable.jpg"&gt;&lt;img alt="x330 Power Wiring" src="http://kev009.com/wp/assets/2007/03/x330-pwrcable.thumbnail.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The next potential point of struggle is getting the drives mounted in
the trays. The x330 trays have a plastic SCSI SCA pass through on the
end. These were held on with a pair of security Torx screws, so you may
need to get creative if you do not have the correct bit. The drives fit
nicely at this point, but the SATA power connection was blocked by a
metal corner of the tray. A quick bit of work with a file fixed this.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://kev009.com/wp/assets/2007/03/x330-traymod.jpg"&gt;&lt;img alt="x330 Tray Mod" src="http://kev009.com/wp/assets/2007/03/x330-traymod.thumbnail.jpg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pull the old hotswap backplane and cable up the new drives. At this
point you should power on and see how it goes. Hopefully you wired the
power cable correctly.&lt;/p&gt;
&lt;p&gt;Now your server is capable of accepting inexpensive, high capacity SATA
drives! The basic process should be the same for any 1U server lacking
power connectors, though you may need to dig deeper to get to the 5v/12v
source (power supply is a surefire bet).&lt;/p&gt;</content><category term="misc"></category><category term="Hardware"></category><category term="Projects"></category></entry><entry><title>"Hello, World!"</title><link href="http://kev009.com/wp/2007/03/hello-world/" rel="alternate"></link><published>2007-03-28T19:12:00-07:00</published><updated>2007-03-28T19:12:00-07:00</updated><author><name>Kevin Bowling</name></author><id>tag:kev009.com,2007-03-28:/wp/2007/03/hello-world/</id><summary type="html">&lt;p&gt;Well, I've decided to install WordPress and use it to run my personal
domain. I've been putting off programming my own CMS for some time, and
it really doesn't seem worth the time these days. WordPress recently
released version 2.1, which has quite a bit of functionality and seems …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Well, I've decided to install WordPress and use it to run my personal
domain. I've been putting off programming my own CMS for some time, and
it really doesn't seem worth the time these days. WordPress recently
released version 2.1, which has quite a bit of functionality and seems
like a perfect fit for the purpose of this site. Time will tell, but so
far I have yet to find any problems.&lt;/p&gt;
&lt;p&gt;I will soon be posting a lot of computer related articles, especially
some write ups on hardware hacking and mangling I've done. Following
that, probably some programming/software/sys admin junk.&lt;/p&gt;
&lt;p&gt;So, in lieu of actually writing any code, I'll start with the old
programing adage -- "Hello, World!"&lt;/p&gt;
&lt;p&gt;Yes, I realize I'm a little late to the blogging party. Better late than
never.&lt;/p&gt;</content><category term="misc"></category><category term="News"></category><category term="Programming"></category><category term="Site"></category></entry></feed>