How to install wxPython 2.9.4 on Fedora

Install the dependencies

sudo yum install make automake gcc gcc-c++ kernel-devel gtk2-devel gtkglext-devel gstreamer-plugins-base-devel python-devel webkitgtk

Download the source

wget http://downloads.sourceforge.net/project/wxpython/wxPython/2.9.4.0/wxPython-src-2.9.4.0.tar.bz2
tar xvjf wxPython-src-2.9.4.0.tar.bz2

Download and apply the wxPython 2.9.4.1 patch

http://downloads.sourceforge.net/project/wxpython/wxPython/2.9.4.0/wxPython-src-2.9.4.1.patch
patch -p 0 -d wxPython-src-2.9.4.0/ < wxPython-src-2.9.4.1.patch

Configure and Build wxWidgets

cd ~/wxPython-src-2.9.4.0/bld
../configure --prefix=/usr/local

Build wxPython

sudo python build-wxpython.py --build_dir=../bld --wxpy_installdir=/usr --installdir=/usr

Set your PYTHONPATH variable to ~/wxPython-src-2.9.4.0/wxPython
Set your LD_LIBRARY_PATH to ~/wxPython-src-2.9.4.0/bld/lib

Note: This setup has been tested to work on Fedora 17.

How to install AT&T Global Network Client on Fedora 16

First, download the AT&T Global Network Client from ftp://ftp.attglobal.net/pub/custom/ibm_linux/.

If you try to install this using

rpm -ivh agnclient-1.0-2.0.1.3003.i386

you will get an error similar to:

failed to install file:
agnclient-1.0-2.0.1.3003.i386 requires libcrypto.so.4
agnclient-1.0-2.0.1.3003.i386 requires libssl.so.4

To solve this error, create a symbolic link for the missing modules by executing commands similar to this as root:

ln -s /usr/lib/libssl.so /usr/lib/libssl.so.4
ln -s /usr/lib/libcrypto.so /usr/lib/libcrypto.so.4

Proceed with the installation:

rpm -ivh --nodeps agnclient-compat-1.0-3.oc2.i386.rpm agnclient-1.0-2.0.1.3003.i386.rpm

If you try to run it at this point, you will get this error:

The AT&T Global Network Client daemon (agnclientd) is not running. It must be running to create a VPN connection. Please restart your computer or manually restart the daemon.

To solve this, execute the following command as root or just restart your computer:

/etc/init.d/agnclientd start

Note: This instruction also works for Fedora 14, and 15.

Fedora 16 pre/post-installation setup

This is pretty much the same as my post for Fedora 15, but I modified some details to make sure everything is relevant for Fedora 16.

I also converted the steps that requires downloading and installing into one executable command, whenever possible. I also added the -y option to the yum commands so we can skip the questions if we really want to install the packages since most of the time we type ‘yes’ anyway.

These are the packages I chose during the pre-installation setup:

Applications

  • Design Suite (contains GIMP and OptiPNG, plus more)
  • Office/Productivity (contains LibreOffice)
  • Sound & Video (checked k3b)

Development

  • Development Tools (checked cmake and PyLint)
  • Java Development

Servers

  • Mail Server (SendMail)
  • MySQL Database (checked php-mysql)
  • PostgreSQL Database
  • Printing Support
  • Server Configuration Tools
  • Web Server (mod_python, mod_ssl, php, php-ldap)

Base System

  • Administration Tools
  • System Tools

And here’s my post-installation setup:

Update

Updating for the first time also installs the GPG keys, which are needed so you won’t get errors regarding unsigned packages when you use the “fedora” and “updates” repositories of Fedora. In our terminal, as root, type:

yum -y update

RPM Fusion

From the RPM Fusion website site:

RPM Fusion provides software that the Fedora Project or Red Hat doesn’t want to ship. That software is provided as precompiled RPMs for all current Fedora versions and Red Hat Enterprise Linux 5; you can use the RPM Fusion repositories with tools like yum and PackageKit.

RPM Fusion is a merger of DribbleFreshrpms, and Livna; our goal is to simplify end-user experience by grouping as much add-on software as possible in a single location.

To install both the free and non-free repositories, simply download and double-click the RPM Fusion free for Fedora 14, 15 and 16 and RPM Fusion nonfree for Fedora 14, 15 and 16 from the RPM Fusion Configuration page.

