<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
  <title>Michael Melanson</title>
  <link href="http://michaelmelanson.net/"/>
  <link type="application/atom+xml" rel="self" href="http://michaelmelanson.net/atom.xml"/>
  <updated>2011-11-01T13:52:51-07:00</updated>
  <id>http://michaelmelanson.net/</id>
  <author>
    <name>Michael Melanson</name>
    <email>michael@michaelmelanson.net</email>
  </author>

  
  <entry>
    <id>http://michaelmelanson.net//2011/10/25/senchacon-2011-day-3</id>
    <link type="text/html" rel="alternate" href="http://michaelmelanson.net/2011/10/25/senchacon-2011-day-3"/>
    <title>SenchaCon 2011: Day 3</title>
    <updated>2011-10-25T00:00:00-07:00</updated>
    <author>
      <name>Michael Melanson</name>
      <uri>http://michaelmelanson.net/</uri>
    </author>
    <content type="html">&lt;h1 id='designing_sencha_touch_interfaces_with_designer_2'&gt;Designing Sencha Touch interfaces with Designer 2&lt;/h1&gt;

&lt;p&gt;Not much to say about this session. It was a walkthrough of developing a simple application in Designer 2.&lt;/p&gt;

&lt;h2 id='qa'&gt;Q&amp;amp;A&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;If you edit the UI file outside of Designer, will it work?&lt;/strong&gt; You can edit them, but the changes will be overwritten the next time you export.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;(Something about Intellisense)&lt;/strong&gt; No, but Intellisense is something they want to add in the future.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Does Designer support the MVC architecture?&lt;/strong&gt; It does generate views, but not controllers or models yet. These will be supported in the final version of 2.0.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Is it safe to develop applications now? Will the file format change?&lt;/strong&gt; It should be safe, but no guarantees. The file format is fairly stable now.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Can you re-use generated code in Designer between Ext.JS and Sencha Touch?&lt;/strong&gt; No, you can&amp;#8217;t share code between an Ext.JS project and a Sencha Touch project in Designer.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Does Designer support Sencha.io services?&lt;/strong&gt; Yes, though it&amp;#8217;s limited now. It will support it better before the final version.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id='migrating_sencha_touch_1x_to_20'&gt;Migrating Sencha Touch 1.x to 2.0&lt;/h1&gt;

&lt;h2 id='layout'&gt;Layout&lt;/h2&gt;

&lt;p&gt;Rendering in Touch 2 as split into separate Creation and Placement processes, because creating a DOM element is very expensive. This also allows components to be removed from the DOM and re-used elsewhere. This is done automatically in some places, such as in the new Component View control, which caches components.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;render&lt;/code&gt; and &lt;code&gt;afterRender&lt;/code&gt; methods are no longer supported. The &lt;code&gt;render&lt;/code&gt; event is deprecated, but will still work.&lt;/p&gt;

&lt;p&gt;All layout is now done with CSS selectors. There is no Javascript-based measurement. This means that the &lt;code&gt;doLayout&lt;/code&gt;, &lt;code&gt;doComponentLayout&lt;/code&gt;, and &lt;code&gt;afterLayout&lt;/code&gt; no longer exist. As soon as a component is added to a container, it will be laid out by CSS.&lt;/p&gt;

&lt;p&gt;Because these methods mean that components are no longer notified when they need to adjust to size changes, they&amp;#8217;ve introduced the &lt;code&gt;Ext.util.SizeMonitor&lt;/code&gt; class which is bound to a control and fires events when the size of the control changes. Internally it adds two absolutely-positioned elements to the DOM to detect resizing, so this monitoring has a cost and shouldn&amp;#8217;t be over-used.&lt;/p&gt;

&lt;p&gt;Docking can now be done on any Container. The &lt;code&gt;DataPanel&lt;/code&gt; class is gone, and the &lt;code&gt;dockedItems&lt;/code&gt; property is deprecated.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Panel&lt;/code&gt; class is very barebones at this point. It&amp;#8217;s essentially the same as &lt;code&gt;Container&lt;/code&gt;. Sencha is debating whether to get rid of it.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;floating&lt;/code&gt; configuration is deprecated. Setting the &lt;code&gt;top&lt;/code&gt;, &lt;code&gt;left&lt;/code&gt;, &lt;code&gt;bottom&lt;/code&gt; and &lt;code&gt;right&lt;/code&gt; properties will now float components.&lt;/p&gt;

&lt;h2 id='properties'&gt;Properties&lt;/h2&gt;

&lt;p&gt;Getters and setters should now be used everywhere to access properties. This allows Sencha to do lazy instantiation, where the getter instantiates on first call, filtering and validation. Also it supports automatic property dependencies when you use getters.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;initComponent&lt;/code&gt; methods still exist but should rarely be used. Most of their code should go elsewhere.&lt;/p&gt;

&lt;h2 id='events'&gt;Events&lt;/h2&gt;

&lt;p&gt;Observable is now a mixin, not a base class, and the &lt;code&gt;Observable&lt;/code&gt;/&lt;code&gt;Observer&lt;/code&gt; classes are being replaced by &lt;code&gt;Publisher&lt;/code&gt;/&lt;code&gt;Subscriber&lt;/code&gt;. This is related to the new &amp;#8216;event bus&amp;#8217; architecture.&lt;/p&gt;

&lt;p&gt;They&amp;#8217;ve also introduced the &lt;code&gt;fireAction&lt;/code&gt; convenience method and the &lt;code&gt;eventedConfig&lt;/code&gt; property. The &lt;code&gt;eventedConfig&lt;/code&gt; method is similar to the &lt;code&gt;config&lt;/code&gt; property, but fires change events.&lt;/p&gt;

&lt;h2 id='qa'&gt;Q&amp;amp;A&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Will Sencha Touch support ordering multiple modals popups?&lt;/strong&gt; Yes, they will be adding a modal manager.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id='sencha_touch_2_performance'&gt;Sencha Touch 2 Performance&lt;/h1&gt;

