Search Results: "jan"

20 November 2009

Antti-Juhani Kaijanaho: Socialized vaccination a narrative

Such was the scene I arrived at on Wednesday last week at the municipal health center at Kyll , Jyv skyl , Finland. A queue extended a hundred meters beyond the door. It was not hard to guess what it was about, as it had been announced that the pandemic influenza A/H1N1 vaccine would be administered there to people in specific risk groups from 10 am to 3:30 pm. I should explain here the Finnish health care setup. There are three parallel systems a comprehensive public health care system maintained by the municipalities to standards set by the state, a network of private for-profit health care providers, and a national foundation dedicated to university student health care. Employers are required by law to provide a minimal level of health care to their employees, and most of them also provide, free of charge to the employees, access to near-comprehensive general-practice-level care; most employers buy this service from the for-profit providers. The public system suffers from resource starvation at the general-practice level but provides excellent care in the central hospitals that handle the difficult cases. Anyway, the H1N1 vaccine is only available through the public system and through the foundation free of charge if you qualify for the vaccine, and no amount of money buys it for you in this country if you don t. Thus, I and many others, normally cared by the employee services, found ourselves queuing up at a public health care institute. And clearly, the public health care system was overwhelmed on that first day. When I entered the queue, its tail was a traffic hazard. Fortunately, the queue moved faster than new people arrived thereafter, and the hazard ended. The queue moved surprisingly fast it took me one hour to advance the 100 meters to the door. Even so, this was a failure in the system there is no good reason to have people with underlying illnesses (and we all had them, to qualify for the vaccine) stand around in freezing cold weather for an hour! Once, a nurse came and asked us if any of us was 63 years old or older. Apparently no-one was, since no-one was asked to leave (they will be vaccinated later). Later, another nurse asked everyone in the queue outside to show their KELA cards KELA is the national health insurance system, and its card carries information about extra coverage one qualifies for due to underlying illnesses. Eventually, I reached the door. Two guards stopped anyone who tried to enter directly, sidestepping the queue, and let in only those who had legitimate business other than vaccination. The main hall was full of people, and I quickly realized that the queue took a full circle inside the hall to reach the multiplexing point. It took me another hour to slowly advance my way though the hall. At the multiplexing point, I was asked to wait a bit, and then I was assigned a vaccination room and a waiting number. Some twenty minutes later I was called in. The vaccination room I was assigned to was a nurse s office. Two nurses were there, one who would administer the vaccine, and another at the computer, to keep a record. I gave them my KELA card, and shed my coat and my outer shirt, and bared my left shoulder. I was quickly given the pandemic vaccine; there was no question I was qualified for it, not with my obesity being obvious. Then they asked what my diagnosis was. Prmarily I m here because of my obesity, I said. But I also have paroxysmal atrial fibrillation. That s not what your KELA card says, accused the nurse at the computer. The diagnosis is so new, I countered. There has been no time to do the paperwork for KELA. (And indeed, I later learned, it would come up in my next checkup in the spring.) They stared at each other. I can show you my prescriptions, I said, making no move for them. Stares. I stared back. Do you want the seasonal vaccine or not? asked the nurse with the injectors. I lauged briefly. I might as well. It had, honestly, never crossed my mind that I might qualify. She injected me on my right shoulder. You should stay in out there for ten minutes. I picked up my clothes and found the cafeteria with coffee and pastry. Then the real fun started. Next day, I woke with horrible upper back pain. The thermometer showed mild fever; but since i didn t have any respiratory symptoms, I decided to go to work. In the evening, turning in bed was excruciatingly painful. It took days for the pain to subside. I left the building three hours after I arrived at the end of the queue. What? You think that s excessive? So do I and many others; queuing feels so Soviet Union! But honestly, while it did take time, it worked. I am vaccinated; are you?

18 November 2009

Jan Wagner: dkms rocks or how to get the Intel 82576 GBit NIC running on Lenny

We ordered a couple of the new HP DL160 G6, cause they can be equipped with a lot of RAM. Unfortunately it s always the same with HP and the bandnew ProLiant 100 series the driver for the NICs is missing/too old in the latest stable debian release. The DL160 G6 is shipped with a Intel 82576 GBit NIC, which isn t recognized by Lenny, see also #522922.
I installed the system with another NIC installed (not really, but this is a way it works :) and wanted to get free the PCI-X slot again. So I did backport dkms and downloaded the latest igb driver. A short look into /usr/share/doc/dkms/HOWTO.Debian did advice me the way to create the DKMS driver package. Just after a couple of minutes I did roll out the igb-dkms_2.0.6_all.deb to the target maschine(s).
On the target systems I just installed dkms, the DKMS package and appropriate linux-headers and sim, salabim there was the interfaces. :)

13 November 2009

Stefano Zacchiroli: jane street core 0.6.0 has arrived

Debian "Core" 0.6.0 packages ready I've completed the packaging of the new release of (Jane Street) Core, version 0.6.0. Core is (yet another) extended / alternative standard library for OCaml, integrating not only the much needed "everyday functions" but also offering consistent abstractions throughout all stdlib modules (with a lot of inspiration from well-known type classes from the Haskell stdlib), consistent naming conventions (e.g. all functions using exceptions as meaningful return values ends in _exn), and significant syntax extensions. While I've been thus far an OCaml Batteries Included fanboy, I confess that nowadays I'm more skeptical about its success than in the past, in spite of having contributed a tad of code to it. The reason is simply that the lead of the project is now gone and, more importantly, has done so without having (yet?) clearly appointed/found a new lead. That does not change the fact that David has only to be kudoed for his amount of impressive work on Batteries. Still, as a matter of fact right there is no stable release yet and there is no one that will be taking the project to deliver one, since no one else has stepped forward (yet?). In this interim the OCaml problems in delivering, on top of an amazing core language, an amazing development platform in which programmers are not forced to reinvent wheels, stand. Core fills such a gap properly. I was preferring Batteries to it due to its more open development process, but in spite of that Core is a pretty damn good stdlib. Long life to Jane Street that currently maintains it :-) Now, back to the main topic of this post, Debian packages for Core 0.6.0 are now available; you will be able to get it from the main/unstable archive soon (some manual NEW processing is required). In the meantime they can be fetched from my personal APT repository, as usual:
    deb http://people.debian.org/~zack/debian zack-unstable/
    deb-src http://people.debian.org/~zack/debian zack-unstable/

A few noteworthy changes from the past package releases: Update 18/10/2009: core 0.6.0 and all its components have passed through NEW, they are now available in the Debian archive as usual