Google Chrome

yum -y install lsb # dependency
rpm -ivh http://dl.google.com/linux/direct/google-chrome-stable_current_i386.rpm

Mozilla Firefox

Firefox add-ons that use.

Azureus

This is what I use to download torrents.

yum -y install azureus

p7zip

For operating with the 7z file archiving format.

yum -y install p7zip

Filezilla

For transfering files between machines.

yum -y install filezilla

pgadmin3

For PostgreSQL database administration.

yum -y install pgadmin3

VLC

For watching videos without worrying about the file formats:

yum -y install vlc

Unrar

For extracting RAR file archives.

yum -y install unrar

Grip

CD-ripper with database lookup/submission to share track information over the net, supports OGG and FLAC and adding ID3v1/v2 to MP3s.

yum -y install grip

Skype

rpm -ivh http://www.skype.com/go/getskype-linux-beta-fc10

PulseCaster

This is what I use for recording Skype calls.

yum -y install pulsecaster

vsftpd

Secure, fast FTP server

yum -y install vsftpd

Alacarte

To create custom application launchers in Gnome 3.

yum -y install alacarte

PHP

Some PHP modules that I need for web development.

yum -y install php-gd php-mbstring php-pgsql php-xml

MySQL Workbench

For designing databases visually.

yum -y install mysql-workbench

Calibre

For converting e-books to different formats and for managing your e-book collection.

yum -y install calibre

chmsee

HTML Help viewer for Unix/Linux (for viewing .chm files).

yum -y install chmsee

Development files for Qt toolkit

To develop applications using the Qt toolkit. And include the graphical configuration tool as well.

yum -y install qt-devel qt-config

GStreamer non-free plugins

From the Fedora Unity Project:

GStreamer is a multimedia framework used by many media players including rhythmbox, banshee, totem, listen, exaile and others. Due to legal issues support for various non-free formats , including mp3 files, aren’t included with GStreamer by default. You can add support for mp3 and other formats by installing an add-on package from the third party repository rpm.livna.org

yum -y install gstreamer-plugins-bad gstreamer-plugins-ugly gstreamer-ffmpeg phonon-backend-gstreamer

FFMpeg

yum -y install ffmpeg ffmpeg-libs

DVD playback

yum -y install libdvdread libdvdnav lsdvd

JavaHL

To avoid this error in Eclipse and Aptana.

yum -y install subversion-javahl

Oracle JDK

Download and install the Java SE SDK RPM from the Java SE Downloads page

rpm -ivh http://download.oracle.com/otn-pub/java/jdk/7u1-b08/jdk-7u1-linux-i586.rpm

Then setup Java JDK java, libjavaplugin.so (for Firefox), javac, and jar using alternatives –install:

alternatives --install /usr/bin/java java /usr/java/jdk1.7.0_01/jre/bin/java 20000
alternatives --install /usr/lib/mozilla/plugins/libjavaplugin.so  libjavaplugin.so /usr/java/jdk1.7.0_01/jre/lib/i386/libnpjp2.so 20000
alternatives --install /usr/bin/javac javac /usr/java/jdk1.7.0_01/bin/javac 20000
alternatives --install /usr/bin/jar jar /usr/java/jdk1.7.0_01/bin/jar 20000

Add the following JAVA_HOME environment variable to /etc/profile:

export JAVA_HOME="/usr/java/jdk1.7.0_01"

Aptana

Download and extract Aptana 3 from http://www.aptana.com/.

wget http://download.aptana.com/studio3/standalone/3.0.6/linux/Aptana_Studio_3_Setup_Linux_x86_3.0.6.zip
unzip Aptana_Studio_3_Setup_Linux_x86_3.0.6.zip

GnomeTweakTool

Customize advanced GNOME 3 options and easily change the font sizes for applications, documents and windows.

yum -y install gnome-tweak-tool

After installing TweakTool, I customized my fonts as follows:

  • Document font: Sans 10
  • Monospace font: Monospace 10
  • Window title font: Cantarell 10

Startup services

Make sure Httpd and MySQL starts up on boot.

chkconfig --levels 235 httpd on
systemctl start mysqld.service
systemctl enable mysqld.service

Make personal user space accessible to apache user

First, add apache user to user group. Execute a command similar to this:

usermod -a -G randell apache

