<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <title>Objectively Oriented</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/" />
   <link rel="self" type="application/atom+xml" href="http://www.objectivelyoriented.com/atom.xml" />
   <id>tag:www.objectivelyoriented.com,2008://1</id>
   <updated>2008-04-29T15:45:10Z</updated>
   
   <generator uri="http://www.sixapart.com/movabletype/">Movable Type 3.34</generator>

<entry>
   <title>WTF indeed!</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2008/04/wtf_indeed.html" />
   <id>tag:www.objectivelyoriented.com,2008://1.42</id>
   
   <published>2008-04-29T15:37:42Z</published>
   <updated>2008-04-29T15:45:10Z</updated>
   
   <summary>Most of you are probably familiar with The Daily WTF: Curious Perversions in Information Technology. Yes, other people&apos;s crappy code is hilarious, but it&apos;s also educational to see. (And maybe you ARE doing something crappy and you just hid it...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>Most of you are probably familiar with <a href="http://thedailywtf.com/">The Daily WTF: Curious Perversions in Information Technology</a>.  Yes, other people's crappy code is hilarious, but it's also educational to see.  (And maybe you ARE doing something crappy and you just hid it so well other people haven't found it yet?)</p>

<p>If you enjoy this type of thing (who doesn't?) and you're into databases and especially Oracle, there's a site inspired by The Daily WTF just for Oracle blunders!  Check it out: <a href="http://oracle-wtf.blogspot.com/">Oracle WTF</a>!</p>

<p>I found out about this via <a href="http://tkyte.blogspot.com/2008/04/stuff.html">Tom Kyte's post</a>, so I might as well also share some of his awesomeness:</p>

<blockquote>As an aside, anyone that knows me, knows my mantra - written many times:
<ul>
<li>You should do it in a single SQL statement if at all possible.</li>
<li>If you cannot do it in a single SQL Statement, then do it in PL/SQL (as little PL/SQL as possible!).</li>
<li>If you cannot do it in PL/SQL, try a Java Stored Procedure.  The number of times this is necessary is extremely rare today with Oracle9i and above.</li>
<li>If you cannot do it in Java, do it in a C external procedure.  This is most frequently the approach when raw speed, or the use of a 3rd party API written in C is needed.</li>
<li>If you cannot do it in a C external routine, you might want to seriously think about why it is you need to do it...</li>
</ul>
</blockquote>

<p>Ok, back to writing good code, not crappy at all! :)<br />
</p>]]>
      
   </content>
</entry>
<entry>
   <title>NTILE() - easy way to generate tag clouds </title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2008/04/ntile_easy_way_to_generate_tag.html" />
   <id>tag:www.objectivelyoriented.com,2008://1.41</id>
   
   <published>2008-04-28T16:32:17Z</published>
   <updated>2008-04-28T17:09:48Z</updated>
   
   <summary>The Oracle feature set is often brought up as an argument (for? against?) when comparing it against other databases. And it is indeed a huge feature set and it&apos;s pretty great to use, but granted, the Oracle documentation can be...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>The Oracle feature set is often brought up as an argument (for?  against?) when comparing it against other databases.  And it is indeed a huge feature set and it's pretty great to use, but granted, the Oracle documentation can be pretty dry to read.  </p>

<p>For example, check out the documentation for the <a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14223/analysis.htm#sthref1718">NTILE Function</a>.  Yeah, sounds kind of boring.  What good could it be in the wonderful world of web development?  After all, who manages employee or sales tables anymore...</p>

