<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="/templates/default/atom.css" type="text/css" ?>
<feed version="0.3"
   xmlns="http://purl.org/atom/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/">
    <link href="http://programmin.prim8.net/rss.php?version=atom0.3" rel="service.feed" title="Programmin' Prim8" type="application/x.atom+xml" />
    <link href="http://programmin.prim8.net/"                        rel="alternate"    title="Programmin' Prim8" type="text/html" />
    <link href="http://programmin.prim8.net/rss.php?version=2.0"     rel="alternate"    title="Programmin' Prim8" type="application/rss+xml" />
    <title mode="escaped" type="text/html">Programmin' Prim8</title>
    <tagline mode="escaped" type="text/html">Code, Ideas and Simian Ramblings</tagline>
    <id>http://programmin.prim8.net/</id>
    <modified>2006-11-20T15:42:15Z</modified>
    <generator url="http://www.s9y.org/" version="0.8.3">Serendipity 0.8.3 - http://www.s9y.org/</generator>
    <dc:language>en</dc:language>
    <admin:errorReportsTo rdf:resource="mailto:ir8@prim8.net" />
    <info mode="xml" type="text/html">
        <div xmlns="http://www.w3.org/1999/xhtml">You are viewing an ATOM formatted XML site feed. Usually this file is inteded to be viewed in an aggregator or syndication software. If you want to know more about ATOM, please visist <a href="http://atomenabled.org/">Atomenabled.org</a></div>
    </info>
<entry>
    <link href="http://programmin.prim8.net/archives/26-REST-tools-for-Rails-1.2.html" rel="alternate" title="REST tools for Rails 1.2" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2006-11-19T21:41:52Z</issued>
    <created>2006-11-19T21:41:52Z</created>
    <modified>2006-11-20T15:42:15Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=26</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=26</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/26-guid.html</id>
    <title mode="escaped" type="text/html">REST tools for Rails 1.2</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
Rails 1.2 is not out as of this writing, but it is expected soon.  These features are currently available on <a href="http://programmin.prim8.net/exit.php?url_id=196&amp;entry_id=26" title="http://wiki.rubyonrails.org/rails/pages/EdgeRails" onmouseover="window.status='http://wiki.rubyonrails.org/rails/pages/EdgeRails';return true;" onmouseout="window.status='';return true;">edge rails</a>.<br />
<br />
<b>Resource Routes</b> - edge rails<br />
<a href="http://programmin.prim8.net/exit.php?url_id=197&amp;entry_id=26" title="http://caboo.se/doc/classes/ActionController/Resources.html#M004172" onmouseover="window.status='http://caboo.se/doc/classes/ActionController/Resources.html#M004172';return true;" onmouseout="window.status='';return true;">rdocs</a><br />
<a href="http://programmin.prim8.net/exit.php?url_id=198&amp;entry_id=26" title="http://topfunky.com/clients/peepcode/REST-cheatsheet.pdf" onmouseover="window.status='http://topfunky.com/clients/peepcode/REST-cheatsheet.pdf';return true;" onmouseout="window.status='';return true;">peepcode.com cheatsheet</a><br />
<br />
Set up basic CRUD routes for your resources:<br />
<br />
<div class="code"><br />
# simple<br />
map.resources :posts<br />
<br />
# nested <br />
map.resources :people do |person|<br />
  person.resources :phone_numbers<br />
end<br />
</div><br />
<br />
<b>Resource Generator</b> - edge rails<br />
<br />
Will generate a RESTful model, controller, views, tests and migration.<br />
<br />
<div class="code"><br />
ruby script/generate scaffold_resource person name:string age:integer created_at:datetime birthday:date<br />
</div><br />
<br />
<b>RSpec Resource Generator</b> - plugin<br />
<a href="http://programmin.prim8.net/exit.php?url_id=199&amp;entry_id=26" title="http://rubyforge.org/pipermail/rspec-users/2006-November/000137.html" onmouseover="window.status='http://rubyforge.org/pipermail/rspec-users/2006-November/000137.html';return true;" onmouseout="window.status='';return true;">announcement</a><br />
<a href="http://programmin.prim8.net/exit.php?url_id=200&amp;entry_id=26" title="http://svn.flpr.org/public/plugins/rspec_resource_generator/" onmouseover="window.status='http://svn.flpr.org/public/plugins/rspec_resource_generator/';return true;" onmouseout="window.status='';return true;">svn</a><br />
<br />
Equivalent to scaffold_resource generator for people using BDD/<a href="http://programmin.prim8.net/exit.php?url_id=201&amp;entry_id=26" title="http://rspec.rubyforge.org/" onmouseover="window.status='http://rspec.rubyforge.org/';return true;" onmouseout="window.status='';return true;">RSpec</a>.  Will generate specs instead of tests.<br />
<br />
<b>simply_helpful</b> - plugin<br />
<a href="http://programmin.prim8.net/exit.php?url_id=202&amp;entry_id=26" title="http://www.matthewman.net/articles/2006/09/04/new-rails-feature-simply_helpful" onmouseover="window.status='http://www.matthewman.net/articles/2006/09/04/new-rails-feature-simply_helpful';return true;" onmouseout="window.status='';return true;">writeup</a><br />
<br />
Lots of helper methods for REST.  Sugar for rendering collections, autogenerate DOM ID, form blocks and more.<br />
<br />
<b>restful_authentication</b> - plugin<br />
<a href="http://programmin.prim8.net/exit.php?url_id=203&amp;entry_id=26" title="http://www.agilewebdevelopment.com/plugins/restful_authentication" onmouseover="window.status='http://www.agilewebdevelopment.com/plugins/restful_authentication';return true;" onmouseout="window.status='';return true;">readme</a><br />
<a href="http://programmin.prim8.net/exit.php?url_id=204&amp;entry_id=26" title="http://svn.techno-weenie.net/projects/plugins/restful_authentication/" onmouseover="window.status='http://svn.techno-weenie.net/projects/plugins/restful_authentication/';return true;" onmouseout="window.status='';return true;">svn</a><br />
<br />
Will generate RESTful user/session functionality.  Also has an authenticated_mailer generator, although as of the time of this writing, it doesn't work out of the box with the user controller/model.  You'll need to finish off the activation code.<br />
<br />
<b>ActiveResource</b> - edge rails<br />
<a href="http://programmin.prim8.net/exit.php?url_id=205&amp;entry_id=26" title="http://www.ryandaigle.com/articles/2006/06/30/whats-new-in-edge-rails-activeresource-is-here" onmouseover="window.status='http://www.ryandaigle.com/articles/2006/06/30/whats-new-in-edge-rails-activeresource-is-here';return true;" onmouseout="window.status='';return true;">writeup</a><br />
<br />
<b>Update</b> - delayed .. will not ship with Rails 1.2.<br />
<br />
ActiveRecord-like interface to RESTful services.  Note, "rake rails:freeze:edge" did not give me this library, I had to use:<br />
<br />
<div class="code"><br />
svn co http://dev.rubyonrails.org/svn/rails/trunk vendor/rails<br />
</div>        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/25-PHP-and-DotNet-encryption.html" rel="alternate" title="PHP and DotNet encryption" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2006-07-01T19:51:49Z</issued>
    <created>2006-07-01T19:51:49Z</created>
    <modified>2006-11-19T22:18:35Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=25</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=25</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/25-guid.html</id>
    <title mode="escaped" type="text/html">PHP and DotNet encryption</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