Then modify the permissions of the user directory with:

chmod 770 /home/randell/

File Management Preferences

From a Nautilus window, go to Edit > Preferences. I modified mine to reflect the following changes:

  • Default View > View new folders using: List View
  • Icon View Defaults > Default zoom level: 66%
  • List View Defaults > Default zoom level: 33%

Favorites

I customized my Favorites to include these frequently used applications:

  • Chrome
  • Firefox (added by default)
  • Terminal
  • gedit
  • Files (added by default)
  • Rhythmbox
  • Take Screenshot

Terminal

Edit > Profile Preferences > Colors > Foreground and Background

  • Use colors from system theme: Unchecked
  • Built-in schemes: Green on black

Text Editor

Edit > Preferences

  • View
    • Display line numbers: Checked
    • Display right margin at column: 80
    • Highlight current line: Checked
    • Highlight matching brackets: Checked
  • Editor
    • Tab Stops
      • Tab width: 4
      • Insert spaces instead of tabs: Checked
      • Enable automatic indentation: Checked
    • File Saving
      • Create a backup of files before saving: Unchecked
      • Autosave files every: 5 minutes
    • Font & Colors > Color Scheme: Oblivion

How to create custom application launchers in Gnome 3

Back in Gnome 2, we can simply right-clicked on a panel and chose “Create custom launcher” to create custom application launchers. But since the advent of Gnome 3, the panels where we add our frequently-used applications have been replaced with the Dash.

Alacarte is a graphical menu editor that lets you edit, add, and delete menu entries. It follows the freedesktop.org menu specification and should work with any desktop environment that uses this specification.

Alacarte is the same menu editor that was available in Gnome 2. The only difference is the way we open it. In Gnome 3, we now select it from the App List.

But first we need to install Alacarte. As root, execute the following command in your terminal:

yum install alacarte

Run Alacarte by searching and clicking it from the Applications menu (it shows up as Main Menu) or executing it from the command line. Doing so should show you this familiar window:

Alacarte - Main Menu

Alacarte - Main Menu

Choose the menu where you want your application to fall under and then click the New Item button.

Alacarte - Create Launcher

Alacarte - Create Launcher

In this example, I used the details for the SpringSource Tool Suite, which I just installed, replacing the icon with that of STS (icon.xpm), and pointing the Command to the STS executable file. Then click OK.

Alacarte - Create Launcher with details

Alacarte - Create Launcher with details

That’s it. We’ve created our application launcher. To verify, we can search the STS application launcher we created from the App List.

Gnome 3 Application Search

Gnome 3 Application Search

If you think you’re going to use the launcher frequently, you can simply right-click on it and select Add to Favorites to add it in the Dash.

Gnome 3 - Add to Favorites

Gnome 3 - Add to Favorites

Voila! The launcher is now available from the Dash.

The Dash containing the new application launcher

The Dash containing the new application launcher

Fix for “Aw, Snap!” when loading Twitter on Chrome on Fedora 15 with SELinux enforcing enabled

Good thing I found the fix in the Chromium issues list because I was already tempted to disable SELinux altogether.

Daniel Walsh explains:

We are trying to control what the chrome-sandbox is allowed to do, since it is setuid. The bug that you are seeing is caused by a file/directory being created in the homedir with the wrong label on it. In F15 we did not have policycoreutils-restorecond installed by default, which would have fixed the mislabeled directory. We can add this to a comps file to make sure it gets installed in the future. In F16 we have the ability to label these files/directories correctly on creation.

The quick fix is to execute the following command:

restorecon -R ~/.config

The command also solves the problem where the Xmarks Bookmarks Synchronizer and Delicious Bookmarks Extensions keeps on crashing on Chrome on Fedora 15.

Fedora 15 pre/post-installation setup

I have mentioned in my previous post containing GNOME 3 screenshots (which I should say is a thing of beauty) that I’ve installed Fedora 15.

During the pre-installation customization page, I clicked some of the familiar items that I would normally install eventually:

Applications

  • Design Suite (contains GIMP and OptiPNG, plus more)
  • Office/Productivity (contains LibreOffice)
  • Sound & Video (checked Amarok)

Development

  • Development Tools (checked cmake and PyLint)
  • Fedora Eclipse
  • Java Development
  • Web Development (checked Django)