<p>Answer: generating tag clouds.  <br />
</p>]]>
      <![CDATA[<p>It's kind of a pain to make pretty tag clouds and if you google for how to do it in an elegant way, you'll most likely find a lot of cumbersome looping through arrays over and over and assigning some variables and doing some weird math on them.  Not very elegant at all.  </p>

<p>Here's how you do it (elegantly) using the NTILE function instead:</p>

<pre>
SELECT name tag_name,
            num_results_per_tag,
            ntile($numFontSizesInCloud) over (ORDER BY num_results_per_tag) as font_size
  FROM (SELECT name,
               num_results_per_tag
          FROM tag
         ORDER BY num_results_per_tag DESC)
 WHERE rownum <= :num_tags
 ORDER BY name;
</pre>

<p>What this query does is take all tags and number of items tagged with that tag and orders them by that number (so most popular tags first).  You can specify how many tags to retrieve for the clouds via the :num_tags parameter.  (Note: instead of using this clause to limit number of tags by their row number, you can use a subquery to retrieve a specific set of tags, e.g. user-specific tags, page-specific tags, etc.)</p>

<p>After you know how many tags to retrieve, you use the NTILE function to put all the tags into "buckets", or font sizes (or classes) your tag cloud will use.  How many buckets you have depends purely on your whim and you can specify it when constructing the query using $numFontSizesInCloud (or some other cleverly named variable).  (Note that this value is not bound as it is not a parameter for the SELECT statement.)</p>

<p>The NTILE function creates however many buckets you want, then it evaluates the data in the OVER clause to assign the bucket to each of the tags returned.  In your template then, you can simply display a tag cloud like this:</p>

<blockquote>
<img src="/code/code_snippet-tagCloud.png" width="564" height="84"/>
</blockquote>

<p>It's then up to your CSS to define font sizes or whatever class names you want to give them (don't quote me on my CSS usage...) and you're done!</p>]]>
   </content>
</entry>
<entry>
   <title>php|architect: Database Design for PHP Programmers by Mac Newbold</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2008/02/the_february_2008_issue_of_1.html" />
   <id>tag:www.objectivelyoriented.com,2008://1.40</id>
   
   <published>2008-02-27T16:54:04Z</published>
   <updated>2008-02-27T17:55:30Z</updated>
   
   <summary>The February 2008 issue of php|architect features an article by Mac Newbold titled &quot;Database Design for PHP Programmers&quot;. Here&apos;s the blurb: While PHP can do a lot of great things by itself, it can do much more when you add...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>The <a href="http://www.phparch.com/c/magazine/issue/67">February 2008 issue of php|architect</a> features an article by <a href="http://www.phparch.com/c/magazine/author/172">Mac Newbold</a> titled "Database Design for PHP Programmers".  Here's the blurb:</p>

<blockquote>While PHP can do a lot of great things by itself, it can do much more when you add a relational database. Whether you use MySQL, PostgreSQL, Oracle, MicroSoft SQL Server or SQLite, the way you design your schema and build your tables has a big impact on the abilities of your application. By the same token, mistakes in your database structure can be very difficult to fix or overcome. A little bit of careful planning can go a long way.</blockquote>

<p>It's a pretty good article about database design and I think all PHP developers who are just starting to integrate databases in their applications should read it.  However, there are a few things I'd like to add and point out.<br />
</p>]]>
      <![CDATA[<p><b>SQL does not mean "all non-PHP code that has to do with the database"</b></p>

<p>Here's a quick primer:</p>

<p><b>SQL</b> - Structured Query Language.  This includes all your SELECT queries.</p>

<p><b>DML</b> - Data Modification Language.  This includes any statements that change data in your RDBMS.  All your INSERT, UPDATE, DELETE, MERGE go here.</p>

<p><b>DDL</b> - Data Definition Language.  How you define objects in your RDBMS.  A database object is a table, index, sequence, etc.  Your CREATE TABLE, DROP INDEX, etc. fall under this category.</p>

<p>It makes me cringe when people say "SQL statements to create your tables."  I understand that SQL has kind of become to mean "all database code", but it really isn't.  There's a huge difference between the three categories I listed above and it really helps developers organize how they think about database development if they understand the differences between the three.  </p>

<p>For example, did you know that you can't create a table with auto-increment starting at a value which is the next  auto-increment value from another table?   Why is that? The answer is simple: you can't mix DDL (create table) with SQL (selecting a new value).  If you understand that DDL and SQL are different, the answer is obvious. If you don't get the distinction between the three, the answer can be kind of magical and confusing.</p>

<p><br />
<b>constraints vs. indexes vs. keys</b></p>

<p>You can think of a constraint as a "check" that your RDBMS performs when you execute a DML statement.  </p>

<p>An index is a physical object in the database (created with DDL).  </p>

<p>A key is more of a conceptual construct which combines the characteristics of a constraint and an index.  It is a constraint in a way that it makes you RDBMS enforce a rule when DML is executed (e.g. ids of users must be unique and sequential).  It is an index in a way that it is stored separately in the database and can be used for querying (via SQL).  You create it via DDL, of course.  </p>

<p>I think the article's explanation about keys, primary keys and foreign keys was aimed at newer database developers, and especially ones using MySQL.  Good database design stems from understanding the relationships between database objects and constraints and indexes help enforce those relationships.  Since you, the developer is who puts these constraints and indexes in place, it is in your benefit to learn how they work.  </p>

<p><br />
<b>Designing for performance</b></p>

<p>I applaud the article for pointing out that good design takes precedence over optimization and that good design provides good potential for good optimization practices.  I also really liked him pointing out that it's important to know what you should optimize.  Figuring out what your bottleneck is will go a long way toward figuring out what next steps you should take.</p>

<p><br />
<b>Speaking of optimization...</b></p>

<p>Mac's article is definitely very MySQL-oriented.  I would really love for everyone to enjoy reading <a href="http://tahiti.oracle.com">Oracle documentation</a> as much as I do.  But if you don't, at least read this awesome part about Oracle's <a href="http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/ex_plan.htm">EXPLAIN PLAN</a> which beats MySQL's by a long shot.  I think the article does not focus much on the explain plan because MySQL's support for it is very limited.  Oracle gives you so much information in an explain plan that it is really no excuse to not know what your queries are doing.</p>

<p><br />
<b>Let the database handle data</b></p>

<p>The article points out that it's sometimes difficult to know what code to store in the database and what in PHP.  Personally, I'd love to keep it all in the database (just so you know my bias), but even if my views were more liberal in this respect, I'd disagree with the article that the choice may sometimes be unclear (and definitely in the examples the article provides).  </p>

<p>The word "database" contains the string "data" - that should be a pretty good clue what the database is for.  (Ok, that's my snarkiness for this post.)  A database is really REALLY good at handling data.  Enforcing auto-increments or managing referential integrity (e.g. foreign keys) via PHP would not only be cumbersome and error-prone, but it also violates the principle of using the best tool for the job.  </p>

<p><br />
Overall, it was a pretty good article, albeit with a MySQL slant.  I'm glad that the PHP community recognizes that most PHP applications will at some point use a database and that solid database development skills in PHP developers are important.  Learning how to write database code well can also give you a whole new set of solutions to a lot of challenges you encounter in your application.</p>

<p><3 databases!</p>]]>
   </content>
</entry>
<entry>
   <title>dbMorph - proposal excerpts</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2008/01/dbmorph_proposal_excerpts.html" />
   <id>tag:www.objectivelyoriented.com,2008://1.39</id>
   
   <published>2008-01-31T18:29:41Z</published>
   <updated>2008-01-31T18:40:54Z</updated>
   
   <summary>After some consideration, I changed the name of my db manager project to dbMorph. Naming it dbSync was a little misleading as syncing really implies bringing something in sync with something else or syncing to disk, etc., while this tool...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>After some consideration, I changed the name of my db manager project to <a href="https://sourceforge.net/projects/dbmorph">dbMorph</a>.  Naming it dbSync was a little misleading as syncing really implies bringing something in sync with something else or syncing to disk, etc., while this tool is really for managing database changes.  </p>

<p>Work is starting on 2/4 (Monday) and tomorrow I'm doing a mini presentation on how this tool will work.  Here are some excerpts:</p>]]>
      <![CDATA[<p>Proposal: dbMorph</p>

<p><b>What is it?</b></p>

<p>A tool to keep database objects and stored procedures synchronized with application code in a multi-developer environment with a short release cycle and multiple development branches. Tie-in to svn (subversion) for version control.</p>

<p><b>Why do I need it?</b></p>

<p>Historically, applying database changes falls onto the shoulders of both system administrators, database administrators and developers.  This role is not very well defined and varies widely from project to project.  DbMorph allows the roles to be more defined, as follows:<br />
<ul><br />
    <Li>Developers write the database changes: any DDL changes, DML and updates to stored procedures.</li><br />
    <li>DbMorph generates a file that can be run on an existing database schema to update it (or downgrade it) to a desired version.  DbMorph guarantees that correct versions of stored procedures are applied and that no change is applied out of order or more than necessary</li><br />
    <li>Admins or developers can now run the generated file on a desired schema.  This is most useful in two main scenarios: administrators (sysadmins, dbas) can apply these changes to systems in production during releases and developers can apply these changes to schemas they manage on their own (e.g. in a local dev setup) during development.</li><br />
</ul></p>

<p><b>How will it be released?</b></p>

<p>DbMorph will be released under the new BSD License.  This means that the name of the author is preserved as the software is used, however, the end user has the freedom to do anything with the software (as long as they preserve the author's name).</p>

<p>I did not choose the GPL license due to its viral nature - it infects any code it is a part of and any code that uses it would have to be then further released.  This would not work in a setting such as an agency where you might write software for someone else who wants to own it.</p>

<p><b>How do you know it will work?</b></p>

<p>I have already written what could be considered a very technology-specific version of this tool and use it on a daily basis.  It works for the specific project I'm using it for, but it does not support a variety of databases nor applications in various programming languages.</p>

<p><b>Wait, doesn't a tool like this already exist?</b></p>

<p>There are a few tools that attempt to support similar functionality, but in most cases they miss the idea that stored procedures (e.g. code written in PL/SQL) and application code (e.g. PHP, Java) are both maintained under version control.  The feature that differentiates dbMorph from other tools is considering any stored procedures as living and breathing code under svn.  It will retrieve the correct versions of those files depending on the database revision within the development process.  This especially applies in environments with multiple development branches that release code on a frequent basis.</p>

<p><b>Ok, gimme the specs!</b></p>

<p>This tool will be written in Python.  Doing so makes the tool OS-blind and portable.</p>

<p>The tool will give users freedom in how database deltas (changes) are stored.  The default storage engine will be XML.  Adding a new storage engine will simply mean implementing a provided interface.</p>

<p>The tool will attempt to support a variety of databases.  The original release will include support for Oracle and MySQL.</p>

<p>The tool depends on svn (subversion) for version control.  Svn is a widely-recognized version control that will most likely be around for quite some time (*cross fingers*).</p>

<p>DbMorph can be run from command line.</p>]]>
   </content>
</entry>
<entry>
   <title>DbSync, now on SourceForge</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2008/01/dbsync_now_on_sourceforge.html" />
   <id>tag:www.objectivelyoriented.com,2008://1.38</id>
   
   <published>2008-01-29T02:22:24Z</published>
   <updated>2008-01-29T02:26:58Z</updated>
   
   <summary>The working name of my database delta manager is... DbSync! It will live here: sourceforge.net/projects/dbsync. I&apos;ve never managed an open source project before, so this will be an interesting experience (any thoughts, ideas, words of warning are welcome). Work is...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>The working name of my database delta manager is... DbSync!  It will live here: <a href="https://sourceforge.net/projects/dbsync/">sourceforge.net/projects/dbsync</a>.  </p>

<p>I've never managed an open source project before, so this will be an interesting experience (any thoughts, ideas, words of warning are welcome).  Work is scheduled to start Feb. 4th, 2008 as my company's graciously allowing me to use up to 50% of my time for an R&D project.  Yay!</p>]]>
      
   </content>