&lt;p&gt;Primary concern in 2.0 development is performance. The rendering process has been very much simplified. Templates are no longer rendered from HTML strings; they&amp;#8217;re created as DOM nodes directly. These template DOM nodes are duplicated and loaded with the instance&amp;#8217;s data.&lt;/p&gt;

&lt;p&gt;The layout engine is entirely CSS-based instead of using Javascript-based measurement. Viewport handling, for hiding the address bar and determining the fullscreen view size (which is apparently a tricky and varies with different browsers, even between Android 2.2 and Android 2.3) has been re-architected to be much faster.&lt;/p&gt;

&lt;p&gt;They&amp;#8217;ve also added a clever system for patch updates of the application code, so only deltas (in a custom format) are transferred when the app code changes. The application code and build number are stored in local storage. When the application is reloaded, it requests a delta file from the server, and applies it to the code in local storage.&lt;/p&gt;

&lt;h2 id='qa'&gt;Q&amp;amp;A&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What are some things people do with Sencha that leads to bad performance?&lt;/strong&gt; Especially on Android devices, don&amp;#8217;t overuse CSS transforms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id='accessing_native_apis_from_sencha_touch'&gt;Accessing Native APIs from Sencha Touch&lt;/h1&gt;

&lt;p&gt;There are currently three independent sets of native APIs: the W3C, WAC, and Mozilla&amp;#8217;s Web API. These all overlap each other, and are incompatible.&lt;/p&gt;

