Archive for the ‘General’ Category

Brave New Jon – Perpetual Loneliness

Tuesday, June 19th, 2007

So for the past three months, I’ve been trying to get over a relationship. I was in love (If I’m honest about it, I still am), utterly, and completely with someone I think of as the most amazing human being in the world. But life has a habit of moving in new directions, even if you don’t always want it to move with you.

I met her last year, and for a while I was happier than I’ve ever been in my life. We went on a few random adventures – I even flew her over to the UK for Valentine’s Day, to meet my parents (ok, a little soon, but it just felt so damned right). She was quite sick for a while at the end, which put a dampner on things, but that only served to remind me that I was serious about this girl – very serious. Even if the most we could do was to sit at opposite ends of a table in Starbucks, as long as I was with her…everything just seemed so right with the world. I would have done anything for her, gone anywhere. She could have asked me to drop everything and move to Timbuktu…I would have. And, truth be told, I probably still would.

My first book is dedicated to her. I don’t regret this – not in a regretful “tattoo of the ex-girlfriend won’t go away” kind of way. But I do tend to torture myself at least once a week (sometimes a lot more often) by going into Borders and looking at the dedication sitting there on the shelf. I ask myself “why?”, then ponder the dedication I would have had in my second book – more of a question than a dedication in actual fact…yes, that kind of question. So, I guess I’m lucky that it didn’t get to that point – that would be even more depressing than the situation I’m in with this whole affair now.

She ended it on March 18, approximately one week after said book was published, without a reason. I know the exact hour, minute, and second that my heart was permanently torn in two – but I’ll spare readers those details here. The point is, I just don’t know why. I can guess. I can think of reasons, things I might regret, things I’d do anything to change. But I just don’t know why, and this causes me constant pain. I failed on some fundamental level, while simultaneously, all I did – all I did – was love that girl with all my heart. Every ounce of my being loved her, and every ounce of my being still does love her. I can’t change that. She is a wonderful human being, and yes, she deserves to be happy. I just wanted that to be with me. More than anything.

Three months, and many many thousands of dollars spent pining later and I barely feel any better about the situation. Nothing has ever upset me on a level even approaching how I feel about what happened here. I’m not at all angry with her, not one bit at all, and I have now accepted that it’s over (at least, I think I have), but I still find it so very difficult to “move on”. As far as I was concerned, she was the one. Forget the book dedication, I had jewelry on my shopping list. Yes, really. I let myself fall in at the deep end, and I didn’t care one bit. I would have done anything for that girl. Any single thing would have been no trouble at all. Again, if I’m honest about it, that’s still the case now.

Recently, as I was canceling a certain online dating site for the 4th time in the space of a month – it’s not fair to think about dating other people when you’re still emotionally tied – it occurred to me that I’m going to need to take a long break from this kind of thing. Relationships only lead to bitter heartbreak in my experience. And I’m not sure I want to experience that again. A large part of me wants nothing more than to just meet a special someone and spend the rest of my life with them, but that kind of happiness is currently reserved for other people. If I’m honest about it, nothing seems to matter so much in life as having someone like that. A companion with mutual concern for the other.

I am actually ok though, and in many ways I’m upbeat and positive about the situation. I’ve made radically – drastic – changes to my life and I will continue to work on the self improvement angle. I love living in the US (I can’t imagine living in the UK) and I want to invest my time and effort into my job, and into my writing, and continue in my quest for knowledge. I’m sorely tempted to enroll for another (part time) degree in due course, as much for the academic outlet as anything else. There is so much out there in this world – science, engineering, music, culture, so much utterly amazing stuff. I love living life to the full, as much as I can, and improving myself in the process.

Project Brave New Jon started on the afternoon that things fell apart, and for the last three months I’ve devoted all of my energies at self improvement. I’ve eaten only salad, fruit, and other balanced essentials (and lost a huge amount of weight), joined a gym (I’ve been going down when they open in the mornings, at 5:30am – I don’t sleep much these days), learned to drive (and driven 3,000 miles in the first month), taken up numerous sports, revived my writing, and many many other things. But still, my thoughts all along have constantly returned to one thing. In spite of my best efforts, there’s really only one thing I seem to want in the whole world – something I’m trying my utmost to live without. I understand now so many love songs on a profound level.

