<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CB1, INC. &#187; php</title>
	<atom:link href="http://www.cb1inc.com/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cb1inc.com</link>
	<description></description>
	<lastBuildDate>Wed, 28 Sep 2011 17:54:54 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>Intro to PECL/mysqlnd_ms Presentation Slides</title>
		<link>http://www.cb1inc.com/2011/04/12/intro-to-peclmysqlnd_ms-presentation-slides/</link>
		<comments>http://www.cb1inc.com/2011/04/12/intro-to-peclmysqlnd_ms-presentation-slides/#comments</comments>
		<pubDate>Tue, 12 Apr 2011 10:43:03 +0000</pubDate>
		<dc:creator>Chris Barber</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[presentations]]></category>

		<guid isPermaLink="false">http://www.cb1inc.com/?p=1585</guid>
		<description><![CDATA[Last week I presented on the super cool PECL/mysqlnd_ms PHP extension at the Minnesota PHP User Group. In short, mysqlmd_ms will provide some transparency for PHP web applications to interact with master and slave MySQL database setups. Here&#8217;s my slide deck: Intro to PECL/mysqlnd_ms (4/7/2011) There&#8217;s a couple things mysqlnd_ms needs to support before I [...]]]></description>
			<content:encoded><![CDATA[<p>Last week I presented on the super cool <a href="http://svn.php.net/viewvc/pecl/mysqlnd_ms/">PECL/mysqlnd_ms</a> PHP extension at the <a href="http://www.mnphp.org/">Minnesota PHP User Group</a>. In short, mysqlmd_ms will provide some transparency for PHP web applications to interact with master and slave MySQL database setups.</p>
<p>Here&#8217;s my slide deck:</p>
<div style="margin:0 auto;width:425px" id="__ss_7557068"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/cb1kenobi/intro-to-peclmysqlndms-472011" title="Intro to PECL/mysqlnd_ms (4/7/2011)">Intro to PECL/mysqlnd_ms (4/7/2011)</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/7557068" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe></div>
<p>There&#8217;s a couple things mysqlnd_ms needs to support before I can use it such as support for single master (i.e. local dev) environments and detection of &#8220;dead&#8221; MySQL servers so traffic isn&#8217;t passed to them over and over again.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cb1inc.com/2011/04/12/intro-to-peclmysqlnd_ms-presentation-slides/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CB1 Ubuntu 10.10 Linux Development Setup</title>
		<link>http://www.cb1inc.com/2010/10/16/cb1-ubuntu-10-10-linux-development-setup/</link>
		<comments>http://www.cb1inc.com/2010/10/16/cb1-ubuntu-10-10-linux-development-setup/#comments</comments>
		<pubDate>Sun, 17 Oct 2010 02:36:52 +0000</pubDate>
		<dc:creator>Chris Barber</dc:creator>
				<category><![CDATA[apache]]></category>
		<category><![CDATA[gearman]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[samba]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.cb1inc.com/?p=1375</guid>
		<description><![CDATA[I use a MacBook Pro for my day-to-day operations here at CB1, INC. I&#8217;m a huge believer that a development environment should mimic the production environment, so I find myself running a couple virtual machines in VMware Fusion. The following guide is a reference for myself as well as possibly a helpful resource for setting [...]]]></description>
			<content:encoded><![CDATA[<p>I use a MacBook Pro for my day-to-day operations here at CB1, INC.  I&#8217;m a huge believer that a development environment should mimic the production environment, so I find myself running a couple virtual machines in VMware Fusion.</p>
<p>The following guide is a reference for myself as well as possibly a helpful resource for setting up your own Linux development environment. Here&#8217;s an checklist of the tasks to perform and software to install:</p>
<ul>
<li>Operating System
<ul>
<li><a href="http://www.ubuntu.com/" target="_blank">Ubuntu 10.10 64-bit</a>: I use Ubuntu Desktop in dev and Ubuntu Server in production</li>
<li>Package updates and upgrades</li>
<li>Network configuration (at least 2 static IP addresses)</li>
</ul>
</li>
<li>Development Tools
<ul>
<li>C/C++ development environment</li>
<li>Autotools</li>
<li>Sun Java JDK</li>
<li><a href="http://valgrind.org/" target="_blank">Valgrind</a></li>
<li>Version control: <a href="http://subversion.tigris.org/" target="_blank">Subversion</a>, <a href="http://bazaar.canonical.com/en/" target="_blank">Bazaar</a>, <a href="http://git-scm.com/" target="_blank">git</a></li>
<li><a href="http://developer.android.com/">Android SDK</a></li>
</ul>
</li>
<li>Servers
<ul>
<li><a href="http://www.samba.org/" target="_blank">Samba</a> (file sharing)</li>
<li>SSH (remote shell access)</li>
<li><a href="http://httpd.apache.org/" target="_blank">Apache 2.2</a> (web server)</li>
<li><a href="http://nginx.org/" target="_blank">nginx 0.8</a> (web server)</li>
<li><a href="http://www.php.net/" target="_blank">PHP 5.3.3</a> (application server)</li>
<li><a href="http://php-fpm.org/" target="_blank">PHP-FPM</a> (PHP&#8217;s FastCGI process manager)</li>
<li><a href="http://www.mysql.com/" target="_blank">MySQL 5.1</a> (database server)</li>
<li><a href="http://www.postgresql.org/" target="_blank">PostgreSQL</a> (database server)</li>
<li><a href="http://memcached.org/" target="_blank">memcached 1.4.5</a> (caching layer)</li>
<li><a href="http://gearman.org/" target="_blank">Gearman</a> (job queue manager)</li>
</ul>
</li>
<li>PHP Extensions
<ul>
<li><a href="http://pecl.php.net/package/memcached" target="_blank">memcached</a></li>
<li><a href="http://xdebug.org/" target="_blank">Xdebug</a></li>
<li><a href="http://pecl.php.net/package/gearman" target="_blank">Gearman</a></li>
<li><a href="http://pecl.php.net/package/APC" target="_blank">APC</a></li>
</ul>
</li>
<li>Desktop Applications
<ul>
<li><a href="http://www.google.com/chrome">Google Chrome</a></li>
<li>KCachegrind</li>
<li><a href="http://www.appcelerator.com/products">Appcelerator Titanium</a></li>
</ul>
</li>
</ul>
<h3>Operating System</h3>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/ubuntu.png"/></p>
<p>Start by installing Ubuntu 10.10 Desktop (or server). I&#8217;m not going to cover installing Ubuntu since there are already several other resources out there. Once Ubuntu is installed, open a <strong>Terminal</strong>:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo passwd root</span>
[sudo] password for user: &lt;type your password&gt;
Enter new UNIX password: &lt;type new root password&gt;
Retype new UNIX password: &lt;type new root password again&gt;
passwd: password updated successfully

user@ubuntu:~# <span class="cmd">sudo apt-get update</span>
user@ubuntu:~# <span class="cmd">sudo apt-get upgrade</span>

user@ubuntu:~# <span class="cmd">mkdir ~/src</span>
</pre>
<h3>New File Permissions</h3>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo pico /etc/profile</span>
</pre>
<p>Change 022 to 002. This setting controls the default permissions when a new file or directory is created.  This is mostly useful when managing files over Samba.</p>
<h3>Network IP Addresses</h3>
<p>Optionally, you may want to assign a static IP address. I set up one IP address for Apache and another for nginx.</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo pico /etc/network/interfaces</span>
</pre>
<p>The following is a reference for adding two static IPs.  Change the IPs to meet your needs.</p>
<pre class="brush: plain; title: ;">
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
	address 192.168.1.200
	netmask 255.255.255.0
	gateway 192.168.1.1

auto eth0:1
iface eth0:1 inet static
	address 192.168.1.201
	netmask 255.255.255.0
</pre>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo /etc/init.d/networking restart</span>
</pre>
<h3>Packages</h3>
<p>Here&#8217;s a bunch of packages that will set up compilers, version control, Java, MySQL, Apache, PHP, Memcache, Gearman, Samba, and more.</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo apt-get install build-essential autotools-dev autoconf \
 autoconf2.13 openssh-server ethtool traceroute openjdk-6-jdk \
 mysql-server-5.1 bzr subversion subversion-tools ntp ntpdate \
 libpcre3-dev libevent-dev automake bison libtool scons  g++ \
 ncurses-dev libreadline-dev libz-dev libssl-dev  libcurl4-openssl-dev \
 ruby rubygems libzip-ruby1.8 libzip-ruby1.9.1 python-dev ruby-dev \
 libdbus-glib-1-dev uuid-dev libpam0g libpam0g-dev gperf samba valgrind \
 libxml2-dev libfreetype6-dev curl libcurl4-openssl-dev \
 libjpeg62-dev libpng12-dev sqlite3 libsqlite3-dev git-core \
 postgresql postgis gearman libgearman-dev php5 \
 libapache2-mod-php5 php5-dev memcached php5-memcached \
 php5-curl php5-gd php5-mysql php5-pgsql php-apc \
 php5-xdebug php5-fpm libapache2-mod-fastcgi</span>
</pre>
<h3>MySQL</h3>
<p>During the package install above, MySQL will prompt you for the root password.</p>
<p>After the packages are installed, we need to allow remote MySQL connections.</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo pico /etc/mysql/my.cnf</span>
</pre>
<p>Comment out the <em>bind-address</em> line.</p>
<pre class="brush: plain; title: ;">
# bind-address          = 127.0.0.1
</pre>
<h3>SSH</h3>
<p>Next, you may optionally increase the connection keep alive interval for remote ssh connections. Timeouts aren&#8217;t really an issue for SSH&#8217;ing into a local VM, but really helps for remote installs.</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo echo &quot;ClientAliveInterval 60&quot; &gt;&gt; /etc/ssh/sshd_config</span>
</pre>
<h3>Samba</h3>
<p>Samba allows me to drag and drop files between my Mac and Linux VM. I personally do <strong>not</strong> enable/install Samba on production servers.</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.orig</span>
user@ubuntu:~# <span class="cmd">sudo pico /etc/samba/smb.conf</span>
</pre>
<p>You can add a share such as the following:</p>
<pre class="brush: plain; title: ;">
[ubuntu]
        force user = &lt;your username&gt;
        writeable = yes
        create mode = 644
        path = /home/&lt;your username&gt;
        directory mode = 755
        force group = &lt;your username&gt;
</pre>
<p>Then create yourself a Samba user:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo smbpasswd -a &lt;your username&gt;</span>
</pre>
<h4>Apache 2</h4>
<p>Apache is mostly configured out of the box, but I like to enable rewrite and SSL so I can test production features.</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo a2enmod rewrite</span>
user@ubuntu:~# <span class="cmd">sudo a2enmod ssl</span>
</pre>
<p>Since I&#8217;m going to run Apache and nginx, I&#8217;m going bind Apache to <em>eth0</em>.</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo pico /etc/apache2/ports.conf</span>
</pre>
<pre class="brush: plain; title: ;">
NameVirtualHost 192.168.1.200:80
Listen 192.168.1.200:80

&lt;IfModule mod_ssl.c&gt;
    Listen 192.168.1.200:443
&lt;/IfModule&gt;
</pre>
<p>Now we need to add <em>eth0</em>&#8216;s IP to the default host:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo pico /etc/apache2/sites-enabled/000-default</span>
</pre>
<pre class="brush: plain; title: ;">
&lt;VirtualHost 192.168.1.200:80&gt;
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www
        &lt;Directory /&gt;
                Options FollowSymLinks
                AllowOverride None
        &lt;/Directory&gt;
        &lt;Directory /var/www/&gt;
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        &lt;/Directory&gt;

        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn
        CustomLog ${APACHE_LOG_DIR}/access.log combined
&lt;/VirtualHost&gt;
</pre>
<p>Restart Apache for the changes to take effect.</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo apache2ctl restart</span>
</pre>
<h3>Gearman</h3>
<p>By default, Gearman uses memory to store pending jobs in the queue, but I prefer to use MySQL for persistent storage.  To do this, first create the queue database and table:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">mysqladmin -uroot -p123123 create gearman</span>
user@ubuntu:~# <span class="cmd">mysql -uroot -p123123 -e "CREATE TABLE gearman.gearman_queue (
  unique_key VARCHAR(64) NOT NULL,
  function_name VARCHAR(255) NULL,
  priority INT NULL,
  data LONGBLOB NULL,
  PRIMARY KEY (unique_key)
) ENGINE = InnoDB;"</span>
</pre>
<p>Next update the init script to tell Gearman to use the database:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo mv /etc/default/gearman-job-server /etc/default/gearman-job-server.bak</span>
user@ubuntu:~# <span class="cmd">sudo echo &quot;PARAMS=\&quot;-q libdrizzle --libdrizzle-host=127.0.0.1&quot; \
   &quot;--libdrizzle-user=root --libdrizzle-password=123123 --libdrizzle-db=gearman&quot; \
   &quot;--libdrizzle-table=gearman_queue --libdrizzle-mysql\&quot;&quot; &gt; /etc/default/gearman-job-server</span>
user@ubuntu:~# <span class="cmd">sudo /etc/init.d/gearman-job-server restart</span>
</pre>
<h3>Gearman PHP Extension</h3>
<p>We need to download and install the Gearman PHP extension if we want to write PHP workers or post jobs to the queue.</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">cd ~/src</span>
user@ubuntu:~/src# <span class="cmd">wget http://pecl.php.net/get/gearman-0.7.0.tgz</span>
user@ubuntu:~/src# <span class="cmd">tar xzf gearman-0.7.0.tgz</span>
user@ubuntu:~/src# <span class="cmd">rm gearman-0.7.0.tgz package.xml</span>
user@ubuntu:~/src# <span class="cmd">cd gearman-0.7.0</span>
user@ubuntu:~/src# <span class="cmd">phpize</span>
user@ubuntu:~/src# <span class="cmd">./configure</span>
user@ubuntu:~/src# <span class="cmd">make</span>
user@ubuntu:~/src# <span class="cmd">sudo make install</span>
</pre>
<p>Next, add the config file to load the Gearman PHP extension:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo echo &quot;extension=gearman.so&quot; &gt;&gt; /etc/php5/conf.d/gearman.ini</span>
</pre>
<h3>memcached PHP Extension</h3>
<p>Since we have memcached and the memcached PHP extension install, let&#8217;s use it for storing session data:</p>
<pre class="terminal">
user@ubuntu:~/src# <span class="cmd">sudo echo &quot;session.save_handler = memcached
session.save_path = \&quot;127.0.0.1:11211\&quot;&quot; &gt;&gt; /etc/php5/conf.d/memcached.ini</span>
</pre>
<h3>nginx</h3>
<p>nginx is web server that is really fast.  I use nginx as my primary development web server unless I&#8217;m running a web app that only works with Apache. You can choose to install nginx from package, but I like to live life on the bleeding edge, so I&#8217;ll be building nginx from source. To install nginx, we need to download the source, compile it, install it, and configure it.</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">cd ~/src</span>
user@ubuntu:~/src# <span class="cmd">wget http://nginx.org/download/nginx-0.8.52.tar.gz</span>
user@ubuntu:~/src# <span class="cmd">tar xzf nginx-0.8.52.tar.gz</span>
user@ubuntu:~/src# <span class="cmd">rm nginx-0.8.52.tar.gz</span>
user@ubuntu:~/src# <span class="cmd">cd nginx-0.8.52</span>
user@ubuntu:~/src# <span class="cmd">mkdir /var/lib/nginx</span>
user@ubuntu:~/src# <span class="cmd">./configure \
    --sbin-path=/usr/sbin \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
    --pid-path=/var/run/nginx.pid \
    --lock-path=/var/lock/nginx.lock \
    --http-log-path=/var/log/nginx/access.log \
    --http-client-body-temp-path=/var/lib/nginx/body \
    --http-proxy-temp-path=/var/lib/nginx/proxy \
    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
    --http-scgi-temp-path=/var/lib/nginx/scgi \
    --with-http_stub_status_module</span>
user@ubuntu:~/src# <span class="cmd">make</span>
user@ubuntu:~/src# <span class="cmd">sudo make install</span>

user@ubuntu:~# <span class="cmd">sudo pico /etc/init.d/nginx</span>
</pre>
<p>Here&#8217;s the init script that will start nginx for us:</p>
<pre class="brush: bash; title: ;">
#! /bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/nginx
NAME=nginx
DESC=nginx
test -x $DAEMON || exit 0
case &quot;$1&quot; in
  start)
        echo -n &quot;Starting $DESC: &quot;
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
        echo &quot;$NAME.&quot;
        ;;
  stop)
        echo -n &quot;Stopping $DESC: &quot;
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
        echo &quot;$NAME.&quot;
        ;;
  restart|force-reload)
        echo -n &quot;Restarting $DESC: &quot;
        start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
        sleep 1
        start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
        echo &quot;$NAME.&quot;
        ;;
  reload)
        echo -n &quot;Reloading $DESC configuration: &quot;
        start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid --exec $DAEMON
        echo &quot;$NAME.&quot;
        ;;
  *)
        echo &quot;Usage: /etc/init.d/$NAME {start|stop|restart|reload|force-reload}&quot; &gt;&amp;2
        exit 1
        ;;
esac
exit 0
</pre>
<p>Now we need to make the init script executable and enable it:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo chmod +x /etc/init.d/nginx</span>
user@ubuntu:~# <span class="cmd">sudo update-rc.d nginx defaults</span>

user@ubuntu:~# <span class="cmd">sudo pico /etc/nginx/nginx.conf</span>
</pre>
<p>Here&#8217;s a starter nginx.conf with some basic settings:</p>
<pre class="brush: plain; title: ;">
user  www-data www-data;
worker_processes  2;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile                on;
    tcp_nodelay             on;
    tcp_nopush              on;
    keepalive_timeout       65;
    server_name_in_redirect off;
    server_tokens           off;

    add_header Strict-Transport-Security max-age=1800;
    add_header X-Frame-Options deny;

    gzip            on;
    gzip_buffers    16 8k;
    gzip_comp_level 9;
    gzip_types      text/plain text/xml application/x-javascript text/css;

    include /etc/nginx/sites/*;
}
</pre>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo mkdir /etc/nginx/sites</span>
user@ubuntu:~# <span class="cmd">sudo pico /etc/nginx/sites/default</span>
</pre>
<p>Now we need to set up a default host that supports PHP (via <a href="http://php-fpm.org/" target="_blank">PHP-FPM, PHP&#8217;s FastCGI Process Manager</a>) and we want the default host to use the <em>eth0:1</em> IP address:</p>
<pre class="brush: plain; title: ;">
server {
    listen       192.168.1.201:80 default;
    server_name  _;
    root   /var/www;
    index  index.php;
    location / {
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php?q=$1 last;
            break;
        }
    }
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
        include        fastcgi_params;
    }
    location ~* (\.(htaccess|engine|inc|info|install|module|profile|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)|code-style\.pl|Entries.*|Repository|Root|Tag|Template)$ {
        deny all;
    }
}
</pre>
<p>After the config files are good to go, start nginx:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo /etc/init.d/nginx start</span>
</pre>
<h3>Service Names</h3>
<p>I also like to add service names so I can see what ports are in use when I run <em>netstat</em>. I added drizzle and Cassandra for fun despite this post not including them.</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo cp /etc/services /etc/services.bak</span>
user@ubuntu:~# <span class="cmd">su</span>
root@ubuntu:~# <span class="cmd">echo &quot;drizzle     4427/tcp
drizzle     4427/udp
memcached   11211/tcp
memcached   11211/udp
gearmand    4730/tcp
gearmand    4730/udp
fastcgi     9000/tcp
cassandra   9160/tcp&quot; &gt;&gt; /etc/services</span>
root@ubuntu:~# <span class="cmd">exit</span>
</pre>
<h3>Android SDK</h3>
<p>The Android SDK is unfortunately not in package, so you&#8217;ll need to download it from the Android Developer site: <a href="http://developer.android.com/sdk/index.html">http://developer.android.com/sdk/index.html</a>.</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">wget http://dl.google.com/android/android-sdk_r07-linux_x86.tgz</span>
user@ubuntu:~# <span class="cmd">tar xzf android-sdk_r07-linux_x86.tgz</span>
user@ubuntu:~# <span class="cmd">rm android-sdk_r07-linux_x86.tgz</span>
user@ubuntu:~# <span class="cmd">sudo mv android-sdk-linux_x86 /usr/local</span>
user@ubuntu:~# <span class="cmd">sudo find /usr/local/android-sdk-linux_x86 -type d -exec chmod 777 {} \;</span>
</pre>
<p>You&#8217;ll need to add the Android SDK path near the top of your <code>~/.bash_profile</code> <em>or</em> <code>~/.bashrc</code>:</p>
<pre class="brush: plain; title: ;">
export PATH=${PATH}:/usr/local/android-sdk-linux_x86/tools
</pre>
<p>To manage your Android SDK packages and virtual devices, you&#8217;ll need to run the <em>android</em> app:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">android</span>
</pre>
<p>First go to <em>Available Packages</em> and download version <strong>1.6</strong> <em>and</em> <strong>2.2</strong> Android SDK packages.  You can also choose to download the documentation, samples, and Google APIs.</p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/android4.jpg"/></p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/android5.jpg"/></p>
<p>Downloading the package may take several minutes. You don&#8217;t have to create a virtual device right now if you are planning on installing Appcelerator&#8217;s Titanium platform.  You can exit the Android app when you&#8217;re done.</p>
<h3>Desktop Apps</h3>
<p>If you&#8217;re running Ubuntu Desktop, there are a couple handy apps I install.  The first is Google Chrome and can be directly downloaded from the <a href="http://www.google.com/chrome/eula.html">Google Chrome download page</a>.</p>
<p>I find <em>KCachegrind</em> and <em>GHex</em> to be useful:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo apt-get install kcachegrind ghex</span>
</pre>
<h3>Appcelerator Titanium</h3>
<p>Titanium is an awesome platform for developing desktop applications for Linux, Mac OS X, and Windows as well as mobile apps for iPhone and Android. We use Titanium Developer to create Titanium projects. Begin by downloading the 64-bit version of Titanium:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">wget -O titanium.tgz http://www.appcelerator.com/download-linux64</span>
</pre>
<p>There&#8217;s also a 32-bit version available at <code>http://www.appcelerator.com/download-linux32</code>.</p>
<p>Next we unpack Titanium Developer and move it to a safe place:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">tar xzf titanium.tgz</span>
user@ubuntu:~# <span class="cmd">rm titanium.tgz</span>
</pre>
<p>Next you need to run the installer by double-clicking the <em>Titanium Developer</em> executable. Run the executable and then click the <em>Install</em> button. You can try installing to <code>/opt/titanium</code>, but you might need root privileges.</p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/titanium1.jpg"/></p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/titanium2.jpg"/></p>
<p>Next, there are a few issues with outdated libraries, so we simply delete them:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">rm ~/.titanium/runtime/linux/1.0.0/libgobject-2.0.*</span>
user@ubuntu:~# <span class="cmd">rm ~/.titanium/runtime/linux/1.0.0/libglib-2.0.*</span>
user@ubuntu:~# <span class="cmd">rm ~/.titanium/runtime/linux/1.0.0/libgio-2.0.*</span>
user@ubuntu:~# <span class="cmd">rm ~/.titanium/runtime/linux/1.0.0/libgthread-2.0.*</span>
</pre>
<p>Titanium Developer also complains if <em>/bin/java</em> doesn&#8217;t exist, so create a quick link:</p>
<pre class="terminal">
user@ubuntu:~# <span class="cmd">sudo ln -s /usr/bin/java /bin/java</span>
</pre>
<p>Relaunch Titanium Developer and enter your login credentials.  If you don&#8217;t have a login, you can get a free account.</p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/titanium3.jpg"/></p>
<p>After signing in, you may notice there are some updates available in the upper right corner of the window. Click in the box and the updates will be downloaded and installed.</p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/titanium4.jpg"/></p>
<p>Optionally you can create a launcher icon for your GNOME panel. Don&#8217;t forget to escape spaces in the command with a backslash!</p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/titanium5.jpg"/></p>
<h3>Finishing Touches</h3>
<p>Lastly, I like to re-arrange my desktop to maximize my coding real estate.</p>
<p><img class="aligncenter" src="http://cb1inc.com/wp-content/uploads/2010/10/ubuntu_10-10.jpg"/></p>
<h3>Conclusion</h3>
<p>That should get you up and running with a neato dev environment.  If you need to run SSL, I wrote a post on <a href="http://www.cb1inc.com/2007/05/13/creating-self-signed-certs-on-apache-2-2/">Creating Self-Signed Certs on Apache 2.2</a> and <a href="http://www.cb1inc.com/2008/09/11/virtual-hosts-and-wildcard-ssl-certificates-with-apache-2-2/">Virtual Hosts and Wildcard SSL Certificates with Apache 2.2</a>.</p>
<p>If you find any typos or additions, please feel free to sound off in the comments!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cb1inc.com/2010/10/16/cb1-ubuntu-10-10-linux-development-setup/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cassandra Presentation Slides</title>
		<link>http://www.cb1inc.com/2010/05/07/cassandra-presentation-slides/</link>
		<comments>http://www.cb1inc.com/2010/05/07/cassandra-presentation-slides/#comments</comments>
		<pubDate>Fri, 07 May 2010 05:27:31 +0000</pubDate>
		<dc:creator>Chris Barber</dc:creator>
				<category><![CDATA[cassandra]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[presentations]]></category>

		<guid isPermaLink="false">http://www.cb1inc.com/?p=1431</guid>
		<description><![CDATA[Tonight I gave a talk about Cassandra at the Minnesota PHP User Group. I would hope that everyone that came out learned a little something. I have to admit the talk was a bit unorganized, but hey, I love to talk. It also didn&#8217;t help that there was major construction going on at the meeting [...]]]></description>
			<content:encoded><![CDATA[<p>Tonight I gave a talk about <a href="http://cassandra.apache.org/" target="_blank">Cassandra</a> at the Minnesota PHP User Group. I would hope that everyone that came out learned a little something. I have to admit the talk was a bit unorganized, but hey, I love to talk. It also didn&#8217;t help that there was major construction going on at the meeting venue that made it hard for people to hear me.</p>
<div style="margin:0 auto;width:425px" id="__ss_4002175"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/cb1kenobi/cassandra-say-goodbye-to-the-relational-database-562010" title="Cassandra - Say Goodbye to the Relational Database (5-6-2010)">Cassandra &#8211; Say Goodbye to the Relational Database (5-6-2010)</a></strong><object id="__sse4002175" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cassandra-saygoodbyetotherelationaldatabase5-6-2010-100506234446-phpapp02&#038;rel=0&#038;stripped_title=cassandra-say-goodbye-to-the-relational-database-562010" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse4002175" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=cassandra-saygoodbyetotherelationaldatabase5-6-2010-100506234446-phpapp02&#038;rel=0&#038;stripped_title=cassandra-say-goodbye-to-the-relational-database-562010" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
<p>After rambling for an hour and a half, I finally ran out of Cassandra-related stuff to talk about.  Since some people were interested in some new features of PHP 5.3, I showed off my MVC framework I&#8217;ve been working on called <a href="http://github.com/cb1kenobi/elevate" target="_blank">Elevate</a>.  In Elevate&#8217;s code, I use some of PHP 5.3&#8242;s new features such as closures, namespaces, and the ternary operator (?:).  I also showed Elevate&#8217;s super cool Gearman worker daemon that I used for sending e-mails.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cb1inc.com/2010/05/07/cassandra-presentation-slides/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cassandra Talk at the May Twin Cities PHP User Group</title>
		<link>http://www.cb1inc.com/2010/05/03/cassandra-talk-at-the-may-twin-cities-php-user-group/</link>
		<comments>http://www.cb1inc.com/2010/05/03/cassandra-talk-at-the-may-twin-cities-php-user-group/#comments</comments>
		<pubDate>Mon, 03 May 2010 23:45:55 +0000</pubDate>
		<dc:creator>Chris Barber</dc:creator>
				<category><![CDATA[cassandra]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.cb1inc.com/?p=1413</guid>
		<description><![CDATA[This Thursday, May 6th, at 6pm I&#8217;ll be giving a talk about Cassandra at the Minnesota PHP User Group. I&#8217;ll be covering Cassandra&#8217;s architecture and how it scales to handle tons of data and still be fast and fault tolerant. I&#8217;ll also cover Cassandra&#8217;s API and data modeling, specifically with PHP. The user group will [...]]]></description>
			<content:encoded><![CDATA[<p>This Thursday, May 6th, at 6pm I&#8217;ll be giving a talk about <a href="http://cassandra.apache.org/">Cassandra</a> at the Minnesota PHP User Group.</p>
<p><a href="http://www.mnphp.org/calendar/13353590/"><img src="/wp-content/uploads/2010/05/cassandra_logo.png" alt="Cassandra" width="500" height="100" class="aligncenter size-full wp-image-1415" /></a></p>
<p>I&#8217;ll be covering Cassandra&#8217;s architecture and how it scales to handle tons of data and still be fast and fault tolerant.  I&#8217;ll also cover Cassandra&#8217;s API and data modeling, specifically with PHP.</p>
<p>The user group will meet at Nerdery Interactive Labs (<a href="http://maps.google.com/maps?f=q&#038;source=s_q&#038;hl=en&#038;geocode=&#038;q=9555+James+Ave+S,+Suite+245,+Bloomington,+MN+55431&#038;sll=37.0625,-95.677068&#038;sspn=62.61328,131.572266&#038;ie=UTF8&#038;hq=&#038;hnear=9555+James+Ave+S+%23245,+Minneapolis,+Hennepin,+Minnesota&#038;ll=44.830826,-93.298731&#038;spn=0.027909,0.064244&#038;z=15">9555 James Ave S, Suite 245, Bloomington, MN 55431</a>). It will surely be packed with tons of awesome, so be sure to <a href="http://www.mnphp.org/calendar/13353590/">RSVP</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cb1inc.com/2010/05/03/cassandra-talk-at-the-may-twin-cities-php-user-group/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Conference Day 2 Thoughts</title>
		<link>http://www.cb1inc.com/2008/04/16/mysql-conference-day-2-thoughts/</link>
		<comments>http://www.cb1inc.com/2008/04/16/mysql-conference-day-2-thoughts/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 15:20:03 +0000</pubDate>
		<dc:creator>Chris Barber</dc:creator>
				<category><![CDATA[ec2]]></category>
		<category><![CDATA[gearman]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[<h4>Keynotes</h4>
The keynote was kick started by Marten Mickos.  If you've never met Marten, he is, on a personal note, one of the greatest CEOs I've ever met.  The keynotes were especially interesting for me because it was the first time I've had the opportunity to listen to <a href="http://blogs.sun.com/jonathan/">Jonathan Schwartz</a>, the CEO of <a href="http://www.sun.com">Sun Microsystems</a>.  Jonathan seems like a great guy who gives the impression he &#34;gets it&#34;.

The last keynote was by Werner Vogels of Amazon.  His talk covered Amazon's growth and the new services they offer including EC2.  He announced that EC2 now supports persistent storage, which is a huge improvement, but doesn't quite solve all of the problems.

<h4>Testing PHP/MySQL Applications with PHPUnit/DbUnit</h4>
I've never been big into testing, but I'm trying to change that.  <a href="http://sebastian-bergmann.de">Sebastian Bergmann</a>, the author of <a href="http://www.amazon.com/PHPUnit-Pocket-Guide-Guides/dp/0596101031/ref=pd_bbs_sr_1?ie=UTF8&#038;s=books&#038;qid=1208361914&#038;sr=8-1">PHPUnit Pocket Reference</a> (<a href="http://www.phpunit.de/pocket_guide/3.2/en/index.html">free online version</a>), talked about <a href="http://phpun.it/">PHPUnit</a> and DbUnit and why I should use them.  Installing PHPUnit is extremely simple if you have pear installed:
<pre>pear channel-discover pear.phpunit.de
pear install phpunit/PHPUnit</pre>Once installed, just require PHPUnit:
<pre>require_once 'PHPUnit/Framework.php';</pre>He just scratched the surface on writing unit tests.  One thing he pointed out was using <a href="http://cruisecontrol.sourceforge.net/">CruiseControl</a> for automated testing.  What's really cool is you can fire off CruiseControl from Subversion commit hooks.  If the testing fails, CruiseControl can send an email with the results and who is to blame.

<h4>Practical MySQL for Web Applications</h4>
<a href="http://dammit.lt/">Domas Mituzas</a> of MySQL and Wikipedia fame gave a good talk that covered practical design of web applications.  The talk covered simple stuff, so I didn't learn a whole lot.  Nevertheless, Domas sometimes says some funny things that make the talk enjoyable.

<h4>EXPLAIN Demystified</h4>
<a href="http://www.xaprb.com/blog/">Baron Schwartz</a> gave a talk about the <a href="http://dev.mysql.com/doc/refman/5.0/en/explain.html">EXPLAIN</a> statement.  EXPLAIN is run by prepending the word EXPLAIN to your SELECT statements.  It only works on SELECT statements.  When the query is run, it outputs an execution plan.

After running through the output of the EXPLAIN statement, he showed us mk-visual-explain which is one of the tools in <a href="http://www.maatkit.org/">Maatkit</a>.  It is a neato command line tool that takes the EXPLAIN output and reformats it as a tree structure.  It's a great way to visualize the execution plan.  Now if only there was a GUI version...

<h4>Upgrading to Elegant Versatile Database Architecture using PHP5 Data Objects</h4>
This talk was given by Sigurd Magnusson of <a href="http://www.silverstripe.com/">SilverStripe</a> and covered PDO.  I already researched and used PDO, so it was mostly review.

After talking to some of the other people at the conference, I've been seriously thinking of moving away from PDO and using MySQL specific functions because they expose some *really* cool debugging and profiling information.

<h4>Exploring Amazon EC2 for Scale-out Applications</h4>
The thought of EC2 sounds really cool.  The ability to create a server instance and host your stuff on it within minutes is sweet.  Need more servers, no problem, add another instance.  The speakers, Morgan Tocker of MySQL and Carl Mercier of Defensio, talked about their experience with EC2.

There are some serious data and management issues.  Until the other day, there wasn't any kind of persistent storage, meaning when the server went offline, you lost all your data.  Now you can mount a drive that persists across restarts.  But one issue for critical business transactions is how and when data is written to disk.  Is the data written immediately to disk or is buffered in the kernel or in some RAID card's cache?

Another issue they ran into is when a new machine is created, there's remnants of the previous machine's instance's data.  So they need to zero out the drive which takes 5 hours on single instance.

What I took away from the talk is EC2 is great if your app is simple and relies on 3rd party services (i.e. Facebook, Google, etc) that are more reliable than EC2.

<h4>Service Oriented Architecture with PHP and MySQL</h4>
<a href="http://www.joestump.com/">Joe Stump</a>, a PHP hacker at Digg, gave a talk about SOA.  It wasn't as much about "web services" as it is managing tasks and processing them asynchronously.

After talking to Joe, he highly recommended <a href="http://www.danga.com/gearman/">Gearman</a> to manage tasks.  From the Gearman site: "Gearman is a system to farm out work to other machines, dispatching function calls to machines that are better suited to do work, to do work in parallel, to load balance lots of function calls, or to call functions between languages."

So, if a user uploads an image, you can add the task of resizing the image to a backend processing mechanism.  This allows for a responsive front-end for the user.

Joe, along with Chris Goffinet, are working on <a href="http://code.google.com/p/netgearman/">netgearman</a> which is a PEAR package for interfacing with Gearman.

<h4>Memcached Hackathon BOF</h4>
This was a birds of a feature session where a bunch of people informally got together to discuss all things memcached.  Patrick Galbraith of <a href="http://www.grazr.com/">Grazr</a> showed off <a href="http://tangent.org/586/Memcached_Functions_for_MySQL.html">Memcached Functions for MySQL</a>.  This is super cool.  It allows you to set and get data in memcached within your SQL code via user defined functions.

So instead of pulling data from the DB to the app, then pushing it to memcached, you can just have a trigger or stored procedure store the value directly to memcached.  One caveat is when you rollback a transaction, it won't unset the value from memcached.

There was some discussion about the <a href="http://tangent.org/index.pl?node_id=506">memcached MySQL storage engine</a>.  After listening to them discuss it, I have to wonder if it is really worth it.  It acts like a distributed memory table, except when a server in a cluster goes down, it will affect all the other servers.]]></description>
			<content:encoded><![CDATA[<h4>Keynotes</h4>
<p>The keynote was kick started by Marten Mickos.  If you&#8217;ve never met Marten, he is, on a personal note, one of the greatest CEOs I&#8217;ve ever met.  The keynotes were especially interesting for me because it was the first time I&#8217;ve had the opportunity to listen to <a href="http://blogs.sun.com/jonathan/">Jonathan Schwartz</a>, the CEO of <a href="http://www.sun.com">Sun Microsystems</a>.  Jonathan seems like a great guy who gives the impression he &quot;gets it&quot;.</p>
<p>The last keynote was by Werner Vogels of Amazon.  His talk covered Amazon&#8217;s growth and the new services they offer including EC2.  He announced that EC2 now supports persistent storage, which is a huge improvement, but doesn&#8217;t quite solve all of the problems.</p>
<h4>Testing PHP/MySQL Applications with PHPUnit/DbUnit</h4>
<p>I&#8217;ve never been big into testing, but I&#8217;m trying to change that.  <a href="http://sebastian-bergmann.de">Sebastian Bergmann</a>, the author of <a href="http://www.amazon.com/PHPUnit-Pocket-Guide-Guides/dp/0596101031/ref=pd_bbs_sr_1?ie=UTF8&#038;s=books&#038;qid=1208361914&#038;sr=8-1">PHPUnit Pocket Reference</a> (<a href="http://www.phpunit.de/pocket_guide/3.2/en/index.html">free online version</a>), talked about <a href="http://phpun.it/">PHPUnit</a> and DbUnit and why I should use them.  Installing PHPUnit is extremely simple if you have pear installed:</p>
<p>pear channel-discover pear.phpunit.de<br />
pear install phpunit/PHPUnit</p>
<p>Once installed, just require PHPUnit:</p>
<pre class="brush: php; title: ;">
// php
require_once 'PHPUnit/Framework.php';
</pre>
<p>He just scratched the surface on writing unit tests.  One thing he pointed out was using <a href="http://cruisecontrol.sourceforge.net/">CruiseControl</a> for automated testing.  What&#8217;s really cool is you can fire off CruiseControl from Subversion commit hooks.  If the testing fails, CruiseControl can send an email with the results and who is to blame.</p>
<h4>Practical MySQL for Web Applications</h4>
<p><a href="http://dammit.lt/">Domas Mituzas</a> of MySQL and Wikipedia fame gave a good talk that covered practical design of web applications.  The talk covered simple stuff, so I didn&#8217;t learn a whole lot.  Nevertheless, Domas sometimes says some funny things that make the talk enjoyable.</p>
<h4>EXPLAIN Demystified</h4>
<p><a href="http://www.xaprb.com/blog/">Baron Schwartz</a> gave a talk about the <a href="http://dev.mysql.com/doc/refman/5.0/en/explain.html">EXPLAIN</a> statement.  EXPLAIN is run by prepending the word EXPLAIN to your SELECT statements.  It only works on SELECT statements.  When the query is run, it outputs an execution plan.</p>
<p>After running through the output of the EXPLAIN statement, he showed us mk-visual-explain which is one of the tools in <a href="http://www.maatkit.org/">Maatkit</a>.  It is a neato command line tool that takes the EXPLAIN output and reformats it as a tree structure.  It&#8217;s a great way to visualize the execution plan.  Now if only there was a GUI version&#8230;</p>
<h4>Upgrading to Elegant Versatile Database Architecture using PHP5 Data Objects</h4>
<p>This talk was given by Sigurd Magnusson of <a href="http://www.silverstripe.com/">SilverStripe</a> and covered PDO.  I already researched and used PDO, so it was mostly review.</p>
<p>After talking to some of the other people at the conference, I&#8217;ve been seriously thinking of moving away from PDO and using MySQL specific functions because they expose some *really* cool debugging and profiling information.</p>
<h4>Exploring Amazon EC2 for Scale-out Applications</h4>
<p>The thought of EC2 sounds really cool.  The ability to create a server instance and host your stuff on it within minutes is sweet.  Need more servers, no problem, add another instance.  The speakers, Morgan Tocker of MySQL and Carl Mercier of Defensio, talked about their experience with EC2.</p>
<p>There are some serious data and management issues.  Until the other day, there wasn&#8217;t any kind of persistent storage, meaning when the server went offline, you lost all your data.  Now you can mount a drive that persists across restarts.  But one issue for critical business transactions is how and when data is written to disk.  Is the data written immediately to disk or is buffered in the kernel or in some RAID card&#8217;s cache?</p>
<p>Another issue they ran into is when a new machine is created, there&#8217;s remnants of the previous machine&#8217;s instance&#8217;s data.  So they need to zero out the drive which takes 5 hours on single instance.</p>
<p>What I took away from the talk is EC2 is great if your app is simple and relies on 3rd party services (i.e. Facebook, Google, etc) that are more reliable than EC2.</p>
<h4>Service Oriented Architecture with PHP and MySQL</h4>
<p><a href="http://www.joestump.com/">Joe Stump</a>, a PHP hacker at Digg, gave a talk about SOA.  It wasn&#8217;t as much about &#8220;web services&#8221; as it is managing tasks and processing them asynchronously.</p>
<p>After talking to Joe, he highly recommended <a href="http://www.danga.com/gearman/">Gearman</a> to manage tasks.  From the Gearman site: &#8220;Gearman is a system to farm out work to other machines, dispatching function calls to machines that are better suited to do work, to do work in parallel, to load balance lots of function calls, or to call functions between languages.&#8221;</p>
<p>So, if a user uploads an image, you can add the task of resizing the image to a backend processing mechanism.  This allows for a responsive front-end for the user.</p>
<p>Joe, along with Chris Goffinet, are working on <a href="http://code.google.com/p/netgearman/">netgearman</a> which is a PEAR package for interfacing with Gearman.</p>
<h4>Memcached Hackathon BOF</h4>
<p>This was a birds of a feature session where a bunch of people informally got together to discuss all things memcached.  Patrick Galbraith of <a href="http://www.grazr.com/">Grazr</a> showed off <a href="http://tangent.org/586/Memcached_Functions_for_MySQL.html">Memcached Functions for MySQL</a>.  This is super cool.  It allows you to set and get data in memcached within your SQL code via user defined functions.</p>
<p>So instead of pulling data from the DB to the app, then pushing it to memcached, you can just have a trigger or stored procedure store the value directly to memcached.  One caveat is when you rollback a transaction, it won&#8217;t unset the value from memcached.</p>
<p>There was some discussion about the <a href="http://tangent.org/index.pl?node_id=506">memcached MySQL storage engine</a>.  After listening to them discuss it, I have to wonder if it is really worth it.  It acts like a distributed memory table, except when a server in a cluster goes down, it will affect all the other servers.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cb1inc.com/2008/04/16/mysql-conference-day-2-thoughts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scalability and Performance Best Practices</title>
		<link>http://www.cb1inc.com/2007/04/24/scalability-and-performance-best-practices/</link>
		<comments>http://www.cb1inc.com/2007/04/24/scalability-and-performance-best-practices/#comments</comments>
		<pubDate>Tue, 24 Apr 2007 23:43:13 +0000</pubDate>
		<dc:creator>Chris Barber</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Here at the <a href="http://www.mysqlconf.com" target="_blank">MySQL Conference and Expo</a>, Laura Thomson gave a great talk about Scalability and Performance Best Practices.

She had some interesting points about scalability. She basically said that no matter what language you write your web application, whether it's compiled (C/C++) or interpreted (PHP, Java), you are subject to scalability issues. Another potential problem is optimizing before you know what exactly to optimize. This can lead to a loss of time that could have been spent on more important things.

Laura's talk covers three types of best practices: general, scalability, and performance.

<b>General Best Practices</b>
First tip is to profile early and profile often. The earlier you can detect poor performance, the easier it is to fix. There are a handful of tools (<a href="http://pecl.php.net/package/apd" target="_blank">APD</a>, <a href="http://xdebug.org" target="_blank">Xdebug</a>, <a href="http://framework.zend.com" target="_blank">Zend</a>) that can help with profiling. Use system profiling tools such as <a href="http://sourceforge.net/projects/strace" target="_blank">strace</a>, <a href="http://www.sun.com/bigadmin/content/dtrace" target="_blank">dtrace</a>, and <a href="http://packages.debian.org/unstable/utils/ltrace.html" target="_blank">ltrace</a> to gather more information.

There are two types of effective profiling: debugging and habitual. Debugging profiling is about spotting deviations from the norm and habitual profiling is making the norm better. Profiling is an art and requires lots of practice to know where to look.

It is essential that the IT admins and the developers cooperate. This allows crisis' to be handled properly, especially in production environments were outages are time critical. Team members should report alert the developers of any abnormal behavior changes after a new code release is pushed. Before pushing new code, schedule a launch window and procedures for having developers fix problems and possibly falling back to a previous version. Avoid pushing releases on Fridays, otherwise key team members may be unavailable or over worked on the weekend.

It is recommended to test your application with production data. Test data may not take into account certain scenarios where bugs can be introduced. It is advised to have a staging environment which uses production data and also undergoes simulated load testing.

In order for you to track your application's performance, you should record your applications performance over a period of time, then analyze the data to find potential issues. There are several means of tracking performance including access logs, system metrics, application profiling, and query profiling.

When a problem occurs, don't make assumptions. The problem may be caused by something other than what you think it might be.

<b>Scalability Best Practices</b>
When the web application begins to suffer performance issues, start to decouple and isolate components to track down the source. If you need to tweak code, spend only enough time to refactor as needed. Reduce load on servers by moving static content on to dedicated servers.

By default, PHP stores session data on the hard drive. This can cause performance issues and can benefit from storing the session data in a database or better yet in a distributed cache such as <a href="http://www.danga.com/memcached" target="_blank">memcached</a>.

The most important thing you can do to improve performance is to cache as much data as possible. There are many levels of caching. You can cache data sets or precomputed fragments. For things like images, you can set up dedicated services for caching and serving static content. The usual suspects are recommended for caching (APC, memcached, <a href="http://www.squid-cache.org" target="_blank">Squid</a>).

PHP out of the box does not cache compiled pages. That means that ever request, each page has to be parsed and executed. Extensions such as APC and Zend can cache the compiled pages for an immediate speed improvement.

MySQL's query cache works, but isn't necessarily implemented the best way. If you query a table, the results are cached on the MySQL server. If a row is inserted, updated, or deleted, the entire cache is flushed. This supposedly has been fixed in MySQL 5.1, but a setting has to be set to not flush the cache.

To scale, your data can be federated across multiple MySQL servers. There can be complications with regards to data reliability and table joins can suffer from major speed hits.

A more reliable way to scale is to use replication. Replication does suffer from "slave lag" issues. The reason the lag can be high is because the master server uses multiple threads to store the data locally. The slave server has to process the replicated items in a single threaded mode to ensure the order of which the transactions is preserved. You can display the status of MySQL's I/O and SQL thread by executing a <code>SHOW PROCESSLIST</code> statement.

The more database writes, the greater the lag. Depending on your application, you may only want to use replication for failover or backups.

Sometimes you may benefit from designing your application to avoid situations where data is hard to scale and can't easily be cached.

<b>Performance Best Practices</b>
You definitely want to use a compiler cache. As described above, use APC or Zend for PHP5. If you are connecting to an external data source, perhaps a web service or data feed, minimize the number of instances you request them. Cache their response if possible. You may be able to load the data dynamically using Javascript and a little Ajax magic. Maybe the data isn't a must have or maybe you can have a page dedicated to display the 3rd party data.

When tuning your applications performance, change one thing at a time. If you change more than one thing, how do you know which change caused the improvement and how do you know if you didn't introduce new bugs changing the other things. Use MySQL's EXPLAIN statement to profile your queries and enable the slow query logging. Use <a href="http://jeremy.zawodny.com/mysql/mytop" target="_blank">MyTop</a> or <a href="http://sourceforge.net/projects/innotop" target="_blank">InnoTop</a> to help profile your queries.

It is crucial that your database is properly indexed. If a table has poorly designed indexes or perhaps too many indexes. Use the smallest data type possible and try to design your tables to be fixed width. That means, use char instead of varchar, set the length of your fields to logical lengths (ie use 128 chars instead of 107 chars). De-normalize when necessary. Remove static data out of the database or store it in a MEMORY table. Use the appropriate storage engine for each table.

For your queries, minimize the number of queries and cache them outside the database when possible.

She claims that deeply recursive code is expensive in PHP. Make sure you are not doing unnecessary looping. If you find that you are, chances are you are doing something wrong and that there is a better idiom for performing the task.

Don't try to work around or re-write perceived inefficiencies in PHP. Use regular expressions to do intense string manipulation. instead of writing complex serialization code, use PHP's extensions to do the heavy lifting. Before spending time to write some boilerplate function, check to see if there are any extensions that exist that could help save you time.

Laura gave this talk on behalf of George Schlossnagle. George's original presentation can be found at <a href="http://omniti.com/~george/talks" target="_blank">http://omniti.com/~george/talks</a>. This was an excellent session and proved to be beneficial.]]></description>
			<content:encoded><![CDATA[<p>Here at the <a href="http://www.mysqlconf.com" target="_blank">MySQL Conference and Expo</a>, Laura Thomson gave a great talk about Scalability and Performance Best Practices.</p>
<p>She had some interesting points about scalability. She basically said that no matter what language you write your web application, whether it&#8217;s compiled (C/C++) or interpreted (PHP, Java), you are subject to scalability issues. Another potential problem is optimizing before you know what exactly to optimize. This can lead to a loss of time that could have been spent on more important things.</p>
<p>Laura&#8217;s talk covers three types of best practices: general, scalability, and performance.</p>
<h4>General Best Practices</h4>
<p>First tip is to profile early and profile often. The earlier you can detect poor performance, the easier it is to fix. There are a handful of tools (<a href="http://pecl.php.net/package/apd" target="_blank">APD</a>, <a href="http://xdebug.org" target="_blank">Xdebug</a>, <a href="http://framework.zend.com" target="_blank">Zend</a>) that can help with profiling. Use system profiling tools such as <a href="http://sourceforge.net/projects/strace" target="_blank">strace</a>, <a href="http://www.sun.com/bigadmin/content/dtrace" target="_blank">dtrace</a>, and <a href="http://packages.debian.org/unstable/utils/ltrace.html" target="_blank">ltrace</a> to gather more information.</p>
<p>There are two types of effective profiling: debugging and habitual. Debugging profiling is about spotting deviations from the norm and habitual profiling is making the norm better. Profiling is an art and requires lots of practice to know where to look.</p>
<p>It is essential that the IT admins and the developers cooperate. This allows crisis&#8217; to be handled properly, especially in production environments were outages are time critical. Team members should report alert the developers of any abnormal behavior changes after a new code release is pushed. Before pushing new code, schedule a launch window and procedures for having developers fix problems and possibly falling back to a previous version. Avoid pushing releases on Fridays, otherwise key team members may be unavailable or over worked on the weekend.</p>
<p>It is recommended to test your application with production data. Test data may not take into account certain scenarios where bugs can be introduced. It is advised to have a staging environment which uses production data and also undergoes simulated load testing.</p>
<p>In order for you to track your application&#8217;s performance, you should record your applications performance over a period of time, then analyze the data to find potential issues. There are several means of tracking performance including access logs, system metrics, application profiling, and query profiling.</p>
<p>When a problem occurs, don&#8217;t make assumptions. The problem may be caused by something other than what you think it might be.</p>
<h4>Scalability Best Practices</h4>
<p>When the web application begins to suffer performance issues, start to decouple and isolate components to track down the source. If you need to tweak code, spend only enough time to refactor as needed. Reduce load on servers by moving static content on to dedicated servers.</p>
<p>By default, PHP stores session data on the hard drive. This can cause performance issues and can benefit from storing the session data in a database or better yet in a distributed cache such as <a href="http://www.danga.com/memcached" target="_blank">memcached</a>.</p>
<p>The most important thing you can do to improve performance is to cache as much data as possible. There are many levels of caching. You can cache data sets or precomputed fragments. For things like images, you can set up dedicated services for caching and serving static content. The usual suspects are recommended for caching (APC, memcached, <a href="http://www.squid-cache.org" target="_blank">Squid</a>).</p>
<p>PHP out of the box does not cache compiled pages. That means that ever request, each page has to be parsed and executed. Extensions such as APC and Zend can cache the compiled pages for an immediate speed improvement.</p>
<p>MySQL&#8217;s query cache works, but isn&#8217;t necessarily implemented the best way. If you query a table, the results are cached on the MySQL server. If a row is inserted, updated, or deleted, the entire cache is flushed. This supposedly has been fixed in MySQL 5.1, but a setting has to be set to not flush the cache.</p>
<p>To scale, your data can be federated across multiple MySQL servers. There can be complications with regards to data reliability and table joins can suffer from major speed hits.</p>
<p>A more reliable way to scale is to use replication. Replication does suffer from &#8220;slave lag&#8221; issues. The reason the lag can be high is because the master server uses multiple threads to store the data locally. The slave server has to process the replicated items in a single threaded mode to ensure the order of which the transactions is preserved. You can display the status of MySQL&#8217;s I/O and SQL thread by executing a <code>SHOW PROCESSLIST</code> statement.</p>
<p>The more database writes, the greater the lag. Depending on your application, you may only want to use replication for failover or backups.</p>
<p>Sometimes you may benefit from designing your application to avoid situations where data is hard to scale and can&#8217;t easily be cached.</p>
<h4>Performance Best Practices</h4>
<p>You definitely want to use a compiler cache. As described above, use APC or Zend for PHP5. If you are connecting to an external data source, perhaps a web service or data feed, minimize the number of instances you request them. Cache their response if possible. You may be able to load the data dynamically using Javascript and a little Ajax magic. Maybe the data isn&#8217;t a must have or maybe you can have a page dedicated to display the 3rd party data.</p>
<p>When tuning your applications performance, change one thing at a time. If you change more than one thing, how do you know which change caused the improvement and how do you know if you didn&#8217;t introduce new bugs changing the other things. Use MySQL&#8217;s EXPLAIN statement to profile your queries and enable the slow query logging. Use <a href="http://jeremy.zawodny.com/mysql/mytop" target="_blank">MyTop</a> or <a href="http://sourceforge.net/projects/innotop" target="_blank">InnoTop</a> to help profile your queries.</p>
<p>It is crucial that your database is properly indexed. If a table has poorly designed indexes or perhaps too many indexes. Use the smallest data type possible and try to design your tables to be fixed width. That means, use char instead of varchar, set the length of your fields to logical lengths (ie use 128 chars instead of 107 chars). De-normalize when necessary. Remove static data out of the database or store it in a MEMORY table. Use the appropriate storage engine for each table.</p>
<p>For your queries, minimize the number of queries and cache them outside the database when possible.</p>
<p>She claims that deeply recursive code is expensive in PHP. Make sure you are not doing unnecessary looping. If you find that you are, chances are you are doing something wrong and that there is a better idiom for performing the task.</p>
<p>Don&#8217;t try to work around or re-write perceived inefficiencies in PHP. Use regular expressions to do intense string manipulation. instead of writing complex serialization code, use PHP&#8217;s extensions to do the heavy lifting. Before spending time to write some boilerplate function, check to see if there are any extensions that exist that could help save you time.</p>
<p>Laura gave this talk on behalf of George Schlossnagle. George&#8217;s original presentation can be found at <a href="http://omniti.com/~george/talks" target="_blank">http://omniti.com/~george/talks</a>. This was an excellent session and proved to be beneficial.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cb1inc.com/2007/04/24/scalability-and-performance-best-practices/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP Performance and Security</title>
		<link>http://www.cb1inc.com/2007/04/24/php-performance-and-security/</link>
		<comments>http://www.cb1inc.com/2007/04/24/php-performance-and-security/#comments</comments>
		<pubDate>Tue, 24 Apr 2007 17:46:04 +0000</pubDate>
		<dc:creator>Chris Barber</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Today, Rasmus Lerdorf, the man who kick started PHP, gave a great talk about <a href="http://www.mysqlconf.com/cs/mysqluc2007/view/e_sess/14346" target="_blank">PHP Performance and Security</a>.

He began by talking about the new MySQL native driver. He did some benchmarks in which it appeared that the driver offered little performance improvements.

The first tool to use to track down performance issues is <a href="http://kcachegrind.sourceforge.net/cgi-bin/show.cgi" target="_blank">Callgrind</a> that runs on top of <a href="http://valgrind.org" target="_blank">Valgrind</a>. Callgrind dumps a file that can be opened with <a href="http://kcachegrind.sourceforge.net/cgi-bin/show.cgi" target="_blank">KCachegrind</a>, which is available on the Callgrind site.

Performance can be improved by installing <a href="http://pecl.php.net/package/APC" target="_blank">APC: Alternative PHP Cache</a>. Next he recommends installing the <a href="http://xdebug.org/" target="_blank">Xdebug</a> extension to profile your PHP application and find performance issues. Caching is key.

For security, he described a scenario where you can browse to a website and the website lists a bunch of links to various websites. With Javascript, the site can detect if the link has been visited. If it has, he could have the Javascript check those pages to see if your session is still valid and then cause problems such as transfer money or open your firewall. You can reduce the surface area of these kinds of attacks by passing all inputs through filters. Each form field, URL, cookie, whatever must go through a filter to escape potential problems.

Next he covers attacks by passing extra stuff in the URL. Even escaping URL parameters with htmlspecialchars() doesn't protect you from characters that are already escape that are evaluated in the browser to do harmful things.

He talked about a spoofing trick where older versions of the Flash plugin in Internet Explorer can add attributes to the request header such as the domain. When providing links to download PDF files, the URL can include Javascript code that is executed when the PDF plugin is loaded. This can be prevented by setting the mime type for .pdf to application/octet-stream which forces PDFs to be downloaded.

Cross-site request forgery is another huge problem. By adding a hidden input field with some sorts of a session token, or "crumb" as he calls it, in combination with your session cookie, can be used to verify the request is valid.

Rasmus has made his presentation available online at <a href="http://talks.php.net/show/mysql07" target="_blank">http://talks.php.net/show/mysql07</a>.]]></description>
			<content:encoded><![CDATA[<p>Today, Rasmus Lerdorf, the man who kick started PHP, gave a great talk about <a href="http://www.mysqlconf.com/cs/mysqluc2007/view/e_sess/14346" target="_blank">PHP Performance and Security</a>.</p>
<p>He began by talking about the new MySQL native driver. He did some benchmarks in which it appeared that the driver offered little performance improvements.</p>
<p>The first tool to use to track down performance issues is <a href="http://kcachegrind.sourceforge.net/cgi-bin/show.cgi" target="_blank">Callgrind</a> that runs on top of <a href="http://valgrind.org" target="_blank">Valgrind</a>. Callgrind dumps a file that can be opened with <a href="http://kcachegrind.sourceforge.net/cgi-bin/show.cgi" target="_blank">KCachegrind</a>, which is available on the Callgrind site.</p>
<p>Performance can be improved by installing <a href="http://pecl.php.net/package/APC" target="_blank">APC: Alternative PHP Cache</a>. Next he recommends installing the <a href="http://xdebug.org/" target="_blank">Xdebug</a> extension to profile your PHP application and find performance issues. Caching is key.</p>
<p>For security, he described a scenario where you can browse to a website and the website lists a bunch of links to various websites. With Javascript, the site can detect if the link has been visited. If it has, he could have the Javascript check those pages to see if your session is still valid and then cause problems such as transfer money or open your firewall. You can reduce the surface area of these kinds of attacks by passing all inputs through filters. Each form field, URL, cookie, whatever must go through a filter to escape potential problems.</p>
<p>Next he covers attacks by passing extra stuff in the URL. Even escaping URL parameters with htmlspecialchars() doesn&#8217;t protect you from characters that are already escape that are evaluated in the browser to do harmful things.</p>
<p>He talked about a spoofing trick where older versions of the Flash plugin in Internet Explorer can add attributes to the request header such as the domain. When providing links to download PDF files, the URL can include Javascript code that is executed when the PDF plugin is loaded. This can be prevented by setting the mime type for .pdf to application/octet-stream which forces PDFs to be downloaded.</p>
<p>Cross-site request forgery is another huge problem. By adding a hidden input field with some sorts of a session token, or &#8220;crumb&#8221; as he calls it, in combination with your session cookie, can be used to verify the request is valid.</p>
<p>Rasmus has made his presentation available online at <a href="http://talks.php.net/show/mysql07" target="_blank">http://talks.php.net/show/mysql07</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.cb1inc.com/2007/04/24/php-performance-and-security/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

