Trouble with debugging

I apparently have screwed up my Zend Studio 7 debug settings. I can launch the debugger ok from within Zend Studio 7, but any breakpoints that I’ve set on subsequent pages don’t ever trigger. I can also see the browser output indicating that the code all ran.

At this point I’m getting so frustrated that I think I’m going to start with a fresh install of Zend Studio 7, ensure the debug example works, recreate my project, and see if all works then.

Everything is backed up on Time Machine, so here we go.

Installing Zend Server CE

Zend Server CE is a package containing Apache, PHP, MySQL, and the Zend Debugger. It is a great way to quickly install the full environment needed for PHP development. It is also free.

Installation is pretty simple, mostly download and run.

After installing, you’ll probably want to setup multiple virtual hosts. This requires editing two Zend Server files (conf/httpd.conf and conf/extra/httpd-vhosts.conf) and /private/etc/hosts.

The ZendServer control panel is accessed through the default localhost documentroot folder, so its probably best to leave localhost where it is. Alternatively it may work to copy the ZendServer link that is in /usr/local/zend/apache2/htdocs to whereever localhost gets moved to.

Create new vhosts by uncommenting the vhosts file include in httpd.conf. Then create as many vhost sections as needed. Be careful that any specified log files are within folders with permissions enabled. Also be sure to copy the localhost permissions section in httpd.conf for the location of the vhosts folders (eg. Sites). Remember to setup localhost or the Zend Server control panel will be broken.

MySQL Backup/Restore

I’ve been working with MySQL databases years. Since most of my projects have been fairly small, I’ve managed backups and schema updates manually using phpMyAdmin. Typically I will setup 3 separate server environments and databases: dev, test, and live.

User Scenarios

The scenarios that I would like to implement are:

  1. Create ‘dev’ database, tables, and optionally initial content.
  2. Optionally import existing content from ‘live’ to ‘dev’.
  3. Develop and test code using the ‘dev’ environment and database.
  4. Copy the ‘dev’ database to the ‘test’ database
  5. Optionally import existing content from ‘live’ to ‘test’
  6. Test using the ‘test’ environment
  7. Lock the ‘live’ database
  8. Backup the ‘live’ database
  9. Copy the ‘test’ database to the ‘live’ database
  10. Restore the ‘live’ content
  11. Unlock the ‘live’ database

MySQL supports doing all of these things.

Creating the Database and (optionally) Initial Content

Creating the database is done using CREATE TABLE. Using a PHP function to do this works well because then the structure of the table is documented and can be checked into the SCM.

Importing Existing Content

Development on the ‘dev’ site is easier if the ‘dev’ database contains valid data. If the ‘live’ and ‘dev’ databases reside on the same server then the content from the ‘live’ database can easily be copied into the ‘dev’ database using ‘INSERT INTO dbname.tablename (cols) SELECT cols FROM dbname.tablename’. If not, then the ‘live’ database will need to be unloaded to a file, then the file loaded into the ‘dev’ database as described for backup below.

Copying the Dev Database to Test

Once new code is developed and tested in the ‘dev’ environment it needs to be copied as-is to the ‘test’ environment. This is easily done using ‘CREATE TABLE dbname.tablename AS (SELECT * FROM dbname.tablename)’. Updated content can be copied from ‘live’ to ‘test’ as described above for copying data into ‘dev’.

Lock the Live Database

Although MySQL provides a locking mechanism, this is probably not the best approach in this case. A better approach might be to set a flag in the user login or identification code. I call this setting a ‘service mode’. Other users that try to interact with the site will be told that the site is down for service, and to try again later.

Backup the Live Database Content

MySQL provides a BACKUP and RESTORE commands, but these are marked as ‘deprecated’. Since the structure of the database is recorded in the code which creates the database, only the content needs to be backed up. This can be done using what MySQL calls ‘unloading’ and ‘loading’: “SELECT * FROM table INTO OUTFILE filename FIELDS TERMINATED BY ‘,’ OPTIONALLY ENCLOSED BY ‘”‘ ” and “LOAD DATA INFILE ‘filename’ INTO TABLE table FIELDS TERMINATED BY ‘,'”

Recreate the Live Database

Use the same code that was used to create the ‘dev’ tables to recreate the ‘live’ tables.

Restore the Live Database Content

As stated above, MySQL provides a RESTORE command but it is marked as ‘deprecated’. Since the structure of the database was recreated in the previous step, load the content using “LOAD DATA INFILE ‘filename’ INTO TABLE table FIELDS TERMINATED BY ‘,'”

Unlock the Live Database

This is done by turning off ‘service mode’.

Keyboard Mapping

I’ve been doing a lot of web programming using Eclipse on both my work Windows machine and my personal Macbook Pro. I’m finding the difference in the “Start of line” and “End of line” keys to be extremely annoying. So I’m looking to remap the Mac keystrokes on the external keyboard I use with the Macbook Pro to match those of my office Windows machine.
This post appears to provide the info I need to do this: http://www.erasetotheleft.com/post/mac-os-x-key-bindings
I may look a bit more though, and see about remapping the Windows keyboard to match the Macbook Pro instead 🙂

BorderContainer disappears when height=100%

I ran into a snag getting the tab container to work when specifying height and widths of 100%.

Solution: I eventually discovered that all 3 html, body, and the BorderContainer div must be set to 100%. I had not specified anything for html and body, and when I set the div tag to 100% the whole thing just went blank.