By popular demand, here is a working example of encrypting/decrypting between PHP and DotNet.  This uses ECB, which is not ideal (a string crypted will always generate the same crypt text), but makes the example a bit simpler.<br />
<br />
<a href="http://programmin.prim8.net/exit.php?url_id=193&amp;entry_id=25" title="http://prim8.net/files/php_and_dotnet_encryption.zip" onmouseover="window.status='http://prim8.net/files/php_and_dotnet_encryption.zip';return true;" onmouseout="window.status='';return true;">PHP and DotNet Encryption</a><br />
<br />
Note,  you need the <a href="http://programmin.prim8.net/exit.php?url_id=194&amp;entry_id=25" title="http://us2.php.net/manual/en/ref.mcrypt.php" onmouseover="window.status='http://us2.php.net/manual/en/ref.mcrypt.php';return true;" onmouseout="window.status='';return true;">mcrypt</a> library:<br />
"These functions work using mcrypt. To use it, download libmcrypt-x.x.tar.gz from http://mcrypt.sourceforge.net/ and follow the included installation instructions. Windows users will find all the needed compiled mcrypt binaries at http://ftp.emini.dk/pub/php/win32/mcrypt/."<br />
<br />
<ol><br />
<li>Run encrypt.php and it will encrypt 'This should be readable in DotNet!' into a local file called crypt_text.bin.</li><br />
<li>Run the DotNet app and decrypt the file (enter your path), you should get the same thing.</li><br />
<li>Type any text you like into the large text box and click 'encrypt'.</li><br />
<li>Run decrypt.php (make sure the crypt_text.bin you just generated is in the php directory) and it should produce the text you just entered.</li><br />
</ol><br />
Note, the important bits are how you handle the text encoding.  I am storing the crypted text in base64 to make it easier to handle as a string, rather than binary data.  In the DotNet code, any string that needs to match a string from PHP is getting converted to ASCII (DotNet uses UTF-8 encoding by default).  Finally, the padding in DotNet is using PaddingMode.Zero.  This does result in some garbage characters when you decrypt in php, but they are easily discarded with <a href="http://programmin.prim8.net/exit.php?url_id=195&amp;entry_id=25" title="http://us2.php.net/manual/en/function.trim.php" onmouseover="window.status='http://us2.php.net/manual/en/function.trim.php';return true;" onmouseout="window.status='';return true;">trim()</a>.        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/24-Generating-compatible-encryption-keys-in-PHP.Net.html" rel="alternate" title="Generating compatible encryption keys in PHP/.Net" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2006-03-22T21:10:00Z</issued>
    <created>2006-03-22T21:10:00Z</created>
    <modified>2006-03-22T21:34:07Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=24</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=24</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/24-guid.html</id>
    <title mode="escaped" type="text/html">Generating compatible encryption keys in PHP/.Net</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