Servers

  • Mail Server (SendMail)
  • MySQL Database (checked php-mysql)
  • PostgreSQL Database
  • Printing Support
  • Server Configuration Tools
  • Web Server (mod_python, mod_ssl, php, php-ldap)

Here’s my post-installation setup:

Update

Updating for the first time also installs the GPG keys, which are needed so you won’t get errors regarding unsigned packages when you use the “fedora” and “updates” repositories of Fedora. In our terminal, as root, type:

yum update

RPM Fusion

From the RPM Fusion website site:

RPM Fusion provides software that the Fedora Project or Red Hat doesn’t want to ship. That software is provided as precompiled RPMs for all current Fedora versions and Red Hat Enterprise Linux 5; you can use the RPM Fusion repositories with tools like yum and PackageKit.

RPM Fusion is a merger of DribbleFreshrpms, and Livna; our goal is to simplify end-user experience by grouping as much add-on software as possible in a single location.

To install both the free and non-free repositories, simply download and double-click the RPM Fusion free for Fedora Rawhide and what will become Fedora 15 (Alpha, Beta and snapshots) and RPM Fusion nonfree for Fedora Rawhide and what will become Fedora 15 (Alpha, Beta and snapshots) from the RPM Fusion Configuration page.

Google Chrome

Download the rpm file from the Chrome download page. Installing it is as easy as double-clicking the file.

Mozilla Firefox

Firefox add-ons that use.

Azureus

This is what I use to download torrents.

yum install azureus

p7zip

For operating with the 7z file archiving format.

yum install p7zip

Filezilla

For transfering files between machines.

yum install filezilla

pgadmin3

For PostgreSQL database administration.

yum install pgadmin3

VLC

For watching videos without worrying about the file formats:

yum install vlc

Unrar

For extracting RAR file archives.

yum install unrar

Grip

CD-ripper with database lookup/submission to share track information over the net, supports OGG and FLAC and adding ID3v1/v2 to MP3s.

yum install grip

Skype

They now have Skype 2.2 Beta for Linux. Simply download and double-click the RPM installer.

PulseCaster

This is what I use for recording Skype calls.

yum install pulsecaster

vsftpd

Secure, fast FTP server

yum install vsftpd

Alacarte

To create custom application launchers.

yum install alacarte

Tomcat 6

yum install tomcat6

PHP

Some PHP modules that I need for web development.

yum install php-xml

Sun JDK

Download Java SE SDK RPM Installer from the Java SE Downloads page and execute the similar commands as root:

Run the Java JDK binary:

chmod +x /home/randell/Downloads/jdk-6u25-linux-i586-rpm.bin
sh /home/randell/Downloads/jdk-6u25-linux-i586-rpm.bin

Install Java JDK java, javaws, libjavaplugin.so (for Firefox) and javac using alternatives –install:

alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_25/jre/bin/java 20000
alternatives --install /usr/bin/javaws javaws /usr/java/jdk1.6.0_25/jre/bin/javaws 20000
alternatives --install /usr/lib/mozilla/plugins/libjavaplugin.so  libjavaplugin.so /usr/java/jdk1.6.0_25/jre/lib/i386/libnpjp2.so 20000
alternatives --install /usr/bin/javac javac /usr/java/jdk1.6.0_25/bin/javac 20000
alternatives --install /usr/bin/jar jar /usr/java/jdk1.6.0_25/bin/jar 20000

Add the following JAVA_HOME environment variable to /etc/profile:

export JAVA_HOME="/usr/java/jdk1.6.0_25"

MySQL Workbench

For designing databases visually.

yum install mysql-workbench

Calibre

For converting e-books to different formats and for managing your e-book collection.

yum install calibre

bash auto-completion

yum install bash-completion

chmsee

HTML Help viewer for Unix/Linux (for viewing .chm files).

yum install chmsee

Development files for Qt toolkit

To develop applications using the Qt toolkit. And include the graphical configuration tool as well.

yum install qt-devel qt-config

GStreamer non-free plugins

From the Fedora Unity Project:

GStreamer is a multimedia framework used by many media players including rhythmbox, banshee, totem, listen, exaile and others. Due to legal issues support for various non-free formats , including mp3 files, aren’t included with GStreamer by default. You can add support for mp3 and other formats by installing an add-on package from the third party repository rpm.livna.org

