Geeking out with Fedora...

I'm just sitting here marvelling at how far Linux has come.

I just recently installed Fedora12. Initially, I just installed it onto a USB drive, since Linux, unlike Windows will us poor geeks the honor of actually letting us boot it from a USB drive. I was amazed how easily a lot of things worked.

I was able to boot us a qemu-kvm virtual machine running my native windows install (under a separate windows hardware profile), and it worked fine. By contrast, attempting to use direct native disk access through Virtual box dragged its but completely, but kvm is showing speed comparable to native. (I realy can't see the difference.)

The NVidia Xwindows drives installed without issue, and I had twinview dual monitors running in no time.

My wireless card worked without a glitch, and WPA2 encryption was no problem.

Every piece of hardware on the machine, even the bluetooth, seems to be working like a champ. And it boots in half the time of anything else I have, including my Mac. (Uh Oh...)

What made me take stock was all the sudden remembering the days when I was running the 0.9x.x version of the kernel, and manually editing XWindows configs to put frequencies and such into the VGA config and hoping I wasn't about to fry my monitor with a screwed up VSync rate. Now I hardly have to bring up a console to do half the things on the system anymore, there are GUI system admin tools for just about everything. It's truly come a very long way.
  • Current Mood
    cheerful cheerful

needing simplicity

So I've seen a lot written about the value of simplicity in software. Simplicity as a way to help manage complexity and thus the chance of unwanted/unanticipated interations. And then I look at projects like Boost (boost.org), and I recognize that there are some really neat libraries being written there, but I also have to wonder if some of the complexity is almost unmanagable.

I just got a single undefined library error from my project which is heavily using boost. Here's my one (ONLY one) link error from the attempt to link together the dll:


database.obj : error LNK2019: unresolved external symbol "private: class stldb::trans_map
[Error: Irreparable invalid markup ('<class [...] boost::interprocess_container::basic_string<char,struct>') in entry. Owner must fix manually. Raw contents below.]

So I've seen a lot written about the value of simplicity in software. Simplicity as a way to help manage complexity and thus the chance of unwanted/unanticipated interations. And then I look at projects like Boost (boost.org), and I recognize that there are some really neat libraries being written there, but I also have to wonder if some of the complexity is almost unmanagable.

I just got a single undefined library error from my project which is heavily using boost. Here's my one (ONLY one) link error from the attempt to link together the dll:


database.obj : error LNK2019: unresolved external symbol "private: class stldb::trans_map<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > >,class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > >,struct std::less<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > >,class boost::interprocess::cached_node_allocator<struct std::pair<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > const ,class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > >,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index>,64>,struct stldb::bounded_mutex_family> & __thiscall stldb::trans_map<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > >,class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > >,struct std::less<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > >,class boost::interprocess::cached_node_allocator<struct std::pair<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > const ,class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > >,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index>,64>,struct stldb::bounded_mutex_family>::operator=(class stldb::trans_map<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > >,class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > >,struct std::less<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > >,class boost::interprocess::cached_node_allocator<struct std::pair<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > const ,class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > >,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index>,64>,struct stldb::bounded_mutex_family> &)" (??4?$trans_map@V?$basic_string@DU?$char_traits@D@std@@V?$region_or_heap_allocator@V?$allocator@DV?$segment_manager@DV?$rbtree_best_fit@Ubounded_mutex_family@stldb@@V?$offset_ptr@X@interprocess@boost@@$0A@@interprocess@boost@@Vflat_map_index@23@@interprocess@boost@@@interprocess@boost@@V?$allocator@D@std@@@stldb@@@interprocess_container@boost@@V123@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$region_or_heap_allocator@V?$allocator@DV?$segment_manager@DV?$rbtree_best_fit@Ubounded_mutex_family@stldb@@V?$offset_ptr@X@interprocess@boost@@$0A@@interprocess@boost@@Vflat_map_index@23@@interprocess@boost@@@interprocess@boost@@V?$allocator@D@std@@@stldb@@@interprocess_container@boost@@@std@@V?$cached_node_allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$region_or_heap_allocator@V?$allocator@DV?$segment_manager@DV?$rbtree_best_fit@Ubounded_mutex_family@stldb@@V?$offset_ptr@X@interprocess@boost@@$0A@@interprocess@boost@@Vflat_map_index@23@@interprocess@boost@@@interprocess@boost@@V?$allocator@D@std@@@stldb@@@interprocess_container@boost@@V123@@std@@V?$segment_manager@DV?$rbtree_best_fit@Ubounded_mutex_family@stldb@@V?$offset_ptr@X@interprocess@boost@@$0A@@interprocess@boost@@Vflat_map_index@23@@interprocess@boost@@$0EA@@interprocess@3@Ubounded_mutex_family@stldb@@@stldb@@AAEAAV01@AAV01@@Z) referenced in function "public: void __thiscall stldb::trans_map<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > >,class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > >,struct std::less<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > >,class boost::interprocess::cached_node_allocator<struct std::pair<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > const ,class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > >,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index>,64>,struct stldb::bounded_mutex_family>::map_entry_transactional_operation::set_container(class stldb::trans_map<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > >,class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > >,struct std::less<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > >,class boost::interprocess::cached_node_allocator<struct std::pair<class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > const ,class boost::interprocess_container::basic_string<char,struct std::char_traits<char>,class stldb::region_or_heap_allocator<class boost::interprocess::allocator<char,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index> >,class std::allocator<char> > > >,class boost::interprocess::segment_manager<char,class boost::interprocess::rbtree_best_fit<struct stldb::bounded_mutex_family,class boost::interprocess::offset_ptr<void>,0>,class boost::interprocess::flat_map_index>,64>,struct stldb::bounded_mutex_family> &)" (?set_container@map_entry_transactional_operation@?$trans_map@V?$basic_string@DU?$char_traits@D@std@@V?$region_or_heap_allocator@V?$allocator@DV?$segment_manager@DV?$rbtree_best_fit@Ubounded_mutex_family@stldb@@V?$offset_ptr@X@interprocess@boost@@$0A@@interprocess@boost@@Vflat_map_index@23@@interprocess@boost@@@interprocess@boost@@V?$allocator@D@std@@@stldb@@@interprocess_container@boost@@V123@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$region_or_heap_allocator@V?$allocator@DV?$segment_manager@DV?$rbtree_best_fit@Ubounded_mutex_family@stldb@@V?$offset_ptr@X@interprocess@boost@@$0A@@interprocess@boost@@Vflat_map_index@23@@interprocess@boost@@@interprocess@boost@@V?$allocator@D@std@@@stldb@@@interprocess_container@boost@@@std@@V?$cached_node_allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$region_or_heap_allocator@V?$allocator@DV?$segment_manager@DV?$rbtree_best_fit@Ubounded_mutex_family@stldb@@V?$offset_ptr@X@interprocess@boost@@$0A@@interprocess@boost@@Vflat_map_index@23@@interprocess@boost@@@interprocess@boost@@V?$allocator@D@std@@@stldb@@@interprocess_container@boost@@V123@@std@@V?$segment_manager@DV?$rbtree_best_fit@Ubounded_mutex_family@stldb@@V?$offset_ptr@X@interprocess@boost@@$0A@@interprocess@boost@@Vflat_map_index@23@@interprocess@boost@@$0EA@@interprocess@3@Ubounded_mutex_family@stldb@@@stldb@@QAEXAAV23@@Z)


Long enough for you?
  • Current Mood
    annoyed annoyed
  • Tags

External Memory, Neophobia & Noephillia

I was watching ghost-in-the-shell, stand-alone complex not too long ago, and heard them referring to "external memory". They were ultimately referring to the idea that some portion of the memory in your head could be swapped out to storage, then retrieved later.

I realized that in my continuing use of EverNote to store all sorts of tidbits, I am starting to do exactly that. It's been a good way to store hints, tricks, techniques, problem resolutions, and any other reference which might be very handy to be able to recall, via search, at any moment in the future.

This got me thinking along the lines that an impressive form of future cybernetic enhancement would be the ability to export and import memories. Suddenly, humans can 'swap'. The idea has been expounded on in a lot of fictional works. But the ability to actually do this, with an organic brain and some kind of man-machine interface could lead to a significant step forward in the evolution of human thought, methinks. One of the problems is that right now there is simply too much information available, and nobody has the ability to absorb it all, compare the opposing options/positions, and arrive at enlightened reconciliations, and the best possible outcome. Under the weight of it all, people eventually 'taken a stand' on a particular philosophy, harden their receptivity, and ignore (actively or passively) opposing views, as drawing some boundaries over what is good and what isn't good seems to play a role in self definition. The mind doesn't find comfort in ambiguity. "I don't know" is the least comforting answer available. The deluge of information may in fact be responsible in part of the increasing polarization of political views into extremes, and likewise the rise in religious fundamentalism in the world. I have a system which is working for me.... why can't you just go away>

I wonder about this... The deluge of information leads to a certain kind of neophobia, or fundamentalism. I define fundamentalism here as the active or passive denial of new information which contradicts the established 'world view'. It can be religious, but is also seen in politics, and any other sort of intellectual club, including scientists and athiests. A thread to my ideas, is a thread to my world view, is a threat to the body of truths which I hold to be self-evident, and a ornerstone of my identity and ideology as a human being. To challenge them is to challenge me.

Would... No, ARE technologies which make more information available to the human mind creating a more defined survival advantage for the noephillic vs. the neophobic ? Those with the ability to admit their own ignorance, to remain agnostics in the face of complicated issues, can benefit from this kind of information overload. It can lead to new enlightened options. But for neophobics, that same deluge seems to have the effect of increasing bigotry, with the potential for serious ramificiations as the social pressure continues to increase, inexoribly leading to violent confrontation.

Will the internet and information availability strain humanities limited ability to deal with widespread ambiguity. No choices with clear winners, only and ever increasing and expanding series of options. Is there really any other coping technique available to our limited minds besides fundamentalism? I remember an observation from Steven Hawking that suggested we need to start icubating fetuses outside of the womb for the sole practical purpose of allowing bigger brains to form without the risk of killing Mom during delivery. Are we going to have to evolve our brains to deal with what our technologies are bringing us. Or do we just say the hell with all that and pop open a cold one, happy in the limits of our world view?

H-1B, Visas and Offshoring, Oh my

So I guess its time for my bi-annual post and general confirmation that I am alive...

I have a strange topic to write about. I was just reading some material online which concerns the ongoing outsourcing of IT / technology positions and the H-1B via program, and the overall effect that Globalization is having.

There is a hell of a lot of negativity being directed toward these things - so much so that there doesn't really seem to be any reason to have to comment on it. I'm working at a company which occasionally, and continuously seems to be shelling out pink slips, but never to the people in the India offices, only within the US. We have an office in England, oddly enough, but I think that the law in England makes laying off people there harder, as there are contractually or legally established guidelines which allow a larger severance.

But one thing very clear, is that it all comes down to price.

With the average salary of an IT worker in India now approaching something like $20 an hour ($40k per year), and American wages for the same work being much higher, how can it not be about price?

But I think that what's bothering the most about the people who are against these things, is that there is an underlying sense of something... entitlement? i.e. I am an American citizen, and based on that alone, I am entitled to make $80k per year to do the same work that someone in India is willing to do for helf that.

If the situation involved two states in the US, for example, New York and Georgia, and Georgia had a workforce of people willing to do the same job, for half the price, the business in New York would be crazy not to consider opening an office there. Furthermore in this case, people wouldn't be in as much of an uproar, unless you lived in New York and got directly impacted. Which points to a level of thinking in today's work which isn't quite global.

When I first Graudated from College, my first job, after a BS in computer science, was a whopping $29k per year. This was in 1990. During the .com boom period of the 90s, companies were giving people unrequested raises outside of the normal annual cycle simply to keep their employees from walking. Dilbert published jokes about how skilled tech people could walk into a company and demand a pony. They could then clarify that they wanted the hiring manager to be their pony.

And I think that during all of this, the Indian government, striving to find a way to grow the standard of living of people in India, continued to funnel money into some of their own universities. And American businesses, striving to get out of a cycle of IT shortages and increasing costs, started pushing for the H-1B via program. The H-1B program did have the effect of helping to bring in educated people from overseas, whose education had been paid for by foreign governments.

And now of course, things have shifted in the other direction. And the resentment, and anger I see over all this is heavy.

But the bottom line is that we have to adapt. The way I see it, there are a number of ways to differentiate yourself:
a) Make your locality in the USA part of your differentiation. i.e. You're accessible, on-site, in the USA, in the same tiemzone, and this in itself has value.
b) Be worth the money. Be twice as productive, driven, inspired, and capable (overall) than your competition in India.
c) Take less compensation for your work.