This has come up several times, so here is the lowdown.  You may be confused why your 2 identical strings generate different key bytes in PHP and .Net.  The answer lies in the encoding.  In both platforms, a string is a collection of characters.<br />
<ul><li>PHP characters are ASCII encoded, with a length of 7 bits.</li><br />
<li>.Net characters are UTF-16, 1 or more sets of 16-bit words.</li></ul><br />
If you want your strings to generate the same bytecode, you need to do some encoding.  In this example, I want to make a 24 byte key that is the md5 of some plain text.<br />
<br />
Example:<br />
<br />
PHP:<br />
<div class="code"><br />
$key = substr(md5("some random text"),0,24); <br />
</div><br />
<br />
.Net<br />
<div class="code"><br />
static string MD5SUM(byte[] FileOrText) //Output: String<-> Input: Byte[] //<br />
{<br />
      return BitConverter.ToString(new MD5CryptoServiceProvider()<br />
           .ComputeHash(FileOrText)).Replace("-","").ToLower();<br />
}<br />
<br />
string md5 = MD5SUM(ASCIIEncoding.ASCII.GetBytes("some random text"))<br />
    .Substring(0, 24);<br />
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();<br />
key = enc.GetBytes(md5); <br />
</div>        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/22-XAMPP-1.4.15-and-new-mysql-hashing.html" rel="alternate" title="XAMPP 1.4.15 and new mysql hashing" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2005-09-05T02:01:51Z</issued>
    <created>2005-09-05T02:01:51Z</created>
    <modified>2005-09-05T02:45:24Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=22</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=22</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/22-guid.html</id>
    <title mode="escaped" type="text/html">XAMPP 1.4.15 and new mysql hashing</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
Symptom: Everything works fine with no mysql root pass set.  Eventually you listen to the good imp on your shoulder and set a nice password.  Ahh .. life is good, or so it would seem until you flush-privileges, reload or reboot, and find yourself locked out of mysql.  Rinse and repeat.<br />
<br />
XAMPP 1.4.15 is shipping MySQL 4.1.13 with pre 4.1 mysql.user table structure. This becomes a problem when the --defaults-file option for the service points at a non-existant path, bypassing the old-passwords option which XAMPP apparently assumes everyone will be using.<br />
<br />
Long story short, I recommend:<br />
A) You probably want to do this either way. If you ever plan to use the new password hashes, they are not going to fit into 16 bytes.<br />
mysql> use mysql;<br />
mysql> alter table user change Password Password varchar(41) binary DEFAULT '' not null;<br />
<br />
B) If you want to make sure your service is loading the my.cnf properly, edit registry key<br />
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\mysql\ImagePath<br />
set it to something like:<br />
"C:\Program Files\xampp\mysql\bin\mysqld-nt.exe" --defaults-file="C:\Program Files\xampp\mysql\bin\my.cnf" mysql<br />
<br />
C) Now your xampp\mysql\bin\my.cnf file will be read, and you can pick for yourself if you want:<br />
old-passwords or #old-passwords.        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/21-osCommerce-redirect-spam-patch.html" rel="alternate" title="osCommerce: redirect spam patch" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2005-08-25T20:04:00Z</issued>
    <created>2005-08-25T20:04:00Z</created>
    <modified>2005-08-25T20:20:53Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=21</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=21</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/21-guid.html</id>
    <title mode="escaped" type="text/html">osCommerce: redirect spam patch</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
<a href="http://programmin.prim8.net/exit.php?url_id=178&amp;entry_id=21" title="http://www.oscommerce.com/" onmouseover="window.status='http://www.oscommerce.com/';return true;" onmouseout="window.status='';return true;">osCommerce</a> is a popular open source shopping cart package.  Recently spammers have been using redirect pages to help obfuscate their spam URLs.  osCommerce has an open redirect page that is being abused.  Here is an example of the URLs in the spam:<br />
<br />
<div class="code">http://www.site.com/catalog/redirect.php?action=url&goto=www.pleasebuymyworthlesscrap.info/?asxfdsa8f</div><br />
<br />
osCommerce hasn't done anything about this in their latest release, so I made a patch to solve the problem.  You can download the patch <a href="http://programmin.prim8.net/exit.php?url_id=179&amp;entry_id=21" title="http://prim8.net/files/oscommerce_redirect_spam_prevent.patch" onmouseover="window.status='http://prim8.net/files/oscommerce_redirect_spam_prevent.patch';return true;" onmouseout="window.status='';return true;">here.</a>  To apply the patch:<br />
<br />
<div class="code">patch /path/to/redirect.php oscommerce_redirect_spam_prevent.patch</div><br />
<br />
Then enter your allowed domains in the $allowed_goto array.        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/20-Spellcheck-Plugin-for-s9y-0.5.1.html" rel="alternate" title="Spellcheck Plugin for s9y - 0.5.1" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2005-07-13T17:30:22Z</issued>
    <created>2005-07-13T17:30:22Z</created>
    <modified>2005-07-13T17:31:52Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=20</wfw:comment>

    <slash:comments>1</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=20</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/20-guid.html</id>
    <title mode="escaped" type="text/html">Spellcheck Plugin for s9y - 0.5.1</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
<a href="http://programmin.prim8.net/exit.php?url_id=177&amp;entry_id=20" title="http://prim8.net/files/serendipity_event_spellcheck-0.5.1.tar.gz" onmouseover="window.status='http://prim8.net/files/serendipity_event_spellcheck-0.5.1.tar.gz';return true;" onmouseout="window.status='';return true;">Download 0.5.1</a><br />
<br />
* Fixed a bug keeping the extended body spellcheck from working in IE.        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/19-Time-for-a-Yawpgrade.html" rel="alternate" title="Time for a Yawpgrade" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2005-07-12T21:25:02Z</issued>
    <created>2005-07-12T21:25:02Z</created>
    <modified>2005-07-13T16:21:23Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=19</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=19</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/19-guid.html</id>
    <title mode="escaped" type="text/html">Time for a Yawpgrade</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