yum install gstreamer-plugins-bad gstreamer-plugins-ugly gstreamer-ffmpeg phonon-backend-gstreamer

FFMpeg

yum install ffmpeg ffmpeg-libs

DVD playback

yum install libdvdread libdvdnav lsdvd

Aptana

Downloaded Aptana 3 from http://www.aptana.com/.

GnomeTweakTool

One of the things that weren’t immediately obvious when I was setting-up Fedora 15 was the ability to easily change the font sizes for applications, documents and windows. Googling led me to GnomeTweakTool, which allows us to customize “advanced” GNOME 3 options.

yum install gnome-tweak-tool

After installing TweakTool, I customized my fonts as follows:

  • Document font: Sans 10
  • Monospace font: Monospace 10

File Management Preferences

From a Nautilus window, go to Edit > Preferences. I modified mine to reflect the following changes:

  • Default View > View new folders using: List View
  • Icon View Defaults > Default zoom level: 66%
  • List View Defaults > Default zoom level: 33%

Favorites

I customized my Favorites to include these frequently used applications:

  • Chrome
  • Firefox (added by default)
  • Terminal
  • Files (added by default)
  • Amarok
  • Eclipse
  • Empathy
  • Take Screenshot

Terminal

Edit > Profile Preferences > Colors > Foreground and Background

  • Use colors from system theme: Unchecked
  • Built-in schemes: Green on black

Text Editor

Edit > Preferences

  • View
    • Line Numbers >  Display line numbers: Checked
    • Current Line > Highlight current line: Checked
    • Right Margin >  Display right margin: Checked
    • Bracket Matching > Highlight matching bracket: Checked
  • Editor
    • Tab Stops
      • Tab width: 4
      • Insert spaces instead of tabs: Checked
    • Automatic Indentation > Enable automatic indentation: Checked
    • File Saving
      • Create a backup of files before saving: Unchecked
      • Autosave files every: 5 minutes
    • Font & Colors > Color Scheme: Oblivion

* I’ll simply update this post if ever I come across software I use that I forgot to list here.

GNOME 3 on Fedora 15

I’ve just installed Fedora 15, and one of the things that surprised me was GNOME 3. I knew from the release notes that GNOME was coming to Fedora 15, but I didn’t bother looking at the details nor at the larger versions of screenshots. I knew that GNOME 3 was going to be better than the older versions, but never thought that it was this good.

Workspace

Blank Workspace

Empty workspace

App List

The App List can be accessed by pressing the logo (Window) key. Typing-in the first few letters of the name of the application and it filters the list to your desired application. This is very useful if you prefer minimal usage of the mouse. But if you prefer using the mouse, you can also access the App List by hovering your mouse to the top-left corner of the workspace and selecting Applications.

You can also pin your frequently used apps in the dash (left side) so you no longer have to sift through all the apps to get to your favorite apps.

App List

App List

Activities Overview

This practically replaces the taskbar where we can click any of the running applications to put them to focus.

Activities Overview showing one application (Firefox 4)

Activities Overview showing one application (Firefox 4)

Activities Overview showing several windows

Activities Overview showing several windows

Some other nifty things you can do with GNOME 3:

  • Pressing the logo (Windows) key launches the Activities Overview.
  • Dragging a window to the top of the screen maximizes the window. Dragging it down returns the window to its original size.
  • Dragging a window to the left or right side snaps the window to fill half the screen, which allows you to view two windows side-by-side. Dragging the window away from the side returns the window to its original size.
  • Pressing Ctrl + Alt + Up | Down moves you to different workspaces.
  • Ctrl + Shift + Alt + R to start/stop recording a screencast.
Update (20110724): Here’s the Gnome 3 Cheatsheet! http://live.gnome.org/GnomeShell/CheatSheet

There’s more to GNOME 3 than what I can show you via screenshots. For more on GNOME 3, checkout the release notes: GNOME 3 Release Notes

Zend Framework quickstart – Part 1

Here are the links that I followed while getting started with the Zend Framework:

So far, Zend Framework looks pretty much like CodeIgniter in a way that I can use loosely-coupled component libraries at will and I have a lot of control over the architecture. It also provides an MVC implementation similar to CodeIgniter.