Are there really any other options?

Weird stuff happening

Today early on, I discovered that a VP-level technical wiz, who has had a long career at this company I work for (Convergys), was told that tomorrow will be his last day. Apparently this was out of the blue. It also seems to have been motivated by political games - the consolidation of power in the company, and seems like this guy (Joe) got snagged in the middle.

At first, this had little impact on me - another piece of BS in a business world which seems increasingly dominated by BS. Then, earlier this evening, it made me think about how tenuous my own position at this company really is at this point. For whome the bell tolls. It also made me realize just how stupid the senior management at my company must be at this point. This guys perspective and experience would make him highly valuable in a lot of positions, and there's no doubt he will do well in his next job. It is, quite simply, a big waste on the part of Convergys.

There's been a number of times when I wonder if I have limited myself by working at this company for so long, and there's a realization that I have had about the classic management vs. technical choices. I've been high-enough in Cvg to get a taste for big achievements. But I find myself missing the focused mindset and creative outlet of writing some really good code. That, as much as the hope for exposure, is what led me to getting the STLdb project off the ground, and more recently, joining the gcc project.

But I think there's an even bigger existential problem that I' wrestling with right now. I'm starting to get a sense for how limiting a life of self-centered hedonism can be. I'm not entirely in that mold, but I have noticed that aside from my career I don't really have any 'cause' that I throw myself into, and I think that's one of the reasons why I might be prone to workaholism. A self-centered lifestyle filled with transient pleasures is kindof like going on constant shopping sprees to Walmart for cheap thrills. After you do enough of it, you have a room in your house filled with cheap shit and you couldn't care less about any of it. There's something to the notion of a cause... something that you invest real effort into, feel passionate about, and get behind. It takes more work, but in the end it's something you can take p
  • Current Mood
    melancholy melancholy