For those following along with the PEAR/Yawp series, a serious security hole was found in Yawp 1.0.6, and all users are strongly recommended to upgrade.<br />
<br />
<span class="code">pear upgrade http://phpyawp.com/Yawp-1.1.0.tgz</span><br />
<br />
Changelog:<br />
<ul><br />
    <li>BACKWARDS COMPATIBILITY BREAK: Removed the<br />
$GLOBALS['_Yawp']['conf_path'] variable, as it can be the source of<br />
serious security problems when register_globals is turned on in<br />
combination with other circumstances. In its place, use<br />
define('YAWP_CONF_PATH', '/path/to/Yawp.conf.php') to set up a custom<br />
configuration file location. Thanks to Stefan Esser of hardened-php.net<br />
for discovering this simple but potentially serious flaw.</li><br />
    <li>Added htmlspecialchars() to the trigger_error() messages generated when the configuration file cannot be read or found.</li><br />
</ul>        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/18-Spellcheck-Plugin-for-s9y-0.5.html" rel="alternate" title="Spellcheck Plugin for s9y - 0.5" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2005-07-08T16:02:00Z</issued>
    <created>2005-07-08T16:02:00Z</created>
    <modified>2005-07-08T16:06:26Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=18</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=18</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/18-guid.html</id>
    <title mode="escaped" type="text/html">Spellcheck Plugin for s9y - 0.5</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
This plugin is based on the <a href="http://programmin.prim8.net/exit.php?url_id=171&amp;entry_id=18" title="http://www.broken-notebook.com/spell_checker/index.php" onmouseover="window.status='http://www.broken-notebook.com/spell_checker/index.php';return true;" onmouseout="window.status='';return true;">ajax-spell checker</a> developed by Garrison Locke.<br />
<br />
Download is available <a href="http://programmin.prim8.net/exit.php?url_id=172&amp;entry_id=18" title="http://prim8.net/files/serendipity_event_spellcheck-0.5.tar.gz" onmouseover="window.status='http://prim8.net/files/serendipity_event_spellcheck-0.5.tar.gz';return true;" onmouseout="window.status='';return true;">here</a>.  Just untar it in your plugins directory and then install the plugin from your s9y admin.<br />
<br />
Changes:<br />
<ul><li>Spellchecker backend loads as an external plugin.</li><br />
<li>Spellchecker links now have a fixed position to the right of the edit area, with hack for IE.</li><br />
<li>ASPELL better supported, with a config option to set your path.</li><br />
<li>Other minor fixes and tweaks.</li><br />
</ul><br />
Known Issues:<br />
<ul><br />
<li>You must have PSPELL or ASPELL installed</li><br />
<li>Each time the spell check is run, the 'Entry Body' box seems to grow 1 pixel wider, for some reason not immediately apparent to me. Maybe someone with stronger css-foo will have an idea.</li><br />
</ul>        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/17-Spellcheck-Plugin-for-s9y-0.4.html" rel="alternate" title="Spellcheck Plugin for s9y - 0.4" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2005-07-05T18:41:32Z</issued>
    <created>2005-07-05T18:41:32Z</created>
    <modified>2005-07-05T18:46:50Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=17</wfw:comment>

    <slash:comments>2</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=17</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/17-guid.html</id>
    <title mode="escaped" type="text/html">Spellcheck Plugin for s9y - 0.4</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
This plugin is based on the <a href="http://programmin.prim8.net/exit.php?url_id=165&amp;entry_id=17" title="http://www.broken-notebook.com/spell_checker/index.php" onmouseover="window.status='http://www.broken-notebook.com/spell_checker/index.php';return true;" onmouseout="window.status='';return true;">ajax-spell checker</a> developed by Garrison Locke.  The 0.4 plugin is based on version 2.2 of ajax-spell.<br />
<br />
Download is available <a href="http://programmin.prim8.net/exit.php?url_id=166&amp;entry_id=17" title="http://prim8.net/files/serendipity_event_spellcheck-0.4.tar.gz" onmouseover="window.status='http://prim8.net/files/serendipity_event_spellcheck-0.4.tar.gz';return true;" onmouseout="window.status='';return true;">here</a>.  Just untar it in your plugins directory and then install the plugin from your s9y admin.<br />
<br />
Known Issues:<br />
<ul><br />
<li>You must have PSPELL or ASPELL installed</li><br />
<li>Each time the spell check is run, the 'Entry Body' box seems to grow 1 pixel wider, for some reason not immediately apparent to me. Maybe someone with stronger css-foo will have an idea.</li><br />
</ul>        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/16-Getting-started-with-PEAR-Part-2-Apologies-to-Whitman.html" rel="alternate" title="Getting started with PEAR - Part 2: Apologies to Whitman" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2005-06-29T18:11:57Z</issued>
    <created>2005-06-29T18:11:57Z</created>
    <modified>2005-06-30T01:35:26Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=16</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=16</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/16-guid.html</id>
    <title mode="escaped" type="text/html">Getting started with PEAR - Part 2: Apologies to Whitman</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