When I was reading the links above, I noticed that some of the details were missing in order to successfully complete a small project using Zend Framework without pulling my hair a couple of times. So I wrote my own so I can just look this post up if ever I forget some of the important details and perhaps some other ZF n00b out there can benefit from this post as well. Here it is…

Get a copy of the Zend Framework

I downloaded the latest version of Zend Framework from the Latest Release of ZF page instead of installing Zend Server (which contains Zend Framework with a complete PHP stack) on my development machine since I don’t have a production server where I can install the Zend Server, because Zend Server will replace your Linux distro’s PHP that may cause conflict between RPM packages. I’d rather setup my development environment similar to the setup of the servers that I have right now so don’t have to worry much about package incompatibilities during deployment.

In the Latest Release of ZF page, choose the full framework which doesn’t require registration. In my case, I downloaded Zend Framework 1.10.8 Full (released 2010-08-25). Extract the contents of the archive. In my (Fedora) Linux machine, I extracted it under /home/randell/ZendFramework-1.10.8. In Windows, I extracted it under C:/ZendFramework-1.10.8.

Setup the zf command line tool

We’ll be using the zf command line tool to create our new project. For that, we need to properly setup our environment variables for both PHP and the zf tool. The zf command line tools (zf.bat for Windows and zf.sh for Unix-based OSes) are located in the /bin directory of your Zend Framework installation.

Create the project

After setting-up the command line tool, we can now create our project. From the command line, navigate to the directory where we will create your project. In my Linux machine, I created it under /var/www/html/. In Windows, I created it under C:/xampp-1.7.1/htdocs. Both directories is where I run all my other PHP projects. To create the project, execute the following command:

zf create project quickstart

Running this command will create your basic site structure, including your initial controllers and views. Both in Windows and in Linux, you could get a message similar to this after executing the command:

Note: This command created a web project, for more information setting up your VHOST, please see docs/README

The tree structure of the generated project looks something like this:

quickstart
|-- application
|    |-- configs
|    |    `-- application.ini
|    |-- controllers
|    |    |-- ErrorController.php
|    |    `-- IndexController.php
|    |-- models
|    |-- views
|    |    |-- helpers
|    |    |-- scripts
|    |         |-- error
|    |         |    `-- error.phtml
|    |         |-- index
|    |              `-- index.phtml
|    `-- Bootstrap.php
|-- docs
|    `-- README.txt
|-- library
|-- public
|    |-- .htaccess
|    `-- index.php
|-- tests
|    |-- application
|    |    `-- bootstrap.php
|    |-- library
|    |    `-- bootstrap.php
|    `-- phpunit.xml
`-- .zfproject.xml

Don’t worry about the contents of those files yet because I will try to explain the important ones as detailed as possible in my next post. For now, let’s just get the basic setup up and running.

Next step is to copy the Zend library (library/Zend)from our extracted Zend Framework archive to the library directory of our project. We’re doing this so that our project has a copy of the Zend Framework whenever we decide to deploy it on a different server.

Create a virtual host

Let’s modify our httpd.conf and hosts files using any text editor.

Append the following lines at the end of httpd.conf file (/etc/httpd/conf/httpd.conf and /etc/hosts in Fedora):

NameVirtualHost *:80

&lt;VirtualHost *:80&gt;
    ServerName quickstart.local
    DocumentRoot /var/www/html/quickstart/public

    SetEnv APPLICATION_ENV "development"

    &lt;Directory /var/www/html/quickstart/public&gt;
        DirectoryIndex index.php
        AllowOverride All
        Order allow,deny
        Allow from all
    &lt;/Directory&gt;
&lt;VirtualHost&gt;

DocumentRoot specifies the public subdirectory of our project (only files under that directory can ever be served directly by the server). Take note of the public. Most people tend to forget that part, especially when coming from other frameworks where the index.php doesn’t reside on a directory other than the root. The SetEnv directive sets an environment variable for our virtual host and will be picked up by index.php (in the public directory) and set the APPLICATION_ENV constant for our application.

Append the following to the hosts file (/etc/hosts in Fedora and C:/WINDOWS/system32/drivers/etc/hosts in Windows XP):

127.0.0.1 quickstart.local

Then restart our server. We can now access our application from http://quickstart.local and see something like this from our browser:

Welcome to the Zend Framework

Welcome to the Zend Framework

Got questions or suggestions about this post? Feel free to post a comment or drop me an email.