</entry>
<entry>
   <title>How to manage your database deltas - proposals galore!</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2008/01/how_to_manage_your_database_de.html" />
   <id>tag:www.objectivelyoriented.com,2008://1.37</id>
   
   <published>2008-01-28T15:31:26Z</published>
   <updated>2008-01-28T15:32:26Z</updated>
   
   <summary>Rob Allen has recently proposed a database schema manager for Zend Framework. Here&apos;s the proposal. It looks good, although I&apos;m worried it&apos;s missing support for stored procedures, which will be especially important when working with Oracle. In May, I&apos;m talking...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>Rob Allen has recently proposed a database schema manager for Zend Framework.  Here's the <a href="http://framework.zend.com/wiki/display/ZFPROP/Zend_Db_Schema_Manager+-+Rob+Allen">proposal</a>.</p>

<p>It looks good, although I'm worried it's missing support for stored procedures, which will be especially important when working with Oracle.  </p>

<p>In May, I'm talking at php|tek about <a href="http://tek.phparch.com/c/schedule/talk/d2s4/2">how to keep your PHP and database in sync</a>.  This talk mainly focuses on a database schema manager that Rob Allen describes; I have already written this tool for a project I'm currently working on, mainly driven by the need to share database changes across many developers.  </p>

<p>NEWS! This year I'm releasing this tool under an open source license.  I am not going to tie it into any framework - I think this tool can be useful on any project and doesn't need to be written in the language of the application.  </p>