<a href="http://programmin.prim8.net/exit.php?url_id=159&amp;entry_id=16" title="http://programmin.prim8.net/archives/13-Getting-started-with-PEAR.html" onmouseover="window.status='http://programmin.prim8.net/archives/13-Getting-started-with-PEAR.html';return true;" onmouseout="window.status='';return true;">Getting started with PEAR - Part 1</a><br />
<br />
<a href="http://programmin.prim8.net/exit.php?url_id=160&amp;entry_id=16" title="http://phpyawp.com/yawiki/" onmouseover="window.status='http://phpyawp.com/yawiki/';return true;" onmouseout="window.status='';return true;">YAWP</a>, or Yet Another Web Programming (foundation for PHP applications), is a great way to make the jump to using the PEAR libraries in your application.  According to the YAWP site:<br />
<br />
<blockquote>When you use Yawp as the base of your application, get...<br />
<br />
<ul><li>A single easy-to-edit config file</li><br />
<li>Automated authentication processing</li><br />
<li>Automatic creation of common objects: (Database abstraction, Disk cache, Composite logger, Benchmark timer, Variable dumper)</li><br />
<li>Safe accessor methods for PATH_INFO, GET, POST, and configuration values</li></ul><br />
</blockquote><br />
Sounds good?  Let's begin.<br />
<br />
<b>Installation:</b><br />
<br />
Covered in <a href="http://programmin.prim8.net/exit.php?url_id=159&amp;entry_id=16" title="http://programmin.prim8.net/archives/13-Getting-started-with-PEAR.html" onmouseover="window.status='http://programmin.prim8.net/archives/13-Getting-started-with-PEAR.html';return true;" onmouseout="window.status='';return true;">Getting started with PEAR</a>.<br />
<br />
<b>Configuration:</b><br />
<br />
The Yawp package includes a default config file, that is installed under the PEAR docs directory.  On my system, I found the file here:<br />
<br />
/usr/share/pear/doc/Yawp/docs/Yawp.conf-dist.php<br />
<br />
The standard practice is to put this file in the base htdocs directory of your site, however I prefer to keep sensitive files outside of webspace, and this is supported also.  Create Yawp.conf.php in you web document root, that contains a single line, starting with a slash, that is the path to your real config file:<br />
<br />
<div class="code">/safe/path/outside/web/space/MyVhost.Yawp.conf.php<br />
</div><br />
<br />
If you are running a number of vhosts, you can keep all your Yawp configs in the same directory.<br />
<br />
<b>Constants:</b><br />
<br />
<div class="code">[CONSTANT]<br />
<br />
# I uncommented these since they are useful to have site-wide constants that <br />
# represent your host and directories.<br />
# This way you can avoid hard-coding paths and move your site to another server/directory with  <br />
# minimum hassle.<br />
# the base for all hrefs (e.g., '/~user')<br />
HREF_BASE = /<br />
DOCUMENT_ROOT = /var/www/vhost/htdocs/<br />
HTTP_HOST = www.myvhost.com/<br />
</div><br />
<br />
Next are auto-include files that run when certain conditions happen.  Uncomment these if you want to trigger certain code to happen on conditions like login, logout, start or stop.  These are followed by error reporting and session parameters.<br />
<br />
<div class="code">[Yawp]<br />
<br />
# scripts to execute on login<br />
;login = /path/to/script1.php<br />
;login = /path/to/script2.php<br />
...<br />
<br />
# error reporting level<br />
error_reporting = %E_ALL%<br />
<br />
# session parameters<br />
session_start    = true<br />
session_lifetime = 0<br />
session_path     = %HREF_BASE%<br />
session_domain   = %HTTP_HOST%<br />
session_secure   = false<br />
</div><br />
<br />
Next lets skip down to the Auth section.  If you are running a site with user logins, you probably want to make use of this functionality.  To use it, you would uncomment this section and customize it with your own settings.  This example authenticates against a mysql database, Yawp also supports authenticating against a unix passwd file, LDAP or Samba passwords.<br />
<br />
<div class="code">[Auth]<br />
# general settings<br />
container = DB<br />
idle = 1800<br />
expire = 3600<br />
%AUTH_IDLED% = Your session has been idle for too long.  Please sign in again.<br />
%AUTH_EXPIRED% = Your session has expired.  Please sign in again.<br />
%AUTH_WRONG_LOGIN% = You provided an incorrect username or password.  Please try again.<br />
<br />
# DB container options for Auth<br />
[Auth_DB]<br />
# you must change these to match your DB structure<br />
# here is a dsn example for mysql<br />
dsn = mysql://username:password@localhost/database<br />
table = auth<br />
usernamecol = username<br />
passwordcol = password<br />
</div><br />
<br />
These settings assume you have a table 'auth' in database 'database', on server 'localhost'.  Here is an example table definition:<br />
<br />
<div class="code">CREATE TABLE auth (<br />
   username VARCHAR(50) default '' NOT NULL,<br />
   password VARCHAR(32) default '' NOT NULL,<br />
   PRIMARY KEY (username),<br />
   KEY (password)<br />
);<br />
</div><br />
<br />
Next on to the DB section.  Just enter the details for your database connection.<br />
<br />
<div class="code">[DB]<br />
phptype = mysql<br />
;dbsyntax =<br />
;protocol =<br />
hostspec = localhost<br />
database = database<br />
username = username<br />
password = password<br />
;proto_opts =<br />
;option =<br />
</div><br />
<br />
That is about it for the basic config options.  There are some other sections commented out, if you are interested in any of those you can find more detail in the <a href="http://programmin.prim8.net/exit.php?url_id=162&amp;entry_id=16" title="http://phpyawp.com/yawiki/index.php?page=ConfigFile" onmouseover="window.status='http://phpyawp.com/yawiki/index.php?page=ConfigFile';return true;" onmouseout="window.status='';return true;">Yawp documentation</a>.<br />
<br />
<b>Hello World:</b><br />
<br />
Now, on to writing your first page with Yawp.<br />
<br />
<div class="code">&lt;?php<br />
require_once 'Yawp.php';<br />
Yawp::start();<br />
<br />
echo "&lt;html>&lt;body>Hello world, hear my barbaric YAWP!&lt;/body>&lt;/html>";<br />
<br />
Yawp::stop();<br />
?><br />
</div><br />
<br />
If you remember the auto-include section in the config, I mentioned includes could be triggered on start and stop, these correspond to Yawp::start() and Yawp::stop(), and would be appropriate places to put your html header and footer if you so desire.<br />
<br />
<b>Yawp Functions:</b><br />
<br />
<a href="http://programmin.prim8.net/exit.php?url_id=163&amp;entry_id=16" title="http://phpyawp.com/yawiki/index.php?page=PublicMethods" onmouseover="window.status='http://phpyawp.com/yawiki/index.php?page=PublicMethods';return true;" onmouseout="window.status='';return true;">These functions</a> are available from the Yawp object.  Some of the common ones you will use are:<br />
<br />
start() - see above<br />
stop() - see above<br />
getGet() - safely gets a GET variable<br />
getPost() - safely gets a POST variable<br />
getObject() - gets a PEAR class from Yawp (such as AUTH or DB), useful for doing PEAR functions not supported within Yawp directly.<br />
authUsername() - returns the current username if authenticated.<br />
<br />
<b>Front Controller:</b><br />
<br />
I recommend using a front controller (single point of entry) for your web application.  For more general info on front controllers, here is a good <a href="http://programmin.prim8.net/exit.php?url_id=164&amp;entry_id=16" title="http://www.onlamp.com/pub/a/php/2004/07/08/front_controller.html" onmouseover="window.status='http://www.onlamp.com/pub/a/php/2004/07/08/front_controller.html';return true;" onmouseout="window.status='';return true;">onlamp article</a>.  This is one page that will set up your environment and dispatch whatever pages need to display.  Normally you would use the front controller to separate logic, flow control and layout, but for simplicity in this example I just dispatch a single view that will handle logic and layout.  I'll explain the code in comments, so on to the code:<br />
<br />
<div class="code">&lt;?php<br />
require_once 'Yawp.php';<br />
Yawp::start();<br />
<br />
// handle auth logout<br />
$LOGOUT = Yawp::getGet('LOGOUT');<br />
if ($LOGOUT) {<br />
  // return the PEAR Auth object from Yawp<br />
  $auth =&amp; Yawp::getObject('Auth');<br />
  // Yawp doesn't have an authLogout func, so we call it directly<br />
  $auth->logout();<br />
}<br />
<br />
// are we logged in?<br />
$auth_check = Yawp::authUsername();<br />
<br />
if ($auth_check === null) {<br />
  // did you uncomment the Auth section in your config?<br />
  echo "Auth not enabled.";<br />
} else if ($auth_check === false) {<br />
  // not logged in<br />
  // show the login form<br />
  ?><br />
    &lt;form method="post" action="&lt;?php echo $_SERVER['PHP_SELF']?>"><br />
    &lt;input type="hidden" name="LOGIN" value="1" /><br />
    &lt;p>Username: &lt;input type="text" name="username" /><br />
    &lt;br />Password: &lt;input type="password" name="password" /><br />
    &lt;br />&lt;input type="submit" value="Sign In" />&lt;/p><br />
<br />
    &lt;?php<br />
    // if there was an error...<br />
    if (Yawp::getAuthErr()) {<br />
      // ... print the message and clear the error<br />
      echo "&lt;p>" . Yawp::clearAuthErrMsg() . "&lt;/p>";<br />
    }<br />
  ?><br />
    &lt;/form>&lt;?<br />
  // show anything else on your homepage that is meant for guests only<br />
} else {<br />
  // output the content of your site, that is only visible<br />
  // for users which have been authenticated successfully.<br />
<br />
  // show username and logout link<br />
  printf("&lt;div class=lighttext>Welcome user &lt;b>%s&lt;/b>&#160;&#160;&lt;/div>\n", $auth_check );<br />
  echo "&lt;A HREF=\"".$_SERVER['PHP_SELF']."?LOGOUT=1\">Log out&lt;/A>";<br />
<br />
  // I want to see any errors that happen, and break code execution<br />
  PEAR::setErrorHandling(PEAR_ERROR_DIE);<br />
<br />
  // fetch the DB object<br />
  $db =&amp; Yawp::getObject('DB');<br />
  if (! $db) {<br />
    echo "Could not get database connection.";<br />
  } else {<br />
    // column data returned as an array indexed by column names<br />
    $db->setFetchMode(DB_FETCHMODE_ASSOC);<br />
<br />
    // to display certain data on a page, set the view variable<br />
    $view = Yawp::getGet('view');<br />
    if (empty($view))<br />
      $view = Yawp::getPost('view');<br />
<br />
    if (empty($view))<br />
      include 'page-default.php';<br />
    else {<br />
      switch ($view) {<br />
        case 'main':<br />
          include 'page-default.php';<br />
          break;<br />
        case 'custom':<br />
          include 'page-custom.php';<br />
          break;<br />
        default:<br />
          include 'page-default.php';<br />
          break;<br />
      }<br />
    }<br />
  }<br />
}<br />
?><br />
</div><br />
<br />
<b>Next Part:</b><br />
<br />
In the next part I'll be talking about DB queries and using HTML_QuickForm.        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/15-Spellcheck-Plugin-for-s9y.html" rel="alternate" title="Spellcheck Plugin for s9y" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2005-06-23T19:35:01Z</issued>
    <created>2005-06-23T19:35:01Z</created>
    <modified>2005-06-23T19:50:07Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=15</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=15</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/15-guid.html</id>
    <title mode="escaped" type="text/html">Spellcheck Plugin for s9y</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