12 November 2009

Russell Coker: Links November 2009

Credit Writedowns has a populist interpretation of the latest Boom-Bust cycle [1]. It s an interesting analysis of the way the US economy is working. Bono writes for the NY Times about Rebranding America [2]. He praises Barack Obama suggesting a different reason to believe that the peace prize is deserved and describes what he believes to be the world s hope for the US. IsMyBlogWorking.com is a useful site that analyses your blog [3]. It gives some advice on how to improve some things as well as links to feed validation sites. Evgeny Morozov gave an interesting TED talk How the Net Aids Dictatorships [4]. I don t agree with his conclusion, he has some evidence to support his claims but I think that a large part of that is due to people not using the Internet well. I expect things to improve. The one claim that was particularly weak was when he mentioned radio stations in Rwanda as an example of technology being used for bad purposes the entire point about the first-world discussion about such things is the radio vs the Internet. Ray Anderson gave an inspiring talk about The Business Logic of Sustainability [5]. He transformed his carpet company, decreasing it s environmental impact by 82% and it s impact per volume of product by more than 90% while also significantly increasing it s profitability. He says that corporate managers who don t protect the environment should be regarded as criminals. Making his company more environmentally friendly reduced expenses (through efficiency), attracted more skillful employees, and attracted environmentally aware customers. Managers who don t follow Ray s example are not only doing the wrong thing for the environment, they are doing the wrong thing for their stockholders! Ray s company Flor takes carpet orders over the web [6]. They won t ship a catalogue outside the US, so presumably they only sell carpet to the US too. Marc Koska gave an interesting TED talk about a new syringe design that prevents re-use [7]. His main aim is to prevent the spread of AIDS in the developing world where even hospital staff knowingly reuse syringes. It will also do some good in developed countries that try to prohibit drug use. David Logan gave an interesting TED talk about tribal leadership [8]. His use of the word tribe seems rather different from most other uses, and I am a bit dubious about some of his points. But it is definitely a talk worth seeing and considering. Deirdre Walker is a recently retired Assistant Chief of Police who has worked for 24 years as a police officer, she describes in detail her analysis of the flaws in the TSA security checks at US airports [9]. Brian Krebs wrote an article for the Washington Post recommending that Linux Live CDs be used for Internet banking [10]. Windows trojans have been used to take over bank accounts that were accessed by security tokens, that could only be accessed by certain IP addresses, and that required two people to login. It seems that nothing less than a Linux system that is solely used for banking is adequate when a lot of money is at stake. The NY Times has an interesting review of the book Ayn Rand and the World She Made [11]. It seems that Ayn was even madder than I thought. Gary Murphy has written an interesting analysis of the latest stage in the collapse of the US Republican party [12]. The ABC (AU) Law Report has an interesting article about Evony s (of China and the US) attempting to sue Bruce Everiss (of the UK) in Australia [13]. The Guardian has an insightful article about the IEA making bogus claims about the remaining oil reserves [14]. It seems that the experts who work for the IEA estimate that oil is running out rapidly while the US is forcing them to claim otherwise. Dean Baker of the Center for Economic and Policy Research has written an interesting article about the economic effects of the war in Iraq [15]. Apparently it caused the loss of over 2,000,000 jobs considerably more than the job losses that could ever result from efforts to combat global warming.

11 November 2009

Jan Hauke Rahm: Long time no see

It s been quite a while since I posted something in my blog. I had to recover from not going to Debconf9 which was real sad. Right before the conference, I mean like a day before it, I got more or less sick and just couldn t fly the next day. I managed to rebook the flight (thanks to SwissAir) for the next day but it wasn t meant to be. I would have loved to meet the Debian crew , get my GnuPG key a bit more into the web of trust, discuss a few issues, envy the fast end evolved notebooks everyone else has You can imagine it wasn t easy to see the conference going its way via live stream when I was actually planned to be there. Again sorry to everyone who worked for me being sponsored and everything! Anyways, time goes by and a lot happens, none of which I d like to publish in a blog, except: I got a part time job. :) If you ve ever asked me about my experience with Linux vServers or web hosting in general, and if you even asked me where to get such with fair prices and good support, I might have mentioned a small firm in Germany which I m a customer of for a long time now. And about two months ago it just so happened that they called me. I admit, I know the owner of the company (haven t seen him in a too long time, though) and I already considered us friends. But I was still surprised when he asked me to work for him. It s not a big deal, he said, just administer the servers we re running and take care of them. It s a few hours a month, don t worry, you can do it! All that with a scary smile Now it turns out he had more in mind and I m working on different projects at the same time, but still have the system (all Debian of course) at first priority. I have no clue if he s satisfied with my work or if he s just afraid to tell me (you know, us being friends and all), yet the systems are up and running and I m learning every day. I even got the chance to write a small project in ruby which I wanted to do for a long time. Love it! So, this is the first time that I recommend him not only because I trusted him with my system but also because I know your system would be safe. ;-) Need an IT partner in Germany or the Netherlands? o-byte.com Uhhh, I have to ask for a raise after this hymn :) Something else I forgot? Well, I became a DD but that s also some time ago, so hmm no, that s it for now.

10 November 2009

Gunnar Wolf: PieSpy: Modelling IRC interactions

As some of you know, yesterday we started the two weeks of activities for the Fifth On-line Encounter of Free Education, Culture and Software. This year, the main topic for the conference is social networks, but not in the twitter-facebook sense Social networks as ways of understanding and modelling human-to-human interactions. Of course, there is interest from many attendees in using and taking advantage of said social network systems (and others), but the topic is far broader. One of the core tools of EDUSOL, and the only tool that is constantly active through our two weeks of activity, is IRC Which is somewhat of a challenge, as we receive some not-tech-savvy users from all over the world. The first year or two we asked everybody to connect via an IRC client (and we had even decided that it would be a technological filter We thought we would not cater for people without the technical skills to install and use IRC). Life proved us wrong, and we ended up using two web-to-IRC gateways: One of them, via an instance of CGI:IRC, and the other one via a third-party service, Mibbit. Now, the core mind behind EDUSOL is Alejandro Miranda, Pooka; I am not really into education (it is a very interesting topic but far from what I am good at). Pooka has been invovled in on-line communities analysis for several years already, since we worked together at FES Iztacala. For a long time he wanted to graph the interactions at EDUSOL, which was obviously possible given it was all centered on three tools (IRC for live chat, Drupal for generic information and Moodle for the talks and workshops' material This has changed this year, as we are giving much more weight to Drupal and taking it off Moodle), and so last year he was finally able to generate a EDUSOL 2008 conference photo (warning: 2MB image, 4311x3352px), where each person's avatar appears where most of his interactions were. This photo was (unfortunately) achieved using non-free software, but is very much looking at! Now, this year Pooka stumbled upon a great tool, PieSpy (available in Debian package piespy). Piespy generates very interesting interaction graph for IRC channels, as you can see here: Piespy is a bot that sits in the IRC channel logging everything that any given user "says" directly to another one, and graphs it. Not much to say here, only that it generates a very good (and practically real-time) view of what happens on the channel. For this particular channel, and during EDUSOL, you can see here the latest IRC snapshots. Very fun to see - and somewhat addictive how it morphs across time :)
AttachmentSize
EDUSOL 2008 - Conference photo1.97 MB
Current (Monday+Tuesday) interaction graph for our IRC channel39.89 KB