<p>Now with Rob's proposal there's more pressure to get this out the door - I will have a sourceforge link for all of you soon.  </p>

<p>P.S. It'll be released under the new BSD license - thanks to everyone in #phpc for helping me understand the downfalls of certain licenses!</p>]]>
      
   </content>
</entry>
<entry>
   <title>PHP Advent Calendar</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2007/12/php_advent_calendar.html" />
   <id>tag:www.objectivelyoriented.com,2007://1.36</id>
   
   <published>2007-12-17T19:21:59Z</published>
   <updated>2007-12-17T19:28:16Z</updated>
   
   <summary>During the days of December, the Perl community used to maintain the Perl Advental Calendar. In a similar fashion, the PHP community now has its own PHP Advent Calendar, thanks to Chris Shiflett who is maintaining it this year. Along...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>During the days of December, the Perl community used to maintain the <a href="http://perladvent.pm.org/">Perl Advental Calendar</a>.  In a similar fashion, the PHP community now has its own <a href="http://shiflett.org/blog/2007/dec/php-advent-calendar-day-1">PHP Advent Calendar</a>, thanks to <a href="http://shiflett.org">Chris Shiflett</a> who is maintaining it this year.</p>

<p>Along with great PHP tips, the calendar also features many of the prominent PHP personalities (and their photos!).  The PHP community is one of the nicest communities that grows around a programming language and/or philosophy that I have ever encountered.  Go on to <a href="http://shiflett.org/blog/2007/dec/php-advent-calendar-day-1">the calendar</a> to find out about its people.  And thanks again to Chris for compiling it!</p>]]>
      
   </content>