Try listening to Roxette 122 times on an afternoon. I guarantee that it won’t make you feel any better. Still, I’ve got another 23 playlists here filled with only the most depressing power ballads that you could try instead. I shouldn’t have done that to myself, but misery loves it’s own company sometimes. At this point, I still spend hours at a time listening to wonderfully depressing music. Tonight, it’s Journey’s Faithfully that I’ve got on repeat. It’s a great track. But it only serves to remind me how much I wanted what we had to be eternal, perpetual, and how far that is from the reality of the situation. Self delusion. Something we’re all guilty of, from time to time anyway.

Anyway. A few weeks ago, I found myself in the middle of the Mojave desert on a Sunday afternoon. I needed to get out of town – going almost anywhere in Boston was just bringing back memories. I needed to get out to the middle of nowhere, to really pine properly to myself. Since I’m not the kind of person to do things in half measures, this was really the only way to finally try to get this out of my system. I did feel better – driving out to the middle of nowhere and sitting by myself – temporarily, but it was relatively short lived. I’ve taken pining to a whole new level. And learned a lot more about myself, too.

In summary, my apologies go out to friends who haven’t known why I’ve been a little more weird than usual lately – I don’t let this stuff get in the way of day to day activities, but it has clearly impacted elsewhere. My current book project is delayed and various other stuff was put on hold for some considerable time while I tried to deal with this stuff. I didn’t plan to write anything about it here, I don’t want to upset anyone, but I wanted to ask you for your continuing patience as I catch things up.

I’ll try not to mention this again, I just wanted to get this off my chest :-)

Jon.

The Boston Red Sox vs. San Francisco Giants

Monday, June 18th, 2007

Photo: Fenway Park.

So I enjoyed our little corporate outing to Fenway Park last week (see my previous blog entry), and had to go back this weekend to see the Red Sox take on the Giants at Fenway Park. The game play was far more interesting than the previous game (against the Rockies), and although I didn’t have a private suite and minibar this time, I did enjoy the experience immensely.

I had just won a Red Sox raffle draw yesterday, so I had a whole bunch more merchandise about my person…but I didn’t have a giant foam hand with “#1″ printed on it and this *had* to be fixed. So I went all out. If you were there, you might have also seen me singing God Bless America and Sweet Caroline as loudly as I could reasonably get away with :P

Updated: I just bought a bunch more tickets for when I get back from Canada (Ottawa Linux Symposium) – Next time I’m at Fenway, I’m going to see the Red Sox play the Tampa Bay Devil Rays on Independence Day.

Jon.

Ludicrously Technical – Kernel ABI Tracking

Saturday, June 16th, 2007

Part of the “Ludicrously Technical” series from Jon Masters.

The Linux kernel is, fundamentally, a collection of functions that happen to live in privileged memory and have certain magical abilities not of the regular application variety. But the kernel is also extensible at runtime, through loadable modules. These .ko files are simply complex ELF objects, containing a variety of code (that we dynamically link into the running kernel memory) and meta data. Meta includes symbol dependency information – checksums (modversions) for individual kernel symbols provided and/or used by a given module.

You can use GNU nm to visualize symbolic dependencies:

[jcm@jcmlaptop ~]$ nm -gnu /lib/modules/2.6.18-8.1.4.el5/extra/ipw3945/ipw3945.ko | sort -k 2
U alloc_ieee80211
U __alloc_skb
U autoremove_wake_function
U __const_udelay
U __create_workqueue
U _ctype
U del_timer_sync
U destroy_workqueue
U dev_kfree_skb_any

These undefined symbols are needed by the Intel IPW3945 WiFi driver, in order for it to be loaded into the RHEL5 kernel on my funky Intel laptop. Each of these has a checksum, which the driver requires:

[jcm@jcmlaptop ~]$ /sbin/modprobe –dump-modversions /lib/modules/2.6.18-8.1.4.el5/extra/ipw3945/ipw3945.ko | sort -k 2
0×1757d1f7 alloc_ieee80211
0×9aebf873 __alloc_skb
0xc8b57c27 autoremove_wake_function
0xeae3dfd6 __const_udelay
0×4efd93a9 __create_workqueue
0×8d3894f2 _ctype
0×0c659d5a del_timer_sync
0×0b1ddd1b destroy_workqueue
0×149a799f dev_kfree_skb_any

So, one of the jobs of module-init-tools, in concert with the kernel’s in-kernel linker (actually, these days, it’s mostly Rusty’s in-kernel magic, but I like to think I’m involved…) is to handle all of these symbol dependencies, and match them against the running kernel…before we try linking the module into the running kernel. The aim is to ensure binary compatibility between a module and a Linux kernel. Because binary compatibility results in fewer cases of non-functional WiFi. And this is a good thing when you’re packaging your WiFi driver on a CD as an RPM package for folks to add to their systems.

