Tuesday, 22 November 2011

Functional Programming in Haskell

Wow, I have submitted my assignment for the Functional Programming in Haskell course.

I am really tired.

The period allotted to the assignment is six weeks. I have put in over 60 hours and taken two days leave. Yeah, I know, they said about 25 hours should do it, but it takes as long as it takes.

I have known that Functional Programming was the missing element of my experience for a long while. I asked for and was given this course by work - yay work! It is an expensive course and I could not have afforded the 7 days holiday it would have taken without their support.

These seven weeks started much earlier: This year I have written some R code, which is a sorta functional language. I tried to do some prestudy: I bought the course book and read chapter 1 twice (once on holiday). I read through the prestudy material. Very little of this cohered, but it was just enough to enable me to keep my balance during the course.

The course was great! The lecturer served on the Haskell committee. The SoftEng department at Oxford is smart in every sense. The lunches at Kellogg College were great. The other students were really bright. I just about kept up, contributing more than most and not being wrong as often as some. On Thursday I caught myself gurning during the lecture: it was all so elegant!

Immediately the course ended, I had hopes of Friday afternoon but it was not until the evening, I started organising myself. Reading the questions repeatedly, I tried chipping away at them.

Things soon went pretty horribly wrong: I could not be sure I understood the meaning of the questions, what level of completeness was expected or what shape the answers were meant to have. The assignment centred upon producers, which we had hardly touched upon and which did not feature in the course documents, consumers being the main focus. So I continued to erect a structure of yak hair: we would need a test harness, Latex processing, bibliography.

I did manage to get an answer, thought it was right, was elated. Read in Bird that my answer was wrong (though, infuriatingly the answer was 'left as an exercise'), was pretty disconsolate. Researched further and discovered that the answer was that the number of trees that can be generated from n leaves is the Catalan number for n-1.

Managed to write the generator and tests. Yay!

In between the ups and downs I had managed to pick off list, length etc.

Managed to do some pretty solid work around higher order functions, though was running out of time. I managed to finish Part I, but now only had a week for Part II and Part III.

Part II did fall out pretty easily, but it was still probably 12 hours. The tests were in place when I started to embellish with nice-to-haves, which helped.

Part II

If all tests pass then the page is written to the file system.
output :: IO ()
output = do
writeFile "fpr.xhtml" (charSequToString (showXHTMLPage testPage))
The resulting xhtml  file can be seen at [output] and is shown valid at [W3C Validator].

Part III (the essay - mine ended up as something like Discuss the Influence of FP on Java) got significantly squeezed, as I kept returning to polish Part II.

At 11.30pm I spotted a mistake in Part I - in the length function and its test.

Submitted the thing at 12.40am. Have printed it out but resisted the temptation to read it. Am feeling like a zombie.

After the deadline had passed I added a missing line break to the output, just to show that this is for me, not just for the marker.

Monday, 7 November 2011

Specify InnoDb as default table type in JDBC

One of the recurrent gotchas with MySQL is that the default table type is MyISAM, whereas you almost definitely need InnoDB, if you want transactions, indexing or anything else that would make MySQL a useful database.

Set default table type for all databases

In /etc/mysql/my.cnf add: [mysqld]
default-storage-engine=InnoDB
But this requires that you have root access to the server and that you want all tables to use InnoDB.

Specify default on JDBC url

database.url=jdbc\:mysql\://localhost\:3306/chassis_studies?autoReconnect=true&sessionVariables=storage_engine=InnoDB You could of course use a real database!

Friday, 14 October 2011

cvs to github

Following How to export revision history from mercurial or git to cvs?

On hanuman

I created an id file git_authors mapping cvs ids to github name, email format for all contributors:
timp=Tim Pizey<timp@paneris.org>
then create a repository on github (melati in this example, I already have uploaded my ssh public key for this machine)
git cvsimport -d /usr/cvsroot -C melati -r cvs -k -A ../../git_authors melati
cd melati
echo A jdbc to java object relational mapping system. 1999-2011 > README.txt
git add README.txt
git commit -m "Initial" README.txt
git remote add origin git@github.com:timp21337/melati.git
git push -u origin master
See https://github.com/timp21337/melati.

Sunday, 9 October 2011

Installing lhs2TeX on Ubuntu

lhs2TeX is a processor for literate Haskell code whose output is laTeX. The following worked for me on Unbuntu 11.04, though this was not the path I travelled, that is I discovered that, for example, libghc6-zlib-dev was a prerequisite the hard way.
sudo apt-get install ghc
sudo apt-get install libghc6-zlib-dev
sudo apt-get install cabal-install
cabal update
cabal install cabal-install
sudo apt-get install texlive
cabal install lhs2tex
logout  or 
export PATH=$PATH:~/.cabal/bin
lhs2TeX -o t.tex t.lhs 
pdflatex t.tex

Wednesday, 5 October 2011

Haskell - parse error in pattern: n + 1

Should you get the following error from Haskell
Parse error in pattern: n + 1
this maybe because you are using the n+1 pattern, which is no longer included by default eg
> power :: Double -> Int -> Double
> power x 0         = 1
> power x (n + 1)   = x * power x n
the fix is to include
> {-# LANGUAGE NPlusKPatterns #-}
Hope this helps.

Wednesday, 17 August 2011

Proxying from apache2 to application server (eg tomcat, jetty)

It is often convenient to proxy an application server, such as Jetty or Tomcat, as these tend to be mounted on ports other than port 80. The following steps worked in an Ubuntu setup.

Enable mod_proxy
a2enmod proxy
a2enmod proxy_http

Edit sites-enabled/default to add your proxying rule, eg:
ProxyPass /alfresco http://localhost:8080/alfresco
ProxyPassReverse /alfresco http://localhost:8080/alfresco
<Proxy http://localhost:8080/alfresco*>
Order deny,allow
Allow from all
</Proxy>

/etc/init.d/apache2 restart

You should now see your application server content on your default url ie http://localhost/alfresco will contain the same content as
http://localhost:8080/alfresco.

Tuesday, 16 August 2011

Alfresco setup

Alfresco is AMAZING - it does not follow the Unix way, or even the Java way, but rather the bloatware way. This is a very bad smell (as is their constant pimping of the paid version).

Alfresco comes with ITS OWN COPY of Java, MySQL and Tomcat.
As I have copies of all these systems on my own box I have chosen to insulate my system and to play fair with Alfreco, and install on a fresh Ubuntu VirtualBox VM, with nothing other than OpenSSH installed.

VM Setup: I also enabled the VirtualBox Guest Additions, on my MacBookPro host, and found that the default bidirectional Copy/Paste functionality did not work.
Stop the VM and change Settings>>Advanced Shared Clipboards to Host To Guest

This vm (called alfresco) is on a virtual network, setup with help from Mr Sysadmin:

Add a Host only network in virtualbox >> preferences >> network

Add an adapter2 to vm >> settings >> network
attached to Host-only adapter

Add to /etc/hosts on host machine
192.168.56.10 alfresco

On vm add to /etc/network/interfaces
auto eth1
iface eth1 inet static
        address 192.168.56.10
        netmask 255.255.255.0
/etc/init.d/networking restart

Install alfresco (NOTE The x32 versions also works)
wget http://dl.alfresco.com/release/community/build-3370/alfresco-community-3.4.d-installer-linux-x64.bin
sudo su
chmod u+x alfresco-community-3.4.d-installer-linux-x64.bin
./alfresco-community-3.4.d-installer-linux-x64.bin 

Take defaults, specify a password for mysql root and Alfresco admin.
/etc/init.d/alfresco start


Now the url http://alfresco:8080/alfresco/ should work.