</entry>
<entry>
   <title>See you at php|tek 2008!</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2007/11/see_you_at_phptek_2008.html" />
   <id>tag:www.objectivelyoriented.com,2007://1.35</id>
   
   <published>2007-11-29T04:59:16Z</published>
   <updated>2007-11-29T04:58:24Z</updated>
   
   <summary>Two of my talks were accepted for the php|tek Conference 2008! They are: Keeping Your Database and PHP in Sync As your application changes, so will the database that supports it. Keeping database objects and stored procedures synchronized with PHP...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>Two of my talks were accepted for the <a href="http://tek.phparch.com">php|tek Conference 2008</a>!  They are:</p>

<p><b>Keeping Your Database and PHP in Sync</b></p>

<p>As your application changes, so will the database that supports it. Keeping database objects and stored procedures synchronized with PHP can be a challenge in a multi-developer environment with a short release cycle and multiple development branches. This talk describes a method for containing database changes in a way that the application understands–think Ruby on Rails “migrations”. Changes to the database are applied when appropriate PHP changes have been made. The method is database-blind and allows the developer to choose a storage engine, such as XML. Bring your favorite svn tricks to share!</p>

<p><br />
<b>Angering Database Gods</b></p>

<p>Rapid development techniques often promote abstraction of database interaction. Many available frameworks offer mechanisms that can prevent the developer from making database design decisions. This talk focuses on describing specific approaches to utilizing a database in your application and the pros and cons of each choice. We will talk about proper database design, using PHP to construct SQL, limiting access to the database via caching an d others. As the talk progresses, we will attempt to design a scalable and high-performance database-driven environment for a social networking site.</p>