(no subject)

Kindof excited.  Managed to get my first open source project visible on Sourceforge.  It's taken more effort than I thought, and I still have a long list of crap to do, but it's exciting to be making a little progress...

https://sourceforge.net/projects/s…

With the nicer web site at: http://stlshm.sourceforge.net/Intr…

The code is in CVS, but I need to create a download tarball and let it loose.

At this point, I may proceed to suggest / offer to the ACE library group that this code become a contribution to their library.  My plans now are to see if the owner of the Boost.interprocess library will allow me to help with the forward progress of that library.
  • Current Mood
    cheerful cheerful

Passing thought on the ultimate technical virtue?

Passing thought; had to write it down....

I've started to notice that some of the most successful "hardcore" developers that I've worked with are those people with an underlying motivation to understand how computers work, and why certain things work and other do not.  It seems to me that quite a majority of the people working in technical fields are comfortable knowing how to get things done, but not necessarily why things work.   But I know that for myself, knowing the answer to 'why?' has been very helpful in a lot of circumstances.  I've found, time and again, that even unexpected things like knowing how CPU architecture work has helped me to correctly predict the outcome of an endeavor.

This started me wondering whether simple curiousity, and the capacity to wonder; the desire to understand may actually be on the 'core virtues' of being an effective geek.  Or even one of the defining characteristics of a good geek.  (What makes a geek a geek?)  I wonder how many Geeks have had a side interest in philosophy, anthropology, spirituality, religion, cosmology, or any other endeavor which likewise has a strong element of wonder and speculation as an inherent part of its thought process.