In addition, the BorderContainer will updating the size of its child divs (those marked with “region=”. It won’t however update any additional divs that are children of those. This tripped me up because I was trying to put an AccordionContainer within the left region div of a BorderContainer. The AccordionContainer height wasn’t being updated and was not working when setting the AccordionContainer to 100%. The solution was to eliminate the left region div, and set “region=’left'” in the AccordionContainer itself.

Now we know.

Starting Dojo Drag and Drop

Last night I began creating a lineup edit page. I’m hoping to use Dojo’s drag-and-drop functionality to make creating each week’s song lineup very easy:

On the left side I will display a list of song positions and names (Intro, 1st congregational, offertory, etc). Next to each item will be the song name.

On the right side I will display all of the songs in the database, and a link to add a new song.

The user will then drag songs from the list on the left onto the lineup position. Any positions not needed can be dragged out of the list, and will appear at the bottom in an ‘unused’ section. They can thus be dragged back if needed. Individual items can be dragged to rearrange the order.

The list of songs will include an MP3 link to allow previewing the song.

Last night I added the code for the lists, and a few lines of Dojo to enable dnd and the result was immediately impressive. With just a few additional statements added to the lists, I can now drag between the lists and within the lists to reorder.

I found a very helpful link which I’m working through: http://www.sitepen.com/blog/2008/06/10/dojo-drag-and-drop-1/

I’ll need to clean up the way it works though. I don’t want the songs to be removed from the song list when dragged onto the lineup. Sometimes the same song may be played twice. There is also some formatting problems due to different columns being displayed in the lineup and songs lists (tables). And there is no functionality yet. DND operations modify the appearance of the form, but don’t get written to the DB yet.

Subversion + Eclipse is wonderful

Ok, I initially had one small problem where I couldn’t commit a couple files. Other files worked just file. So I simply deleted and recreated the 2 files. All is working great now.

I also had created a small problem by adding Subclipse. I’m using Zend Studio for Eclipse 6.1, and it comes bundles with Subversive. So adding Subclipse caused ‘SVN’ to appear twice everywhere. I uninstalled Subclipse and the confusion is gone.

Having worked extensively with both ClearCase and Accurev at work, I wasn’t sure what to expect from Subversion, or how well it would integrate into the Eclipse environment. I must say that I am very impressed. This setup is working way better than what I’m used to at work, which is just standalone AccuRev. The Subversion integration with Eclipse (via the bundled Subversive) is very efficient. The ‘compare’ functions are very helpful, allowing quick selection of previous versions to help me remember what I’ve changed and when on a file-by-file basis.

I know that things can get difficult when managing merging of multiple programmers changes. Since I’m the only one updating this code, I haven’t had to try out Subversions functions for doing this.

Further Development on TheRockBand site

Having made great progress this week setting up subversion, I was anxious to get started this morning, only to have all kinds of weird failures.

It turned out that I had created a new directory when I checked out the code, but hadn’t switched the vhosts paths to point to it, nor the ZSE path info. So it took me awhile to figure that out.

Next I implemented the Song Add/Edit/Delete actions. Delete had a bug caused by the dependent table info not being correct. In this case I used the table name instead of the table class. I determined this by tracing down into the ZF code. When a Zend_Db_Table_Row is deleted, it automatically performs a delete of any dependent tables. This is cool, but means that if I specify dependentTables and referenceMaps then they better be correct.

I’ve been reading up on the Dojo drag-and-drop support, and will be using this for editing lineups. I’ll display a list of the possible lineup items (eg. Special, 1st congregational, etc), and song, and allow them to be dragged into a blank lineup matirx.

But first I will get based pages working so we can get the site back online this weekend.

Updating the website

Ok, so now that I am able to work with the code and interact with Subversion, it’s time to update the website.
1. SSH userid@therockband.org
2. CD therockband.org/live or CD therockband.org/test
3. svn checkout http://svn.therockband.org .

Note the ‘.’ at the end of the svn checkout command line. Without specifying a path svn will use the path in the repository, which in this case is svn.therockband.org which isn’t what we want. Also, if not careful, the files might go right over top of the repository itself (doing nothing).

To avoid confusion, I’m going to create separate directories for the ‘live’ and ‘test’. Now when I run ‘checkout’ I see all of the files getting copied. When I run ‘update’ I see a list of the files that needed to be updated and the new revision number.

It doesn’t get much easier than that.

Continuing with Subversion in Zend Studio for Eclipse

I’ve been making updates to the code. Now I need to check them into SVN. Since I have the SCPlugin installed, I simply use Finder, right-click on the top folder(s), and select ‘Subversion Commit…’. This recursively lists all files that have changed, and checks them in.

So now I’m wondering how to work with Subversion from within Zend Studio for Eclipse (ZSE).

It appears at this point that I’ve made a mistake by installing Subclipse. It appears that Subversive comes already installed with Zend Server CE, so now I see two ‘SVN’s listed in various places. It isn’t readily apparent that either is better than the other, so I’m going to uninstall Subclipse to avoid confusion. So now my Project Configuration shows:
Subversion Client Adapter (Required) 1.6.0.2
Subversion JavaHL Native Library Adapter (Required) 1.6.2.1
Subversive SVN Team Provider (Incubation) 0.7.7.I20090224-1900
SVNKit Library 1.3.0.5847

This appears to have fixed things. So now in the PHP Explorer I see a symbol to the left of each file if the file is out-of-sync with the repository, and a version number to the right of it. Right clicking on any file gives me all the subversion options under the ‘Team’ menu item, and Compare With and Replace With give me options for working with the repository. This is very cool.