9 November 2009

Matt Zimmerman: Amplify Your Effectiveness (AYE) conference: Day 0


The AYE conference is an annual conference designed to increase your effectiveness in leadership, coaching, managing, influencing, and working in teams, whether you work in systems development, testing, product development, quality assurance, customer service, or consulting. It starts tomorrow, and I ve arrived today eager to meet the other attendees and see what the conference is like. My work involves all of those things, but the main reason I decided to attend was that I learned a lot at the Problem Solving Leadership workshop, which I attended in January and wrote about on this blog. When I heard about this event, organized in part by the same people, and realized I would be in the US that week anyway, I seized the opportunity to attend. The 2009 program is overflowing with sessions on topics I m interested in, some of which I have written about here previously. The speakers are all people whose insight I ve appreciated through their writing, speaking and teaching, so I expect I ll have a tough time deciding where to spend my time these next few days. The sessions are said to be experiential ones rather than lectures, so I don t think that I ll be able to hop between them, but I ll see tomorrow when the main program starts.

2 November 2009

Antti-Juhani Kaijanaho: 0x20 040 32

Now.

25 October 2009

Jan Wagner: OpenWRT WDS works like charm

A try with OpenWRT 8.09 in April to setup a WDS with additional AP functionality and encryption, like described in the documentation, failed. So I keeped with my halfbroken solution running on DD-WRT, which is going a bit too commercial these days in my eyes.
Now I have found time to try OpenWRT again for this purpose, since the issue was fixed really fast. I just did setup a stock 8.09.1 installation and then dropped the following into /etc/config/wireless:

config wifi-device wl0
option type broadcom
option channel 5
option disabled 0
config wifi-iface
option device wl0
option network lan
option mode ap
option ssid OpenWrt
option encryption psk2
option key keyforclients
config wifi-iface
option device wl0
option network lan
option mode wds
option bssid 00:16:B6:19:63:C8
option ssid OpenWrtWDS
option encryption psk2
option key pskforWDS And guess what? It worked like a charm! So I could replace the odd DD-WRT boxes. Anyways ... does anybody have an idea where to find the sourcecode of anything > v23 SP1?

23 October 2009

Rob Bradford: GNOME in Moblin: Myzone

Howdy, i m sure most people are aware of the recent release of Moblin 2.0; a user experience for netbooks. I m going to write a few blog posts about how the Moblin user experience is built on the awesome technologies in the GNOME platform. So first up, let s look at the Myzone, we re starting here since this is the first thing I really worked on in the Moblin UX and i ve been able to see it through from early ideas to the 2.0 and 2.1 releases. So, deep breath, the idea behind the Myzone is to provide a springboard to things that matter to you most: your recent files and web pages you ve visited, your upcoming events and things you need to do, things that are happening on social web services and your favourite applications. Now then, that s the theory, how does it work:
Myzone in action
Myzone in action

18 October 2009

Russell Coker: Mobile Phones Are Computers

One thing I noticed when I got my new LG U990 Viewty [1] mobile phone is the way the core telephony functionality has suffered while features for web browsing etc have been added. It seems that the core phone functionality (making and receiving calls and maintaining a list of names and phone numbers) has generally decreased since about 2004 when I got my first camera-phone. The Nokia GSM phones that I used prior to getting a 3G phone seemed to have a combination of signal reception, voice quality, and basic telephony features that beat all the 3G phones I ve used. The only way the 3G phones were better for core telephony features is in managing the list of recently called numbers. In my past two LG phones I ve been able to easily call an alternate number of the person I last called this feature was dropped in the Viewty. Some of my relatives have camera-phones that have an extremely poor ability to get a signal, they can t get a GSM signal in places where my Viewty can get 3G! Obviously making a usable phone was not a design priority for those devices! Then there s the issue of battery life. Early mobile phones had NiCd batteries that lasted a week, later mobile phones had Li batteries that lasted a week as a standard feature. Nokia sold phones with replacement batteries, so if you wanted to make lots of phone calls while on the move you could have a second battery charged and ready for use. Now the latest BlackBerry [5] apparently has batteries that only last for one day I haven t investigated the options for storing a second battery but a casual glance indicates that changing a battery will be a lot more difficult than on an old Nokia phone. I ve been wondering, why don t they just sell some mobile phones that don t support making phone calls? Smart phones that aren t very good at telephony is really only going half way, do it properly and just rip out the phone functionality! Or they could use the word phone to apply to devices that already exist to do mobile stuff. You could have an Amazon Kindle phone [2] that allows you to read documents, and a Nokia N800 tablet phone [3] for general Internet access including web browsing and email really the only smart-phone feature that is missing from the Nokia is a camera. For that matter my EeePC 701 [4] is probably about twice as heavy as my first mobile phone, maybe it could be called a phone too. If you have two phones, one for making phone calls and the other for doing smart-phone stuff then it won t matter so much if the smart-phone (which can t make phone calls) has it s battery run out. One likely objection to the idea of selling phones that can t be used for making phone calls is that it might confuse the users. However the current situation is that there are significant differences in the signal reception ability of mobile phones, the people who sell them don t know what the difference is, and the rare reviews that analyse signal strength (as done by Choice [6]) are become outdated rapidly and never cover all phones on the market. So I think it would be a great improvement if the phone sales people could say don t buy phone A if you want to make phone calls because it can t do that because currently anyone who just wants to make phone calls has a matter of luck to determine whether they get a phone that works well. The really sad thing however, is that some people apparently have usage patterns that are similar to my satire above. I have heard of people having two phones, one for smart-phone functionality and another for making calls. What we need is to have manufacturers put more effort into making hardware that can receive week signals, from now on I will consult the Choice review of this before making any mobile phone purchase or recommendation. If only a few million other people would do the same then the manufacturers would improve their products. The next thing we need is to have better software to run the phones. The deficiencies in the software on my Viewty could easily be fixed if everyone had source code access. Benjamin Mako Hill writes about some of the problems with closed-source on mobile phones [7]. He mentions security (in terms of our trust in the phone manufacturers), and the general ideal of having control over your own device. One specific problem he doesn t mention are the ways that mobile phones are deliberately crippled by the manufacturers, 3G phones have precious main menu space occupied by the services that are most profitable to the telephone company without regard to what the users desire. Another problem for people who desire free software is file format support. Camera-phones that save video to AVI format instead of OGG reduce our ability to use free software in other places as a general rule every time you transcode a video you either lose some quality or increase the file size so the format that the phone uses will be carried through many other computers and devices. Smart-phones generally have the ability to view a range of data types, the ability to view MS file formats is common (which excludes free competitors). My Viewty has an entire menu section dedicated to Google services (Gmail, blogger, youtube, etc). That s nice for Google who presumably paid well for that, but not so good for me as I don t use any of the Google features on my phone. Now a menu that had a caching IMAP client, an RSS feed reader, a Wordpress API client, a Jabber client, and a caching Wikipedia client would be really useful. My current phone is just under a year old, so I won t be buying a new phone until January 2011 (unless I break or lose my Viewty). Hopefully then there will be some better options. Before anyone suggests that I buy another phone to help with the coding, my current free software coding projects are all behind schedule http://mako.cc/copyrighteous/20091017-00