ABI compatibility is funky stuff. Enterprise Linux vendors typically ensure that the ABI on their kernel (at least, the part visible to third parties) won’t change enough to break certain third party modules. And that means tracking all of those symbolic dependencies, and making sure that they don’t constantly change. Welcome to my world. You’re going to miss having so much hair on your head, well, maybe you will. ABI checksum information (modversions) are generated during the kernel build process, using genksyms. The magic happens in the scripts/Makefile.build file:

# When module versioning is enabled the following steps are executed:
# o compile a .tmp_.o from .c
# o if .tmp_.o doesn’t contain a __ksymtab version, i.e. does
# not export symbols, we just rename .tmp_.o to .o and
# are done.
# o otherwise, we calculate symbol versions using the good old
# genksyms on the preprocessed source and postprocess them in a way
# that they are usable as a linker script
# o generate .o from .tmp_.o using the linker to
# replace the unresolved symbols __crc_exported_symbol with
# the actual value of the checksum generated by genksyms

cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $< cmd_modversions =
if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then
$(CPP) -D__GENKSYMS__ $(c_flags) $<
| $(GENKSYMS) $(if $(KBUILD_SYMTYPES),
-T $(@D)/$(@F:.o=.symtypes)) -a $(ARCH)
> $(@D)/.tmp_$(@F:.o=.ver);

$(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F)
-T $(@D)/.tmp_$(@F:.o=.ver);
rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver);
else
mv -f $(@D)/.tmp_$(@F) $@;
fi;
endif

In English (version 1.0, the original kind), this means that if we have a kernel that uses modversioning metadata, then we’ll end up compiling each C source file in the kernel, looking for exported symbols. During a kernel compile, modpost adds in export information for exported kernel symbols, pre-pending them with “__ksymtab” (how do I know this? I just do, and you can know this stuff too, if you spend too much time on the kernel build process), and we can rip this out using objdump (to rip out symbols starting with __ksymtab) when we check for exported symbols. If a given file doesn’t export any symbols, we don’t care any more and we just move it into a finished state. Done. But we care about exports.

Kernel compiled code that contains exported symbols (via EXPORT_SYMBOL, EXPORT_SYMBOL_GPL, and its friends) needs a genksyms run to generate checksum data. That’s what the call to $(CPP) – the C compiler’s pre-processor – is used for. We get GCC to spew out a bunch of horrible crap, which we’ll then shove into genksyms, as we generate magical checksum metadata. Here’s what that $(CPP) call might expand to, on a typical Linux system (RHEL5 in my case, because I run RHEL5 on my laptop…and you should too…RHEL5 rocks my world) when building the ieee80211 core module, used by IPW3945:

[jcm@jcmlaptop linux-2.6.18.i686]$ gcc -m32 -E -D__GENKSYMS__ -nostdinc -isystem /usr/lib/gcc/i386-redhat-linux/4.1.1/include -D__KERNEL__ -Iinclude -include include/linux/autoconf.h -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Wstrict-prototypes -Wundef -Werror-implicit-function-declaration -Os -pipe -msoft-float -fno-builtin-sprintf -fno-builtin-log2 -fno-builtin-puts -mpreferred-stack-boundary=2 -march=i686 -mtune=generic -mtune=generic -mregparm=3 -ffreestanding -Iinclude/asm-i386/mach-generic -Iinclude/asm-i386/mach-default -fomit-frame-pointer -g -fno-stack-protector -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE -D”KBUILD_STR(s)=#s” -D”KBUILD_BASENAME=KBUILD_STR(ieee80211_module)” -D”KBUILD_MODNAME=KBUILD_STR(ieee80211_module)” net/ieee80211/ieee80211_module.c | ./scripts/genksyms/genksyms
__crc_alloc_ieee80211 = 0×1757d1f7 ;
__crc_free_ieee80211 = 0xa27818cd ;
__crc_escape_essid = 0xa9fb135f ;

We instruct GCC to run as a preprocessor, set a few quadrillion command line flags (because it’s always fun to play with GCC flags you don’t get to use often enough) and shove the output from the pre-processor into genksyms. The data input into genkysms is effectively a complete tree of dependencies and definitions for a given symbol. We can ask genksyms to give us more useful output, tracking a given symbol’s ABI dependencies. To do this, add a -D to the above command pipe, and you’ll get the following wonderful output:

