2009-12-27

AC/DC concert threatens rare birds

There's a story spreading like wildfire on news and blog sites (http://tinyurl.com/ac-dc-concert-birds). Very many of them have exactly the same wording, and many don't quote their sources. Here's an example:
"Rockers AC/DC may have to cancel a sold-out concert because their big sound poses a danger to rare birds.
Animal rights campaigners are threatening legal action if the band goes ahead with a gig planned for Wels airport in Austria in May.
Hans Uhl of BirdLife said birds nesting in the area at the time would be threatened by anthems such as 'Highway To Hell' and 'You Shook Me All Night Long'.
'The second biggest colony of curlews in Upper Austria and various other ground-nesting birds must not become endangered,' Mr Uhl said.
The 80,000 tickets for the event sold out within hours, after going on sale earlier this month."
 (I got this from http://www.skynews.com.au/showbiz/article.aspx?id=411151.)

I'm a hard-rock fan myself and enjoy AC/DC's music (although I prefer Alice Cooper for example), but let's get a few facts straight here:

Eurasian Curlew nest and eggs
Eurasian Curlew nest and eggs
(photo: Wikipedia)

Many of the blog replies go something like this: "It's an airport, for heaven's sake; can't the birds take a few hours of AC/DC music?" Yes, they probably can. It's not the music that threatens the rare birds but the 80,000 fans unwittingly trampling the nests, young birds and eggs that are actually laid directly on the ground where the concert is to take place in the middle of the breeding season. The stage would also be built directly on the same ground where many of the nests are. Note the "ground-nesting birds" in the quote attributed to Hans (a friend of mine, by the way). The stage and audience area will take up the entire meadow where the nests are.

BirdLife, the group Hans Uhl represents, is not an animal rights group (http://en.wikipedia.org/wiki/Animal_rights) composed of activists or campaigners, as stated in the reports, but a wildlife conservation group (http://en.wikipedia.org/wiki/Wildlife_conservation) composed of ornithologists (including me, by the way). There's a big difference between those kinds of groups.

Juvenile Eurasian Curlew at Wels airport
Juvenile Eurasian Curlew photographed at Wels airport by © Josef Limberger
BirdLife is not requesting cancellation of the concert but postponement till after the breeding season when the young have hatched and gotten out of harm's way (or relocation of the concert).

Some of the blogs imply that Hans thinks the bird species in question will die out ("be wiped out"). This is not true, but it is true that this particular colony of these rare birds could be wiped out, never to return, if all their nests are trampled this year. I will happily name the various bird species in question to anyone interested (it's not only curlews).

There are plans to protect the meadow as a natural area. It isn't one yet, or else this wouldn't have happened. However, the town of Wels, where the airport is located, neglected to inform the organizers that they need to go through a permit procedure involving government conservation agencies before they started selling tickets.

Adult Eurasian Curlew at Wels airport
Adult Eurasian Curlew photographed at Wels airport by © Josef Limberger
All this doesn't come out in the original reports that all the online sources refer to, quote and/or copy, but I live here and am involved with the issue, so I know better.

As a strange twist of irony, the UN has declared the day of the concert (May 22) as the International Day for Biodiversity (http://www.cbd.int/idb).

Here's Wels Airport. As you can see, it's a little smaller than, say, Chicago O'Hare. The airport's own website (http://www.wmw.at/Aerodrome/Aerodrome_Nature.aspx) brags about rare species of plants, bees and frogs as well as birds. The site's in German, but it has nice pictures :-)

View Larger Map

2009-09-15

Migrating a web server from a hard drive to a portable drive

When it was time to retire my 3-year-old Dell Inspiron laptop, I decided to buy an Asus Eee PC netbook. I did all my web application development on the laptop, whereby the application and development environment were on the hard drive. Although the netbook's hard drive is large enough to contain everything, I decided to take this opportunity to try putting a running web server along with a large, database-driven web application on a portable drive. I would reinstall the development environment on my netbook, but put the web server and application on the portable drive.

The main advantage of a portable drive is not development, but demonstrations in situations where the Internet is not available or either very slow or very expensive. I can just copy the portable drive to another portable drive (I need the first one for development) and use it myself or give it to the person going to the trade show. Since I won't be the only one doing demonstrations, the web server needs to be easy to start. Previously, I would ask to have the other person's laptop for a few days to get the pre-installed web server and application up-to-date. I had to be sure several installations on several laptops were at the same stage of development. Now I just delete everything and copy from the master installation.

Instead of migrating I could have downloaded the latest version of XAMPP and installed it on the portable drive. However, I wanted to be sure all the versions of the various components and all settings in all the configuration files were the same as on my development system in order to avoid unpleasant surprises.

XAMPP is small enough to put on a 4 or 8 GB USB flash drive with 2.5 to 3 GB for all its files, but my application with all its media files needs several times that, so I bought a 250 GB external USB hard drive for the purpose.

Here are the steps I took to migrate my XAMPP web server and applications from a Windows PC hard drive to a portable drive. It should also work with any other Winsows-Apache-MySQL-PHP system. My terminology is from Windows XP, but everything should work analogously for Windows Vista.

* Make sure the portable drive is large enough for the XAMPP directory and any web documents not included in XAMPP directory.

* Copy the XAMPP directory and any web documents not included in the XAMPP directory and any directories in the PHP include_path directive, for example, copy C:\xampp\*.* to E:\xampp\*.*

* If Apache or another web server like IIS is already running on the target system, you will need to disable it. For Apache, look for xampp_stop.exe, usually in C:\xampp, and run it. If Apache, MySQL or other modules are running as Windows services, it would probably be best to deactivate the services.

* Since the configuration files are (probably) full of drive letters, and portable drives are assigned drive letters dynamically, we need to remove the drive letters from the configuration files: Remove all occurrences of the source drive letter (usually C:) in the following configuration files:
o \xampp\apache\conf\httpd.conf
o \xampp\apache\conf\extra\httpd-xampp.conf
o \xampp\apache\conf\extra\httpd-ssl.conf
o \xampp\apache\bin\php.ini
o \xampp\mysql\bin\my.cnf
o Any other configuration files you use. Look in the directories above.

* The lines in the configuration files will be changed, for example, from 'ServerRoot "C:/xampp/apache"' to 'ServerRoot "/xampp/apache"'.

* Caution: Be sure NOT to run \xampp\setup_xampp.bat. Otherwise the current drive letter of the application will be added to all the path names. This batch file is not meant for portable installations.

* Tip: If you don't see .cnf file endings in Microsoft Explorer, and the icon for "my", etc., looks like a small curved arrow, then Windows has associated the ending .cnf with NetMeeting, and you can't edit the file by double-clicking or right-clicking it. Run your favorite text editor (for example, Start > Run > Notepad) and open the file from within the editor or drag the file to the editor.

* Optionally export your favorites/bookmarks from the source machine, rename the file to index.html, and put it in the root directory of the portable drive. The links to your web applications should have the form http://localhost/(application/) and don't need to be changed, but if you have links to HTML files that were on the hard drive, they will no longer work. You can consider changing them to the most likely drive letter, perhaps E:.

* Tip: A common conflict is Skype or another application listening on the same port as Apache, usually port 80. End the offending application or change the port Apache listens to (the Listen directive in \xampp\apache\conf\httpd.conf), or change the port the other application listens to. In Skype, for example, remove the checkmark next to "Tools > Options > Advanced > Connections > Use port 80 and 443 as alternatives for incoming connections", depending on your version of Skype.

* Optionally create a batch file named start.bat with the following contents, and put it in the root directory of the portable drive (this starts the XAMPP modules and then starts the bookmark file created above in the default browser):

cd \xampp\
start /min xampp_restart.exe
cd \
start index.html


* I created a second batch file called start2.bat with the following contents:

@echo off
cd \xampp\
start /min xampp_restart.exe
\PrcView\pv.exe -r1 -d1000 apache.exe > nul
\PrcView\pv.exe -r1 -d1000 mysqld.exe > nul
start http://localhost/workspace/heli/index.php


This batch file uses a free utility you can find at http://prcview.com to determine if Apache and MySQL are already running before starting a specific PHP application in the default browser (adapt to your situation). Be sure to include the PHP file in the last line (here "index.php") because otherwise some systems may display a missing parameter error.

* Run \xampp\xampp_restart.exe.

* If Windows Firewall asks whether it should continue blocking Apache HTTP Server or mysqld, reply with "No longer block". You only need to do this once per PC.

* If you get any errors about not finding files, see the step above about removing drive letters in configuration files.

* Test the installation with http://localhost in a browser.

* Optionally create a batch file named stop.bat with the following contents, and put it in the root directory of the portable drive (to be executed before removing the portable drive from the computer):

cd \xampp\
start /min xampp_stop.exe


* Optionally create a text file called autorun.inf in the root directory with the following contents:

[autorun]
open=start2.bat
icon=\xampp\htdocs\application\favicon.ico
action=Name of Application


This will cause a menu item to be added at the top of the Autorun window that opens when you insert the drive into a PC. Adapt the three directives to your situation.

* Depending on the purpose at hand, you can change the "open" directive to start.bat or start2.bat.

* Whoever is doing the demonstration needs to know not to close the minimized Apache application. To end the application, he/she must run stop.bat. Not until then can the portable drive be removed. Don't forget to also click the little green arrow to remove the hardware safely as with all portable drives.

See the eHow version of this post here: How to Migrate a Web Server From a Hard Drive to a Portable Drive

2009-08-22

Converting MS SQL and/or MS Access to MySQL

For a current project I had to convert an MS SQL database to a MySQL database. I did not have access to the MS SQL server, but the previous database administrator provided me with a dump of the database creation statements and an MS Access file with the data.

Being unfamiliar with MS SQL, I assume he used BACKUP or BCP to create text files that contain the necessary MS SQL statements required to re-create the database structure (that is, scripts) then another tool such as MS DTS to export the data to MS Access.

The text files delivered were DB_Table_Creation.sql, DB_StoredProcedure_Creation.sql, and DB_Transaction_Creation.sql. Since the application will be rebuilt from scratch, I was only interested in DB_Table_Creation.sql.

The Access file delivered was xxx_tables_yyyymmtt.mdb.

To import the Access data I downloaded and installed the free MySQL GUI Tools, which include MySQL Migration Toolkit (as well as MySQL Administrator and MySQL Query Browser, which I will have to check out later): http://dev.mysql.com/downloads//gui-tools/5.0.html

To run MySQL Migration Toolkit you will need access to a functioning MySQL server.

While running MySQL Migration Toolkit I got the following error message:

"The connection to the target database could not be established (error: 0).
ReverseEngineeringMysqlJdbc.getVersion :Unknown initial character set index '48' received from server. Initial client character set can be forced via the 'characterEncoding' property."

After finding this error message described here: http://bugs.mysql.com/bug.php?id=25233
I realized that I had previously played with changing character sets and collations, so I followed the suggestion mentioned there and didn't have any further problems.

At the "Object Creation Options" step, I checked the option "Create Script File for Create Statements" to compare it with the table creation script from MS SQL. Note or change the path, so you can find it later (the default is "My Documents\Creates.sql").

The "Bulk Data Transfer" step may take a while depending on the amount of data, so don't assume the program has crashed. You can click "Advanced >>" for more information, but it appears to output an empty line for every row of data imported, so don't be alarmed.

When the transfer process was finished I compared the MS SQL script file provided by the previous database administrator with the one created by the Migration Toolkit to see if there were any huge discrepancies. The MS SQL file defined some fields with NOT NULL while the Migration Toolkit created them all with NULL; no big deal. The data types seem to have been converted correctly (at least with no data loss), considering their differences between MS SQL and MySQL. The VARCHAR fields with specific lengths were converted to LONGTEXT fields with no length given. This seems wasteful for VARCHAR fields defined with a length of 2 for example, but at least no data was lost. BIT fields were converted to SMALLINT(5): more waste but at least no loss. CHAR fields with a length of 10 were converted to VARCHAR(10). DECIMAL fields were also converted with their exact length. DATETIME fields became DATETIME fields. DEFAULT values were not defined in the target database; the new application must take this into account, or the fields must be altered after conversion. It appears IDENTITY(1,1) for example is meant to identify primary auto-increment keys. This definition is lost in the target database, as is all other key information (PRIMARY KEY, UNIQUE, etc.).

An alternate method of converting the database would have been to adapt the MS SQL script to MySQL as well as possible using copy/replace, and then run the script in MySQL. Then you would need to export the Access data into some sort of text file and load it into the new MySQL database with LOAD DATA INFILE. But that would require a much better understanding of the MS SQL CREATE TABLE syntax than I have and an installed version of MS Access, which I don't have.

See a more detailed version of this blog post on eHow:
http://www.ehow.com/how_5334020_convert-andor-ms-access-mysql.html

2009-08-18

First Post

OK, I know there are about umpteen other blogs out there called "Robb's Blog", but I couldn't think of anything cleverer. I'd be happy to hear any suggestions.

I plan to use this blog for reports of my evaluations of various (IT) products and whatever else comes to my mind.

At the moment I am evaluating online (also call hosted or web-based or in-the-cloud) invoicing/billing systems and online bug-tracking (also called issue-, problem-, defect- and ticket-tracking) systems.

Soon after I twittered the following:

"dellfalconer is evaluating online billing/invoicing systems."

I got tweets back from:

curdbee
onlineinvoicing from invooice
Nagendr4mzoho from Zoho
harvest
jjriv from Intervals

This indicates a dedication to customer interaction that I find refreshing, so I will try to include the ones I hadn't heard of in my evaluation and have another look at the ones I had heard of.