15 October 2009

Gustavo Noronha Silva: Moving back to Belo!

So, next Saturday Luciana and I are moving back from Rio de Janeiro to Belo Horizonte after about 6 months here. It was an interesting ride. We didn t really have a good time finding a good place to live at - Rio is very expensive and it looks like demand is so high anywhere close to Luciana s work place that the only reasonable solution was to live very far away, and even there we didn t really have much success, although for other reasons I may talk about later. Belo is how the foreign people who live there usually refer to Belo Horizonte. I think that is probably because it s a bit too hard for them to say Horizonte =D (if it helps you, you could use the Mineirish Belzonte ). I have borrowed this svg file kindly licensed in the FDL by Raphael Lorenzeto de Abreu, and generated a simple png image that you can see in this post with Belo Horizonte, and some other cities we often talk about at Collabora =): A straight line between Recife and Belo Horizonte has about 1640km. There are 340km between BH and Rio, and 973km between BH and Florian polis. A bit about Belo Horizonte, for those friends of mine to whom I always have a hard time explaining where it s located, and what kind of city it is: Belo Hozizonte is a nice, beautiful city, with a quite big metropolitan area. About 6 million people live in greater Belo Horizonte. It is considered one of the three most influential cities in Brazil, along with S o Paulo and Rio de Janeiro. It s surrounded by mountains, which are considered one of the defining geographical features of the Minas Gerais state, of which it is the capital. Here s a picture that is available under the public domain in Wikipedia: Speaking of Minas Gerais, it is, according to Wikipedia, the fourth in size among the 26 States of Brazil, being just a bit bigger than mainland-France. Minas Gerais is one of the main earth transports hubs of the country (having the largest number of federal roads), and is famous for its tasty food, the beauty of its people, its cheeses, the calm, introspective nature of its people, its interesting way of speaking portuguese, and its alcoholic beverages. Now, going away from Rio to Belo Horizonte has a single big disadvantage associated with it: we don t get to have the Sea a few minutes away, anymore. Our solution to that is, of course, going to one of the numerous bars (the legend goes around that BH has the largest absolute number of bars of all cities in the world), and drinking instead of swimming! Quem n o tem mar, vai pro bar!

7 October 2009

Adnan Hodzic: DebConf11 bid in Banja Luka?

Yesterday was a glorious day for DebConf11 bid in Bosnia and Herzegovina. I had a scheduled meeting with Banja Luka s mayor Dragoljub Davidovic. We met in his cabinet, where I presented him with the paper DebConf11 in Bosnia and Herzegovina in which I tried to explain what it all means. From what Debian is, over what DebConf is, to why is DebConf important. The thing I was most worried about was how am I going to explain all this in simple non-tech words Smile Either way, I was in middle of explaining what Debian is when mayor interrupted me I understand, I m electrical engineer myself you have no idea what relief came from these words! Grin Explaining what DebConf is and what kind of profiles attend one such event went smoothly as well, where mayor made some replicas on my story from the projects he worked on and so on. After my last case he also explained me how it s good that we meet, since Banja Luka was known as electronic city in ex-Yugoslavia.


Mayor and I
And this is where things start going just ballistic! He says something along the line this is a great idea and that we have his full support, I think you should talk to the prime minister (Milorad Dodik) about this as well! Shock I find my way to the government building, wait for brief period of time and I get called inside of the prime ministers cabinet. I tell him somewhat different story, in terms of more details, how we are competing with M nchen for this bid, and how I m actually planning if we win the bid, and if the bid is successful we d most likely change the whole city s infrastructure to Debian. He picks up the phone and calls for someone, person comes in and I m introduced to IT Center General Manager (Krsto Grujic). He tells me that they have few RedHat servers while he leads the way to his office where I m introduced to director of Agency for IT (Srdjan Rajcevic) where we even have this informal talk where Srdjan tells me he used GNU/Linux user himself and that he still manages two OpenBSD servers. We talk about various topics, in the end I tell them what we need for the conference, they write it all down and we exchange contact details, since I was called back up by the prime minister. Prime minister, asks me what I need from him to realize this project and I tell him that I d need everything I gave IT guys below, and binding papers that we d have full government and city support by the end of the month, and that I ll consult with people from Debian in case we need anything else. No problem were his words Grin
Prime minister and I
I walk out, really asking myself, what just happened, was that a Disney movie or what? Cool I d really like to use this opportunity to invite all Debian members to come and help us realize this bid. Help us put Bosnia and Herzegovina on map of the open source world! Stay tuned Wink

1 October 2009

Martin F. Krafft: Thesis submitted to examiners