<p><br />
My husband says that I am now fluent in Blurb.  See you all in Chicago!</p>]]>
      
   </content>
</entry>
<entry>
   <title>A LIFO Life</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2007/11/a_lifo_life.html" />
   <id>tag:www.objectivelyoriented.com,2007://1.34</id>
   
   <published>2007-11-16T15:37:35Z</published>
   <updated>2007-11-16T15:47:22Z</updated>
   
   <summary>November so far has been really busy with trying to finish projects before December and the general holiday laziness that overcomes people at that time of the year. As a result, I have been able to reply to the most...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>November so far has been really busy with trying to finish projects before December and the general holiday laziness that overcomes people at that time of the year.  As a result, I have been able to reply to the most recent things in my mailbox and haven't had a chance to look at a backlog yet.  My mailbox is a last-in first-out system - whatever's at the top gets preferential treatment.  This means I miss some things. </p>

<p>Recently, <a href="http://blogs.oracle.com/opal">Chris Jones</a> sent me a photo he took during ZendCon this year.  I did a presentation via iChat for the Zend Unconference.  Sorry for the delay in posting it - here's what the presentation looked like:</p>]]>
      <![CDATA[<p><img src="/img/unconference.jpg"/></p>

<p><a href="http://ishouldbecoding.com/">Matthew Turland</a> on the left, me inside the computer.  The future is now!  Thanks for the photo, Chris!</p>]]>
   </content>
</entry>
<entry>
   <title>Database change management tools</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2007/11/database_change_management_too.html" />
   <id>tag:www.objectivelyoriented.com,2007://1.33</id>
   
   <published>2007-11-15T16:45:09Z</published>
   <updated>2007-11-15T16:53:09Z</updated>
   
   <summary>If you remember, a while back, as I was complaining about Ruby on Rails, I also praised its migrations system which allows you to keep your database in sync with your code. On a current project (Oracle + PHP), I...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>If you remember, a while back, as I was complaining about Ruby on Rails, I also <a href="http://www.objectivelyoriented.com/2007/06/ruby_on_rails_migrations_good.html">praised its migrations system</a> which allows you to keep your database in sync with your code.  </p>

<p>On a current project (Oracle + PHP), I wrote (with a few coworkers) a database management tool that does what Ruby on Rails does in terms of migrations, with one huge difference: keeping track of database packages and which version of them should be compiled given the specified DDL and DML change.  It works really nice - it still has kinks to be worked out and some edge cases to address, but it's a really useful piece of code that has greatly reduced the amount of whining among developers who have to make frequent database changes.  I submitted a talk about how it works for <a href="http://tek.phparch.com/">php|tek 2008</a>, so maybe you can hear me talk about in detail at some point. </p>