&lt;p&gt;Tip: Weinre (pronounced &amp;#8220;winery&amp;#8221;) is a tool for remote debugging of PhoneGap applications.&lt;/p&gt;

&lt;p&gt;When standard Javascript APIs are not provided for something, you must use PhoneGap plugins to call native code.&lt;/p&gt;

&lt;h1 id='community_code_vgf'&gt;Community Code: VGF&lt;/h1&gt;

&lt;p&gt;VGF is Frankfurt&amp;#8217;s public transportation company. Nils Dehl&amp;#8217;s company developed a mobile app for VGF.&lt;/p&gt;

&lt;p&gt;The app allows searching for nearby stations, especially barrier-free stations, and information about delays.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://michaelmelanson.net//2011/10/24/senchacon-2011-day-2</id>
    <link type="text/html" rel="alternate" href="http://michaelmelanson.net/2011/10/24/senchacon-2011-day-2"/>
    <title>SenchaCon 2011: Day 2</title>
    <updated>2011-10-24T00:00:00-07:00</updated>
    <author>
      <name>Michael Melanson</name>
      <uri>http://michaelmelanson.net/</uri>
    </author>
    <content type="html">&lt;p&gt;Today&amp;#8217;s the first day of actual talks at SenchaCon. This post, and tomorrow&amp;#8217;s post, will mostly be notes I take during the talks. I&amp;#8217;ll post an analysis at the end of the conference.&lt;/p&gt;

&lt;h1 id='keynote'&gt;Keynote&lt;/h1&gt;

&lt;p&gt;Sencha&amp;#8217;s CEO was up first, talking about their vision for where Sencha is going. He highlighted three big trends they&amp;#8217;re riding: mobile, sharing, and HTML5. He pointed out that desktop sales have been flat now for some time but the mobile platforms (smartphones, tablets and even laptops) have been growing exponentially over the same time period. He says that sharing has become a core feature of apps these days; people expect it, and it&amp;#8217;s strange for an app to &lt;em&gt;not&lt;/em&gt; have sharing.&lt;/p&gt;

&lt;p&gt;Google talked about Chrome&amp;#8217;s role in revitalizing the development of web technologies, and especially about the Chromebook. One very interesting thing they pointed out was that there&amp;#8217;s a huge interest in Chromebooks from businesses and government. These organizations are very interested in them because they&amp;#8217;re stateless, which reduces administrative costs, and because many employees basically spend all their time in web browsers anyways.&lt;/p&gt;

&lt;p&gt;Jarvus Innovations demoed their custom t-shirt printing site which uses Ext.JS.&lt;/p&gt;

&lt;p&gt;Juniper also talked about their &amp;#8220;Junos Space&amp;#8221; platform, which uses Ext.JS. It also lets application developers create custom, hosted, applications using Ext.JS.&lt;/p&gt;

&lt;p&gt;Sencha&amp;#8217;s big vision for the future is that web technologies are going to take over app development, and expand into other devices. A big device they talked about is in-car dashboard apps that integrate with apps on other devices and use platform-specific sensors like gas levels. Maybe they&amp;#8217;ve got something in the works here that they&amp;#8217;re not talking about?&lt;/p&gt;

&lt;h1 id='introducing_sencha_touch_2'&gt;Introducing Sencha Touch 2&lt;/h1&gt;

&lt;h2 id='performance'&gt;Performance&lt;/h2&gt;

&lt;p&gt;The big focus in Sencha Touch 2 is performance. They claim improvements of 10-30% in startup time vs 1.1. It also has a new layout engine which uses the browser&amp;#8217;s CSS engine to lay out the components rather than laying them out via Javascript. This new engine improves layout performance; they showed a video where it does a re-layout of the kitchen sink app in 0.35s vs 0.98s. At that point, they say, the phone&amp;#8217;s layout animation is the limiting factor.&lt;/p&gt;

&lt;p&gt;They also improved interaction performance by using &amp;#8216;selective use of CSS3 transforms&amp;#8217; to eliminate flicker, etc.&lt;/p&gt;

&lt;p&gt;Sencha Touch 2 uses CSS-based layouts so Javascript doesn&amp;#8217;t get invoked to layout the components. This means that the layout process is asynchronous and not dependant on the Javascript runtime. It&amp;#8217;s also smarter about re-using DOM elements especially for lists, since creating DOM objects is very expensive. Doing this manually is a large part of how you improve the performance of a Sencha application, and now this is (hopefully) all done by Sencha Touch automatically.&lt;/p&gt;

&lt;h2 id='other_improvements'&gt;Other improvements&lt;/h2&gt;

&lt;p&gt;They also say they&amp;#8217;ve improved their internal processes a lot, adding a QA team and code review process. They&amp;#8217;ve also made much-needed improvements to their documentation and learning materials.&lt;/p&gt;

&lt;h2 id='qa'&gt;Q&amp;amp;A&lt;/h2&gt;

&lt;p&gt;Here&amp;#8217;s a few of the questions that were asked. There were a couple others that I either missed or didn&amp;#8217;t find interesting. I found in this talk that the speakers tended to talk around the question and never answer it unfortunately.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;How does Sencha support multiple devices?&lt;/strong&gt; Speaker mostly dodged the question.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Has Sencha fixed problems where, during keyboard input, the viewport turns into a sliver?&lt;/strong&gt; Yes, the new layout engine in 2.0 should be more correct because it uses CSS for layout.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;What&amp;#8217;s the difference between PhoneGap and Project &amp;#8220;Ion&amp;#8221;?&lt;/strong&gt; Ion will have good continuous integration support, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id='introducing_designer_2'&gt;Introducing Designer 2&lt;/h1&gt;

&lt;p&gt;Designer is turning from a visual layout designer, kind of like Interface Builder for Cocoa / Cocoa Touch pre-XCode 4, into an integrated development environment with a layout designer. I&amp;#8217;m seeing it turning into something more like Expression Studio. It includes a code editor for inserting code into event handlers, generators for MVC components, source control integration, and native deployment (to the Apple App Store, or the Android market). Designer 2 also includes support for Sencha Touch; the current stable release only supports Ext.JS.&lt;/p&gt;

&lt;h2 id='qa'&gt;Q&amp;amp;A&lt;/h2&gt;

&lt;p&gt;This session had a longer Q&amp;amp;A session that had some interesting questions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Will Designer support generating MVC stubs?&lt;/strong&gt; Designer &lt;em&gt;will&lt;/em&gt; fully support MVC, but it isn&amp;#8217;t quite there yet.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;What unit testing frameworks does Sencha support?&lt;/strong&gt; Sencha uses Jasmine internally, but doesn&amp;#8217;t really recommend any in particular.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Why is Sencha creating an IDE instead of integrating with Visual Studio or Eclipse?&lt;/strong&gt; They did not want to rely on the release schedule of a third party, and like to develop their platform all internally. They said they do plan on integrating with Eclipse, but didn&amp;#8217;t give details.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Will Designer support custom theming and custom templates?&lt;/strong&gt; Yes, it&amp;#8217;s in the roadmap but they&amp;#8217;re &amp;#8220;focusing on the basics&amp;#8221; right now.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;If I have an existing application not developed in Designer, will Designer be able to open it?&lt;/strong&gt; No, Designer has a specific filesystem layout it uses. Because every project has its code structured differently. They recommend developing it again, from scratch, in Designer. (&lt;em&gt;Aside:&lt;/em&gt; This was a common thread in a few talks. Sencha doesn&amp;#8217;t really allow forward-porting of applications from previous versions of their frameworks. They assume that all projects are either greenfield or will stick with an earlier version of the framework.)&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Does Designer support Ext.JS 3.x?&lt;/strong&gt; No, you should be moving to Ext.JS 4.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id='mvc_in_depth'&gt;MVC in depth&lt;/h1&gt;

&lt;p&gt;These talks were a rapid-fire tour through MVC in Sencha Touch and Ext.JS. Honestly, I missed a few parts, but I think I captured the most important bits.&lt;/p&gt;

&lt;h2 id='part_1'&gt;Part 1&lt;/h2&gt;

&lt;p&gt;Why use MVC in Sencha? By applying a standard application structure you can keep things organized, prevent spaghetti code, and allow collaboration between developers.&lt;/p&gt;

&lt;p&gt;Sencha&amp;#8217;s implementation of MVC also includes a standard directory layout that&amp;#8217;s similar to Rails with controllers in &lt;code&gt;MyApp/app/controllers&lt;/code&gt;, models in &lt;code&gt;MyApp/app/models&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;Overall, Sencha&amp;#8217;s implementation of MVC is fairly standard. The most interesting part is the controller which is bound to the view using &amp;#8220;component queries&amp;#8221; to get references to objects on the view using CSS selectors, then lazy binding to bind to their events (more on this below).&lt;/p&gt;

&lt;h2 id='part_2'&gt;Part 2&lt;/h2&gt;

&lt;p&gt;Biggest difference between most MVC implementations on the web (e.g. Rails, Django, etc.) is that in server-side MVC the actions are based on pages, whereas Sencha&amp;#8217;s client-side MVC actions are based on user actions.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s an event-based model where controllers bind to view events like so:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;this.control ({
  &amp;#39;contact-listpanel&amp;#39;: {
      activate: this.onListActivate
  },

  &amp;#39;contact-listpanel &amp;gt; list&amp;#39;: {
      select: this.onListSelect
  },

  &amp;#39;button[action=addcontact]&amp;#39;: {
    tap: this.onAddButtonTap
  }
});&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This snippet of code, from a controller&amp;#8217;s &lt;code&gt;init&lt;/code&gt; method, binds to the &lt;code&gt;activate&lt;/code&gt;, &lt;code&gt;select&lt;/code&gt;, and &lt;code&gt;tap&lt;/code&gt; events of their respective components. Bindings are lazy, similar to the jQuery&amp;#8217;s &amp;#8216;.live()&amp;#8217; method, where event bindings apply to DOM elements created now and in the future. You declare that you&amp;#8217;re interested in an event, and if a control appears at some point that matches a query, you will be bound to it.&lt;/p&gt;