Export alloc_ieee80211 == <struct net_device { char name [ 16 ] ; struct hlist_node { struct hlist_node * next , * * pprev ; } name_hlist ; unsigned long mem_end ; unsigned long mem_start ; unsigned long base_addr ; unsigned int irq ; unsigned char if_port ; unsigned char dma ; unsigned long state ; struct net_device * next ; int ( * init ) ( struct net_device * ) ; <etc.>

The output is long, very long. And soft. It’s soft, strong, and very very long. Like Andrex. But you can see the structs, prototypes and other randomness that forms a given checksum – in this case, the checksum for alloc_ieee80211. Determining ABI breaks and fixing them can involve a wonderous iterative process of running genksyms in debug mode, looking at the output, running a mental diff, and looking for which dependent structs or function prototypes broke. I’d make it easier, but I like overlying complex horrible crap. And coffee. I like horribly complex crap, horrible amounts of coffee, and ludicrous quantities of Californian blueberries too.

Jon.

Brave New Jon – Chasing Cars

Saturday, June 16th, 2007

Photo: 2007 Mazda Miata.

So I found myself in a car dealership this afternoon…a Mazda car dealership. Yes, we know where this is going. Or maybe. I’m still not sold on buying new, but I have decided that leasing has a lot of downsides outweighing most of the more positive ones. It’s a choice between pre-owned or new, and new does take away a lot of the hassle of getting a car…and you pay for that.

Obviously, there were no manuals in stock, so they’re pulling in a silver GT 6 speed manual (soft-top, not the power hard-top – not as fun) Miata next week for me to take a look at, and take a test drive. Depending upon various factors, including the cost, and my level of sanity at the time that I need to make a purchasing decision…well…we’ll see. Zoom zoom!

Jon.

Life’s little idiosyncrasies

Thursday, June 14th, 2007

Photo: Brave New Jon.

Life can be funny sometimes. Filled with ups and downs. And it’s trivially easy to let one negative thing obscure everything else. It’s not constructive, it’s a huge time sink, but we all do it from time to time. And why is that? I guess one part of project Brave New Jon should be to figure this out, to do so many of the things that I really really don’t want to do. It’s good for me, like eating brussels sprouts, which also doesn’t mean it’s necessarily the easiest or most fun thing to do :-)

Today, I joined a gym. I’m going to try Boston Sports Clubs and see how that goes – I’ve got a limited time membership, which I will turn into a longer term deal, if I’m happy with how it goes over the next few weeks. Maybe I’ll be over there at 5:30am in the morning, depending upon how late the debugging goes tonight and how much wonderful firmware hacking I do or do not get done. In any case, I’ve got to train more – I want to run a marathon and go hiking over the coming weeks and months, which necessitates working out like crazy.

I’m hoping to go flying again on Saturday. My colleague (Larry – if there’s a VM tunable to be had, he’ll have it) is likely going up, and I’m happy to tag along. I never realized just how much I’d enjoy it last time – flying has got to be one of the coolest things you can do on an afternoon. There’s such freedom there to go anywhere (well, anywhere the fuel, FAA, and…NTSB will let you go).

Jon.

More Red Sox…

Thursday, June 14th, 2007

Photo: Last night’s souvenir – a Red Sox tin.

So I enjoyed watching the game last night…perhaps a little too much. Enough that I just picked up a ticket for Sunday’s Red Sox vs. Giants game. If I’m not careful, I’m going to get addicted ;-) I’ve never really been into watching sports…I wonder where this goes…

Jon.

Brave New Jon – Gym Time!

Thursday, June 14th, 2007

So I’m a size 29 finally, and working on hitting 28, at which point I don’t intend to go down much more in size – it’s time to tone up. It’s time to join a gym and work on looking as good as I (physically) feel. I am not the same person I was just a few months ago, but I can do so much more. I can be so much more.

One of the guys in the office offered to go running with me in the mornings – I’m going to take him up on the offer. I’m thinking of alternating between going to the gym, and going for a run. Actually, I’m pretty psyched to find increasing numbers of fellow Red Hatters with shared interests – we had another discussion today about hiking. Red Hat is just a super cool place to work, for some many different reasons.

Anyway. I could do with some advice on gym memberships. Gold’s Gym was just this week recommended by another (cool – hey we’re all cool, Jon!) Red Hatter as an alternative to BSC. They have 24 hour facilities in Boston, which appeals to me, even if they are a bit further away. And they have gyms nearer the office, which will work out great in the fall, when I’ll be driving to work and can easily swing by on the way.

If anyone has any useful comments on gyms, shout!

Jon.