At 14:45 CEST, today, 1 October 2009, I submitted my thesis to the print shop. Sarah has kindly agreed to pick it up tomorrow and drop it off at Brian s office, from where it will go to the three examiners. On 30 October at 9:30 IST, I will stand to publicly defend my work at the University of Limerick. I expect to receive a list of changes to be made from the examiners, hopefully minor, such that there won t be much in the way before I submit the final version to the University Board by 3 December. Once they give their green light, I will make it available on my research website, along with the data. I expect this to happen in January 2010. I have many many people to thank and will do so in due time. Right now I just want to thank Brian Fitzgerald and Kieran Conboy for their flexibility. I was supposed to have the thesis done by the end of August to given them a month to read it over, but by then, I only had the first six (of eight) chapters done. We hence spent all of September sending back and forth PDFs and paper comments, working iteratively so that today, I could put the finishing touch on the work and keep the schedule. The next thing on my agenda is the second edition of my book, which we are targetting for Debian squeeze . If you would like to be the first to receive more details, sign up to the announcement mailing list.

30 September 2009

Dirk Eddelbuettel: RInside release 0.1.1, and a fresh example

Last week's 0.1.0 release of RInside, and the first to have been published on CRAN, still had some issues with builds and use on OS X. Thanks to testing and fixes by Jan de Leeuw, Jeff Horner and particularly Simon Urbanked, things are said to be better now with the new release 0.1.1 which went onto CRAN yesterday. So no new features, but fixes to the main Makefile as well as the Makefile for the examples directory, some minor fixes and editing for the examples. I also added a file THANKS to show some appreciation for the various patches and fixes I have been receiving -- they are appreciated! However, today I committed a new example to SVN archive at R-Forge. It is based on this thread on r-devel. Abhijit Bera tries to do this in C, but to me his questions provide rather clear motivation for showing how much simpler things can be via C++ and the Rcpp classes along with RInside. Using a small example, the task was to pass a weight vector to a portfolio solver from the Rmetrics package fPortfolio and to then access the computed solution. The original poster struggled with access from C to the S4 classes used by fPortfolio and could not set the weights. But when using RInside, we simply pass a C++ vector of weights down to R, solve the problem and pass a solution vector back using the handy evaluation of R expressions:
// -*- mode: C++; c-indent-level: 4; c-basic-offset: 4;  tab-width: 8; -*-
//
// Another simple example inspired by an r-devel mail by Abhijit Bera
//
// Copyright (C) 2009 Dirk Eddelbuettel and GPL'ed
#include "RInside.h"                    // for the embedded R via RInside
#include "Rcpp.h"                       // for the R / Cpp interface used for transfer
#include <iomanip>
int main(int argc, char *argv[])  
    try  
        RInside R(argc, argv);          // create an embedded R instance
        SEXP ans;
        std::string txt = "suppressMessages(library(fPortfolio))";
        if (R.parseEvalQ(txt))          // load library, no return value
            throw std::runtime_error("R cannot evaluate '" + txt + "'");
        txt = "lppData <- 100 * LPP2005.RET[, 1:6]; "
	  "ewSpec <- portfolioSpec(); "
	  "nAssets <- ncol(lppData); ";
        if (R.parseEval(txt, ans))      // prepare problem
            throw std::runtime_error("R cannot evaluate '" + txt + "'");
	const double dvec[6] =   0.1, 0.1, 0.1, 0.1, 0.3, 0.3  ; // choose any weights you want
	const std::vector<double> w(dvec, &dvec[6]);
	R.assign( w, "weightsvec");	// assign STL vector to R's 'weightsvec' variable
	txt = "setWeights(ewSpec) <- weightsvec";
        if (R.parseEvalQ(txt))		// evaluate assignment
            throw std::runtime_error("R cannot evaluate '" + txt + "'");
	txt = "ewPortfolio <- feasiblePortfolio(data = lppData, spec = ewSpec, constraints = \"LongOnly\"); "
	  "print(ewPortfolio); "
	  "vec <- getCovRiskBudgets(ewPortfolio@portfolio)";
        if (R.parseEval(txt, ans))      // assign covRiskBudget weights to ans
            throw std::runtime_error("R cannot evaluate '" + txt + "'");
	RcppVector<double> V(ans);      // convert SEXP variable to an RcppMatrix
	R.parseEval("names(vec)", ans);	// assign columns names to ans
	RcppStringVector names(ans);
	for (int i=0; i<names.size(); i++)  
	  std::cout << std::setw(16) << names(i) << "\t"
		    << std::setw(11) << V(i) << "\n";
         
      catch(std::exception& ex)  
        std::cerr << "Exception caught: " << ex.what() << std::endl;
      catch(...)  
        std::cerr << "Unknown exception caught" << std::endl;
     
    exit(0);
 

Chris Lamb: GeoDjango and the UK postcode database

This post describes how to play with the UK postcode database that recently turned up on WikiLeaks using GeoDjango. You will need the following pieces of free software:
  1. PostgreSQL (MySQL does not provide sufficient geospacial features) I will be using Postgres 8.4.1; please adjust your paths for your version and/or distributor.
  2. PostGIS spacial database extensions I will be using version 1.4.0.
  3. Django I will be using version 1.1. This version includes the GeoDjango framework.
  4. GEOS geometry engine I will be using version 3.0.0 from the libgeos-c1 package in Debian unstable.
You will also need a copy of the leaked postcode data. Usage of this data is almost certainly a copyright violation.
Getting started First, create a Django project and application for this example:
$ django-admin startproject ukpostcodes
$ cd ukpostcodes
$ ./manage.py startapp postcodes
Next, edit settings.py:
  • Configure DATABASE_*. You must use the postgresql_psycopg2 PostgreSQL database driver.
  • Add django.contrib.gis & ukpostcodes.postcodes to INSTALLED_APPS.
If you have not already done so, you must install PostGIS in your database:
$ sudo -u postgres createlang plpgsql -d <databasename>
$ sudo -u postgres psql <databasename> -f /usr/share/postgresql/8.4/contrib/postgis.sql
$ sudo -u postgres psql <databasename> -f /usr/share/postgresql/8.4/contrib/spatial_ref_sys.sql
Modelling a postcode Now define a simple model to store imported postcodes:
from django.contrib.gis.db import models
class Postcode(models.Model):
    name = models.CharField(max_length=8, db_index=True)
    location = models.PointField()
    objects = models.GeoManager()
  • We import models from django.contrib.gis.db instead of django.db.
  • We override the default objects manager with GeoDjango's GeoManager() so we can perform spacial queries.
