<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title><![CDATA[Calevinci]]></title>
    <link>http://calevinci.com/feed</link>
    <description><![CDATA[]]></description>
    <pubDate>Tue, 24 Jan 2012 06:32:19 +0000</pubDate>
    <generator>Zend_Feed</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <item>
      <title><![CDATA[Tomato Gives My Linksys New Lease On Life]]></title>
      <link>http://calevinci.com/dev/news/view/4a1464217ce18</link>
      <description><![CDATA[Tomato Gives My Linksys New Lease On Life]]></description>
      <content:encoded><![CDATA[<p>My internet connection has been really flakey lately, so I thought perhaps I should try upgrading my old wireless router, a Linksys WRT54G v4, to see if that was the problem. Before plopping down the dough for a new 802.11n router, I decided to give the Tomato firmware replacement a shot. It worked like magic! Without spending a dime, I now have a far superior internet connection with bandwidth monitoring and local DNS hostnames that actually work. In bandwidth testing, my connection speed doubled (from 3Mbps to 7Mbps for download speeds on one test server), and the annoying browser latency I had been experiencing seemed to vanish. Anyhow, I highly recommend trying Tomato out if you're not afraid of upgrading your router's firmware: <a href="http://www.polarcloud.com/tomato">http://www.polarcloud.com/tomato</a></p>]]></content:encoded>
      <pubDate>Wed, 20 May 2009 20:13:09 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Old Internet Explorer Versions in a VirtualPC]]></title>
      <link>http://calevinci.com/dev/news/view/49ff33f6ac8dc</link>
      <description><![CDATA[Old Internet Explorer Versions in a VirtualPC]]></description>
      <content:encoded><![CDATA[<p>If you need to test a website in a different version of Internet Explorer from the one you have installed, Microsoft provides VirtualPC images for Internet Explorer 6.0 and later, which can be downloaded <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=21EABB90-958F-4B64-B5F1-73D0A413C8EF&amp;displaylang=en">here</a>. For older versions of Internet Explorer (3.0, 4.01, 5.01, and 5.5), there's a nifty installer at this <a href="http://tredosoft.com/Multiple_IE">site</a>, which will install them all for you. I'd recommend installing that on top of the virtual machine for 6.0 (rather than your regular environment) given the likelihood of unpatched security holes in old versions of Internet Explorer.</p>]]></content:encoded>
      <pubDate>Mon, 04 May 2009 18:29:27 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Multiple Home Servers with Dynamic DNS and mod_proxy]]></title>
      <link>http://calevinci.com/dev/news/view/49efbf7517cfc</link>
      <description><![CDATA[Multiple Home Servers with Dynamic DNS and mod_proxy]]></description>
      <content:encoded><![CDATA[<p>Even if you have a dynamic IP address with your home internet service, you can still set up multiple home servers accessible from the external internet using dynamic DNS and Apache with mod_proxy. The first step is to set up an account at http://www.dyndns.com/ and request a domain name that will be mapped back to your house. Let's say you pick "yourhouse.homeip.net" which will connect to your main home server, and you have two other home servers which you want to connect to using "server1.yourhouse.homeip.net" and "server2.yourhouse.homeip.net". The basic diagram for how everything will be connected follows:</p>
<p><img src="/dev/news/file/49efbf7517cfc/DynamicDNSMultipleServersInHome.png" alt="" /></p>
<p>Dynamic DNS will direct internet traffic to your home router. Port forwarding will forward incoming traffic on port 80 on the router to port 80 on your main server. The mod_proxy Apache settings will redirect HTTP traffic intended for server1 and server2 over to those servers through the main server.</p>
<p>You can manually update your IP address at dyndns.com, but once your home IP address changes, that information will be out of date. Linksys routers (and possibly other brands) come with dynamic DNS clients that will update your IP address for you when it changes. Alternatively, you can install a dynamic DNS client on one of your home machines that will connect to the internet on a regular interval to keep your home IP up to date.</p>
<p>Usually, your router will block all incoming traffic from the internet to your home network. You can set up port forwarding to redirect traffic on specific ports to ports on your internal servers. Check out your router's documentation for how to configure port forwarding.</p>
<p>Dynamic DNS and port forwarding will let you hook up one server. To add server1 and server2, we need a way to direct requests for those servers through the main server. This is where mod_proxy for Apache comes in (if you're not using Apache, you're on your own at this point). We will set up virtual host entries for the other internal servers and use the ProxyPass directive to forward traffic intended for the subdomains. You will modify your httpd.conf file as follows:</p>
<p>1. Uncomment following lines:</p>
<p style="padding-left:30px;">LoadModule proxy_module modules/mod_proxy.so<br />LoadModule proxy_http_module modules/mod_proxy_http.so</p>
<p>2. Add following lines:</p>
<p style="padding-left:30px;">ProxyRequests On<br />NameVirtualHost *<br /><br />&lt;VirtualHost *&gt;<br />ServerName server1.yourhouse.homeip.net<br />ProxyPass / http://192.168.1.110/<br />&lt;/VirtualHost&gt;</p>
<p style="padding-left:30px;">&lt;VirtualHost *&gt;<br /> ServerName server2.yourhouse.homeip.net<br /> ProxyPass / http://192.168.1.111/<br /> &lt;/VirtualHost&gt;</p>
<p>where 192.168.1.110 and 192.168.1.111 are internal ip addresses or machine names for your internal servers.</p>
<p>Then, restart your Apache server and you should be able to connect to your machines.</p>]]></content:encoded>
      <pubDate>Thu, 23 Apr 2009 03:05:29 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[SharpScraps .NET Code Library]]></title>
      <link>http://calevinci.com/dev/news/view/49eac1c2e891c</link>
      <description><![CDATA[SharpScraps .NET Code Library]]></description>
      <content:encoded><![CDATA[<p>SharpScraps is a collection of C# source code I put up on SourceForge.net some time ago. Rather than a cohesive library framework that you would rely on as a stable API, SharpScraps is just buckets of code that shows how to do some interesting things with .NET that you can include in your own projects (SharpScraps is licensed under the MIT license). Previously, you had to get the source from the subversion repository, but I just posted a zip file with the code that you can grab <a href="http://sourceforge.net/project/showfiles.php?group_id=189757">here</a>.</p>
<h3>SharpScraps Highlight of the Day<br /></h3>
<h4>Voice Recognition and Text-to-Speech</h4>
<p>SharpScraps.Speech contains some wrappers for the Windows APIs for voice recognition and text to speech conversion (see SharpScrapsExamples/TextToSpeech and SharpScrapsExamples/VoiceRecognition in the code drop to see how to use them). Voice recognition opens up some interesting possibilities. A few years ago (long before the Ford Sync voice control commercials started showing up), I put together a voice control program for iTunes. It used the iTunes COM control for retrieving the list of music in the library and used that as the basis for the phrase list fed into the SharpScraps.Speech.Recognition.PhraseRecognizer class (names such as "U2" were replaced with "you two" to help the system out). Then, if you said "Metallica", it would kick off a playlist containing all of your "Metallica" songs. If you said "still haven't found what i'm looking for", it would tell iTunes to play just that one song. At one point, I had the hopes of hooking up a Bluetooth earpiece, so I could walk around the house controlling my computer and asking it for information. Unfortunately, the Bluetooth drivers never seemed to support the headset profile, and even if they do now, I suspect the audio quality might not be high enough to make things work smoothly.</p>
<p>Text-to-Speech is the reverse of voice recognition. It takes textual input and converts it into audio. The SharpScraps example shows how to play the audio aloud or save it as a WAV file. The test dialog will let you select from any voice that is installed on the system. I believe Microsoft Anna is the only voice that comes with Windows, but better voices can be licensed from third-parties. On Windows XP, you might have to manually install the speech SDK (google 'microsoft sapi sdk'), or Microsoft Office might have installed it for you.</p>
<p>Anyhow, much fun is to be had with voice recognition and text-to-speech. Knock yourself out.</p>]]></content:encoded>
      <pubDate>Sun, 19 Apr 2009 06:41:43 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Home Control with ZWave and .NET]]></title>
      <link>http://calevinci.com/dev/news/view/49e7ea1f3faf4</link>
      <description><![CDATA[Home Control with ZWave and .NET]]></description>
      <content:encoded><![CDATA[<p>ControlThink has a <a href="http://controlthink.com/">C# SDK for home automation via ZWave</a>. ZWave is a low-power wireless mesh network that can connect devices within the home. I have a few light switches installed in my house. You can also get ZWave-enabled thermostats, door/motion sensors, and other sorts of devices. I just set up a home web server and turned my lights on via my cell phone for the first time just now.</p>]]></content:encoded>
      <pubDate>Fri, 17 Apr 2009 02:34:44 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Facebook Connect Support]]></title>
      <link>http://calevinci.com/flowbasis/news/view/49e57c4c4793f</link>
      <description><![CDATA[Facebook Connect Support]]></description>
      <content:encoded><![CDATA[<p>I recently added support for Facebook Connect to FlowBasis. Now, user accounts can be linked with Facebook accounts to allow users to log in using Facebook's single sign-in scheme. Currently, the admin needs to associate the Facebook account with a FlowBasis account, but in the not too distant future, users will be able to do that themselves. Users now have three options for account authentication: username/password, OpenID, and Facebook Connect.</p>]]></content:encoded>
      <pubDate>Wed, 15 Apr 2009 06:20:06 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Flash-based Open-source Charting]]></title>
      <link>http://calevinci.com/dev/news/view/49de883216984</link>
      <description><![CDATA[Flash-based Open-source Charting]]></description>
      <content:encoded><![CDATA[<p>I was looking around today for a decent open-source charting solution and came across Open Flash Chart. It's available under the LGPL and uses JSON as its native data format (yay). I've just been tinkering around with it this afternoon for a little while, but so far, I'd say it's definitely worth checking out.</p>
<p><a href="http://teethgrinder.co.uk/open-flash-chart-2/">http://teethgrinder.co.uk/open-flash-chart-2/</a></p>]]></content:encoded>
      <pubDate>Thu, 09 Apr 2009 23:44:07 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Events on the Documentation Wiki]]></title>
      <link>http://calevinci.com/flowbasis/news/view/49da54d35c95a</link>
      <description><![CDATA[Events on the Documentation Wiki]]></description>
      <content:encoded><![CDATA[<p>I just kicked off the FlowBasis documenation wiki with some information on events. Check it out <a href="http://calevinci.com/flowbasis/docs/events">here</a>.</p>]]></content:encoded>
      <pubDate>Mon, 06 Apr 2009 19:15:44 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Windows-style auto-completion in Linux]]></title>
      <link>http://calevinci.com/dev/news/view/49da46ddb224e</link>
      <description><![CDATA[Windows-style auto-completion in Linux]]></description>
      <content:encoded><![CDATA[<p>This <a href="http://spoonmanwos.blogspot.com/2006/02/bash-completion.html">blog</a> has some info on enabling Windows-style command line auto-completion in Linux. Essentially, you add the following lines to your /etc/inputrc file:</p>
<p>set completion-ignore-case on<br /> # Ignore case when doing completion</p>
<p>set mark-directories on<br /> # Completed dir names have a slash appended</p>
<p>set visible-stats on<br /> # List ls -F for completion</p>
<p>"\C-i": menu-complete<br /> # Cycle through ambiguous completions instead of list</p>
<p>#set show-all-if-ambiguous on<br /> # List possible completions instead of ringing bell</p>]]></content:encoded>
      <pubDate>Mon, 06 Apr 2009 18:17:27 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Ratings and Comments for All]]></title>
      <link>http://calevinci.com/flowbasis/news/view/49d990b122654</link>
      <description><![CDATA[Ratings and Comments for All]]></description>
      <content:encoded><![CDATA[<p>Any module can now take advantage of the resource ratings and comment systems. Check out core-classes/FlowBasis/Ratings and core-classes/FlowBasis/Comments for the implementations and look to core-classes/FlowBasis/Blogging for an example of how to incorporate these features into one of your modules.</p>]]></content:encoded>
      <pubDate>Mon, 06 Apr 2009 05:18:48 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Goals]]></title>
      <link>http://calevinci.com/flowbasis/news/view/49d5b18c13d98</link>
      <description><![CDATA[Goals]]></description>
      <content:encoded><![CDATA[<p>The common question asked of me when I mention I'm building a web framework is, "Why build a new one?". I believe I can provide something of value to the software community, and I believe I need the flexibility of controlling the conventions of the base system to realize my vision. I want to provide a system that easily enables rich interaction between different components on both the client and the server, and I want there to be an expectation of a certain environment available wherever code is being run. Search, ratings, and widgets would be a few possible examples of this type of integration.</p>
<p>Blogs, wikis, and a software release repository would be types of "modules". By software repository, I mean something that would track the latest release of QuoteBlizzard or FlowBasis and know the latest version numbers and download links.</p>
<p>"Modules" tend to contain "resources" that should be searchable and/or rateable. Blogs have posts and comments. Wikis have user created pages. Software release repositories have projects. A developer should be able to create a custom module that tells FlowBasis, "Here are my resources," and FlowBasis should be able to incorporate them into the search engine and provide ratings tracking.</p>
<p>"Modules" also tend to have information that would be nice to easily incorporate into other page views in the form of "widgets". A blog could publish "widgets" for its tag cloud or recent posts. A wiki could publish "widgets" for top-rated pages or most recently updated pages. A software release repository could expose a "widget" that displays the most recent software releases with a download link.</p>
<p>Any page view can incorporate widget panels, and widget panels can be configured through an AJAX-y interface. For instance, you can add a widget panel to your main site page and through the browser (if you have permissions), you can add widgets by browsing through a list of available widget templates provided by modules, or configure existing widgets (such as change the URL on a feed listing widget or change the maximum number of displayed feed entries).</p>]]></content:encoded>
      <pubDate>Fri, 03 Apr 2009 06:53:04 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[JSON, JSON, Everywhere]]></title>
      <link>http://calevinci.com/flowbasis/news/view/49d282a8adfd1</link>
      <description><![CDATA[JSON, JSON, Everywhere]]></description>
      <content:encoded><![CDATA[<p>JSON stands for JavaScript Object Notation, and if you dig through the source, you'll quickly realize that JSON is the preferred format of choice for FlowBasis. JSON is easily usable from client-side javascript or within PHP on the server. It's the format objects are transmitted in from the client to the server and back again for remote procedure calls (AJAX stuff), and it's the format of objects saved in the FlowBasis object store.</p>
<p>A sample JSON object declaration might look like (in Javascript, the quotes aren't required around "username" or "favoriteNumbers"):</p>
<p>{ "username" : "bob", "favoriteNumbers" : [42, 37, 100] }</p>
<p>In PHP, this could be declared as:</p>
<p>$bob = new stdClass;<br />$bob-&gt;username = "bob";<br />$bob-&gt;favoriteNumbers = array(42, 37, 100);</p>
<p>and it could be converted to JSON with:</p>
<p>$json = json_encode($bob);</p>
<p>But, usually, the FlowBasis infrastructure will convert the PHP object into JSON where needed.</p>]]></content:encoded>
      <pubDate>Tue, 31 Mar 2009 21:03:36 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Routing Basics]]></title>
      <link>http://calevinci.com/flowbasis/news/view/49d25a807b8e6</link>
      <description><![CDATA[Routing Basics]]></description>
      <content:encoded><![CDATA[<p>All requests to a FlowBasis site are routed through the route.php file (via mod_rewrite) which sets up the FlowBasis environment and hands off the request to the routing manager (FlowBasis_Routing_RoutingManager). The routing manager finds the appropriate request handler for the request URI and passes off the processing to it.</p>
<p>The three basic types of request handlers are:</p>
<ul><li>Basic file handler</li>
<li>Page request handler</li>
<li>Site path request handler (extensible handler model used by modules)</li>
</ul><p>The basic file handler is for requests that map to a static file (html, png, gif, javascript, css, etc) and just returns the file contents.</p>
<p>The page request handler kicks off the page processing model (see a future post for details on that).</p>
<p>The site path request handler system is used by modules (blog, wiki, etc) to register for requests to particular URIs. Custom site path request handlers can also be created by developers interested in doing something completely different with a request.</p>
<p>The process of selecting the appropriate request handler goes through a series of steps, which essentially boils down to picking the request handler that is interested in the longest prefix of the request uri.</p>
<p>Consider the following scenario, where a user makes a request to get http://test.calevinci.com/flowbasis/someblog/img/hello.png.</p>
<p>Let's assume the following:</p>
<ul><li>FlowBasis is installed in /var/www/flowbasis (and test.calevinci.com maps to /var/www). This means that /someblog/img/hello.png is the site path. /flowbasis is the request URI root.</li>
<li>The file /var/www/flowbasis/pages/someblog/img/hello.png exists.</li>
<li>A blog module is set up and registered with the site path someblog.</li>
</ul><p>The routing manager will look in several places for possible matches. It will look in the pages and core-pages directories for files and pages (core-pages is for the FlowBasis infrastructure, and sites built on FlowBasis should use pages). The routing manager will also look at registered site path handlers.</p>
<p>The basic file request handler will want to process the request with a matching site path of /someblog/img/hello.png. The module site path handler will want to process the request with a matching site path of /someblog (with an extended site path of /img/hello.png). The basic file request handler has a longer matching site path, so it wil get to process the request.</p>
<p>Now's let assume the user makes a request to get http://test.calevinci.com/flowbasis/someblog/tags/trees.</p>
<p>No file exists at either /var/www/flowbasis/core-pages/someblog/tags/trees or  /var/www/flowbasis/pages/someblog/tags/trees, so the module request handler will get the request with a matching site path of /someblog and can map the extended site path of /tags/trees to a page with recent posts tagged with trees.</p>]]></content:encoded>
      <pubDate>Tue, 31 Mar 2009 18:46:29 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[OpenID Support]]></title>
      <link>http://calevinci.com/flowbasis/news/view/49d24bdde080f</link>
      <description><![CDATA[OpenID Support]]></description>
      <content:encoded><![CDATA[<p>FlowBasis supports the use of OpenID for logging in. Users can go to their account profile page to associate an OpenID identifier with their account and from then on, they can sign in using the OpenID login system.</p>]]></content:encoded>
      <pubDate>Tue, 31 Mar 2009 16:59:19 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Look, Ma! No SQL!]]></title>
      <link>http://calevinci.com/flowbasis/news/view/49d1a033a62cb</link>
      <description><![CDATA[Look, Ma! No SQL!]]></description>
      <content:encoded><![CDATA[<p>Rather than rely on a SQL server for tracking users, blog posts, and such, FlowBasis uses a JSON object store for persisting, retrieving, and updating objects (see FlowBasis_Data_FileObjectStore for implementation). Relational databases have any number of niceties, including being well-understood, well-tested, and providing a known structure for data. However, databases are frequently very slow in shared hosting environments and mapping the objects we tend to use as programmers to relatational tables can be tedious. While the merits of SQL databases versus the free-form object store could be debated at length, I'll leave it at that for now.</p>
<p>The object store provides a few basic methods: getObject, saveObject, and updateObject. Beyond that, there are a few additional methods for retrieving lists of objects and locking objects for synchronization. The default implementation of FlowBasis_Data_IObjectStore saves and loads everything to and from the file system, but the door is open for future implementations which use a database or the "cloud" for storage (though I imagine more intelligent use of caching would become necessary as the object store moves farther away from the local server).</p>
<p>All that said, if you really want to use SQL with FlowBasis, you're welcome to use it. FlowBasis incorporates the open-source adodb library and provides a management panel for configuring connections and trying out SQL queries.</p>]]></content:encoded>
      <pubDate>Tue, 31 Mar 2009 05:21:34 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[General Concepts of FlowBasis]]></title>
      <link>http://calevinci.com/flowbasis/news/view/49d196f58a795</link>
      <description><![CDATA[General Concepts of FlowBasis]]></description>
      <content:encoded><![CDATA[<p>Just to summarize a few general concepts available within FlowBasis...</p>
<ul><li><strong>Pages </strong>can contain <strong>controls </strong>which can contain other <strong>controls</strong>.</li>
<li><strong>Pages </strong>and <strong>controls </strong>can communicate from browser to server via remote procedure calls (JSON-<strong>RPC</strong>).</li>
<li><strong>Modules </strong>(blog, wiki, etc) contain <strong>resources </strong>(posts, comments, pages, etc).</li>
<li><strong>Resources </strong>are indexed for searching.</li>
<li><strong>Modules</strong> (blog, wiki, etc) or other sources can publish <strong>widgets</strong> (recent posts, tag cloud, html snippets) that can be embedded in other pages.</li>
<li><strong>Resources </strong>can be <strong>rated</strong>.</li>
<li>Anything can publish <strong>events</strong> to the <strong>event manager</strong>. Anything can subscribe to <strong>events</strong> with an <strong>event handler</strong>.</li>
<li><strong>Task handlers</strong> can be registered to perform <strong>tasks </strong>that must be done periodically in the background (like cleaning cache).</li>
<li><strong>Installers</strong> manage adding and removing features/modules/whatever from the system.</li>
<li><strong>Permissions </strong>define what users can do within <strong>modules</strong> (such as post an entry to a blog).</li>
<li>Users can have <strong>roles</strong> which grant them <strong>permissions</strong> (such as only admin and author could post an entry to a blog).</li>
<li><strong>Roles</strong> can apply to specific contexts (user can be admin for whole site or just a particular blog).</li>
<li><strong>Themes</strong> collaborate with <strong>pages</strong> and <strong>controls</strong> to determine the visual style of the site.</li>
</ul>]]></content:encoded>
      <pubDate>Tue, 31 Mar 2009 07:04:31 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[Adding your content]]></title>
      <link>http://calevinci.com/flowbasis/news/view/49d19668889ac</link>
      <description><![CDATA[Adding your content]]></description>
      <content:encoded><![CDATA[<p>There are a few ways to add your content into a FlowBasis based site.</p>
<ul><li>Add a file (regular old PHP, HTML, png, gif, whatever) within the "pages" folder.</li>
<li>Add a FlowBasis_UI_Page declaration in a PHP file with FlowBasis::setPageClass('NameOfPageClass') within the "pages" folder.</li>
<li>Use one of the built-in modules (currently blog and wiki).</li>
<li>Create your own module class.</li>
<li>Register a site path request handler with the routing manager and use your imagination from there.</li>
</ul><p>Over the next few days, I'll try to make a series of posts to give the general idea of what you can do with FlowBasis, so stay tuned...</p>]]></content:encoded>
      <pubDate>Tue, 31 Mar 2009 05:20:45 +0000</pubDate>
    </item>
    <item>
      <title><![CDATA[FlowBasis is up and running]]></title>
      <link>http://calevinci.com/flowbasis/news/view/49d0660c477b3</link>
      <description><![CDATA[FlowBasis is up and running]]></description>
      <content:encoded><![CDATA[<p>FlowBasis the new PHP web framework I've been working on. The source is available on <a href="https://sourceforge.net/projects/flowbasis/">sourceforge.net</a>. It's still very much a work in progress, but this site is now running on the platform.</p>]]></content:encoded>
      <pubDate>Mon, 30 Mar 2009 06:26:29 +0000</pubDate>
    </item>
  </channel>
</rss>
