<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-11574075</id><updated>2012-02-17T03:15:08.876+01:00</updated><category term='Magento'/><category term='Zend Studio for Eclipse'/><title type='text'>Rocinante's Tech Stuff</title><subtitle type='html'>Rocinante team member comments on issues affecting their daily coding.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>73</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11574075.post-6086852200451409012</id><published>2009-06-05T11:49:00.007+02:00</published><updated>2009-06-05T12:22:48.847+02:00</updated><title type='text'>Gmail imap connect and seen/unseen</title><content type='html'>Some quick notes on imapping gmail (notice the novalidate-cert part... might save you some headaches), marking messages as read, and also about formatting PHP code for blogger. NOTE: code below has error checking removed for clarity.&lt;br /&gt;&lt;div&gt;&lt;pre&gt;&lt;br /&gt;$mbox = imap_open ("{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX", "your@gmail.com", "your");&lt;br /&gt;&lt;br /&gt;$numMessages = imap_num_msg($mbox);&lt;br /&gt;for ($jj = $numMessages; $jj &gt; 0; $jj--)    {   //always have to go backwards, since message ID is dynamic&lt;br /&gt;  $header = imap_header ($mbox, $jj);&lt;br /&gt;  if ('U' == $header-&gt;Unseen)   {   //This message is unread&lt;br /&gt;      $body = '';&lt;br /&gt;      $struct = imap_fetchstructure($mbox, $jj);&lt;br /&gt;      if (!empty ($struct-&gt;parts))   {&lt;br /&gt;          $numParts = count ($struct-&gt;parts);&lt;br /&gt;          for ($kk = 0; $kk &amp;lt; $numParts; $kk++) {&lt;br /&gt;              $part = $struct-&gt;parts[$kk];&lt;br /&gt;              if ('PLAIN' == $part-&gt;subtype)   {&lt;br /&gt;                  $body = imap_fetchbody($mbox, $jj, $kk + 1);&lt;br /&gt;              }&lt;br /&gt;          }&lt;br /&gt;      }  else    {&lt;br /&gt;          $body = imap_body ($mbox, $jj);&lt;br /&gt;      }&lt;br /&gt;      imap_setflag_full($mbox, $jj, "\\Seen"); // mark as read&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;imap_close($mbox);&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span"   style="  white-space: normal; font-family:Georgia;font-size:16px;"&gt;Formatting: I still don't have a good method of formatting for blogger. For this post, I used "&lt;a href="http://www.stanleyshilov.com/online-tools/convert-special-characters-into-html-entities/"&gt;Convert Special Characters into HTML Entities&lt;/a&gt;" by Stanley Shilov (Thanks!), switching to "Edit HTML" in Blogger, putting Stanley's optput between "pre" open and close tags, and then switching back to "compose" mode to clean up the output. There's GOT to be a better way... if anyone knows of any, please yell.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-6086852200451409012?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/6086852200451409012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=6086852200451409012' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/6086852200451409012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/6086852200451409012'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2009/06/gmail-imap-connect-and-seenunseen.html' title='Gmail imap connect and seen/unseen'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-3441860723897423507</id><published>2009-06-04T18:31:00.004+02:00</published><updated>2009-06-04T20:22:06.256+02:00</updated><title type='text'>Permissions for Magento Upgrade</title><content type='html'>Just updated my "live" and local servers to Magento ver. 1.3.2.1 via the admin area, "System" menu, "Magento Connect", "Magento Connect Manager".   I needed to set permissions on the live server, and used Magento: &lt;a href="http://www.portalzine.de/index?/Articles/1/read/aWQtMTQ0LQ%3D%3D/"&gt;Magento Connect Manager - Save Settings - Permissions&lt;/a&gt; and &lt;a href="https://www.gigapros.com/support/index.php?_m=knowledgebase&amp;amp;_a=viewarticle&amp;amp;kbarticleid=164"&gt;How to resolve the file permissions error in Magento Connect Manager?&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I got a lot of permissions errors when setting the permissions on the command line, and also a couple (for index.php and .htaccess) when installing (will have to talk to NuBlue about how to update them next time).  However, since the only change in the two files was stuff for the super-new compiled stuff, I feel that I can address that problem next time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For my local server, I simply downloaded the latest version, deleted my "magento" DB, created a new empty one, and installed (checking back with Max Berndt's "&lt;a href="http://net.tutsplus.com/tutorials/other/getting-started-with-magento-ecommerce/"&gt;Getting Started with Magento Ecommerce!&lt;/a&gt;" to make sure I didn't miss anything). To install French, I downloaded the &lt;a href="http://beta.magentocommerce.com/langs"&gt;French pack&lt;/a&gt;, downloading the "Full Package", and copying the two fr_FR folders to the appropriate folders in Magento.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-3441860723897423507?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/3441860723897423507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=3441860723897423507' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/3441860723897423507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/3441860723897423507'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2009/06/permissions-for-magento-upgrade.html' title='Permissions for Magento Upgrade'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-3923358872050339932</id><published>2009-06-03T19:20:00.002+02:00</published><updated>2009-06-03T19:26:38.090+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Zend Studio for Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Magento'/><title type='text'>Zend Studio for Eclipse autocompletion hinting</title><content type='html'>I had problems getting auto-complete to work for my "product" member variable (of type Mage_Catalog_Model_Product) working in Zend Studio for Eclipse. I found the solution in this &lt;a href="http://code.neox.net/2009/03/10/eclipse-pdt-code-completion-and-zend-framework/"&gt;article by HanaDaddy&lt;/a&gt;. The below works for me... typing in $this-&gt;product-&gt; now gives me auto complete.&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:-webkit-monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px; white-space: pre;"&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; white-space: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;/**&lt;br /&gt;*&lt;br /&gt;* @var Mage_Catalog_Model_Product&lt;br /&gt;*/&lt;br /&gt;var $product;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-3923358872050339932?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/3923358872050339932/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=3923358872050339932' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/3923358872050339932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/3923358872050339932'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2009/06/zend-studio-for-eclipse-autocompletion.html' title='Zend Studio for Eclipse autocompletion hinting'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-9060211899120135458</id><published>2009-06-03T16:12:00.006+02:00</published><updated>2011-01-27T20:01:32.639+01:00</updated><title type='text'>Debugging Magento: Vista, XAMPP, &amp; Zend Studio for Eclipse</title><content type='html'>Here are some notes about what worked for me for being able to debug Magneto in Zend Studio for Eclipse using XAMPP on Vista.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;For debugging with PDT &amp;amp; xDebug, use &lt;a href="http://xdebug.org/find-binary.php"&gt;this &lt;/a&gt;excellent site. My php.ini for xDebug:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" &gt;&lt;div&gt;[XDebug]&lt;/div&gt;&lt;div&gt;zend_extension_ts = D:\xampp\php\ext\php_xdebug-2.1.0-5.2-vc6.dll&lt;/div&gt;&lt;div&gt;zend_debugger.allow_hosts=127.0.0.1/24, 192.168.20.107/108&lt;/div&gt;&lt;div&gt;xdebug.remote_enable=On&lt;/div&gt;&lt;div&gt;xdebug.remote_host=127.0.0.1/24, 192.168.20.107/108&lt;/div&gt;&lt;div&gt;xdebug.remote_port=8080&lt;/div&gt;&lt;div&gt;xdebug.remote_handler=dbgp&lt;/div&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;XAMPP&lt;/div&gt;&lt;div&gt;Download the Window's Installer version of  &lt;a href="http://www.apachefriends.org/en/xampp-windows.html"&gt;XAMPP&lt;/a&gt;. I have all 4 programs (MySQL, Apache, FileZilla FTP Server, and Mercury SMTP server) all running as services that &lt;a href="http://rudyegenias.wordpress.com/2006/10/15/automatically-start-xampp-on-boot/"&gt;boot on startup&lt;/a&gt;. Make sure you have at least XAMPP version 1.7.1. Afterwards, follow the &lt;a href="http://net.tutsplus.com/tutorials/other/getting-started-with-magento-ecommerce/"&gt;EXCELLENT Magento installation instructions by Max Berndt&lt;/a&gt; (thanks Max!).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ZEND DEBUGGER&lt;/div&gt;&lt;div&gt;I don't have full notes here, but I do remember that I had a lot of problems, and in the end used the zend debugger from the PDT even though I own a licensed version of Zend Studio for Eclipse. I downloaded org.zend.php.debug.debugger.win32.x86_5.2.15.v20081217.jar from &lt;a href="http://downloads.zend.com/pdt/plugins/"&gt;http://downloads.zend.com/pdt/plugins/&lt;/a&gt;, and used 7zip to open the jar and extract ZendDebugger.dll from the resource/php5 directory, and copied it into C:\xampp\php\ext\. I then commented out all the lines from the [Zend], [XDebug], and [DEBUGGER] sections of the php.ini file. I then added the following 3 lines to the [DEBUGGER] section before rebooting Apache...&lt;/div&gt;&lt;div&gt;&lt;div&gt;zend_extension_ts=C:\xampp\php\ext\ZendDebugger.dll&lt;/div&gt;&lt;div&gt;zend_debugger.allow_hosts=127.0.0.1/24, 192.168.20.25/39&lt;/div&gt;&lt;div&gt;zend_debugger.expose_remotely=always&lt;/div&gt;&lt;div&gt;I don't remember where I got the exact allow_hosts, but I do know that the default values that I had caused Apache to crash, and the above finally worked for me. &lt;/div&gt;&lt;div&gt;Here you might also want to refer to the article &lt;a href="http://www.websurfrecorder.com/php-debug-with-zend-debugger-and-eclipse-pdt-tutorial-part-1.html"&gt;PHP Debug with Zend Debugger And Eclipse PDT Tutorial Part 1&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;ZEND STUDIO FOR ECLIPSE&lt;/div&gt;&lt;div&gt;The following assumes that Magento can be reached from http://127.0.0.1/magento&lt;/div&gt;&lt;div&gt;- From the "Run" menu, select "Debug Configurations"&lt;/div&gt;&lt;div&gt;- On the left, right-click on "PHP Web Page" and select "New"&lt;/div&gt;&lt;div&gt;- Name: Magento&lt;/div&gt;&lt;div&gt;- Server Debugger: Zend Debugger&lt;/div&gt;&lt;div&gt;- PHP Server: Click on the "New" link&lt;/div&gt;&lt;div&gt;- Name: Magento Server, URL http://127.0.0.1 (do NOT use localhost - I don't have notes on this, but I'm sure that I had trouble accessing the admin area using local host, and switching to http://127.0.0.1 fixed the problem).&lt;/div&gt;&lt;div&gt;- Hit next, going to the Server Path Mapping, and "Add"&lt;/div&gt;&lt;div&gt;- Path on Server: the windows path to your magento dir, e.g. C:\Users\Ed\workspace\magento&lt;/div&gt;&lt;div&gt;- Path in Workspace: /magento&lt;/div&gt;&lt;div&gt;- Click Finish&lt;/div&gt;&lt;div&gt;- Now back in the "Debug Configurations" dialog, set file to magento/&lt;/div&gt;&lt;div&gt;- uncheck "Auto Generate (URL)", and set the path (first part of which is auto-generated) to /magento&lt;/div&gt;&lt;div&gt;- In the "common" tab, click "run" and "debug" for showing in the favorite menus.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hopefully, the above will work for you...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-9060211899120135458?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/9060211899120135458/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=9060211899120135458' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/9060211899120135458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/9060211899120135458'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2009/06/debugging-magento-vista-xampp-zend.html' title='Debugging Magento: Vista, XAMPP, &amp; Zend Studio for Eclipse'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-8039356192318276268</id><published>2009-06-02T17:00:00.011+02:00</published><updated>2009-06-03T17:47:02.143+02:00</updated><title type='text'>Programmatically Importing Product with Images in Magento</title><content type='html'>It took me quite a while to figure out how to import products into Magento including images. The long version is below, the final results are here for those that need a quick fix, with thanks to articles from &lt;a href="http://magentoexpert.co.uk/2009/02/10/creating-magento-products-on-the-fly/"&gt;Darryl Adie&lt;/a&gt; (to show me 95% of the solution) and &lt;a href="http://www.magentocommerce.com/boards/viewthread/4694/P30/#t66424"&gt;tza79&lt;/a&gt; (who showed me how to set the visibility, a.k.a. mediaAttribute). Start with the code from Darryl, and then add the following...&lt;pre&gt;//This call is needed since the media gallery is null for a newly created product.&lt;/pre&gt;&lt;pre&gt;$product-&gt;setMediaGallery (array('images'=&gt;array (), 'values'=&gt;array ()));&lt;/pre&gt;&lt;pre&gt;$product-&gt;addImageToMediaGallery ($fullImagePath, array ('image'), false, false); &lt;/pre&gt;&lt;pre&gt;$product-&gt;addImageToMediaGallery ($fullSmallImagePath, array ('small_image'), false, false); &lt;/pre&gt;&lt;pre&gt;$product-&gt;addImageToMediaGallery ($fullThumbnailPath, array ('thumbnail'), false, false);&lt;/pre&gt;----------------------------&lt;br /&gt;Long, boring version:&lt;div&gt;&lt;br /&gt;&lt;div&gt;I understood quickly with debugging (and with the help of &lt;a href="http://activecodeline.com/getting-things-in-magento-by-getmodel-and-getdata-methods/"&gt;Branko Ajzele's article&lt;/a&gt;) that the media gallery used in magento/app/code/core/Mage/Catalog/Model/Product.php was the object that I wanted to use, but for a newly created product, product-&gt;getMediaGalleryImages() returns NULL.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Product attribute "media_gallery_images" is only set in getMediaGalleryImages, when $product-&gt;getMediaGallery is already set, but $product-&gt;getMediaGallery is null for a newly created product - this is the cause of getMediaGalleryImages returning null.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;product-&gt;setMediaGallery doesn't exist - but then again, neither does getMediaGallery (even though it's called in $product-&gt;getMediaGalleryImages)! What's going on here?!? This led me to several articles, which led to people talking about &lt;a href="http://us.php.net/__call"&gt;PHP5's Overloading&lt;/a&gt;. OK, maybe I should have known this already, but it was a cool discovery. However, it didn't help me solve my problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's where I lost a lot of time... I decided my best bet was to debug the admin area, to see how they create the media gallery. I was able to get Zend Studio for Eclipse to debug the admin area... a task &lt;a href="http://rocinantesoftware.blogspot.com/2009/06/debugging-magento-vista-xampp-zend.html"&gt;which I will document shortly&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With the debugger, I could see that it was the ProductController that was creating the media gallery while loading the admin part, but EXACTLY where it was creating it, I was not able to find before it was time to go to dinner yesterday. In any case, if you want to debug this yourself, I can give you a hint: start in the "newAction" routine in /magento/app/code/core/Mage/Adminhtml/controllers/Catalog/ProductController.php&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Rather than going back to debugging the admin area today, I decided to take a good look at what an empty media gallery looks like, by creating a product in the Magento admin area, and then loading it with...&lt;pre&gt;$product-&gt;load(6);&lt;br /&gt;$mediaGallery = $product-&gt;getMediaGallery();&lt;br /&gt;print_r ($mediaGallery);&lt;br /&gt;&lt;/pre&gt;Hmmm, it's nothing more than an array of arrays. Why not make it myself using setMediaGallery? Bingo!&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-8039356192318276268?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/8039356192318276268/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=8039356192318276268' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/8039356192318276268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/8039356192318276268'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2009/06/programmatically-importing-product-with.html' title='Programmatically Importing Product with Images in Magento'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-7503916441738676659</id><published>2009-02-27T19:42:00.002+01:00</published><updated>2009-02-27T19:49:35.613+01:00</updated><title type='text'>Displaying Google Search Params</title><content type='html'>If I search for 'lensbase víüçñ' in google.es using internet explorer, and capture the 'q' parameter from $_SERVER["HTTP_REFERER"] in PHP, I get 'lensbase+v%C3%AD%C3%BC%C3%A7%C3%B1'. There may be an easy way to convert all the %xx back to something readable, but I did not find it (tried urldecode,  utf8_decode, iconv, and about 100 other things).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I found a urlRawDecode function that worked great on windows, but not on Linux.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I found JavaScript code &lt;a href="http://netzreport.googlepages.com/online_tool_for_url_en_decoding.html"&gt;here&lt;/a&gt;, but calling it was just another problem.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;At the end, I store my data as the full gobblygook, and then "fix it" on the display. For display, I set my header to utf-8 using &lt;/div&gt;&lt;div&gt;header('Content-type: text/html; charset=utf-8');&lt;br /&gt;&lt;/div&gt;&lt;div&gt;and call urldecode on the string. That fixes everything except the + symbol and, since it's just a quick and dirty check of queries from google, I just str_replace them with spaces.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-7503916441738676659?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/7503916441738676659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=7503916441738676659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/7503916441738676659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/7503916441738676659'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2009/02/displaying-google-search-params.html' title='Displaying Google Search Params'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-1261541280963193032</id><published>2009-02-10T11:08:00.002+01:00</published><updated>2009-02-10T11:12:15.171+01:00</updated><title type='text'>ColorCop</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_TxAaA9uu78c/SZFS9xQiygI/AAAAAAAAYrw/zNrfem8Ayf4/s1600-h/colorcopy192x192.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 192px; height: 192px;" src="http://1.bp.blogspot.com/_TxAaA9uu78c/SZFS9xQiygI/AAAAAAAAYrw/zNrfem8Ayf4/s200/colorcopy192x192.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5301109457540008450" /&gt;&lt;/a&gt;&lt;br /&gt;If you need a simply &lt;a href="http://colorcop.net/"&gt;color picker utility&lt;/a&gt;, I'm very happy with &lt;a href="http://colorcop.net/"&gt;ColorCop&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-1261541280963193032?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://colorcop.net/' title='ColorCop'/><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/1261541280963193032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=1261541280963193032' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/1261541280963193032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/1261541280963193032'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2009/02/colorcop.html' title='ColorCop'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_TxAaA9uu78c/SZFS9xQiygI/AAAAAAAAYrw/zNrfem8Ayf4/s72-c/colorcopy192x192.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-5240490895447552502</id><published>2008-07-16T17:59:00.001+02:00</published><updated>2008-07-16T17:59:49.703+02:00</updated><title type='text'>Download from remote CVS</title><content type='html'>* Client machine (your current Linux user, eg: peter)&lt;br /&gt;* Server machine (user where you want access, eg: mister_big)&lt;br /&gt;&lt;br /&gt;* Create a keypair private/public key on client machine to avoid retype the password every time (on peter machine)&lt;br /&gt;&lt;br /&gt;Go to .ssh folder and type:&lt;br /&gt;&lt;br /&gt;ssh-keygen -t dsa&lt;br /&gt;&lt;br /&gt;Select Emtpy pass-phrase.&lt;br /&gt;&lt;br /&gt;2 files had been created. id_dsa (private key) and id_dsa.pub (public key)&lt;br /&gt;&lt;br /&gt;* You need add the id_dsa.pub content into authorized_key2 file on server machine (server machine is the computer where you want to access, in this case mister_big)&lt;br /&gt;* Copy id_dsa.pub into server machine. Eg: via FTP. Note: You need move id_dsa.pub to root folder to access file via FTP since .ssh folder is not listed on FTP clients.&lt;br /&gt;* On mister_big machine, move id_dsa.pub into .ssh directory (.ssh folder is a directory placed on root)&lt;br /&gt;* Merge the new key (WARNING: I saw a lot comands to make this but for me only works fine this option)&lt;br /&gt;&lt;br /&gt;mv authorized_keys2 authorized_keys2.bak    // It's a backup&lt;br /&gt;cp id_dsa.pub authorized_keys2            // Overwrite current authorized_keys2&lt;br /&gt;cat authorized_keys2.bak &gt;&gt; authorized_keys2    // Use a backup to merge files&lt;br /&gt;chmod 600 authorized_keys2            // Restore permissions&lt;br /&gt;&lt;br /&gt;Go again to client machine (peter machine) and type:&lt;br /&gt;&lt;br /&gt;ssh-agent /bin/bash&lt;br /&gt;ssh-add&lt;br /&gt;&lt;br /&gt;And next, you can download code without type password anymore:&lt;br /&gt;&lt;br /&gt;export     CVS_RSH=ssh&lt;br /&gt;cvs -d:ext:mister_big@yourdomain.com/cvs checkout &lt;your&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-5240490895447552502?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/5240490895447552502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=5240490895447552502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/5240490895447552502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/5240490895447552502'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2008/07/download-from-remote-cvs.html' title='Download from remote CVS'/><author><name>Cristobal Tello</name><uri>http://www.blogger.com/profile/17597198250113437320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-4968747061806275739</id><published>2008-06-10T09:30:00.004+02:00</published><updated>2008-06-10T09:42:17.885+02:00</updated><title type='text'>Enums</title><content type='html'>For the Tourline email, I needed to parse an FM CVS Export file. First, I split up the fields with a "split" function...&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: Consolas, "Courier New", Courier, Monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;         &lt;span class="rem"&gt;//First, make sure any old files are cleaned up.&lt;/span&gt;&lt;br /&gt;         System.IO.File.Delete(m_strOutFile);&lt;br /&gt;&lt;br /&gt;         &lt;span class="rem"&gt;//Ask FM to generate the new file&lt;/span&gt;&lt;br /&gt;         Utils.Tools.RunFMScript(&lt;span class="str"&gt;"Shipments.fp5"&lt;/span&gt;, &lt;span class="str"&gt;"TourlineExport"&lt;/span&gt;);&lt;br /&gt;         Utils.Tools.WaitForFMGenerateFile(m_strOutFile, 120);&lt;br /&gt;         System.IO.TextReader reader = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br /&gt;         &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;br /&gt;         {&lt;br /&gt;             &lt;span class="kwrd"&gt;if&lt;/span&gt; (System.IO.File.Exists(m_strOutFile))&lt;br /&gt;             {&lt;br /&gt;                 reader = System.IO.File.OpenText(m_strOutFile);&lt;br /&gt;                 &lt;span class="kwrd"&gt;while&lt;/span&gt; (reader.Peek() &amp;gt; -1)  {&lt;br /&gt;                     &lt;span class="kwrd"&gt;string&lt;/span&gt; strLine = reader.ReadLine();&lt;br /&gt;                     &lt;span class="kwrd"&gt;if&lt;/span&gt; (strLine.Length &amp;gt; 0 &amp;amp;&amp;amp; &lt;span class="str"&gt;'"'&lt;/span&gt; == strLine[0])&lt;br /&gt;                         strLine = strLine.Substring(1);&lt;br /&gt;                     &lt;span class="kwrd"&gt;if&lt;/span&gt; (strLine.Length &amp;gt; 0 &amp;amp;&amp;amp; &lt;span class="str"&gt;'"'&lt;/span&gt; == strLine[strLine.Length - 1])&lt;br /&gt;                         strLine = strLine.Substring(0, strLine.Length - 1);&lt;br /&gt;                     &lt;span class="kwrd"&gt;string&lt;/span&gt;[] splitter = { &lt;span class="str"&gt;"\",\""&lt;/span&gt; };&lt;br /&gt;                     &lt;span class="kwrd"&gt;string&lt;/span&gt;[] shipmentLines = strLine.Split(splitter, StringSplitOptions.None);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;To index into shipmentLines, I started doing the following...&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;       &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; k_shipmentID = 0;&lt;br /&gt;       &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; k_invoiceID = 1;&lt;br /&gt;       &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; k_title = 2;&lt;br /&gt;       &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; k_firstNames = 3;&lt;br /&gt;       &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; k_surname = 4;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;...but quickly realized that it was hard to maintain (if the needed fields change, or the number of fields change - whatever). Therefore, I started using enums&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;enum&lt;/span&gt; FMFields&lt;br /&gt;        {&lt;br /&gt;            ShipmentID, InvoiceID, Title, FirstNames, Surname, Street, Street2,&lt;br /&gt;            Town, City, County, Country, PostalCode, StrUnfoInfo, InvoiceTotal, ScannedStatus,&lt;br /&gt;            DateScanned&lt;br /&gt;        };&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Much nicer, and easier to maintain - and less typing to boot! Note that I use the .NET convention of capitalizing both the enum name and the names of the members.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-4968747061806275739?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/4968747061806275739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=4968747061806275739' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/4968747061806275739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/4968747061806275739'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2008/06/enums.html' title='Enums'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-380262336648979663</id><published>2008-03-13T07:14:00.002+01:00</published><updated>2008-03-13T07:20:35.212+01:00</updated><title type='text'>Position Preferences in AdWords</title><content type='html'>While going over the settings from a German campaign, I stumbled upon the "position preferences" option. This allows you to specify to Google in which position or range of positions you want to appear in the paid search results. Great! I thought. Let's set up all the keywords to be in position 1-6, since going any lower is just a waste of time.&lt;br /&gt;&lt;br /&gt;However, I found 2x problems. The first was that I found no way, besides going in one keyword at a time, to adjust this. Nothing in the web interface, and nothing in the AdWords Editor. So, before sending an email asking Susana to do this across all our campaigns, I started reading about people using it. Apparently, there are a lot of circumstances where it simply doesn't work at all, and Google even specifically says that this option is only a "suggestion", not a guarantee.&lt;br /&gt;&lt;br /&gt;Well, since we always rank well anyway, I decided to skip the work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-380262336648979663?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/380262336648979663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=380262336648979663' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/380262336648979663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/380262336648979663'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2008/03/position-preferences-in-adwords.html' title='Position Preferences in AdWords'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-6497639854432511990</id><published>2008-02-21T10:07:00.002+01:00</published><updated>2008-02-21T10:12:20.242+01:00</updated><title type='text'>Products Not Showing - MySQL 5</title><content type='html'>If you find a new JShop install where products are not showing, it could be a JShop 1.2/1.3 incompatibility with MySQL5 - products not showing up is the major symptom of using MySQL5. To fix this, read the thread &lt;a href="http://forums.jshopecommerce.com/showthread.php?t=2711" target="_blank"&gt;http://forums.jshopecommerce&lt;wbr&gt;.com/showthread.php?t=2711&lt;/a&gt;. A copy of the file that needs to be merged to make it work is kept at \\server2003\Permanent\Projects\Details\Amexoptics\jss versions\MySQL5_Patch&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-6497639854432511990?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/6497639854432511990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=6497639854432511990' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/6497639854432511990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/6497639854432511990'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2008/02/products-not-showing-mysql-5.html' title='Products Not Showing - MySQL 5'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-3893028060539584590</id><published>2007-11-19T17:18:00.000+01:00</published><updated>2007-11-19T18:18:04.282+01:00</updated><title type='text'>Missing data in XML (format FMPXMLRESULT)</title><content type='html'>We usually have XML data with some value missing, like in this example:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;data&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;COL&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Value1&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Value2&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Value3&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;Value4&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;COL&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;COL&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;240&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;6&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;6&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;DATA&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;COL&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/data&gt;&lt;data&gt;&lt;data&gt;&lt;/data&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;fmpxmlresult xmlns="http://www.filemaker.com/fmpxmlresult"&gt;&lt;product build="08/16/2002" name="FileMaker Pro" version="6.0v3"&gt;&lt;database dateformat="d/M/yyyy" layout="" name="SUPPLIER PURCHASES  .fp5" records="12501" timeformat="k:mm:ss "&gt;&lt;metadata&gt;&lt;field emptyok="YES" maxrepeat="1" name="Batch ID" type="NUMBER"&gt;&lt;field emptyok="YES" maxrepeat="1" name="Date Done" type="TEXT"&gt;&lt;field emptyok="YES" maxrepeat="1" name="Supplier ID" type="NUMBER"&gt;&lt;field emptyok="YES" maxrepeat="1" name="Batch Line Items::Product ID" type="TEXT"&gt;&lt;resultset found="1"&gt;&lt;row modid="0" recordid="12584967"&gt;&lt;/row&gt;&lt;/resultset&gt;&lt;/field&gt;In order that the XML reader overlooks the data missing at the second position in a consistent way, the following condition can be used (the following code is "conceptual", which means that it is not the real one that is currently running):&lt;br /&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;(...)&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (currentReader.NodeType == XmlNodeType.Text)&lt;br /&gt;{&lt;br /&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (isRowToRetrieve)&lt;br /&gt; {&lt;br /&gt;   rowInfo[columnIndex] = reader.Value;&lt;br /&gt;&lt;br /&gt;   &lt;span class="kwrd"&gt;if&lt;/span&gt; (columnIndex == ProdIDPos)&lt;br /&gt;   {&lt;br /&gt;    &lt;span class="rem"&gt;//Values capture&lt;/span&gt;&lt;br /&gt;    valuesArray[valuesIndex++] = currentReader.Value;&lt;br /&gt;   }&lt;br /&gt;   &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (columnIndex == QuantityPos)&lt;br /&gt;   {&lt;br /&gt;     &lt;span class="rem"&gt;//Quantities capture&lt;/span&gt;&lt;br /&gt;     quantitiesArray[quantitiesIndex++] = currentReader.Value;&lt;br /&gt;   }&lt;br /&gt;   &lt;span class="kwrd"&gt;else&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt;{(...)}&lt;br /&gt;   &lt;span class="kwrd"&gt;else&lt;/span&gt;{(...)}&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;(...)&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; ((lastElementName == &lt;span class="str"&gt;"DATA"&lt;/span&gt;) &amp;amp;&amp;amp; (currentReader.Name == &lt;span class="str"&gt;"DATA"&lt;/span&gt;) &amp;amp;&amp;amp; (lastNodeType != XmlNodeType.Text))&lt;br /&gt;{&lt;br /&gt; Log(&lt;span class="str"&gt;"Quantity for "&lt;/span&gt;+ valuesArray[quantitiesIndex] +&lt;span class="str"&gt;" is missing"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/field&gt;&lt;/field&gt;&lt;/field&gt;&lt;/metadata&gt;&lt;/database&gt;&lt;/product&gt;&lt;/fmpxmlresult&gt;&lt;fmpxmlresult xmlns="http://www.filemaker.com/fmpxmlresult"&gt;&lt;product build="08/16/2002" name="FileMaker Pro" version="6.0v3"&gt;&lt;database dateformat="d/M/yyyy" layout="" name="SUPPLIER PURCHASES  .fp5" records="12501" timeformat="k:mm:ss "&gt;&lt;metadata&gt;&lt;field emptyok="YES" maxrepeat="1" name="Batch ID" type="NUMBER"&gt;&lt;field emptyok="YES" maxrepeat="1" name="Date Done" type="TEXT"&gt;&lt;field emptyok="YES" maxrepeat="1" name="Supplier ID" type="NUMBER"&gt;&lt;br /&gt;&lt;/field&gt;&lt;/field&gt;&lt;/field&gt;&lt;/metadata&gt;&lt;/database&gt;&lt;/product&gt;&lt;/fmpxmlresult&gt;&lt;br /&gt;&lt;fmpxmlresult xmlns="http://www.filemaker.com/fmpxmlresult"&gt;&lt;product build="08/16/2002" name="FileMaker Pro" version="6.0v3"&gt;&lt;database dateformat="d/M/yyyy" layout="" name="SUPPLIER PURCHASES  .fp5" records="12501" timeformat="k:mm:ss "&gt;&lt;metadata&gt;&lt;field emptyok="YES" maxrepeat="1" name="Batch ID" type="NUMBER"&gt;&lt;field emptyok="YES" maxrepeat="1" name="Date Done" type="TEXT"&gt;&lt;field emptyok="YES" maxrepeat="1" name="Supplier ID" type="NUMBER"&gt;&lt;br /&gt;Then the key item here is the consideration that, between a XML ElementName and EndElementName, a XML   NodeType Text is expected&lt;br /&gt;&lt;/field&gt;&lt;/field&gt;&lt;/field&gt;&lt;/metadata&gt;&lt;/database&gt;&lt;/product&gt;&lt;/fmpxmlresult&gt;&lt;/data&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-3893028060539584590?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/3893028060539584590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=3893028060539584590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/3893028060539584590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/3893028060539584590'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2007/11/missing-data-in-xml-format-fmpxmlresult.html' title='Missing data in XML (format FMPXMLRESULT)'/><author><name>Felipe Ruiz</name><uri>http://www.blogger.com/profile/10002975114838282178</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp1.blogger.com/_TgdEsRKGGfg/SEbeBDDlfhI/AAAAAAAAAAM/nLeozCDPjeA/S220/byron.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-8222903221826799623</id><published>2007-10-17T19:53:00.000+02:00</published><updated>2007-10-17T20:01:43.187+02:00</updated><title type='text'>Localhost FTP problems</title><content type='html'>In the past, I had problems using IIS's FTP to work. Therefore, I used &lt;a href="http://www.warftp.org/"&gt;WarFTP&lt;/a&gt;, which was an easy setup and worked fine.&lt;br /&gt;&lt;br /&gt;However, today, I just could not get FTPPuts to work. I was getting an Access Denied error, and had no clue what the problem was. After uninstalling and reinstalling, checking params in the server, in my Filezilla, and in my FTP code, I was still clueless.&lt;br /&gt;&lt;br /&gt;OK, WarFTP out, IIS back in - and the same exact error! A "critical transfer error" 550, permissions. It was not IIS or WarFTP that was the problem, but the lack of write permissions for the FTP user in NTFS. Letting "everybody" write to my FTP directory fixed the problem.&lt;br /&gt;&lt;br /&gt;Bye bye WarFTP - you've served me well - but I'll stay with IIS now till I have further problems ;-&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-8222903221826799623?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/8222903221826799623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=8222903221826799623' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/8222903221826799623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/8222903221826799623'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2007/10/localhost-ftp-problems.html' title='Localhost FTP problems'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-1289723168955646144</id><published>2007-10-12T11:59:00.000+02:00</published><updated>2007-10-12T12:35:59.441+02:00</updated><title type='text'>Abandoned Carts on Credit Card Page</title><content type='html'>On one of our client's web shops using SecPay's SECPage interface to check out (without 3D turned on - 3D = MasterCard's 'SecureCode', and Visa’s 'Verified by Visa'), we have 4.5% of users that never come back from SecPay (marked "New" in JShop), and 0.5% whose credit cards fail.&lt;br /&gt;&lt;br /&gt;Note that "never coming back" might also indicate that they failed SecPay's pre-bank checks - SecPay does not indicate to the merchants if clients did not come back due to the pre-bank checks or because of abandoning the cart. However, it appears that the percentage that fails the pre-bank check is small compared to people who simply do not complete the order.&lt;br /&gt;&lt;br /&gt;4.5% is actually good compared to the other web shops that I talked to. One reported 8% (SECPage with 3D turned on), another said 4-8% was "normal" (Secure Trading), and a 3rd report 10% (PayPal).&lt;br /&gt;&lt;br /&gt;What to do when the users never come back? We send out an email after 2 hours, and then again after 10 days, with a link to help the user complete the order. In this way, we're able to get almost one third of users to complete their order. One shop (with few orders of much higher totals) follows up with phone calls to all the abandoned carts, and gets a very large percentage (well over 50%) to finish their order.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-1289723168955646144?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/1289723168955646144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=1289723168955646144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/1289723168955646144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/1289723168955646144'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2007/10/abandoned-carts-on-credit-card-page.html' title='Abandoned Carts on Credit Card Page'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-4014762660331023804</id><published>2007-08-02T13:58:00.000+02:00</published><updated>2007-08-02T14:15:34.900+02:00</updated><title type='text'>FileMaker Auto-Login</title><content type='html'>While working on automating our daily FileMaker -&gt; SQLServer data dump, we needed a way to automatically log into FileMaker whenever it brought up the password dialog. When Felipe mentioned the problem this morning when we got our daily morning coffee at the bakery downstairs, I realized that it could be done with some old Win32 calls.&lt;br /&gt;&lt;br /&gt;I borrowed and stole ideas from my Google searches (starting with EnumWindow C#), and used the trusty old Spy++ application (part of Visual Studio Tools, and something that I haven't fired up in years), to get 90% of the way there. When I was at 90% and trying to set the password text in the edit box, I found &lt;a href="http://www.codeproject.com/csharp/interopsignon.asp"&gt;Using P/Invoke to Automate Database Signon&lt;/a&gt;, which would have saved me quite a bit of time if I had found it earlier, and got me over the last 10%.&lt;br /&gt;&lt;br /&gt;Here is the basic code. You can recreate this by creating a WindowsApplication project in VisualStudio 2005 and adding a timer component which fires as often as you need. Be sure to set the timer to "enabled", and hook it up to the timer1_Tick function.&lt;br /&gt;&lt;style type="text/css"&gt;/&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: Consolas, "Courier New", Courier, Monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre class="csharpcode"&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ComponentModel;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Drawing;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;delegate&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; FMCallBack(&lt;span class="kwrd"&gt;int&lt;/span&gt; hwnd, &lt;span class="kwrd"&gt;int&lt;/span&gt; lParam);&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; FMAutoLogin&lt;br /&gt;{&lt;br /&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;partial&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Form1 : Form&lt;br /&gt; {&lt;br /&gt;     &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; WM_SETTEXT = 0x000C; &lt;span class="rem"&gt;//TextBox&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; BM_CLICK = 0x00F5; &lt;span class="rem"&gt;//Button&lt;/span&gt;&lt;br /&gt;     [DllImport(&lt;span class="str"&gt;"user32.Dll"&lt;/span&gt;)]&lt;br /&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; EnumWindows(FMCallBack x, &lt;span class="kwrd"&gt;int&lt;/span&gt; y);&lt;br /&gt;     [DllImport(&lt;span class="str"&gt;"User32.Dll"&lt;/span&gt;)]&lt;br /&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; GetWindowText(&lt;span class="kwrd"&gt;int&lt;/span&gt; h, StringBuilder s, &lt;span class="kwrd"&gt;int&lt;/span&gt; nMaxCount);&lt;br /&gt;     [DllImport(&lt;span class="str"&gt;"user32.dll"&lt;/span&gt;)]&lt;br /&gt;     [&lt;span class="kwrd"&gt;return&lt;/span&gt;: MarshalAs(UnmanagedType.Bool)]&lt;br /&gt;     &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; SetForegroundWindow(IntPtr hWnd);&lt;br /&gt;     [DllImport(&lt;span class="str"&gt;"user32.dll"&lt;/span&gt;, CharSet = CharSet.Auto)]&lt;br /&gt;     &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; IntPtr SendMessage(IntPtr hWnd,&lt;br /&gt;               &lt;span class="kwrd"&gt;uint&lt;/span&gt; Msg, &lt;span class="kwrd"&gt;int&lt;/span&gt; wParam, &lt;span class="kwrd"&gt;string&lt;/span&gt; lParam);&lt;br /&gt;     [DllImport(&lt;span class="str"&gt;"user32.dll"&lt;/span&gt;)]&lt;br /&gt;     &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;extern&lt;/span&gt; IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter,&lt;br /&gt;         &lt;span class="kwrd"&gt;string&lt;/span&gt; lpszClass, &lt;span class="kwrd"&gt;string&lt;/span&gt; lpszWindow);&lt;br /&gt;&lt;br /&gt;     &lt;span class="rem"&gt;//----------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;public&lt;/span&gt; Form1()&lt;br /&gt;     {&lt;br /&gt;         InitializeComponent();&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     &lt;span class="rem"&gt;//----------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; timer1_Tick(&lt;span class="kwrd"&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;     {&lt;br /&gt;         EnumWindows(&lt;span class="kwrd"&gt;new&lt;/span&gt; FMCallBack(Form1.EnumWindowCallBack), 0);&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;     &lt;span class="rem"&gt;//----------------------------------------------------------------------&lt;/span&gt;&lt;br /&gt;     &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; EnumWindowCallBack(&lt;span class="kwrd"&gt;int&lt;/span&gt; hwnd, &lt;span class="kwrd"&gt;int&lt;/span&gt; lParam)&lt;br /&gt;     {&lt;br /&gt;         StringBuilder sb = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(1024);&lt;br /&gt;         GetWindowText((&lt;span class="kwrd"&gt;int&lt;/span&gt;)hwnd, sb, sb.Capacity);&lt;br /&gt;&lt;br /&gt;         &lt;span class="kwrd"&gt;if&lt;/span&gt; (sb.ToString().Contains(&lt;span class="str"&gt;".fp5"&lt;/span&gt;) &amp;&amp;amp;&lt;br /&gt;             sb.ToString().Contains(&lt;span class="str"&gt;"File \""&lt;/span&gt;))&lt;br /&gt;         {&lt;br /&gt;             SetForegroundWindow((IntPtr) hwnd);&lt;br /&gt;             IntPtr editBox = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, &lt;span class="str"&gt;"Edit"&lt;/span&gt;, &lt;span class="str"&gt;""&lt;/span&gt;);&lt;br /&gt;             SendMessage(editBox, WM_SETTEXT, 0, &lt;span class="str"&gt;"your_password"&lt;/span&gt;);&lt;br /&gt;             IntPtr okButton = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, &lt;span class="str"&gt;"Button"&lt;/span&gt;, &lt;span class="str"&gt;"OK"&lt;/span&gt;);&lt;br /&gt;             SendMessage(okButton, BM_CLICK, 0, &lt;span class="str"&gt;""&lt;/span&gt;);&lt;br /&gt;         }&lt;br /&gt;         &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-4014762660331023804?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/4014762660331023804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=4014762660331023804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/4014762660331023804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/4014762660331023804'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2007/08/filemaker-auto-login.html' title='FileMaker Auto-Login'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-7559594149601568522</id><published>2007-04-26T17:38:00.000+02:00</published><updated>2007-04-26T17:42:58.219+02:00</updated><title type='text'>Taking Shop Offline</title><content type='html'>CT recently had to take the shop offline, and I added the following to /templates/includes/top.html (and top_checkout.html) to make sure that we could use the shop, but not customers...&lt;br /&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;    if ($_SERVER['REMOTE_ADDR'] != "80.28.198.60")&lt;br /&gt;        doRedirect("http://www.visiondirect.co.uk/checkoutChanges.txt");&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;After adding (or removing) this, you need to remove compiled templates.&lt;br /&gt;&lt;br /&gt;NOTE: SecPay cannot arrive successfully at the orderSuccess page if you have this code running.&lt;br /&gt;NOTE2: Of course, you additionally have to add the file indicated by "doRedirect".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-7559594149601568522?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/7559594149601568522/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=7559594149601568522' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/7559594149601568522'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/7559594149601568522'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2007/04/taking-shop-offline.html' title='Taking Shop Offline'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-4572241408351114446</id><published>2007-02-21T09:30:00.000+01:00</published><updated>2007-02-21T09:31:57.986+01:00</updated><title type='text'>Count sales from Tuesday</title><content type='html'>Here is how I got a count of all Tuesday sales from GreenLight...&lt;br /&gt;select count(*) as mycount, left(datetime, 8) as mydate from {orders} where dayofweek(datetime) = 3 and referURL like "GL%" group by mydate order by mydate desc&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-4572241408351114446?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/4572241408351114446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=4572241408351114446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/4572241408351114446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/4572241408351114446'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2007/02/count-sales-from-tuesday.html' title='Count sales from Tuesday'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-6729349847052124413</id><published>2007-01-30T10:41:00.000+01:00</published><updated>2007-01-30T10:42:54.513+01:00</updated><title type='text'>Daily GreenLight Sales</title><content type='html'>When checking a drop in GreenLight sales, I used...&lt;br /&gt;&lt;br /&gt;select left (datetime,8) as mydate, left (datetime,4), mid(datetime, 5, 2), mid(datetime, 7, 2), count(*) as mycount from [OrdersTable] where datetime &gt;= "20070101000000" and referURL like "GL|%" group by mydate order by mydate&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-6729349847052124413?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/6729349847052124413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=6729349847052124413' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/6729349847052124413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/6729349847052124413'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2007/01/daily-greenlight-sales.html' title='Daily GreenLight Sales'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-6449005483067209450</id><published>2006-12-19T10:19:00.000+01:00</published><updated>2006-12-19T10:21:01.366+01:00</updated><title type='text'>Sort powers in MySQL</title><content type='html'>&lt;o:p&gt;&lt;/o:p&gt;We are using the ORDER BY CAST (field AS SIGNED) clause to sort the results by ‘power’ field. But it’s wrong!!&lt;br /&gt;&lt;br /&gt;The way for sort ‘power’ it’s: ORDER BY `Power`+0&lt;br /&gt;&lt;br /&gt;Strange… but works fine!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-6449005483067209450?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/6449005483067209450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=6449005483067209450' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/6449005483067209450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/6449005483067209450'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/12/sort-powers-in-mysql.html' title='Sort powers in MySQL'/><author><name>Cristobal Tello</name><uri>http://www.blogger.com/profile/17597198250113437320</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-87685075565941768</id><published>2006-12-07T13:18:00.000+01:00</published><updated>2006-12-07T13:24:09.560+01:00</updated><title type='text'>MySQL Count Distinct</title><content type='html'>I'm always (stupidly) trying to do something like  "select count(distinct(country))..." when I want so see some results like...&lt;br /&gt;Spain 50&lt;br /&gt;France 20&lt;br /&gt;Germany 10&lt;br /&gt;The correct way to do it is "select country, count(*) as mycount from xxx group by country order by mycount desc"&lt;br /&gt;Hopefully, now that I have this, I'll never do a search on google looking for something so obvious ;-&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-87685075565941768?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/87685075565941768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=87685075565941768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/87685075565941768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/87685075565941768'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/12/mysql-count-distinct.html' title='MySQL Count Distinct'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-5809982553445813153</id><published>2006-11-27T17:06:00.000+01:00</published><updated>2006-11-27T17:10:38.888+01:00</updated><title type='text'>JShop MySQL Query Performance</title><content type='html'>NOTE: This quick and dirty hack (part of the insert function in /routines/dbAccess_mysql.php) kills the last ID - it would need to be made nice to work 100%.&lt;br /&gt;&lt;br /&gt;$theQuery = str_replace('\"', '\\\"', str_replace("'", "''", $sql_query));&lt;br /&gt;               if ($result == FALSE) {&lt;br /&gt;                   $this-&gt;lastError = mysql_errno().": ".mysql_error();&lt;br /&gt;                   mysql_query("insert into amex_dbPerf (descript, err, time) values ('$theQuery', $this-&gt;lastError, $totalTime)");&lt;br /&gt;                   return FALSE;&lt;br /&gt;               } else {&lt;br /&gt;                   mysql_query("insert into amex_dbPerf (descript, err, time) values ('$theQuery', '', $totalTime)");&lt;br /&gt;                   return $result;&lt;br /&gt;&lt;br /&gt;CREATE TABLE `amex_dbperf` (&lt;br /&gt; `actionID` int(11) NOT NULL auto_increment,&lt;br /&gt; `descript` text NOT NULL,&lt;br /&gt; `err` varchar(128) NOT NULL default '',&lt;br /&gt; `time` decimal(12,11) NOT NULL default '0.00000000000',&lt;br /&gt; PRIMARY KEY  (`actionID`)&lt;br /&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-5809982553445813153?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/5809982553445813153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=5809982553445813153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/5809982553445813153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/5809982553445813153'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/11/jshop-mysql-query-performance.html' title='JShop MySQL Query Performance'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-1790358520090592756</id><published>2006-11-27T17:04:00.000+01:00</published><updated>2006-11-27T17:05:49.152+01:00</updated><title type='text'>PHP Timing</title><content type='html'>list($secs, $micros) = split(" ", microtime());&lt;br /&gt;$startTime = $secs + $micros;&lt;br /&gt;//Do Something&lt;br /&gt;list($secs, $micros) = split(" ", microtime());&lt;br /&gt;$totalTime = ($secs + $micros) - $startTime;&lt;br /&gt;totalTime is a decimal with seconds&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-1790358520090592756?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/1790358520090592756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=1790358520090592756' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/1790358520090592756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/1790358520090592756'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/11/php-timing.html' title='PHP Timing'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-116291306315928452</id><published>2006-11-07T16:19:00.000+01:00</published><updated>2006-11-07T16:18:37.278+01:00</updated><title type='text'>Visual Studio Regular Expressions Example</title><content type='html'>I had a number of lines of code in the form...&lt;br /&gt;custNode["address1"].InnerText&lt;br /&gt;...where custNode and address1 were variable, and I wanted to replace them with the more safe...&lt;br /&gt;SafeInnerText (custNode, "address1")&lt;br /&gt;To do this, I made one of my occasional ventures into regular expressions, and thought I would document it for future reference.&lt;br /&gt;Find expression was this...&lt;br /&gt;&lt;p&gt;{&lt;:i*&gt;}{\[\"}{:i*}{\"\].InnerText}&lt;br /&gt;&lt;br /&gt;The find is broken up into 4  "tags" (terminology from Visual Studio). I broke it up into multiple tags since  I only need 2 parts of the found expression, not all of them.&lt;br /&gt;&lt;br /&gt;Here is a  rundown of the parts...&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;strong&gt;{&lt;:i*&gt;} (first tagged expression)&lt;/strong&gt;&lt;br /&gt;Finds  &lt;strong&gt;&lt;span style="color:#ff0000;"&gt;custNode&lt;/span&gt;&lt;/strong&gt;["address1"].InnerText&lt;br /&gt;&lt;br /&gt;{} to  indicate it's an expression&lt;br /&gt;&lt; indicates the beginning of a word&lt;br /&gt;:i* to  find the "custNode" part (&lt;em&gt;Matches the expression  ([a-zA-Z_$][a-zA-Z0-9_$]*)&lt;/em&gt;)&lt;br /&gt;&gt; the end of the word&lt;/p&gt; &lt;p&gt;&lt;strong&gt;{\[\"} (second tagged expression&lt;br /&gt;&lt;/strong&gt;Finds  custNode&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;["&lt;/span&gt;&lt;/strong&gt;address1"].InnerText&lt;/p&gt; &lt;p&gt;{} to indicate it's an expression&lt;br /&gt;\[ (escaping special chars) to find the  left bracket&lt;br /&gt;\"(escaping special chars) to find the double quote&lt;/p&gt; &lt;p&gt;&lt;strong&gt;{:i*} (third tagged expression)&lt;/strong&gt;&lt;br /&gt;Finds  custNode["&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;address1&lt;/span&gt;&lt;/strong&gt;"].InnerText&lt;/p&gt; &lt;p&gt;{} to indicate it's an expression&lt;br /&gt;:i* to find the "address1" part  (&lt;em&gt;Matches the expression ([a-zA-Z_$][a-zA-Z0-9_$]*)&lt;/em&gt;)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;{\"\].InnerText} (fourth tagged expression)&lt;/strong&gt;&lt;br /&gt;Finds  custNode["address1&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;"].InnerText&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;{} to indicate it's an expression&lt;br /&gt;\"(escaping special chars) to find the  double quote&lt;br /&gt;\[ (escaping special chars) to find the left  bracket&lt;br /&gt;.InnerText - literal&lt;br /&gt;&lt;/p&gt; &lt;p&gt;Now the replace...&lt;br /&gt;SafeInnerText (\1, "\3")&lt;/p&gt; &lt;p&gt;\1 and \3 are replaced by the first and third tagged expressions.&lt;/p&gt; &lt;p&gt;NOTE: \0 gives you ALL the tagged expressions - in this case, it would be  custNode["address1"].InnerText&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-116291306315928452?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/116291306315928452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=116291306315928452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/116291306315928452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/116291306315928452'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/11/visual-studio-regular-expressions.html' title='Visual Studio Regular Expressions Example'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-115919734436431995</id><published>2006-09-25T17:02:00.000+02:00</published><updated>2006-11-07T16:18:37.208+01:00</updated><title type='text'>Zend (javaw.exe) using 100% CPU</title><content type='html'>Many thanks to Alberto Miranda who gave me the solution to a grave problem - Zend Studio 5.2.0 suddenly (without me changing anything that I'm aware of) started using close to 100% of CPU time (actually, the Zend process no - it was the javaw.exe process - but it was spawned by Zend). I used Alberto's &lt;a href="http://blog.albertomiranda.com.ar/index.php?title=zend_studio_usando_el_100_de_cpu&amp;more=1&amp;amp;c=1&amp;tb=1&amp;amp;pb=1"&gt;solution &lt;/a&gt;(unchecking the "Use OS Look and Feel" option in the Zend preferences) and, after rebooting the computer and rebooting Zend (which was DEAD slow until it was fully launched) fixed the problem. Alberto, m'man, I owe you unas copas!&lt;strong&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-115919734436431995?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/115919734436431995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=115919734436431995' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/115919734436431995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/115919734436431995'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/09/zend-javawexe-using-100-cpu.html' title='Zend (javaw.exe) using 100% CPU'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-115808706468642721</id><published>2006-09-12T20:46:00.000+02:00</published><updated>2006-11-07T16:18:37.110+01:00</updated><title type='text'>Generating Euro and Dollar Prices from Pounds</title><content type='html'>JSHOP: I wrote a file called amex_setPrices.php for the Lensbase site (in the admin folder) which sets price according to the following formula:&lt;br /&gt;    //Start: Price with VAT (e.g. EasySEPT, £18.00)&lt;br /&gt;    //Remove tax (VAT): £15.31&lt;br /&gt;    //Multiply by tax (VAT) rate: 15.31 * 119% = 18.22&lt;br /&gt;    //Multiply by exchange rate: 18.22 * 1.55 EUR = 28.24&lt;br /&gt;    //Round TO NEAREST DOLLAR (e.g. 28.2 = 28, 28.5 = 29): €28&lt;br /&gt;I needed to apply this to both the $tableProducts, and a variation for $tableAdvancedPricing.&lt;br /&gt;Checked into the LB source code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-115808706468642721?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/115808706468642721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=115808706468642721' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/115808706468642721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/115808706468642721'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/09/generating-euro-and-dollar-prices-from.html' title='Generating Euro and Dollar Prices from Pounds'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-115286733101948199</id><published>2006-07-14T10:49:00.000+02:00</published><updated>2006-11-07T16:18:37.027+01:00</updated><title type='text'>myunhtmlentities</title><content type='html'>I got a reorder reminder cron job error that said:&lt;br /&gt;ERROR: Failed to send reminder 61871 sent for order 315956, customer 2326, email bob&amp;amp;helen@talktalk.net&lt;br /&gt;&lt;br /&gt;Looking at the  reorder reminder table showed me that the email address is retreived from the customer table. There, it is "correctly" stored as bob&amp;amp;helen@talktalk.net. I say "correctly", since JShop generally does store string HTML escaped, which to me is weird - but it's also a fact.&lt;br /&gt;&lt;br /&gt;Solution: whenever getting things from tables in JShop, remember that the data is probably HTML escaped. When you need unescaped strings, you can use the myunhtmlentities (from visiondirect/admin/resources/includeBase.php. If you need this outside the admin area, move it to someplace accessible by the non-admin code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-115286733101948199?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/115286733101948199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=115286733101948199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/115286733101948199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/115286733101948199'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/07/myunhtmlentities.html' title='myunhtmlentities'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-114917575337673294</id><published>2006-06-01T17:25:00.000+02:00</published><updated>2006-11-07T16:18:36.947+01:00</updated><title type='text'>Simple Control.Invoke</title><content type='html'>Just read a great post by John Wood on dotnetjunkies.com called "SafeInvoke: Making GUI Thread Programming Easier in C#". It takes a lot of the drudgery out of the way by avoiding the direct typing of delegates. The code is &lt;a href="http://dotnetjunkies.com/WebLog/johnwood/archive/2005/08/31/132267.aspx"&gt;here&lt;/a&gt;, and I include it here in case the link disappears.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;using System;&lt;br /&gt;using System.Collections;&lt;br /&gt;using System.Reflection;&lt;br /&gt;using System.Reflection.Emit;&lt;br /&gt;...&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-family:Courier New;"&gt;public class SafeInvokeHelper&lt;br /&gt;{&lt;br /&gt;    static readonly ModuleBuilder builder;&lt;br /&gt;    static readonly AssemblyBuilder myAsmBuilder;&lt;br /&gt;    static readonly Hashtable methodLookup;&lt;br /&gt;&lt;br /&gt;    static SafeInvokeHelper()&lt;br /&gt;    {&lt;br /&gt;        AssemblyName name = new AssemblyName();&lt;br /&gt;        name.Name = "temp";&lt;br /&gt;        myAsmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run);&lt;br /&gt;        builder = myAsmBuilder.DefineDynamicModule("TempModule");&lt;br /&gt;        methodLookup = new Hashtable();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static object Invoke(System.Windows.Forms.Control obj, string methodName, params object[] paramValues)&lt;br /&gt;    {&lt;br /&gt;        Delegate del = null;&lt;br /&gt;        string key = obj.GetType().Name + "." + methodName;&lt;br /&gt;        Type tp;&lt;/span&gt;&lt;span style="font-family:Courier New;"&gt;&lt;br /&gt;        if (methodLookup.Contains(key))&lt;br /&gt;            tp = (Type)methodLookup[key];&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;            Type[] paramList = new Type[obj.GetType().GetMethod(methodName).GetParameters().Length];&lt;br /&gt;            int n = 0;&lt;br /&gt;            foreach (ParameterInfo pi in obj.GetType().GetMethod(methodName).GetParameters()) paramList[n++] = pi.ParameterType;&lt;br /&gt;            TypeBuilder typeB = builder.DefineType("Del_" +  obj.GetType().Name + "_" + methodName, TypeAttributes.Class | TypeAttributes.AutoLayout | TypeAttributes.Public |  TypeAttributes.Sealed, typeof(MulticastDelegate), PackingSize.Unspecified);&lt;br /&gt;            ConstructorBuilder conB = typeB.DefineConstructor(MethodAttributes.HideBySig | MethodAttributes.SpecialName |            MethodAttributes.RTSpecialName, CallingConventions.Standard, new Type[] { typeof(object), typeof(IntPtr) });&lt;br /&gt;            conB.SetImplementationFlags(MethodImplAttributes.Runtime);&lt;br /&gt;            MethodBuilder mb = typeB.DefineMethod( "Invoke", MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.HideBySig, obj.GetType().GetMethod(methodName).ReturnType, paramList );&lt;br /&gt;            mb.SetImplementationFlags( MethodImplAttributes.Runtime );&lt;br /&gt;            tp = typeB.CreateType();&lt;br /&gt;            methodLookup.Add(key, tp);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        del = MulticastDelegate.CreateDelegate(tp, obj, methodName);&lt;br /&gt;        return obj.Invoke(del, paramValues);&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-114917575337673294?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/114917575337673294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=114917575337673294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114917575337673294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114917575337673294'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/06/simple-controlinvoke.html' title='Simple Control.Invoke'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-114840269450701766</id><published>2006-05-23T18:42:00.000+02:00</published><updated>2006-11-07T16:18:36.876+01:00</updated><title type='text'>FM Inventory Quantities</title><content type='html'>- "in box" is the number of physical boxes which actually exists&lt;br /&gt;- "on hand" is "in box" minus any order lenses which have not yet been shipped. AKA would be "available for ordering".&lt;br /&gt;- Newly added QtyCorrected is corrective qty used to adjust stock levels after checking inventory.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;QUANTITY IN BOX: conversiontolenses + Total Bought - TOTAL QUANTITY SOLD TRANSFERED + QtyCorrected&lt;br /&gt;Conversion to lenses: number&lt;br /&gt;Total Bought: Initial Inventory Level + IQuantity Bought&lt;br /&gt;Initial Inventory Level: number&lt;br /&gt;IQuantity Bought: number&lt;br /&gt;TOTAL QUANTITY SOLD TRANSFERED: QUANTITY TRABNSFERED SOLD + QUANTITY WHOLESALE TRABNSFERED SOLD &lt;br /&gt;QUANTITY TRABNSFERED SOLD: number&lt;br /&gt;QUANTITY WHOLESALE TRABNSFERED SOLD : number&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-114840269450701766?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/114840269450701766/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=114840269450701766' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114840269450701766'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114840269450701766'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/05/fm-inventory-quantities.html' title='FM Inventory Quantities'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-114779935025862613</id><published>2006-05-16T19:06:00.000+02:00</published><updated>2006-11-07T16:18:36.796+01:00</updated><title type='text'>Regediting ActiveSync Folder</title><content type='html'>In order to allow multiple pocket PCs to syncronize to the same folder, open RegEdit and go to HKEY_CURRENT_USER\Software\Microsoft\Windows CE Services\Partners\. There, each partnership defines it's shared folder in HKEY_CURRENT_USER\Software\Microsoft\Windows CE Services\Partners\[somenumber]\Services\Synchronization\Briefcase Path. Make sure all the Briefcase paths are set to the same folder. EXACT NAME IS IMPORTANT, so copy and paste the value from the partnership that you are interested in.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-114779935025862613?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/114779935025862613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=114779935025862613' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114779935025862613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114779935025862613'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/05/regediting-activesync-folder.html' title='Regediting ActiveSync Folder'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-114712003929855242</id><published>2006-05-08T22:19:00.000+02:00</published><updated>2006-11-07T16:18:36.686+01:00</updated><title type='text'>GMail PHPed</title><content type='html'>When FMImporter is done importing the CSV files into FileMaker, it sends an email to a gmail account with the mail title the name of the CSV file as the title and the contents as the body. Today, it happened that I needed to reprocess 115 of these files, and wanted an easy way to turn the emails into files.&lt;br /&gt;&lt;br /&gt;Easy just didn't happen. I tried the FireFox GSpace Add On, and the shell extension GMail Drive, but they ONLY treat their own files (although both are cool tools to use a gmail account as a file store). They do this by using a special email title, and by storing the files as attachments.&lt;br /&gt;&lt;br /&gt;Also tried PhpGmailDrive 0.3.2, but this only displays files which are attachments.&lt;br /&gt;&lt;br /&gt;Finally, I hacked PhpGmailDrive's usage of libgmailer (after upgrading libgmailer to version 0.9 Beta 2), which is a PHP wrapper for the gmail API. The documentation is not the best, and I was never able to get more than the first 50 messages, but by applying a "label" to the gmail messages of interest, 50 emails at a time, I was able to get the following hacked code to download the emails as files...&lt;br /&gt;&lt;br /&gt; if ($gm[$a]-&gt;connect()) {                                    //&lt;br /&gt;  $gm[$a]-&gt;fetchBox(GM_LABEL, "fix", 0);      // name of constants can be found in libgmailer.php&lt;br /&gt;  $snapshot = $gm[$a]-&gt;getSnapshot(GM_LABEL);&lt;br /&gt;  $lastidx = count($snapshot-&gt;box)-1;                  //&lt;br /&gt;  &lt;br /&gt;  //$gf-&gt;TreeData .= "// ".count($snapshot-&gt;box).".\n";&lt;br /&gt;  //$gf-&gt;TreeData .= "// ".$snapshot-&gt;box_total.".\n";&lt;br /&gt;&lt;br /&gt;  //for ($c=0;$c&lt;=$snapshot-&gt;box_total;$c+1)&lt;br /&gt;  //{&lt;br /&gt;  //$gm[$a]-&gt;fetchBox(GM_STANDARD, "inbox", $c);      // name of constants can be found in libgmailer.php&lt;br /&gt;  //$snapshot = $gm[$a]-&gt;getSnapshot(GM_STANDARD);&lt;br /&gt;  //$lastidx = count($snapshot-&gt;box)-1;&lt;br /&gt;  foreach ((array)$snapshot-&gt;box as $item) {      //&lt;br /&gt;   $gm[$a]-&gt;fetchBox(GM_CONVERSATION, $item["id"], 0);  // name of constants can be found in libgmailer.php&lt;br /&gt;   $snapshot1 = $gm[$a]-&gt;getSnapshot(GM_CONVERSATION);&lt;br /&gt;      foreach ((array)$snapshot1-&gt;conv as $item1) {&lt;br /&gt;          $fh = fopen("C:\\down\\".$item1["subj"], "w");&lt;br /&gt;          $body = $item1["body"];&lt;br /&gt;          $body = str_replace("&amp;quot;", "\"", $body);&lt;br /&gt;          $body = str_replace("&lt;div style=\"direction:ltr\" &gt;", "", $body);&lt;br /&gt;          $body = str_replace("&lt;br /&gt;", "\r\n", $body);&lt;br /&gt;          $body = str_replace("&lt;/div&gt;", "", $body);&lt;br /&gt;          fwrite($fh, $body);&lt;br /&gt;          fclose($fh);&lt;br /&gt;          continue;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-114712003929855242?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/114712003929855242/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=114712003929855242' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114712003929855242'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114712003929855242'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/05/gmail-phped.html' title='GMail PHPed'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-114494309244007805</id><published>2006-04-13T17:41:00.000+02:00</published><updated>2006-11-07T16:18:36.620+01:00</updated><title type='text'>Selenium IDE</title><content type='html'>When tracking down my "system" php call bug, I needed to register a user again and again and again. After the first dozen times or so, I looked for macros for FireFox, and found &lt;a href="http://www.openqa.org/selenium-ide/"&gt;Selenium IDE&lt;/a&gt;, which did the trick for me. The only "trick" you need to know is that the record button is the little red one to the RIGHT of the toolbar. Otherwise, it's all pretty intuitive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-114494309244007805?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.openqa.org/selenium-ide/' title='Selenium IDE'/><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/114494309244007805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=114494309244007805' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114494309244007805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114494309244007805'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/04/selenium-ide.html' title='Selenium IDE'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-114494228314263408</id><published>2006-04-13T17:25:00.000+02:00</published><updated>2006-11-07T16:18:36.565+01:00</updated><title type='text'>php system call problems</title><content type='html'>Using something like...&lt;br /&gt;system ("C:\\cool.exe C:\\coolfile.cfl", $returnVal);&lt;br /&gt;simply does not work, and simply gives a returnVal of 1. Nothing in the php error log even with all errors turned on, nothing in the system log, and a "file not found" error returned by using some suggestions from the system documnentation page (something like echo system("(".$SysCmd." &gt; /dev/null) 3&gt;&amp;1 1&gt;&amp;2 2&gt;&amp;3", $Ret);). I tried a million combinations, and they worked on the cmd line, but failed with system.&lt;br /&gt;&lt;br /&gt;Solution?&lt;br /&gt;system ("C:/cool.exe C:/coolfile.cfl", $returnVal);&lt;br /&gt;&lt;br /&gt;My new rule is to always use forward slashes with system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-114494228314263408?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/114494228314263408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=114494228314263408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114494228314263408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114494228314263408'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/04/php-system-call-problems.html' title='php system call problems'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-114362326213119772</id><published>2006-03-29T11:07:00.000+02:00</published><updated>2006-11-07T16:18:36.507+01:00</updated><title type='text'>WebGains</title><content type='html'>For WebGains, be sure to keep a min. of £100 balance in the account. This is required by their contract, which states "5.4 The Merchant shall ensure that there are always sufficient cleared funds in the Merchant Account to meet all of the liabilities of the Merchant. In the event that the funds in the Merchant Account fall below £100, WBG reserves the right to suspend the Services unless and until sufficient funds are provided.". Got this from Derek Grant [derek.grant@webgains.com] on Mon 16/01/2006 16:47 as enclosure.&lt;br /&gt;&lt;br /&gt;You can print the invoices from their web site. Log in, and look for the "account statement" link on the lower left.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-114362326213119772?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/114362326213119772/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=114362326213119772' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114362326213119772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/114362326213119772'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/03/webgains.html' title='WebGains'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-113930922607527823</id><published>2006-02-07T11:41:00.000+01:00</published><updated>2006-11-07T16:18:36.448+01:00</updated><title type='text'>PHP - auto-create variables from query</title><content type='html'>I'm often doing something really dumb like..&lt;br /&gt;&lt;br /&gt;select someField, someOtherField from somewhere&lt;br /&gt;while ($rec = fetch)    {&lt;br /&gt;&amp;nbsp;&amp;nbsp;$someField = $rec["someField"];&lt;br /&gt;&amp;nbsp;&amp;nbsp;$someOtherField = $rec["someOtherField"];&lt;br /&gt;&amp;nbsp;&amp;nbsp;do something...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;To save the steps of pulling the variables out into variables, I use the following...&lt;br /&gt;&lt;br /&gt;$rociResult = $dbA-&gt;query ("select someField from $table where xxx");&lt;br /&gt;if (TRUE == $rociResult) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;while ($rociRec = $dbA-&gt;fetch ($rociResult)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extract($rociRec, EXTR_PREFIX_ALL, "v");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo $v_someField;&lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-113930922607527823?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/113930922607527823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=113930922607527823' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113930922607527823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113930922607527823'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/02/php-auto-create-variables-from-query.html' title='PHP - auto-create variables from query'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-113835197270430030</id><published>2006-01-27T09:48:00.000+01:00</published><updated>2006-11-07T16:18:36.390+01:00</updated><title type='text'>EasyPHP for Macintosh</title><content type='html'>If you want to set up a xAMP enviornment quickly, you use &lt;a href="http://www.easyphp.org/"&gt;EasyPHP &lt;/a&gt;or one of the similar packages for Windows. But how about for Macintosh? Even though there are already parts of an xAMP setup there, it's MUCH quicker and easier to just set up &lt;a href="http://www.mamp.info/"&gt;MAMP&lt;/a&gt;, which will not interfer with any other xAMP components that you already have installed on your machine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-113835197270430030?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/113835197270430030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=113835197270430030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113835197270430030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113835197270430030'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/01/easyphp-for-macintosh.html' title='EasyPHP for Macintosh'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-113657538329880104</id><published>2006-01-06T20:21:00.001+01:00</published><updated>2006-11-07T16:18:36.331+01:00</updated><title type='text'>Win2K DVD Decoder</title><content type='html'>A bit off topic - to get free DVD playback on Win2K, try &lt;a href="http://sourceforge.net/projects/deinterlace"&gt;DScaler 5&lt;/a&gt; - check the "DScaler 5 - Alpha MPEG Filters" link.&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=7420&amp;amp;package_id=123423"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-113657538329880104?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/113657538329880104/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=113657538329880104' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113657538329880104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113657538329880104'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2006/01/win2k-dvd-decoder_06.html' title='Win2K DVD Decoder'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-113517632256838987</id><published>2005-12-21T15:45:00.000+01:00</published><updated>2006-11-07T16:18:36.197+01:00</updated><title type='text'>Compiles that go to the client</title><content type='html'>Whenever a version goes to a client, we NEED to&lt;br /&gt;&lt;br /&gt;1) do a checkin&lt;br /&gt;2) Build a release version to send to the client&lt;br /&gt;2) tag the state of the program (and any satellite programs) with the version number of the release version sent to the client (and program name, if a satellite version).&lt;br /&gt;&lt;br /&gt; Example: you change SupplierChecker for SNR. When everything is working, you check in the code, build a release version (noting the version number), and send it to SNR. Immediately afterwards, you tag SupplierChecker and AmexCommon (which is also used by SupplierChecker) with the tag "SupplierChecker 1.0.xxxx.yyyy (where xxxx and yyyy are the other parts of the version number of the release version sent to SNR).&lt;br /&gt;&lt;br /&gt;-------------------------&lt;br /&gt;&lt;br /&gt; Why do we do this? When e.g. SNR calls and says he has a bug, we can check the EXACT code that he was using. Also, if you've started new changes, you can always go back to a version WITHOUT the new changes to quickly correct a bug.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-113517632256838987?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/113517632256838987/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=113517632256838987' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113517632256838987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113517632256838987'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/12/compiles-that-go-to-client.html' title='Compiles that go to the client'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-113379502894511095</id><published>2005-12-05T16:00:00.000+01:00</published><updated>2006-11-07T16:18:36.141+01:00</updated><title type='text'>Install 24U Simple Dialog Freeware Plugin</title><content type='html'>The freeware installer can be found on \\server2003\Permanent\Software Depot\Plug-ins. Drop the AutoInstaller folder and the 24uPlugInInstall.fp5 DB into C:\Program Files\FileMaker\FileMaker Developer 6\ folder, and run the auto installer. Unclick all but the "W" (Windows) version of the 24U SimpleDialog plug in, and hit the Update All button. That's it.&lt;br /&gt;&lt;br /&gt;20060806 ED: New Instructions at \\server2003\Permanent\Software Depot\Plug-ins\24U Simple Dialog FM Plugin\readme.txt:&lt;br /&gt;I BELIEVE that the only thing you need to do is copy the file 24uSimpleDialog.fmx to your \Program Files\FileMaker\FileMaker Developer 6\System folder. Either that, or run the install process in the "\\server2003\Permanent\Software Depot\Plug-ins\24U Simple Dialog FM Plugin\Old Contents and Instructions (not working)" folder and THEN copy in the fmx file.&lt;br /&gt;&lt;br /&gt;I NEVER get this working on the first try. Please update these instructions if my first suggestion DOES work. Thanks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-113379502894511095?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/113379502894511095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=113379502894511095' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113379502894511095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113379502894511095'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/12/install-24u-simple-dialog-freeware.html' title='Install 24U Simple Dialog Freeware Plugin'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-113337577834492178</id><published>2005-11-30T19:35:00.000+01:00</published><updated>2006-11-07T16:18:36.083+01:00</updated><title type='text'>Move Putty's stored data to a new Windows computer</title><content type='html'>To move putty's setting from one machine to another, use regedit to export a reg file of HKEY_CURRENT_USER\Software\SimonTatham\PuTTY, and install it on a new machine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-113337577834492178?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/113337577834492178/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=113337577834492178' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113337577834492178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113337577834492178'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/11/move-puttys-stored-data-to-new-windows.html' title='Move Putty&apos;s stored data to a new Windows computer'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-113336985005985421</id><published>2005-11-30T17:57:00.000+01:00</published><updated>2006-11-07T16:18:36.023+01:00</updated><title type='text'>FileMaker via ODBC Performance Problems</title><content type='html'>When Cristóbal was updating fields in Batch Line Items.fp5 (a FileMaker DB) via ODBC, each field update was taking about 30 seconds. A small part of the problem was the calculated fields, and if you ever need to maximize performance, you might want to look to see if it’s possible to remove them.&lt;br/&gt;However, the big performance culprits were 2x summary fields, which accounted for about 93% of the slowdown. He was able to remove one field, since SNR indicated that it was totally unused. The other he converted to a global field, and introduced a “recalculate” button on the layout where the field was used – the button called a script to recalculate the field in accordance with the old summary field definition.&lt;br/&gt;With around a half a dozen calculated fields, the updates took about 2 seconds, which is too slow, but fast enough for our needs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-113336985005985421?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/113336985005985421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=113336985005985421' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113336985005985421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113336985005985421'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/11/filemaker-via-odbc-performance.html' title='FileMaker via ODBC Performance Problems'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-113336113556687891</id><published>2005-11-30T15:32:00.000+01:00</published><updated>2006-11-07T16:18:35.963+01:00</updated><title type='text'>Direct Link to Blogger Article</title><content type='html'>If you need to link to a particular article in Blogger, surf to the blog in FireFox, right click, select “Web Developer” (this assumes you have it installed), “Information”, and “View Link Info”. There, you will be able to see all the direct links on the page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-113336113556687891?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/113336113556687891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=113336113556687891' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113336113556687891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113336113556687891'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/11/direct-link-to-blogger-article.html' title='Direct Link to Blogger Article'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-113291876757938200</id><published>2005-11-25T12:35:00.000+01:00</published><updated>2006-11-07T16:18:35.904+01:00</updated><title type='text'>ActiveSync - "Combine or Replace" Dialog</title><content type='html'>Just had a case (after a power outage) where we got a strange dialog from the Desktop PC running active sync:&lt;br /&gt;&lt;br /&gt;The following information type on your mobile device has items that have not been syncronized with this computer before. "combine or replace" information type: files&lt;br /&gt;&lt;br /&gt;Combine the items on my device with the items on this computer.&lt;br /&gt;Replace the items on my device with the items on this computer.&lt;br /&gt;Do not syncronize this information type at this time&lt;br /&gt;&lt;br /&gt;Not really sure what happened, but it appears as if the file that coordinates the sync got messed up. Best article I read on it was at http://www.pocketpcfaq.com/raj/Combine-Replace.html, reproduced here in case the link eventually disappears:&lt;br /&gt;&lt;br /&gt;ActiveSync - "Combine or Replace" Dialog&lt;br /&gt;By Raj Pillai, Copyright 2003-2004&lt;br /&gt; Version 1.24  Revised 5/11/2004&lt;br /&gt;&lt;br /&gt;Click to Visit Pocket PC Talk&lt;br /&gt;&lt;br /&gt;Introduction:&lt;br /&gt;&lt;br /&gt;Every Pocket PC user encounters the Combine or Replace dialog box as shown below at some point of time although the Information Type might differ. The information below tries to explain why this dialog box is prompted and the scenario's when this dialog box can appear.&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Why Does This Dialog Appear?&lt;br /&gt;&lt;br /&gt;When you connect your Pocket PC for synchronization purpose ActiveSync compares the data on the Desktop and the device using something called as "store identifiers" along with time-stamps to determine if the information type has changed.  If the identifiers do not match, then it tries to re-establish the mapping between the Desktop and the Pocket PC by displaying the above dialog box.&lt;br /&gt;&lt;br /&gt;What Do The Options Indicate?&lt;br /&gt;&lt;br /&gt;The "Information Type:" will list the type of information that ActiveSync has not mapped.  The three options are self explanatory. &lt;br /&gt;&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;      The 1st option will simply combine all the information (Pocket PC + Computer) on both the devices.&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;      The 2nd option will copy all the information from the Computer to the Pocket PC.  It will replace all the information stored on the Pocket PC.&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;      The 3rd option does not synchronize the listed information types. &lt;br /&gt;&lt;br /&gt;There is no option which will replace the data on your computer with the Pocket PC data.  The closest way of doing it would be to use the 1st option and combine the data.&lt;br /&gt;&lt;br /&gt;Why Did The Dialog Appear?&lt;br /&gt;&lt;br /&gt;Lets take a look at the scenarios where this dialog box will appear:&lt;br /&gt;&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;      When you synchronize your Pocket PC with data for the first time.&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;      When you delete a partnership on the Desktop without deleting the information on the device, and then reconnects the device to create a new partnership.&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;      When you try to synchronize with a different Outlook profile for the first time.&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;      When you move the location of the default Outlook ".pst" file after establishing a partnership.&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;      When you synchronize with two computers and perform a replace operation on one computer, and then synchronizes the device with a second computer.&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;      When you synchronize after restoring the Pocket PC data from a backup file.&lt;br /&gt;    *&lt;br /&gt;&lt;br /&gt;      When you delete the repl.dat file, which stores the partnership information.  This file can be found in the ActiveSync Profiles directory.  The default path in Windows XP would be:&lt;br /&gt;&lt;br /&gt;      C:\Documents and Settings\&lt;&lt;User Name&gt;&gt;&gt;\Application Data\Microsoft\ActiveSync\Profiles\&lt;&lt;&lt;Partnership Name&gt;&gt;&gt; &lt;br /&gt;&lt;br /&gt;The Combine or Replace Dialog Appears Every Time I Synchronize:&lt;br /&gt;&lt;br /&gt;If you are synchronizing with only "one computer" and this dialog appears everytime you synchronize, then you might need to recreate the partnership. Due to some kind of corruption the store identifiers might getting affected at every synchronization and therefore are not able to map themselves correctly.&lt;br /&gt;&lt;br /&gt;To delete a partnership:&lt;br /&gt;&lt;br /&gt;1.  Disconnect the Pocket PC from the computer.&lt;br /&gt;2.  In ActiveSync -&gt; File -&gt; Delete Partnership.  Select whether you want to delete your synchronization folder as well.&lt;br /&gt;3.  Connect the device and follow the onscreen instructions to setup a new partnership.&lt;br /&gt;&lt;br /&gt;If you are synchronizing with "two computers" and the dialog appears on a regular basis, then it appears that for some reason, the store identifiers for the selected information types is getting affected when you synchronize with the second desktop PC and therefore the first computer is unable to match the identifiers when it compares and pops up the Combine or Replace dialog.&lt;br /&gt;&lt;br /&gt;Although the Combine option creates duplicates, as far as I know ActiveSync version 3.7.1 checks for duplicate entries as well and prompts you whether you would like to remove or keep them.  But in some scenarios it is unable to identify the duplicates since the identifiers are different.  If you have a lot of duplicate entries, then I recommend you use the free Outlook Duplicate Remover utility, written by Fr. Simon Rundell.  It is available for download at the following site:&lt;br /&gt;&lt;br /&gt;http://www.slipstick.com/addins/contacts.htm#dupes&lt;br /&gt;&lt;br /&gt;You could verify if the problem is caused due to synchronization with a secondary PC by first synchronizing with either of your computer and then before synchronizing with the second computer, create a new Contact/ Appointment on your device and another set on your Desktop (all having different name or else a conflict will occur) and see if you are displayed the dialog.  In this scenario the information will get updated automatically on both the devices without the C/R dialog since the store identifiers have not been affected.&lt;br /&gt;&lt;br /&gt;In such a scenario, delete both the partnerships on the computer and form a new partnership.  You could try the following approach:&lt;br /&gt;&lt;br /&gt;Before you leave work, synchronize your Pocket PC and after synchronization is successful delete the partnership.  Go to your home PC.  Delete the partnership on the home PC as well before connecting.  Now connect and then create a new partnership and you might be prompted with the Combine or Replace dialog once select combine since you want the data on your Pocket PC to reflect on your home computer as well.  Once this is done, repeat the steps to create a new partnership on your work PC.&lt;br /&gt;&lt;br /&gt;This information should help you understand the possible causes and how you could go about solving the recurring Combine or Replace dialog that appears whenever you try to synchronize with your computer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-113291876757938200?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.pocketpcfaq.com/raj/Combine-Replace.html' title='ActiveSync - &quot;Combine or Replace&quot; Dialog'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113291876757938200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113291876757938200'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/11/activesync-combine-or-replace-dialog.html' title='ActiveSync - &quot;Combine or Replace&quot; Dialog'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-113161971221231148</id><published>2005-11-10T11:47:00.001+01:00</published><updated>2010-05-14T19:07:06.211+02:00</updated><title type='text'>Getting CVS Commit emails from ModWest</title><content type='html'>- Download CVS spam from http://www.badgers-in-foil.co.uk/projects/cvsspam/&lt;br /&gt;- Upload the file to your CVS folder&lt;br /&gt;- With the shell, decompress the tarball with tar -zxvf cvsspam???.tar.gz&lt;br /&gt;- Rename the resulting folder "cvsspam"&lt;br /&gt;- cd /cvs/CVSROOT&lt;br /&gt;- chmod 777 commitinfo&lt;br /&gt;- vi commitinfo, and add the line&lt;br /&gt;ALL /usr/bin/ruby /cvs/cvsspam/record_lastdir.rb&lt;br /&gt;- save the change&lt;br /&gt;- chmod 444 commitinfo&lt;br /&gt;- chmod 777 loginfo&lt;br /&gt;- vi loginfo, and add the line&lt;br /&gt;ALL /usr/bin/ruby /cvs/cvsspam/collect_diffs.rb --to me@mydomain.com %{sVv}&lt;br /&gt;- save the loginfo&lt;br /&gt;- chmod 444 loginfo&lt;br /&gt;- make the directory /cvs/cvsspam/&lt;br /&gt;- mv /cvs/cvsspam/cvsspam.conf /cvs/cvsspam&lt;br /&gt;- ModWest's sendmail does not accept the -io option (see http://www.modwest.com/help/kb10-124.html) used by cvsspam. Remove the option from /cvs/cvsspam/cvsspam.rb&lt;br /&gt;- To add more people to the send list, check the /cvs/cvsspam/cvsspam.conf file&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-113161971221231148?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/113161971221231148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=113161971221231148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113161971221231148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113161971221231148'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/11/getting-cvs-commit-emails-from-modwest.html' title='Getting CVS Commit emails from ModWest'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-113135415485943249</id><published>2005-11-07T09:58:00.000+01:00</published><updated>2006-11-07T16:18:35.786+01:00</updated><title type='text'>phpMyAdmin Direct Link</title><content type='html'>While searching for something faster than phpMyAdmin for my daily MySQL work, I found a documented trick for going directly to a specific db /table.&lt;br /&gt;&lt;br /&gt;If your usual phpMyAdmin URL is e.g. http://127.0.0.1/mysql/, and you want to go directly to table "hours", you would type http://127.0.0.1/mysql/index.php?db=hours. If you want to go to the table "bob" in "hours", then http://127.0.0.1/mysql/index.php?db=hours&amp;table=bob.&lt;br /&gt;&lt;br /&gt;Now, anyone have any suggestions for free, fast alternatives to phpMyAdmin for working with local DBs in Windows?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-113135415485943249?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113135415485943249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/113135415485943249'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/11/phpmyadmin-direct-link.html' title='phpMyAdmin Direct Link'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-112982457573607156</id><published>2005-10-20T17:42:00.000+02:00</published><updated>2006-11-07T16:18:35.730+01:00</updated><title type='text'>Blocking JShop while making changes</title><content type='html'>When you want to work on a web site, you can DISABLE JShop for the outside world but ENABLE it for yourself and your tests by doing this:&lt;br /&gt;- Create an .htaccess file on the top level of the JShop folder with the below lines (if an .htaccess file already exists, simply add these lines at the beginning).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;ErrorDocument 403 http://www.aDifferentSite.com/workingOnJShop.html&lt;br /&gt;deny from all&lt;br /&gt;allow from {yourIPnumber}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Make sure http://www.aDifferentSite.com/workingOnJShop.html points to an HTML file on a DIFFERENT web site (since you're denying from the installed JShop site) which shows some "we're working on the site" text.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-112982457573607156?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/112982457573607156/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=112982457573607156' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112982457573607156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112982457573607156'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/10/blocking-jshop-while-making-changes.html' title='Blocking JShop while making changes'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-112870201967665681</id><published>2005-10-07T18:18:00.000+02:00</published><updated>2006-12-27T15:39:42.711+01:00</updated><title type='text'>BU JShop via Script</title><content type='html'>Drop the following code in a PHP file, upload it to the top level of a JShop running on Linux, and execute it via the browser. It will create a tarball including the JShop files and MySQL data for downloading:&lt;br /&gt;&lt;br /&gt;&lt;?PHP&lt;br /&gt;//Code to BU a JShop in place - all shop files and MySQL data&lt;br /&gt;//----------------------------------------------------------------------&lt;br /&gt;//INSTRUCTIONS&lt;br /&gt;//----------------------------------------------------------------------&lt;br /&gt;//Drop this file into the top level of a JShop installation on Linux and call&lt;br /&gt;//it via the web&lt;br /&gt;//This file itself will be deleted at the end as a security measure&lt;br /&gt;//The names of the backup file to download will be output to your browser&lt;br /&gt;//----------------------------------------------------------------------&lt;br /&gt;echo "&lt;h1&gt;Script to BU a JShop in place&lt;/h1&gt;";&lt;br /&gt;&lt;br /&gt;//Let the script run as long as necessary&lt;br /&gt;set_time_limit(0);&lt;br /&gt;&lt;br /&gt;//Get the info about the DB, file system, etc.&lt;br /&gt;include ("static/config.php");&lt;br /&gt;global $jssShopFileSystem, $jssStoreWebDirHTTP, $databaseUsername,&lt;br /&gt;        $databasePassword, $databaseName, $databaseHost;&lt;br /&gt;&lt;br /&gt;//Some variables&lt;br /&gt;$date = date ("Ymd");&lt;br /&gt;$name = str_replace("\\", "", str_replace("/", "", str_replace("http://",&lt;br /&gt;            "", $jssStoreWebDirHTTP)));&lt;br /&gt;$siteTarball = "{$jssShopFileSystem}{$date}{$name}.tar.gz";&lt;br /&gt;$sqlDumpName = "{$jssShopFileSystem}{$date}{$name}.sql";&lt;br /&gt;$thisScriptFile = $jssShopFileSystem.substr($_SERVER['PHP_SELF'], 1);&lt;br /&gt;&lt;br /&gt;//Do a MySQL dump&lt;br /&gt;// "Q" option quotes the column names - very important in case you have a column name that&lt;br /&gt;//        is also a keyword&lt;br /&gt;// "n" Do NOT add a "create DB" command - since a lot of our clients have the same name&lt;br /&gt;//        for the JSS DB, we don't want to import this on our local setup and overwrite existing&lt;br /&gt;//        data&lt;br /&gt;// "no-create-info" do not create the tables. This is done with the first mysqldump. We do&lt;br /&gt;//        the creation separate from the dumping so that the tables that we don't want the data&lt;br /&gt;//        for (big, unneeded tables for local development) still have their tables created.&lt;br /&gt;// "--add-locks"  Surround each table dump with LOCK TABLES and UNLOCK TABLES  statements.&lt;br /&gt;//        This results in faster inserts when the dump file is reloaded.&lt;br /&gt;&lt;br /&gt;// "--create-options" - Include all MySQL-specific table options in the CREATE TABLE statements.&lt;br /&gt;// Cristóbal - In some sites not works!!!&lt;br /&gt;&lt;br /&gt;// "K" -  For each table, surround the INSERT  statements with&lt;br /&gt;//        /*!40000 ALTER TABLE tbl_name DISABLE KEYS */; and&lt;br /&gt;//        /*!40000 ALTER TABLE tbl_name ENABLE KEYS */; statements.&lt;br /&gt;//        This makes loading the dump file faster because the indexes are created after all rows&lt;br /&gt;//        are inserted. This option is effective for MyISAM tables only.&lt;br /&gt;// "e" Extended Insert:  Use multiple-row INSERT syntax that include several VALUES lists. This&lt;br /&gt;//        results in a smaller dump file and speeds up inserts when the file is reloaded.&lt;br /&gt;// "l"  Lock all tables before starting the dump. The tables are locked with READ LOCAL to allow&lt;br /&gt;//        concurrent inserts in the case of MyISAM tables. For transactional tables such as InnoDB and&lt;br /&gt;//        BDB, --single-transaction is a much better option, because it does not need to lock the tables&lt;br /&gt;//        at all.&lt;br /&gt;// "q" Quick:  This option is useful for dumping large tables. It forces mysqldump to retrieve&lt;br /&gt;//        rows for a table from the server a row at a time rather than retrieving the entire row set&lt;br /&gt;//        and buffering it in memory before writing it out.&lt;br /&gt;&lt;br /&gt;//  "--set-charset" Add SET NAMES default_character_set  to the output. This option is enabled by&lt;br /&gt;//        default. To suppress the SET NAMES statement, use --skip-set-charset.&lt;br /&gt;// Cristóbal - In some sites not works!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// "u" is user name, -p is password (no space between the command and the password - see docs), and&lt;br /&gt;// "h" is host.&lt;br /&gt;&lt;br /&gt;//runCmd ("mysqldump -Q -n --add-locks --create-options -K -e -l -q --set-charset -u $databaseUsername -p$databasePassword -h "."$databaseHost $databaseName &gt; $sqlDumpName");&lt;br /&gt;runCmd ("mysqldump -d -Q -n --add-locks -K -e -l -q -u $databaseUsername -p$databasePassword -h "."$databaseHost $databaseName &gt; $sqlDumpName");&lt;br /&gt;runCmd ("mysqldump -Q -n --no-create-info --add-locks -K -e -l -q -u $databaseUsername -p$databasePassword -h "."$databaseHost $databaseName --ignore-table=$databaseName.jss_logs --ignore-table=$databaseName.jss_carts --ignore-table=$databaseName.jss_carts_contents --ignore-table=$databaseName.jss_logs --ignore-table=$databaseName.amex_clickthroughs &gt;&gt; $sqlDumpName");&lt;br /&gt;//runCmd ("mysqldump -Q -n --add-locks -K -e -l -q -u $databaseUsername -p$databasePassword -h "."$databaseHost $databaseName &gt; $sqlDumpName");&lt;br /&gt;//Make a tarball of the site files, including the sql dump, excluding the tarball itself&lt;br /&gt;runCmd ("tar czvpf $siteTarball $sqlDumpName");&lt;br /&gt;//Remove the MySQL dump&lt;br /&gt;runCmd ("rm $sqlDumpName");&lt;br /&gt;//Remove this script for security reasons&lt;br /&gt;runCmd ("rm $thisScriptFile");&lt;br /&gt;&lt;br /&gt;echo "&lt;br /&gt;\r\n";&lt;br /&gt;echo "&lt;h2&gt;You can now download '$siteTarball', which includes the MySQL dump:&lt;/h2&gt;&lt;br /&gt;";&lt;br /&gt;echo "&lt;h2&gt;&lt;span style="color:'#FF0000';"&gt;To save space, be sure to delete the file ".&lt;br /&gt;        "from the server after downloading them!!&lt;/span&gt;&lt;/h2&gt;";&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function runCmd ($cmd)    {&lt;br /&gt;    echo "------------&lt;br /&gt;\r\n";&lt;br /&gt;    echo "&lt;b&gt;About to exec:&lt;/b&gt; $cmd&lt;br /&gt;\r\n";&lt;br /&gt;    //info on how to get the output of a command comes from the comments on&lt;br /&gt;    //http://www.php.net/manual/en/function.exec.php&lt;br /&gt;    exec("$cmd 2&gt;&amp;1", $output);&lt;br /&gt;    echo "&lt;b&gt;Output is: &lt;/b&gt;";&lt;br /&gt;    //Use print_r in case there are multiple lines in the output. Can happen&lt;br /&gt;    //if you e.g. add the "v" (verbose) argument to tar&lt;br /&gt;    print_r($output);&lt;br /&gt;    echo "&lt;br /&gt;\r\n";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-112870201967665681?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112870201967665681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112870201967665681'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/10/bu-jshop-via-script.html' title='BU JShop via Script'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-112783484529166330</id><published>2005-09-27T17:26:00.000+02:00</published><updated>2006-11-07T16:18:35.611+01:00</updated><title type='text'>Using pub/priv key w/ Modwest</title><content type='html'>I was never able to get the instructions from http://www.modwest.com/help/kb20-90.html to work. Here is the method I used to get things going...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NOTE: If you move to a new machine, and your old keys do not work, then simply follow the instructions below. Name of the public key file does not matter, since the CONTENTS of the file are the things that have to be added to the auth_keys files. Just make sure you don't overwrite the orginal contents of auth_keys, so you do not disturb existing users.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- download all putty tools from http://the.earth.li/~sgtatham/putty/latest/x86/putty.zip&lt;br /&gt;- Unzip the contents into C:\bin (creating the folder if necessary)&lt;br /&gt;- Create a C:\home folder&lt;br /&gt;- Create a C:\home\.ssh folder. NOTE: You need to drop into the DOS command shell to create a folder starting with a period. (C:\&gt; md C:\home\.ssh)&lt;br /&gt;- Create a system enviornment variable HOME set to C:\home&lt;br /&gt;- add C:\bin to you PATH system enviornment variable&lt;br /&gt;- Launch C:\bin\PUTTYGEN.EXE&lt;br /&gt;- Create a SSH2 DSA key, 1023 bits&lt;br /&gt;- Do NOT add a passphrase&lt;br /&gt;- Save the private key to C:\home\.ssh, giving it the name of the user account on the server where you're connecting (e.g. C:\home\.ssh\ctello2.ppk)&lt;br /&gt;- Save the public key to C:\home\Public Keys\ctello2.pub&lt;br /&gt;- Open C:\home\Public Keys\ctello2.pub, and modify it as follows...&lt;br /&gt;* Remove the first two lines and the last line - leave only raw "goblygook" data&lt;br /&gt;* Remove all the line feeds&lt;br /&gt;* Add "ssh-dss " (Without quotes - NOTICE THE SPACE!!!) BEFORE the "goblygook" data&lt;br /&gt;* Add " dsa-key-20050627" (Without quotes - NOTICE THE SPACE!!! - adjust the date) AFTER the "goblygook" data&lt;br /&gt;- Now login to the remote system here and make sure in your home directory there is a subdirectory named: /.ssh (include the period '.' before the 'ssh'). You may need to create this directory. To see the file, you will need to type: ls -al&lt;br /&gt;The .ssh directory should be chmod 700, which looks like this in the first column of a detailed file listing: -rwx------&lt;br /&gt;If those are not the permissions on the .ssh dir, then set them by typing: chmod 700 .ssh&lt;br /&gt;- If there are "/.ssh/authorized_keys" and "/.ssh/authorized_keys2" files, then just copy the contents of your "C:\home\Public Keys\ctello2.pub" file to BOTH "/.ssh/authorized_keys" and "/.ssh/authorized_keys2".&lt;br /&gt;- If the files do not exist, copy your "authorized_keys" file 2x to the server, naming one "/.ssh/authorized_keys2" and the other "/.ssh/authorized_keys". Once the files are uploaded to the remote system, chmod 600 the two files (e.g. chmod 600 /.ssh/authorized_keys), which looks like this in the first column of a detailed file listing: -rw-------&lt;br /&gt;- Run Putty&lt;br /&gt;- Create a new connection with IP "shell.modwest.com", port 22, SSH&lt;br /&gt;- Run C:\bin\PAGEANT.EXE - it will show up as an icon in the system tray&lt;br /&gt;- Right click on the icon and select "add key"&lt;br /&gt;- Select your private key (e.g. C:\home\.ssh\ctello2.ppk)&lt;br /&gt;- Connect to the server - you should NOT be asked for the password&lt;br /&gt;- Try using CVS - you should NOT be asked for a password&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-112783484529166330?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112783484529166330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112783484529166330'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/09/using-pubpriv-key-w-modwest.html' title='Using pub/priv key w/ Modwest'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-112781146266912812</id><published>2005-09-27T10:56:00.000+02:00</published><updated>2006-11-07T16:18:35.551+01:00</updated><title type='text'>Checkout from CVS to web folder</title><content type='html'>- CVS kind of forces us to check out to /htdocs/{projectname}/index.php instead of /htdocs/www/index.php. There might be a way around this (I'm sure there is), but we did not find it.&lt;br /&gt;To work around that, we remove the symbolic link at Modwest that send everything to www, and put in a symbolic link pointing to {projectname}, so that www.oursite.com takes index.php from /htdocs/{projectname}/index.php. The commands we used to do this, using the {projectname} of e.g. myproj, were...&lt;br /&gt;rm -f _&lt;br /&gt;ln -s myproj _&lt;br /&gt;&lt;br /&gt;- the cvs checkout command needs the -d option to specify where the CVSROOT dir is&lt;br /&gt;&lt;br /&gt;- the cvs command needs to have the current directory set to the directory where checkout should occur.&lt;br /&gt;&lt;br /&gt;- We wanted to force the checkout by calling a URL, therefore our first attempt was to write a PHP script like this...&lt;br /&gt;&lt;?php&lt;br /&gt; passthru ("cd /htdocs");&lt;br /&gt; passthru ("cvs -d /cvs myproj");&lt;br /&gt;?&gt;&lt;br /&gt;...and put this in the /htdocs/myproj directory and call it via www.oursite.com/checkout.php. This failed, however, since the cvs command always used the php script directory instead of the directory specified in the cd command. Therefore, we wrote a shell script, checkoutCmd, and call the script.&lt;br /&gt;&lt;?php&lt;br /&gt; passthru ("./checkoutCmd");&lt;br /&gt;?&gt;&lt;br /&gt;&lt;br /&gt;- To make the checkoutCmd script, we did the following...&lt;br /&gt;cd /htdocs/myproj&lt;br /&gt;vi checkoutCmd &lt;br /&gt;...and the script you create with vi is...&lt;br /&gt;cd /htdocs&lt;br /&gt;cvs -d /cvs myproj&lt;br /&gt;...save the file, and do...&lt;br /&gt;chmod 755 checkoutCmd&lt;br /&gt;...and run it as follows...&lt;br /&gt;./checkoutCmd&lt;br /&gt;&lt;br /&gt;Checkout to the web serve folder can now be done via www.oursite.com/checkout.php&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-112781146266912812?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/112781146266912812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=112781146266912812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112781146266912812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112781146266912812'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/09/checkout-from-cvs-to-web-folder.html' title='Checkout from CVS to web folder'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-112634714847258610</id><published>2005-09-10T11:49:00.000+02:00</published><updated>2006-11-07T16:18:35.495+01:00</updated><title type='text'>New Machine Install</title><content type='html'>Some of this software can be found on \\SERVER2003\Permanent\Software Depot&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Araxis Merge (Software Depot - use serial number NOT reserved for Ed)&lt;/li&gt;&lt;li&gt;Allnetic time tracker&lt;/li&gt;&lt;li&gt;VS.NET 2003 (all options)&lt;/li&gt;&lt;li&gt;Visual Assist (\\server2003\Permanent\Software Depot\Utils\Visual Assist) - see the read me.&lt;/li&gt;&lt;li&gt;EasyPHP (http://www.easyphp.org/)- set up the files to be servered from a folder called "CVSData" in your "My Documents" folder.&lt;/li&gt;&lt;li&gt;TortoiseCVS (&lt;a href="http://www.tortoisecvs.org/"&gt;http://www.tortoisecvs.org/&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Office (the version that you DON'T have to register)&lt;/li&gt;&lt;li&gt;7Zip (http://www.7-zip.org/). Winzip is also fine, but 7zip needed for shared Linux stuff&lt;/li&gt;&lt;li&gt;FileMaker Developer (Ed has CD)&lt;/li&gt;&lt;li&gt;Seagull FTP (look in internet)&lt;/li&gt;&lt;li&gt;&lt;a href="http://winscp.net/eng/download.php"&gt;WinSCP&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Zend client &amp;amp; server (IMPORTANT!!! EasyPHP first. trial version to start)&lt;/li&gt;&lt;li&gt;Dreamweaver (trial version to start)     &lt;/li&gt;&lt;li&gt;Putty and associated tools. See &lt;a href="http://rocinantesoftware.blogspot.com/2005/09/using-pubpriv-key-w-modwest.html"&gt;http://rocinantesoftware.blogspot.com/2005/09/using-pubpriv-key-w-modwest.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Install “Send To Tools” from &lt;a href="http://www.gabrieleponti.com/"&gt;http://www.gabrieleponti.com/&lt;/a&gt;. If it’s not available there, there’s a version on \\server2003\Permanent\Software Depot\Utils&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.geekdojo.net/brian/articles/Cropper.aspx"&gt;Cropper&lt;/a&gt; (screen dump utility)&lt;/li&gt;&lt;li&gt;&lt;a href="http://ultravnc.sourceforge.net/"&gt;UltraVNC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;K-FTP (needed to build AmexImportExport) on Software Depot / utils / K-FTP&lt;/li&gt;&lt;li&gt;&lt;a href="http://dev.mysql.com/downloads/connector/net/"&gt;MySQL Connector/Net&lt;/a&gt; (formerly ByteFX - C# ADO.NET for MySQL)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create a "FileMaker" DNS for ODBC (from the control panel). See FileMaker help for details. Increase max size setting to 1024.&lt;/li&gt;&lt;li&gt;Set up an FTP server for IIS. Also, make sure that the IIS server, if running, is NOT on Port 80 (80 needed for EasyPHP).&lt;/li&gt;&lt;li&gt;"Install" the 24U Simple Dialog plug in by following the instructions at \\server2003\Permanent\Software Depot\Plug-ins\24U Simple Dialog FM Plugin\readme.txt&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-112634714847258610?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/112634714847258610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=112634714847258610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112634714847258610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112634714847258610'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/09/new-machine-install.html' title='New Machine Install'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-112478901920409422</id><published>2005-08-23T11:16:00.000+02:00</published><updated>2006-11-07T16:18:35.439+01:00</updated><title type='text'>PocketPC Sync Folder</title><content type='html'>After doing a hard reset on the PocketPC, it can be difficult to get ActiveSync to use the SAME sharing name that was used before when creating a new Partnership. Here are some things that can help:&lt;br /&gt;- Make sure you rename the old folder (e.g. {FOLDERNAME}BU) before the "create a new partnership" dialog comes up&lt;br /&gt;- Delete the old partnership (since the desktop will recognize it as a new machine)&lt;br /&gt;- To control the name of the folder, you have to control the name of the PocketPC. This can be set ON THE POCKET PC in settings / system / devide / about / DeviceID / Device Name&lt;br /&gt;- Check the values in RegEdit of My Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows CE Services\Partners&lt;br /&gt;- Check the profiles which are stored in the folder specified by My Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows CE Services\Partners\xxx\DataFolder&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-112478901920409422?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/112478901920409422/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=112478901920409422' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112478901920409422'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112478901920409422'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/08/pocketpc-sync-folder.html' title='PocketPC Sync Folder'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-112185479998674875</id><published>2005-07-20T12:18:00.000+02:00</published><updated>2006-11-07T16:18:35.383+01:00</updated><title type='text'>Inconsistent jss_combinations data</title><content type='html'>"Bug" report sent to JShop on this date:&lt;br /&gt;&lt;br /&gt;Client XXX uses attribute combinations to set the product code (i.e. code A1000 Black size 12 becomes A1000BLAC12). When they run out of a size, what they do is go into the admin area, go to "Extra Fields", "Size", and delete e.g. 12. However, the A1000BLAC12 stays in jss_combinations, and the e.g. extrafield1 now points to an extra field value which no longer exists.&lt;br /&gt;&lt;br /&gt;In a perfect world, you could protect the data integrity by disallowing the deletion of an extra field if there are combinations (or other places) that refer to that extra field. Of course, there is always the point of view that the user would never understand what you were telling them if you STOPPED the action ;-&lt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-112185479998674875?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/112185479998674875/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=112185479998674875' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112185479998674875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112185479998674875'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/07/inconsistent-jsscombinations-data.html' title='Inconsistent jss_combinations data'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-112066356909787169</id><published>2005-07-06T17:24:00.000+02:00</published><updated>2006-11-07T16:18:35.332+01:00</updated><title type='text'>Script Finding Empty Dates in FM</title><content type='html'>- go to a layout where the field is available&lt;br /&gt;- Insert Calculated Result [Select, "DateFieldName", "="]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-112066356909787169?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/112066356909787169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=112066356909787169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112066356909787169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112066356909787169'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/07/script-finding-empty-dates-in-fm.html' title='Script Finding Empty Dates in FM'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-112066343098411265</id><published>2005-07-06T17:23:00.000+02:00</published><updated>2006-11-07T16:18:35.271+01:00</updated><title type='text'>Symbol Stuff</title><content type='html'>- C# form size: 246x320&lt;br /&gt;- Turn control box off on the form, otherwise closing with the "x" in the upper right will not allow Symbol to release all components, forcing a soft reboot between debugging sessions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-112066343098411265?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/112066343098411265/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=112066343098411265' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112066343098411265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/112066343098411265'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/07/symbol-stuff.html' title='Symbol Stuff'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111445443134301332</id><published>2005-04-25T20:31:00.000+02:00</published><updated>2006-11-07T16:18:35.216+01:00</updated><title type='text'>Apache Crashing</title><content type='html'>I had a problem with Apache crashing on WinXP (using EasyPHP 1.7). It turns out that the "mail" function, if called without a message (i.e. passing an empty string as the message) crashes. I'm not sure if this is an apache problem, an IIS problem, or whatever - but it's a good thing to rememeber.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111445443134301332?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111445443134301332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111445443134301332' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111445443134301332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111445443134301332'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/04/apache-crashing.html' title='Apache Crashing'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111349114595906567</id><published>2005-04-14T16:59:00.000+02:00</published><updated>2006-11-07T16:18:35.155+01:00</updated><title type='text'>CVS On Modwest</title><content type='html'>ModWest documents CVS setup &lt;a href="http://www.modwest.com/help/kb2-69.html"&gt;here&lt;/a&gt;. That works fine. They also tell you how to authenticate via public/private keypairs&lt;br /&gt;&lt;a href="http://www.modwest.com/help/kb20-90.html"&gt;here&lt;/a&gt;, but I was not able (so far) to get that to work.&lt;br /&gt;&lt;br /&gt;No worries: I was able to use the latest TortoiseCVS to do a checkin, getting a lot of extra messsages and having to type my password a few times - nothing backbreaking for the current time. Settings are: :ext:snrygaard@shell.modest.com:/cvs&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111349114595906567?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111349114595906567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111349114595906567' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111349114595906567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111349114595906567'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/04/cvs-on-modwest.html' title='CVS On Modwest'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111340764907344799</id><published>2005-04-13T17:52:00.000+02:00</published><updated>2006-11-07T16:18:35.099+01:00</updated><title type='text'>Simple Tar</title><content type='html'>&lt;span style="font-weight:bold;"&gt;tarball on Linux&lt;/span&gt;&lt;br /&gt;Create: tar cvzpf /tmp/destination.tar.gz /home/source&lt;br /&gt;Extract: &lt;br /&gt;- using the mv command, put the tarball in the folder where you want the new file or folder created (i.e. if you tarballed /home/source, and you now want a "source" folder in tmp, put the tarball on the top level of /tmp) &lt;br /&gt;- tar -zxvf tarball.tar.gz&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;tarball on Windows&lt;/span&gt;&lt;br /&gt;Create: use &lt;a href="http://www.7-zip.org/"&gt;7-zip&lt;/a&gt;. First create the tar file, and then gzip the result.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111340764907344799?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111340764907344799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111340764907344799' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111340764907344799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111340764907344799'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/04/simple-tar.html' title='Simple Tar'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111200609722238876</id><published>2005-03-28T12:34:00.000+02:00</published><updated>2006-11-07T16:18:35.046+01:00</updated><title type='text'>HTML/CSS: Eliminating Extra IE Form Space</title><content type='html'>Using forms in IE adds spacing, which is normally not desired. To eliminate this, use the CSS &amp;quot;margin&amp;quot; style, like this:&lt;br&gt;&amp;lt;form name=&amp;quot;bob&amp;quot; style=&amp;quot;margin-bottom:0;margin-top:0&amp;quot; method=&amp;quot;POST&amp;quot; action=&amp;quot;whatever&amp;quot;&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111200609722238876?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111200609722238876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111200609722238876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111200609722238876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111200609722238876'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/03/htmlcss-eliminating-extra-_111200609722238876.html' title='HTML/CSS: Eliminating Extra IE Form Space'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111131931108218335</id><published>2005-03-20T11:50:00.000+01:00</published><updated>2006-11-07T16:18:33.844+01:00</updated><title type='text'>FxCop on the Compact Framework</title><content type='html'>To check the PocketPC barcode scanning applications I just wrote, I downloaded &lt;a href="http://www.gotdotnet.com/team/fxcop/"&gt;FxCop.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The first issue reported, the missing strong name, I addressed with the help of &lt;a href="http://www.developer.com/net/vb/article.php/3292231"&gt;this article&lt;/a&gt; (actually, there are a lot of articles - but this one got me started quick). Also I needed to move the generated files into the same directory as my executables.&lt;br /&gt;&lt;br /&gt;Some FxCop rules are not applicable in the compact framework. &lt;a href="http://blog.opennetcf.org/ncowburn/UsingFxCopWithTheNETCompactFramework.aspx"&gt;This article&lt;/a&gt; has more info, as does &lt;a href="http://www.google.com/search?q=FXCop+%22compact+framework%22+site:.gotdotnet.com&amp;hl=en&amp;amp;lr=lang_ca%7Clang_en%7Clang_de%7Clang_es&amp;safe=off&amp;amp;start=10&amp;amp;sa=N"&gt;searching the related forums&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;ToString generates a SpecifyIFormatProvider FxCop error. A good discussion of why can be found &lt;a href="http://www.gotdotnet.com/Community/MessageBoard/Thread.aspx?id=303151"&gt;here&lt;/a&gt;. Quick solution: use ToString(CultureInfo.CurrentCulture) for things that users will see, and ToString(CultureInfo.InvariantCulture) for things that the need to be parsed by the computer in a cultural independent way.&lt;br /&gt;&lt;br /&gt;Ha! After inventing Hungarian notation, Microsoft now &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconparameternamingguidelines.asp"&gt;has a rule against it&lt;/a&gt;! Since they don't provide justification for this change, and it seems like more of a style thing, I added my "hungies" to the FxCop "custom dictionary" - see their docs for details. This allows me to keep the GENERAL rule (no misspellings in the name) without having to stop using Hungarian notation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111131931108218335?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111131931108218335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111131931108218335' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111131931108218335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111131931108218335'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/03/fxcop-on-compact-framework.html' title='FxCop on the Compact Framework'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111173535340115223</id><published>2005-02-25T08:21:00.000+01:00</published><updated>2006-11-07T16:18:34.868+01:00</updated><title type='text'>EasyPHP Solution</title><content type='html'>To run extensions from easyphp, you need to move all the dlls from the C:\PROGRA~1\EASYPH~2\php directory to the windows\system32 directory. You MAY also need to copy the files from C:\PROGRA~1\EASYPH~2\php\extensions to the same place. Symptom: starting EasyPHP says that the extension could not be found.&lt;br /&gt;&lt;br /&gt;Of course, changing your path variable MAY also solve the problem, but I didn't try that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111173535340115223?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111173535340115223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111173535340115223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111173535340115223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111173535340115223'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2005/02/easyphp-solution.html' title='EasyPHP Solution'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133689692316339</id><published>2004-10-09T17:40:00.000+02:00</published><updated>2006-11-07T16:18:33.927+01:00</updated><title type='text'>MySQL Log</title><content type='html'>To get MySQL to log all it’s actions, turn on “log-bin” (see the MySQL documentation). To turn this on in EasyPHP, open the MySQL config file, add the line e.g. “set-variable=log-bin=C:\mysqllog\”, and restart MySQL. When you want to examine a file, MySQL will not let it go if in use, so you can restart MySQL so it switches to a new file, and then look at the old file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133689692316339?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133689692316339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133689692316339' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133689692316339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133689692316339'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/10/mysql-log.html' title='MySQL Log'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133692129476036</id><published>2004-09-25T17:41:00.000+02:00</published><updated>2006-11-07T16:18:33.991+01:00</updated><title type='text'>How to hide an HTML item</title><content type='html'>style="display:none”. This worked perfect for a checkbox that I wanted to hide, but keep functioning.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133692129476036?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133692129476036/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133692129476036' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133692129476036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133692129476036'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/09/how-to-hide-html-item.html' title='How to hide an HTML item'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133735555684960</id><published>2004-09-09T17:48:00.000+02:00</published><updated>2006-11-07T16:18:34.759+01:00</updated><title type='text'>Regedit Permissions</title><content type='html'>&lt;div class="storycontent"&gt;    &lt;p&gt;On Sunday night, I found out that my “registry hive” was corrupted, and attempts to fix this via the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=56D3C201-2C68-4DE8-9229-CA494362419C&amp;amp;displaylang=en"&gt;Microsoft Register Repair Utility&lt;/a&gt;, via Windows 2000 setup disk, etc. all failed. My reading afterwards turned up problems with the version of the RAID drivers that I was using for my S-ATA HD, which is the likely cause of the problem.&lt;/p&gt;  &lt;p&gt;Carlos had something similar with his home computer recently, and finally did an install of Win2K over his old install. This worked OK for him, and the only problem was that he had to reinstall some applications.&lt;/p&gt;  &lt;p&gt;However, I expected more data corruption due to the drivers, and didn’t want to continue with my existing data. My long term solution was to buy a Dell Inspiron 9100 w/ Dell financing. However, that will take some time to get here, so I decided to use my old HD (and IDE HD that was working in another machine before I got my new machine a month or two ago). This should keep me with a minimum of “fussing” time until the Dell gets here.&lt;/p&gt;  &lt;p&gt;Then, the big problems started. I needed all kinds of new drivers for the HD (makes sense - it was used in a completly different machine). However, it was impossible to install anything - I kept getting a generic error message no matter what drivers I tried to install. Carlos to the rescue. It turns out that the problem was that my user account (in this case, administrator) did not have permission to change some registry values. No idea how I got into this situation, but the solution was to give “full control” to the registry path HKEY_LOCAL_MACHINE/SYSTEM/CURRENTCONTROLSET/ENUM/PCI. In XP, this can apparently be done w/ RegEdit. However, in Win2K, this must be done with RegEdt32. SALVATION - drivers could then be installed, and I could get back to work. &lt;/p&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133735555684960?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133735555684960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133735555684960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133735555684960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133735555684960'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/09/regedit-permissions.html' title='Regedit Permissions'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133695135655589</id><published>2004-09-02T17:42:00.000+02:00</published><updated>2006-11-07T16:18:34.071+01:00</updated><title type='text'>Taking ModDate of portal records into consideration</title><content type='html'>In FileMaker, how do you get the “real” modification date of a record, if it has related records. E.g. if you have a sale, which has a mod date field, and line items for that sale, the mod date for the sale itself does not get changed when the portal records get changed. Solution: Add a “mod date” field to the line items, and add a calc field (type date) to the main record which is something like: Max(Max(Product Line Items::Date Modified), Date Modified)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133695135655589?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133695135655589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133695135655589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133695135655589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133695135655589'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/09/taking-moddate-of-portal-records-into.html' title='Taking ModDate of portal records into consideration'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133697965329189</id><published>2004-08-30T17:42:00.000+02:00</published><updated>2006-11-07T16:18:34.143+01:00</updated><title type='text'>CSV Documentation</title><content type='html'>For creating data feeds from products in an ecommerce store, CSV is the de facto standard that all the services use. However, the exact rules for CSV are only well documented in one spot that I found: &lt;a href="http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm"&gt;here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133697965329189?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133697965329189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133697965329189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133697965329189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133697965329189'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/08/csv-documentation.html' title='CSV Documentation'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133706417156667</id><published>2004-08-18T17:43:00.001+02:00</published><updated>2010-11-08T17:06:53.976+01:00</updated><title type='text'>FileMaker via ActiveX in C#</title><content type='html'>&lt;div class="storycontent"&gt;    &lt;p&gt;I had trouble finding documentation about Automating FileMaker from C# (using FM Developer 6), so I’ve written up some of my notes…&lt;/p&gt;  &lt;p&gt;First, you have to “add reference”, going to the COM tab and selecting the FM type library. Hit the “Select” button, and then hit OK.&lt;/p&gt;  &lt;p&gt;Add a “using FMPRO50Lib;” clause to the beginning of the file where you will be using FM Automation.&lt;/p&gt;  &lt;p&gt;Here is the basic code to call a script in the active DB.&lt;/p&gt;  &lt;pre&gt;ApplicationClass fmApp = new ApplicationClass();&lt;br /&gt;IFMIDocuments fmDocs = (IFMIDocuments) fmApp.Documents;&lt;br /&gt;IFMIDocument fmDoc = (IFMIDocument)fmDocs.Active;&lt;br /&gt;string strScriptName = "ReturnToApprovalRec";&lt;br /&gt;fmDoc.DoFMScript (ref strScriptName);&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;To find a particular document, you will want to loop the open documents. NOTE: The name shown in the message box is the FULL PATH - you will have to dig the DB name out of there.&lt;/p&gt;  &lt;pre&gt;IEnumerator myEnum = fmDocs.GetEnumerator ();&lt;br /&gt;while (myEnum.MoveNext ()) {&lt;br /&gt;IFMIDocument myDoc = (IFMIDocument) myEnum.Current;&lt;br /&gt;MessageBox.Show (myDoc.FullName);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;  &lt;p&gt;To open a new DB, you would want to use IFMIDocuments.Open&lt;/p&gt;  &lt;p&gt;There are not many things that you can automate (see the object browser), but at least the above outlines the things that CAN be done. &lt;/p&gt;&lt;p&gt;------------------------&lt;/p&gt;&lt;p&gt;Notes for 64 bit machines&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;There are a number of things that you have to be aware of when using FileMaker on a 64 bit machine&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Filemaker help cannot be accessed until you install WinHlp32.exe. See http://www.microsoft.com/downloads/d...displaylang=en&lt;/li&gt;&lt;li&gt;The FileMaker ODBC driver setup must be done in a somewhat strange way. I found the solution here: http://postgresqldbnews.blogspot.com/2008/03/32-bit-odbc-drivers-in-vista-64.html. Short version: there are two versions of odbcad32.exe in the windows directory. Look for the version inside the syswow64 directory, and use that to set up 32 bit ODBC drivers.&lt;/li&gt;&lt;li&gt;AmImEx must be compiled in 32 bit mode for it to be able to access the FM ODBC driver&lt;br /&gt;&lt;/li&gt;&lt;li&gt;In Windows 7, I had the experience that the COM component for FileMaker was not installed even after FileMaker installed successfully. To fix this, search from "cmd.exe" in the start menu, right click on it and execute as administrator, cd (change directory) to the directory where FileMaker is installed, and execute&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" &gt;"NameOfFilemaker.exe" /REGSERVER&lt;/span&gt;&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133706417156667?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133706417156667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133706417156667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133706417156667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133706417156667'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/08/filemaker-via-activex-in-c.html' title='FileMaker via ActiveX in C#'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133710988896951</id><published>2004-08-17T17:44:00.001+02:00</published><updated>2006-11-07T16:18:34.433+01:00</updated><title type='text'>HTML Link-Button</title><content type='html'>To create an HTML button which is actually a link rather than a form submit, put the following OUTSIDE of a form area. &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Checkout Now&amp;quot; class=&amp;quot;button&amp;quot; onClick=&amp;quot;document.location=&amp;#8217;http://whatever&amp;#8217;&amp;quot;&amp;gt;&amp;lt;/input&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133710988896951?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133710988896951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133710988896951' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133710988896951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133710988896951'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/08/html-link-button.html' title='HTML Link-Button'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133708687093910</id><published>2004-08-17T17:44:00.000+02:00</published><updated>2006-11-07T16:18:34.268+01:00</updated><title type='text'>MySQL Freeing Space</title><content type='html'>When you delete records in MySQL, the table is not compressed - the space is left free for future inserts. In order to see how much “claimed by not used” space you have, use “Show Table Status” (e.g. “show table status from jssdatabase), and check the “Data_free” column. To “compress” the DB, use “Optimize Table” (e.g. “optimize table jss_carts").&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133708687093910?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133708687093910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133708687093910' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133708687093910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133708687093910'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/08/mysql-freeing-space.html' title='MySQL Freeing Space'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133715738370683</id><published>2004-08-09T17:45:00.001+02:00</published><updated>2006-11-07T16:18:34.546+01:00</updated><title type='text'>XP Woes</title><content type='html'>I wasted beaucoup time over the last month with my XP Professional explorer “hanging” for minutes at a time. This happened in two main situations: when hitting the start menu key, and when right clicking on a folder. A google post finally tipped me off to the problem - the PGP service. Deinstalling PGP fixed the problem immediatly. Note sure if it was a free version I was using, but I saw on deinstall that the version number was 8.0.3.&lt;br /&gt;NOTE: Upgrading to 8.1 fixed the problem. There are rumors (even though the source code for the 8.x version is published) that there are back doors in PGP for the government, but this appears to be only rumors. Phil Zimmerman (creator of PGP) says that all versions prior to 7.03 were free of back doors, but he does not know about later versions (he left the company).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133715738370683?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133715738370683/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133715738370683' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133715738370683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133715738370683'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/08/xp-woes.html' title='XP Woes'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133713005635252</id><published>2004-08-09T17:45:00.000+02:00</published><updated>2006-11-07T16:18:34.490+01:00</updated><title type='text'>What is my ip?</title><content type='html'>Not sure what IP you’re connecting to the internet with? Try &lt;a href="http://www.whatismyip.com/"&gt;WhatIsMyIp&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133713005635252?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133713005635252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133713005635252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133713005635252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133713005635252'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/08/what-is-my-ip.html' title='What is my ip?'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133720376695386</id><published>2004-08-02T17:46:00.000+02:00</published><updated>2006-11-07T16:18:34.600+01:00</updated><title type='text'>.NET decimal issues</title><content type='html'>&lt;div class="storycontent"&gt;    &lt;p&gt;so parsing would go like:&lt;br /&gt;double dbl = double.Parse("1234.56″,&lt;br /&gt;System.Globalization.CultureInfo.InvariantCulture);&lt;/p&gt;  &lt;p&gt;And when you need to get your string from the double, you can do the&lt;br /&gt;same thing in “reverse”:&lt;br /&gt;string s =&lt;br /&gt;dbl.ToString(System.Globalization.CultureInfo.InvariantCulture); &lt;/p&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133720376695386?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133720376695386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133720376695386' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133720376695386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133720376695386'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/08/net-decimal-issues.html' title='.NET decimal issues'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133726399612945</id><published>2004-06-12T17:47:00.000+02:00</published><updated>2006-11-07T16:18:34.655+01:00</updated><title type='text'>JShop Server - Referring URL Notes</title><content type='html'>&lt;div class="storycontent"&gt;    &lt;p&gt;Just did some research on Referring URLs, and thought I’d share what I found. &lt;/p&gt;  &lt;p&gt;First, all the info below assumes that JSS is able to pick up the referring URL. This is not always the case, based on what browser is used, what other things the user has on their computer (e.g. Norton Internet Security http://www.symantec.com/sabu/nis/nis_pe/ can filter this out), and (I believe) how the server is set up. OK, the rest of the info assumes that JSS can pick up the referring URL. &lt;/p&gt;  &lt;p&gt;To find what external links the customers are coming from…&lt;br /&gt;- Go to Admin area / Log Section / General Options&lt;br /&gt;- Set “Enable Visitor Logging” to “on”&lt;br /&gt;- “Ignore Referrers From Reports” must include your site’s URL (see docs)&lt;br /&gt;For visitors that arrive after this change, you can see what link they came from by going to admin / log section, check “Referring URL” in the “Select Reports” section, and then click on the “show reports” button. NOTE: “Direct/Unknown” are visitors that either type your URL directly, or cases where JSS is not able to pick up what the referring URL is. &lt;/p&gt;  &lt;p&gt;To find out what orders come from a Referring URL, open admin / orders. Open up the details for an order (by clicking the order number in the column headed “Order"). At the bottom, you’ll find the “Referring Site” where the order came from. &lt;/p&gt;  &lt;p&gt;NOTE: this info is only collected when creating a new shopping cart. To force a new shopping cart on your machine, clean out your existing cookies before clicking on the external link. I IE, you do this by going to the tools menu, Internet Options, general tab, and hitting the button “Delete cookies…”. &lt;/p&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133726399612945?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133726399612945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133726399612945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133726399612945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133726399612945'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/06/jshop-server-referring-url-notes.html' title='JShop Server - Referring URL Notes'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133728807503917</id><published>2004-06-09T17:47:00.000+02:00</published><updated>2006-11-07T16:18:34.708+01:00</updated><title type='text'>FileMaker - Opening Many DBs</title><content type='html'>&lt;div class="storycontent"&gt;    &lt;p&gt;My FM client has password protection on his DBs, and I’ve spent a LOT of time typing this password over and over (and over and over) again for each DB that I need to access. Yesterday, I finally got sick enough of it to do something about it. The following steps assume that you have the same password for all DBs, but it may be possible with different passwords, too.&lt;br /&gt;- Create a new password protected DB, with the password being the same that you need in the other DBs.&lt;br /&gt;- In this new DB, create a script which opens the DBs that you need&lt;br /&gt;- Open “Edit / Preferences / Document”  and check the “Try Default Passord” checkbox, but do NOT enter the password.&lt;br /&gt;- In this dialog, you also want to check the “Perform Script” checkbox, and indicate the script that you created to open the DBs.&lt;/p&gt;  &lt;p&gt;Voilá - you only have to enter the password once to open all the DBs. &lt;/p&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133728807503917?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133728807503917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133728807503917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133728807503917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133728807503917'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/06/filemaker-opening-many-dbs.html' title='FileMaker - Opening Many DBs'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11574075.post-111133740126208517</id><published>2004-06-04T17:49:00.000+02:00</published><updated>2006-11-07T16:18:34.815+01:00</updated><title type='text'>FileMaker - Report by Month</title><content type='html'>&lt;div class="storycontent"&gt;    &lt;p&gt;I had the problem that I was trying to do a report by month, but the field that I was keying on had month, day, and year, so I was getting a breakdown by day. To breakdown by month, I introduced an unstored calculated field with a date result, using the formula &lt;/p&gt;  &lt;pre&gt;Date( Month(CalcDate), 1, Year(CalcDate))&lt;/pre&gt;  &lt;p&gt;…and keyed off that, instead. &lt;/p&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11574075-111133740126208517?l=rocinantesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rocinantesoftware.blogspot.com/feeds/111133740126208517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11574075&amp;postID=111133740126208517' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133740126208517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11574075/posts/default/111133740126208517'/><link rel='alternate' type='text/html' href='http://rocinantesoftware.blogspot.com/2004/06/filemaker-report-by-month.html' title='FileMaker - Report by Month'/><author><name>Ed Eichman</name><uri>http://www.blogger.com/profile/04589507047461754483</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://www.rocinantesoftware.com/ed_fall.jpg'/></author><thr:total>0</thr:total></entry></feed>