Save this model in postcodes/models.py. We can now create this model in our database using:
$ ./manage syncdb
Importing postcode data We will use a management command to import the data. First, create the necessary modules with:
$ mkdir -p postcodes/management/commands
$ touch postcodes/management/commands/__init__.py
$ touch postcodes/management/__init__.py
Next, save the following code in postcodes/management/commands/import_postcodes.py:
import sys
import csv
from django.contrib.gis.geos import Point
from django.core.management.base import BaseCommand
from postcodes.models import Postcode
class Command(BaseCommand):
    def handle(self, \*args, \*\*options):
        Postcode.objects.all().delete()
        count = 0
        for row in csv.reader(sys.stdin):
            try:
                name = row[0].upper().strip().replace('  ', ' ')
                location = Point(map(float, row[13:15]))
            except ValueError:
                print "I: skipping %r" % row
                continue
            Postcode.objects.create(name=name, location=location)
            count += 1
            if count % 10000 == 0:
                print "Imported %d" % count
Finally, we can import the data using:
$ bunzip2 /path/to/uk-post-codes-2009.bz2   ./manage.py import_postcodes
This takes approximately one hour on my computer. If you plan to import the data multiple times, consult the Django documentation for faster methods of importing initial data.
Quering the postcode database We can now query our postcode database. First, let's find the postcode for Buckingham Palace:
>>> from postcodes.models import Postcode
>>> palace = Postcode.objects.get(name='SW1A 1AA')
>>> palace
<Postcode: SW1A 1AA>
Next, let's find all postcodes within 1 mile. For this, we will need to construct a tuple representing the area we want to search in.
>>> from django.contrib.gis.measure import Distance
>>> area = (palace.location, Distance(mi=1))
>>> Postcode.objects.filter(location__distance_lte=area)
[<Postcode: SE1 7BF>, <Postcode: SE1 7SG>, <Postcode: SE1 7JA>, <Postcode: SE1 7PB>,
 <Postcode: SE1 7PD>, <Postcode: SW1A 1DW>, <Postcode: SW1A 1EA>, <Postcode: SW1A 1EE>,
 <Postcode: SW1A 1EF>, <Postcode: SW1A 1EG>, '...(remaining elements truncated)...']
>>> Postcode.objects.filter(location__distance_lte=area)
7024
To find "neighbour" postcodes, we can pass a Point object to the .distance(..) method on our queryset this adds a field we can then sort on:
>>> Postcode.objects.distance(palace.location).order_by('distance')[:4]
[<Postcode: SW1A 1AA>, <Postcode: SW1E 6JP>, <Postcode: SW1E 6LA>, <Postcode: SW1E 6WG>]
Putting it all together Let's pretend we are making an app to find pizza from an arbitrary user-submitted postcode. (We will assume we have parsed the user's postcode and have found its Postcode object, but we will continue to use Buckingham Palace here.) First, define the following model in postcodes/models.py and re-run ./manage.py syncdb:
class PizzaJoint(models.Model):
    name = models.CharField(max_length=200)
    postcode = models.ForeignKey(Postcode)
    objects = models.GeoManager()
    def __unicode__(self):
         return self.name
Now, add some local pizza places:
>>> def add_pizza_joint(name, loc):
...     code = Postcode.objects.get(name=loc)
...     PizzaJoint.objects.create(name=name, postcode=code)
...
>>> add_pizza_joint('Pizza Hut', 'SW1E 6SQ')
>>> add_pizza_joint('Pizza Express', 'SW1E 5NA')
>>> add_pizza_joint('Pizza On The Park', 'SW1X 7LY')
If we were not using GeoDjango, we would have to be content with simply matching the postcode:
>>> PizzaJoint.objects.filter(postcode=palace)
[]
However, we can now find the cloest pizza places:
>>> PizzaJoint.objects.distance(palace.location,
            field_name='postcode__location').order_by('distance')
[<PizzaJoint: Pizza Hut>, <PizzaJoint: Pizza Express>, <PizzaJoint: Pizza On The Park>]
The .distance(..) method also sets a distance attribute on all the objects returned; this makes it easy to show the actual distance to the user:
>>> for x in PizzaJoint.objects.distance(palace.location,
                     field_name='postcode__location').order_by('distance'):
...    print "%s (%d metres away)" % (x, x.distance.m)
...
Pizza Hut (499 metres away)
Pizza Express (509 metres away)
Pizza On The Park (902 metres away)
For more details, see the GeoDjango documentation.

27 September 2009

John Goerzen: How To Record High-Definition MythTV Files to DVD or Blu-Ray

I ve long had a problem. Back on January 20, I took the day off work to watch the inauguration of Barack Obama. I saved the HD video recordings MythTV made of the day (off the ATSC broadcast), intending to eventually save them somehow. I hadn t quite figured out how until recently, so there they sat: 9 hours of video taking up about 60GB of space on my disk. MythTV includes a program called mytharchive that will helpfully transcode your files and burn a DVD from them. But it helpfully will transcode the beautiful 1920 1080i down to DVD resolution of on a good day 720 480. I couldn t have that. Background My playback devices might be a PC, the MythTV, or the PlayStation 3. Of these, I figured the PS3 was going to be hardest to accommodate. ATSC (HD) broadcasts in the United States are an MPEG Transport Stream (TS). Things are a bit complicated, because there may be errors in the TS due to reception problems, the resolution and aspect ratio may change multiple times (for instance, down to SD for certain commercials). And, I learned that some ATSC broadcasts are actually 1920 1088 because the vertical resolution has to be a multiple of a certain number, and those bottom 8 pixels shouldn t be displayed. Adding to the complexity, one file was 7 hours of video and about 50GB itself. I was going to have to do quite some splitting to get it onto 4.7GB DVD+Rs. I also didn t want to re-encode any video, both for quality and for time reasons. Attempts So, I set out to try and figure out how to do this. My first approach was the sledgehammer one: split(1). split takes a large file and splits it on byte or line boundaries. It has no knowledge of MPEG files, so it may split them in the middle of frames. I figured that, worst case, I could always use cat to reassemble the file later. Surprisingly, both mplayer and xine could play back any of these files, but the PS3 would only play back the first part. I remembered this as an option if all else failed. Next, I tried avidemux. Quite the capable program and I thought I could use it to cut my file into DVD-sized bits. But I couldn t get it to let me copy the valid MPEG TS into another MPEG TS it kept complaining of incompatible formats, but wouldn t tell me in what way they were incompatible. I could get it to transcode to MPEG4, and produce a result that worked on the PS3, but that wasn t really what I was after. Then, I tried mpgsplit. Didn t recognize the MPEG TS as a valid file, and even when I used a different tool to convert to MPEG PS, acted all suspicious as if it bought the MPEG from a shady character on a grungy street corner. dvbcut I eventually wound up using dvbcut to split up the ATSC (DVB) recordings. It understood the files natively and did exactly what I wanted. Well, *almost* exactly what I wanted. It has no command-line interface and didn t have a way to split by filesize, but I calculated that about 35 minutes of the NBC broadcast and 56 minutes of the PBS broadcast could fit on a single DVD+R. It worked very, very nicely. The resulting files tested out well on both the PS3 and the Linux box. So after that, I wrote up an index.txt file to add to each disc and a little shell scripting later and I had a directory for each disc. I started burning them with growisofs. Discs 1 and 2 burned well, but then I got an error like this:
File disc06/VIDEO/0930-inaug-ksnw-06.mpg is larger than 4GiB-1.
-allow-limited-size was not specified. There is no way do represent this file size. Aborting.
Eeeeepp. So apparently the ISO 9660 filesystem can t represent files bigger than 4GB. My files on disc 1 had represented multiple different programs, and stayed under that limit; and disc 2 s file was surprisingly just a few KB short. But the rest of them weren t. I didn t want to have to go back and re-split the data to be under 4GB. I also didn t want to waste 700MB per disc, or to have to make someone change video files every 15 minutes. So I decided to investigate UDF, the filesystem behind Blu-Ray discs. mkisofs couldn t make a pure UDF, only a hybrid 9660/UDF disc that risked compatibility issues with big files. There is a mkudffs, but it doesn t take a directory of its own. So I wrote a script to do it. Note that this script may fail with dotfiles or files with spaces in them:
#!/bin/bash
set -e
if [ ! -d "$1" -o -e "$2" -o -z "$2" ]; then
   echo "Syntax: $0 srcdir destimage [volid]"
   echo "destimage must not exist"
   exit 5
