category_name=articles%2Fhowto
Capturing AirPort Extreme Log with Lion Server Syslog
August 9, 2011 | Comments Off
Mac OS X Lion Server can be used as a syslog server to capture the log messages from an Apple AirPort Extreme wireless router. The instructions below walk you through setting this up.
Syslog is controlled by a plist file found in the launch daemons directory. The full path to the file is:
/System/Library/LaunchDaemons/com.apple.syslogd.plist
You need to edit this file to add a network listener. The plist is stored in a binary format so you need to use the plutil to convert it to XML using this command:
$ pushd /System/Library/LaunchDaemons $ sudo plutil -convert xml1 /System/Library/LaunchDaemons/com.apple.syslogd.plist $ sudo vim /System/Library/LaunchDaemons/com.apple.syslogd.plist $ sudo plutil -convert binary1 /System/Library/LaunchDaemons/com.apple.syslogd.plist $ sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist $ sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
Here is a complete example of the modified plist file. The new key is the NetworkListener. Be sure you add it nested inside the Sockets key or it will not work.
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict> <key>EnableTransactions</key> <true/> <key>EnvironmentVariables</key> <dict> <key>ASL_DISABLE</key> <string>1</string> </dict> <key>HopefullyExitsLast</key> <true/> <key>JetsamProperties</key> <dict> <key>JetsamMemoryLimit</key> <integer>300</integer> <key>JetsamPriority</key> <integer>-49</integer> </dict> <key>Label</key> <string>com.apple.syslogd</string> <key>MachServices</key> <dict> <key>com.apple.system.logger</key> <true/> </dict> <key>OnDemand</key> <false/> <key>ProgramArguments</key> <array> <string>/usr/sbin/syslogd</string> </array> <key>Sockets</key> <dict> <key>NetworkListener</key> <dict> <key>SockServiceName</key> <string>syslog</string> <key>SockType</key> <string>dgram</string> </dict> <key>AppleSystemLogger</key> <dict> <key>SockPathMode</key> <integer>438</integer> <key>SockPathName</key> <string>/var/run/asl_input</string> </dict> <key>BSDSystemLogger</key> <dict> <key>SockPathMode</key> <integer>438</integer> <key>SockPathName</key> <string>/var/run/syslog</string> <key>SockType</key> <string>dgram</string> </dict> </dict></dict></plist>
Once you have updated the plist the next step is to update the configuration of your AirPort Extreme. Under Applications => Utilities open the AirPort Utility and connect to your AirPort Extreme. On the Advanced tab select the “Logging & Statistics” panel. Enter the IP address of your Mac OS X Lion Server in “Syslog Destination Address:” and select “6 – Informational” for the “Syslog Level:”. You can see a screenshot of the AirPort Utility settings below. Update the settings on the AirPort Extreme.
Now, you probably want to verify that the logging is actually happening. Open Console.app on your server and look at “All Messages”. While looking at the logs go to another machine (I used my MacBook Air with a wireless connection to the AirPort Extreme) and open System Preferences and then Network. Select your network adapter and ask for it to renew the DHCP lease. You should see some activity in the log.
Another way to verify the logging is to turn wifi off on your laptop. You should see a message like this:
8/9/11 8:43:09.000 AM 80211: Disassociated with station 60:33:4b:2c:de:c0
When you turn wifi back on you will see something similar to this:
8/9/11 8:43:10.000 AM 80211: Rotated TKIP group key. 8/9/11 8:43:21.000 AM 80211: Associated with station 60:33:4b:2c:de:c0 8/9/11 8:43:21.000 AM 80211: Authenticating station 60:33:4b:2c:de:c0 to RADIUS. 8/9/11 8:43:21.000 AM 80211: Installed unicast CCMP key for supplicant 60:33:4b:2c:de:c0 8/9/11 8:43:21.000 AM natpmp: Binding added for udp, 173.164.164.17:32770 to 10.0.1.104:4500 with lifetime 7200 8/9/11 8:43:21.000 AM natpmp: Binding added for udp, 173.164.164.17:32771 to 10.0.1.104:5353 with lifetime 7200
That’s it. You now have syslog data being captured on your Mac OS X Lion server from your AirPort Extreme base station!
Setting up my Snow Leopard Ruby 1.9.2, Ruby on Rails 3.0, Nginx, Passenger development environment
November 14, 2010 | Comments Off
Snow Leopard ships with Ruby 1.8.7 installed and an older version of Ruby Gems. I am planning on doing some projects with Ruby on Rails and wanted to setup a current environment. My requirements were:
- Ruby 1.9.2
- Rails 3.0
- PostgreSQL 9.0
- Nginx
- Passenger
You should download and install the Mac version of PostgreSQL 9.0 from the folks at EnterpriseDB. You will need to register on the site in order to do the download. Be sure to download PostgreSQL 9.0.1, not one of their Plus packages. It is a nicely packaged installer for the freely available version of Postgres.
Once you install this software you should have a file called pg_env.sh in the /Library/PostgreSQL/9.0/ directory. This file should be added to your /etc/profile. Here is an example of what mine looks like:
# System-wide .profile for sh(1)
# This has to be set to something in order for path_helper (below)
# to update it with paths found in the /etc/manpaths.d directory.
MANPATH=/usr/local/share/man; export MANPATH
# Setup the PostgreSQL environment.
. /Library/PostgreSQL/9.0/pg_env.sh
if [ -x /usr/libexec/path_helper ]; then
eval `/usr/libexec/path_helper -s`
fi
if [ "${BASH-no}" != "no" ]; then
[ -r /etc/bashrc ] && . /etc/bashrc
fi
Be sure to log out and log back in before continuing with these instructions. This is important to make sure your PostgreSQL environment variables are set properly.
One of my goals with this setup is to keep everything independent of the default tools that ship with Snow Leopard. To do this I decided that all of my Ruby on Rails setup will be located in the /usr/local/ror directory tree. Here is a script I developed to setup my Ruby on Rails development environment.
#!/bin/bash # Get and extract a copy of LibYAML curl http://pyyaml.org/download/libyaml/yaml-0.1.3.tar.gz > yaml-0.1.3.tar.gz tar xvf yaml-0.1.3.tar.gz # Build LibYAML ( cd yaml-0.1.3 ./configure make sudo make install ) # Get and extract a copy of Ruby 1.9.2 curl ftp://ftp.ruby-lang.org:21//pub/ruby/1.9/ruby-1.9.2-p0.tar.gz > ruby-1.9.2-p0.tar.gz tar xvf ruby-1.9.2-p0.tar.gz # Build Ruby 1.9.2 ( cd ruby-1.9.2-p0 ./configure --prefix=/usr/local/ror --with-arch=x86_64 --enable-shared make make test sudo make install ) # Update Ruby Gems sudo gem update --system # Install Gems sudo gem install rails sudo gem install sqlite3-ruby sudo gem install pg sudo gem install passenger # Configure Passenger for Nginx (downloads Nginx and PCRE automatically) sudo passenger-install-nginx-module --prefix=/usr/local/ror --auto-download --auto
Download the script, un-tar it and place it in any directory you want. I call the script doit.sh, but you can name it anything you like. Run the script using the command shown below.
$ sh ./doit.sh
Once the script completes you need to add /usr/local/ror/bin to your path. I did this by editing my /etc/paths file. Here is a copy of the file on my machine:
usr/local/ror/bin /usr/local/bin /usr/bin /bin /usr/sbin /sbin
One more logout/login and you are done. Have fun playing with Ruby on Rails on your Mac!
MacBook Pro Development Environment
October 1, 2010 | 6 Comments
This article covers the steps I went through to setup my MacBook Pro for Google App Engine (GAE) development. I am using the Python runtime in GAE so the focus here is on a Python development environment.
Python
Setting Python 2.5 as Default
My MacBook Pro is running Snow Leopard. I am planning to host my projects on Google App Engine and it requires Python 2.5. Snow Leopard ships with Python 2.6 as the default. You can switch to Python 2.5 using a few simple commands, as follows:
$ defaults write com.apple.versioner.python Version 2.5 $ sudo defaults write /Library/Preferences/com.apple.versioner.python Version 2.5
After issuing these commands you should logout and login, launch a Terminal window and issue the command
$ python --version
It should report Python 2.5.4 as the result. If it still says Python 2.6.1 then your change did not take effect. To troubleshoot the problem start with man python. It includes information on how to switch the default version of Python on your system.
Additional Python Modules
Google App Engine expects that the ssl module is installed. This is so it can verify the identity of the GAE servers when trying to deploy your projects. Install it like this:
$ curl http://pypi.python.org/packages/source/s/ssl/ssl-1.15.tar.gz --output ssl-1.15.tar.gz $ tar xvf ssl-1.15.tar.gz $ cd ssl-1.15 $ sudo python setup.py install
If you want to use the GAE image manipulation classes while running on the local development server you will need to install PIL using the following command.
$ sudo easy_install pil
The following will be necessary for building some other python libraries later in the process.
$ sudo easy_install docutils
The following modules are necessary if you choose to install IPython (see next section). If you are planning on skipping the IPython installation these can be skipped as well.
$ sudo easy_install readline $ sudo easy_install nose $ sudo easy_install pexpect
IPython
The IPython interactive interpreter is a good addition to your Python development environment. It does not come pre-installed on Snow Leopard. You can download the latest stable version using this command:
$ curl http://ipython.scipy.org/dist/0.10/ipython-0.10.tar.gz --output ipython-0.10.tar.gz $ tar -xzf ipython-0.10.tar.gz $ cd ipython $ sudo python setup.py install
Google App Engine SDK
The Google App Engine SDK for Python is available at http://code.google.com/appengine/downloads.html. As of this writing you can use the following command to grab the latest version:
$ curl http://googleappengine.googlecode.com/files/GoogleAppEngineLauncher-1.3.7.dmg --output GoogleAppEngineLauncher-1.3.7.dmg
Once you download the dmg file open it in Finder and run the installer. It will place all of the necessary files on your machine. Once complete locate the GoogleAppEngineLauncher.app icon in Finder and double-click on it. This application provides a nice UI for managing your GAE projects.
Source Code Management Tools
Git
I am planning on managing the source code for my projects with git and will store my master repositories on http://github.com. Apple does not include a copy of git on the machine by default. An installer is available at http://help.github.com/mac-git-installation/. While you are at it also create an account on github if you don’t already have one. It is useful for social coding in the wider open-source community.
Mercurial
Some of the Django open source software I plan on using is maintained using a distributed source control management tool called Mercurial. An installer for this is available at http://mercurial.selenic.com. Download and install the software.
$ curl http://mercurial.selenic.com/release/mercurial-1.6.3.tar.gz --output mercurial-1.6.3.tar.gz $ tar xvf mercurial-1.6.3.tar.gz $ cd mercurial-1.6.3 $ make PREFIX=/System/Library/Frameworks/Python.framework/Versions/2.5 all $ sudo make PREFIX=/System/Library/Frameworks/Python.framework/Versions/2.5 install $ hg version
Django-nonrel
I plan on implementing my web applications on top of the Django framework. Some modifications are required in order for this framework to run properly on GAE since Google uses Big Table for data storage instead of a relational database. Everything necessary to get Django working in GAE is included as part of the Django-nonrel project. Specific instructions for GAE are available at http://www.allbuttonspressed.com/projects/djangoappengine.
Use the commands listed below to install copies of all the necessary components onto your machine. Everything will be stored in a folder called DjangoStuff under your home directory.
$ mkdir $HOME/DjangoStuff $ cd $HOME/DjangoStuff $ hg clone https://bitbucket.org/wkornewald/django-nonrel $ hg clone https://bitbucket.org/wkornewald/djangoappengine $ hg clone https://bitbucket.org/wkornewald/djangotoolbox $ hg clone https://bitbucket.org/wkornewald/django-dbindexer $ hg clone https://bitbucket.org/wkornewald/django-testapp
Now, pick another folder where you want to setup a practice application. I am calling mine cs-practice since this is also the name of my Google App Engine application.
Use the following commands to configure the practice application for Django-nonrel development.
$ mkdir $HOME/cs-practice $ cd $HOME/cs-practice $ ln -s $HOME/DjangoStuff/django-nonrel/django django $ ln -s $HOME/DjangoStuff/djangoappengine djangoappengine $ ln -s $HOME/DjangoStuff/djangotoolbox/djangotoolbox djangotoolbox $ ln -s $HOME/DjangoStuff/django-dbindexer/dbindexer dbindexer $ cp -r $HOME/DjangoStuff/django-testapp/* .
Once you have the practice folder setup you need to edit the app.yaml file and change the application name to reflect the Google App Engine application name you selected when registering on http://appengine.google.com.
HOWTO: Answer the question “Is {some site} up or down?”
June 28, 2009 | Comments Off
I just stumbled on a very cool service that helps you answer the question “Is {some site} up or down?” It couldn’t be simpler. Visit http://downforeveryoneorjustme.com and you will see a very simple form that looks like this:
Enter the name of a site and the folks running the site will go check and see if it is possible to visit the site from their location on the net. If the site is reachable you will see something like this:
If it is not reachable you will see something like this:
Setting up Unit Testing in Xcode 3.1
July 28, 2008 | 2 Comments
Xcode includes OCUnit, so you don’t need to get a copy. But, you might want to take a look at their website (http://sente.epfl.ch/software/ocunit/) for information and tutorials on how OCUnit is intended to be used.
If you are planning on doing Test Driven Development (TDD) you may also want to get the following packages:
- OCMock – OCMock is an Objective-C implementation of mock objects. (http://www.mulle-kybernetik.com/software/OCMock/)
- Hamcrest – library of matchers for building test expressions (http://code.google.com/p/hamcrest/)
Other good articles on Xcode Unit Testing that I came across:
- Unit Testing with OCUnit – http://www.macdevcenter.com/pub/a/mac/2004/04/23/ocunit.html?page=1
- Test Driving Your Code with OCUnit – http://developer.apple.com/tools/unittest.html
- Xcode unit testing articles – http://chanson.livejournal.com/tag/unit+testing
- Unit Testing with Xcode – http://www.stiefels.net/2007/05/01/unit-testing-with-xcode/
By reading through the documents references above I was able to get OCUnit up and running for one of my projects. It took a bit of experimentation, but in the end it looks like OCUnit will work just fine for doing TDD in Xcode with Objective-C. Anyone wanting to try out TDD should give it a try. The benefits for your project are significant. Go for it!
Use QImage to create a composite image (i.e. One image with another overlaid on top of it.)
March 19, 2008 | Comments Off
Today I wanted to combine two images of similar size to create a new image. The new image was going to be used for a toolbar button. I have purchased a set of commercial images in the PNG format for use on application toolbars. The set came with a bunch of overlay images that could be used to modify each of the base images. The overlays included things like arrows, warning signs, arrows, people, etc. My first though for using these images was to fire up Adobe Illustrator and just create a new icon by merging the base and overlay together. Then I realized that Qt could do the job for me at runtime, and with a little work I could dynamically overlay different badges on a base icon.
The code below can be used to construct a composite image. You pass in references to a base image and an overlay image. These images are used to construct a third image, and that is returned to the caller.
QImage createImageWithOverlay(const QImage& baseImage, const QImage& overlayImage)
{
QImage imageWithOverlay = QImage(baseImage.size(), QImage::Format_ARGB32_Premultiplied);
QPainter painter(&imageWithOverlay);
painter.setCompositionMode(QPainter::CompositionMode_Source);
painter.fillRect(imageWithOverlay.rect(), Qt::transparent);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawImage(0, 0, baseImage);
painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
painter.drawImage(0, 0, overlayImage);
painter.end();
return imageWithOverlay;
}
Here is an example of using this routine to create an image that might be used to represent something being transfered from a network attached machine.
QImage baseImage(":/Resources/connect_pc_64.png");
QImage overlayLogoff(":/Resources/overlay_arrow_east_64.png");
QImage logoffImage = createImageWithOverlay(baseImage, overlayLogoff)
The two source images and resulting composite are shown below.
- :/Resources/connect_pc_64.png
- :/Resources/overlay_arrow_east_64.png
- Generated Composite Image



HOWTO – Use Visual Studio 2005 for Qt Open Source Development
February 14, 2006 | Comments Off
THIS IS A WORK IN PROGRESS. EXPECT UPDATES AND DON’T BE SURPRISED BY INCOMPLETE INFORMATION
Trolltech has released Qt 4 under a dual-license for all supported platforms. In earlier versions of Qt they only released the open source version for Mac and Linux, leaving Windows developers with no choice but to purchase a commercial license. That all changed with the release of Qt 4 when Trolltech started to provide an open source version for Windows development too! The only catch was that Trolltech only supports the MinGW GCC compiler for development using the open source version.
This article describes how to patch Qt 4 open source edition on Windows so you can develop using Visual Studio 2005. You can even develop using the free Express edition of Visual Studio 2005 so long as you also install the latest Platform SDK.
Please keep in mind that these patches and tips are not provided so you can get around the very generous Trolltech dual-license terms of use. If you are developing or intend to develop a commercial application using Qt 4 you must purchase a commercial license for Qt 4. Only use the information provided in this article if you wish to develop open source GPL software for the Windows platform and wish to use the Microsoft Visual C++ 2005 compiler instead of the MinGW GCC compiler.
Download Qt 4.1 Source Code, Patches, and Notes
- Download the latest open source Windows version of Qt 4.1 from Trolltech at http://www.trolltech.com/download/qt/windows.html. Unzip the file to C:\. It will extract all of the files into a sub-directory called qt-win-opensource-src-4.1.0.
- Download the latest patch file used to modify the open source version of Qt 4.1 to support Microsoft Visual Studio 2005 from Source Forge at http://sourceforge.net/projects/qtwin/. Unzip the file to C:\qt-win-opensource-src-4.1.0.
- Download the build script, environment setup and notes from http://www.idevelopsoftware.com/downloads/qt/Qt41WinBuildScript.zip. Unzip the file to C:\qt-win-opensource-src-4.1.0.
- If you don’t already have Visual Studio 2005 you can download the Express edition. You will also need to download the Platform SDK.
http://msdn.microsoft.com/vstudio/express/visualC/default.aspx
http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/default.aspx
Building Qt 4.1 using Visual C++ 2005
Open C:\qt-win-opensource-src-4.1.0 in Windows Explorer.
Double-click on the “Qt 4.1 Command Prompt” shortcut to open a Command Prompt window with the environment setup for Qt 4.1 development. IMPORTANT: You must already have Visual Studio 2005 installed. You may need to edit setenv.cmd if your copy of Visual Studio 2005 is not in the default location.
Run “installpatch41.bat”
This will patch the Qt 4.1 source code so it builds properly using the Visual C++ 2005 compiler.
Run “build.cmd”
This will build all of the Qt 4.1 libraries, utilities, and sample applications using the Visual C++ 2005 compiler.
To rebuild, if necessary, make sure to first clean up the previous build. Do this by running
nmake distclean
from the C:\qt-win-opensource-src-4.1.0 directory.
External Tools Configuration in Visual Studio 2005
Launch Visual Studio 2005 and select the “External Tools…” item from the Tools menu.
Use the “Add button to define each of the following external tools:
Title ……………….. QMake (Project File Generation Mode)
Command ……………… D:\qt-win-opensource-src-4.1.0\bin\qmake.exe
Arguments ……………. -project -spec win32-msvc2005
Initial directory …….. $(ProjectDir)
Use Output window …….. [X]
Treat output as Unicode .. [ ]
Prompt for arguments ….. [ ]
Close on exit ………… [X]
Title ……………….. QMake (Makefile Generation Mode)
Command ……………… D:\qt-win-opensource-src-4.1.0\bin\qmake.exe
Arguments ……………. -makefile -spec win32-msvc2005
Initial directory …….. $(ProjectDir)
Use Output window …….. [X]
Treat output as Unicode .. [ ]
Prompt for arguments ….. [ ]
Close on exit ………… [X]
Title ……………….. Qt Designer
Command ……………… D:\qt-win-opensource-src-4.1.0\bin\designer.exe
Arguments …………….
Initial directory …….. $(ProjectDir)
Use Output window …….. [ ]
Treat output as Unicode .. [ ]
Prompt for arguments ….. [ ]
Close on exit ………… [ ]
Title ……………….. Qt Assistant
Command ……………… D:\qt-win-opensource-src-4.1.0\bin\assistant.exe
Arguments …………….
Initial directory …….. $(ProjectDir)
Use Output window …….. [ ]
Treat output as Unicode .. [ ]
Prompt for arguments ….. [ ]
Close on exit ………… [ ]
Adding a Qt 4.1 Development Toolbar
Add a new toolbar for Qt 4.1 Development by selecting “Customize…” from the Tools menu. Once the “Customize” dialog appears select the “Toolbars” tab and press “New…” For the toolbar name enter “Qt 4.1 Development” and press “OK”.
Select the “Commands” tab on the “Customize” dialog. Select “Tools” from the “Categories:” list. Scroll down in the “Commands:” list until you see “External Command 7″. Drag commands 7, 8, 9, and 10 onto the new “Qt 4.1 Development” toolbar.
Creating a New Visual Studio 2005 Project
Open the “New Project” dialog by selecting File->New->Project… from the menu. Under “Project types” on the left side of the dialog expand “Visual C++” and then select “General.” The right side of the dialog will display a list of all the general project types. Select “Makefile Project” from the list of project types. Provide a name for the project and set the location on disk where you wish the project to be saved. Be sure not to check “Create directory for solution”, as this will create an extra level of directories that is just confusing. Click the “OK” button and you will be presented with the “Makefile Application Wizard.” Simply press the “Finish” button on the first page of the wizard.
Once the project has been created and opened, set the NMake Configuration Properties for the project as shown below. In the “Solution Explorer” right-click on the name of your project. Select “Properties…” from the context menu. On the property pages dialog select “Configuration Properties” and “NMake” on the left side tree control. On the right side, enter the following information, making sure to set the properties for both the debug and release configurations.
Release Configuration Settings
General
——-
Build Command Line …………………. nmake release-all
Rebuild All Commaond Line …………… nmake release-clean release-all
Clean Command Line …………………. nmake release-clean
Output ……………………………. foo.exe
IntelliSense
————
Common Language Runtime Support ……… No Common Language Runtime support
Preprocessor Definitions ……………. WIN32;NDEBUG;UNICODE;QT_LARGEFILE_SUPPORT;QT_DLL;
QT_GUI_LIB;QT_CORE_LIB;QT_THREAD_SUPPORT
Include Search Path ………………… “c:/qt-win-opensource-src-4.1.0/include/QtCore”;
“c:/qt-win-opensource-src-4.1.0/include/QtGui”;
“c:/qt-win-opensource-src-4.1.0/include”;
“c:/qt-win-opensource-src-4.1.0/include/ActiveQt”;
“c:/qt-win-opensource-src-4.1.0/mkspecs/win32-msvc2005″
Forced Includes …………………….
Assembly Search Path ………………..
Forced Using Assemblies ……………..
Debug Configuration Settings
General
——-
Build Command Line …………………. nmake debug-all
Rebuild All Commaond Line …………… nmake debug-clean debug-all
Clean Command Line …………………. nmake debug-clean
Output ……………………………. food.exe
IntelliSense
————
Common Language Runtime Support ……… No Common Language Runtime support
Preprocessor Definitions ……………. WIN32;_DEBUG;UNICODE;QT_LARGEFILE_SUPPORT;QT_DLL;
QT_GUI_LIB;QT_CORE_LIB;QT_THREAD_SUPPORT
Include Search Path ………………… “c:/qt-win-opensource-src-4.1.0/include/QtCore”;
“c:/qt-win-opensource-src-4.1.0/include/QtGui”;
“c:/qt-win-opensource-src-4.1.0/include”;
“c:/qt-win-opensource-src-4.1.0/include/ActiveQt”;
“c:/qt-win-opensource-src-4.1.0/mkspecs/win32-msvc2005″
Forced Includes …………………….
Assembly Search Path ………………..
Forced Using Assemblies ……………..
QMake Project Settings
Create a project file called “foo.pro” in the directory for your makefile project. Replace the name “foo.pro” with the name of your actual application. Place the file in the directory where your Visual Studio project was created. To start with, the contents might look something like this:
CONFIG += qt
TEMPLATE = app
SOURCES += foo.cpp
HEADERS += foo.h
FORMS += foo.ui
You should be off and running now. For more detailed information I would suggest reading the qmake reference manual. You might also want to take a look at the Qt 4.1 tutorials in Qt Assistant. Have fun!