&lt;p&gt;Sencha uses an &amp;#8220;Event Bus&amp;#8221; model for dispatching events. When an event is fired, its controller dispatches an event to the application object:&lt;/p&gt;

&lt;p&gt;this.application.fireEvent(&amp;#8216;stationstart&amp;#8217;, context);&lt;/p&gt;

&lt;p&gt;Then someone else can bind to the &amp;#8216;stationstart&amp;#8217; event and do an action when it occurs.&lt;/p&gt;

&lt;p&gt;In Sencha Touch 2.0, the initialization process is a two-phase process:&lt;/p&gt;

&lt;p&gt;- Application: init - All controllers: init - Application: launch - All controllers: launch&lt;/p&gt;

&lt;p&gt;The init methods should do all the event binding, whereas the launch methods should do the rest of the initialization (creating views, loading data from stores, etc).&lt;/p&gt;

&lt;h1 id='using_nodejs_with_sencha_technologies'&gt;Using Node.js with Sencha Technologies&lt;/h1&gt;

&lt;p&gt;Rationale for server-side Javascript: using Javascript everywhere means fewer context switches for developers. It also allows code portability between the client and the server.&lt;/p&gt;

&lt;p&gt;Node.js is Google&amp;#8217;s v8 Javascript engine (same as Chrome uses) with I/O libraries on top. All I/O is non-blocking (aka. &amp;#8220;evented&amp;#8221;).&lt;/p&gt;

&lt;p&gt;Craig implemented a Node.js module called &lt;code&gt;node-extjs&lt;/code&gt; which lets you use Ext.js or Sencha Touch&amp;#8217;s MVC architecture on the server-side. This allows code to be shared between the client and the server, such as models with validations that exist on both the client and the server.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s also three projects to blur the difference between clients and servers: &lt;code&gt;now&lt;/code&gt;, &lt;code&gt;dnode&lt;/code&gt;, &lt;code&gt;hook.io&lt;/code&gt;. &lt;code&gt;now&lt;/code&gt; is the most interesting. It lets the client invoke methods on the server via a function call, or vice versa, via WebSockets.&lt;/p&gt;

&lt;h2 id='qa'&gt;Q&amp;amp;A&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;What about debugging node programs?&lt;/strong&gt; There&amp;#8217;s a package called &amp;#8220;node-inspector&amp;#8221; that&amp;#8217;s like Web Inspector for introspecting node applications.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Does node-extjs use Ext.JS&amp;#8217;s loader mechanism?&lt;/strong&gt; Yes, it does.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;How does CouchDB compare to other NoSQL databases?&lt;/strong&gt; CouchDB is very simple and all Javascript-based (&lt;em&gt;Aside:&lt;/em&gt; not quite &amp;#8212; it&amp;#8217;s implemented in Erlang, but he&amp;#8217;s right that all the extension points are Javascript). MongoDB is very good, but there&amp;#8217;s no Ext.JS integration for it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id='senchaio'&gt;Sencha.io&lt;/h1&gt;

&lt;p&gt;Sencha.io has three core services: Login, Data, Messages.&lt;/p&gt;

&lt;h2 id='login'&gt;Login&lt;/h2&gt;

&lt;p&gt;Provides authentication, registration (both via a standard form, and via an API), etc. Allows user groups, and searching by properties (including custom properties).&lt;/p&gt;

&lt;h2 id='data'&gt;Data&lt;/h2&gt;

&lt;p&gt;Data is replicated locally on devices and synchronized to the cloud. Data can be shared between users to allow collaboration. Data can be updated while offline, and will be synced automatically when connectivity is restored. Only the user&amp;#8217;s individual data is stored on the device.&lt;/p&gt;

&lt;p&gt;This of course opens the door for inconsistencies. Sencha.io allows collisions, then uses a conflict resolution. When a property is set to two values independently, then it uses a timestamp to determine the winner.&lt;/p&gt;

&lt;p&gt;He called this a &amp;#8216;timestamp&amp;#8217; first then later clarified that it&amp;#8217;s not an actual time. But, he didn&amp;#8217;t go into details. I suspect he means that it uses a vector clock or MVCC, but that&amp;#8217;s speculation and doesn&amp;#8217;t answer how they resolve conflicts. He didn&amp;#8217;t mention any manual mechanism for pushing conflict resolution up to the application like Riak does.&lt;/p&gt;

&lt;h2 id='messages'&gt;Messages&lt;/h2&gt;

&lt;p&gt;Allows device-to-device communication, either one-to-one or one-to-many. Offline messaging is a core feature, so messages are queued up while offline and delivered later.&lt;/p&gt;

&lt;p&gt;Has a couple different protocols for client-server communication, including the default polling one and an asynchronous push one. He seemed to say that it uses different ones in different situations.&lt;/p&gt;

&lt;p&gt;Messaging models supported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service requests (request-response, or RPC)&lt;/li&gt;

&lt;li&gt;Broadcasting data (one sender, many recipients)&lt;/li&gt;

&lt;li&gt;Collecting data (many senders, one recipient)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Messages are just JSON blobs. The one-to-many messaging reminds me of AMQP with message queues and brokers.&lt;/p&gt;

&lt;h2 id='qa'&gt;Q&amp;amp;A&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Is data encrypted?&lt;/strong&gt; No, except authentication.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Can we access data using SQL, etc.?&lt;/strong&gt; No.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Can you use social network logins for the Login service?&lt;/strong&gt; Yes. It also supports third-party authentication providers.&lt;/li&gt;

&lt;li&gt;Asked by me: &lt;strong&gt;Can you replicate shared data on the devices?&lt;/strong&gt; Yes.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;What&amp;#8217;s the business model?&lt;/strong&gt; Free for now. There will be some sort of &amp;#8216;enterprise tier&amp;#8217; later that will be paid.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Will Sencha.io support Ext.JS?&lt;/strong&gt; Yes, eventually. It actually works right now, by accident. Official support will come soon.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;How are devices uniquely identified since UDIDs change?&lt;/strong&gt; They put a random number into local storage. Of course this can be deleted, in which case it&amp;#8217;ll appear as a new device. Devices are bound to users, so if data is stored in the user object, then it&amp;#8217;ll appear on whatever device they use. This only would be a problem for anonymous users.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;(Did not hear question)&lt;/strong&gt; Sencha will re-write HTML files to point references to sencha-touch.js to a CDN so it loads faster. It also ships device-specific code, or do other tricks (e.g. progressive loading).&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Can you inspect the device&amp;#8217;s queues to figure out when messages aren&amp;#8217;t being delivered?&lt;/strong&gt; Yes, there will be a console / other debugging tools.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;How fast is message delivery? Does it support real-time?&lt;/strong&gt; In the asynchronous push delivery, latency will be about the same as the network latency. For the polling delivery it will depend on the polling policy.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  
  <entry>
    <id>http://michaelmelanson.net//2011/10/23/senchacon-2011-day-1</id>
    <link type="text/html" rel="alternate" href="http://michaelmelanson.net/2011/10/23/senchacon-2011-day-1"/>
    <title>SenchaCon 2011: Day 1</title>
    <updated>2011-10-23T00:00:00-07:00</updated>
    <author>
      <name>Michael Melanson</name>
      <uri>http://michaelmelanson.net/</uri>
    </author>
    <content type="html">&lt;p&gt;I&amp;#8217;m here in sunny Austin, Texas at SenchaCon 2011 where I&amp;#8217;ll be posting highlights each day this week.&lt;/p&gt;

&lt;p&gt;Today they kicked things off with the welcome reception, where I got a chance to talk with a bunch of other developers from all over the world. England, the Czech Republic, and a half dozen US states were represented &amp;emdash; just in the people I managed to see before the beer stopped flowing! I overheard that some people travelled for 25 hours to get here, which I find incredible.&lt;/p&gt;

&lt;p&gt;Everyone was very positive about their experiences with Sencha. Many, like myself, have only used it once or twice and are here to find out more. So, this should be a learning experience for everyone.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll be sticking mostly to the Javascript track because I think that&amp;#8217;s the most relevant to Macadamian. Tomorrow, I plan on attending:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keynote&lt;/li&gt;

&lt;li&gt;Introducing Sencha Touch 2&lt;/li&gt;

&lt;li&gt;Introducing Designer 2 (though I&amp;#8217;m split between that and Hacking WebKit)&lt;/li&gt;

&lt;li&gt;The Sencha Class System&lt;/li&gt;

&lt;li&gt;MVC In Depth (both parts)&lt;/li&gt;

&lt;li&gt;Using Node.js with Sencha Technologies&lt;/li&gt;

&lt;li&gt;Introducing Sencha.io&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Should be fun!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://michaelmelanson.net//2010/10/03/knitting-charter</id>
    <link type="text/html" rel="alternate" href="http://michaelmelanson.net/2010/10/03/knitting-charter"/>
    <title>Weekend project: Knitting charter</title>
    <updated>2010-10-03T00:00:00-07:00</updated>
    <author>
      <name>Michael Melanson</name>
      <uri>http://michaelmelanson.net/</uri>
    </author>
    <content type="html">&lt;p&gt;I wrote this small knitting tool for my fiancée to convert written knitting instructions to a chart.&lt;/p&gt;

&lt;p&gt;In the future, I plan on extending the chart UI to allow you to edit the chart and have those changes be carried back to the instructions.&lt;/p&gt;

&lt;a href=&quot;http://knitting.heroku.com&quot;&gt;Knitting charter&lt;/a&gt;
</content>
  </entry>
  
  <entry>
    <id>http://michaelmelanson.net//2010/09/30/tip-interactive-rebase</id>
    <link type="text/html" rel="alternate" href="http://michaelmelanson.net/2010/09/30/tip-interactive-rebase"/>
    <title>Git tip: Using interactive rebase</title>
    <updated>2010-09-30T00:00:00-07:00</updated>
    <author>
      <name>Michael Melanson</name>
      <uri>http://michaelmelanson.net/</uri>
    </author>
    <content type="html">&lt;p&gt;Interactive rebase is a one-stop shop for revising history: combining, removing and reordering commits. It&amp;#8217;s one of those things where you learn it, and afterward wonder how you got by without knowing it. I use it almost every day when preparing a topic branch for review. If I have to make changes during review, I commit them as incremental patches, then squash them with an interactive rebase before I commit.&lt;/p&gt;



&lt;p&gt;In this post, I&amp;#8217;ll explain a bit about how it works. Let&amp;#8217;s forget about topic branches right now, and just assume you&amp;#8217;re working directly on the master.&lt;/p&gt;



&lt;p&gt;Say you&amp;#8217;ve been working a bit, and you have a recent history that looks like this (most recent to oldest):&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;Fix a bug when you foo the bar&lt;/li&gt;
&lt;li&gt;Fix typo&lt;/li&gt;
&lt;li&gt;Implement the remainder of feature XYZ&lt;/li&gt;
&lt;li&gt;Oops, forgot to add this file&lt;/li&gt;
&lt;li&gt;Implement part of feature XYZ&lt;/li&gt;
&lt;li&gt;(Ancient history that&amp;#8217;s in the upstream repo)&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;If your history doesn&amp;#8217;t look like this you either don&amp;#8217;t commit often enough or you&amp;#8217;re super-human. But we all want to &lt;em&gt;appear&lt;/em&gt; super-human, so let&amp;#8217;s clean that up a bit before we show it to anyone.&lt;/p&gt;



&lt;p&gt;We&amp;#8217;ve added five commits here, so we want to run the following command:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;git rebase -i HEAD~5&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;(If we were using a topic branch, we could do &lt;code&gt;git rebase -i master&lt;/code&gt; &amp;#8212; this also has the effect of rebasing the topic branch if the master has been updated)&lt;/p&gt;



&lt;p&gt;This will open up your editor, with something that looks like this:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;pick 39a2bef Implement part of feature XYZ
pick 4bc987e Oops, forgot to add this file
pick f9282bc Implement the remainder of feature XYZ
pick 2c5dd33 Fix typo
pick a524b5c Fix a bug when you foo the bar&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;On each line, you have the command (&amp;#8220;pick&amp;#8221; here), the commit ID, and the description. At the bottom of the file, you&amp;#8217;ll see a list of commands you can use:&lt;/p&gt;



&lt;ul&gt;&lt;li&gt;&lt;strong&gt;pick&lt;/strong&gt; &amp;#8212; leave the commit as-is&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;reword&lt;/strong&gt; &amp;#8212; change the commit summary only (this is a recent addition)&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;edit&lt;/strong&gt; &amp;#8212; change the commit contents, much like doing a &lt;code&gt;git reset --mixed&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;squash&lt;/strong&gt; &amp;#8212; keep the changes in this commit, but merge it with the commit on the previous line, and append the commit messages and allow the message to be edited.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;fixup&lt;/strong&gt; &amp;#8212; keep the changes, as with &lt;strong&gt;squash&lt;/strong&gt; but throw away the log message.&lt;/li&gt;

&lt;/ul&gt;&lt;p&gt;You can also delete a line to discard a commit entirely, or reorder them. The idea is that you edit this file so it shows the history you wish you created, then write the file and close your editor. Let&amp;#8217;s change it so it looks like this:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;pick 39a2bef Implement part of feature XYZ
fixup 4bc987e Oops, forgot to add this file
pick f9282bc Implement the remainder of feature XYZ
fixup 2c5dd33 Fix typo
fixup a524b5c Fix a bug when you foo the bar&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;I&amp;#8217;ve just changed &amp;#8220;pick&amp;#8221; to &amp;#8220;fixup&amp;#8221; for all the mistake commits I made. This will roll them in with the commits above them so that, when we close the editor, git will re-write your history so it looks like this:&lt;/p&gt;



&lt;ul&gt;
  &lt;li&gt;Implement the remainder of feature XYZ&lt;/li&gt;
  &lt;li&gt;Implement part of feature XYZ&lt;/li&gt;
  &lt;li&gt;(Ancient history)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mistakes? What mistakes? :)&lt;/p&gt;



&lt;p&gt;As I said, I use this almost daily to prepare a patch set for review. After I rebase, I&amp;#8217;d prepare patch emails with &lt;code&gt;git format-patch -2 --attach&lt;/code&gt;, then send them with &lt;code&gt;git send-email 000[12]* --to=mailinglist@somewhere.com&lt;/code&gt;.&lt;/p&gt;



&lt;p&gt;Hope that helps you out. Rewriting history like this is a key feature of git that I haven&amp;#8217;t seen in other source control systems, and it goes a long way towards making your project history look professional.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://michaelmelanson.net//2009/08/10/apologies-lack-of-updates</id>
    <link type="text/html" rel="alternate" href="http://michaelmelanson.net/2009/08/10/apologies-lack-of-updates"/>
    <title>Apologies for the lack of updates</title>
    <updated>2009-08-10T00:00:00-07:00</updated>
    <author>
      <name>Michael Melanson</name>
      <uri>http://michaelmelanson.net/</uri>
    </author>
    <content type="html">&lt;a href=&quot;http://www.flickr.com/photos/michaelmelanson/3805603128/&quot;&gt;&lt;img src=&quot;/tumblr_files/auvnxdAmZqz6cz9pRJidmibAo1_500.jpg&quot;/&gt;&lt;/a&gt;&lt;br/&gt;&lt;p&gt;Apologies for the lack of updates. In the meantime, here&amp;#8217;s what I&amp;#8217;ve been doing lately.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://michaelmelanson.net//2009/07/27/intro-to-neuroscience</id>
    <link type="text/html" rel="alternate" href="http://michaelmelanson.net/2009/07/27/intro-to-neuroscience"/>
    <title>Introduction to neuroscience package</title>
    <updated>2009-07-27T00:00:00-07:00</updated>
    <author>
      <name>Michael Melanson</name>
      <uri>http://michaelmelanson.net/</uri>
    </author>
    <content type="html">&lt;p&gt;These are my notes from a casual lecture I gave earlier today. It talks about the general layout of the central nervous system, some stuff about the amygdala and the hippocampus, and the visual system. It&amp;#8217;s quite incomplete, because it was meant to accompany my lecture.&lt;/p&gt;

&lt;p&gt;I have also included articles from Wikipedia that I referenced to produce the notes and which may be interesting, and the slides from two other talks I gave in school last Fall.&lt;/p&gt;

&lt;a href=&quot;http://files.getdropbox.com/u/2779/Neuroscience%20package.zip&quot;&gt;Link to package&lt;/a&gt;&lt;br/&gt;</content>
  </entry>
  
  <entry>
    <id>http://michaelmelanson.net//2009/05/14/cmake-packages</id>
    <link type="text/html" rel="alternate" href="http://michaelmelanson.net/2009/05/14/cmake-packages"/>
    <title>CMake packages</title>
    <updated>2009-05-14T00:00:00-07:00</updated>
    <author>
      <name>Michael Melanson</name>
      <uri>http://michaelmelanson.net/</uri>
    </author>
    <content type="html">&lt;p&gt;At work, I&amp;#8217;ve started transitioning the company&amp;#8217;s build system to &lt;a href=&quot;http://www.cmake.org&quot;&gt;CMake&lt;/a&gt;. Makefiles are a huge pain in the ass, though not as big as &lt;a href=&quot;http://www.gnu.org/software/autoconf&quot;&gt;some other tools&lt;/a&gt; (but I digress).&lt;/p&gt;

&lt;p&gt;The biggest problem with CMake so far is that you have to write &amp;#8220;FindXXX.cmake&amp;#8221; packages for any external dependencies so CMake knows how to find their headers and link against its libraries.&lt;/p&gt;

&lt;p&gt;Here are the package files for LibEvent, MySQL client, Net-SNMP, Libnet, PCRE and GLIB2. Some of these I found on the Internet and others I wrote myself. You can find the files on GitHub at:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://gist.github.com/111912&quot;&gt;Link to GitHub Gist&lt;/a&gt;&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://michaelmelanson.net//2009/03/11/in-place-editing-rails</id>
    <link type="text/html" rel="alternate" href="http://michaelmelanson.net/2009/03/11/in-place-editing-rails"/>
    <title>In-place editing in Rails</title>
    <updated>2009-03-11T00:00:00-07:00</updated>
    <author>
      <name>Michael Melanson</name>
      <uri>http://michaelmelanson.net/</uri>
    </author>
    <content type="html">&lt;p&gt;Just now, I wanted to add in-place editing to a Rails application. At first, I used jQuery&amp;#8217;s Ajax.InPlaceEditor, and that worked (with a bit of authentication_token hackery), but I figured someone had done this before and had a Rails helper to do it.&lt;/p&gt;



&lt;p&gt;Well, I found &lt;a href=&quot;http://www.bizmeetsdev.com/articles/2008/02/09/editable_content_tag&quot;&gt;editable_content_tag&lt;/a&gt;, which mostly did the trick except that it wasn&amp;#8217;t updating the page correctly. It turns out the controller was returning a nested JSON hash that looked something like this:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;{'obj' =&amp;gt; {'property_one': 'value', 'property_two', 'value two'}}

&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Their implementation of editable_content_tag wasn&amp;#8217;t digging into the nested hash (i.e, it was using json.property_one instead of json.obj.property_one), and so it would display &amp;#8220;undefined&amp;#8221; when after being edited. Not cool.&lt;/p&gt;



&lt;p&gt;Their implementation also didn&amp;#8217;t work when a value was blank. It would generate a zero-width div, which wasn&amp;#8217;t clickable. So I made it display &amp;#8220;(not set)&amp;#8221; when the value is blank.&lt;/p&gt;



&lt;p&gt;Just in case anyone has encountered similar problems, here&amp;#8217;s the modified code. To use it, put this into your app/helpers/application_helper.rb file.&lt;/p&gt;



&lt;script src=&quot;http://gist.github.com/77491.js&quot;&gt;&lt;/script&gt;
</content>
  </entry>
  
  <entry>
    <id>http://michaelmelanson.net//2009/03/10/tip-using-bash-history</id>
    <link type="text/html" rel="alternate" href="http://michaelmelanson.net/2009/03/10/tip-using-bash-history"/>
    <title>Productivity tip: Using the Bash history</title>
    <updated>2009-03-10T00:00:00-07:00</updated>
    <author>
      <name>Michael Melanson</name>
      <uri>http://michaelmelanson.net/</uri>
    </author>
    <content type="html">&lt;p&gt;The next time you&amp;#8217;re using the terminal a lot and want to run a previous command again, try using Bash&amp;#8217;s &amp;#8220;reverse-i-search&amp;#8221; feature. Type &amp;#8220;Ctrl-r&amp;#8221; and enter part of the command. For example, if you&amp;#8217;ve recently run &amp;#8220;make&amp;#8221; and want to run it again, typing &amp;#8220;&amp;lt;Ctrl-r&amp;gt;ma&amp;#8221; might bring up:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;(reverse-i-search)`ma': make

&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Hitting enter now will run &amp;#8220;make&amp;#8221;. If this isn&amp;#8217;t the line you wanted, either type more characters or hit Ctrl-r again to show an earlier line matching your search.&lt;/p&gt;



&lt;p&gt;I use this all the time in combination with git-svn, because its rebase command needs a clean index (if you&amp;#8217;re not familiar with git, this means that there are no uncommitted changes in your tree). To rebase despite a dirty index, you can use the stash like this:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;git stash &amp;amp;&amp;amp; git svn rebase &amp;amp;&amp;amp; git stash apply

&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;But that&amp;#8217;s a pain to type over and over, so once I&amp;#8217;ve done it once I can type something like &amp;#8220;&amp;lt;Ctrl-r&amp;gt;re&amp;#8221;, and Bash responds with:&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;(reverse-i-search)`re': git stash &amp;amp;&amp;amp; git svn rebase &amp;amp;&amp;amp; git stash apply

&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Although I&amp;#8217;ve been talking about Bash here, this is actually a GNU Readline feature, and works the same way in other programs that use Readline or a similar library.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://michaelmelanson.net//2009/02/24/reply-to-dailymeh</id>
    <link type="text/html" rel="alternate" href="http://michaelmelanson.net/2009/02/24/reply-to-dailymeh"/>
    <title>Language, religion, origins, etc.</title>
    <updated>2009-02-24T00:00:00-08:00</updated>
    <author>
      <name>Michael Melanson</name>
      <uri>http://michaelmelanson.net/</uri>
    </author>
    <content type="html">&lt;p&gt;This is a reply to a post by &lt;a href=&quot;http://dailymeh.tumblr.com/post/79504069&quot;&gt;dailymeh&lt;/a&gt; where he said:&lt;/p&gt;



&lt;blockquote&gt;

&lt;p&gt;While we’re on the topic of divine revelations, I wouldn’t mind a revelation, though a scientific one would do, about the origin of language. It is, with only a bit of hyperbole, as mysterious as the origin of the universe or of life. We know &lt;em&gt;a lot&lt;/em&gt; about how the universe evolved after the Big Bang and about how animals evolved from the primordial life and about how languages evolve from their ancestors, but how the universe, the first life, or the first language came into existence is very, very unclear. The relationship between sounds and concepts is essentially arbitrary. It makes no difference whether I call water afdaxhamasr or water, so long as my friends and my family and you and everyone else calls it the same. So how did the first association come about? We can explain why water is called water by studying the history of the word, but how did there come to be a word for water in the first place, and how was that word chosen? Did language develop once or many times? Does every language that exists today have a common ancestor, and if so, can we reconstruct it? (No, we probably can’t even if we could show that there was a common ancestor. But the rest of those are open.)&lt;/p&gt;&lt;/blockquote&gt;







&lt;p&gt;A few years ago, I took a course on psycholinguistics. Some courses have had a profound impact on my world view, and this was one of them. The required reading for the course was Pinker&amp;#8217;s &lt;strong&gt;The language instinct&lt;/strong&gt;. I can&amp;#8217;t recommend that book enough for anyone interested in the topic.&lt;/p&gt;



&lt;p&gt;In that book, Pinker argues that we humans are driven to learn language and that it takes very strange circumstances indeed (essentially total isolation until adolescence) for this to not happen. He discusses some interesting cases, such as the development of &lt;a href=&quot;http://en.wikipedia.org/wiki/Nicaraguan_Sign_Language&quot;&gt;Nicaraguan Sign Language&lt;/a&gt;. I&amp;#8217;ll only summarize it here; that Wikipedia article gives a more detailed description.&lt;/p&gt;



&lt;p&gt;In Nicaragua, until the 1970s-1980s, deaf children were scattered across the country and were not taught a sign language. Although I assume many learned to lip-read, this is a very difficult (and even at its best, inaccurate) skill. Because of this, they had a hard time fitting into society. To address this problem, the government established a school to bring these children together and teach them a sign language. A group of educators sat down and developed their own sign language and began to teach it at this school. The children hated it and were incapable learn it. It simply wasn&amp;#8217;t a human language.&lt;/p&gt;



&lt;p&gt;Instead, the teachers noticed that on the playground, completely spontaneously, the children were developing their own sign language completely unlike the one the teachers had tried to teach them. It began with simple gestures (the signing equivalent of &lt;a href=&quot;http://en.wikipedia.org/wiki/Pigdin&quot;&gt;a pidgin language&lt;/a&gt;), but over time it developed its own syntax much like you would find in a mature language like American Sign Language. It had transitioned from a pidgin to &lt;a href=&quot;http://en.wikipedia.org/wiki/Creole_language&quot;&gt;a creole language&lt;/a&gt;. Similar phenomena have been observed in other situations where people without a common language are forced together. The &amp;#8220;pidgin language&amp;#8221; article linked above lists some examples.&lt;/p&gt;



&lt;p&gt;In fact, this should not be surprising since all human languages share a common structure, which linguists call &lt;a href=&quot;http://en.wikipedia.org/wiki/X-bar_theory&quot;&gt;X-bar theory&lt;/a&gt;. I don&amp;#8217;t know enough about X-bar theory to comment on it, except that the theory states that the syntax of all human languages differ only in the &lt;strong&gt;order&lt;/strong&gt; of elements within X-bar rules.&lt;/p&gt;



&lt;p&gt;To specifically answer &lt;strong&gt;dailymeh&lt;/strong&gt;&amp;#8217;s questions, the actual words of a language are not important and have more to do with history and anthropology than anything else. Obviously, the pronunciation is limited by the phonemes (sounds) that a human can produce, but other than that they are arbitrary.&lt;/p&gt;



&lt;p&gt;I suspect that what we consider language developed from simpler roots that we can see in our living primate relatives. At some point, our hominid ancestors needed more sophisticated ways of communicating. Perhaps it was an advantage for groups of hunters to be able to plan elaborate strategies while on a hunt. For this reason, I suspect that language developed only once, but over millions of years of refinement.&lt;/p&gt;



&lt;p&gt;Since our language faculties have not changed substantially for as long as we have been &lt;strong&gt;homo sapiens&lt;/strong&gt;, if you were to clone an early modern human they would be able to learn a modern language like any other child born today. Similarly, if you found yourself with a group of neolithic humans you would have no more difficulty than learning another (unrelated) modern language.&lt;/p&gt;



&lt;p&gt;I think that human language is one of our most fascinating abilities. It&amp;#8217;s humbling to think that all human languages are so similar &amp;#8212; far more similar, in fact, than they are different.&lt;/p&gt;
</content>
  </entry>
  
  <entry>
    <id>http://michaelmelanson.net//2008/11/20/introducing-foodster</id>
    <link type="text/html" rel="alternate" href="http://michaelmelanson.net/2008/11/20/introducing-foodster"/>
    <title>Introducing Foodster</title>
    <updated>2008-11-20T00:00:00-08:00</updated>
    <author>
      <name>Michael Melanson</name>
      <uri>http://michaelmelanson.net/</uri>
    </author>
    <content type="html">&lt;p&gt;For one of the courses I&amp;#8217;m taking this semester, we had to develop some sort of project to do with sustainability or use of local resources. My group decided to make an online &amp;#8220;Farmer&amp;#8217;s Market&amp;#8221; with recipe sharing.&lt;/p&gt;



&lt;p&gt;The result is &lt;a href=&quot;http://foodster.codeshack.ca/&quot;&gt;Foodster&lt;/a&gt;, and it&amp;#8217;s up in &amp;#8220;beta&amp;#8221;. I did the programming and web design; the rest of the group did usability testing and research. It&amp;#8217;s not complete, but I think the core features are well represented. I&amp;#8217;m not sure what I&amp;#8217;m going to do about continuing development once this course is over. I think it&amp;#8217;s an interesting idea, and I&amp;#8217;ve put a lot of time into developing this prototype.&lt;/p&gt;



&lt;p&gt;At any rate, I&amp;#8217;m going to keep it up at that URL for the foreseeable future. I welcome feedback, and may return to it soon.&lt;/p&gt;
</content>
  </entry>
  
 
</feed>
