Sunday, July 11, 2010

Poland and the Holocaust

My son is in Poland at the moment, doing what might be called 'The Holocaust Tour'. For ten-fifteen years, the Holocaust has been a standard part of the Israeli school curriculum in history, and groups generally tour Poland whilst in the eleventh grade. During the year, they learn about the Holocaust (they also learnt about the Nazi party, the putsch, Crystalnacht, the Molotov/Ribbentrop agreement, the Wannsee conference at al.) and had extra-curricular meetings about Poland in particular. As part of their preparation, they visited the Yad VaShem Holocaust Memorial Museum in Jerusalem which is a harrowing experience. I have been there three times (about once every thirteen years), and every time gets harder.

We managed to speak to him on the phone last night and he seemed cheerful enough. Today is probably the highlight - or lowlight - of the trip: they visit Auschwitz. We offered to phone tonight, but he declined, saying that he would be watching the final of the World Cup. This demonstrates the emotional elasticity of youth - from Auschwitz to football in a few hours.

I was surprised to come across a description, slightly fictionalised, of a visit to Auschwitz in the book "Deaf Sentence: A Novel" by David Lodge. I once found an excellent interview with Lodge about the book, in which he confesses that the final two events (the visit to Poland and the father's death) occurred in real life but in the opposite order. Unfortunately, I lost the reference to that interview. It is interesting to read his comments, considering that Lodge was born Catholic and so not raised in the same cultural stew that I and my son were.

In 1976, my youth movement held what was called an 'ideological seminar' in Ilford, London. This time we concentrated on the Holocaust and even met with a few Holocaust survivors living in the vicinity. At the time, we tended to have the impression that very few people survived, but this seems not to have been the case.

Friday, July 09, 2010

The in-basket 2/A

Whilst reading my previous post, it became clear to me how the duplicate email had been created. There was a letter in the inbox; I double clicked on it in order to open the letter and see its contents. At a later stage, I double clicked on the letter in the inbox again, thus opening the letter a second time. This means that I shall have to add some code to check when double clicking on a letter whether it is currently open; if the letter is open, then the focus should move to this form. As the forms are anonymous (see the excrutiating detail in the previous post), this is going to be more than difficult.

I am reminded of Robert Silverberg's humourous tale of time travel, 'Up the line', when a slightly careless Time Courier manages to duplicate himself.....

The in-basket 2

Last week, after developing what I thought was a very neat solution, I presented my work-in-progress, aka the In-Basket exam, to the occupational psychologist (OP). Whilst she was impressed, it transpires that the direction that I had taken was not the one that she wanted. She insisted on having an interface more reminiscent of an email program, with an inbox and an outbox, where letters move from one to the other. It also became clear that I would need a table of 'dramatis personae', data about the 'people' who sent letters to the examinee to be dealt with.

On Saturday I worked for several hours on the program, getting it to a fairly reasonable state. On Sunday, I worked on the 'reply' section, which was fairly difficult. Unfortunately, demands of the day job and the July heat imposed themselves on me and so I couldn't continue with the work until yesterday evening, when I completed the 'reply' code (it's not exactly how it should be, but it's good enough for now).

This morning I presented the new, improved program once again to the OP and this time got the seal of approval. Even so, there were a myriad of small changes needed, along with a major change: instead of using listviews with which I displayed the messages, I decided to be traditional and used dbgrids. This simplifies certain aspects of the code and makes it more dependable.

I've just finished about four hours of work on the program, in which I seem to have rewritten about 50% of the code. In order to 'celebrate', I entered into the database an exam in which the examinee receives about 15 emails and has to decide in which order to execute the various tasks. The exam program as written isn't totally conducive to this exam; there's no simple way to show the execution order and the emails don't have much content. Our exam is different from others which I have seen in that the examinee has to provide reasons for the actions which he took. I utilised this in order to provide the timetable for my actions.

This specific exam didn't utilise any of the 'reply' code (ie reactions to 'emails' which have already been sent) so I couldn't exercise this part of the code. Otherwise the exam program behaved very well, except for the strange fact that one email appeared twice. I'm not sure how this came about and I'm not sure how I'll debug this.

Whilst developing the program and utilising the 'instant message' feature, I noticed that an instant message was appearing twice. It took me a long time to figure out where this was coming from - as I'm writing what is effectively a real-time program with MDI forms, it's not always clear who is doing what. Eventually I unravelled the mystery: the main program has a timer which fires every minute sending a message to the inbox form, telling it to load any new messages. In MDI programs, the child forms are generally anonymous, so one has to write code like this
for i:= 0 to mdichildcount - 1 do
 mdichild[i].close
When one wants a specific form to execute something - for example, the inbox and outbox forms are unique and can receive messages, whereas the email forms are non-unique and don't have messages - one has to use a typecast. First one checks whether the child form is of the required type and then a typecast is used. I have seen similar code which does not use a typecast, instead using the 'as' keyword; at this stage, the type of the child is known and so it is perfectly safe to use a typecast, which requires less code and is faster than the 'as' approach.

My code:
for i:= 0 to mdichildcount - 1 do
 if mdichild[i] is TSomething
  then TSomething (mdichild[i]).DoSomething;
'As' code;
for i:= 0 to mdichildcount - 1 do
 if mdichild[i] is TSomething
  then with mdichild[i] as TSomething
   DoSomething;
In the specific case of the instant messages, the IM was displayed as a new MDI child form and unfortunately the newest child form becomes mdichild[0], whereas the form which was previously first in the array now becomes second. The timer code was
for i:= 0 to mdichildcount - 1 do
 if mdichild is TInbox
  then TInbox (mdichild).openmessage (minutes);
At the time of execution, mdichild[0] was the inbox and mdichild[1] was the outbox. The first iteration sent a message to the inbox and told it to open any extant messages. When it was the IM's turn, it appeared on the screen. At this stage, mdichild[0] is now the IM, mdichild[1] is the inbox and mdichild[2] is the outbox. On the second iteration of the timer loop, it was looking at mdichild[1] - which is still the inbox! So the IM display code got called again, resulting in two IMs on he screen. The solution was fairly simple:
for i:= mdichildcount - 1 downto 0 do
 if mdichild is TInbox
  then TInbox (mdichild).openmessage (minutes);
Tomorrow I'm going to write the program which displays the user's results. The main report will be in the form of a diary:
00:10 mins: message #1 opened
00:15 mins: message #2 opened
00:20 mins: message #3 opened
00:30 mins: message #3 answered
text of message #3
user's answer
user's reason
00:40 mins: message #1 closed
...etc.

In the test exam, in which all the emails are extant at the beginning of the exam and they have to be replied to in an optimum order, there is no option but to open all the emails at the beginning of the program and read them before one is able to formulate a plan. As it happens, I knew that there were a few emails which could be left unread at first, but I imagine that most examinees won't know this.

Wednesday, June 30, 2010

Music and lyrics

I've noticed that some of the blog entries have started to have coloured backgrounds which weren't intended. Manually editing the html code only seems to make things worse, so I'm going to write this entry without changing the colour of the text in the hope that this will prevent problems. 

I saw the Hugh Grant/Drew Barrymore film "Music and lyrics" again over the weekend. This is a great rom-com and really speaks to me, presumably because Hugh Grant is a has-been musician who has difficulty in writing songs and records in a home studio. 

I saw this film in a cinema with my daughter several years ago and even then I was aware that the editing (or continuity) was somewhat suspect - especially the scene which takes place in a diner. Drew Barrymore also manages to change clothes even though she's spending time in Grant's flat and brought no clothes with her. Minor carping aside, Grant and Barrymore could have been the romantic couple of the decade had they made more films together, in the same way that Woody Allen and Diane Keaton defined (for me) the romantic couple of the 70s, and Meg Ryan/Tom Hanks the couple of the 90s. 

I am always peeved by this film that the song 'Way back into love' is never performed in its entirety. Grant and Barrymore perform the first two verses when they're recording the demo, but there's talking in between the verses. Grant and Hayley Bennett (playing the part of Cora Corman) sing the first two verses and the middle eight in the concert, but the first verse is talked over. Bennett sings the third verse in the studio but the recording peters out as Grant is surprised by the lyrics. So I decided to try and create a composite version and make a complete song. I played the different parts of the film on my computer's dvd player and recorded the soundtrack. I needed to record four parts: 
  1.  The Indian intro (recorded at Bennett's studio) - no singing 
  2. Opening verse by Drew Barrymore (recorded at Grant's studio) 
  3. Second half of first verse and onto the middle eight and instrumental - concert 
  4. Final verse by Bennett 
Most of the editing went well, although it turns out that Drew Barrymore's first verse is in a different key to the concert version, although the final verse is in the same key as the concert version. In order to complete the song, I looped the chorus and middle eight from the concert. I feel like Phil Spector artificially lengthening one of the final Beatles' songs because it was too short ("I me mine", if I remember correctly). The finished version sounds ok but not astounding. 

I find it interesting that Drew Barrymore apparently sings the opening verses. When she appeared in Woody Allen's musical "Everyone says I love you", she was the only actor not to sing, because her voice was so bad.

The In-basket: the initial stages of designing a computerised exam

The occupational psychologist for whom I work (let's call her OP from now on) unveiled her latest project for me a few days ago - computerising the 'In-basket' exam. Although I've never heard of such an exam before, it turns out that it's a well known exercise in management and there are even complete books written about it, such as In-Basket Examination: Test Preparation Study Guide, Questions & Answers. There are many references to this kind of exam on the Internet, but most seem to be connected with branches of the American police. Here's a complete example which has nothing to do with the police.

I feel a little like Jim Graves (or whatever his name was, in "Mission Impossible"): your mission, should you decide to accept it, is to convert this text-only exercise into a computerised simulation.

The original brief which I received very briefly on Friday morning was that the user is presented with a series of emails with which she has to deal. During the course of the exam, more emails appear, and even a secretary enters the room to give details of current events. Apparently the scenario which the OP uses is based on events which happened (or supposedly happened) fifteen to twenty years ago in the chair manufacturing factory in which I work (so I doubt that there is an event in which the secretary rushes in to announce that the factory is on fire).

When considering how to program the simulation, it became clear that the program would need a timer which fulfills the following functions (dig that alliteration!):
  • show the user how much time is left to complete the exam
  • check every minute whether there are new events/emails to be displayed
  • provide a time stamp for actions that the user has taken, so that afterwards her actions can be analysed according to the order in which they were performed
Originally I had assumed that it would be necessary to fake an email application in which some mails are already present, new mails get added during the course of the exam, and others are deleted after they are handled. In order to program this, I used a TListView. It also became clear that the program would have to use the MDI model in order to display all the opened emails, instead of working one email at a time. These are all techniques which I have used in the past few months, so I didn't have any technical problems in programming; the problems which I did have were in designing the interface, or more accurately, determining how the application should be presented to the user, what she would need to do in order to undertake the exam, what actions she would need to take and how these would be represented.

I wrote a pilot version of the exam before I had even seen the Internet material. Upon reading this, I extended the pilot version until I had something interesting - but also somewhat unwieldy.

My method of working was to think hard about how I wanted to implement something (not in the programming sense of implementation, eg how to implement quick sort) and then try and get the program to do what I wanted it to do. The programming per se wasn't hard although at times it was tricky and sometimes I did get bogged down on minor details (for example, in a MDI application, the 'OnKeyPress' event does not work - the solution is to use the TApplicationEvents component).

At this point, I contacted the OP and asked some pertinent questions about the direction of the program - should all the emails be presented at once (as per the example which I gave above) so that they could be prioritised, or should they be presented via the clock, which would make the prioritising much harder. How should the email replies be dealt with? One idea which I saw was to allow the user to 'make' phone calls - how could this be represented?

One idea which I had considered was to show the user's priorities by allowing her to sort the emails in the listview via drag and drop. Whilst waiting for an answer from the OP, I actually implemented this in a small test application. Her reply stated that the priorities would come from the order in which the emails were replied to and thus there was no need for drag and drop.
 
Once I had her reply, I thought a little more about what was needed, especially about how the user would reply to the emails. I had originally designed a simple dialog box (displayed as a non-modal mdi child form) which displayed the original email text in a memo along with two memo boxes connected to a database table in which the user would write his reply and attempt to explain her reasons for replying in this manner. At the bottom of the form were, as usual, two buttons: pressing the OK button would insert the user's answers into the database and would close the form whereas pressing the Cancel button would discard the user's answers and close the form. I had conceptual problems about editing - should the user be allowed to answer the same email twice (or at least edit the original answer)? What would happen to the time stamp in such a situation?

I utilised the time otherwise wasted whilst driving home from work in order to think about the new program structure. I realised that the OK button should initially be disabled; it should only be enabled after the user actually types something in the reply field. Then I considered the fact that if there was no need for drag and drop on the listview, there was no real need for the listview at all. New emails could simply be displayed on the desktop as mdi child forms. To prevent the user from closing the forms without replying (and without the listview, there would be no way of redisplaying the forms), I realised that the Cancel button should be removed!

I dropped the idea of 'recording phone messages' as these seemed to be identical to the 'instant messages', the equivalent of the secretary entering the office and announcing that the workers had gone home on strike. The 'instant messages' were virtually the same as the 'email messages' - the only difference (at the moment) being that the emails were 'sent' by somebody whereas the instant ones weren't. This meant that I could use one database table to store all the messages and display them in the same form (hiding the 'from' field if it were empty).

Upon getting home, I set about writing a new version of the demo exam. The database structure had simplified, so I deleted the original database file and defined a new one. This new version of the exam is - from a programming point of view - much simpler. Apart from a form which is displayed modally at the beginning of the exam in which the user enters her personal data, the program consists of one MDI main form with a timer; every minute, the program executes a query which determines whether there are any messages to be displayed. If so, a call is made to display an MDI child form as described earlier. There is only one button on the form - OK - which is initially disabled. If the user wishes not to act upon the form, it simply stays open on the desktop to be handled at a later stage. If the user types something into the form, pressing the OK button will save the data (along with the time stamp) and remove the form from the desktop - forever.

Now all I need to do is input the scenario  - the messages and when they appear - and the exam, at least in its initial stage, is complete. I am sure that there will be many changes, but most of them will be minor now that the architecture is in place. Of course, I could have misunderstood the OP's intentions.....

Sunday, June 27, 2010

LASIK surgery

My daughter underwent LASIK surgery on Thursday evening; she's been wearing glasses since the age of 12 and she is now 22. Actually, most of the time she wears contact lenses rather than glasses; the former look better although require more maintenance.

She decided a few weeks ago to undergo the operation and began researching the market. There are several places which offer the operation in Jerusalem, which meant that her eyes were thoroughly examined twice (each clinic has to judge for itself whether the patient's problem is correctable) before she could get to the stage of comparing price quotations and suitability. As it happens, she chose a more expensive clinic, but as my wife would say, one doesn't skimp on health.

The chosen clinic was on the tenth (and top floor) of a building near the entrance to Jerusalem; the expansive windows allowed a panoramic view of the city at night. Even at 7pm, the clinic was full; it's more like a conveyor belt operation than personal attention, as each operation takes only a few minutes. But as there were many patients waiting, it took some time before my daughter's turn came, and we only left the clinic after 9pm, she wearing protective goggles over her eyes.

The next morning we had to return for a brief check-up; as we waited in the building's lobby for the lift, we saw people walking around with sunglasses (it was only 7:30 in the morning). I joked that it was like a scene from 'The Matrix' and that I was wearing sunglasses in order to identify with all the other patients (my eyes are sensitive to light so I wear sunglasses very often). The check-up was fine, and on the way back home, we were having competitions on who could see the better. 

The procedure was miraculous: in a few minutes, her sight problems were corrected and now it seems that she can see better than I can (my eye muscles are tired)!

Wednesday, June 23, 2010

The Israelis are becoming like the British

The Israelis are becoming like the British - always talking about the weather. Normally the climate is like southern California and hot, hot, hot! every day. But the last few days have been extra-ordinary: yesterday morning at 5:30am, the temperature was 32.5 degrees Celsius outside the house, and by 8am it was over 40 degrees (that's 104 Fahrenheit). Apparently at around 10am, cold winds started to blow, slowly taking the temperature down to a more reasonable 30 degrees at 5pm. This morning, it was about 21 degrees outside - but 27 degrees inside! More power to the air-conditioners! According to the television news, the electricity company was supplying 99.98% of its capacity.

Most people are glued to their televisions at the moment watching the World Cup (or Mondial, as it is known here) but I couldn't care less. I have never been interested in football, even as a child (well, maybe I was slightly interested then), although I was a passionate rugby football fan during my school years. 

I have discovered that an obscure television station broadcasting from Cyprus has begun showing 'Star Trek: The next generation', beginning with the first series. I haven't seen these episodes for years (they were originally broadcast over 20 years ago) and am enjoying the trip down memory lane. The acting and plots are a bit clunky, but as I recall, the series improved greatly by the time of the third season. I wonder whether this station is going to show all the episodes.

During the 1990s, this programme acted as my bible for organisational behaviour, although I didn't know the term at the time. I admired how Captain Picard would assemble his officers in the briefing room in order to hold what would be in business terms a management meeting. There was no flapping about: everybody would bring pertinent information to the table and a decision would be reached quickly. If only real life were like that.... Instead, people talk about things which they know little about and conceal or reveal their ambitions. 

Later I always wondered how come the bridge is always manned by the senior staff. Was the concept of 'watches' or shift duty unknown to them?  Actually, I have a dim memory of one episode which is narrated by Data, which starts by him commanding the night shift. Maybe he doesn't have to sleep but surely the others do. Of course, such realities wouldn't make for a very good television series.

Sunday, June 20, 2010

Sunday morning

In western countries, the weekend is Saturday and Sunday, but in Israel it's Friday and Saturday. There are plenty of people who work on Fridays (normally until 1 or 2pm) but there are also plenty of people who don't. A five day work week was instituted maybe ten years ago, adding an hour to every work day. For those who do work on Fridays (my bank, for example), there is usually one weekday when they don't work (the bank is closed today). If one works on an hourly basis (as does my wife), then it's better to work during the week and not work on a Friday as one works more hours this way and so gets paid more. 

The point of this over-elaborate introduction is that two phrases which are resonant in western society ("I don't like Mondays" - the Boomtown Rats, "Someone's got a case of the Mondays" - the film "Office Space") don't really make much sense here. Instead, one could say "someone's got a case of the Sundays", but I've never heard anyone say that. There is definitely a sense of transition, although for religious Jews, this occurs on Saturday night when Shabbat "goes out"; there is a small ceremony held, called "Havdala" (difference) in which this transition is marked.

For me, the first ten minutes on a Sunday are slightly difficult as my head is normally full of the programming which I've done over the weekend, and now I have to clear my head instantly and take on a different set of responsibilities. I'm going to write here about the fun and games of the weekend, and not the fun and games of the day job.

The occupational psychologist for whom I work developed a questionnaire whose results indicate which profession is suitable for the person sitting the exam. The target population for this exam is mainly pre-university youngsters although there are elder populations for whom the questionnaire is applicable. I computerised the questionnaire several months ago; this was fairly routine. Even the program which reads the raw data and "calculates" the suggested profession is fairly routine, although we did spend a large amount of time designing and programming the output in order to make it user friendly.

As we intend this questionnaire to be distributed "in the wild", there are certain aspects which are unique to the program suite (there are four or five programs involved). 
  • People will have to pay in order to get their results, which means that there has to be a mechanism for issuing and distributing licenses. 
  • The raw data has to be sent from the client's computer to our server, the results have to be calculated and the output file has to be returned.
The first point was fairly simple to implement: I added a 'licenses' table to the database, which has fields for username, email, license code, counter and multi-user. If the license is defined as multi-user, then the same code can be used many times (this is intended for external establishments, who presumably will pay according to the license counter, which is incremented every time a licensed data file is received). For a normal user, the license is good for one time only.

In order to implement the second point, I added to the distributed questionnaire program a code snippet which automatically sends by email the raw results file to a specific email address. I then wrote a program which polls this email address every five minutes and downloads any letter which has certain characteristics (it's not going to download spam!). The program extracts the attached data file from the email and passes it to the calculation and output stages of the results program and then returns the output file by email. How does it know where to send the email? Because output files are sent only to registered users and the email of the registered user is known. So even if someone bothers enough to fake a registration code, they won't get the results.

The previous paragraph glossed over several points which actually took me quite a time to get right. Finding a free email server which handles POP3 was surprisingly difficult and took several attempts before I found one whose mail I could download successfully. I had never written a program which downloads email before, so I had to learn how to do the ins and outs of this as well. Checking the license and the multi-user status of the license was tricky but not difficult.

There were several little parsing errors which needed to be solved, but on Friday night, the occupational psychologist's son (who is in the target population) was roving the kibbutz with a mobile computer and the computerised questionnaire, getting all his friends to complete the questionnaire and getting the results back by email. Well, not quite: there was a problem with the file returning code. I woke up at 6am with a possible solution to the problem; it wasn't the correct solution, but did help pave the way.

This mobile computer was a pain in the neck by itself. I had programmed the display for a normal computer screen, but this mobile was one of the new breed of notebook computers with an aspect ratio sufficiently different from a standard screen to cause problems. The normal screen displays instructions at the top and five questions; on the notebook, the screen was truncated and only one or two questions were being displayed - and there were no scrollbars visible which would have enabled the user to scroll the display in order to see the missing questions.

I spent a few hours on Friday afternoon solving this problem. The other son of the occupational psychologist had done some design work with me on the program, resulting in an aesthetically pleasing display. His design called for the questions to be displayed in a dialog box with no borders - and it transpires that such a dialog box cannot have scrollbars. After knocking my head against a brick wall for some time, I found a compromise solution in which the dialog box has no caption but has a minimal border. This allowed the vertical scrollbar to appear (I fiddled with the width of the dialog in order to prevent a horizontal scrollbar from appearing).

There was another wish which I had been avoiding for the time being: the output file should be a PDF file and not a Word file. I know that Word 2007 has a 'save to PDF' option but we are using Word 2003 and upgrading solely for this ability seemed non-proportional. Yes, I know that Open Office can save to pdf, but then I would have to learn how to automate Open Office, a task which seems somewhat daunting at the moment, especially considering the lack of documentation. I tried a command line program which sort of did the job, but it seemed very slow, required most of the computer's cpu time whilst converting and was not free. 

After a brief nap on Saturday afternoon, I contemplated the pdf problem again. The program which I had tried automatically invoked Word and instructed it to send the file as output to a printer driver which the program had installed. This is when the light went on over my head: we already have a pdf printer driver! I had erroneously assumed that it couldn't help us as it always asks where to save the file and then invokes a pdf reader after the file has been created. Wrong! The printer driver has settings which enable the user to avoid the 'file save' dialog and not invoke the pdf reader. After five minutes work, I had a test program which wrote to a Word file via automation and then converted that file to pdf. 

I still had to install the pdf printer driver on the server, sets its definitions and add the necessary few lines to the output program, but these tasks were trivial. Now the automatic downloader/dispatcher program will send a pdf file back to the questionnee! (This is yet to be tested as no more data files have been received since I added this, but I am confident of the results).

In conclusion: I now have to switch off the part of my brain which has been operating on finding solutions for the problems posed by this questionnaire suite, and reprogram it in order to meet the challenges provided by the day job (for example, show where the differences in inventory value for examples in the last two months come from).

Thursday, June 10, 2010

MTD2Prio

I wrote a few weeks ago about our attempts to take the output from an external program and feed it into our ERP program. The external program is known as MTD (although I think that this is the name of the company and not the program itself) and the ERP program is called Priority; hence my program is called (with great imagination) MTD2Prio.

The previous installment of this saga had the team realising that the glue program needed to more than simply parse one of MTD's output files. I developed a simple quasi-database program (utilising a clientdatabaseset) which would display lines read from the file as well as lines added by the user. With no small amount of effort, I wrote code which would output five different files for import into Priority, one file for each table in Priority. Not all lines (parts) displayed on the screen are in each of the different files, so this part was more than tricky.

Once I had the five files (and originally I thought that I would need only three), I started on the work of importing those files into Priority and substituting parts in the given order with the parts in the files. Most of this work was achieved without difficulty, although it became apparent that I needed more data than I had originally planned (which is why the number of files increased). In a moment of inspiration, I also figured out how the program could use standard parts - a problem which had occupied us in a previous meeting and had been ignored since.

After displaying this new, improved version, some bright spark asked what would happen if the same part designed in the external program appeared more than once in the user's order. This could happen if the order was split up into sections, each section representing a different room in the customer's office; the same special table could be in each room. Obviously, the part would have to be designed only once, but the problem became mine: how could the user show that the part would have to be inserted into lines 1, 5 and 7 (for example) in the customer's order without defining three parts?

I figured out how to do most of the work as a mental exercise whilst driving back from Tel Aviv after the final economics lecture on Friday, but hadn't wanted to devote any time to implementing this new feature until after the exam. Today I had the time and space to devote to solving the problem, so solve it I did. I probably spent more time on parsing the input file than I did on the mechanics of the substitution in Priority. I wouldn't necessarily say that the work was overly complicated, but it demanded a certain finesse.

Anyway, that problem has been solved, leaving only one more problem of which I am aware, which is concerned with raw materials handling. As this is solely a Priority issue, I'm not expecting too much difficulty, but I'm leaving it for the moment in order to allow the solution to mature in my brain.

Of course, the users will probably have several issues which haven't been considered yet. These will probably be interface problems which won't necessitate any changes in the Priority code.

Wednesday, June 09, 2010

Post mortem on my Economics exam

Today was held the examination in Economics, the third course which I have taken for my MBA degree. As opposed to the previous exams which had been held in the Exhibition grounds of Tel Aviv, this exam was held in a posh hotel on the sea front. As I understand, this is going to be the new home for all future exams. For me, getting to the location was more problematic than before; in the past, I would take a train to the Tel Aviv University station and walk a few hundred metres. Yesterday, I took a train to an earlier Tel Aviv station, took a bus from there - and had to walk more than a few hundred metres. Coming back, I took a slightly different route which involved less walking. 

Obviously the conditions inside the hotel were better than before: both cold and hot drinks were waiting outside the examination room, and there were also adjacent lounges facing the sea, where most of us relaxed for a few minutes before the exam started. But once the exam started, all the external conditions ceased to have any effect as 100% concentration was directed to the exam.

The exam was much harder than I had expected; as part of the preparation process, I had worked on several previous exams, and in the morning even went over once more the two practice exams given in the course's textbook. Maybe it was the familiarity, but none of them were as hard as this one. Our lecturer said that every now and then the exam is very difficult, but with luck we would miss the hard one. Our luck did not hold.

The exam consists of four parts: 30 multiple choice questions (2 marks each), one 'case study', which is normally a numerical exercise in micro-economics (20 marks), one essay on micro-economics (40 marks) and one essay on macro-economics (40 marks). This makes a total of 160 marks and one needs 80 in order to pass. 

The multiple choice questions, as usual, were difficult and it's easy to make mistakes. In about half of the questions, there was a statement and four different answers; these are usually not too difficult to answer as normally two of the potential answers are obviously wrong. But this exam added a new wrinkle: there were several questions in which three statements were made, and then one has to choose (for example) whether the first is right, the second and third are right, all are right or all are wrong. My certainty on this type of question was lower.

Unfortunately, we didn't get, in the case study, a nice numerical question about a fishing company and how many people should go fishing every day. No, we had to get a question about a tennis player who endorses watches (why not tennis racquets?); she wants to get a percentage of the selling price whereas the manufacturers wish to maximise their profits. Write an essay explaining the situation - no numerical data provided. I thought that this section would bring an easy 15-20 marks, but instead I had to sweat in order to achieve maybe 15. 

The micro-economics essay, as expected, was about economic efficiency and 'marginal efficiency conditions', but instead of linking this to market failures as per usual, it was connected to the labour market. This is a combination which we hadn't come across before, and again, a great deal of mental sweat was necessary.

In the macro-economics question, several data about a nation's economy over two years were presented, along with four statements saying that 'if x and y, then z would be expected'. The question was to explain why z did not happen.

I imagine that I passed the exam, but with a lower mark than I might have otherwise expected. I don't know how anyone else felt about the exam because no one left at the same time as I did, and anyway we are now on holiday - until August. Next up is Project Management, which is a subject which will definitely be useful in my daily life.

Tuesday, June 01, 2010

Network card

I'm typing this from a mobile computer whilst sitting in a crowded train travelling from the north of Israel to Tel Aviv. I've had a laptop for some time, but have never been able to use it on trains because I didn't have a network card that connects to a mobile supplier. Finally today I got the long waited card and of course wasted no opportunity to start using it. As the connection is not via the work network (to which I have to connect via VPN), I am free to point my browser at whatever site I want, which is what enables me to write this entry.

There are some train journeys in which the computer is going to prove invaluable - I could have done with it this morning when I received several phone calls on my way up north - but there are also going to be times when using it is impractical. It's not very easy at the moment - the train is more than full, and before there were groups of youngsters walking up and down the aisles and bumping into my elbow.  But even so.... 

We have just arrived at the Binyamina station and it's time to log off.

Monday, May 31, 2010

Another month comes to an end

Another month comes to an end and there's little blogging to show for it. I've simply been too busy to devote time to writing here.

My economics course has come to an end and the exam is next Wednesday. I'm revising, but not that thoroughly. I think that I know the material well and much of it is common sense anyway (at least, common sense after having finished a course in the subject).

I saw the Tom Hanks film "That Thing You Do" the other day and thoroughly enjoyed it. Of course, the subject matter does talk to me. All the way through, I was waiting for the moment when the manager screws the band but that never happened. The entire financial scam element was missing from the film; the innocent band members enjoyed the largesse showered upon them, never realising that the costs would be borne from their earnings. Maybe then they would have been slightly more careful with their money.

The IMDB page has a very active discussion board for the film. There is even a thread discussing how the title song changes throughout the film. One thing missing from the discussion: the closing chord in the early versions is different from the closing chord in later versions.

I'm listening at the moment to "A parcel of Steeleye Span", a three cd compilation of "their first five Chrysalis albums". I thought that I knew some of this material quite well, but I haven't heard it for about 35 years and my memories have faded somewhat. To be honest, I prefer the two previous B&C albums (with Martin Carthy and Ashley Hutchings) - their starkness plays in their favour. The entire package cost only six pounds, and I hope that some of that money finds its way to the group as royalties - although maybe they still haven't paid off the advances for these records.

Reading material is yet another Eliyahu Goldratt book, "Necessary but not sufficient". This book is about a company which has developed and sold an ERP package, making it close to home. How much does such a program contribute to the bottom line? Fortunately, that's not a question which I've often been asked, although the book does provide a few answers.

Saturday, May 15, 2010

It's not luck ... and much more on business problems

As I have previously written, my lecturer in Organisational Behaviour suggested that we read a business novel called "The Goal" by Eli Goldratt. Eventually the penny dropped and I ordered the book. After reading it, I came to the conclusion that every MBA student should read it, even though at times the book seems antiquated. I have also recommended to people in one of the companies that I support that they too read it. It transpires that there was a plant manager who worked there only for a short while who also recommended the book and even read extracts to his managers.

After rereading the book a few times, I decided that it was time to read its sequel,  "It's not luck". Despite USA Amazon promising a delivery date somewhere in June, the book actually arrived about five days after having been ordered (rule #1 in business: always outperform one's promises). As usual, I read it far too fast to absorb too much, so I'm going to read it again in the next few days, taking it slower and trying to think about what is written.

As a novel, it's far less successful than "The Goal", although there is a clearly defined protagonist (Alex Rogo) and a problem to be solved. Although this is touted as a sequel, there are several tools used by Rogo whose source is never explained. These are clearly tools derived from the Theory Of Constraints, Goldratt's contribution to management studies, but their derivation is not described in the same way as in "The Goal", which made the early chapters somewhat frustrating. Maybe there is another book which is a true sequel to "The Goal", or at least a true predecessor of "It's not luck".

One of the more charming aspects of "The Goal" was how Rogo's private life provided several examples which eventually became paradigms for his industrial success. In "It's not luck", Rogo uses the new business tools for solving problems in his personal life; whilst this might be more realistic, it is less engrossing as a novel. Writing management books as novels is definitely a good way of enabling the brain to absorb what are sometimes complex issues. I shall be on the lookout for more such books.

After finishing the book and reflecting on how I can use the ideas presented within, it becomes clear to me that I am too low on the corporate level - or at least, not in a chain of command post - to do very much. Even though I work for what is essentially a holding company which is running three or four different companies, our scale is much much smaller than the companies discussed in the books. Actually, this smaller size should be to my advantage as there are fewer levels of beaurocracy and I have a direct line to the company's president.

My problem is more that I think on too low a scale: I think mainly about computer problems and how I can solve them, not on the corporate strategic level. In order to solve this problem, I am studying for an MBA; the final course - strategic planning - is supposed to give me the necessary tools and vision.

At the moment I am engrossed with three different problems at work, two of which are championed by the president. One is an attempt to improve the throughput of one factory - or rather, reduce waiting time for orders before beginning production. I have done the necessary development work to enable this system to be implemented in our ERP program; that's actually a joke, as the ERP program can easily handle what needs to be done, and in fact was designed to work in this "new" way. This factory had implemented change after change in order to force the program to work in the way that they wanted it to work. My job was to maintain their way of looking at things whilst making the program more flexible. After a few false starts, I realised about six weeks ago that the solution was actually simpler than I had originally thought, and the implementation was done quickly. My problem has been convincing the factory managers to use the new system. The president has given his political clout to the change, but I am convinced that the managers are only paying lip service to the ideas and are not using the new system to its full potential.

The other problem is using an external program to perform design work. An ERP system whilst being flexible in certain respects is also very rigid: there is no such thing as a parametric bill of materials - yet this is exactly what is needed if one is building wooden tables, whose length and width can be tailored to the customer's needs. This external program is designed from the ground up to be parametric - but of course only replaces one module of the ERP program. Thus it is my job to 'glue' the two together.

This program does export several files, but it turns out that all of them bar one are useless. The only useful file - and it contains all the information that I need - is in HTML format, which is not the most conducive to parse. Suffering a lack of time, it was only on Tuesday that I managed to give serious time to the problem. It became obvious to me that I could read the HTML file with Excel and then save it as a CSV file, which made parsing much simpler. After about an hour, I had written a Delphi program which could parse the file and output a text file holding the bill of materials which could serve as input to the ERP program.

As it happens, on Wednesday was held a divisional meeting, and the subject of integrating this external program was raised. I was able to report on my progress, and pointed out that we had received a price quotation of 5,500 euros to do what I had done in one hour. On the basis of this, I suggested (somewhat tongue in cheek) that my salary should be "only" 4,000 euros per hour, but that I was willing to settle for 4,000 euros a month.

On Thursday, the implementation team had another meeting in which we attacked the problem of how the factory was going to integrate this external program. It soon became clear to me that there was a major problem that we had not considered, the problem of producing a delivery note from the ERP program. I don't want to go into details, because most of the problems derive from the way that this factory produces delivery notes. If I were Alex Rogo, I would change this system immediately, but on the other hand, it won't make any difference to our bottom line and so the change is not needed.

The needed insight was that writing a program that simply interpreted a csv file and exported the information contained in a suitable format was not enough. The program has to receive a certain amount of extra information and impart much more information to the export file. Writing the program won't be too difficult; what was necessary was the insight. The other members of the team seemed somewhat lost at what I was suggesting (although one caught on fairly quickly) and it took a great deal of persuasion and explanation before they understood the problem and how I proposed to solve it.

After the meeting I wrote a proposal which explains the problem and how to solve it without going into specifics. Then I went into very specific detail and explained - mainly to myself - how to implement my idea. I will have to put my money (or rather, my brain) where my mouth is.

Friday, May 14, 2010

The Fourteenth of May

On the fourteenth of May at the dawn of the day
With my gun of my shoulder to the woods I did stray
In search of some game if the weather proved fair
To see could I get a shot at the Bonny Black Hare
So begins the allegorical tale of a hunter - or more correctly, a poacher - who is not hunting a hare, a small creature that many mistake for a rabbit, but rather for a piece of feminine anatomy.

This bawdy tale came to my attention in 1971 when it was recorded by Fairport Convention for their sixth album, "Angel Delight", a rather mixed offering which suffered on the one hand by the loss of Richard Thompson but gained by the others trying their hardest. 

Around the same time, their cousin group, Steeleye Span, released a rather more sombre song which also mentions the 14th of May:
When I was on horseback, wasn't I pretty
When I was on horseback, wasn't I gay
Wasn't I pretty when I entered Cork City
To meet with my downfall on the fourteenth of May
This song, set to a chilling arrangement, was not about some flighty young girl, as the above words might hint, but rather about a young British soldier serving in Ireland.

In 1971, I was beginning to think that traditional folk was my kind of music, and I found it both strange and pleasing that two songs encountered within a few months should reference the same calendar date. As it happens, I can't recall any other song referencing any date at all, so this remains a coincidence. 

Today is, of course, the 14th of May, so the Fairport mailing list is full of wishes that our powder stays dry and that our ramrods never go limp.

Friday, May 07, 2010

Economics

As I mentioned previously, I am currently taking a course in Economics and I am enjoying it immensely. The first six or seven meetings were devoted to Micro-economics and since then we have been studying Macro-economics. This has provided the perfect backdrop to the economic crisis in Greece, and today, amongst discussion of the Keynes multiplier, deflationary and inflationary gaps, we also talked a little about previous economic crises in Israel and what is happening in Greece.

I fail to understand what the people are demonstrating about. Obviously, they want to retain their standard of living, but they also seem unable to do the work necessary to maintain it. 14 salaries a year? Retirement at 55? Who wouldn't want these things? The only problem is that there is no money to pay for these things, and if the Greeks don't go to work and improve their productivity, then there will be no money whatsoever.

Israel went through a painful period in the mid-80s when there was tremendous inflation (400% in one year). I remember presenting balance sheets, and there wasn't enough room in the pre-printed sheets to write the numbers as they had suddenly grown so large. A package deal was put together between the government, the employers and the workers; everybody had to crack down and suffer in order that things would be better for all of us. Two years later, Israel was well on the road to economic recovery.

The Greeks have to do the same.

I am currently reading a book called "The undercover economist" by Tim Harford. This is a non-academic look at various issues in economics and so can be recommended to anybody who has an interest in the subject but comes out in hives when presented with equations. The book itself is very interesting and well written (although the author seems to be at home equally in London and Washington DC, which is slightly off-putting to me), and I take great pleasure in finding the economic principles which I have been taught.

At first, I though that the book would be devoted to micro-economics - why does a cup of coffee cost as much as it does - but there are a few chapters devoted to macro-economics. I am sure that in the syllabus of the Edinburgh Business School/Heriot Watt University there is no mention of corruption and bribery being factors in a country's economy (the example used is Cameroon), and there is also an excellent analysis of China's economy over the past 60 years.  Whilst this material in no way will supplant the material being taught, it is a useful adjunct which casts matters in a slightly different light, and may even be worth a few marks in the exam - which I was reminded today is only a few weeks away.

Thursday, May 06, 2010

White coat syndrome

I've got ten minutes before I have to leave home in order to catch a train, so I thought I'd devote them to this blog. The last few weeks have been very heavy in terms of travelling - this week I've been out of my office four days out of five. While I am getting some work done during these days - meetings and teaching sessions - I can't get on with what I consider to be my primary work - programming - nor can I clear the administrative overhead.

One of the support issues from the past week reminded me of the White Coat Syndrome. A few months ago, when I was being diagnosed with essential hypertension (high blood pressure), my family doctor explained the phenomenon that people's blood pressure would automatically rise when they saw a white lab coat, or when they entered the doctor's surgery or simply saw the machine for measuring blood pressure. This syndrome is why the pressure is measured  three times, discarding the first reading and averaging the last two.

I have noticed a similar syndrome, which might be called the Support Syndrome. Someone tells me about a screen or report that they are trying to operate and that it doesn't work. If it is someone in my vicinity, then I sit next to them whilst they perform the same operation again, whereas if it is someone calling me on the telephone, then I ask them to perform the operation whilst telling me the exact steps that they take. I do exactly as they tell me.

99% of the time, the second operation succeeds! The people asking for support are always astounded, as if I have some kind of mental aura which charms the computer into doing what it is supposed to do. My theory is that my presence causes the person to concentrate more on what they are doing, and that the previous, failed operation happened because they didn't concentrate and/or didn't read something on the screen. One would be surprised at the number of calls I have received about people not being able to log into the production database - because they didn't notice that another user's name appeared in the login screen.....

Last read: It takes teamwork to tango, by Russ King. Described as a 'business novel', it strikes me that there might be a little too much novel and not enough business in it. The book deserves a second reading, but I'm not too sure that it holds any lessons for me.

Must rush: got a train to catch.

Monday, April 19, 2010

Books and films

My last post left me feeling like Will Freeman, a character in Nick Hornby's novel, "About a boy". As Will doesn't work, he has to find things to do, and so divides his day into half hour units (breakfast - one unit; taking a bath - two units, etc). I was going to quote his calculations from the book, but when I looked there, it turns out that there is no such monologue. Instead there is a calculation about how cool Will is. So where did the time units come from? Obviously from the film, starring Hugh Grant. *

The film adaptation of "About a boy" was fairly accurate until about two thirds of the way through the book. The two diverge when (in the book) Marcus takes a train journey to Cambridge in order to see his father; he is accompanied by Ellie. On the way, things take a wrong turn.... None of this is in the film, probably because it hinges upon Kurt Cobain, and maybe the film producers couldn't get clearance to use the late Cobain in the film - or maybe they reckoned that the film's audience wouldn't know who KC was. So instead, film viewers got Marcus rapping in the corridors along with the school concert.

"The time traveler's wife" has been made into a film, and I was able to watch it today, courtesy of the Internet. Whilst this adaptation is more faithful that "About a boy" in that it doesn't introduce new material (except for the final scene), it leaves much more out. That's hardly unavoidable, as a quick glance at the book shows: the book is written in the first person (although alternates between Claire and Henry) and has very rich prose, whereas the film naturally is third person, and the special tone of the writing is absent.

It's not a bad film by any means, but it wasn't particularly special. Some of the photography was very good, making it a visual treasure, but some parts seemed to be very obviously filmed against a blue screen. As always, it would be interesting to hear the thoughts of someone who had seen the film without having read the book.

* Edit from 13/10/16: I reread "About a boy" yesterday and came across the time units in chapter 12. "Reading the paper, having a bath, tidying the flat" are all activities requiring one unit.

Saturday, April 17, 2010

A typical Saturday

I've noticed over the past few months that I have been planning on a hourly basis how to spend my Saturdays, nominally my day of rest. There always seems to be so much to do and so little time in which to do it that one needs to prepare in advance in order to get the maximum utility (a little economics creeping in there).

Normally, the day consists of two episodes, each two hours in duration, of programming; one two hour session reviewing the material taught in the MBA class the day previously; one two-three hour session of cooking and spending time with my father (today we're having chicken ratatouille, with a slight variation of last time's recipe); one two hour session transferring to dvd a film recorded earlier in the week which I didn't have time to watch. There is also the dog who has to be walked.

Today's schedule was upset by devoting what would normally be the morning programming session to creating a new mix cd for my wife. As usual an eclectic mix, moving from the well known (Jackson Browne, Joni Mitchell, CS&N, The Band) to my folk rock roots (R&L Thompson, Sandy Denny, Nick Drake), interspersed with a few left field contributions (Heron, Colin Blunstone, King Crimson, Robin Frederick, Dar Williams). The response hasn't been too positive yet, but I am hoping that the disk will be played frequently in the car and will become more familiar.

Friday, April 16, 2010

Travelling by train/Outliers/Memories of school

Instead of working in my office this week, 5 km from my home, I've been travelling almost every day to different branches of my company. On Monday I was in Tel Aviv, Tuesday Haifa bay, Wednesday Carmiel and Thursday Tel Aviv again. Some of my fellow workers wondered whether I was healthy, as they haven't seen me for several days.

Every day I travelled by train; I've been getting to recognise many of my fellow travellers. Of course, I don't know their names, but I often assign them nicknames, not necessarily complimentary. I wonder if they notice me and whether they have assigned me a nickname too (that sour looking bloke who's started travelling every day instead of once a week).

The reading material for the past week has been the Hebrew translation of "Outliers" by Malcolm Gladwell. Normally I wouldn't read a book in Hebrew which was originally written in English; I was given the book at Pesach by my occupational psychologist and it was too complicated to arrange to swap the book for the original version. Probably I lost some of the wit and inferences present in the original, but I'm fairly sure that I got the gist of the book. It was a bit repetitive, and some of the material is downright wrong (the Beatles could not have racked up 10,000 playing hours before they became famous), but the pros outweigh the cons. The basic thrust of the book is that no one succeeds on their own; everybody needs a bit of luck and opportunity. Sometimes one has to be born in the correct month of the year.

The book starts with an analysis of junior Canadian ice hockey players; Gladwell points out that one stands a much better chance of being picked for a junior hockey team and then be trained if one is born in the first three months of the year (Jan-Mar). When comparing eight year old children, there is a big physical difference between an eight years and eleven months old child as opposed to an eight years and one month old child. 

I was such a child who theoretically suffered from being born in the wrong month. My birthday is in August, and the British school year started (maybe still does) in September, so I was always one of the youngest children in my class. I certainly don't remember any problems about this whilst in junior school (upto age 11), but then we didn't have competitive sports there. The problem was recognised at my grammar school: during the winter and spring terms, when we played rugby, everyone was classified as under-12 (this was the first year). But when the summer term arrived and we played cricket, suddenly most of the children were in the under-13 age group whereas I was still in the under-12s. There wasn't an under-12s cricket team (as there were so few of us), but I did take part in an swimming competition as an under-12 with few competitors. The following year, we were all under-13s, but when the cricket season arrived, again most children were now under-14s whereas I was still under-13 and played with children in their first year. Thus theoretically I was compensated for having been born in August.

Academically, all of the above was irrelevant. As it happened, 40% of the students skipped a year between what would have been their second and fifth years (ie we took our 0-levels after four years whereas 60% of the students took their 0-levels after five years). As a result, when I was in the 6th form, I was with students who were nearly two years older than me; I remember that in my final year, one of the boys in my class used to drive a car to school, whereas I had barely cleared my sixteenth birthday.

I also left school at sixteen, albeit at sixteen and ten or eleven months. The uncertainty arises because it's not clear exactly when I finished school; during the final term we had A-level exams, which meant that we had no lessons and were at home revising. To complicate matters, my parents moved from Bristol to Cardiff before I finished the exams, so once I had to catch the train from Cardiff to Bristol in order to "sit" an exam (if I remember correctly, it was a practical exam in Chemistry, so no one sat). I know that I came to the 'final assembly', which would have been in July 1973, but again I came on the train and I did not come in school uniform.

Sunday, April 11, 2010

Surprised and pleased

I heard some whispering at college on Friday about exam results but thought that it was too early: the results take two months to arrive and only one month has passed. Over the weekend, I completely forgot about this, but managed to remember this afternoon. I logged into the website that lists results and ...

Punch the sky! Bring out the champagne! Not only did I pass my exam in Organisational Behaviour, but I also achieved the reasonable mark of 66%, much better than I had expected. So I am both surprised and pleased!

Driving lessons

I spent one of the afternoons when I ill with the flu watching a rather quirky British film called "Driving Lessons". I thought the film a bit odd when I had an elevated temperature, and watching it a second time when feeling more normal only confirmed my original suspicions. Maybe the best thing about the film is that includes a Richard Thompson song in the soundtrack ("One door opens") and an obligatory (these days) Nick Drake song (part of "Pink Moon"). 

Thinking about the film later, many questions popped into my mind, mainly about the characters' motivations:
  • How could Ben (Rupert Grint) be so gauche at the age of 17?
  • Why was Laura Linney - an American - cast in such a quintessential British film? How could her character - a vicar's wife - have no qualms about committing adultery with the parish's junior priest? And even worse, how could she do it whilst leaving her son in the car outside, whilst ostensibly giving him an eponymous driving lesson?
  • When was Evie (Julie Walters giving a fantastic performance) lying and when was she telling the truth? Was she really a Dame? Was she really suffering from cancer (presumably not, as she denied that one herself)? How did she manage for money? When she and Ben went camping, Ben had to pay for the campsite. The next minute, they have driven from somewhere (presumably near London) to Edinburgh, showing no signs of tiredness. Who paid for the petrol on the way? If presumably they had money, so why did Evie pawn a ring in order to give Ben money "to buy a clean shirt". How did she pay the hotel bill for her drinks and Ben's room?
  • What was Bryony's motivation in seducing Ben? Did she sleep with every boy that she met? The entire Bryony episode seems in retrospect designed solely to give Ben a reason not to accompany Evie to the poetry reading.
  • How could Sarah be so stupid to say what she did to Ben at the end of the film? Every son wants to hear about his mother's infidelity...... I thought that maybe she would empathise with him, but she appeared to be still under his mother's spell.
I find my reaction to this film interesting because I was able to find so many things unexplicable within the film, and yet I enjoyed it. I later watched a film called 'Smother' (with Diane Keaton) which coincidentally has a similar theme, about a son trying to build his own life apart from a domineering mother. No doubt this film had a budget much bigger than that of 'Driving lessons', and in my opinion it was much worse, by about the same factor. But why? Because it's an American film? Because it got on my nerves? 

British films tend to be much more realistic, featuring people who could easily have lived next door to me when I lived in Britain (at this moment, I will note that Dr David Owen, at the time Britain's Foreign Secretary, lived about three houses away from me when I lived in London). American films tend to populate some kind of fantasy world, and one could never imagine Diane Keaton living next door (as much I would like to) or even her son, Noah.

Saturday, April 10, 2010

Speaking the statements

My last blog, from a few days ago, hinted that the next entry (ie this one) would be about programming. Shortly after writing those lines, I went to bed and woke up the next morning feeling extremely weird. It turns out that I had a temperature of 38.5 degrees, which is why my head felt like it was full of cotton wool. Fortunately, it was only a mild case of flu, but it had the effect of taking me out of the loop for a few days. Wonderdog was giving me strange looks all this time, implying that I could take her for a ramble in the fields instead of lying around and doing nothing, but I think I'm back on the case now.

As I have written before, my occupational psychologist's flagship exam consists of 400 statements: each person has to mark whether they agree or not with the statements (eg "I usually feel nervous and ill at ease at a formal dance or party", "I have at one time or another in my life tried my hand at writing poetry"). The theory behind the exam is that each statement belongs to one or more scales, and dis/agreeing with a statement either increases or decreases one's affiliation to that scale. From these scales are built one aspect of a person's psychological profile.

Completing this exam takes about 40 minutes, making it harder than one might expect. The two statements which I quoted above make it fairly easy to decide whether to agree or not, but some are more complicated, generally revolving around moral issues. Some tend to be ambiguous, so it's difficult to decide if one agrees or not. Anyway, the psychologist suggested that people with learning disabilities might have difficulty in reading and understanding the statements, let alone answering them. Thus was born the idea of the exam speaking the statements.

Well, of course, the exam itself, being a computer program, can't talk (although 20 years ago I spent much time with a blind person, a speech synthesizer and text-to-speech software which was years ahead of its time). So in January I recorded over two evenings a well spoken lady reading each of the 400 statements. Since then, I have been editing those recordings into a series of 400 wave files, each file containing one statement being spoken. This is a very tedious process, which is why it took me so long to do. During the Passover holiday, I decided that I would edit one big file (5 minutes, about 35 statements) a day; I actually managed to keep to this schedule and finished creating all the files.

Then came the fun of getting these files into a Delphi program. This is actually a lot easier than it sounds. First, I needed to declare a resource file listing all of the wave files and their statement numbers. This is a text file (rc) which looks like this:
q1 WAVE q1.wav
q10 WAVE q10.wav
q101 WAVE q101.wav
q102 WAVE q102.wav
q103 WAVE q103.wav
q104 WAVE q104.wav
q105 WAVE q105.wav
There are 403 similar lines. This text file is then passed to the resource compiler, which produces a compiled resource file (res). As there are many resources used and they're all large, this file is about 40 megabytes in size (whilst today this may be considered small, I recall that the first hard drive I ever bought for my XT-compatible computer in the late 80s had a 20MB capacity!). Linking this file into the Delphi executable is trivial; accessing each wave file within the resource is also fairly simple, with the use of the following procedure:

Procedure TMivhan.PlaySound (n: integer);
var
 hFind, hRes: THandle;
 song: pchar;
 question: string[6];

begin
 question:= 'q' + inttostr (n) + #0;
 hFind:= FindResource (HInstance, @question[1], 'Wave');
 if hFind <> 0 then
  begin
   hRes:= LoadResource (hInstance, hFind);
   if hRes <> 0 then
    begin
     song:= LockResource (hRes);
     if assigned (song)
      then SndPlaySound (song, sndflags);
     unlockResource (hres)
    end;
   FreeResource (hFind)
  end
end;
The procedure is called with a statement number (eg 1). The first line in the procedure creates a string variable, prefixing the statement number with 'q', so that the string will match the name of the wave file in the resource file (that's the "q1" in the line "q1 WAVE q1.wav"). The trailing zero in the string is because the string has to be passed to an internal Windows function (FindResource), and this needs a zero terminated string.  "@question[1]" is a zero terminated string which is also lacking the length byte at the beginning of the Delphi string - this is a time honoured method of converting Delphi strings to C strings, as needed by Windows. The rest of the procedure deals with extracting the required resource from the executable file and 'playing' it. This is very much black box code and needn't be explained (and in case one asks, I took this code from an excellent article on the subject.

A note about the parameters passed to the Windows procedure SndPlaySound: the first parameter is a pointer to the wave file, and the second parameter controls how the sound should be played. Earlier in the program, the global variable 'sndflags' was set to the value 'snd_Async or snd_Memory': play the sound asynchronously from memory. This is generally the way that one wants the sounds to be played, so why did I use a variable instead of using the constant values each time, as the article does?

The answer has nothing to do with my procedure and everything to do with the program. At the beginning, the instructions how to use the program are read out, via this procedure. I discovered that sounding these instructions asynchronously and then sounding the first statement displayed asynchronously caused the instructions not to be 'sounded' at all. Should the procedure be called whilst a wave file is being played asynchronously, the second wave file will cause the termination of the first wave file. I thus caused the instructions to be 'sounded' synchronously - the user can't do anything with the program during this time - and only afterwards are the statements 'sounded' asynchronously. Instead of putting a conditional statement in the PlaySound procedure to define the flags, I used a global variable which is set to 'snd_Sync or snd_Memory' before reading the instructions, and then permanently to 'snd_Async or snd_Memory'.

Monday, April 05, 2010

Holiday

I've been on holiday for the past week, spending all the time at home. Maybe it looks like I've been doing nothing, but actually I've made good use of my time. I've been reading (and completing) a book a day, I've been doing some good programming (more about that next time) and I've been cooking every day, trying out some new recipes.

Here's a recipe for what has been termed "Chicken ratatouille" (if you want to impress your friends, note that 'ratatouille' contains all five vowels, although not in the correct order. 'Facetious' is a shorter word which contains all five vowels in the correct order). This is a very simple dish to make, especially for those who feel challenged in the kitchen. One dices vegetables, such as onions, red and yellow peppers, courgettes, sweet potato and potato, and spreads the mixed, diced vegetables into an glass oven dish. I put greaseproof paper into the dish first and poured the vegetables onto this, but I doubt that this is essential. One then drizzles olive oil onto the vegetables. On top of the vegetables one puts slices of chicken breast (the bigger the better) and these are also drizzled with olive oil. Into the oven for about 45 minutes at 180 degrees Centigrade. I probably turned over the chicken breasts after about half an hour and maybe even stirred the vegetables a little. 

That's all! The family were very pleased with the dish, although they thought that they were eating fish at first (that's before tasting)! The chicken breasts shriveled somewhat whilst cooking, which is why they should be fairly large prior to cooking.