s9y has a lot of plugins available, but one notable feature that was missing was spellcheck.  I got tired of pasting my posts into my mail client, so I took the <a href="http://programmin.prim8.net/exit.php?url_id=133&amp;entry_id=15" title="http://www.broken-notebook.com/spell_checker/index.php" onmouseover="window.status='http://www.broken-notebook.com/spell_checker/index.php';return true;" onmouseout="window.status='';return true;">ajax-spell checker</a> developed by Garrison Locke and made it into a plugin for serendipity.<br />
<br />
A beta version (0.3) is available <a href="http://programmin.prim8.net/exit.php?url_id=134&amp;entry_id=15" title="http://prim8.net/files/serendipity_event_spellcheck-0.3.tar.gz" onmouseover="window.status='http://prim8.net/files/serendipity_event_spellcheck-0.3.tar.gz';return true;" onmouseout="window.status='';return true;">here</a>.  Just untar it in your plugins directory and then install the plugin from your s9y admin.<br />
<br />
Known issues:<br />
<ul><br />
<li>You must have PSPELL installed (should work with aspell, but I haven't had a chance to test it, may need some configuration).</li><br />
<li>Each time the spell check is run, the 'Entry Body' box seems to grow 1 pixel wider, for some reason not immediately apparent to me.  Maybe someone with stronger css-foo will have an idea.</li><br />
<li>Check spelling link gets positioned wrong when a preview displays, may need to go back to relative positioning.</li><br />
<li>Some html tags are being (incorrectly) stripped out by the spellcheck.</li><br />
</ul>        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/13-Getting-started-with-PEAR.html" rel="alternate" title="Getting started with PEAR" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2005-06-13T16:42:47Z</issued>
    <created>2005-06-13T16:42:47Z</created>
    <modified>2005-07-12T21:30:35Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=13</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=13</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/13-guid.html</id>
    <title mode="escaped" type="text/html">Getting started with PEAR</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
Introduction:<br />
<br />
PEAR is 'PHP Extension and Application Repository' (similar to CPAN for those perl users).  It is a repository for public libraries for use with the popular PHP language, and also represents a set of PHP coding standards to encourage a unified style within the libraries.<br />
<br />
In the past I simply wrote my own libraries for each task I wanted to accomplish, and then all my apps shared the same set of custom libs.  Now, this is not a bad way to go, and you may be quite happy with the results, but if you want to use a more standardized approach, with code that has been peer reviewed and documented, then PEAR is for you.<br />
<br />
Yawp is a framework that takes some of the base PEAR packages and combines them to use a unified config file and wrapper object.  It can be a quick way to jumpstart into using a full set of PEAR packages for your application.<br />
<br />
Installing PEAR:<br />
<br />
If you have compiled a recent version of PHP (and not used --without-pear), then you may already  have PEAR on your system.  On fedora you could do:<br />
<br />
<div class="code">up2date -i php-pear</div><br />
<br />
Installing PEAR modules:<br />
<br />
This bit is easy.  You just need to do something like the following:  (here are commands to install all the PEAR modules I'll be mentioning, and prerequisites).<br />
<br />
<div class="code"><br />
pear install Auth<br />
pear install Benchmark<br />
pear install Cache_Lite<br />
pear install DB<br />
pear install DB_Table<br />
pear install Log<br />
pear install Var_Dump<br />
pear install http://phpyawp.com/Yawp-1.1.0.tgz<br />
pear install HTML_Common<br />
pear install HTML_QuickForm<br />
pear install HTML_Table<br />
</div><br />
<br />
If PEAR complains about dependencies, then simply install the dependency packages first (unless it happens to be something like: PHP version >= 5.0.0 is required).<br />
<br />
If you want to install a non-stable package, use the full package name with the version:<br />
<br />
<div class="code"><br />
pear install HTML_Common2-0.1.0<br />
</div><br />
<br />
Using PEAR:<br />
<br />
Make sure that your PEAR repository is in your include_path.  Edit php.ini and make sure you have something like this:<br />
<br />
<div class="code"><br />
include_path = ".:/usr/share/pear/"<br />
</div><br />
<br />
Then you can use the following from PHP:<br />
<br />
<div class="code"><br />
require_once 'HTML/QuickForm.php';<br />
</div><br />
<br />
PEAR References:<br />
<br />
<a href="http://programmin.prim8.net/exit.php?url_id=173&amp;entry_id=13" title="http://www.pear.php.net/manual/en/" onmouseover="window.status='http://www.pear.php.net/manual/en/';return true;" onmouseout="window.status='';return true;">PEAR Manual</a> - General information about PEAR.<br />
<a href="http://programmin.prim8.net/exit.php?url_id=174&amp;entry_id=13" title="http://www.pear.php.net/manual/en/faq.php" onmouseover="window.status='http://www.pear.php.net/manual/en/faq.php';return true;" onmouseout="window.status='';return true;">PEAR Faq</a> - Frequently Asked Questions.<br />
<a href="http://programmin.prim8.net/exit.php?url_id=175&amp;entry_id=13" title="http://phpyawp.com/yawiki/index.php?page=UserDocs" onmouseover="window.status='http://phpyawp.com/yawiki/index.php?page=UserDocs';return true;" onmouseout="window.status='';return true;">Yawp Documentation</a> - Getting started, function reference and example code for Yawp.<br />
<a href="http://programmin.prim8.net/exit.php?url_id=176&amp;entry_id=13" title="http://pear.php.net/packages.php" onmouseover="window.status='http://pear.php.net/packages.php';return true;" onmouseout="window.status='';return true;">Package Documentation</a> - Documentation for all PEAR packages can be found here.  Find your package, then click 'Documentation', and then either 'End-User Documentation' or 'Documentation for latest release'.<br />
<br />
Next Part:<br />
<br />
In my next post I'll discuss using Yawp as the base framework for your web application.        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/12-DotNet-Adding-a-standard-border-to-a-control.html" rel="alternate" title="DotNet: Adding a standard border to a control" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2005-06-04T15:18:34Z</issued>
    <created>2005-06-04T15:18:34Z</created>
    <modified>2005-06-04T15:32:59Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=12</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=12</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/12-guid.html</id>
    <title mode="escaped" type="text/html">DotNet: Adding a standard border to a control</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
<a href="http://programmin.prim8.net/exit.php?url_id=127&amp;entry_id=12" title="http://www.bobpowell.net/addborder.htm" onmouseover="window.status='http://www.bobpowell.net/addborder.htm';return true;" onmouseout="window.status='';return true;">Adding a standard border to a control.</a> - Bob Powell writes a nice technique for adding a standard border to any Control (or UserControl in my case).  The technique involves setting the CreateParams.Style or .ExStyle flags to determine how the control will be created.<br />
<br />
Style constants can be found in <a href="http://programmin.prim8.net/exit.php?url_id=128&amp;entry_id=12" title="http://www.woodmann.com/fravia/sources/WINUSER.H" onmouseover="window.status='http://www.woodmann.com/fravia/sources/WINUSER.H';return true;" onmouseout="window.status='';return true;">winuser.h</a> under WindowStyles (WS_) and WindowStylesExtended (WS_EX_).        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/11-Coding-styles.html" rel="alternate" title="Coding styles" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2005-06-01T21:10:24Z</issued>
    <created>2005-06-01T21:10:24Z</created>
    <modified>2005-06-01T21:13:14Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=11</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=11</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/11-guid.html</id>
    <title mode="escaped" type="text/html">Coding styles</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
<a href="http://programmin.prim8.net/exit.php?url_id=126&amp;entry_id=11" title="http://joelonsoftware.com/articles/Wrong.html" onmouseover="window.status='http://joelonsoftware.com/articles/Wrong.html';return true;" onmouseout="window.status='';return true;">Making Wrong Code Look Right</a> - an excellent essay from JoelOnSoftware.  I always hated hungarian notation, and now I see how I could have been using it to much better end than tracking types.        </div>
    </content>
</entry>
<entry>
    <link href="http://programmin.prim8.net/archives/10-HowTo-Remove-a-VS.NET-projsolution-from-source-control.html" rel="alternate" title="HowTo Remove a VS.NET proj/solution from source control" type="text/html" />
    <author>
        <name>ir8prim8</name>
        <email>ir8@prim8.net</email>
    </author>

    <issued>2005-05-28T15:58:08Z</issued>
    <created>2005-05-28T15:58:08Z</created>
    <modified>2005-05-28T16:05:49Z</modified>
    <wfw:comment>http://programmin.prim8.net/wfwcomment.php?cid=10</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://programmin.prim8.net/rss.php?version=atom0.3&amp;type=comments&amp;cid=10</wfw:commentRss>

    <id>http://programmin.prim8.net/archives/10-guid.html</id>
    <title mode="escaped" type="text/html">HowTo Remove a VS.NET proj/solution from source control</title>
    <content type="application/xhtml+xml" xml:base="http://programmin.prim8.net/">
        <div xmlns="http://www.w3.org/1999/xhtml">
Recently migrated to subversion (<a href="http://programmin.prim8.net/exit.php?url_id=122&amp;entry_id=10" title="http://subversion.tigris.org/" onmouseover="window.status='http://subversion.tigris.org/';return true;" onmouseout="window.status='';return true;">SVN</a>) from Visual Source Safe.  The changeover went smoothly, but then I was left with a bunch of left over, non-functioning VSS stuff.<br />
<br />
Found an easy walkthrough from <a href="http://programmin.prim8.net/exit.php?url_id=123&amp;entry_id=10" title="http://blogs.msdn.com/korbyp/archive/2003/12/17/44236.aspx" onmouseover="window.status='http://blogs.msdn.com/korbyp/archive/2003/12/17/44236.aspx';return true;" onmouseout="window.status='';return true;">Korby Parnell</a>, which worked great.  Now the solution is much cleaner.<br />
<br />
Really happy with SVN so far (as a user and admin), seems nice compared to either VSS or CVS.  Using <a href="http://programmin.prim8.net/exit.php?url_id=124&amp;entry_id=10" title="http://tortoisesvn.tigris.org/" onmouseover="window.status='http://tortoisesvn.tigris.org/';return true;" onmouseout="window.status='';return true;">TortoiseSVN</a> for a client, which is really simple and integrates with windows explorer.        </div>
    </content>
</entry>
</feed>