<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5889809568931888012</id><updated>2012-02-15T23:03:01.236-08:00</updated><category term='eee RunCore'/><category term='catalyst'/><category term='perl ukraine'/><category term='YAPC::EU'/><category term='eee'/><category term='Bootstrap'/><category term='ironman'/><category term='perl'/><title type='text'>dragonstaff</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-5414958973480232441</id><published>2011-05-03T00:34:00.000-07:00</published><updated>2011-05-03T00:37:23.798-07:00</updated><title type='text'>3 things I'd change in Perl 5</title><content type='html'>I replied to &lt;a href="http://blogs.perl.org/users/ovid/2011/04/ch-ch-ch-ch-changes.html"&gt;Ovid's question&lt;/a&gt; on blogs.perl.org about what three things you would change in Perl 5 language:&lt;div&gt;&lt;a href="http://blogs.perl.org/users/ovid/2011/04/ch-ch-ch-ch-changes.html#comment-22741"&gt;http://blogs.perl.org/users/ovid/2011/04/ch-ch-ch-ch-changes.html#comment-22741&lt;/a&gt;&lt;/div&gt;&lt;div&gt;In summary, proper OO support, better deployment and making perl5 parsable without using the perl5 compiler that is written in C and makes it hard to virtualise perl support in a sandbox.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Regards, Peter&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-5414958973480232441?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/5414958973480232441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=5414958973480232441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/5414958973480232441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/5414958973480232441'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2011/05/3-things-id-change-in-perl-5.html' title='3 things I&apos;d change in Perl 5'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-2693892964950752228</id><published>2009-09-21T02:59:00.000-07:00</published><updated>2009-09-21T04:21:12.254-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eee RunCore'/><title type='text'>Eee BIOS upgrade</title><content type='html'>I was getting occasional errors from my RunCore SSD where the partition when read only and would not write and I needed to update my Eee PC 1000 BIOS.&lt;div&gt;This is a bit trickier than you might think as you need a FAT-16 formatted USB stick of less than 2GB, otherwise the Eee updater gives you error messages saying it cannot read 1000.ROM or that it is in the wrong format.&lt;/div&gt;&lt;div&gt;Anyway, to save time for anyone else who is searching how to do this, see &lt;a href="http://wiki.eeeuser.com/howto:updatebios"&gt;http://wiki.eeeuser.com/howto:updatebios&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;From Windows, you can right click a mounted USB and choose Format / FAT to get the correct FAT-16 format, then download the latest Eee 1000 BIOS .ZIP file from the Asus site (mine was 1000-ASUS-1003.zip), unzip it and rename the 1000-asus-1003.rom file to 1000.ROM before copying to the USB stick. Put it in your Eee then power on with ALT-F2 held down, making sure you are running on mains power and have a fully charged battery. It takes about 5 minutes to flash update the BIOS ROM.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-2693892964950752228?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/2693892964950752228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=2693892964950752228' title='38 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/2693892964950752228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/2693892964950752228'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2009/09/eee-bios-upgrade.html' title='Eee BIOS upgrade'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>38</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-2480623936334123826</id><published>2009-08-16T13:38:00.000-07:00</published><updated>2009-08-16T14:14:14.642-07:00</updated><title type='text'>Make your Asus Eee 900/1000 run 4x faster</title><content type='html'>Previously, I described &lt;a href="http://dragonstaff.blogspot.com/2009_01_01_archive.html"&gt;how to set up an Asus Eee 1000 to run Eeebuntu&lt;/a&gt; and described the 8GB / 32GB Solid State Disk setup it has. What I didn't realise then is that the 32GB SSD provided was much slower than the 8GB SSD, and that the 8GB SSD wasn't particularly fast either.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can now purchase a much faster "Runcore" drop-in replacement for the 32GB SSD.&lt;/div&gt;&lt;div&gt;&lt;div&gt;It is 4-6x faster for read/write and makes apps that were sluggish before, such as Firefox, respond quickly. Boot and shutdown time and noticeably faster too.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Runcore is sized at either 64GB or 128GB. I went for the 64GB option (enough for me!)&lt;/div&gt;&lt;div&gt;The full title for Googling is RunCore 64GB PATA Mini PCI-e PCIe SSD for ASUS EEE PC 901 and 1000. Phew. &lt;/div&gt;&lt;div&gt;In the US you can buy it from &lt;a href="http://www.mydigitaldiscount.com/SPD/runcore-64gb-pata-mini-pci-e-pcie-ssd-for-asus-eee-pc-901-and-1000---in-stock-runcore-64gb-pata-mini-pci-e-pcie-ssd-for-asus-eee-pc-901-and-1000--800008DB-1224129741.jsp"&gt;mydigitaldiscount.com&lt;/a&gt; ($220) and in the UK I bought mine from &lt;a href="http://www.memoryc.com/storage/solidstatedisk/64gbruncorepataminipcieasuseee900a9011000.html"&gt;memoryc.com&lt;/a&gt; for £160 inc. VAT. Check out the comments on there from other happy customers :-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Installation is simple. Backup all your data to a USB stick (usual warnings about proceeding at your own risk). Shutdown and unplug your Eee PC. Turn it over. On the back there is a panel (red rectangle below) retained by two precision screws (red circles). One of these on mine was hidden under a silver "EeePC" sticker which I had to peel up for access. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_nSfTMUY96FY/Soh0eqwnO5I/AAAAAAAAADo/JBocsUIvawI/s1600-h/2009_0817dad-blog0035.JPG"&gt;&lt;img src="http://4.bp.blogspot.com/_nSfTMUY96FY/Soh0eqwnO5I/AAAAAAAAADo/JBocsUIvawI/s320/2009_0817dad-blog0035.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5370670625862400914" style="cursor: pointer; width: 320px; height: 203px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unscrew these using the (provided) precision screwdriver and lift off the panel. You can then remove two screws to release the existing 32GB memory card. It is simple to push in the replacement one and screw it down. Replace the panel and screw that down. Here's my old Asus 32GB card in the box the RunCore card came in from memoryc.com:&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_nSfTMUY96FY/Soh02fwXfVI/AAAAAAAAADw/XjCH92fMUtA/s1600-h/2009_0817dad-blog0031.JPG"&gt;&lt;img src="http://3.bp.blogspot.com/_nSfTMUY96FY/Soh02fwXfVI/AAAAAAAAADw/XjCH92fMUtA/s320/2009_0817dad-blog0031.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5370671035225439570" style="cursor: pointer; width: 320px; height: 270px; " /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now power back up and on the BIOS boot screen press F2. Go to Advanced, IDE Configuration and you should see [RunCore  64G-C  SSD] as the new drive.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What I did was install Eeebuntu 3.0.1 (Ubuntu 9.04) to the 64GB RunCore SSD (format it and use 100% of space for root / partition) and use the Asus 8GB SSD as the Linux swap space (select manual configuration at install time to be able to do this). After that I restored my user files from the backup.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Works like a charm!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-2480623936334123826?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/2480623936334123826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=2480623936334123826' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/2480623936334123826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/2480623936334123826'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2009/08/make-your-asus-eee-9001000-run-4x.html' title='Make your Asus Eee 900/1000 run 4x faster'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_nSfTMUY96FY/Soh0eqwnO5I/AAAAAAAAADo/JBocsUIvawI/s72-c/2009_0817dad-blog0035.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-4219701170788585426</id><published>2009-08-16T13:13:00.000-07:00</published><updated>2009-08-23T05:19:55.424-07:00</updated><title type='text'>Asus Eee 1000 using Ubuntu 9 Jaunty with INQ1 Phone as a Bluetooth Modem</title><content type='html'>This article follows on from my &lt;a href="http://dragonstaff.blogspot.com/2009/01/asus-eee-1000-setup-with-eeebuntu-linux.html"&gt;earlier blog post&lt;/a&gt; on how to install Eeebuntu (Ubuntu 8.10 Intrepid) on an Asus Eee 1000 and use it with an INQ1 phone as a bluetooth modem.&lt;div&gt;I have reinstalled with &lt;a href="http://www.eeebuntu.org/index.php?page=download"&gt;Eeebuntu 3.0.1 NBR&lt;/a&gt; (Ubuntu 9.04 Jaunty) and it's a big improvement. It now comes with EeePC Tray working right out of the box and you can skip most of the setup I gave previously. There are a couple of tricky points and the procedure for getting an INQ1 phone to work as a bluetooth modem is slightly different (and easier) and I outline these below.&lt;div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Install Eeebuntu&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First, install Eeebuntu 3.0.1 NBR onto a USB stick and then onto your Eee 1000 using the same approach as described in my earlier blog post. Run Administration / Update Manager and make sure you have the latest updates installed.&lt;br /&gt;&lt;br /&gt;I found the latest acpi utilities were showing up as grey on the Update Manager (it ends up with an interim version that doesn't handle the screen mode switching properly from the EeeControl tray icon). There was also some debris from the install. To fix this do:&lt;br /&gt;$ sudo -s&lt;br /&gt;# apt-get autoremove&lt;br /&gt;# apt-get install eeepc-acpi-utilities&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Install Dropbox&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://getdropbox.com"&gt;Dropbox&lt;/a&gt; package available under Administration / Synaptic does not work with Eeebuntu 3.0.1. When I tried that I got an error:&lt;br /&gt;&lt;br /&gt;The program 'dropbox' received an X Window System error.&lt;br /&gt;This probably reflects a bug in the program.&lt;br /&gt;The error was 'BadIDChoice (invalid resource ID chosen for this connection)'.&lt;br /&gt;  (Details: serial 722 error_code 14 request_code 53 minor_code 0)&lt;br /&gt;&lt;br /&gt;There is a fix described &lt;a href="http://bbs.archlinux.org/viewtopic.php?id=55091"&gt;here&lt;/a&gt;.&lt;br /&gt;To make it work I downloaded nautilus-dropbox_0.6.1_i386_ubuntu_9.04.deb and http://dl.getdropbox.com/u/17/dropbox-lnx.x86-0.6.510.tar.gz then installed the patched version manually with:&lt;br /&gt;&lt;br /&gt;$ sudo dpkg -i nautilus-dropbox_0.6.1_i386_ubuntu_9.04.deb&lt;br /&gt;$ cd; rm -fr .dropbox-dist&lt;br /&gt;$ tar xfz dropbox-lnx.x86-0.6.510.tar.gz&lt;br /&gt;$ .dropbox-dist/dropbox --sync&lt;br /&gt;(enter login details)&lt;br /&gt;&lt;br /&gt;On a restart, Dropbox was integrated and working with Eeebuntu nautilus.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Install Blueman&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To install &lt;a href="http://blueman-project.org/"&gt;Blueman&lt;/a&gt; you need to add their repository. Start a terminal session and type:&lt;br /&gt;$ gpg --keyserver=wwwkeys.eu.pgp.net --recv-keys 6B15AB91951DC1E2&lt;br /&gt;$ gpg --export --armor 6B15AB91951DC1E2 | sudo apt-key add -&lt;br /&gt;&lt;br /&gt;Then go to Administration / Software Sources, click the Third Party Software tab and click "Add...". Where it says "APT line:" type in on one line:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;font-family:-webkit-sans-serif;font-size:13;"  &gt;&lt;pre id="sources-list-entries" class="wrap"   style="border: 1px solid gray; margin: 1em 0px; padding: 0.3em; font-style: normal; font-variant: normal; font-weight: normal; line-height: normal; font-size-adjust: none; font-stretch: normal; white-space: pre-wrap; float: left;font-family:monospace;font-size:120%;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;deb &lt;/span&gt;&lt;a href="http://ppa.launchpad.net/blueman/ppa/ubuntu" style="outline-style: none; color: rgb(0, 51, 170); text-decoration: none;"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;http://ppa.launchpad.net/blueman/ppa/ubuntu&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; &lt;/span&gt;&lt;span id="series-deb"&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt;jaunty&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:medium;"&gt; main&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Click 'Add Source', click Close, click Reload. Close the window.&lt;br /&gt;Run Administration / Update Manager and apply updates and restart.&lt;br /&gt;Run Administration / Synaptic Package Manager and search for and install "blueman".&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Note - if you follow the instructions I gave in my previous blog for Ubuntu 8.10, you will get an older version of Blueman that gives a Python error complaining it cannot find 'Constants.py'. In that case, do an 'apt-get remove blueman' then follow the instructions above.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On the main menu select Preferences / Bluetooth Manager. If it prompts you to start Bluetooth, say Yes. Now do a Search and bond and trust with your INQ1. As mentioned in the previous blog, if you cannot see your phone check you have turned on bluetooth networking on the INQ1 phone:&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(85, 85, 68); line-height: 18px;font-family:tahoma;font-size:13;"  &gt;&lt;p style="line-height: 18px; margin-top: 5px; margin-bottom: 0cm;"&gt;menu Settings / Bluetooth = Switch - on ; Visibility - show your phone&lt;/p&gt;&lt;p style="line-height: 18px; margin-top: 5px; margin-bottom: 0cm;"&gt;menu Settings / Advanced / Connectivity / Modem Connect - via Bluetooth&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In Blueman you should see your phone's name below the button bar. Click on it, then click the Setup button at the top. Choose Dialup Networking (DUN) and click Forward. It will prompt you to add a profile type. dropbox-lnx.x86-0.6.510.tar.gzSelect "3 (Handsets)". It should then connect to your phone and report a working connection. Try running menu Internet / Firefox and browsing to a website to test it.&lt;br /&gt;&lt;br /&gt;If I find any more issues, I will add them to this blog.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-4219701170788585426?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/4219701170788585426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=4219701170788585426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/4219701170788585426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/4219701170788585426'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2009/08/asus-eee-1000-using-ubunu-9-jaunty-with.html' title='Asus Eee 1000 using Ubuntu 9 Jaunty with INQ1 Phone as a Bluetooth Modem'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-3665477439152466877</id><published>2009-08-06T02:49:00.001-07:00</published><updated>2009-08-06T03:43:00.988-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='YAPC::EU'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='ironman'/><title type='text'>YAPC::EU::2009 Lisbon</title><content type='html'>I'm back from the &lt;a href="http://yapceurope2009.org/ye2009/"&gt;European Perl conference in Lisbon&lt;/a&gt;.&lt;div&gt;  &lt;/div&gt;&lt;div&gt;&lt;div&gt;Man, that was fun. Lisboa is a great city, with plenty of &lt;a href="http://www.strawberryworld-lisbon.com/lisbon/places/castelo-sao-jorge.html"&gt;tourist sights&lt;/a&gt; to see before the conference itself. I was staying in &lt;a href="http://www.hotelalif.com/"&gt;Hotel Alif&lt;/a&gt;, the main conference hotel, along with many other Perlmongers. The metro system was good and easy to use (wish I could say the same about London ;-) and it was simple getting to the &lt;a href="http://yapceurope2009.org/ye2009/maps.html"&gt;conference venue&lt;/a&gt; at the Faculty of Sciences, Lisbon University.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The standard of talks this year was very high and I attended more than usual. In particular, I wanted to hear more about &lt;a href="http://www.iinteractive.com/moose/"&gt;Moose&lt;/a&gt; the &lt;i&gt;meta-object protocol based extension to Perl 5&lt;/i&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.iinteractive.com/moose/"&gt;Moose&lt;/a&gt; in Perl 5.10 brings in the &lt;b&gt;best language features&lt;/b&gt; of Perl 6, Common Lisp, Smalltalk, Java, Ruby etc. while still being compatible with older Perl 5 code such as &lt;a href="http://search.cpan.org/"&gt;the huge library at CPAN&lt;/a&gt;. &lt;/div&gt;&lt;div&gt;It lets you handle in a simple, powerful and intuitive way:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;classes&lt;/li&gt;&lt;li&gt;data members and accessors&lt;/li&gt;&lt;li&gt;method parameter signatures and type-checking (no more @_ unrolling)&lt;/li&gt;&lt;li&gt;roles&lt;/li&gt;&lt;li&gt;traits&lt;/li&gt;&lt;li&gt;mix-ins&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Giving shorter, easier-to-read and more expressive code that is much easier to maintain.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Moose's core features are now &lt;b&gt;stable and production-ready&lt;/b&gt; and any self-respecting Perl 5 programmer should consider switching to using it as soon as possible. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.bofh.org.uk/2009/05/27/perl-not-just-a-hobby-any-more"&gt;Piers Cawley&lt;/a&gt; told us about &lt;a href="http://yapceurope2009.org/ye2009/talk/1802"&gt;how he moved from Perl to Ruby then was lured back to Perl&lt;/a&gt; by the &lt;a href="http://www.catalyzed.org/2009/06/a-gentle-introduction-to-moose.html"&gt;cutting-edge language features&lt;/a&gt; that have been added to Perl 5. The joy of it was apparently enough to make him sing! Either that or is was the sight of beautiful teutonic youths ;-)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://blog.woobling.org/"&gt;Yuval Kogman&lt;/a&gt; filled in the details of &lt;a href="http://yapceurope2009.org/ye2009/talk/2096"&gt;using Moose&lt;/a&gt; and some MooseX modules and is running a long best practices Moose training session today in the post-conference training slot.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://perltraining.com.au/"&gt;Paul Fenwick&lt;/a&gt; of Perl Training Australia gave us a good run through of &lt;a href="http://yapceurope2009.org/ye2009/talk/2062"&gt;modern Perl programming&lt;/a&gt; using Moose and &lt;a href="http://search.cpan.org/perldoc?autobox"&gt;autobox&lt;/a&gt; with some interesting asides on &lt;a href="http://search.cpan.org/perldoc?autodie"&gt;autodie&lt;/a&gt;, &lt;a href="http://search.cpan.org/perldoc?PAR::Repository"&gt;PAR::Repository&lt;/a&gt; for automatic deployment and updating of applications, and application speed profiling using &lt;a href="http://search.cpan.org/perldoc?Devel::NYTProf"&gt;Devel::NYTProf&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;To get you started with Moose I can recommend the &lt;a href="http://www.lulu.com/content/paperback-book/moose/7406976"&gt;Moose book&lt;/a&gt; by Dave Rolsky and Stevan Little.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Well done to the organisers, and I look forward to next year's event in Pisa, Italy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-3665477439152466877?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/3665477439152466877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=3665477439152466877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/3665477439152466877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/3665477439152466877'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2009/08/yapceu2009-lisbon.html' title='YAPC::EU::2009 Lisbon'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-8752984206935023073</id><published>2009-05-13T03:01:00.000-07:00</published><updated>2009-05-15T05:36:43.950-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='ironman'/><title type='text'>Testing with Perl Catalyst</title><content type='html'>&lt;div&gt;One of the things I really like about &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt; is how easy it makes writing tests for your applications. There is &lt;a href="http://search.cpan.org/perldoc?Catalyst::Manual::Tutorial::Testing"&gt;documentation about testing in the Catalyst tutorial&lt;/a&gt; and a more generic &lt;a href="http://oreilly.com/catalog/9780596100926/"&gt;book on Perl Testing&lt;/a&gt;. Going into more detail, I suppose I would classify these tests at several levels: Model unit, Controller unit, Integration, End-To-End.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Firstly, &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;Model&lt;/a&gt; unit tests. The Model encapsulates business logic and access to data serialisation, typically via &lt;a href="http://search.cpan.org/perldoc?DBIx::Class"&gt;DBIx::Class&lt;/a&gt; Object-Relational Mapper to a database. Strictly speaking, these tests exist outside of Catalyst although you may need to pick up database access credentials from your Catalyst application configuration file (conf/myapp.yml or similar) using &lt;a href="http://search.cpan.org/perldoc?Config::JFDI"&gt;Config::JFDI&lt;/a&gt;. This replicates what &lt;a href="http://search.cpan.org/perldoc?Catalyst::Plugin::ConfigLoader"&gt;Catalyst::Plugin::ConfigLoader&lt;/a&gt; does but works outside Catalyst.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Usually, I'd expect to start off with tests named 00_setup_database.t and zz_teardown_database.t. These create a known database before unit testing and then tear it down after. You can use a utility like &lt;a href="http://search.cpan.org/perldoc?DBIx::Class::Fixtures"&gt;DBIx::Class::Fixtures&lt;/a&gt; to do this.&lt;/div&gt;&lt;div&gt;Then I'd have 10_schema.t (and 11_schema2.t if I am using more than one schema) to test that I can connect to a database schema, that the sources (tables) are as expected and that I can retrieve a sample datum.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'times new roman';"&gt;&lt;pre style="white-space: pre-wrap;"&gt;use Test::More tests =&gt; 4;  &lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;BEGIN { use_ok 'MyApp::Model::MyModel' }  &lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;BEGIN { use_ok 'MyApp::Schema' }   &lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;my $connect_info = MyApp::Model::MyModel-&gt;config-&gt;{connect_info};  &lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;diag "connecting schema2 to ".$connect_info-&gt;[0]."\n";  &lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;my $schema = MyApp::Schema-&gt;connect( @$connect_info );   &lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;my @sources = $schema-&gt;sources();  &lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;ok( scalar @sources &gt; 0, 'found schema sources :-  '.join(", ",@sources) );   &lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;my $cl;  &lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;ok($cl = $schema-&gt;resultset('Client')-&gt;find({ client_code =&gt; 'TEST01' }),&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;      'find client with code TEST01');  &lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;ok ($cl-&gt;name eq 'A Test Client', 'client name as expected');&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;To this I'd add 20_user.t, 21_client.t (and so on), one per business object. Often these directly relate to a database table, but sometimes they can be a virtual class and use several tables with tricky logic built in, for example to calculate matching availability of resources over time. With a DBIx::Class schema you can do this and hide the details of the implementation inside the class or other classes it calls using a chained recordset approach. But back in the unit test, you'd test the public interface each schema class is exposing. For example, create a client record, then check to make sure subsidiary records have been created in other tables. Once you obtain a DBIC $schema handle, as above, the rest is straightforward. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Secondly, &lt;a href="http://en.wikipedia.org/wiki/Model-view-controller"&gt;Controller&lt;/a&gt; unit tests. In the Catalyst world you use &lt;a href="http://search.cpan.org/perldoc?Catalyst::Test"&gt;Catalyst::Test&lt;/a&gt; to achieve this. It sets up a fake Catalyst context so you can test actions. The manual page and the tutorial above explain this clearly so I won't go into detail. You add a unit test for each public action URL to ensure it dispatches to handlers as expected.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;font-family:'times new roman';" &gt;&lt;pre style="white-space: pre-wrap;"&gt;use Test::More tests =&gt; 2; &lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;BEGIN { use_ok 'Catalyst::Test', 'MyApp' } &lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;ok( request('/web/login')-&gt;is_&lt;wbr&gt;success, 'Request should succeed' );&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Thirdly, Integration testing. By this I mean running through some typical business workflow scenarios. In effect, expressing the functional requirements and specification of the system in the form of unit tests that will exercise the system as a whole (database, controller, model code, subsidiary library code, view templates).&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For a web application (bear in mind Catalyst does not purely have to be used for writing web apps) you can use &lt;a href="http://search.cpan.org/perldoc?Test::WWW::Mechanize::Catalyst"&gt;Test::WWW::Mechanize::Catalyst&lt;/a&gt;. This sets up a fake HTTP request object so you can test a sequence of actions as if you were going through a web server. So you might login, retrieve a list of records, view the detail for one of them, update a record, then check the list of records reflects that. After the WWW::Mechanize tests you could then check the database manually to ensure the records are as expected from the system functional specification.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse;font-family:arial;" &gt;&lt;div&gt;&lt;span style="font-family:'times new roman';"&gt;&lt;pre style="white-space: pre-wrap;"&gt;u&lt;span class="Apple-style-span"  style="font-size:small;"&gt;se Test::More;   &lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;eval "use Test::WWW::Mechanize::Catalyst 'MyApp'";  &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;plan $@ ? ( skip_all =&gt; 'Test::WWW::Mechanize::&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;Catalyst required' )      &lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  : ( tests =&gt; 36 ); &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;ok( my $mech = Test::WWW::Mechanize::&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;Catalyst-&gt;new, 'Created mech object' );   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# logout screen redirects to login screen  &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;get_ok( '&lt;/span&gt;&lt;a href="http://localhost/web/logout" target="_blank" style="color: rgb(42, 93, 176);"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;http://localhost/web/logout&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;', 'logout' );  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;content_contains('Log on using', 'logout redirects to login screen'); &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;diag "check login authentication is required to access extranet screens";  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# turn off automatic redirect follow so we can check response code  &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;requests_redirectable([&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;]); &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# 1. check redirect code and location&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;get( '&lt;/span&gt;&lt;a href="http://localhost/web/extranet/list/booking" target="_blank" style="color: rgb(42, 93, 176);"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;http://localhost/web/&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;extranet/list/booking&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;' ); &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;is($mech-&gt;response-&gt;headers-&gt;{&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;status}, 302, 'unauthed user is redirected away from page requiring auth'); &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;like($mech-&gt;response-&gt;headers-&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;&gt;{location}, qw|/web/login/|, 'redirect is to login page');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# 2. check all protected paths &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span style="white-space: normal;font-family:'times new roman';" &gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;for (qw|     index     home     booking     |) {&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  my $path = '/web/extranet/'.$_;   &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  $mech-&gt;get( '&lt;/span&gt;&lt;a href="http://localhost/%27.$path" target="_blank" style="color: rgb(42, 93, 176);"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;http://localhost/'.$path&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;);   &lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;  is($mech-&gt;response-&gt;headers-&gt;{&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;status}, 302, 'unauth redirect for '.$path); } &lt;span class="Apple-style-span"  style="font-size:39;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# allow automatic redirect again  &lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;requests_redirectable([&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;qw/ GET HEAD POST /]); &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# 3. business workflow tests &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span style="white-space: normal;font-family:'times new roman';" &gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# get login screen  &lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;get_ok( '&lt;/span&gt;&lt;/span&gt;&lt;a href="http://localhost/web/login" target="_blank" style="color: rgb(42, 93, 176);"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;http://localhost/web/login&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;', 'get login' );  &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;content_contains('Log on using', 'login contains Log on using');  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# login&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;submit_form( fields =&gt; { username =&gt; 'cust', password =&gt; 'cust' } );  &lt;/span&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;# check logged in successfully  &lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;content_contains('&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;Welcome to the', 'successfully logged in screen');  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;diag "screen tests";  &lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;get_ok( '&lt;/span&gt;&lt;/span&gt;&lt;a href="http://localhost/web/extranet/home" target="_blank" style="color: rgb(42, 93, 176);"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;http://localhost/web/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;extranet/home&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;', 'get home' );  &lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;content_contains('&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;Welcome to the', 'home contains welcome'); &lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;get_ok( '&lt;/span&gt;&lt;/span&gt;&lt;a href="http://localhost/web/extranet/list/booking" target="_blank" style="color: rgb(42, 93, 176);"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;http://localhost/web/&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;extranet/list/booking&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;', 'list/booking' ); &lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;$mech-&gt;content_contains('&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style=""&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;wbr&gt;25843011', 'booking list contains booking 25843011');&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Having written a range of unit tests then use &lt;a href="http://search.cpan.org/perldoc?Devel::Cover"&gt;Devel::Cover&lt;/a&gt; and run them all to check how well you have covered your code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fourthly, End-To-End testing. This is using a set of Integration tests to exercise the whole system in use by feeding in data and user actions and then checking the output data and files to make sure they are consistent. In the past, I worked on a meter reading and billing system and as part of a major release one of the tests was a manual one to set up a fixture database then type a set of pre-determined meter readings into the system from real remote handsets communicating over a WAN, process some batch runs in the central server, perform a few edits from the central server Oracle screens, then generate output billing records. You would expect the financial totals to be in balance and for selected bills to reflect the combination of the meter readings over a time period. Most systems are not that complex but the principle is to use real kit and real life scenarios. You might use several versions and releases of real web browsers against a copy of your live environment on a staging server and check the resulting screens, any PDFs generated and the figures totals on your database.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's it for today. Happy testing!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Cheers, Peter&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-8752984206935023073?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/8752984206935023073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=8752984206935023073' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/8752984206935023073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/8752984206935023073'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2009/05/testing-with-perl-catalyst.html' title='Testing with Perl Catalyst'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-8444513132719545512</id><published>2009-05-01T23:22:00.000-07:00</published><updated>2009-05-01T23:59:48.903-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='ironman'/><title type='text'>Complex databases with DBIx::Class</title><content type='html'>One thing that is tricky is combining the use of an &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;Object-Relational Mapper&lt;/a&gt;, such as &lt;a href="http://search.cpan.org/perldoc?DBIx::Class"&gt;DBIx::Class&lt;/a&gt; or &lt;a href="http://search.cpan.org/perldoc?Rose::DB::Object"&gt;Rose::DB::Object&lt;/a&gt; with complex real world situations. Simple database queries are easy in SQL, but there's still a big gain from using an ORM to handle them as there are fewer lines of code and you can abstract away physical database changes to field names or relations without the calling code even knowing it has happened. Adding in complex joins and the use of database extensions inside &lt;a href="http://en.wikipedia.org/wiki/Database_trigger"&gt;triggers&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/Stored_procedure"&gt;stored procedures&lt;/a&gt; makes it difficult to get plain old SQL right, let alone in extra business methods to an ORM class that depend on the physical database structure and engine.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here is where some examples come in handy.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Matt Trout has written a useful talk on &lt;a href="http://www.shadowcat.co.uk/catalyst/talks/postgresql-WEST-2008/"&gt;how he implemented a combination of DBIx::Class ORM, custom queries and OO database extensions&lt;/a&gt; in a talk he gave to PostgreSQL WEST 2008 (note: requires &lt;a href="http://www.mozilla-europe.org/en/firefox/"&gt;Firefox&lt;/a&gt; to view).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt; Wiki MojoMojo implements a complex Entity-Relationship schema including hierarchical page nodes. It is well worth looking at the &lt;a href="http://search.cpan.org/dist/MojoMojo/"&gt;MojoMojo source code&lt;/a&gt; to see how it was done.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-8444513132719545512?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/8444513132719545512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=8444513132719545512' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/8444513132719545512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/8444513132719545512'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2009/05/complex-databases-with-dbixclass.html' title='Complex databases with DBIx::Class'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-7955627439290417326</id><published>2009-04-15T01:41:00.000-07:00</published><updated>2009-05-01T23:59:48.903-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='ironman'/><title type='text'>Catalyst Perl looking good</title><content type='html'>&lt;div&gt;&lt;div&gt;I have used Catalyst Perl to develop a number of sites such as recruitment extranets and shopping carts over the past 3 years. But how is it looking?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I would say:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;a href="http://www.catalystframework.org/"&gt;Catalys&lt;/a&gt;t and the database Object Relational Mapper (ORM) &lt;a href="http://search.cpan.org/dist/DBIx-Class/"&gt;DBIx::Class&lt;/a&gt; have really come of age.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Firstly, the ORM rocks. I was laughing to myself the other day at a conversation some Java programmers were having about using Hibernate and generating database accessor stubs. OMG, lots of extra lines of code you need to maintain and that can get out of date. And with an ActiveRecord style approach you don't get cool features that DBIx::Class has. To see why "Chained Result Sets are what make DBIC Great" check out jshirley's slideshow &lt;a href="http://www.slideshare.net/jshirley/demystifying-dbixclass"&gt;"Demystifying DBIx::Class"&lt;/a&gt;. &lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Then this week a colleague was asking about generating JSON from a Web &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REST&lt;/a&gt;-dispatching framework. He'd lashed together something with CGI::Application and Template::Toolkit. He could have just used the Catalyst plugin &lt;a href="http://search.cpan.org/perldoc?Catalyst::Controller::REST"&gt;Catalyst::Controller::REST&lt;/a&gt; and his job would have been done in a few lines of code. You put in a few action handlers that correspond to your REST verbs, e.g. &lt;span class="Apple-style-span" style="font-style: italic;"&gt;programme&lt;/span&gt; to handle a URI like &lt;span class="Apple-style-span" style="font-style: italic;"&gt;/programme/id/123/keywords,&lt;/span&gt;  and then the framework dispatches them and generates JSON (or XML or YAML...) for you automatically. The number of lines of code correspond to how maintainable an application is, right? That's a no-brainer of a win for you right there.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Catalyst has evolved to become a scalable, reliable product and is now being used to run the BBC's iPlayer 2 site. Marina Kalkanis comments on how &lt;a href="http://www.bbc.co.uk/blogs/bbcinternet/2008/12/iplayer_day_performance_tricks.html"&gt;the BBC uses Catalyst to serve 1000 hits per second&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To finish off with here are a couple of new Catalyst Perl sites&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="text-decoration: underline; color: rgb(85, 26, 139); -webkit-text-decorations-in-effect: underline; "&gt;&lt;a href="http://www.catalyzed.org/about.html"&gt;http://www.catalyzed.org/about.html&lt;/a&gt;&lt;/span&gt;&lt;div&gt;&lt;a href="http://catalyzed.ideascale.com/"&gt;http://catalyzed.ideascale.com/&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Enjoy :)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-7955627439290417326?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/7955627439290417326/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=7955627439290417326' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/7955627439290417326'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/7955627439290417326'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2009/04/catalyst-perl-looking-good.html' title='Catalyst Perl looking good'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-1634990572598245263</id><published>2009-01-30T17:21:00.000-08:00</published><updated>2009-05-01T23:59:28.218-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='eee'/><title type='text'></title><content type='html'>&lt;h1 class="western"&gt;Asus Eee 1000 Setup With Eeebuntu Linux and 3 INQ1 phone as a Bluetooth modem&lt;/h1&gt; &lt;p style="margin-bottom: 0cm;"&gt;I bought an &lt;a href="http://www.trustedreviews.com/notebooks/review/2008/07/09/Asus-Eee-PC-1000-40GB-SSD-Linux-Edition/p1"&gt;Asus Eee 1000 40GB SSD Linux netbook&lt;/a&gt; in December 2008 to use for software development on the move. This article describes how I set it up with Eeebuntu Linux as a development environment and configured it to use an &lt;a href="http://www.three.co.uk/Mobiles/INQ1"&gt;INQ1 mobile phone&lt;/a&gt; from three.co.uk as a Bluetooth broadband modem.&lt;/p&gt; &lt;h2 class="western"&gt;Why Three?&lt;/h2&gt; &lt;p style="margin-bottom: 0cm;"&gt;Three have the best 3G coverage in the UK and offer a cheap 18 month contract deal for phone and broadband access at £12 + £5 (for up to 5GB of data traffic) per month with a free INQ1 phone which you can use for bluetooth wireless broadband from an Eee. The INQ1 handles both 3G and HSDPA access and is an evolution of the 3 Skypephone, which you should also be able to use as a 3G modem following the instructions below.&lt;/p&gt; &lt;h2 class="western"&gt;Why Eee 1000?&lt;/h2&gt; &lt;p style="margin-bottom: 0cm;"&gt;The screen is big enough to watch movies, the battery lasts 8 hours (unlike an Acer Aspire, which was the other netbook I considered), its Atom processor is reasonably fast, the solid state disk means you can drop the netbook without breaking it and the keys are large enough for my big fingers. Plus it can run either Linux or Windows XP.&lt;/p&gt; &lt;h2 class="western"&gt;Xandros Linux&lt;/h2&gt; &lt;p style="margin-bottom: 0cm;"&gt;The Eee 1000 comes pre-installed with Asus' Xandros Linux, a proprietary Linux originally based on Debian. This is aimed at Linux novices and has an easy to use always-on full screen menu. It has extensions built in to handle hardware features of the Eee 1000 such as power-saving and keys for volume and to turn WiFi and Bluetooth on or off. Its /etc/apt/sources.list is set up to pull down updates and fixes from Asus's Xandros update repository.&lt;/p&gt; &lt;h2 class="western"&gt;Eee SSD&lt;/h2&gt; &lt;p style="margin-bottom: 0cm;"&gt;The 40GB solid state disk is shockproof and fast. You have the option to buy an Eee with a 120GB spinning disk, but this uses more power and is not as robust. The SSD is actually split into 32GB of user space and 8 GB of system restore space. The idea is if the user breaks their installed Linux, they can press F9 at boot time and re-image the 32GB partition with a fresh install of Xandros. This is a good idea for first time Linux users who might well break it once they start tinkering under the hood. You can also press F2 at boot time to enter the BIOS setup and configure hardware and boot options. It's possible you could format and mount the 8GB space as an extra partition using device /dev/sda1 though I haven't tried that yet.&lt;/p&gt; &lt;h2 class="western"&gt;Xandros Drawbacks&lt;/h2&gt; &lt;p style="margin-bottom: 0cm;"&gt;There are some major drawbacks to Asus' Xandros.  &lt;/p&gt; &lt;ul&gt;  &lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;The software versions installed,  such as StarOffice, are rather old.   &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;The simplified netbook screen menu  is restrictive for an experienced Linux user.   &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;Fatally, for a developer,  installing the supplied Firefox update from Asus' repo installs a  b0rked version of the libc6 library that breaks the dependencies  required to later install the build-essential package using apt-get  or the synaptic package manager. This means you don't have a C  compiler.&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt; &lt;h2 class="western"&gt;Xandros Hacks&lt;/h2&gt; &lt;p style="margin-bottom: 0cm;"&gt;Experienced Linux users can get much information from the &lt;a href="http://wiki.eeeuser.com/"&gt;Eee wiki&lt;/a&gt;. For example, you can add a normal KDE menu popup by following the &lt;a href="http://wiki.eeeuser.com/#full_desktop_advanced_mode"&gt;advanced desktop instructions&lt;/a&gt;. You can also &lt;a href="http://wiki.eeeuser.com/#customize_installed_software"&gt;add repos &lt;/a&gt;to access later debian software, provided you set up a pinning list to prevent the installation of packages incompatible with Xandros.  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;However, on my Eee 1000 (bought December 2008) I was unable to get the build-essentials package installed even following the instructions on the wiki about applying it before the Firefox 3 update. Perhaps the broken libc6 now comes pre-installed?&lt;/p&gt; &lt;h2 class="western"&gt;Installing Eeebuntu&lt;/h2&gt; &lt;p style="margin-bottom: 0cm;"&gt;Developers can solve this by installing &lt;a href="http://www.eeebuntu.org/"&gt;Eeebuntu&lt;/a&gt;. At present this is Ubuntu 8.10 Intrepid with Eee hardware-specific extensions to support the on-board WiFi, bluetooth and the hot keys on the keyboard, for example to toggle the screen on and off. An alternative is Ubuntu-eee, now known as &lt;a href="http://www.easypeasy.com/"&gt;EasyPeasy&lt;/a&gt;. I couldn't see much to choose between them so went for Eeebuntu.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;You don't need to worry about this going wrong and breaking your Eee. Simply backup any user files you want to keep onto a USB stick and then install Eeebuntu as follows. If it goes wrong, re-image the disk by pressing F9 at boot time, select recover and you will be back to Xandros.&lt;/p&gt; &lt;h3 class="western"&gt;1. Prepare USB stick with bootable Eeebuntu&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;You will need a USB stick with 1GB or more capacity. Following &lt;a href="http://www.liliputing.com/2008/12/how-to-install-eeebuntu-with-a-usb-flash-drive.html"&gt;the instructions on this linked guide&lt;/a&gt; you can create a bootableEeebuntu USB stick from another Windows or Ubuntu PC. I've summarised the points below but check out the linked page for screenshots if you get stuck. There are three versions of Eeebuntu. I'd recommend NetBook Remix as the interface is optimised for the smaller screen of a netbook.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;a href="http://eeebuntu.org/index.php?page=download"&gt;Download URL for eeebuntu NBR&lt;/a&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;a href="http://unetbootin.sourceforge.net/"&gt;Download URL for bootable imager&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Insert the USB stick into your other PC, run the imager, select the .iso file you downloaded and leave it running for 10-15 minutes until complete. Remove the now-bootable USB stick.&lt;/p&gt; &lt;h3 class="western"&gt;2. Boot Eeebuntu from USB stick and try it out&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;Shut down your Eee 1000. Insert the USB stick. Press the Eee power on button. The Eee will now boot Eeebuntu off the USB stick and run it in memory (i.e. not off your solid state disk). If it boots off the SSD instead, try pressing F2 at boot time for the BIOS setup and go to Boot / Boot Device Priority and move [Removable Dev.] to the first position.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;You can try out Eeebuntu and see whether you like the interface. Because it's running in memory, you can make any changes you like without it affecting your installed Xandros.&lt;/p&gt; &lt;h3 class="western"&gt;3. Install Eeebuntu&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;If you decide you like it, go to the Administration menu and choose install. Tell it to overwrite the whole of the 32GB SSD and not keep the existing Xandros partition.&lt;/p&gt; &lt;h3 class="western"&gt;4. Configure Eeebuntu To Boot Before Recovery Disk&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;After it finishes installing, select reboot and remove the USB stick. When the boot screen comes up, press F2 to enter the BIOS setup and go to Boot / Hard Disk Drives. You will see two SSD drives listed, the master 8GB partition [HDD:&lt;b&gt;SM&lt;/b&gt;-ASUS-PHISON] and the slave 32GB partition [HDD:&lt;b&gt;SS&lt;/b&gt;-ASUS-PHISON]. The “SM” one is the 8GB recovery disk. The “SS” is the 32GB disk where you just installed Eeebuntu. Select the SS one and move it up above the SM one in the order then press F10 to save and exit.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;The Eee should now boot up into Eeebuntu and you will have to enter the first run configuration information of your name, location and desired user login/password.&lt;/p&gt; &lt;h2 class="western"&gt;Configuring Ubuntu&lt;/h2&gt; &lt;p&gt;Download this free pocket guide to setting up and using Ubuntu: &lt;a href="http://www.ubuntupocketguide.com/download.html"&gt;Ubuntu pocket guide (PDF)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;That explains in detail how to use and administer Ubuntu. I've put some points below that will get you started and set up some useful utilities.&lt;/p&gt; &lt;h3 class="western"&gt;Root Access&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;To log on as root, run Accessories / Terminal and type&lt;/p&gt; &lt;pre style="margin-bottom: 0.5cm;"&gt;$ sudo bash&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; Alternatively, you can add a root terminal to the menu with: System / Control Centre – Section Look and Feel / Main Menu, go to System Tools and tick Root Terminal&lt;/p&gt; &lt;h3 class="western"&gt;Repository Settings&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;For reference, here is a record of the settings I have in /etc/apt/sources.list:&lt;/p&gt; &lt;pre&gt;deb http://gb.archive.ubuntu.com/ubuntu/ intrepid main restricted   deb-src http://gb.archive.ubuntu.com/ubuntu/ intrepid main restricted   deb http://gb.archive.ubuntu.com/ubuntu/ intrepid-updates main restricted   deb-src http://gb.archive.ubuntu.com/ubuntu/ intrepid-updates main restricted    deb http://gb.archive.ubuntu.com/ubuntu/ intrepid universe   deb-src http://gb.archive.ubuntu.com/ubuntu/ intrepid universe   deb http://gb.archive.ubuntu.com/ubuntu/ intrepid-updates universe   deb-src http://gb.archive.ubuntu.com/ubuntu/ intrepid-updates universe    deb http://gb.archive.ubuntu.com/ubuntu/ intrepid multiverse   deb-src http://gb.archive.ubuntu.com/ubuntu/ intrepid multiverse   deb http://gb.archive.ubuntu.com/ubuntu/ intrepid-updates multiverse   deb-src http://gb.archive.ubuntu.com/ubuntu/ intrepid-updates multiverse    deb http://security.ubuntu.com/ubuntu intrepid-security main restricted   deb-src http://security.ubuntu.com/ubuntu intrepid-security main restricted   deb http://security.ubuntu.com/ubuntu intrepid-security universe   deb-src http://security.ubuntu.com/ubuntu intrepid-security universe   deb http://security.ubuntu.com/ubuntu intrepid-security multiverse   deb-src http://security.ubuntu.com/ubuntu intrepid-security multiverse   deb http://linux.getdropbox.com/ubuntu intrepid main   deb-src http://linux.getdropbox.com/ubuntu intrepid main    deb http://ppa.launchpad.net/blueman/ubuntu intrepid main   deb-src http://ppa.launchpad.net/blueman/ubuntu intrepid main &lt;/pre&gt;&lt;h3 class="western"&gt; Install BootUp Manager&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;Run System / Administration / synaptic and install the “bum” package.&lt;/p&gt; &lt;h3 class="western"&gt;Using Eee control&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;Run System / Administration / BootUp Manager and set eee-control to run at run levels 3, 4 and 5. Start it now if not already running with Start / System Tools / Eee Control and an icon labelled “Eee” will appear in the top right menu bar.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;To turn on/off WiFi and Bluetooth, move the mouse over the Eee icon, click once, then tick/untick options in the popup menu. To map keys, right click the Eee icon, select Preferences and map the special Eee 1000 keys to functions such as Bluetooth toggle. I found it useful to map Fn-F8 to "gnome-terminal" so I can press Fn and F8 together to start a command shell.&lt;/p&gt; &lt;h3 class="western"&gt;Install drop box&lt;/h3&gt; &lt;p&gt;Dropbox is a file synchronisation utility that lets you store files in a secure, encrypted folder on the web that is reflected in a local copy on all the PCs you use. It's an easy way to share files between, say, a mobile netbook and a work PC without having to remember to copy files manually. It works on Windows, Linux and Mac.&lt;/p&gt; &lt;p&gt;Go to this link and follow the download for Linux: &lt;a href="https://www.getdropbox.com/install"&gt;https://www.getdropbox.com/install&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You want the &lt;a href="https://www.getdropbox.com/download?dl=packages/nautilus-dropbox_0.5.0-1_i386_ubuntu_8.10.deb"&gt;Ubuntu 8.10 (x86) version&lt;/a&gt;. Once downloaded, either use the file explorer to navigate to your home directory and then the Desktop sub-directory and click on the nautilus-dropbox_0.5.0-1_i386_ubuntu_8.10.deb file to install it, or from a root shell go to your Desktop directory and type&lt;/p&gt; &lt;pre style="margin-bottom: 0.5cm;"&gt;# dpkg -i  nautilus-dropbox_0.5.0-1_i386_ubuntu_8.10.deb&lt;/pre&gt;&lt;p&gt; Follow the instructions and you will end up with a Dropbox folder in your home directory. Anything you put in there will now be synced to the web storage and to any other PCs on which you have installed dropbox.  &lt;/p&gt; &lt;h3 class="western"&gt;Install development tools&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;Run System / Administration / synaptic.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Install your preferred tools, e.g. apache, java, php, mysql / postgres, phpmyadmin, perl, python.&lt;/p&gt; &lt;h2 class="western"&gt;Set up INQ1 as a Bluetooth Modem&lt;/h2&gt; &lt;p style="margin-bottom: 0cm;"&gt;The stock bluez package does not give enough control over the bluetooth connection to set up dial up networking using a INQ1 or Skypephone as a broadband modem. However, blueman does so we will use that instead.&lt;/p&gt; &lt;h3 class="western"&gt;Install blueman&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;import repo key&lt;/p&gt; &lt;pre&gt;# wget http://download.tuxfamily.org/blueman/blueman.gpg # apt-key add blueman.gpg&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; add repos using either Administration / Software Sources or by adding to /etc/apt/sources.list&lt;/p&gt; &lt;pre&gt;  deb http://ppa.launchpad.net/blueman/ubuntu intrepid main   deb-src http://ppa.launchpad.net/blueman/ubuntu intrepid main&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; then install blueman with the command  &lt;/p&gt; &lt;pre style="margin-bottom: 0.5cm;"&gt;# apt-get install blueman&lt;/pre&gt;&lt;p style="margin-bottom: 0cm;"&gt; if it says it wants to uninstall bluez or bluez-compat say 'yes'.&lt;/p&gt; &lt;h3 class="western"&gt;Configuration steps&lt;/h3&gt; &lt;h4 class="western"&gt;1. Recognise bluetooth phone&lt;/h4&gt; &lt;p style="margin-bottom: 0cm;"&gt;Run Accessories / Blueman Bluetooth Manager. Click the "Scan for bluetooth devices" button. Your phone should appear in the list of names.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;If not, check that you have turned on bluetooth networking on the INQ1 phone:&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;menu Settings / Bluetooth = Switch - on ; Visibility - show your phone&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;menu Settings / Advanced / Connectivity / Modem Connect - via Bluetooth&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Click on the phone in the list of names. Click the padlock symbol to bond to it. Your phone should report a connection attempt from your Eee. Accept and enter a PIN there. On your Eee Blueman should ask you to repeat that PIN there. Then it should show as bonded. On the INQ1 set the Eee as an authorised device that it will remember.&lt;/p&gt; &lt;h4 class="western"&gt;Set up bluetooth phone as a dial-up networking service&lt;/h4&gt; &lt;p style="margin-bottom: 0cm;"&gt;Run Accessories / Blueman Bluetooth Manager. Click menu Edit / Services. After "serial" click the red button to turn it green if not already so. Click the configure button to the right of that. On the Serial Service screen click the Add New Serial Port checkbox. From the Host dropdown select your bluetooth phone's name. Click the Refresh icon next to the Service dropdown. Then click the dropdown and select Dial-up Networking. Tick the box next to "This is a GSM/GPRS/EDGE/3G dialup connection". Click Add Port. Back on the Service screen tick Autostart after the Serial service's green button.&lt;/p&gt; &lt;h4 class="western"&gt;Configure dialup networking service using bluetooth&lt;/h4&gt; &lt;p style="margin-bottom: 0cm;"&gt;Run Preferences / Network Configuration. Click the Mobile Broadband tab. Click Add to start the add wizard. Click Forward. Choose provider "3" and click Forward. Click Apply.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Some people have reported better performance by editing the settings for the connection and going to the IPv4 Settings tab and entering hard-coded DNS servers as: 208.67.222.222, 208.67.220.220.&lt;/p&gt; &lt;h4 class="western"&gt;Testing&lt;/h4&gt; &lt;p style="margin-bottom: 0cm;"&gt;Unplug any wired Ethernet. From the Eee control icon in the top right toolbar (the icon says "Eee") click and disable WiFi and enable Bluetooth in the hardware. Run Accessories / Blueman to start bluetooth services. Click the network icon in the top right toolbar (looks like two overlapping PCs) and click the name of the bluetooth service "3" to start connecting. After about 10 seconds it should report as connected. Try browsing to a page in Firefox to verify it works.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Finally, you might want to set blueman to run at boot time using the BootUp Manager as blueman needs to be running for you to be able to see bluetooth dialup options on the network icon.&lt;/p&gt; &lt;h2 class="western"&gt;Finish&lt;/h2&gt; &lt;p&gt;That's it! You should have an Eee 1000 you can use for development on the move using an INQ1 for Internet connectivity. If you have any corrects or comments please add them below the blog and I'll update this guide.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-1634990572598245263?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/1634990572598245263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=1634990572598245263' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/1634990572598245263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/1634990572598245263'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2009/01/asus-eee-1000-setup-with-eeebuntu-linux.html' title=''/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-5572729821103412179</id><published>2008-12-23T02:40:00.000-08:00</published><updated>2008-12-23T02:43:39.979-08:00</updated><title type='text'>BBC Backstage Ideas site</title><content type='html'>This site is rather cool. Submit technical ideas that you would like the BBC to support, anything from RSS feeds to iPlayer APIs:&lt;div&gt;&lt;a href="http://ideas.welcomebackstage.com"&gt;http://ideas.welcomebackstage.com&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's based on the Ubuntu idea torrent project - nice to see the Beeb using and supporting free and open source software projects.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-5572729821103412179?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/5572729821103412179/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=5572729821103412179' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/5572729821103412179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/5572729821103412179'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2008/12/bbc-backstage-ideas-site.html' title='BBC Backstage Ideas site'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-2715355766133211161</id><published>2008-12-18T10:20:00.000-08:00</published><updated>2009-05-01T23:58:56.500-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eee'/><title type='text'>Asus Eeeeeee</title><content type='html'>So I gave in and ordered an Asus Eee 1000 Linux netbook with 40GB solid state drive. &lt;div&gt;&lt;a href="http://en.wikipedia.org/wiki/ASUS_Eee_PC#Eee_1000_Series"&gt;Wikipedia&lt;/a&gt; article on Asus Eee&lt;div&gt;&lt;div&gt;&lt;a href="http://www.trustedreviews.com/notebooks/review/2008/07/10/Asus-Eee-PC-1000-40GB-SSD-Linux-Edition/p1"&gt;trustedreviews&lt;/a&gt; write up on the Eee 1000 Linux with SSD&lt;/div&gt;&lt;/div&gt;&lt;div&gt;You get a lot for your money with one of these beasties and 7 hours operating time on one charge. I foresee lots of &lt;a href="http://search.cpan.org/"&gt;CPAN&lt;/a&gt; and &lt;a href="http://www.catalystframework.org/"&gt;Catalyst&lt;/a&gt; related perl hackery on the train.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Once I get it set up the next thing I want to do now that &lt;a href="http://www.bbc.co.uk/pressoffice/pressreleases/stories/2007/12_december/13/iplayer.shtml"&gt;BBC iPlayer is available for Linux&lt;/a&gt; is install the latest Ubuntu, Adobe AIR and get iPlayer running so I can watch programmes on the move. &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-2715355766133211161?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/2715355766133211161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=2715355766133211161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/2715355766133211161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/2715355766133211161'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2008/12/asus-eeeeeee.html' title='Asus Eeeeeee'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-3437168840315627844</id><published>2008-09-24T15:17:00.000-07:00</published><updated>2008-09-24T15:22:46.354-07:00</updated><title type='text'>Google developer day 2008 London</title><content type='html'>The Google developer day &lt;a href="http://code.google.com/intl/en_uk/events/developerday/2008/home.html"&gt;http://code.google.com/intl/en_uk/events/developerday/2008/home.html&lt;/a&gt;&lt;div&gt;London 2008 was at the new Wembley stadium.&lt;/div&gt;&lt;div&gt;It was an excellent day and it was great being able to talk to Google professionals and hear what is happening in Googleland. I would recommend it to any Open Source developer but remember - you need to register early!&lt;/div&gt;&lt;div&gt;The demo of the first Google Android phone was particularly interesting.&lt;/div&gt;&lt;div&gt;I've put some photos up here: &lt;a href="http://www.flickr.com/photos/24211691@N08/tags/google/"&gt;http://www.flickr.com/photos/24211691@N08/tags/google/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Check out this site for videos of the presentations and slides: &lt;a href="http://sites.google.com/site/developerdaylondon/"&gt;http://sites.google.com/site/developerdaylondon/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-3437168840315627844?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/3437168840315627844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=3437168840315627844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/3437168840315627844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/3437168840315627844'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2008/09/google-developer-day-2008-london.html' title='Google developer day 2008 London'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-2689392891926629139</id><published>2008-08-20T15:14:00.000-07:00</published><updated>2008-09-24T15:17:32.485-07:00</updated><title type='text'>YAPC::EU 2008 Copenhagen</title><content type='html'>It was good to go to the 20008 European Perl conference in Copenhagen in August, meet old friends and catch up with what is happening in the Perl world. Some photos here: &lt;a href="http://www.flickr.com/photos/24211691@N08/tags/ye2008/"&gt;http://www.flickr.com/photos/24211691@N08/tags/ye2008/&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;-Peter&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-2689392891926629139?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/2689392891926629139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=2689392891926629139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/2689392891926629139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/2689392891926629139'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2008/08/yapceu-2008-copenhagen.html' title='YAPC::EU 2008 Copenhagen'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-119344725732960774</id><published>2008-06-20T15:51:00.000-07:00</published><updated>2008-06-20T15:55:36.953-07:00</updated><title type='text'>BBC Mashed 2008</title><content type='html'>Yee-har! We're off the &lt;a href="http://mashed08.backnetwork.com/"&gt;BBC's Mashed 2008 event&lt;/a&gt; at Alexandra Palace ("Ally Pally") to have fun with the Beeb's services.&lt;br /&gt;I'm doing some contract Perl work on the Beeb's content production systems and it will be fun to mingle with some hard core geeks using their data services in new ways.&lt;br /&gt;We're living in interesting times at the dawn of Interactive/Internet Television.&lt;br /&gt;&lt;br /&gt;--Peter&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-119344725732960774?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/119344725732960774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=119344725732960774' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/119344725732960774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/119344725732960774'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2008/06/bbc-mashed-2008.html' title='BBC Mashed 2008'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-1310061645030727417</id><published>2008-03-06T08:18:00.000-08:00</published><updated>2009-05-01T23:59:28.218-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='perl ukraine'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><title type='text'>After the Ukraine Perl Conference</title><content type='html'>Well that was a fun time in Kyiv (Kiev), Ukraine. I shared rental on an apartment with &lt;a href="http://www.jnthn.net/"&gt;Jonathon Worthington&lt;/a&gt;, the &lt;a href="http://www.jnthn.net/perl6/"&gt;Perl 6 Parrot&lt;/a&gt; guy, for 5 days and a Ukrainian Perl programmer &lt;a href="http://vuets.com/en/"&gt;Max Vuets&lt;/a&gt; stayed the night before the conference.&lt;br /&gt;&lt;br /&gt;Jonathon's a nice guy and we walked all over the city sightseeing. He's also very bright and we had some good chats about Perl and Perl 6. We also chatted with Max about Perl and technology. His English was very good and I was grateful to have a local Ukrainian person explain more about their culture and country. It was amazing to see how high tech Kyiv is, many 4x4 cars, flash mobile phones (jacked iPhones!) lots of new building work. It is a city of great divides between both rich and poor but it is also moving forward and modernising at a tremendous pace.&lt;br /&gt;&lt;br /&gt;We rented through &lt;a href="http://www.sherbornehotel.com.ua/"&gt;Sherborne Guest House&lt;/a&gt; and I can happily recommend them for their luxurious and safe apartments. Nothing was too much trouble for the friendly English-speaking reception staff, there was 24 hour English-speaking security and it was just down the road from the Arsenelna metro station.&lt;br /&gt;&lt;br /&gt;The city itself is beautiful as you can see from these &lt;a href="http://www.flickr.com/photos/24211691@N08/sets/72157603992626603/"&gt;Flickr photos&lt;/a&gt;. Here's &lt;a href="http://www.flickr.com/photos/24211691@N08/2293274773/in/set-72157603992626603/"&gt;one of me&lt;/a&gt; giving my &lt;a href="http://perl.dragonstaff.co.uk/"&gt;talk on getting started with ExtJS and Catalyst Perl&lt;/a&gt;. The grisly video evidence is on the &lt;a href="http://event.perlukraine.org/upw2008/media/video.html"&gt;conference Wiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The conference itself was 80% in Russian, 20% in English. I don't speak Russian but was able to glean a fair amount from the slides and there were some interesting topics, such as using &lt;a href="http://search.cpan.org/search?query=memcached&amp;amp;mode=all"&gt;MemCached&lt;/a&gt; and &lt;a href="http://search.cpan.org/search?query=spread&amp;amp;mode=all"&gt;Spread&lt;/a&gt;, and on how to win over business managers to the idea of Open Source.&lt;br /&gt;&lt;br /&gt;We went out and ate in the Bar Mikhailovsky, good food and friendly company, a mix of Ukrainian (mostly Kiev.pm) and Russian (mostly Moscow.pm) Perl people. I was taken by how welcoming they were and it was a really good time.&lt;br /&gt;&lt;br /&gt;I hope to return next year, and this time learn some Russian / Ukrainian in advance! It was a bit of a last minute decision to speak and you can't learn much of a language in 1 month.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-1310061645030727417?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/1310061645030727417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=1310061645030727417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/1310061645030727417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/1310061645030727417'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2008/03/after-ukraine-perl-conference.html' title='After the Ukraine Perl Conference'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-8273563514185582335</id><published>2008-02-04T15:27:00.000-08:00</published><updated>2008-02-04T15:29:15.471-08:00</updated><title type='text'>Mysql tip</title><content type='html'>In your ~/.my.cnf add&lt;br /&gt;   pager=less -niSFX&lt;br /&gt;Then your multi-screen results will be paged and you can press -&gt; to scroll right for columns past 80 characters.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-8273563514185582335?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/8273563514185582335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=8273563514185582335' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/8273563514185582335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/8273563514185582335'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2008/02/mysql-tip.html' title='Mysql tip'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-3771981573988900601</id><published>2008-02-04T15:19:00.000-08:00</published><updated>2008-02-04T15:40:58.521-08:00</updated><title type='text'>Great Patriotic War</title><content type='html'>While I'm in an Eastern European frame of kind I'd like to recommend a website a Russian Perl programmer colleague mentioned to me last year.&lt;br /&gt;Soldiers of the Great War: &lt;a href="http://english.pobediteli.ru/"&gt;http://english.pobediteli.ru/&lt;/a&gt;&lt;br /&gt;Click on “Multimedia Map Of The War” on the GREEN arrow where it says Start Presentation.&lt;br /&gt;&lt;br /&gt;It is a truly amazing volunteer effort using Flash animations of the WWII Russian/”Great Patriotic War” battles with pictures, video clips and reminiscences from wartime survivors about their actions.&lt;br /&gt;They were evidently grateful to the USA and UK for convoy and supply support during the war. It helps explain the extreme guardedness they felt after WWII after having half their territory invaded. Many millions of people died.&lt;br /&gt;When you look at the map (all of Ukraine invaded, German armies at Leningrad, Moscow, Stalingrad) and see how close they came to being gutted - like the UK, we came close too - it's a visceral feeling.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-3771981573988900601?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/3771981573988900601/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=3771981573988900601' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/3771981573988900601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/3771981573988900601'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2008/02/great-patriotic-war.html' title='Great Patriotic War'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-2254976108182334612</id><published>2008-01-21T13:16:00.000-08:00</published><updated>2009-05-01T23:59:48.903-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='catalyst'/><title type='text'>Ukrainian Perl Workshop 2008</title><content type='html'>It's too warm in Britain. I need to freeze my nuts off. I have a yearning for dumplings. I want to visit Kyiv.&lt;br /&gt;These can be the only explanations for...&lt;br /&gt;going to the &lt;a href="http://event.perlukraine.org/upw2008/"&gt;Ukrainian Perl Workshop 2008&lt;/a&gt; !!!&lt;br /&gt;&lt;br /&gt;I'll be there on 23rd February to give a talk on ‎&lt;a href="http://event.perlukraine.org/upw2008/talk/960"&gt;Getting started with ExtJS Javascript screen library and Catalyst Perl&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Feel free to come up and say "Hi!" if you're going.&lt;br /&gt;&lt;br /&gt;-Peter&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-2254976108182334612?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/2254976108182334612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=2254976108182334612' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/2254976108182334612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/2254976108182334612'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2008/01/ukrainian-perl-workshop-2008.html' title='Ukrainian Perl Workshop 2008'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-3803592328437337327</id><published>2008-01-19T12:58:00.000-08:00</published><updated>2008-01-19T13:04:19.204-08:00</updated><title type='text'>Farewell Bobby Fischer</title><content type='html'>The American chess genius Bobby Fischer (9th March 1943 - Jan 17th 2008) has died.&lt;br /&gt;&lt;br /&gt;As a keen chess player I learnt much from Bobby's &lt;a href="http://www.chessgames.com/perl/chesscollection?cid=1000498"&gt;"My 60 Memorable Games"&lt;/a&gt; and although it's sad that he had mental problems throughout his life I respected his decision to play his rematch with Boris Spassky in Yugoslavia during the war that saw the break-up of Yugoslavia. It was particularly breath-taking to watch America, a country that has invaded Cuba three times in the last century, and fomented so much dissent in South America - put Bobby, a brilliant but mentally ill chess player, on their wanted list and causing his exile in Iceland. This attitude says so much about how the US ended up in the Iraq invasion, or"Vietnam II" as I think of it.&lt;br /&gt;&lt;br /&gt;A certain monomanical attititude is required to excel at programming, as in chess, and I wish to salute this genius of pattern-matching and algorithmic selection.&lt;br /&gt;&lt;br /&gt;-Peter&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-3803592328437337327?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/3803592328437337327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=3803592328437337327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/3803592328437337327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/3803592328437337327'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2008/01/farewell-bobby-fischer.html' title='Farewell Bobby Fischer'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-303142648956941863</id><published>2007-12-03T08:50:00.000-08:00</published><updated>2007-12-03T09:18:15.787-08:00</updated><title type='text'>3 Skypephone</title><content type='html'>So the UK mobile telecomms network three.co.uk has launched a &lt;a href="http://3skypephone.com/"&gt;Skype mobile phone&lt;/a&gt; that handles Skype instant messaging as well as Skype calls and I've bought one of these little (86 gram) beauties.&lt;br /&gt;&lt;br /&gt;I use Skype heavily to provide tech support and communicate with colleagues in several countries and up till now I've not really had a mobile alternative. Other so-called Skype phones don't handle IM so I've been off-line when travelling to customer sites unless I booted up my laptop.&lt;br /&gt;&lt;br /&gt;This phone gives you mobile broadband access from your laptop - either by Bluetooth or USB cable (supplied) - and an amazing range of goodies for the low price of £50 (PAYG) or £12 p.m. (contract). The contract is worth it as you get 100 mins talk time (not used when making free Skype calls) and you can add-on inexpensive 3G Internet access and mobile TV.&lt;br /&gt;&lt;br /&gt;I didn't really buy the phone for entertainment but the media player (stereo headphone supplied), TV and other services and the BREW operating system platform for games (also runs Java VM) means it is surprisingly good fun. An immediate must-do is to read &lt;a href="http://3skypephone.com/forum/index.php"&gt;the Skypephone forum&lt;/a&gt; for tips, download and install the Opera mini browser so you can browse non-WAP sites and for mobile email install &lt;a href="http://www.flurry.com/"&gt;flurry&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you wanted entertainment (and were rich!), you'd buy an iPhone, and if you wanted a PDA you'd buy a Blackberry or Treo but if you want a work Skype phone that offers a lot more this is a great phone.&lt;br /&gt;&lt;br /&gt;--Peter&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-303142648956941863?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dragonstaff.blogspot.com/feeds/303142648956941863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5889809568931888012&amp;postID=303142648956941863' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/303142648956941863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/303142648956941863'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2007/12/3-skypephone.html' title='3 Skypephone'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5889809568931888012.post-4799628473725799101</id><published>2007-11-10T00:26:00.000-08:00</published><updated>2007-11-10T00:33:50.971-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bootstrap'/><title type='text'>Blog</title><content type='html'>I run a business that provides business IT consultancy to help other companies run their operations and improve their efficiency by using Open Source software (we're specialists in Linux, MySQL, Perl and PHP and web technologies).&lt;br /&gt;We work particularly in the recruitment sector although we also do websites for all types of small businesses.&lt;br /&gt;I've decided to start a blog to cover some of the technical and industry issues we come across.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5889809568931888012-4799628473725799101?l=dragonstaff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/4799628473725799101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5889809568931888012/posts/default/4799628473725799101'/><link rel='alternate' type='text/html' href='http://dragonstaff.blogspot.com/2007/11/blog.html' title='Blog'/><author><name>Peter Edwards</name><uri>http://www.blogger.com/profile/15080012806405551508</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://dragonstaff.com/images/peter.jpg'/></author></entry></feed>