<p>Now, PEAR has a <a href="http://pear.php.net/pepr/pepr-proposal-show.php?id=507">proposal for a DbDeploy</a>.  This is a great idea!  Unfortunately, it looks like the proposal and the code written for this package completely fails to address the fact that a database change (or delta) may include changes other than simple DDL and DML statements.  Most of the code I write for my applications includes tons of stored procedures and chances are, dear reader, that you are in the same situation.   So it looks like I'm getting myself involved in writing this package - stay tuned!</p>]]>
      
   </content>
</entry>
<entry>
   <title>The easiest thing in the world</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2007/11/the_easiest_thing_in_the_world.html" />
   <id>tag:www.objectivelyoriented.com,2007://1.32</id>
   
   <published>2007-11-02T22:13:36Z</published>
   <updated>2007-11-02T22:18:44Z</updated>
   
   <summary>A lot of times, the choice to use MySQL is becuase it&apos;s &quot;easy&quot;. Easy to set up, easy to use, no mess. Well, here&apos;s a post from Gena01 from #phpc on Installing Oracle Instant Client and making it work with...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>A lot of times, the choice to use MySQL is becuase it's "easy".  Easy to set up, easy to use, no mess.  Well, here's a post from Gena01 from #phpc on <a href="http://www.gena01.com/forum/index.php?topic=184.0">Installing Oracle Instant Client and making it work with PHP</a> (on Linux).  </p>

<p>Setup consists of two parts:</p>

<p>1. Installing Oracle Instant Client on Linux<br />
2. Getting and compiling oci8 extension for PHP</p>

<p>It's very simple or "easy", so try it out!</p>]]>
      
   </content>
</entry>
<entry>
   <title>php|tek 2008 - deadline for submissions today!</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2007/10/phptek_2008_deadline_for_submi.html" />
   <id>tag:www.objectivelyoriented.com,2007://1.31</id>
   
   <published>2007-10-31T06:30:26Z</published>
   <updated>2007-10-31T06:33:52Z</updated>
   
   <summary>The deadline for php|tek 2008 is today! I just submitted my talks (yay!) You may remember me complaining about the shortcomings of Ruby on Rails migrations system. One of the talks I submitted is about a script I wrote with...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>The deadline for <a href="http://tek.phparch.com/c/p/cfp">php|tek 2008</a> is today!  I just submitted my talks (yay!)</p>

<p>You may remember me <a href="http://www.objectivelyoriented.com/2007/06/ruby_on_rails_migrations_good.html">complaining </a>about the shortcomings of Ruby on Rails migrations system.  One of the talks I submitted is about a script I wrote with some coworkers that works like the migration system but it also considers referential integrity and changes to stored procedures.  It will keep you PHP and database in sync at all times - I hope I made the description interesting enough for the organizers to pick it!</p>]]>
      
   </content>
</entry>
<entry>
   <title>Ramblecast 2.0 now released to the unsuspecting public</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2007/10/ramblecast_20_now_released_to.html" />
   <id>tag:www.objectivelyoriented.com,2007://1.30</id>
   
   <published>2007-10-18T20:51:47Z</published>
   <updated>2007-10-18T20:53:48Z</updated>
   
   <summary>Ramblecast 2.0 which was recorded at php|works 2007 has finally been edited and released. Hosts/Guests: 1. Paul Reinheimer 2. Sean Coates 3. Sara Golemon (aka DYG) 4. Ben Ramsey 5. Maggie Nelson 6. Chris Shiflett 7. Terry Chay 8. Dustin...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p><a href="http://podcast.phparch.com/main/index.php/episodes:20071018">Ramblecast 2.0</a> which was recorded at php|works 2007 has finally been edited and released.  </p>

<p>Hosts/Guests:</p>

<p>   1. Paul Reinheimer<br />
   2. Sean Coates<br />
   3. Sara Golemon (aka DYG)<br />
   4. Ben Ramsey<br />
   5. Maggie Nelson <-- yours truly<br />
   6. Chris Shiflett<br />
   7. Terry Chay<br />
   8. Dustin Whittle<br />
   9. Ed Finkler<br />
  10. Derick Rethans</p>