fi
if [ " id -u " != "0" ]; then
   echo "This program must run as root."
fi
EXTRAARGS=""
if [ ! -z "$3" ]; then
   EXTRAARGS="--vid=$3"
fi
# Get capacities at http://en.wikipedia.org/wiki/DVD+R as of 9/27/2009
SECSIZE=2048
# I'm going to set it a few lower, than capacity 2295104 just in case.
# Must be at least one lower than the actual size for dd to do its thing.
# SECTORS=2295103
SECTORS=2295000
echo "Allocating image..."
dd if=/dev/zero "of=$2" bs=2048 "seek=$SECTORS" count=1
echo "Creating filesystem..."
mkudffs --blocksize=2048 $EXTRAARGS "$2"
mkdir "$2.mnt"
echo "Populating..."
mount -o rw,loop -t udf "$2" "$2.mnt"
cp -rvi "$1/"* "$2.mnt/"
echo "Unounting..."
umount "$2.mnt"
rmdir "$2.mnt"
echo "Done."
That was loosely based on a script I found on the Arch Linux site. But I didn t like the original script, because it tried to do too much, wasted tons of time writing out 4.7GB of NULLs when it could have created a sparse file in an instant, and was interactive. So there you have it. HD broadcast to playable on PS3, losslessly. Note that this info will also work equally well if you have a Bluray drive.

18 September 2009

Jan Wagner: Cloning/Backing up NTFS systems

For some reasons, you may need to clone/backup NTFS based systems. Lets say your NTFS system is located at /dev/sda1 and /dev/sdb1 is a spare partition where you can store your image. At first you need to boot a live system to take an image:

mount /dev/sdb1 /mnt/sdb1
dd bs=512 count=1 if=/dev/sda of=/mnt/sdb1/xp_vbox.mbr
ntfsclone -s -o /dev/sda1 bzip2 -9 -c > \
/mnt/sdb1/xp_vbox.img.bz2 To restore the image you just need:

mount /dev/sdb1 /mnt/sdb1
dd count=1 bs=446 if=/mnt/sdb1/xp_vbox.mbr of=/dev/sda
cat /mnt/sdb1/xp_vbox.img.bz2 bunzip2 -c \
ntfsclone -r -O /dev/sda1 - P.S. If you are elective in germany, have a look at this!

11 September 2009

Ian Wienand: Django toolchain on Debian

