<?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"
	>

<channel>
	<title>abbett.org</title>
	<atom:link href="http://www.abbett.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.abbett.org</link>
	<description>Dispatches from the world of interaction design</description>
	<pubDate>Mon, 23 Jun 2008 17:33:40 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Reactions to the new WordPress dashboard</title>
		<link>http://www.abbett.org/2008/06/04/reactions-to-the-new-wordpress-dashboard/</link>
		<comments>http://www.abbett.org/2008/06/04/reactions-to-the-new-wordpress-dashboard/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 13:50:33 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.abbett.org/?p=19</guid>
		<description><![CDATA[My site got hacked &#8212; fortunately in a way that wasn&#8217;t visible to visitors &#8212; so I upgraded my site to the latest WordPress release.  This is the first time in my long relationship with WordPress that I&#8217;ve been unhappy with an upgrade: the dashboard is really hard to use.  Buttons don&#8217;t look [...]]]></description>
			<content:encoded><![CDATA[<p>My site got hacked &#8212; fortunately in a way that wasn&#8217;t visible to visitors &#8212; so I upgraded my site to the latest WordPress release.  This is the first time in my long relationship with WordPress that I&#8217;ve been unhappy with an upgrade: the dashboard is really hard to use.  Buttons don&#8217;t look like buttons; there are so many links and options on every screen; some links are underlined, others are not; some elements stretch across the browser window, others are fixed-width; there&#8217;s too much contrast between certain elements, and not enough contrast between others.</p>
<p>The experience, sad to say, is approaching Vista-like proportions &#8212; in this case, though, I don&#8217;t have a stable, secure XP to fall back on.</p>
<p>Given the proclivity to make everything in WordPress configurable and skinnable, I wouldn&#8217;t be surprised to see &#8220;Dashboard themes&#8221; in a future version.  I also wouldn&#8217;t be surprised to see a far simpler upstart blogging engine start to chip at WordPress&#8217;s market share.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abbett.org/2008/06/04/reactions-to-the-new-wordpress-dashboard/feed/</wfw:commentRss>
		</item>
		<item>
		<title>The role of art in UCD</title>
		<link>http://www.abbett.org/2008/05/30/the-role-of-art-in-ucd/</link>
		<comments>http://www.abbett.org/2008/05/30/the-role-of-art-in-ucd/#comments</comments>
		<pubDate>Fri, 30 May 2008 17:20:14 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
		
		<category><![CDATA[The Profession]]></category>

		<category><![CDATA[User-Centered Design]]></category>

		<guid isPermaLink="false">http://www.abbett.org/2008/05/30/the-role-of-art-in-ucd/</guid>
		<description><![CDATA[During a panel discussion at the UPA Boston miniconference on Wednesday &#8212; humorously dubbed by Chauncey Wilson as &#8220;Cranky Geeks Complain About the Field&#8221; &#8212; the audience was encouraged to voice their own concerns about user-centered design for consideration by the three panelists.  One comment that stirred up some discussion was a desire for [...]]]></description>
			<content:encoded><![CDATA[<p>During a <a href="http://www.upaboston.org/miniconf08/schedule_details.shtml#wilson">panel discussion</a> at the UPA Boston miniconference on Wednesday &#8212; humorously dubbed by Chauncey Wilson as &#8220;Cranky Geeks Complain About the Field&#8221; &#8212; the audience was encouraged to voice their own concerns about user-centered design for consideration by the three panelists.  One comment that stirred up some discussion was a desire for art to be a more central part of our work.  (It is &#8220;design,&#8221; after all, the thinking goes.)  Thoughts of iPhones and <a href="http://www.target.com/Michael-Graves-Design/b?ie=UTF8&#038;node=1060502">Michael Graves-inspired housewares</a>, no doubt, were swimming through everyone&#8217;s mind, but I got a little uncomfortable.  After a lot of reading, and an increasing amount of contact with other practitioners, I&#8217;ve come up with a decent mental model of what an interaction designer/user experience engineer ought to do, and art, while important for the end product, isn&#8217;t central.  Neither for that matter is technology&#8230; or business.</p>
<p>In fact, that&#8217;s the whole point.</p>
<p>At another session, I was impressed with the term &#8220;mastery of materials,&#8221; borrowed almost certainly from the industrial design world.  The designer doesn&#8217;t manufacture widgets, doesn&#8217;t dictate the business requirements, doesn&#8217;t use the paintbrush.  He does, however, have intimate knowledge of <em>what to expect</em> from each building block available to him &#8212; whether it&#8217;s CSS, textiles, AJAX, extruded plastic, or a glowing screen.  Mastery of materials.</p>
<p>The interaction designer need not learn the gritty details of PHP, Ruby, or JSF to know what heights a web application can reach, and he need not have an MFA to know how beautiful a pixel-perfect mockup can be when crafted by a graphic designer.  (He certainly needs to know when to involve those specialists in his process.)</p>
<p>In the middle of management, programmers, artists, and marketers lives the interaction designer, pulling in requirements, limitations, possibilities, ideas, and criticism to generate an actionable vision for the implementation of a product.</p>
<p>At the end of the day, 99% of user experience work does not result in jaw-dropping, award-winning artistic masterpieces.  It&#8217;s ecommerce checkout systems that don&#8217;t suck, or group collaboration tools that smoothly integrate with the rest of your life, or cell phone text message input that&#8217;s easy to use on the run.  There&#8217;s a huge need for this bread and butter user-centered design.  I&#8217;m decidedly not an artist, and I&#8217;m certainly not discouraged by that.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abbett.org/2008/05/30/the-role-of-art-in-ucd/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Updated Sketch GUI Shapes for Visio</title>
		<link>http://www.abbett.org/2008/05/27/updated-sketch-gui-shapes-for-visio/</link>
		<comments>http://www.abbett.org/2008/05/27/updated-sketch-gui-shapes-for-visio/#comments</comments>
		<pubDate>Tue, 27 May 2008 19:43:20 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.abbett.org/2008/05/27/updated-sketch-gui-shapes-for-visio/</guid>
		<description><![CDATA[
Below, find a link to download my revision of Niklas Wolkert&#8217;s &#8220;sketchy&#8221; Visio prototyping shapes that are included in Henrik Olsen&#8217;s GUUUI Web Prototyping Tool.  These shapes have made mocking up a web UI much easier, and the hand-drawn style makes it very clear to stakeholders that &#8220;this is not yet working software.&#8221;  [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.abbett.org/wp-content/uploads/2008/05/wall-of-mockups.jpg" alt="Wall of Mockups" /></p>
<p>Below, find a link to download my revision of Niklas Wolkert&#8217;s &#8220;sketchy&#8221; Visio prototyping shapes that are included in Henrik Olsen&#8217;s <a href="http://www.guuui.com/issues/02_07.php">GUUUI Web Prototyping Tool</a>.  These shapes have made mocking up a web UI much easier, and the hand-drawn style makes it very clear to stakeholders that &#8220;this is not yet working software.&#8221;  My typographical and usability improvements include:</p>
<ul>
<li><strong>Got rid of <a href="http://bancomicsans.com/">heinous Comic Sans</a> typeface.</strong> I use Calibri except in the form elements, which use Consolas.</li>
<li><strong>Changed text spacing on all text block items.</strong> Almost every text element has zero spacing, so it can be placed more precisely.</li>
<li><strong>Made left margin consistent between check boxes and radio buttons.</strong></li>
<li><strong>Made &#8220;edit text&#8221; the default double-click behavior.</strong> Original shapes did not have consistent behavior, requiring first a single-click, and then a click of the &#8220;Text Tool&#8221; button.</li>
<li><strong>Improved &#8220;empty box&#8221; shape.</strong> Sometimes I like to use the empty box shape as a textarea, so I gave it some default text font/spacing settings to accomodate.</li>
<li><strong>Added the Grid Column shape.</strong> I may be running afoul of some sort of license, but I copied the &#8220;Grid Column&#8221; shape from the &#8220;Common Controls&#8221; stencil; it helps for mocking up tables. Unfortunately, it&#8217;s not &#8220;sketchy,&#8221; but I made the fonts consistent.</li>
</ul>
<p><a href="http://www.abbett.org/resources/SketchGUIShapes.zip">Download Updated Sketch GUI Shapes</a> (zip of Visio 2007 .vss)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abbett.org/2008/05/27/updated-sketch-gui-shapes-for-visio/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A Visual Vocabulary for Information Architecture</title>
		<link>http://www.abbett.org/2008/05/20/a-visual-vocabulary-for-information-architecture/</link>
		<comments>http://www.abbett.org/2008/05/20/a-visual-vocabulary-for-information-architecture/#comments</comments>
		<pubDate>Tue, 20 May 2008 19:47:19 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.abbett.org/2008/05/20/a-visual-vocabulary-for-information-architecture/</guid>
		<description><![CDATA[I was fortunate to find Jesse James Garrett&#8217;s article, &#8220;A visual vocabulary for describing information architecture and interaction design,&#8221; on his website yesterday.  Flowcharting is not a skill I&#8217;ve been privileged to learn formally, and I&#8217;ve been hesitant to get into it for fear of doing it wrong, since I assume there actually is [...]]]></description>
			<content:encoded><![CDATA[<p>I was fortunate to find Jesse James Garrett&#8217;s article, &#8220;<a href="http://www.jjg.net/ia/visvocab/">A visual vocabulary for describing information architecture and interaction design</a>,&#8221; on his website yesterday.  Flowcharting is not a skill I&#8217;ve been privileged to learn formally, and I&#8217;ve been hesitant to get into it for fear of doing it wrong, since I assume there actually is a right way to draw a flow chart.  Garrett, thankfully, has published his approach to a simple, IA/IxD-specific design diagram which can serve as a basis for all other design tasks:</p>
<blockquote><p>The trouble is that the detail each audience requires differs vastly from the detail required by others, and the bulk of this detail is irrelevant to the needs of other audiences. The sensible approach is to limit the detail in the diagram to that which can be usefully applied by all audiences. The diagram thereby serves as a touchstone document for the development of more detailed documents specific to the needs of each audience.</p></blockquote>
<p>The article gets high marks for including inline examples, full-featured downloadable examples, and shape libraries in a dozen formats.  I&#8217;ve already successfully migrated my latest flow map to his format, and along the way, tweaked the Visio stencil to be more in line with my style:</p>
<ul>
<li>Calibri typeface, rather than Verdana (it&#8217;s narrower and a bit more refined)</li>
<li>Connector labels that cover the line (the Visio default), with a white text-box background</li>
<li>Improved text spacing in the File Stack shape</li>
<li>Improved text spacing in the area shapes</li>
</ul>
<p><a href="http://www.abbett.org/resources/IADiagramming.vss">Updated IA/IxD Diagramming Stencil</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.abbett.org/2008/05/20/a-visual-vocabulary-for-information-architecture/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Theme in search of project</title>
		<link>http://www.abbett.org/2008/05/19/theme-in-search-of-project/</link>
		<comments>http://www.abbett.org/2008/05/19/theme-in-search-of-project/#comments</comments>
		<pubDate>Tue, 20 May 2008 04:03:07 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
		
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.abbett.org/2008/05/19/theme-in-search-of-project/</guid>
		<description><![CDATA[I can&#8217;t wait for an opportunity to use this commercial theme from Quommunication: News. It&#8217;s probably one of the cleanest, most air-tight WordPress themes I&#8217;ve come across.  True to its name, News is for magazine-style sites, so it might be a long wait.
]]></description>
			<content:encoded><![CDATA[<p>I can&#8217;t wait for an opportunity to use this commercial theme from Quommunication: <a href="http://quommunication.com/news/index.html">News</a>. It&#8217;s probably one of the cleanest, most air-tight WordPress themes I&#8217;ve come across.  True to its name, News is for magazine-style sites, so it might be a long wait.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abbett.org/2008/05/19/theme-in-search-of-project/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Under the hood, minimalist WordPress themes are anything but</title>
		<link>http://www.abbett.org/2008/05/19/under-the-hood-minimalist-wordpress-themes-are-anything-but/</link>
		<comments>http://www.abbett.org/2008/05/19/under-the-hood-minimalist-wordpress-themes-are-anything-but/#comments</comments>
		<pubDate>Mon, 19 May 2008 21:12:45 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
		
		<category><![CDATA[HTML]]></category>

		<category><![CDATA[Typography]]></category>

		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.abbett.org/2008/05/19/under-the-hood-minimalist-wordpress-themes-are-anything-but/</guid>
		<description><![CDATA[I had never been completely comfortable with the previous theme I set up for abbett.org, even though I had modified it extensively, so upon discovering a list of &#8220;minimalist&#8221; WordPress themes last week, I started trying new looks.  I&#8217;m still not settled on a new theme, and I&#8217;m discovering that many of the simple-looking [...]]]></description>
			<content:encoded><![CDATA[<p>I had never been completely comfortable with the previous theme I set up for abbett.org, even though I had modified it extensively, so upon discovering a list of &#8220;minimalist&#8221; WordPress themes last week, I started trying new looks.  I&#8217;m still not settled on a new theme, and I&#8217;m discovering that many of the simple-looking themes out there are just disasters of code: capellini nests of PHP and CSS, hidden by delicate facades of sans-serif typography.  Used out of the box, they look pretty good, but a lesser man could easily be broken by even basic attempts at customization.</p>
<p>I don&#8217;t doubt that there are a few standards-compliant, easy-to-modify themes somewhere that match careful visual design with elegant code, but I haven&#8217;t stumbled across them yet.  (I also haven&#8217;t done a scientifically exhaustive search.)</p>
<p>But I&#8217;m really trying to get at a larger point: <strong>RSS represents the failure of HTML</strong>. HTML should be more than sufficient to convey the written word, but it has become loaded with cross-browser hacks, meaningless DIVs, navigational elements built of lists and headers with no semantic value, etc.  One can rarely view the source of a web page and get an understanding of how the page&#8217;s content is organized.  Skinnable blogs, while a boon to the Internet at large, are a major contributor to this problem.</p>
<p>Meanwhile, RSS succeeds, proliferates even, because it is simple, it is structured, and it is consistent; it is the essence of content, perfect for man or machine.  Forget the blogs themselves; just take the content and run&#8230; to Google Reader, to Live Bookmarks, to Thunderbird.</p>
<p>But I have one lingering problem&#8211; I hate using RSS readers.  They take the life out of syndicated content.  Just as there&#8217;s something special about the tactile experience of reading a newspaper, about the smell of newsprint, about relaxing on the couch with that week&#8217;s <em>New Yorker</em> &#8212; a well-designed blog offers more than just text.  Logging on to <a href="http://blog.ruhlman.com/">ruhlman.com</a> and <a href="http://stevesilver.net">stevesilver.net</a> everyday (rather than seeing a list of headlines on Facebook) has a similar distinction to picking up that fresh magazine.</p>
<p>What&#8217;s needed, in my mind, is a return to the web&#8217;s roots: strict separation of content from presentation &#8212; along with excellent content (spell-check, proofread) and excellent presentation (typography, typography, typography).  RSS won&#8217;t be as necessary once the source data itself is interpretable, and simpler HTML, I presume, will make for simpler WordPress themes, and simpler customization.</p>
<p>(But don&#8217;t look at my source code just yet!)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abbett.org/2008/05/19/under-the-hood-minimalist-wordpress-themes-are-anything-but/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Configuring Oracle Express for development</title>
		<link>http://www.abbett.org/2007/12/12/configuring-oracle-express-for-development/</link>
		<comments>http://www.abbett.org/2007/12/12/configuring-oracle-express-for-development/#comments</comments>
		<pubDate>Wed, 12 Dec 2007 14:51:05 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
		
		<category><![CDATA[Oracle]]></category>

		<guid isPermaLink="false">http://www.abbett.org/2007/12/12/configuring-oracle-express-for-development/</guid>
		<description><![CDATA[It&#8217;s been a rough couple weeks getting used to Oracle, but I&#8217;m finally getting my development environment smoothed out.  One important configuration change I&#8217;ve had to do on two instances of Oracle Express is upping the maximum number of connections the database server will accept.  As usual, I came upon the problem by [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been a rough couple weeks getting used to Oracle, but I&#8217;m finally getting my development environment smoothed out.  One important configuration change I&#8217;ve had to do on two instances of Oracle Express is upping the maximum number of connections the database server will accept.  As usual, I came upon the problem by way of a thoroughly useless Oracle error&#8211;</p>
<pre>ORA-12516: TNS:listener could not find available handler with matching protocol stack</pre>
<p>&#8220;Of course!  Wait&#8230; what?&#8221;  Luckily, those who precede me have <a href="http://forums.oracle.com/forums/thread.jspa?messageID=1974776">encountered the same problem</a>, and the recommend fix (from the <a href="http://www.oracle.com/technology/tech/php/pdf/underground-php-oracle-manual.pdf">Underground PHP and Oracle Manual</a> (PDF), page 175) worked like a charm.</p>
<p>First, connect to Oracle as the SYS user using SQL*Plus &#8212; that&#8217;s &#8220;Run SQL Command Line&#8221; for us Windows folk.  </p>
<pre>SQL> CONNECT SYS/password AS sysdba
Connected.
</pre>
<p>Then, check the value of your &#8220;processes&#8221; parameter.</p>
<pre>SQL> show parameter processes
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------
aq_tm_processes                      integer     0
db_writer_processes                  integer     1
gcs_server_processes                 integer     0
job_queue_processes                  integer     4
log_archive_max_processes            integer     2
processes                            integer     40
</pre>
<p>By default, that last value is 40.  I&#8217;m not sure why 40 isn&#8217;t enough &#8212; seems like a lot of connections &#8212; but let&#8217;s up it to 100.</p>
<pre>SQL> alter system set processes=100 scope=spfile;
System altered.</pre>
<p>Then, shutdown and restart the server.</p>
<pre>SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area  805306368 bytes
Fixed Size                  1289996 bytes
Variable Size             213909748 bytes
Database Buffers          587202560 bytes
Redo Buffers                2904064 bytes
Database mounted.
Database opened.
</pre>
<p>If you like, you can run that &#8220;show parameter processes&#8221; command again to confirm that 100 is the new value.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abbett.org/2007/12/12/configuring-oracle-express-for-development/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Using Oracle with PHP and CodeIgniter</title>
		<link>http://www.abbett.org/2007/12/02/using-oracle-with-php-and-codeigniter/</link>
		<comments>http://www.abbett.org/2007/12/02/using-oracle-with-php-and-codeigniter/#comments</comments>
		<pubDate>Sun, 02 Dec 2007 21:15:40 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
		
		<category><![CDATA[CodeIgniter]]></category>

		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.abbett.org/2007/12/02/using-oracle-with-php-and-codeigniter/</guid>
		<description><![CDATA[Configuring PHP
My first mistake when configuring PHP to support Oracle was to assume that it would be as easy as MySQL; that is to say, on Windows, simply enabling the Oracle DLL that ships with PHP.  No such luck, and the error message you see &#8212; when you finally remember to check your PHP [...]]]></description>
			<content:encoded><![CDATA[<h2>Configuring PHP</h2>
<p>My first mistake when configuring PHP to support Oracle was to assume that it would be as easy as MySQL; that is to say, on Windows, simply enabling the Oracle DLL that ships with PHP.  No such luck, and the error message you see &#8212; when you finally remember to check your PHP error log &#8212; isn&#8217;t very helpful:</p>
<pre>PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\Program Files\Zend\Core\lib\phpext\php_oci8.dll' - The specified module could not be found.
in Unknown on line 0</pre>
<p>Thanfully, I found a document on the Oracle website that explains <a href="http://www.oracle.com/technology/pub/notes/technote_php_instant.html">how to configure PHP on Linux and Windows for Oracle support</a>.  I&#8217;d say this was the first straightforwardly helpful piece of Oracle documentation I&#8217;d ever used.  Frustrations nevertheless ensued.  When I downloaded Oracle 10g Express to load on my desktop, the website mentioned that I wouldn&#8217;t need any additional Oracle client downloads.  (It was a gigantic enough download!) So, naturally, I figured that the client libraries needed to for PHP/Oracle support would all be somewhere in my install folder.  Incorrect!  As the configuration instructions suggested, I also had to download the (39-megabyte) Instant Client Basic for Windows, which contained all three libraries.  I plunked them into a new directory, put that directory on my path, and revved up PHP.  This time, no errors.</p>
<p><em>Easy Alternative: Zend Core offers a &#8220;<a href="http://www.zend.com/en/products/core/for-oracle">for Oracle</a>&#8221; version with Oracle support built in, out of the box.</em></p>
<h2>Configuring CodeIgniter</h2>
<p>I&#8217;ve started using CodeIgniter heavily in the last few months, and it&#8217;s a real time-saver once you get the hang of it.  While I have a couple hangups about the CI User Guide &#8212; mainly that it&#8217;s slanted too severely toward the &#8220;quick example&#8221; side without comprehensive reference information to fill in the gaps &#8212; the user community tends to be quite helpful.  Accordingly, the User Guide only says that <a href="http://codeigniter.com/user_guide/general/requirements.html">CI supports an Oracle database</a>, with no instructions on how to complete the built-in database configuration to use Oracle.  So, I browsed the forums and found a few folks who had posted their Oracle configurations, and noted that, in general, one&#8217;s database config should look like this:</p>
<pre>$db['default']['hostname'] = &#8220;//localhost/XE&#8221;;
$db['default']['username'] = &#8220;USERNAME&#8221;;
$db['default']['password'] = &#8220;PASSWORD&#8221;;
$db['default']['database'] = &#8220;DATABASE_NAME&#8221;;
$db['default']['dbdriver'] = &#8220;oci8&#8243;;</pre>
<p>That hostname field can optionally contain a port number, if it differs from the standard 1521:</p>
<pre>$db['default']['hostname'] = &#8220;//localhost:9999/XE&#8221;;</pre>
<p>The &#8220;XE&#8221; in both examples is the default SID that Oracle 10g Express uses.  (Unfortunately, I&#8217;m still oblivious as to the utility of an SID.)  Also note that username, password, and database fields probably ought to be in uppercase &#8212; more case sensitivity implications on their way, stay tuned.</p>
<p>That done, we&#8217;re ready to query for some data.  But wait!  I tested my existing application code (previously running on a MySQL database) and got these warnings:</p>
<pre>ERROR - 2007-12-02 15:02:05 --> Severity: Warning  --> ocifetchinto() expects parameter 1 to be resource, null given C:\codeigniter\system\database\drivers\oci8\oci8_result.php 159
ERROR - 2007-12-02 15:02:05 --> Severity: Warning  --> ociexecute() expects parameter 1 to be resource, null given C:\codeigniter\system\database\drivers\oci8\oci8_result.php 46</pre>
<p>Yet again, the CodeIgniter forum <a href="http://codeigniter.com/forums/viewthread/63301/">came to the rescue</a>: there&#8217;s an Oracle-specific bug in CI&#8217;s platform-independent database abstraction class. It&#8217;s fixed with a simple cut-and-paste.  Around line 324, the <code>$RES->num_rows</code> line needs to be moved down below the <code>if</code> block, a la:</p>
<pre>$driver 		= $this->load_rdriver();
$RES 			= new $driver();
$RES->conn_id	= $this->conn_id;
$RES->result_id	= $this->result_id;

if ($this->dbdriver == 'oci8')
{
  $RES->stmt_id		= $this->stmt_id;
  $RES->curs_id		= NULL;
  $RES->limit_used	= $this->limit_used;
}

$RES->num_rows	= $RES->num_rows();</pre>
<p>No more warnings.</p>
<h2>Using Active Record</h2>
<p>CodeIgniter&#8217;s Active Record class makes most database queries dead simple and, combined with centralized configuration and automatic connections, cuts down significantly on lines of code.  Using Active Record in my model class, I have a login method which checks a users table for the proper username and password:</p>
<pre>$query = $this->db->getwhere('users', array('username' => $username, 'password' => md5($password)));</pre>
<p>Then, I check the result for an active user by inspecting the flags field for a non-negative value:</p>
<pre>if (isset($query->row()->flags) &#038;&#038; $query->row()->flags >= 0) { ... }</pre>
<p>For some reason, I just couldn&#8217;t log in, but I wasn&#8217;t getting any error messages from PHP or CodeIgniter.  Then, I recalled my case sensitivity wrangling from earlier, and my cogs started turning.  My database had been constructed with all uppercase table names and column names, so perhaps my result&#8217;s fields would be uppercase, too.  A simple var_dump of the result object proved my theory:</p>
<pre>object(CI_DB_oci8_result)#17 (9) {
  ["stmt_id"]=>
  resource(33) of type (oci8 statement)
  ["curs_id"]=>
  NULL
  ["limit_used"]=>
  NULL
  ["conn_id"]=>
  resource(24) of type (oci8 persistent connection)
  ["result_id"]=>
  bool(true)
  ["result_array"]=>
  array(1) {
    [0]=>
    array(3) {
      ["USERNAME"]=>
      string(8) &#8220;username&#8221;
      ["PASSWORD"]=>
      string(32) &#8220;&#8230;&#8221;
      ["FLAGS"]=>
      string(1) &#8220;0&#8243;
    }
  }
  ["result_object"]=>
  array(0) {
  }
  ["current_row"]=>
  int(0)
  ["num_rows"]=>
  int(1)
}</pre>
<p>Now, I reference the uppercase member variables in my code and it all works fine:</p>
<pre>if (isset($query->row()->FLAGS) &#038;&#038; $query->row()->FLAGS >= 0) { ... }</pre>
<p>I&#8217;m not sure whom to implicate for the misunderstanding.  When I write SQL queries &#8212; against MySQL or Oracle &#8212; my schema, table, and columns names may be written in any case, and I get a proper result.  Shouldn&#8217;t that case insensitivity carry through into Active Record and/or PHP?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abbett.org/2007/12/02/using-oracle-with-php-and-codeigniter/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Migrating from the PHP/Java Bridge to the Zend Java Bridge</title>
		<link>http://www.abbett.org/2007/10/01/migrating-from-the-phpjava-bridge-to-the-zend-java-bridge/</link>
		<comments>http://www.abbett.org/2007/10/01/migrating-from-the-phpjava-bridge-to-the-zend-java-bridge/#comments</comments>
		<pubDate>Mon, 01 Oct 2007 14:16:31 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.abbett.org/?p=7</guid>
		<description><![CDATA[At work, I&#8217;ve been evaluating the Zend Java Bridge (part of the commercial Zend Platform) as an alternative to the open-source PHP/Java Bridge.  Our theory is that the Zend version may be more production-class (i.e. stable, secure, supported, and such), but we still want to make our code operable with either bridge so our [...]]]></description>
			<content:encoded><![CDATA[<p>At <a href="http://www.indivohealth.org/">work</a>, I&#8217;ve been evaluating the Zend Java Bridge (part of the commercial <a href="http://www.zend.com/products/zend_platform">Zend Platform</a>) as an alternative to the open-source <a href="http://php-java-bridge.sourceforge.net/pjb/index.php">PHP/Java Bridge</a>.  Our theory is that the Zend version may be more production-class (i.e. stable, secure, supported, and such), but we still want to make our code operable with either bridge so our user community isn&#8217;t locked into a commercial product.  So far, it&#8217;s promising.  Zend Platform sits on top of <a href="http://www.zend.com/products/zend_core">Zend Core</a> &#8212; which bundles PHP, Apache and MySQL &#8212; making installation a snap, and the Platform management interface is a breath of fresh air, no more sifting through four separate directories of log files to figure out what&#8217;s going wrong.  When things do go wrong, the Platform will wrap up all necessary support artifacts for submission to Zend in a trouble ticket &#8212; and their technical support response time has been admirable so far (at least for the easy problems).</p>
<p>Our code is still interoperable, but there have been some sizable snags with Zend. Mostly it&#8217;s things I&#8217;ve gotten used to after two years of wrestling with the PHP/Java Bridge that aren&#8217;t available with Zend.  I&#8217;ll document them here (and their workarounds, if possible) as I come upon them.</p>
<h2>No way to dynamically load libraries</h2>
<p>Sometimes, especially during development, you don&#8217;t have a fixed set of JARs to enshrine in a system variable.  The PHP/Java Bridge lets you programatically load libraries with the <code>java_require("jar1;jar2;jar3")</code> command, or will automatically load all the JARs in a configurable &#8220;extra libraries&#8221; directory.  Zend, on the other hand, makes you write out your classpath in full.  On Linux, you can modify the script which starts your Java Bridge by adding the name of each extra JAR it should load.  On Windows, you need to change the CLASSPATH environment variable.  Neither way is particularly user-friendly.</p>
<p>On my Windows development box, I&#8217;ve cheated a bit, and copied all my JARs to the JRE&#8217;s <code>\lib\ext\</code> directory.  I figure that&#8217;s okay for the time being.  On our production systems, the code will be stable, so we can use a formal classpathing method.  In any case, the Zend folks have said that this month&#8217;s new release of the Java Bridge will allow dynamic library loading.</p>
<h2>No language construct to access class objects</h2>
<p>The PHP/Java Bridge has a simple <code>new JavaClass("java.util.Arrays")</code> command that returns a class object, rather than an object of the class (like <code>new Java("...")</code> does).  Zend simply does not.  The workaround I&#8217;ve developed seems to work fine:</p>
<pre>function getJavaClass($classname) {
  $c = new Java("java.lang.Class");
  return $c->forName($classname);
}</pre>
<h2>Can&#8217;t instantiate a javax.xml.datatype.DatatypeFactory</h2>
<p>I get a bizarre exception when I try to instantiate this class.</p>
<pre>java.lang.IllegalAccessException: Class com.zend.javamw.q can not access a member of class javax.xml.datatype.DatatypeFactory with modifiers "protected"</pre>
<p>The boys at Zend are still looking into this one.  If they can&#8217;t resolve it, we&#8217;re back to square one.</p>
<p><strong>Update - October 10:</strong> Zend has reproduced the problem and logged it as a bug.</p>
<h2>Problems with iterators</h2>
<p>I knew off the bat that the Zend Bridge wouldn&#8217;t handle iterators as nicely at the PHP/Java Bridge (which lets you use any java.util.List from within a PHP <code>foreach</code>), but for no apparent reason, Zend won&#8217;t even give me an iterator or let me use any other List method in certain circumstances.  I was able to create a simple reproduction of the problem using a <code>com.sun.xacml.PolicySet</code>:</p>
<pre>$uri = new Java("java.net.URI", "foobar");
$alg = new Java("com.sun.xacml.combine.DenyOverridesPolicyAlg");
$tar = new Java("com.sun.xacml.Target", null, null, null);
$policySet = new Java("com.sun.xacml.PolicySet", $uri, $alg, $tar);
$children = $policySet->getChildren();
$iterator = $children->iterator();</pre>
<p>Here&#8217;s the error I get:</p>
<pre><b>Fatal error</b>:  Uncaught exception &#8216;JavaException&#8217; with message &#8216;Java Exception java.lang.NoSuchMethodException: iterator
java.lang.NoSuchMethodException: iterator&#8217; in java-test2.php:9
Stack trace:
#0 java-test2.php(9): java.util.Collections$EmptyList-&gt;iterator()
#1 {main}
  thrown in <b>java-test2.php</b> on line <b>9</b></pre>
<p>It&#8217;s clear that I&#8217;m trying to access an <code>EmptyList</code>, which, despite being empty, is still a list, and should still have an <code>iterator()</code> method.  (All other methods, like <code>size()</code>, are also inaccessible.)</p>
<p><strong>Update - October 9:</strong> Zend support tried to blow me off, saying that my problem &#8220;goes out of the limits of Zend Products and PHP,&#8221; but I was able to narrow down the problem even more, without any of the XACML libraries:</p>
<pre>$class = new Java('java.lang.Class');
$collections = $class->forName('java.util.Collections');
$empty = $collections->emptyList();
$iterator = $empty->iterator();</pre>
<p>Same NoSuchMethodException as before.</p>
<p><strong>Update - October 11:</strong> This has finally been acknowledged as a legitimate bug, and it turns out it&#8217;s probably caused by the same underlying issue with their Java Bridge Connector as with the DatatypeFactory bug above.</p>
<h2>Sparse documentation</h2>
<p>From the start, I found the PHP/Java Bridge&#8217;s documentation frustrating.  It wasn&#8217;t always clear what information applied to which version of the bridge, and there was never enough detail to make me comfortable.  Fortunately, the basics were there, and the bridge&#8217;s creator was always helpful over the support mailing list.</p>
<p>The entirety of Zend&#8217;s bridge documentation is fourteen very lightweight pages in the Zend Platform User Guide.  Of course, the code examples they give make it clear why they don&#8217;t feel more detail is necessary: they expect their users to be accessing EJBs within their existing Java infrastructure&#8230; simple getting and setting.</p>
<p>It may be that what we&#8217;re doing is pushing the envelope of PHP/Java symbiosis, but if the open-source rival can satisfy our needs (programatically, at least), why can&#8217;t the heavy-duty commercial system?  Stay tuned for updates.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abbett.org/2007/10/01/migrating-from-the-phpjava-bridge-to-the-zend-java-bridge/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Chanukat HaBlog</title>
		<link>http://www.abbett.org/2007/04/24/chanukat-hablog/</link>
		<comments>http://www.abbett.org/2007/04/24/chanukat-hablog/#comments</comments>
		<pubDate>Wed, 25 Apr 2007 02:22:34 +0000</pubDate>
		<dc:creator>Jonathan Abbett</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.abbett.org/?p=3</guid>
		<description><![CDATA[This is my first post at the new abbett.org. I&#8217;m generally not a fan of personal blogs, so I don&#8217;t expect to post very frequently here. I&#8217;ll mainly use this digital outcropping to keep visitors up to date on material elsewhere on the site, and to keep my links list up to date &#8212; though [...]]]></description>
			<content:encoded><![CDATA[<p>This is my first post at the new abbett.org. I&#8217;m generally not a fan of personal blogs, so I don&#8217;t expect to post very frequently here. I&#8217;ll mainly use this digital outcropping to keep visitors up to date on material elsewhere on the site, and to keep my links list up to date &#8212; though if anything particularly inspiring comes to mind, I reserve the right to share it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.abbett.org/2007/04/24/chanukat-hablog/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