<p>Happy listening!</p>]]>
      
   </content>
</entry>
<entry>
   <title>I now know what to name my future child</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2007/10/i_now_know_what_to_name_my_fut.html" />
   <id>tag:www.objectivelyoriented.com,2007://1.29</id>
   
   <published>2007-10-10T17:53:31Z</published>
   <updated>2007-10-10T18:04:08Z</updated>
   
   <summary>Yeah, yeah, ZendCon is going on right now and it seems to be going well. I gave a presentation yesterday via iChat at the Zend UnConference 2007 and it was pretty good, except for my computer crashing during the Q&amp;A...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>Yeah, yeah, <a href="http://www.zendcon.com">ZendCon</a> is going on right now and it seems to be going well.  I gave a <a href="http://www.zendcon.com/wiki/index.php?title=You_Don%27t_Need_a_DBA">presentation</a> yesterday via iChat at the <a href="http://www.zendcon.com/wiki/index.php?title=Uncon">Zend UnConference 2007</a> and it was pretty good, except for my computer crashing during the Q&A at the end and thus abruptly severing the connection.  Yikes!</p>

<p>But, more importantly, <a href="http://xkcd.com/327/">this XKCD comic</a> is making rounds on all database-related blogs.  <a href="http://tkyte.blogspot.com/2007/10/just-for-fun.html">Tom Kyte</a>, <a href="http://www.petefinnigan.com/weblog/archives/00001104.htm">Pete Finnigan</a>, and many others are referencing it like it's going out of style.  At least 6 people IMed me this morning telling me about it.  If this comic teaches at least one person about SQL injections, we win.  Thank you, XKCD! (*appends name to list of possible baby names*)</p>

<p>In other happy news, <a href="http://blogs.oracle.com/opal/">Chris Jones</a> reports that the OCI8 extension for PHP has just been released with <a href="http://blogs.oracle.com/opal/2007/10/09#a224">changes to support Oracle Database 11g "Database Resident Connection Pooling" (DRCP)</a>.  Yay!</p>]]>
      
   </content>
</entry>
<entry>
   <title>PHP Unconference &apos;07 @ ZendCon</title>
   <link rel="alternate" type="text/html" href="http://www.objectivelyoriented.com/2007/09/php_unconference_07_zendcon.html" />
   <id>tag:www.objectivelyoriented.com,2007://1.28</id>
   
   <published>2007-09-25T15:30:26Z</published>
   <updated>2007-09-25T15:40:31Z</updated>
   
   <summary>As some of you know, I can&apos;t go to ZendCon this year because of work. Half of the developers on a project I&apos;m on are going and since we want to be nice to our client, we need some people...</summary>
   <author>
      <name></name>
      
   </author>
   
   
   <content type="html" xml:lang="en" xml:base="http://www.objectivelyoriented.com/">
      <![CDATA[<p>As some of you know, I can't go to <a href="http://www.zendcon.com">ZendCon</a> this year because of work.  Half of the developers on a project I'm on are going and since we want to be nice to our client, we need some people to stay and hold down the fort.  I'm one of those staying behind, and we have a moat, so stand back!</p>

<p>Fortunately, though, thanks to the organizing powers of the bearded <a href="http://surripui.net">Patrick Reilly</a>, I will be able to participate a little bit by giving a talk at the <a href="http://www.zendcon.com/wiki/index.php?title=Uncon">PHP Unconference '07</a> at ZendCon.  I'll be presenting on Tuesday, October 9th at 5pm PST via iChat.  (Technology = science + awesome!)  If you tune in, you'll see a polished and improved version of my "<a href="http://www.zendcon.com/wiki/index.php?title=You_Don%27t_Need_a_DBA">You Don't Need a DBA</a>" presentation, which I gave at <a href="http://works.phparch.com">php|works</a> earlier this year.  <br />
</p>]]>
      
   </content>
</entry>

</feed>