Although Django is well packaged for Debian, I've recently come to the conculsion that the packages are really not what I want. The problem is that my server runs Debian stable, while my development laptop runs unstable, and Django revisions definitely fall into the "unstable" category. There really is no way to use a system Django 1.1 on one side, and a system Django 1.0 on the other. After a bit of work, I think I've got something together that works, and I post it here in the hope it is useful for someone else. This info has been gleaned from similar references such as this and this. This is aimed at running a server using Debian stable (5.0) for production and an unstable environment for development. You actually need both to get this running. This is based on a project called "project" that lives in /var/www
  1. First step is to install python-virtualenv on both.
  2. Create a virtualenv on both, using the --no-site-packages to make it a stand-alone environment. This is like a chroot for python.
    $ virtualenv --no-site-packages project
    New python executable in project/bin/python
    Installing setuptools............done.
    
  3. The unstable environment has a file you'll need to copy into the stable environment - bin/activate_this.py. The stable version of python-virtualenv isn't recent enough to include this file, but you need it to essentially switch the system python into the chrooted environment. This will come in handy later when setting up the webserver.
  4. There are probably better ways to keep the two environments in sync, but I simply take a manual approach of doing everything twice, once in each. So from now on, do the following in both environments.
  5. Activate the environment
    /var/www$ cd project
    /var/www/project$ . bin/activate
    (project) /var/www/project$
    
  6. Use easy_install to install pip
    (project) /var/www/project$ easy_install pip
    Searching for pip
    Reading http://pypi.python.org/simple/pip/
    Reading http://pip.openplans.org
    Best match: pip 0.4
    Downloading http://pypi.python.org/packages/source/p/pip/pip-0.4.tar.gz#md5=b45714d04f8fd38fe8e3d4c7600b91a2
    Processing pip-0.4.tar.gz
    Running pip-0.4/setup.py -q bdist_egg --dist-dir /tmp/easy_install-Wu9O-U/pip-0.4/egg-dist-tmp-xjSdxq
    warning: no previously-included files matching '*.txt' found under directory 'docs/_build'
    no previously-included directories found matching 'docs/_build/_sources'
    zip_safe flag not set; analyzing archive contents...
    pip: module references __file__
    Adding pip 0.4 to easy-install.pth file
    Installing pip script to /var/www/project/bin
    Installed /var/www/project/lib/python2.5/site-packages/pip-0.4-py2.5.egg
    Processing dependencies for pip
    Finished processing dependencies for pip
    
  7. Install setuptools, also using easy_install (for some reason, pip can't install it). There is a trick here, you need to specify at least version 0.6c9 or there will be issues with the SVN version on Debian stable when you try to get Django in the next step.
    (project) /var/www/project$ easy_install setuptools==0.6c9
    Searching for setuptools==0.6c9
    Reading http://pypi.python.org/simple/setuptools/
    Best match: setuptools 0.6c9
    Downloading http://pypi.python.org/packages/2.5/s/setuptools/setuptools-0.6c9-py2.5.egg#md5=fe67c3e5a17b12c0e7c541b7ea43a8e6
    Processing setuptools-0.6c9-py2.5.egg
    Moving setuptools-0.6c9-py2.5.egg to /var/www/project/lib/python2.5/site-packages
    Removing setuptools 0.6c8 from easy-install.pth file
    Adding setuptools 0.6c9 to easy-install.pth file
    Installing easy_install script to /var/www/project/bin
    Installing easy_install-2.5 script to /var/www/project/bin
    Installed /var/www/project/lib/python2.5/site-packages/setuptools-0.6c9-py2.5.egg
    Processing dependencies for setuptools==0.6c9
    Finished processing dependencies for setuptools==0.6c9
    
  8. Create a requirements.txt with the path to the Django SVN for pip to install, then and then install it.
    (project) /var/www/project$ cat requirements.txt
    -e svn+http://code.djangoproject.com/svn/django/tags/releases/1.0.3/#egg=Django
    (project) /var/www/project$ pip install -r requirements.txt
    Obtaining Django from svn+http://code.djangoproject.com/svn/django/tags/releases/1.0.3/#egg=Django (from -r requirements.txt (line 1))
      Checking out http://code.djangoproject.com/svn/django/tags/releases/1.0.3/ to ./src/django
    (project) /var/www/project$ pip install -r requirements.txt
    Obtaining Django from svn+http://code.djangoproject.com/svn/django/tags/releases/1.0.3/#egg=Django (from -r requirements.txt (line 1))
      Checking out http://code.djangoproject.com/svn/django/tags/releases/1.0.3/ to ./src/django
    ... so on ...
    
  9. Almost there! You can keep installing more Python requirements with pip if you need, but we've got enough here to start.
  10. Create a file in /var/www/project called project-python.py. This will be the Python interpreter the webserver uses, and basically exec's itself into the virtalenv. The file should contain the following:
    activate_this = "/var/www/project/bin/activate_this.py"
    execfile(activate_this, dict(__file__=activate_this))
    from django.core.handlers.modpython import handler
    
  11. Now it's time to start the Django project. I like to create a new directory called project, which will be the parent directory kept in the SCM with all the code, media, templates, database (if using SQLite) etc. In this way to keep the two environments up-to-date I simply svn ci on one side, and svn co on the other.
    (project) /var/www/project$ mkdir project
    (project) /var/www/project/project$ mkdir db django media www
    (project) /var/www/project/project$ cd django/
    (project) /var/www/project/project/django$ django-admin startproject myproject
    
  12. Last step now is to wire-up Apache to serve it all up. The magic is making sure you specify the correct PythonHandler that you made before to use the virtualenv, and include the right paths so you can find it and all the required Django settings.
    DocumentRoot /var/www/project
    <Location "/">
        SetHandler python-program
        PythonHandler project-python
        PythonPath "['/var/www/project/','/var/www/project/project/django/'] + sys.path"
        SetEnv DJANGO_SETTINGS_MODULE myproject.settings
        PythonDebug On
    </Location>
    Alias /media /var/www/project/project/media
    <Location "/media">
        SetHandler none
    </Location>
    <Directory "/var/www/project/project/media">
        AllowOverride none
        Order allow,deny
        Allow from all
        Options FollowSymLinks Indexes
    </Directory>
    
With all this, you should be up and running in a basic but stable environment. It's easy enough to update packages for security fixes, etc via pip after activating your virtualenv.

9 September 2009

Isaac Jones: Proprietary Bits in Language

I've been on a Sci-Fi kick. I just finished reading The Dispossessed by Ursula K. Le Guin. I've read a few of her books before, but I really liked this one a lot. It reminded me a of some of Daniel Quinn's ideas. I picked it up sorta randomly because I'd read a couple of her books before. I had it sitting on my desk at work, and a few people said, "Oh, you're reading that? That's one of the best books I've ever read". Of course, I got it used for $3.50 at Powell's. I wonder how they get away with reprinting such books for $15. One interesting aspect of the book is that one of the languages used doesn't really express possessives. So instead of saying, "my book" it was always rendered as "the book". I didn't really notice this until near the end. When I did notice it, was when Le Guin wrote, "the mother" instead of "his mother". This didn't seem quite right to me, because it doesn't represent the relationship between "him" and "mother", but it's not really Le Guin's fault... there's no convenient way to represent this in English without using the possessive form. Perhaps "the mother of the man," but that still seems a bit possessive. I believe this is also true of Russian and Spanish at least. One way to look at it is that humans are so focused on possession that we don't have a convenient way to express relationships. But we are certainly not saying, "The mother that I own." Another way to look at it is that the so-called possessive case expresses more than just possession. In fact, it sometimes means possession and sometimes not. If my mother fell off her horse and I had to rush back to Ohio to visit her, and someone asked me why I was going, I might say, "Because she's my mother!" Not possessive. But clearly, it is sometimes possessive, particularly in romantic relationships. Jealousy is possible in all forms of relationships, but is probably most clear in romantic ones. "Why did you go to the prom with him when you're MY girlfriend?" This reminded me of the "object" formulation in object-oriented programming languages. (Didn't know that I was going to say THAT, did you? Ha!) In a language like Java, you say something like "the car's first wheel's last screw", "car.wheel[0].screw[3]". In Haskell, you also have aggregate types, where one type is composed of others but to access them, instead of saying, "the car's wheel" we say, "there's a relationship between cars and wheels. It doesn't matter what the relationship is, but the function from cars to wheels is called "wheels". So we have "last $ screws $ first $ wheels car". That is, "the last screw of the first wheel of the car"... actually that's clearer than "the car's first wheel's last screw" isn't it? There we go. I've once again proven that Haskell is morally and technically superior to C++. Randomness Here is an article linked from Slashdot about how people are giving up on the internet because of spam and spyware. The article doesn't mention GNU/Linux or Firefox. I just took one of those quizes that you've all been doing, and I was pretty disappointed.

Next.

Previous.