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

<channel>
	<title>CULLY Technologies, LLC - cully.biz</title>
	<atom:link href="http://cully.biz/feed/" rel="self" type="application/rss+xml" />
	<link>http://cully.biz</link>
	<description>Data::Information::Knowledge::Power</description>
	<lastBuildDate>Tue, 29 Jan 2013 10:03:58 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>The Tale of Two Random String Functions</title>
		<link>http://cully.biz/2013/01/29/the-tale-of-two-random-string-functions/</link>
		<comments>http://cully.biz/2013/01/29/the-tale-of-two-random-string-functions/#comments</comments>
		<pubDate>Tue, 29 Jan 2013 10:03:58 +0000</pubDate>
		<dc:creator>kcully</dc:creator>
				<category><![CDATA[REALbasic]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://cully.biz/?p=435</guid>
		<description><![CDATA[I&#8217;ve been thinking a lot of random strings lately. Notice that this isn&#8217;t about generating a UUID. I just wanted to generate a reasonably random string. Originally I had need for a user &#8216;typable&#8217; string. I get really frustrated by the CAPTCHA strings when they include the ambiguous characters of I, 1, O, and 0. [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve been thinking a lot of random strings lately.  Notice that this isn&#8217;t about generating a UUID.  I just wanted to generate a reasonably random string.  Originally I had need for a user &#8216;typable&#8217; string.  I get really frustrated by the CAPTCHA strings when they include the ambiguous characters of I, 1, O, and 0.  (eye, one, oh, and zero)  Certain fonts have these characters virtually identical.  I&#8217;m sure that professional font creators think long and hard about how to design these characters, especially if their purpose is human identifiability.  This really frustrates me.</p>
<p>Originally, I was just going to create a random string generation function that avoids these characters.  Easy enough to do with the way these functions are written by just removing them from the source character set.  But then I stumbled across a JavaScript code that created a human-readable string along the lines of what could be used by CAPTCHA functions.</p>
<p>First, let us look at a string generation function that Pamoxi wrote on the RealSoftware.com forums:</p>
<blockquote><p>
Function RandomString(nStringLength As Integer, IncludeNumbers As Boolean, IncludeLowerCase As Boolean, IncludeUpperCase As Boolean, IncludeSymbols As Boolean) As String<br />
  &#8216; Created by pamoxi from the RealSoftware.com forums!<br />
  Dim cSource As String = &#8220;&#8221;<br />
  if IncludeNumbers = True then cSource = cSource + &#8220;1234567890&#8243;<br />
  if IncludeLowerCase = True then cSource = cSource + &#8220;abcdefghijklmnopqrstuvwxyz&#8221;<br />
  if IncludeUpperCase = True then cSource = cSource + &#8220;ABCDEFGHIJKLMNOPQRSTUVWXYZ&#8221;<br />
  if IncludeSymbols = True then cSource = cSource + &#8220;|@#~$%()=^*+[]{}-_&#8221;<br />
  Dim cRetVal, cCharacter As String<br />
  Dim nNumberOfCharacters, nStart, nX As Integer<br />
  nNumberOfCharacters = cSource.Len( )<br />
  for nX = 1 To nStringLength<br />
&nbsp;    Dim oRandom as New Random<br />
&nbsp;    nStart = oRandom.InRange( 1, nNumberOfCharacters )<br />
&nbsp;    cCharacter = cSource.Mid( nStart, 1 )<br />
&nbsp;    cRetVal = cRetVal + cCharacter<br />
  Next<br />
  return cRetVal<br />
End Function
</p></blockquote>
<p>This function generates strings that look like this:<br />
<a href="http://cully.biz/wp-content/uploads/2013/01/random_strings1.png"><img src="http://cully.biz/wp-content/uploads/2013/01/random_strings1-300x150.png" alt="random_strings1" width="300" height="150" class="alignnone size-medium wp-image-438" /></a></p>
<p>My original purpose was to create a shorter string that a user could reliably type in, and yet was random.  I could use this as a light weight validation that the visitor wasn&#8217;t a bot of some type to my website.  So I converted the JavaScript function over to RealBasic:</p>
<blockquote><p>Function RandomStringReadable(nStringLength AS Integer) As String<br />
  &#8216; Created by ThePeppersStudio from http://snipperize.todayclose.com/<br />
  &#8216; Converted to RealBasic by Kevin Cully<br />
  DIM cConstanants AS String = &#8220;BCDFGHJKLMNPQRSTVWXYZ&#8221;<br />
  DIM cVowels AS String = &#8220;AEIOU&#8221;<br />
  Dim cRetVal, cCharacter As String = &#8220;&#8221;<br />
  DIM nStart AS Integer<br />
  DO UNTIL cRetVal.Len() >= nStringLength<br />
&nbsp;    Dim oRandom as New Random<br />
&nbsp;    nStart = oRandom.InRange( 1, cConstanants.Len() )<br />
&nbsp;    cCharacter = cConstanants.Mid( nStart, 1 )<br />
&nbsp;    cRetVal = cRetVal + cCharacter<br />
&nbsp;    oRandom = New Random<br />
&nbsp;    nStart = oRandom.InRange( 1, cVowels.Len() )<br />
&nbsp;    cCharacter = cVowels.Mid( nStart, 1 )<br />
&nbsp;    cRetVal = cRetVal + cCharacter<br />
  LOOP<br />
  return cRetVal<br />
End Function
</p></blockquote>
<p>And here is what the output looks like when I ask for a readable random string of 20 characters:<br />
<a href="http://cully.biz/wp-content/uploads/2013/01/random_strings2.png"><img src="http://cully.biz/wp-content/uploads/2013/01/random_strings2.png" alt="random_strings2" width="190" height="233" class="alignnone size-full wp-image-439" /></a></p>
<p>Even when I&#8217;m including the characters of what I thought was ambiguous, the human mind is able to identify the pattern and accurately enter the string.  The output of this function is superior in readability to most CAPTCHA images.  That might be on purpose. Of course it helps eliminating the numbers, including the zero.  I hope you find this useful.</p>
]]></content:encoded>
			<wfw:commentRss>http://cully.biz/2013/01/29/the-tale-of-two-random-string-functions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How Not To Store Passwords (and what to do)</title>
		<link>http://cully.biz/2013/01/25/how-not-to-store-passwords/</link>
		<comments>http://cully.biz/2013/01/25/how-not-to-store-passwords/#comments</comments>
		<pubDate>Fri, 25 Jan 2013 12:00:46 +0000</pubDate>
		<dc:creator>kcully</dc:creator>
				<category><![CDATA[Visual Foxpro]]></category>

		<guid isPermaLink="false">http://cully.biz/?p=416</guid>
		<description><![CDATA[This post is a summary of a presentation I made before the Atlanta Foxpro Users Group on Tuesday, January 22nd 2013. You can download the code samples here: http://afug.com/meetingtopics/2013/AFUG_Passwords.zip Over the years and years of my career, I think I&#8217;ve made every mistake possible, at some point. We&#8217;re going to talk about how to improve [...]]]></description>
				<content:encoded><![CDATA[<p>This post is a summary of a presentation I made before the Atlanta Foxpro Users Group on Tuesday, January 22nd 2013.  You can download the code samples here: <a href="http://afug.com/meetingtopics/2013/AFUG_Passwords.zip">http://afug.com/meetingtopics/2013/AFUG_Passwords.zip</a></p>
<p>Over the years and years of my career, I think I&#8217;ve made every mistake possible, at some point.  We&#8217;re going to talk about how to improve our practices in storing user passwords, by looking at various approaches that start to approach better practices.</p>
<blockquote><p><em>Remember that security is a process, not a destination.</em></p></blockquote>
<p><a href="http://cully.biz/wp-content/uploads/2013/01/password01.png"><img src="http://cully.biz/wp-content/uploads/2013/01/password01-300x197.png" alt="No security" width="300" height="197" class="alignright size-medium wp-image-417" /></a><br />
Here&#8217;s the old way of doing things.  Storing the usernames and passwords in the same table, in clear text.  If someone hacked your system, they&#8217;d have access to your system and it is possible that you&#8217;d never know what data was compromised.  Don&#8217;t do this anymore.  As of today, you know better.</p>
<p>Notice that you have the typical users that are using the absolute worst passwords ever conceived.  This should send a shudder down your back.  Another security procedure, is to not allow your users to use <a href="http://gizmodo.com/5954372/the-25-most-popular-passwords-of-2012">the most popular passwords</a>.</p>
<h3>Storing Passwords As Hashed Values</h3>
<p>Thanks to Gilles Patrick, we have a native VFP access to the MD5 hashing process.  Let us take our first small step.  The difference between encryption and hashing, is that you can&#8217;t get the original values back from a hashed value.  The hashed value just is a unique representation of a string no matter if that string is long or short.</p>
<p><a href="http://cully.biz/wp-content/uploads/2013/01/password02.png"><img src="http://cully.biz/wp-content/uploads/2013/01/password02-300x91.png" alt="MD5 Passwords" width="300" height="91" class="alignright size-medium wp-image-418" /></a> In this adjustment to our original table, we have the hashed value of the password.  We could then drop the password field.  To log in users, we would find the user record, and see if the hashed value of the password entered on the login form, matches the hashed value stored in the table.  If so, let the user in.</p>
<p><code><br />
oMD5.tohash = c_User2.cpassword<br />
REPLACE cmd5 WITH oMD5.Compute()<br />
</code></p>
<p>While this approach is a small bit better than storing passwords in the clear, it isn&#8217;t a good approach.  The problem is that there is such a thing as rainbow tables.  You can go out on the Intertubes and download a rainbow table of MD5 values and their corresponding passwords.  This is the way to back into the passwords.  Not only that, but you can test all of the passwords in a single pass.  (More on this later.)</p>
<h3>Hashing Passwords with Multiple Passes</h3>
<p>So if storing passwords as hashed values is bad, can we improve things by making multiple passes?  Yes, it&#8217;s better.  In the example code, I hash the password, and then hash the hash value.</p>
<p><code>lcPassword = c_User3.cPassword<br />
FOR lnX = 1 TO 3<br />
&nbsp;&nbsp;oMD5.tohash = lcPassword<br />
&nbsp;&nbsp;lcPassword = oMD5.Compute()<br />
ENDFOR<br />
REPLACE cmd5x3 WITH lcPassword<br />
</code></p>
<p><a href="http://cully.biz/wp-content/uploads/2013/01/password03.png"><img src="http://cully.biz/wp-content/uploads/2013/01/password03.png" alt="Multiple Hashing Passes" width="1609" height="535" class="alignright size-full wp-image-419" /></a></p>
<p>Notice that this approach makes it more difficult to use a rainbow table.  You&#8217;d need a rainbow table that has values that have the exact same number of iterative loops.  Also note, that you can always INCREASE the number of loops at any time and still retain the efficacy of the stored passwords.  You can increase the number of loops from 3 to 6 or 60, just by replacing the passwords with the hashed value of nNewLoopValue &#8211; nOldLoopValue.  (Example: 60 &#8211; 3)</p>
<p>This approach still isn&#8217;t satisfactory.  You can still test against the entire database in one pass.  It&#8217;s possible that there are rainbow tables that have your iteration values.  We can still do better.</p>
<h3>Storing Passwords With Salted Hashes</h3>
<p>A &#8216;salt&#8217; is introducing a value in addition to the original password.  This salt value is unknown to the user. In fact, the user does not need to know the salt.  It helps protect the passwords on the back end of the database.  So, if a user has the awful password of &#8220;Password123&#8243;, then the salted value could be &#8220;AFUG&#8221; + &#8220;Password123&#8243; or &#8220;Password123&#8243; + &#8220;AFUG&#8221;.</p>
<p><code><br />
lcPassword = lcSalt + c_User4.cPassword<br />
FOR lnX = 1 TO 3<br />
&nbsp;&nbsp;oMD5.tohash = lcSalt + lcPassword<br />
&nbsp;&nbsp;lcPassword = oMD5.Compute()<br />
ENDFOR<br />
REPLACE cmd5Salt WITH lcPassword<br />
</code></p>
<p><a href="http://cully.biz/wp-content/uploads/2013/01/password04.png"><img src="http://cully.biz/wp-content/uploads/2013/01/password04.png" alt="Salted Hashed Passwords" width="1611" height="533" class="alignright size-full wp-image-420" /></a></p>
<p>Note that if you feel that your database was compromised, you could change your salt, zero out all passwords thus forcing all users to enter a new password, hopefully re-securing your user table and system.  At this point, you can start to feel more confident that you are safer from rainbow tables, however hackers can still attack the entire user table in one pass.</p>
<h3>Unique salts per user, passwords stored in external table</h3>
<p>What if we used a different salt per user? &#8230; plus a system wide salt?  With the multiple passes?</p>
<p><code><br />
lcPassword = c_User5.cSalt + c_User5.cPassword<br />
FOR lnX = 1 TO 3<br />
&nbsp;&nbsp;oMD5.tohash = c_User5.cSalt + lcPassword<br />
&nbsp;&nbsp;lcPassword = oMD5.Compute()<br />
ENDFOR<br />
INSERT INTO c_User5Password ( cMD5Salted, tLastUsed ) VALUES ( lcPassword, DATETIME() )<br />
</code></p>
<p>In addition to the above code, we don&#8217;t need to store the hashed value in the user table!  If the hashed value is unique, there is no need to store it with the user values.  We can then test the userid, get the salt, loop through the multiple hashed values, and then see if the result is stored in the hashed value tables.  If the value exists after that process, then we have a good match between the user and password.</p>
<p><a href="http://cully.biz/wp-content/uploads/2013/01/password05.png"><img src="http://cully.biz/wp-content/uploads/2013/01/password05.png" alt="Salted external hashed" width="1116" height="602" class="alignright size-full wp-image-421" /></a></p>
<h3>Oh yeah, don&#8217;t use MD5!</h3>
<p>I used MD5 all over the examples because we have access to MD5 natively as VFP code.  However, the MD5 process is too <em>FAST</em>!  Hackers can make thousands of MD5 computations per second and attack your database faster and faster as computers get faster.  There are other hashing techniques that are <em>SLOWER</em>, not GPU optimizable, and thus are more resistant to hacking attempts.  Some of these approaches are <a href="http://en.wikipedia.org/wiki/Bcrypt">BCRYPT</a> and <a href="http://en.wikipedia.org/wiki/Scrypt">SCRYPT</a>.  There are plugins that can be purchased and integrated into your application.  Also note that PHP (and others) have slower hashing approaches available to them, and thus is callable from within a VFP application to a PHP page that gets the hashed value back. (over SSL of course!)</p>
<h3>Conclusion</h3>
<p>While this post just scratches the surface of security, as a programmer it is time to make sure that we are taking advantage of the leading best practices of our day.  If you refactor an old VFP application, take the time to update it&#8217;s security password mechanism.  Use better practices.</p>
]]></content:encoded>
			<wfw:commentRss>http://cully.biz/2013/01/25/how-not-to-store-passwords/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Selectively removing HTML from Foxpro tables</title>
		<link>http://cully.biz/2013/01/07/selectively-removing-html-from-foxpro-tables/</link>
		<comments>http://cully.biz/2013/01/07/selectively-removing-html-from-foxpro-tables/#comments</comments>
		<pubDate>Mon, 07 Jan 2013 15:27:40 +0000</pubDate>
		<dc:creator>kcully</dc:creator>
				<category><![CDATA[Visual Foxpro]]></category>

		<guid isPermaLink="false">http://cully.biz/?p=409</guid>
		<description><![CDATA[I was working with some web developers upgrading a VFP data driven website. There were many HTML tags and references in memo fields that needed to be removed when moving to the new site design. I didn&#8217;t want to remove ALL of the HTML tags, but just some. I modified some code that I found [...]]]></description>
				<content:encoded><![CDATA[<p>I was working with some web developers upgrading a VFP data driven website.  There were many HTML tags and references in memo fields that needed to be removed when moving to the new site design.  I didn&#8217;t want to remove ALL of the HTML tags, but just some.  I modified some code that I found and these little snippets worked out nicely.</p>
<p><code>lcHTML = MyTable.MyMemoFieldWithHTML<br />
lcHTML = RemoveHTMLTag( lcHTML, "&lt;font", [&lt;span class="qs-bold-12-blue"&gt;] )<br />
lcHTML = RemoveHTMLTag( lcHTML, "&lt;/font", "&lt;/span&gt;" )<br />
lcHTML = RemoveHTMLTag( lcHTML, "&lt;strong", "" )<br />
lcHTML = RemoveHTMLTag( lcHTML, "&lt;/strong", "" )</code></p>
<p><code>*!**********************************<br />
*!* Program: RemoveHTMLTag<br />
*!* Author: CULLY Technologies, LLC<br />
*!* Date: 12/10/12 08:30:30 PM<br />
*!* Copyright:<br />
*!* Description:<br />
*!* Revision Information:<br />
FUNCTION RemoveHTMLTag( lcHTML, lcTag, lcReplacement )<br />
  lcHTMLSource = lcHTML<br />
  nTagCount = OCCURS( lcTag, lcHTMLSource )<br />
  nNewTagCount = nTagCount<br />
  DO WHILE nTagCount &gt; 0<br />
    nOpenLoc = AT(lcTag, lcHTMLSource )<br />
    lcTemp = SUBSTR( lcHTMLSource, nOpenLoc+1 )<br />
    nCloseLoc = AT("&gt;", lcTemp ) + nOpenLoc + 1<br />
    cTextToRemove = SUBSTR( lcHTMLSource, nOpenLoc, nCloseLoc - nOpenLoc )<br />
    lcHTMLSource = STRTRAN( lcHTMLSource, cTextToRemove, lcReplacement )<br />
    nNewTagCount = OCCURS( lcTag, lcHTMLSource )<br />
    IF nNewTagCount = nTagCount &amp;&amp; We're making sure we're still removing tags and that the HTML isn't invalid which would create an endless loop.<br />
      SET STEP ON<br />
      EXIT<br />
    ENDIF<br />
    nTagCount = nNewTagCount<br />
  ENDDO<br />
RETURN lcHTMLSource</code></p>
<p>I hope this helps someone out.</p>
]]></content:encoded>
			<wfw:commentRss>http://cully.biz/2013/01/07/selectively-removing-html-from-foxpro-tables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visual Foxpro to Real Studio Converter &#8211; 0.2beta</title>
		<link>http://cully.biz/2012/03/15/visual-foxpro-to-real-studio-converter-0-2beta/</link>
		<comments>http://cully.biz/2012/03/15/visual-foxpro-to-real-studio-converter-0-2beta/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 20:25:35 +0000</pubDate>
		<dc:creator>kcully</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[REALbasic]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Visual Foxpro]]></category>

		<guid isPermaLink="false">http://cully.biz/?p=403</guid>
		<description><![CDATA[Hello Visual Foxpro Programmers, Here&#8217;s an update to the &#8216;Visual Foxpro to Real Studio Converter&#8217;. I&#8217;ve just released version 0.2Beta. There are numerous updates including: The Real Studio project now properly identifies the forms as belonging to the project. More controls are converted such as the Option Groups and Image Controls The method code for [...]]]></description>
				<content:encoded><![CDATA[<p>Hello Visual Foxpro Programmers,</p>
<p>Here&#8217;s an update to the &#8216;Visual Foxpro to Real Studio Converter&#8217;.  I&#8217;ve just released version 0.2Beta.</p>
<p><iframe width="450" height="305" src="http://www.youtube.com/embed/om0DSfPC1Ho?rel=0" frameborder="0" allowfullscreen></iframe></p>
<p>There are numerous updates including:</p>
<ul>
<li>The Real Studio project now properly identifies the forms as belonging to the project.</li>
<li>More controls are converted such as the Option Groups and Image Controls</li>
<li>The method code for the forms and command buttons are converted into the Real Studio Windows, but are commented out.  This should make it so you can manually convert your code into RealBasic.</li>
<li>The project is now under the MIT license which is very open and friendly.
</ul>
<p>I hope that you find the project interesting, and &#8230; helpful!  If you make enhancements, or find a bug, just let me know.</p>
<p>I hope that you find Real Studio as easy and fun to develop in as I do.</p>
<p>-Kevin</p>
]]></content:encoded>
			<wfw:commentRss>http://cully.biz/2012/03/15/visual-foxpro-to-real-studio-converter-0-2beta/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Visual Foxpro to Real Studio Converter &#8211; 0.1beta</title>
		<link>http://cully.biz/2012/03/05/visual-foxpro-to-real-studio-converter-0-1beta/</link>
		<comments>http://cully.biz/2012/03/05/visual-foxpro-to-real-studio-converter-0-1beta/#comments</comments>
		<pubDate>Mon, 05 Mar 2012 13:18:37 +0000</pubDate>
		<dc:creator>kcully</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[REALbasic]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Visual Foxpro]]></category>

		<guid isPermaLink="false">http://cully.biz/?p=395</guid>
		<description><![CDATA[I love Visual Foxpro. Let me throw that out there right now and right up front. Unfortunately, Microsoft isn&#8217;t going to continue to develop Visual Foxpro and official support is scheduled to end in 2015. Sure, there will be VFP applications that continue to run for years to come. But, where do you go when [...]]]></description>
				<content:encoded><![CDATA[<p>I love Visual Foxpro.  Let me throw that out there right now and right up front.  Unfortunately, Microsoft isn&#8217;t going to continue to develop Visual Foxpro and official support is scheduled to end in 2015.  Sure, there will be VFP applications that continue to run for years to come.  But, where do you go when you&#8217;ve got years of VFP applications developed?</p>
<p>One of the technologies that I&#8217;m moving to is Real Studio (RealBasic) by Real Software Inc., located in Austin, TX, USA.  The joy and productivity that I had in VFP, I find in RS.  Did I mention that it&#8217;s cross platform: Linux, Mac and Windows!  There&#8217;s even a web edition!</p>
<p>Anyway, wouldn&#8217;t you wish that there was a utility to convert your VFP forms over to Real Studio?  Well wish no more!  Take a look.</p>
<p><iframe width="480" height="360" src="http://www.youtube.com/embed/nIjbISThFmA?rel=0" frameborder="0" allowfullscreen></iframe></p>
<p>Still here?  Okay, lets look at the pros and cons:</p>
<p>PROS:</p>
<ol>
<li>Converts your forms over from VFP to RS</li>
<li>Keeps the controls naming convention</li>
<li>The converter is free to use!</li>
<li>The converter is open sourced in that if there is a bug you could even fix it yourself and keep going!</li>
</ol>
<p>Cons:</p>
<ol>
<li>Not all controls are supported just yet.</li>
<li>Only converts forms; no reports, labels, menus, classes, programs</li>
<li>None of the method or even code code is converted</li>
<li>Not tested on heavily subclassed forms</li>
<li>Doesn&#8217;t make you taller or better looking</li>
<li>Who the hell is Kevin Cully anyway?</li>
</ol>
<p>Well anyway, I do really like Real Studio and I hope you find this converter interesting.  If you find a bug or need an enhancement, please drop me a line.  It helps to incentivize me if you would tell me how this would make the world a better place for you.  If you find (and fix) a bug or make an enhancement, let me know and give back!  We can make version 0.2beta even better!</p>
<p><a href="http://cully.biz/products/vfptors/vfptors_v0.1b.zip" title="VFPtoRS Converter - Source Code">Download the VFPtoRS source code here!  Version 0.1beta [60k]</a></p>
<p>Oh yes, I&#8217;m also speaking at the <a href="http://realsoftware.com/community/realworld.php" title="Real World Conference 2012, Orlando FL" target="_blank">Real World Conference</a> in May 2012 in Orlando.  Come on down and learn more about Real Studio!  If you are a VFP developer, I think you&#8217;ll like using it as a development platform as much as I do.</p>
<p>Thanks everyone!</p>
]]></content:encoded>
			<wfw:commentRss>http://cully.biz/2012/03/05/visual-foxpro-to-real-studio-converter-0-1beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Boxee Power Consumption</title>
		<link>http://cully.biz/2012/02/10/boxee-power-consumption/</link>
		<comments>http://cully.biz/2012/02/10/boxee-power-consumption/#comments</comments>
		<pubDate>Fri, 10 Feb 2012 21:10:50 +0000</pubDate>
		<dc:creator>kcully</dc:creator>
				<category><![CDATA[Hardware]]></category>

		<guid isPermaLink="false">http://cully.biz/?p=390</guid>
		<description><![CDATA[Hello TV fans! I&#8217;m about to make a change to my A/V setup inside of my house. I was curious about how this would affect my power consumption. Out comes my Kill A WATT and I roll up my sleeve and go to work. First, lets take a look at the TV just for comparison [...]]]></description>
				<content:encoded><![CDATA[<p>Hello TV fans!</p>
<p>I&#8217;m about to make a change to my A/V setup inside of my house.  I was curious about how this would affect my power consumption.  Out comes my <a href="http://j.mp/z432GT" target="_blank">Kill A WATT</a> and I roll up my sleeve and go to work.</p>
<p>First, lets take a look at the TV just for comparison purposes.  I&#8217;ve got a Vizio 47&#8243; LCD TV.</p>
<blockquote><p>
Powered Off: 0.0a; 0.0w<br />
On w no video feed blue screen: 1.7a; 209w<br />
On to cable news show: 1.5a; 185w</p></blockquote>
<p>I have a HTPC (Home Theater PC) that is an old Hewlett Packard business type PC.  Not a video game setup but also not designed for low power. So without further ado, here&#8217;s the power consumption for comparison purposes:</p>
<blockquote><p>
Powered Off: 0.0a; 0.0w<br />
On but not doing anything: 0.9a; 102w<br />
On and playing a movie: 1.0a; 114w</p></blockquote>
<p>So, what I&#8217;m going to be retiring soon is one of the two satellite providers.  This is NOT an HD DVR, but it does have two tuners.  These DVRs are famous for using a lot of power so I was curious about its consumption.</p>
<blockquote><p>
Powered Off: 0.4a; 31w<br />
Powered on: 0.4a; 32w<br />
Recording 1 show: 0.4a; 32w<br />
Recording 2 shows: 0.4a; 32w</p></blockquote>
<p>Interesting results here but not that surprising.  If you think about it, this DVR is recording shows all the time but throwing the show away if I&#8217;m not setting it to record.  I think this is why the power consumption is not that different from when it is &#8216;asleep&#8217; and when it is recording shows including two shows at once.</p>
<p>So, lets take a look at the Boxee power consumption.  I&#8217;ve got the Boxee Live TV USB dongle to let me play OTA (Over The Air) shows.  Also, on that system, I&#8217;ll be playing shows over the Internet and via Netflix.</p>
<blockquote><p>
Powered Off: 0.0a; 0.0w<br />
Powered On w Live TV USB: 0.2a; 13w<br />
Powered On w/o Live TV USB: 0.2a; 13w<br />
Sleep w/o Live TV USB: 0.2a; 11w<br />
Sleep w Live TV USB: 0.2a; 13w<br />
Playing Netflix show: 0.2a; 11w<br />
Playing Internet show: 0.2a; 12w</p></blockquote>
<p>There you go.  The Boxee Box is quite conservative with power consumption.  I&#8217;d guess that since this box is so quiet.  There is some sort of fan, but it must be very small.  The satellite DVR uses twice the power as the Boxee Box but that&#8217;s not too bad considering that it&#8217;s spinning a physical hard drive in the box, plus the fan.  My HTPC is the pig in the story, but it also wasn&#8217;t designed to be low power.</p>
<p>The cost per year for these systems is very low, but I thought it would be a very interesting comparison to make.  Bottom line, the TV is the big pig of this group.</p>
]]></content:encoded>
			<wfw:commentRss>http://cully.biz/2012/02/10/boxee-power-consumption/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Merchant Data Feed Update</title>
		<link>http://cully.biz/2011/09/07/google-merchant-data-feed-update/</link>
		<comments>http://cully.biz/2011/09/07/google-merchant-data-feed-update/#comments</comments>
		<pubDate>Wed, 07 Sep 2011 13:27:28 +0000</pubDate>
		<dc:creator>kcully</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Data Feed]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Merchant]]></category>

		<guid isPermaLink="false">http://cully.biz/?p=386</guid>
		<description><![CDATA[I have a client that lives and dies with Google for his business. Adwords, organics, and Shopping Results are key to driving traffic and orders through his business. On September 22nd, Google is updating their requirements for the feed they accept for their Merchant accounts. We were successfully uploading over 6,000 items into their feeds [...]]]></description>
				<content:encoded><![CDATA[<p>I have a client that lives and dies with Google for his business.  Adwords, organics, and Shopping Results are key to driving traffic and orders through his business.</p>
<p>On September 22nd, Google is updating their requirements for the feed they accept for their Merchant accounts.  We were successfully uploading over 6,000 items into their feeds previously and I needed to check that our feed would be accepted.</p>
<p>Luckily for me, Google recently added the ability to &#8216;test&#8217; the data feed.  I tried our old feed: 0 (zero) items imported.  After taking a closer look at the new requirements, basically there was a re-arranging of the deck chairs.  I created a new data feed, with new captions and a couple of their new required fields.  Still 0 (zero) items imported.</p>
<p>After scaling down my test from 6,000+ items to 10, I was able to quickly turn test iterations around and found the simple solution to get the import to work.  The past data feed required double quotes around strings in their TAB delimited format.  This new format requires that there not be any double quotes at all.  Basically the TAB character does all delineation between fields.  Make sure that none of your fields include a TAB character in any of the strings or you&#8217;ll lose that record on the import.</p>
<p>Simple solution but it took me a small bit to figure out the difference from the old feed to the new one.  I hope this post saves you a few minutes as well.</p>
]]></content:encoded>
			<wfw:commentRss>http://cully.biz/2011/09/07/google-merchant-data-feed-update/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Real Studio not ready for Ubuntu 11.04 &#8230; yet.</title>
		<link>http://cully.biz/2011/05/04/real-studio-not-ready-for-ubuntu-11-04/</link>
		<comments>http://cully.biz/2011/05/04/real-studio-not-ready-for-ubuntu-11-04/#comments</comments>
		<pubDate>Wed, 04 May 2011 14:31:46 +0000</pubDate>
		<dc:creator>kcully</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[REALbasic]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[11.04]]></category>
		<category><![CDATA[Graphics]]></category>
		<category><![CDATA[Images]]></category>
		<category><![CDATA[REAL Studio]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://cully.biz/?p=381</guid>
		<description><![CDATA[I recently upgraded my test laptop from Ubuntu 10.10 to Ubuntu 11.04 with the new Unity interface. I&#8217;m going to take this laptop to the Detroit Area Users Group for a demonstration of Real Studio and I thought I&#8217;d demonstrate it on the latest and greatest Ubuntu. A small problem however. No graphic images show [...]]]></description>
				<content:encoded><![CDATA[<p>I recently upgraded my test laptop from Ubuntu 10.10 to Ubuntu 11.04 with the new Unity interface.  I&#8217;m going to take this laptop to the Detroit Area Users Group for a demonstration of Real Studio and I thought I&#8217;d demonstrate it on the latest and greatest Ubuntu.</p>
<div class="wp-caption alignright" style="width: 339px"><img alt="" src="http://cully.biz/demo/REALbasic/rs2011r11.png" width="329" height="306" /><p class="wp-caption-text">No graphics show in Real Studio IDE on Ubuntu 11.04</p></div>
<p>A small problem however.  No graphic images show up in the Real Studio interface.  I switched Ubuntu back to GNOME classic thinking it may have been the Unity interface causing the problem.  No good.  The images in the IDE still were not showing up.  Perhaps it was because I did an &#8220;Upgrade&#8221; from 10.10 to 11.04.  </p>
<blockquote><p>This upgrade takes a LOOOONG time because of the download time to get all of those files.  I recommend doing a fresh install of Ubuntu.  By downloading using a torrent, the ISO comes down in minutes.  Install onto a flash drive and an install takes about 30 minutes total.  With the upgrade route, you&#8217;re looking at a couple of hours.</p></blockquote>
<p>I did a fresh install of 11.04 and still no good.  I did a fresh install of 10.10 and &#8230; the images were there.  I liked GNOME better than the current Unity interface anyway.</p>
<p>Please don&#8217;t think I&#8217;m bad mouthing Real Studio.  William Yu responded quickly to my posting on the forum and they&#8217;ll be looking into it and will probably have it corrected for Real Studio 2011 release 2.  Especially if I help them test in the next beta cycle.  Yup, I can be of help for the issues that affect me.  This is a situation where the rapid release cycle, and an open beta-testing program really helps.</p>
<p>This issues, I&#8217;m sure are a small one.  Probably having to do somehow with the internal representation of pathing to the graphics that appear in the IDE.  Straighten that out and Real Studio is back in business.  In the mean time, hold off on upgrading to Ubuntu 11.04 if you do development in Linux until the next release.</p>
]]></content:encoded>
			<wfw:commentRss>http://cully.biz/2011/05/04/real-studio-not-ready-for-ubuntu-11-04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>World Memory Project &#8211; Windows Only &#8211; WTH?</title>
		<link>http://cully.biz/2011/05/04/world-archives-project-windows-only-wth/</link>
		<comments>http://cully.biz/2011/05/04/world-archives-project-windows-only-wth/#comments</comments>
		<pubDate>Wed, 04 May 2011 12:05:44 +0000</pubDate>
		<dc:creator>kcully</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Genealogy]]></category>
		<category><![CDATA[Windows Only]]></category>

		<guid isPermaLink="false">http://cully.biz/?p=376</guid>
		<description><![CDATA[You may not know this factoid about me, but I&#8217;ve been researching my family history, doing the whole Genealogy thing. Ancestry.com is an almost &#8216;must have&#8217; subscription to help speed along the research. You can do a lot with free web sites and lots of research, but Ancestry.com helps. I received an email from them [...]]]></description>
				<content:encoded><![CDATA[<p>You may not know this factoid about me, but I&#8217;ve been researching my family history, doing the whole Genealogy thing.  Ancestry.com is an almost &#8216;must have&#8217; subscription to help speed along the research.  You can do a lot with free web sites and lots of research, but Ancestry.com helps.</p>
<p>I received an email from them describing the <a href="http://www.worldmemoryproject.org/?o_iid=47505&#038;o_lid=47505">World Archives Memory Project</a>.</p>
<blockquote><p>The World Memory Project uses software and processes developed by the Ancestry World Archives Project, an established community that has spent years helping to preserve historical documents and make them available online for free.<br />
It starts with the United States Holocaust Memorial Museum creating digital images of historical documents. Then, using special software developed by Ancestry.com, contributors like you help make these documents searchable online by typing or “keying” information from the digital images into a database.</p></blockquote>
<p>Cool.  I love to give back.  I&#8217;d love to be able to help others research their forefathers, especially when it will be made available for free.  I&#8217;m a good typist and I can code tags or whatever is needed.  I&#8217;m ready to sign up and get more information on what I need to do&#8230;</p>
<p>The software is Windows only.  Dang.  Really?  This is 2011.  They describe that Mac users need to run this in a Virtual Machine.  I&#8217;m a big Linux user and I could do the same thing but &#8230; dang.  I know they&#8217;ve just lost a *LOT* of their contributors right there!  A good number of their potential customers won&#8217;t know what a virtual machine is, even though Parallels is pretty easy.  </p>
<p>I was hoping to be able to type in the information in OpenOffice (Libre Office) and then paste it into a web form, or even use some sort of AJAXy web application to enter the information.  If I&#8217;ve got to start up a Virtual Machine, and probably one just to install this software on, and *then* hope it submits correctly to their service, well, that&#8217;s too much work.  </p>
<p>I&#8217;m disappointed.  I was hoping to be able to help some people out but I&#8217;m thinking this is too much work now.  I&#8217;ve got a business to run, and I already volunteer a lot of my time to charity.  I&#8217;m sorry customers of World Archives Project!  It&#8217;s a darn shame.</p>
]]></content:encoded>
			<wfw:commentRss>http://cully.biz/2011/05/04/world-archives-project-windows-only-wth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux notify-send &#8211; time parameter ignored</title>
		<link>http://cully.biz/2011/04/29/linux-notify-send-time-parameter-ignored/</link>
		<comments>http://cully.biz/2011/04/29/linux-notify-send-time-parameter-ignored/#comments</comments>
		<pubDate>Fri, 29 Apr 2011 19:51:38 +0000</pubDate>
		<dc:creator>kcully</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[notifications]]></category>
		<category><![CDATA[notify-send]]></category>
		<category><![CDATA[timeout]]></category>

		<guid isPermaLink="false">http://cully.biz/?p=373</guid>
		<description><![CDATA[I&#8217;m trying to add some notification capabilities to a cross-platform application that I am building. On Linux I was happy to find the notify-send utility which does a nice job of notifying the user that something occurred inside of the application. Something was strange about it though. The expiration-time parameter is ignored. No matter what [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;m trying to add some notification capabilities to a cross-platform application that I am building.  On Linux I was happy to find the notify-send utility which does a nice job of notifying the user that something occurred inside of the application.  Something was strange about it though.  The expiration-time parameter is ignored.  No matter what I set the -t option to be, the notification still displayed the same duration of time.</p>
<p><code>notify-send -t 10 "Header" "Body"</code></p>
<p>After Googling around for a while, I ran across a <a href="https://bugs.launchpad.net/ubuntu/+source/notify-osd/+bug/390508">message board</a> confirming what I was suspecting.  Evidently this has been the behavior since 2009 at least and people are asking for a change in the documentation.</p>
<p>I would agree that the documentation should be changed to reflect the current state of the command.  I&#8217;m a bit sad that this change has been needed for several years now and someone hasn&#8217;t been able to get the change in the documentation, or better yet, change the command so the notification timeout is honored.</p>
<p>I hope this helps someone else confirm this behavior more quickly than I was able.</p>
]]></content:encoded>
			<wfw:commentRss>http://cully.biz/2011/04/29/linux-notify-send-time-parameter-ignored/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  cully.biz/feed/ ) in 0.57181 seconds, on Jun 20th, 2013 at 7:52 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on Jun 20th, 2013 at 8:52 am UTC -->
<!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
<!-- Quick Cache Is Fully Functional :-) ... A Quick Cache file was just served for (  cully.biz/feed/ ) in 0.00097 seconds, on Jun 20th, 2013 at 8:37 am UTC. -->