Generally I feel blessed to live in a country as safe, prosperous and free as the United States, but every once in a while I am reminded why you just can't ever give up the good fight. The current debate about net neutrality is probably a significantly historic battle whose outcome is likely to determine to what degree our current notion of the freedom of the press will carry over in the next generation of journalism. In other words, the decisions we make on net neutrality today are likely the very decisions that will likely define freedom for our children of tomorrow.
A few years ago I learned the hard way why you should always use your linux distribution's package management tools. It's just too easy to end up with conflicts that hose your system. Also, if you don't use your package management system properly you will likely end up with multiple versions of software that perform the same function, which can be confusing and error prone. One package I see people constantly mis-installing on linux is the Sun java jdk. Virtually every time I see someone install it I see them download the binary installation, install it to /usr/java and then set their JAVA_HOME env var to point there. Then I see them rm the java binaries in /usr/bin, replacing them with the binaries from their java installation which immediately breaks their linux alternatives system. Sometimes they just add the new java bin dir to their PATH variable and think that they are done. Both of these are wrong. Here is the Right Way to install java on Red Hat using the linux alternatives mechanism...
NOTE 1: jdkx.y.z_pp represents your jdk install dir, jdk1.6.0_10 for me at the time of this post
NOTE 2: the number 1421 is the alternatives priority - you want the new installation to be one higher than your existing gcj priority, if it is already installed. You can obtain the priority with the command `alternatives --display java`
1) install the java 1.6.0 rpm binary package from sun
2) move the sun 1.6.0 jdk from /usr/java/jdkxxx to /usr/lib/jvm/jdkx.y.z_pp
3) symlink /usr/lib/jvm/java-1.6.0-sun to /usr/lib/jvm/jdkx.y.z_pp
# cd /usr/lib/jvm/
# ln -s jdkx.y.z_pp java-1.6.0-sun
4) configure the alternatives mechanism to use the sun java installation
# alternatives --install /usr/bin/java java /usr/lib/jvm/java-1.6.0-sun/bin/java 1421 --slave /usr/bin/rmiregistry rmiregistry /usr/lib/jvm/java-1.6.0-sun/bin/rmiregistry --slave /usr/lib/jvm/jre jre /usr/lib/jvm/java-1.6.0-sun/jre/
# alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-1.6.0-sun/bin/javac 1421 --slave /usr/lib/jvm/java java_sdk /usr/lib/jvm/java-1.6.0-sun --slave /usr/bin/javadoc javadoc /usr/lib/jvm/java-1.6.0-sun/bin/javadoc --slave /usr/bin/javah javah /usr/lib/jvm/java-1.6.0-sun/bin/javah --slave /usr/bin/jar jar /usr/lib/jvm/java-1.6.0-sun/bin/jar --slave /usr/bin/rmic rmic /usr/lib/jvm/java-1.6.0-sun/bin/rmic
alternatives --config java
alternatives --config javac
5) configure alternatives for java man
# (cd /usr/lib/jvm/java-1.6.0-sun; txt="alternatives --install /usr/share/man/man1/java.1 man-java.1 /usr/lib/jvm/java/man/man1/java.1 1421 "; for f in man/man1/*; do f=`basename $f`; if [ "x$f" != "xjava.1" ]; then txt="$txt --slave /usr/share/man/man1/$f man-$f /usr/lib/jvm/java/man/man1/$f"; fi; done; `$txt`);
6) configure /etc/profile.d/java.sh to set the proper env vars, system wide
# echo "export JAVA_HOME=/usr/lib/jvm/java
export JRE_HOME=/usr/lib/jvm/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
" > /etc/profile.d/java.sh;
We settled on Relais du Soliel, a beautiful rustic country guest ranch, as our wedding location. We're going to rent it out for the weekend and have a 3 day wedding party. I'm really excited as this place has so much potential. It's not fancy but will be beautiful during the late summer when we have our wedding. This is shaping up to be a great wedding and I just hope that all the people on our list will be able to make it. Without them we'd be missing the most important part of the celebration!
I got engaged to my girlfriend of 2 and a half years on Saturday! I feel so lucky and honored that I get to spend the rest of my life with this wonderful woman. I continue to look forward to every day with her, as I have been since we started dating. There have been many significant events in my life over the last year, but this is by far the most important and joyful. I proposed to her at Los Trancos Open Space Preserve in the Palo Alto foothills. I wanted to ask her somewhere that would most likely exist 10, 20, 50, 100+ years from now so that we and our family could visit the site in years to come. The weather was poor (cloudy, foggy, cold, damp) but somehow it still felt right. We paused on the trail to kiss and after an awkward pause I finally mustered enough strength to do it. I told her how much she meant to me, how much I love her and that I wanted to start the new year together with a plan. Then I got down on one knee and asked her to marry me. I was so nervous, but she said "yes" before I even got down on one knee. If anyone doubts whether I got down on one knee I can show them this picture!
Last night I was learning some new Jerry Garcia Band cover tunes and searching the web for chords and tablature when I stumbled across a number of excellent videos from YouTube. This version of Ruben and Cherise (written by Robert Hunter) played by the Grateful Dead is the best version I've ever heard, period. The dead only played this song a couple of times but Jerry Garcia Band played it regularly. It's one of my favorite songs ever, just a beautiful love song. It actually kind of disturbed me last night - I wasn't able to sleep as I laid awake remembering how much fun it used to be to see Jerry play. Incidentally, I've been going fairly regularly to see Dark Star Orchestra. They also do an excellent version of this song, although it doesn't bring tears to your eyes like that fat man can. Enjoy...
I just bottled my first beer! 5 gallons made 48 x 12 oz bottles. I drank a 22 oz bottle last night, though. It was ok, but not as good as I had hoped. I'm banking on it improving in the bottle over the next 2 weeks. If the beer ends up being any good I'll label it and give it away at holiday parties. Otherwise I'll try again!
I'm in the process of fermenting my second beer now - this one is an IPA. However, I have very little confidence in it's potability. I misread the instructions and added a TABLEspoon of gypsum to the water. The directions called for a TEAspoon. Oops. So then I naturally compounded the error by adding vinegar, even though I had absolutely no idea how much to add. I should probably throw it out and start over but maybe it will turn out to be one of those "happy accidents". Jerry Garcia used to say that his best licks came out of goof ups, maybe my best beer will too.
I have an old G-sat bluetooth gps device that I had never really played around with until today. Not surprisingly (considering there are probably a large number of scientists using unix with gps out in the field) there exists some outstanding gps software for linux. Furthermore, being an open platform (as opposed to virtually every cell phone / pda I've ever owned) Linux also provides excellent bluetooth support in the form of hcid and bluez. Anyhow, there is an excellent bluetooth / gps quickstart which helped me get up and running immediately. I'm running a 2.6.23 kernel on debian and using this G-sat bluetooth GPS receiver along with an old Linksys usb bluetooth dongle and everything is working perfectly. I have to say, gps, usb, and bluetooth working together perfectly on linux using completely open-source drivers and software layers is a pretty nice demonstration of how far along open source software is.
Some technical notes:
* hcitool scan will list the hardware address of your bluetooth device
* rfcomm bind rfcomm0 will bind the rfcomm0 device listed in /etc/bluetooth/rfcomm.com
* rfcomm release rfcomm0 will release the rfcomm0 device
* no two devices can share the same rfcomm<N> device, so if you configure more than one binding in /etc/bluetooth/rfcomm.conf they must all be on separate device names.
* rfcomm -a will display all bound rfcomm<N> devices along with their hardware addresses and channels
* /etc/bluetooth/, /var/lib/bluetooth here lie control and administrative files
* NMEA-0183 is the NMEA "sentence format". Most, if not all, receivers support the ability to produce a data stream in this format. Each record is similar to an EDI segment. If you don't know what EDI is count yourself among the lucky.
* gpsd rfcomm0 will tell the gpsd daemon to attempt to read the rfcomm0 device and interpret the output as NMEA data.
* cat /dev/rfcomm0 will display the logged NMEA-0183 commands as they are produced by the receiver
* telnet localhost 2947 | tee -a /tmp/nmeadata.out will connect to the gpsd daemon via telnet and pipe the results to both stdout and to /tmp/nmeadata.out. Once successfully connected, type the letter "r" and you will begin to see the NMEA-0183 formatted sentences in the console. This is the gps coordinates that gpsd is obtaining from your gps receiver!
So annoying. The iphone doesn't charge in pre-2.6.19 kernels properly. I was running a 2.6.18-5 (stock debian) kernel until this morning. The flippin USB device driver subsystem changed between 2.6.18 and 2.6.19 and (of course) the iPhone requires a special device driver to send it a magic command to initiate charging when you plug it in via USB. And, of course, this device driver only works with the post 2.6.18 USB kernel device driver api. The 2.6.19 USB core now exports "usb_driver_set_configuration()". It's funny, reading the patch for this feature in the kernel source states that a device needing to reset it's configuration is a violation of the whole model and is akin to a device telling the kernel that it is now somehow a different type of device than it was when originally plugged in:
(from the backport of this feature to 2.6.18, drivers/usb/core/message.c)
* Device interface drivers are not allowed to change device configurations.
* This is because changing configurations will destroy the interface the
* driver is bound to and create new ones; it would be like a floppy-disk
* driver telling the computer to replace the floppy-disk drive with a
* tape drive!
*
* Still, in certain specialized circumstances the need may arise. This
* routine gets around the normal restrictions by using a work thread to
* submit the change-config request.
Originally, the change was implemented for a TI brand USB device and apparently Crackberries have the same problem. Well, to be fair, I can't really say it's a problem with the device as opposed to the kernel subsystem design, but plenty of other peripherals work just fine without special kernel device driver modules. As you might have judged from the title of this post, I think it's criminal to have to upgrade my kernel just to charge a particular device via USB.
Anyhow, so to get my friggin iPhone to charge I had to upgrade my kernel, recompile and load the 3rd party iphone module, and configure hald to ignore my device (it kept popping open a photo import window every few minutes). I upgraded to 2.6.23-8, which went surprisingly well. I had doubts about "make oldconfig" using the .config file from my 2.6.18-5 debian stock source but it went without a hitch! Below is the /etc/hal/fdi/preprobe/1-iphone.fdi control file to stop those annoying popups (credit to gadgetgirl):
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- SGML -*- -->
<deviceinfo version="0.2">
<device>
<match key="usb.vendor_id" int="1452">
<match key="usb.product_id" int="4752">
<merge key="info.ignore" type="bool">true</merge>
</match>
</match>
</device>
</deviceinfo>
The only good news is that I learned a little more about hald. Another good discussion on a similar hald-related topic is here.
My girlfriend got me a beer making kit for my birthday this year. In typical fashion I waited 8 months to try it out and then went completely berzerk. I'm in the process of brewing 2 beers right now. The first beer is an English brown ale which should be ready for bottling in time for Christmas. The second is an IPA which should be ready for bottling before New Years Eve. Although both of these beers should be drinkable by the holidays, I've learned that you should age the beer in the bottle for a few weeks. I'll probably present the hosts of a few holiday parties with a few 22 oz beers or 6-packs and advise them to wait until the new year to drink it. Each batch makes approximately 48 x 12 oz beers.
It is really a lot of fun to make beer. I love to cook, but the beer making process has this alchemic quality to it. I also imagine what life was like hundreds of years ago and how those people made beer in essentially the same way that I am making it. To them, it must have seemed like magic or a gift from heaven. I suppose that is one reason (aside from the other obvious one) why beer (and alcohol in general) has become so intertwined with mythology and religion. It also makes me feel connected to life in a way that was much more common a few generations ago. I feel proud that I'm making something myself and I look forward to tasting the first drop of finished product. I also can't wait to share it with my friends because it's something (albeit a small thing) that I was able to make with my own hands and share with them directly. It's much more meaningful, although you can say the same thing about homemade fruitcake.
Recently, someone from my network approached me with an opportunity to join their company. At first I was skeptical, but decided to have lunch with them anyway. I was not immediately interested, but after researching the company and meeting a few of the engineers I decided that this might not be another run-of-the-mill start-up. I interviewed with them, learned about the amazing technology stack that they are working with, met the CEO, VP's and other engineers. It was then that I became convinced that this is an opportunity that might be worth looking into.
After negotiating and ultimately accepting a very good offer I resigned and accepted this new position. I gave my current employer 4 calendar weeks notice on friday.
For the last 3+ years I've been working as a software engineer at a small logistics company. The experience has been a great one. I've had an opportunity to learn from and work with a great team. I've had a couple of great managers who have challenged me and I'm grateful for their patience, wisdom and professionalism. I've had an opportunity to grow into new roles, design and innovate, and even play the role of manager, however briefly. I first joined as a contractor, got converted as an associate integration engineer, got promoted to integration engineer, then got promoted to senior software engineer and had an opportunity to manage an associate engineer. Most recently, I've had an opportunity to work as a member of the architecture committee. This was the first corporate job that I had ever held, so I will always be appreciative of the opportunity that this company gave me. For all of these reasons the decision to leave my current job was a very difficult one.
I remember when one of my colleagues quit his job a few years ago. He called me into a meeting with our VP and simply said "I quit.". Then when he told the rest of the team he did so using the same phrase. It was simple and to the point, if a bit shocking. I suppose it was a lot of fun to say and disposed of the usual sugar-coating and ego-stroking which tend to accompany notices of rejection.
the benefit of high soluble carbohydrate intake to be good against any cancer. If anything w.r.t. excess carbohydrate, I have... read more
on Melanoma diet