<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7444476750146085480</id><updated>2012-02-16T02:59:59.006-08:00</updated><category term='mvc'/><category term='ruby'/><category term='datagrid'/><category term='announcement'/><category term='rspec'/><category term='javascript'/><category term='agile'/><category term='YARV'/><category term='BDD'/><category term='FFI'/><category term='unit testing'/><category term='testing'/><category term='pragmatism'/><category term='software development'/><title type='text'>Teleology</title><subtitle type='html'>Thoughts on software development, without authority</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://teleologi.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444476750146085480/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://teleologi.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Riley</name><uri>http://www.blogger.com/profile/07124698414324231625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7444476750146085480.post-2099275447043138234</id><published>2011-09-05T20:36:00.000-07:00</published><updated>2011-09-05T20:50:45.545-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='datagrid'/><category scheme='http://www.blogger.com/atom/ns#' term='announcement'/><title type='text'>Announcement: Slickback v0.2.1</title><content type='html'>&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); font-family: 'trebuchet ms', verdana, arial, sans-serif; font-size: 13px; line-height: 18px; background-color: rgb(255, 255, 255); "&gt;&lt;div&gt;Version 0.2.1 of &lt;a href="http://teleological.github.com/slickback"&gt;Slickback&lt;/a&gt; is now available. Slickback is a javascript library that makes it easier to use &lt;a href="http://documentcloud.github.com/backbone"&gt;Backbone&lt;/a&gt; models and collections with the &lt;a href="http://github.com/mleibman/SlickGrid"&gt;SlickGrid&lt;/a&gt; jQuery datagrid. New features in this version include support for displaying and editing Backbone model fields as text, integers, fixed precision numbers, and for selecting field values from dropdowns. Constructors for non-paginated Slickback collections are also new in this version. Slickback v0.2.1 is released under the MIT license and available on &lt;a href="http://github.com/teleological/slickback"&gt;github&lt;/a&gt; or via &lt;a href="http://search.npmjs.org/#/slickback"&gt;npm&lt;/a&gt;.&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444476750146085480-2099275447043138234?l=teleologi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teleologi.blogspot.com/feeds/2099275447043138234/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://teleologi.blogspot.com/2011/09/announcement-slickback-v021.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444476750146085480/posts/default/2099275447043138234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444476750146085480/posts/default/2099275447043138234'/><link rel='alternate' type='text/html' href='http://teleologi.blogspot.com/2011/09/announcement-slickback-v021.html' title='Announcement: Slickback v0.2.1'/><author><name>Riley</name><uri>http://www.blogger.com/profile/07124698414324231625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444476750146085480.post-862710544017501910</id><published>2011-08-23T02:15:00.000-07:00</published><updated>2011-08-23T02:42:40.977-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='mvc'/><category scheme='http://www.blogger.com/atom/ns#' term='datagrid'/><category scheme='http://www.blogger.com/atom/ns#' term='announcement'/><title type='text'>Announcement: A Plugin Named Slickback</title><content type='html'>&lt;div&gt;&lt;a href="http://teleological.github.com/slickback"&gt;Slickback&lt;/a&gt; version 0.1.0 is now &lt;a href="http://github.com/teleological/slickback"&gt;available on Github&lt;/a&gt; and via &lt;a href="http://search.npmjs.org/#/slickback"&gt;npm&lt;/a&gt;. Slickback is a javascript library that adapts &lt;a href="http://documentcloud.github.com/backbone"&gt;Backbone&lt;/a&gt; collections to work with &lt;a href="http://github.com/mleibman/SlickGrid"&gt;SlickGrid&lt;/a&gt;, a jQuery-backed datagrid. Extensions to Backbone include support for paginating collections and composing filtered queries using an interface modeled after Ruby on Rails ActiveRecord's "named scopes". Slickback, like Backbone and SlickGrid, is released under the MIT license.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444476750146085480-862710544017501910?l=teleologi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teleologi.blogspot.com/feeds/862710544017501910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://teleologi.blogspot.com/2011/08/announcement-plugin-named-slickback.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444476750146085480/posts/default/862710544017501910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444476750146085480/posts/default/862710544017501910'/><link rel='alternate' type='text/html' href='http://teleologi.blogspot.com/2011/08/announcement-plugin-named-slickback.html' title='Announcement: A Plugin Named Slickback'/><author><name>Riley</name><uri>http://www.blogger.com/profile/07124698414324231625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444476750146085480.post-7554825002162646105</id><published>2011-04-28T14:40:00.001-07:00</published><updated>2011-08-23T02:43:03.882-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='YARV'/><category scheme='http://www.blogger.com/atom/ns#' term='FFI'/><title type='text'>At home he's a tourist: FFI for Ruby internals</title><content type='html'>&lt;a href="https://github.com/ffi/ffi"&gt;FFI&lt;/a&gt; stands for "foreign function interface". That describes the most common use case: Creating Ruby bindings to external native libraries. But it's also possible to use FFI to spelunk Ruby's internals. Consider:&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;script src="https://gist.github.com/948282.js?file=ffi1.rb"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Foreign? Far from it. You've now got access to all of C-ruby's innards. For example, if you're using Ruby 1.9:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/948300.js?file=ffi2.rb"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;With this you've got a handle on the otherwise inaccessible RubyVM core object. As a pointer, it's not all that useful. But with a little more mischief...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/948301.js?file=ffi3.rb"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;... now you can treat the RubyVM core like any other object. One interesting (if unwieldly-named) method that it offers is "core#define_singleton_method". It accepts an InstructionSequence -- compiled YARV bytecode -- and uses it to set up a singleton method in the object where it is invoked. Let's make it a little easier to use:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/948302.js?file=ffi4.rb"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now it is easy to create methods using bytecode sequences:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;script src="https://gist.github.com/948305.js?file=ffi5.rb"&gt;&lt;/script&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(&lt;a href="https://gist.github.com/948318"&gt;Complete code example&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444476750146085480-7554825002162646105?l=teleologi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teleologi.blogspot.com/feeds/7554825002162646105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://teleologi.blogspot.com/2011/04/at-home-hes-tourist-ffi-for-ruby.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444476750146085480/posts/default/7554825002162646105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444476750146085480/posts/default/7554825002162646105'/><link rel='alternate' type='text/html' href='http://teleologi.blogspot.com/2011/04/at-home-hes-tourist-ffi-for-ruby.html' title='At home he&apos;s a tourist: FFI for Ruby internals'/><author><name>Riley</name><uri>http://www.blogger.com/profile/07124698414324231625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444476750146085480.post-5055469171028157701</id><published>2011-04-02T10:43:00.000-07:00</published><updated>2011-04-06T19:26:57.793-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='BDD'/><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Good Reasons to Use RSpec</title><content type='html'>&lt;div&gt;It's been recently &lt;a href="http://twitter.com/dhh/status/52815575465992194"&gt;suggested&lt;/a&gt; that RSpec owes its popularity to fashion, and that people don't understand the alternatives. My experience is different.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;I've been using &lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt; to test Ruby code for about five years. Before RSpec, I used Ruby's &lt;a href="http://test-unit.rubyforge.org/"&gt;Test::Unit&lt;/a&gt;, as well as a number of other &lt;a href="http://en.wikipedia.org/wiki/XUnit"&gt;xUnit&lt;/a&gt;-style frameworks for Perl and Java. I was never happy with the earlier frameworks, but I was convinced that unit testing was worthwhile so I made do with what was available.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I switched to RSpec because in very little time I found it more helpful than other frameworks I had used. The reason is this: RSpec helps me to alternate between writing code and writing tests without having to &lt;a href="http://www.joelonsoftware.com/articles/fog0000000022.html"&gt;switch contexts&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By using the description of behavior as the model of testing, RSpec answers the question of what to test before you have to ask. It's more than syntactic sugar. It's conceptual sugar. I find that not having to think so much about the testing framework, I'm freed up to think about the tests themselves, so I write better tests and more of them.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;RSpec has "no discernible benefit" over other frameworks? It depends on who is doing the discerning. I find plenty of good reasons to use RSpec, and I have a lot of company.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444476750146085480-5055469171028157701?l=teleologi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teleologi.blogspot.com/feeds/5055469171028157701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://teleologi.blogspot.com/2011/04/good-reasons-to-use-rspec.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444476750146085480/posts/default/5055469171028157701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444476750146085480/posts/default/5055469171028157701'/><link rel='alternate' type='text/html' href='http://teleologi.blogspot.com/2011/04/good-reasons-to-use-rspec.html' title='Good Reasons to Use RSpec'/><author><name>Riley</name><uri>http://www.blogger.com/profile/07124698414324231625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7444476750146085480.post-8436697790711758711</id><published>2011-03-13T14:35:00.000-07:00</published><updated>2011-03-13T11:56:32.316-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='software development'/><category scheme='http://www.blogger.com/atom/ns#' term='pragmatism'/><title type='text'>Agile Software Development: The Good Parts</title><content type='html'>&lt;div&gt;Like Javascript, Agile has become all but unavoidable. In &lt;i&gt;&lt;a href="http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742"&gt;Javascript: The Good Parts&lt;/a&gt;, &lt;/i&gt;Douglas Crockford briefly imagines the world as it might have been if Java applets had not been displaced by Javascript as the client-side web application platform of choice. "But Java did fail, and Javascript is flourishing, so there is evidence that Javascript did something right."&lt;/div&gt;&lt;br /&gt;&lt;div&gt;There are reasons, too, for Agile's popularity, and some of them are good reasons. As with Javascript, it pays to identify the bits that work and avoid those that lead to unnecessary problems.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Agile boils down to a series of tradeoffs. Some of the things that Agile sacrifices may not be dispensable in some or even most projects. And some of the things that it optimizes for may not figure into a project's viability.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Here are a few ideas associated with Agile that I have found to have broad application, and which, if they continue to prove useful, I hope will be preserved by future trends in the management of software development. This list isn't complete.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Development is research and should inform design, not just execute it&lt;/li&gt;&lt;li&gt;An incomplete implementation and the feedback it elicits is often a better guide to what users need than a priori requirements&lt;/li&gt;&lt;li&gt;Tests make it easier to introduce new behavior while preserving the old&lt;/li&gt;&lt;li&gt;Pay the cost of change on the installment plan&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7444476750146085480-8436697790711758711?l=teleologi.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://teleologi.blogspot.com/feeds/8436697790711758711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://teleologi.blogspot.com/2011/03/agile-software-development-good-parts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7444476750146085480/posts/default/8436697790711758711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7444476750146085480/posts/default/8436697790711758711'/><link rel='alternate' type='text/html' href='http://teleologi.blogspot.com/2011/03/agile-software-development-good-parts.html' title='Agile Software Development: The Good Parts'/><author><name>Riley</name><uri>http://www.blogger.com/profile/07124698414324231625</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