I really didn't like the character "The Merovingian" from the Matrix, but I think he expressed a similar point in his dissertation on causality:  "Why is the only real source of power..."  His views were based on a firm belief is determinism, in causality, but that's a computer program for you...

Trends in Web App Development

Haven't been using LJ too much lately, but figured the following might be interesting to some, and I'm still trying to make sense of it all.

If I'm not mistaken, here in 2008, we are starting to see a mainstream shift away from the thin-client development paradigms which have been prevelant for the last ~7-8 years.   i.e. The approach of developing web applications by writing something (JSP/JSP/ASP etc.) that in turn yields the html & JavaScript "code" that is then run in  the browser.  That 'extra level of indirection' style application development may be fading, to be replaced by a return to the more traditional "thick client" programming models.

What got me thinking about this was looking at some of the current technology trends surrounding Rich Internet Applications (RIAs):
  1. JavaFX - which essentially has Sun creating a declarative scripting language which is interpreted by the receiving client to yield a thick-client application which the standard panels and widgets you would expect from an interactive application.  i.e. No interacting with the server to provide the basic user interface.  A JavaFX script application appears to be a mixture of a declarative scripting language  which is packaged along with some java code for complicated behavior.  Sun seems to have added a JavaFX compiler this month (Feb) and the theme is probably to keep the size of the delivered applications small.
  2. Adobe AIR (presently still under Adobe Labs at http://labs.adobe.com/technologies/air/ ) has been mentioned in many Blogs as one of the best in the emerging RIA technologies.  Based on Flex, it allows the development of thick-client applications which can interact with local data files, and store data locally to permit 'disconnected' modes of operation.

  3. Google Web Toolkit (GWT) has also surfaced as a means for writing RIA.  It strikes me as particularly interesting because it actually still yields an application which runs in a browser, using html, css, and JavaScript, so that in reality there is no new client-side runtime - just the browser we all know and love.  However, GWT shifts developers away from the laborious approach of writing applications by using the traditional server-side programming and allows the application to be written as a thick client app (similar to writing a SWING application.)  The result is then translated by the GWT compilers into a multi-browser capable thin client app which makes use to a decent amount of JavaScript.  A key point of it (for me, anyway) is that it still allows development via the more direct thick-client development approach, avoiding the extra level of indirection associated with writing apps that yield the script which will be run by the browser.

  4. And of course, who could forget Microsoft's Silverlight.  I have to admit, I haven't been looking into this closely yet, but I am relatively sure that it will offer development APIs which fall into the 'thick client' paradigm, live everything else in this list.
I remember a few years back we saw the launch of "WebStart" technology from Sun, and as I look at some of what is happening here I notice some broad similarities, leading to the inevitable concern over whether there is really any substantial difference between a SWING Java application (thick client) launched by WebStart, and the process of accessing a site which uses JavaFX script.

I think the answer to this is yes, and the reasons are related to the increase in CPU power over the last 10 years.  With webstart, there was an emphasis on shipping down the pre-compiled class files of the application to be run.  With JavaFX, the code can come down in an uncompiled form, and then get interpreted and run by the browser or other rendering engine / VM.  The difference seems to be a tradeoff of less network bandwidth for more CPU demand (for the interpreter).

So I guess I am wondering now whether this alternative approach is likely to become the convention among a lot of future sites.  Ebay already has an Adobe AIR client application.  Sites like the various Google applications (Gmail, Docs, Notebook, Reader, etc.) would all actually benefit quite nicely from the AIR approach, particularly the idea of having local replicas of data whose master resides on the network.  But I guess my question is whether this thick-client paradigm is clearly superior to the web-based approach:
  1. With the thick-client approach, is there some kind of convention (similar to Active/X) which will allow the equivalent of Portals?  i.e. I want to form a composite AIR application from panels available in several existing apps.  Is it easy enough?
  2. Will these apps ultimately suffer from the issue of inflated image sizes in the case of the applications being launched remotely?  i.e. Is this just another variation of the WebStart idea ?  Is the GWT approach optimal in this respect?

  3. Does a shift to a 'thick client' paradigm really help?   Or are approaches like JSF and the latest offerings from Microsoft managing to make the writing of responsive thin-client applications pretty much a matter of writing the equivalent of what these scripting languages demand anyway?  i.e. All fairly high-level constructs which get translated into the necessary JavaScript when accessed, so that you get the advantage of staying clear of writing a lot of JavaScript...
Thanks for reading...

acceptance issue givaway: free acceptance issues to a good home. I got plenty to spare.

So latey I've had some interesting things going on in my career, and they've been a good way to help me.....hmm, strike that.... force me to confront a few personal demons which have been lurking innocently enough just under the surface for a long time now.

This particular demon is an underlying need for acceptance, for external validation.

About a month or two ago, I got a job offer from another group within Convergys (the company I work for).   It was a really good fit for me - the work culture emphasized performance and accountability.  The technology was great - they're going to be working in artificial intelligence among other things.  I initially accepted their offer, and then I had Vinay, my current boss, come to me with an offer of his own.  He pretty much begged me to stay (over IM, but it was still begging...)

I ended up, after trying to work it out, agreeing to stay with him.  That was a mistake.  I sacrificed my own opportunity for the sake of the organization and his aspirations to turn things around.  However, it is, I think, something of a fools errand.   You can't fight things when a business starts to become obsolete.  What you can do is make the dying business cost effective, and prep it to be sold off to some other company which will just milk it for profit as it dies out, but not otherwise engage in any attempt to bolster it, or rejuvinate it into growth.  The current tone of what is happening in this group, with 100 out of 450 people being put on the block for layoffs suggests that they are planning on doing that.  I've put myself in the position of being a sacrifical lamb when I could be leaving and persuing my own best interests.

What is amazing is how much of this was not apparent to me, not obvious, when the whole process of choosing was going on.  My focus was wrong - I thought more about the likely disappointment and dis-ease that I would cause to my current boss, and my coworkers.  I worried about the was I would be seen as someone who jumped ship.  But the bottom line was that I took my own best interests and tried to convince myself that I would be happy and fit in with the interests of the organization.

Fortunately, the realization is not too late.  Had a bunch of beers last night with the guys who made the original offer.  They still have the position, and they are still willing to let me fill it.  So now I have a second chance, and a new realization.  As far as I am concerned, that is something worth being grateful over.

Good times, and bad times

Interesting couple of days.

Went to a nice Brigid's Fire festival a weekend ago.  A young lady which I had gotten to know pretty well, and was starting to really like (there's a physical attraction) recently got involved with someone.  She's in love in a big way, and their relationship is entirely monogamous.  When she was around the fire at one point she said something to the effect of "I have so much love to give", and I think I understood what she meant.  You have to wonder how many people essentially go along with monogamous relationships because that's the only way those relationships will work.

Work got interesting this week.  After years of work toward a design which was being guided by principles, rather than empirical hard-data, we decided to get involved with some hard testing, to dig up the data needed to make good decisions, more objectively.  What I am now seeing is that at this company, we have done approximate 5.5 man-years of work as a waste (roughly), and we have no need for the result of that work.  5.5 man years, at 70 bucks an hour.  And about $130k in a product cost.   But after dealing with all that, my biggest frustration is that I spent a year working on something and all that effort comes to nothing more than my paycheck.  Odd - kinda puts things in perspective.
  • Current Mood
    apathetic apathetic