From b5e2cf891206a69fc5e217c339497cf478340fbc Mon Sep 17 00:00:00 2001 From: Wynn Netherland Date: Mon, 12 Apr 2010 09:58:35 -0500 Subject: [PATCH] Initial commit --- .bundle/config | 2 + .components | 7 + .gitignore | 7 + Gemfile | 23 ++ app/app.rb | 41 +++ app/controllers/pages.rb | 72 ++++ app/helpers/pages_helper.rb | 36 ++ app/models/file_model.rb | 109 ++++++ app/models/page.rb | 129 +++++++ app/views/layouts/.emptydirectory | 0 app/views/layouts/application.haml | 25 ++ app/views/not_found.haml | 13 + app/views/pages/_categories.haml | 6 + app/views/pages/_comments.haml | 8 + app/views/pages/_feed.haml | 5 + app/views/pages/_social.haml | 5 + app/views/pages/_summary.haml | 8 + app/views/pages/atom.builder | 28 ++ app/views/pages/error.haml | 13 + app/views/pages/index.haml | 11 + app/views/pages/page.haml | 35 ++ app/views/pages/sitemap.builder | 15 + app/views/shared/_analytics.haml | 10 + config.ru | 2 + config/apps.rb | 20 ++ config/boot.rb | 21 ++ config/config.yml | 55 +++ config/config.yml.sample | 55 +++ content/menu.txt | 3 + content/pages/about.mdown | 1 + content/pages/about/test.mdown | 1 + .../a-ruby-gem-for-the-new-linkedin-api.mdown | 9 + ...3-collection-of-c-components-exposed.mdown | 72 ++++ ...lerator-titanium-mobile-0-8-0-is-out.mdown | 18 + ...raph-graph-your-app-store-sales-data.mdown | 11 + ...aruby-cucumber-from-the-command-line.mdown | 23 ++ ...deploy-cakephp-apps-using-capistrano.mdown | 11 + ...ght-configuration-management-for-rub.mdown | 11 + .../congomongo-use-mongodb-from-clojure.mdown | 22 ++ ...l-caching-couchdb-client-for-node-js.mdown | 30 ++ content/pages/articles/cspec-bdd-for-c.mdown | 27 ++ ...orean-mock-rubys-time-now-with-style.mdown | 31 ++ .../do-simple-async-javascript-library.mdown | 64 ++++ ...eak-apart-documents-into-images-text.mdown | 15 + .../drupal-7-0-alpha-1-released.mdown | 18 + ...s-css-animation-javascript-framework.mdown | 15 + ...pisode-0-0-4-chrome-os-thor-and-roar.mdown | 8 + ...cebooks-hiphop-leaves-phpers-dancing.mdown | 18 + .../fancy-buttons-with-compass-and-sass.mdown | 16 + .../faye-pub-sub-for-rack-nodejs.mdown | 27 ++ .../fiber-php-interface-to-couchdb.mdown | 22 ++ .../pages/articles/firefox-3-6-beta-2.mdown | 15 + .../firequery-jquery-love-for-firebug.mdown | 16 + ...-open-source-bounty-from-seaofclouds.mdown | 23 ++ ...os-x-browser-platform-based-on-webki.mdown | 9 + ...oursquarex-foursquare-client-for-osx.mdown | 11 + ...vid-recordon-on-facebook-open-source.mdown | 22 ++ ...l-a-console-app-to-manage-lighthouse.mdown | 25 ++ .../friendly-nosql-with-mysql-in-ruby.mdown | 9 + ...onal-cocoa-applications-using-webkit.mdown | 13 + ...safer-way-to-monkey-patch-javascript.mdown | 21 ++ ...ve-the-javascript-frameworks-you-alr.mdown | 11 + ...-v2-now-in-python-client-library-for.mdown | 37 ++ .../google-chrome-os-chromium-os.mdown | 16 + content/pages/articles/google-go.mdown | 9 + ...e-flash-runtime-written-in-pure-java.mdown | 9 + .../gospecify-bdd-library-for-google-go.mdown | 9 + ...gritter-1-6-growl-like-notifications.mdown | 9 + ...dbrake-0-9-4-released-64-bit-support.mdown | 13 + ...-projects-between-things-and-harvest.mdown | 13 + ...hotcocoa-macruby-hotcocoa-ui-library.mdown | 31 ++ ...eckboxes-turn-boring-checkboxes-into.mdown | 13 + ...-implementation-built-on-the-dynamic.mdown | 9 + ...mit-rails-plugin-for-asset-packaging.mdown | 8 + .../javascript-as-a-teaching-tool.mdown | 9 + ...le-job-board-in-sinatra-mongo-effigy.mdown | 11 + ...le-javascript-library-for-complex-we.mdown | 22 ++ ...3-backwards-compatibility-plugin-for.mdown | 9 + ...a-haml-like-language-written-in-json.mdown | 17 + ...-errors-and-improve-your-jquery-usag.mdown | 11 + ...or-both-client-and-server-javascript.mdown | 55 +++ .../kohana-the-swift-php-framework.mdown | 14 + ...ight-client-side-json-document-store.mdown | 18 + ...-client-library-for-interacting-with.mdown | 11 + .../masonry-grid-layout-for-jquery.mdown | 12 + ...iew-open-source-cover-flow-for-obj-c.mdown | 9 + ...ed-client-an-erlang-memcached-client.mdown | 13 + ...static-site-generator-with-haml-sass.mdown | 13 + ...ugin-for-web-based-mongomapper-admin.mdown | 9 + ...ngrations-migrations-for-mongomapper.mdown | 23 ++ ...e-agnostic-ruby-background-job-proce.mdown | 17 + ...o4jr-social-rest-interface-for-neo4j.mdown | 11 + ...architecture-a-platform-for-building.mdown | 23 ++ ...aperboy-a-node-js-static-page-module.mdown | 39 ++ ...nodejs-evented-i-o-for-v8-javascript.mdown | 13 + .../opera-10-10-unite-turbo-awesome.mdown | 24 ++ ...ff-kick-off-a-new-erlang-otp-project.mdown | 32 ++ ...el-persistance-database-system-for-n.mdown | 16 + ...hpmoadmin-mongodb-admin-tool-for-php.mdown | 27 ++ ...icard-a-micro-framekwork-for-node-js.mdown | 13 + ...rd-a-web-interface-w-node-management.mdown | 13 + .../pages/articles/qt-4-6-the-trailer.mdown | 9 + ...uery-plugin-to-filter-animate-html-l.mdown | 27 ++ ...user-interactions-with-your-web-site.mdown | 11 + .../pages/articles/rails-2-3-5-released.mdown | 16 + .../pages/articles/rails-3-0-beta-gem.mdown | 13 + .../pages/articles/restler-for-node-js.mdown | 18 + ...e-document-store-built-on-json-and-r.mdown | 29 ++ ...-extremely-fast-running-unit-testing.mdown | 21 ++ .../rippin-off-python-w-chris-wanstrath.mdown | 14 + .../ripple-ruby-client-for-riak.mdown | 28 ++ .../scss-css-style-syntax-for-sass.mdown | 15 + ...le-sms-based-wiki-using-google-voice.mdown | 21 ++ ...rn-presentation-software-a-developer.mdown | 26 ++ .../simfinger-mobile-mac-screencasts.mdown | 16 + ...lightweight-slider-plugin-for-jquery.mdown | 29 ++ ...ss-browser-platform-javascript-sound.mdown | 19 + ...storytlr-php-lifestreaming-for-geeks.mdown | 30 ++ ...ry-beautiful-iphone-ui-class-library.mdown | 11 + ...mplate-compilation-framework-in-ruby.mdown | 9 + .../text-haml-haml-parser-in-perl.mdown | 11 + ...hings-rb-ruby-lib-cli-for-things-mac.mdown | 33 ++ ...-git-make-developing-with-git-easier.mdown | 13 + ...e-filters-when-tailing-the-changelog.mdown | 8 + .../topup-a-lightbox-for-jquery.mdown | 9 + ...to-the-metal-blogging-on-top-of-rack.mdown | 30 ++ .../tradui-civic-hacking-for-haiti.mdown | 43 +++ ...er-node-node-js-based-tweetstreaming.mdown | 9 + ...ki-simple-uikit-for-complex-web-apps.mdown | 15 + ...derscore-js-a-bowtie-for-jquerys-tux.mdown | 7 + .../articles/underscore-lua-from-mirven.mdown | 9 + ...rting-on-the-gathered-rackamole-data.mdown | 11 + .../articles/webfinger-libraries-emerge.mdown | 28 ++ ...r-ruby-rack-rails-application-server.mdown | 23 ++ .../articles/welcome-to-the-changelog.mdown | 15 + .../articles/wordpress-2-9-released.mdown | 17 + .../episode-0-0-1-haml-sass-and-compass.mdown | 6 + ...pisode-0-0-2-first-weekly-show-21-29.mdown | 11 + ...-0-3-googles-go-programming-language.mdown | 10 + .../episode-0-0-5-document-cloud.mdown | 8 + ...-bristol-from-lesseverything-and-wee.mdown | 8 + ...7-mike-dirolf-from-10gen-and-mongodb.mdown | 22 ++ ...ll-culpepper-from-appcelerator-titan.mdown | 17 + ...-fix-me-configliere-and-more-node-js.mdown | 18 + ...de-0-1-0-chris-wanstrath-from-github.mdown | 10 + ...-1-1-john-nunemaker-from-mongomapper.mdown | 22 ++ ...isode-0-1-2-gordon-is-such-a-showoff.mdown | 25 ++ ...hacking-with-luigi-montanez-and-jere.mdown | 30 ++ ...4-andy-gross-and-sean-cribbs-on-riak.mdown | 14 + ...ulver-on-oauth-hurl-it-baconfile-and.mdown | 24 ++ content/pages/tagged/add-ons.mdown | 5 + content/pages/tagged/admin.mdown | 5 + content/pages/tagged/android.mdown | 5 + content/pages/tagged/animation.mdown | 5 + content/pages/tagged/apache.mdown | 5 + content/pages/tagged/api.mdown | 5 + content/pages/tagged/app-store.mdown | 5 + content/pages/tagged/appcelerator.mdown | 5 + content/pages/tagged/apple.mdown | 5 + content/pages/tagged/apps.mdown | 5 + content/pages/tagged/asset-packaging.mdown | 5 + content/pages/tagged/assets.mdown | 5 + content/pages/tagged/async.mdown | 5 + content/pages/tagged/audio.mdown | 5 + content/pages/tagged/automation.mdown | 5 + content/pages/tagged/backgroundjobs.mdown | 5 + content/pages/tagged/basho.mdown | 5 + content/pages/tagged/bdd.mdown | 5 + content/pages/tagged/beta.mdown | 5 + content/pages/tagged/blogging.mdown | 5 + content/pages/tagged/bounty.mdown | 5 + content/pages/tagged/browser.mdown | 5 + content/pages/tagged/buttons.mdown | 5 + content/pages/tagged/c.mdown | 5 + content/pages/tagged/cakephp.mdown | 5 + content/pages/tagged/capistrano.mdown | 5 + content/pages/tagged/civichacking.mdown | 5 + content/pages/tagged/cli.mdown | 5 + content/pages/tagged/clojars.mdown | 5 + content/pages/tagged/clojure.mdown | 5 + content/pages/tagged/cloud.mdown | 5 + content/pages/tagged/cocoa.mdown | 5 + content/pages/tagged/command-line.mdown | 5 + content/pages/tagged/compass.mdown | 5 + content/pages/tagged/compatibility.mdown | 5 + content/pages/tagged/computer-science.mdown | 5 + content/pages/tagged/configuration.mdown | 5 + content/pages/tagged/couchdb.mdown | 5 + content/pages/tagged/csharp.mdown | 5 + content/pages/tagged/css.mdown | 5 + content/pages/tagged/css3.mdown | 5 + content/pages/tagged/cucumber.mdown | 5 + content/pages/tagged/debugging.mdown | 5 + content/pages/tagged/deployment.mdown | 5 + content/pages/tagged/design.mdown | 5 + content/pages/tagged/desktop.mdown | 5 + content/pages/tagged/development.mdown | 5 + content/pages/tagged/django.mdown | 5 + content/pages/tagged/document-oriented.mdown | 5 + content/pages/tagged/dojo.mdown | 5 + content/pages/tagged/dom.mdown | 5 + content/pages/tagged/dotent.mdown | 5 + content/pages/tagged/drupal.mdown | 5 + content/pages/tagged/dynamic.mdown | 5 + content/pages/tagged/episodes.mdown | 5 + content/pages/tagged/erlang.mdown | 5 + content/pages/tagged/facebook.mdown | 5 + content/pages/tagged/fancy-buttons.mdown | 5 + content/pages/tagged/firebug.mdown | 5 + content/pages/tagged/firefox.mdown | 5 + content/pages/tagged/flash.mdown | 5 + content/pages/tagged/foursquare.mdown | 5 + content/pages/tagged/fowa.mdown | 5 + content/pages/tagged/fowa2010.mdown | 5 + content/pages/tagged/framework.mdown | 5 + content/pages/tagged/frameworks.mdown | 5 + content/pages/tagged/fusejs.mdown | 5 + content/pages/tagged/gaming.mdown | 5 + content/pages/tagged/gem.mdown | 5 + content/pages/tagged/gems.mdown | 5 + content/pages/tagged/generator.mdown | 5 + content/pages/tagged/git.mdown | 5 + content/pages/tagged/github.mdown | 5 + content/pages/tagged/go-code.mdown | 5 + content/pages/tagged/go.mdown | 5 + content/pages/tagged/google-go.mdown | 5 + content/pages/tagged/google-voice.mdown | 5 + content/pages/tagged/google.mdown | 5 + content/pages/tagged/gov20.mdown | 5 + content/pages/tagged/government.mdown | 5 + content/pages/tagged/graphing.mdown | 5 + content/pages/tagged/growl.mdown | 5 + content/pages/tagged/guest-hosts.mdown | 5 + content/pages/tagged/hacking.mdown | 5 + content/pages/tagged/haiti.mdown | 5 + content/pages/tagged/haml.mdown | 5 + content/pages/tagged/heroku.mdown | 5 + content/pages/tagged/html5.mdown | 5 + content/pages/tagged/interviews.mdown | 5 + content/pages/tagged/iphone.mdown | 5 + content/pages/tagged/itunes.mdown | 5 + content/pages/tagged/jason.mdown | 5 + content/pages/tagged/java.mdown | 5 + content/pages/tagged/javascript.mdown | 5 + content/pages/tagged/jobboard.mdown | 5 + content/pages/tagged/jobs.mdown | 5 + content/pages/tagged/jquery.mdown | 5 + content/pages/tagged/json.mdown | 5 + content/pages/tagged/jsonp.mdown | 5 + content/pages/tagged/languages.mdown | 5 + content/pages/tagged/layout.mdown | 5 + content/pages/tagged/less.mdown | 5 + content/pages/tagged/libraries.mdown | 5 + content/pages/tagged/library.mdown | 5 + content/pages/tagged/lifestreaming.mdown | 5 + content/pages/tagged/lighthouse.mdown | 5 + content/pages/tagged/linkedin.mdown | 5 + content/pages/tagged/location.mdown | 5 + content/pages/tagged/lua.mdown | 5 + content/pages/tagged/mac.mdown | 5 + content/pages/tagged/meetups.mdown | 5 + content/pages/tagged/memcached.mdown | 5 + content/pages/tagged/migrations.mdown | 5 + content/pages/tagged/mobile.mdown | 5 + content/pages/tagged/mongo.mdown | 5 + content/pages/tagged/mongodb.mdown | 5 + content/pages/tagged/mongomapper.mdown | 5 + content/pages/tagged/monkey-patching.mdown | 5 + content/pages/tagged/movies.mdown | 5 + content/pages/tagged/multi-touch.mdown | 5 + content/pages/tagged/mvc.mdown | 5 + content/pages/tagged/mysql.mdown | 5 + content/pages/tagged/news.mdown | 5 + content/pages/tagged/node-js.mdown | 5 + content/pages/tagged/nodejs.mdown | 5 + content/pages/tagged/nosql.mdown | 5 + content/pages/tagged/obj-c.mdown | 5 + content/pages/tagged/open-source.mdown | 5 + content/pages/tagged/optimization.mdown | 5 + content/pages/tagged/os.mdown | 5 + content/pages/tagged/osx.mdown | 5 + content/pages/tagged/otp.mdown | 5 + content/pages/tagged/palm-pre.mdown | 5 + content/pages/tagged/palm.mdown | 5 + content/pages/tagged/performance.mdown | 5 + content/pages/tagged/perl.mdown | 5 + content/pages/tagged/php.mdown | 5 + content/pages/tagged/plugins.mdown | 5 + content/pages/tagged/presentations.mdown | 5 + .../pages/tagged/programing-language.mdown | 5 + content/pages/tagged/prototype.mdown | 5 + content/pages/tagged/pubsub.mdown | 5 + content/pages/tagged/puppet.mdown | 5 + content/pages/tagged/python.mdown | 5 + content/pages/tagged/queues.mdown | 5 + content/pages/tagged/rack.mdown | 5 + content/pages/tagged/rails.mdown | 5 + content/pages/tagged/releases.mdown | 5 + content/pages/tagged/rest.mdown | 5 + content/pages/tagged/rhino.mdown | 5 + content/pages/tagged/riak.mdown | 5 + content/pages/tagged/ruby.mdown | 5 + content/pages/tagged/sales.mdown | 5 + content/pages/tagged/sass.mdown | 5 + content/pages/tagged/scaling.mdown | 5 + content/pages/tagged/screencast.mdown | 5 + content/pages/tagged/screencasting.mdown | 5 + content/pages/tagged/screencasts.mdown | 5 + content/pages/tagged/scriptaculous.mdown | 5 + content/pages/tagged/scripting.mdown | 5 + content/pages/tagged/server-side.mdown | 5 + content/pages/tagged/server.mdown | 5 + content/pages/tagged/sinatra.mdown | 5 + content/pages/tagged/slides.mdown | 5 + content/pages/tagged/social-media.mdown | 5 + content/pages/tagged/sound.mdown | 5 + content/pages/tagged/ssb.mdown | 5 + content/pages/tagged/static.mdown | 5 + content/pages/tagged/svn.mdown | 5 + content/pages/tagged/tail.mdown | 5 + content/pages/tagged/talks.mdown | 5 + content/pages/tagged/testing.mdown | 5 + content/pages/tagged/things.mdown | 5 + content/pages/tagged/timetracking.mdown | 5 + content/pages/tagged/titanium.mdown | 5 + content/pages/tagged/tools.mdown | 5 + content/pages/tagged/toto.mdown | 5 + content/pages/tagged/twitter.mdown | 5 + content/pages/tagged/ui.mdown | 5 + content/pages/tagged/underscore.mdown | 5 + content/pages/tagged/unit-testing.mdown | 5 + content/pages/tagged/varnish.mdown | 5 + content/pages/tagged/video.mdown | 5 + content/pages/tagged/webfinger.mdown | 5 + .../pages/tagged/what-we-are-watching.mdown | 5 + content/pages/tagged/wiki.mdown | 5 + content/pages/tagged/wordpress.mdown | 5 + content/pages/tagged/wrappers.mdown | 5 + lib/config.rb | 79 ++++ lib/path.rb | 10 + lib/sass.rb | 12 + public/favicon.ico | 0 public/javascripts/application.js | 1 + public/javascripts/jquery.js | 19 + spec/atom_spec.rb | 137 +++++++ spec/model_factory.rb | 106 ++++++ spec/models_spec.rb | 312 ++++++++++++++++ spec/page_spec.rb | 340 ++++++++++++++++++ spec/sitemap_spec.rb | 100 ++++++ spec/spec.opts | 1 + spec/spec.rake | 6 + spec/spec_helper.rb | 34 ++ 352 files changed, 5034 insertions(+) create mode 100644 .bundle/config create mode 100644 .components create mode 100644 .gitignore create mode 100644 Gemfile create mode 100644 app/app.rb create mode 100644 app/controllers/pages.rb create mode 100644 app/helpers/pages_helper.rb create mode 100644 app/models/file_model.rb create mode 100644 app/models/page.rb create mode 100644 app/views/layouts/.emptydirectory create mode 100644 app/views/layouts/application.haml create mode 100644 app/views/not_found.haml create mode 100644 app/views/pages/_categories.haml create mode 100644 app/views/pages/_comments.haml create mode 100644 app/views/pages/_feed.haml create mode 100644 app/views/pages/_social.haml create mode 100644 app/views/pages/_summary.haml create mode 100644 app/views/pages/atom.builder create mode 100644 app/views/pages/error.haml create mode 100644 app/views/pages/index.haml create mode 100644 app/views/pages/page.haml create mode 100644 app/views/pages/sitemap.builder create mode 100644 app/views/shared/_analytics.haml create mode 100644 config.ru create mode 100644 config/apps.rb create mode 100644 config/boot.rb create mode 100644 config/config.yml create mode 100644 config/config.yml.sample create mode 100644 content/menu.txt create mode 100644 content/pages/about.mdown create mode 100644 content/pages/about/test.mdown create mode 100644 content/pages/articles/a-ruby-gem-for-the-new-linkedin-api.mdown create mode 100644 content/pages/articles/ajax-org-o3-collection-of-c-components-exposed.mdown create mode 100644 content/pages/articles/appcelerator-titanium-mobile-0-8-0-is-out.mdown create mode 100644 content/pages/articles/appsalesgraph-graph-your-app-store-sales-data.mdown create mode 100644 content/pages/articles/aruby-cucumber-from-the-command-line.mdown create mode 100644 content/pages/articles/capcake-deploy-cakephp-apps-using-capistrano.mdown create mode 100644 content/pages/articles/configliere-lightweight-configuration-management-for-rub.mdown create mode 100644 content/pages/articles/congomongo-use-mongodb-from-clojure.mdown create mode 100644 content/pages/articles/cradle-a-high-level-caching-couchdb-client-for-node-js.mdown create mode 100644 content/pages/articles/cspec-bdd-for-c.mdown create mode 100644 content/pages/articles/delorean-mock-rubys-time-now-with-style.mdown create mode 100644 content/pages/articles/do-simple-async-javascript-library.mdown create mode 100644 content/pages/articles/docsplit-break-apart-documents-into-images-text.mdown create mode 100644 content/pages/articles/drupal-7-0-alpha-1-released.mdown create mode 100644 content/pages/articles/emile-js-css-animation-javascript-framework.mdown create mode 100644 content/pages/articles/episode-0-0-4-chrome-os-thor-and-roar.mdown create mode 100644 content/pages/articles/facebooks-hiphop-leaves-phpers-dancing.mdown create mode 100644 content/pages/articles/fancy-buttons-with-compass-and-sass.mdown create mode 100644 content/pages/articles/faye-pub-sub-for-rack-nodejs.mdown create mode 100644 content/pages/articles/fiber-php-interface-to-couchdb.mdown create mode 100644 content/pages/articles/firefox-3-6-beta-2.mdown create mode 100644 content/pages/articles/firequery-jquery-love-for-firebug.mdown create mode 100644 content/pages/articles/fix-me-100-open-source-bounty-from-seaofclouds.mdown create mode 100644 content/pages/articles/fluidium-native-mac-os-x-browser-platform-based-on-webki.mdown create mode 100644 content/pages/articles/foursquarex-foursquare-client-for-osx.mdown create mode 100644 content/pages/articles/fowa-2010-david-recordon-on-facebook-open-source.mdown create mode 100644 content/pages/articles/fresnel-a-console-app-to-manage-lighthouse.mdown create mode 100644 content/pages/articles/friendly-nosql-with-mysql-in-ruby.mdown create mode 100644 content/pages/articles/functional-cocoa-applications-using-webkit.mdown create mode 100644 content/pages/articles/fusebox-a-safer-way-to-monkey-patch-javascript.mdown create mode 100644 content/pages/articles/fusejs-aims-to-improve-the-javascript-frameworks-you-alr.mdown create mode 100644 content/pages/articles/google-analytics-api-v2-now-in-python-client-library-for.mdown create mode 100644 content/pages/articles/google-chrome-os-chromium-os.mdown create mode 100644 content/pages/articles/google-go.mdown create mode 100644 content/pages/articles/gordon-an-open-source-flash-runtime-written-in-pure-java.mdown create mode 100644 content/pages/articles/gospecify-bdd-library-for-google-go.mdown create mode 100644 content/pages/articles/gritter-1-6-growl-like-notifications.mdown create mode 100644 content/pages/articles/handbrake-0-9-4-released-64-bit-support.mdown create mode 100644 content/pages/articles/harvestthings-sync-projects-between-things-and-harvest.mdown create mode 100644 content/pages/articles/hotcocoa-macruby-hotcocoa-ui-library.mdown create mode 100644 content/pages/articles/iphone-style-checkboxes-turn-boring-checkboxes-into.mdown create mode 100644 content/pages/articles/ironjs-a-javascript-implementation-built-on-the-dynamic.mdown create mode 100644 content/pages/articles/jammit-rails-plugin-for-asset-packaging.mdown create mode 100644 content/pages/articles/javascript-as-a-teaching-tool.mdown create mode 100644 content/pages/articles/job-board-a-simple-job-board-in-sinatra-mongo-effigy.mdown create mode 100644 content/pages/articles/jquery-behavior-simple-javascript-library-for-complex-we.mdown create mode 100644 content/pages/articles/jquery-compat-1-3-backwards-compatibility-plugin-for.mdown create mode 100644 content/pages/articles/jquery-haml-a-haml-like-language-written-in-json.mdown create mode 100644 content/pages/articles/jquery-lint-find-and-errors-and-improve-your-jquery-usag.mdown create mode 100644 content/pages/articles/jspec-robust-bdd-for-both-client-and-server-javascript.mdown create mode 100644 content/pages/articles/kohana-the-swift-php-framework.mdown create mode 100644 content/pages/articles/lawnchair-a-lightweight-client-side-json-document-store.mdown create mode 100644 content/pages/articles/libcloud-pure-python-client-library-for-interacting-with.mdown create mode 100644 content/pages/articles/masonry-grid-layout-for-jquery.mdown create mode 100644 content/pages/articles/mbcoverflowview-open-source-cover-flow-for-obj-c.mdown create mode 100644 content/pages/articles/memcached-client-an-erlang-memcached-client.mdown create mode 100644 content/pages/articles/middleman-a-static-site-generator-with-haml-sass.mdown create mode 100644 content/pages/articles/mongo-admin-rails-plugin-for-web-based-mongomapper-admin.mdown create mode 100644 content/pages/articles/mongrations-migrations-for-mongomapper.mdown create mode 100644 content/pages/articles/navvy-simple-database-agnostic-ruby-background-job-proce.mdown create mode 100644 content/pages/articles/neo4jr-social-rest-interface-for-neo4j.mdown create mode 100644 content/pages/articles/nextgen-mmo-architecture-a-platform-for-building.mdown create mode 100644 content/pages/articles/node-paperboy-a-node-js-static-page-module.mdown create mode 100644 content/pages/articles/nodejs-evented-i-o-for-v8-javascript.mdown create mode 100644 content/pages/articles/opera-10-10-unite-turbo-awesome.mdown create mode 100644 content/pages/articles/otp-kickoff-kick-off-a-new-erlang-otp-project.mdown create mode 100644 content/pages/articles/persistence-high-level-persistance-database-system-for-n.mdown create mode 100644 content/pages/articles/phpmoadmin-mongodb-admin-tool-for-php.mdown create mode 100644 content/pages/articles/picard-a-micro-framekwork-for-node-js.mdown create mode 100644 content/pages/articles/puppet-dashboard-a-web-interface-w-node-management.mdown create mode 100644 content/pages/articles/qt-4-6-the-trailer.mdown create mode 100644 content/pages/articles/quicksand-awesome-jquery-plugin-to-filter-animate-html-l.mdown create mode 100644 content/pages/articles/rackamole-track-user-interactions-with-your-web-site.mdown create mode 100644 content/pages/articles/rails-2-3-5-released.mdown create mode 100644 content/pages/articles/rails-3-0-beta-gem.mdown create mode 100644 content/pages/articles/restler-for-node-js.mdown create mode 100644 content/pages/articles/riak-high-performance-document-store-built-on-json-and-r.mdown create mode 100644 content/pages/articles/riot-an-extremely-fast-running-unit-testing.mdown create mode 100644 content/pages/articles/rippin-off-python-w-chris-wanstrath.mdown create mode 100644 content/pages/articles/ripple-ruby-client-for-riak.mdown create mode 100644 content/pages/articles/scss-css-style-syntax-for-sass.mdown create mode 100644 content/pages/articles/shortwiki-a-simple-sms-based-wiki-using-google-voice.mdown create mode 100644 content/pages/articles/showoff-the-best-darn-presentation-software-a-developer.mdown create mode 100644 content/pages/articles/simfinger-mobile-mac-screencasts.mdown create mode 100644 content/pages/articles/slidify-lightweight-slider-plugin-for-jquery.mdown create mode 100644 content/pages/articles/soundmanager2-cross-browser-platform-javascript-sound.mdown create mode 100644 content/pages/articles/storytlr-php-lifestreaming-for-geeks.mdown create mode 100644 content/pages/articles/tapkulibrary-beautiful-iphone-ui-class-library.mdown create mode 100644 content/pages/articles/temple-template-compilation-framework-in-ruby.mdown create mode 100644 content/pages/articles/text-haml-haml-parser-in-perl.mdown create mode 100644 content/pages/articles/things-rb-ruby-lib-cli-for-things-mac.mdown create mode 100644 content/pages/articles/thor-git-make-developing-with-git-easier.mdown create mode 100644 content/pages/articles/tip-use-filters-when-tailing-the-changelog.mdown create mode 100644 content/pages/articles/topup-a-lightbox-for-jquery.mdown create mode 100644 content/pages/articles/toto-close-to-the-metal-blogging-on-top-of-rack.mdown create mode 100644 content/pages/articles/tradui-civic-hacking-for-haiti.mdown create mode 100644 content/pages/articles/twitter-node-node-js-based-tweetstreaming.mdown create mode 100644 content/pages/articles/uki-simple-uikit-for-complex-web-apps.mdown create mode 100644 content/pages/articles/underscore-js-a-bowtie-for-jquerys-tux.mdown create mode 100644 content/pages/articles/underscore-lua-from-mirven.mdown create mode 100644 content/pages/articles/wackamole-reporting-on-the-gathered-rackamole-data.mdown create mode 100644 content/pages/articles/webfinger-libraries-emerge.mdown create mode 100644 content/pages/articles/webroar-ruby-rack-rails-application-server.mdown create mode 100644 content/pages/articles/welcome-to-the-changelog.mdown create mode 100644 content/pages/articles/wordpress-2-9-released.mdown create mode 100644 content/pages/episodes/episode-0-0-1-haml-sass-and-compass.mdown create mode 100644 content/pages/episodes/episode-0-0-2-first-weekly-show-21-29.mdown create mode 100644 content/pages/episodes/episode-0-0-3-googles-go-programming-language.mdown create mode 100644 content/pages/episodes/episode-0-0-5-document-cloud.mdown create mode 100644 content/pages/episodes/episode-0-0-6-steven-bristol-from-lesseverything-and-wee.mdown create mode 100644 content/pages/episodes/episode-0-0-7-mike-dirolf-from-10gen-and-mongodb.mdown create mode 100644 content/pages/episodes/episode-0-0-8-marshall-culpepper-from-appcelerator-titan.mdown create mode 100644 content/pages/episodes/episode-0-0-9-fix-me-configliere-and-more-node-js.mdown create mode 100644 content/pages/episodes/episode-0-1-0-chris-wanstrath-from-github.mdown create mode 100644 content/pages/episodes/episode-0-1-1-john-nunemaker-from-mongomapper.mdown create mode 100644 content/pages/episodes/episode-0-1-2-gordon-is-such-a-showoff.mdown create mode 100644 content/pages/episodes/episode-0-1-3-civic-hacking-with-luigi-montanez-and-jere.mdown create mode 100644 content/pages/episodes/episode-0-1-4-andy-gross-and-sean-cribbs-on-riak.mdown create mode 100644 content/pages/episodes/episode-0-1-5-leah-culver-on-oauth-hurl-it-baconfile-and.mdown create mode 100644 content/pages/tagged/add-ons.mdown create mode 100644 content/pages/tagged/admin.mdown create mode 100644 content/pages/tagged/android.mdown create mode 100644 content/pages/tagged/animation.mdown create mode 100644 content/pages/tagged/apache.mdown create mode 100644 content/pages/tagged/api.mdown create mode 100644 content/pages/tagged/app-store.mdown create mode 100644 content/pages/tagged/appcelerator.mdown create mode 100644 content/pages/tagged/apple.mdown create mode 100644 content/pages/tagged/apps.mdown create mode 100644 content/pages/tagged/asset-packaging.mdown create mode 100644 content/pages/tagged/assets.mdown create mode 100644 content/pages/tagged/async.mdown create mode 100644 content/pages/tagged/audio.mdown create mode 100644 content/pages/tagged/automation.mdown create mode 100644 content/pages/tagged/backgroundjobs.mdown create mode 100644 content/pages/tagged/basho.mdown create mode 100644 content/pages/tagged/bdd.mdown create mode 100644 content/pages/tagged/beta.mdown create mode 100644 content/pages/tagged/blogging.mdown create mode 100644 content/pages/tagged/bounty.mdown create mode 100644 content/pages/tagged/browser.mdown create mode 100644 content/pages/tagged/buttons.mdown create mode 100644 content/pages/tagged/c.mdown create mode 100644 content/pages/tagged/cakephp.mdown create mode 100644 content/pages/tagged/capistrano.mdown create mode 100644 content/pages/tagged/civichacking.mdown create mode 100644 content/pages/tagged/cli.mdown create mode 100644 content/pages/tagged/clojars.mdown create mode 100644 content/pages/tagged/clojure.mdown create mode 100644 content/pages/tagged/cloud.mdown create mode 100644 content/pages/tagged/cocoa.mdown create mode 100644 content/pages/tagged/command-line.mdown create mode 100644 content/pages/tagged/compass.mdown create mode 100644 content/pages/tagged/compatibility.mdown create mode 100644 content/pages/tagged/computer-science.mdown create mode 100644 content/pages/tagged/configuration.mdown create mode 100644 content/pages/tagged/couchdb.mdown create mode 100644 content/pages/tagged/csharp.mdown create mode 100644 content/pages/tagged/css.mdown create mode 100644 content/pages/tagged/css3.mdown create mode 100644 content/pages/tagged/cucumber.mdown create mode 100644 content/pages/tagged/debugging.mdown create mode 100644 content/pages/tagged/deployment.mdown create mode 100644 content/pages/tagged/design.mdown create mode 100644 content/pages/tagged/desktop.mdown create mode 100644 content/pages/tagged/development.mdown create mode 100644 content/pages/tagged/django.mdown create mode 100644 content/pages/tagged/document-oriented.mdown create mode 100644 content/pages/tagged/dojo.mdown create mode 100644 content/pages/tagged/dom.mdown create mode 100644 content/pages/tagged/dotent.mdown create mode 100644 content/pages/tagged/drupal.mdown create mode 100644 content/pages/tagged/dynamic.mdown create mode 100644 content/pages/tagged/episodes.mdown create mode 100644 content/pages/tagged/erlang.mdown create mode 100644 content/pages/tagged/facebook.mdown create mode 100644 content/pages/tagged/fancy-buttons.mdown create mode 100644 content/pages/tagged/firebug.mdown create mode 100644 content/pages/tagged/firefox.mdown create mode 100644 content/pages/tagged/flash.mdown create mode 100644 content/pages/tagged/foursquare.mdown create mode 100644 content/pages/tagged/fowa.mdown create mode 100644 content/pages/tagged/fowa2010.mdown create mode 100644 content/pages/tagged/framework.mdown create mode 100644 content/pages/tagged/frameworks.mdown create mode 100644 content/pages/tagged/fusejs.mdown create mode 100644 content/pages/tagged/gaming.mdown create mode 100644 content/pages/tagged/gem.mdown create mode 100644 content/pages/tagged/gems.mdown create mode 100644 content/pages/tagged/generator.mdown create mode 100644 content/pages/tagged/git.mdown create mode 100644 content/pages/tagged/github.mdown create mode 100644 content/pages/tagged/go-code.mdown create mode 100644 content/pages/tagged/go.mdown create mode 100644 content/pages/tagged/google-go.mdown create mode 100644 content/pages/tagged/google-voice.mdown create mode 100644 content/pages/tagged/google.mdown create mode 100644 content/pages/tagged/gov20.mdown create mode 100644 content/pages/tagged/government.mdown create mode 100644 content/pages/tagged/graphing.mdown create mode 100644 content/pages/tagged/growl.mdown create mode 100644 content/pages/tagged/guest-hosts.mdown create mode 100644 content/pages/tagged/hacking.mdown create mode 100644 content/pages/tagged/haiti.mdown create mode 100644 content/pages/tagged/haml.mdown create mode 100644 content/pages/tagged/heroku.mdown create mode 100644 content/pages/tagged/html5.mdown create mode 100644 content/pages/tagged/interviews.mdown create mode 100644 content/pages/tagged/iphone.mdown create mode 100644 content/pages/tagged/itunes.mdown create mode 100644 content/pages/tagged/jason.mdown create mode 100644 content/pages/tagged/java.mdown create mode 100644 content/pages/tagged/javascript.mdown create mode 100644 content/pages/tagged/jobboard.mdown create mode 100644 content/pages/tagged/jobs.mdown create mode 100644 content/pages/tagged/jquery.mdown create mode 100644 content/pages/tagged/json.mdown create mode 100644 content/pages/tagged/jsonp.mdown create mode 100644 content/pages/tagged/languages.mdown create mode 100644 content/pages/tagged/layout.mdown create mode 100644 content/pages/tagged/less.mdown create mode 100644 content/pages/tagged/libraries.mdown create mode 100644 content/pages/tagged/library.mdown create mode 100644 content/pages/tagged/lifestreaming.mdown create mode 100644 content/pages/tagged/lighthouse.mdown create mode 100644 content/pages/tagged/linkedin.mdown create mode 100644 content/pages/tagged/location.mdown create mode 100644 content/pages/tagged/lua.mdown create mode 100644 content/pages/tagged/mac.mdown create mode 100644 content/pages/tagged/meetups.mdown create mode 100644 content/pages/tagged/memcached.mdown create mode 100644 content/pages/tagged/migrations.mdown create mode 100644 content/pages/tagged/mobile.mdown create mode 100644 content/pages/tagged/mongo.mdown create mode 100644 content/pages/tagged/mongodb.mdown create mode 100644 content/pages/tagged/mongomapper.mdown create mode 100644 content/pages/tagged/monkey-patching.mdown create mode 100644 content/pages/tagged/movies.mdown create mode 100644 content/pages/tagged/multi-touch.mdown create mode 100644 content/pages/tagged/mvc.mdown create mode 100644 content/pages/tagged/mysql.mdown create mode 100644 content/pages/tagged/news.mdown create mode 100644 content/pages/tagged/node-js.mdown create mode 100644 content/pages/tagged/nodejs.mdown create mode 100644 content/pages/tagged/nosql.mdown create mode 100644 content/pages/tagged/obj-c.mdown create mode 100644 content/pages/tagged/open-source.mdown create mode 100644 content/pages/tagged/optimization.mdown create mode 100644 content/pages/tagged/os.mdown create mode 100644 content/pages/tagged/osx.mdown create mode 100644 content/pages/tagged/otp.mdown create mode 100644 content/pages/tagged/palm-pre.mdown create mode 100644 content/pages/tagged/palm.mdown create mode 100644 content/pages/tagged/performance.mdown create mode 100644 content/pages/tagged/perl.mdown create mode 100644 content/pages/tagged/php.mdown create mode 100644 content/pages/tagged/plugins.mdown create mode 100644 content/pages/tagged/presentations.mdown create mode 100644 content/pages/tagged/programing-language.mdown create mode 100644 content/pages/tagged/prototype.mdown create mode 100644 content/pages/tagged/pubsub.mdown create mode 100644 content/pages/tagged/puppet.mdown create mode 100644 content/pages/tagged/python.mdown create mode 100644 content/pages/tagged/queues.mdown create mode 100644 content/pages/tagged/rack.mdown create mode 100644 content/pages/tagged/rails.mdown create mode 100644 content/pages/tagged/releases.mdown create mode 100644 content/pages/tagged/rest.mdown create mode 100644 content/pages/tagged/rhino.mdown create mode 100644 content/pages/tagged/riak.mdown create mode 100644 content/pages/tagged/ruby.mdown create mode 100644 content/pages/tagged/sales.mdown create mode 100644 content/pages/tagged/sass.mdown create mode 100644 content/pages/tagged/scaling.mdown create mode 100644 content/pages/tagged/screencast.mdown create mode 100644 content/pages/tagged/screencasting.mdown create mode 100644 content/pages/tagged/screencasts.mdown create mode 100644 content/pages/tagged/scriptaculous.mdown create mode 100644 content/pages/tagged/scripting.mdown create mode 100644 content/pages/tagged/server-side.mdown create mode 100644 content/pages/tagged/server.mdown create mode 100644 content/pages/tagged/sinatra.mdown create mode 100644 content/pages/tagged/slides.mdown create mode 100644 content/pages/tagged/social-media.mdown create mode 100644 content/pages/tagged/sound.mdown create mode 100644 content/pages/tagged/ssb.mdown create mode 100644 content/pages/tagged/static.mdown create mode 100644 content/pages/tagged/svn.mdown create mode 100644 content/pages/tagged/tail.mdown create mode 100644 content/pages/tagged/talks.mdown create mode 100644 content/pages/tagged/testing.mdown create mode 100644 content/pages/tagged/things.mdown create mode 100644 content/pages/tagged/timetracking.mdown create mode 100644 content/pages/tagged/titanium.mdown create mode 100644 content/pages/tagged/tools.mdown create mode 100644 content/pages/tagged/toto.mdown create mode 100644 content/pages/tagged/twitter.mdown create mode 100644 content/pages/tagged/ui.mdown create mode 100644 content/pages/tagged/underscore.mdown create mode 100644 content/pages/tagged/unit-testing.mdown create mode 100644 content/pages/tagged/varnish.mdown create mode 100644 content/pages/tagged/video.mdown create mode 100644 content/pages/tagged/webfinger.mdown create mode 100644 content/pages/tagged/what-we-are-watching.mdown create mode 100644 content/pages/tagged/wiki.mdown create mode 100644 content/pages/tagged/wordpress.mdown create mode 100644 content/pages/tagged/wrappers.mdown create mode 100644 lib/config.rb create mode 100644 lib/path.rb create mode 100644 lib/sass.rb create mode 100644 public/favicon.ico create mode 100644 public/javascripts/application.js create mode 100644 public/javascripts/jquery.js create mode 100644 spec/atom_spec.rb create mode 100644 spec/model_factory.rb create mode 100644 spec/models_spec.rb create mode 100644 spec/page_spec.rb create mode 100644 spec/sitemap_spec.rb create mode 100644 spec/spec.opts create mode 100644 spec/spec.rake create mode 100644 spec/spec_helper.rb diff --git a/.bundle/config b/.bundle/config new file mode 100644 index 0000000..b8d4716 --- /dev/null +++ b/.bundle/config @@ -0,0 +1,2 @@ +--- +BUNDLE_WITHOUT: "" diff --git a/.components b/.components new file mode 100644 index 0000000..a5af1fe --- /dev/null +++ b/.components @@ -0,0 +1,7 @@ +--- +:test: rspec +:renderer: haml +:script: jquery +:stylesheet: sass +:orm: none +:mock: none diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..85df2d0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +log/**/* +tmp/**/* +bin/* +vendor/gems/* +!vendor/gems/cache/ +.sass-cache/* \ No newline at end of file diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..57d18dd --- /dev/null +++ b/Gemfile @@ -0,0 +1,23 @@ +source :rubygems + +# Project requirements +gem 'rake' +gem 'rack-flash' +gem 'thin' # or mongrel +gem "builder", "2.1.2" +gem "rdiscount", "1.5.8" +gem "RedCloth", "4.2.2" + +# Component requirements +gem 'haml' + +# Test requirements +gem 'rspec', :require => "spec", :group => "test" +gem 'rack-test', :require => 'rack/test', :group => 'test' + +gem "hpricot", "0.8.2", :group => "test" +gem "rspec_hpricot_matchers", "1.0", :group => "test" +gem "test-unit", "1.2.3" + +# Padrino +gem 'padrino', "0.9.9" diff --git a/app/app.rb b/app/app.rb new file mode 100644 index 0000000..d726e81 --- /dev/null +++ b/app/app.rb @@ -0,0 +1,41 @@ +class Presto < Padrino::Application + configure do + register SassInitializer + + ## + # Application-specific configuration options + # + # set :raise_errors, true # Show exceptions (default for development) + # set :public, "foo/bar" # Location for static assets (default root/public) + # set :sessions, false # Enabled by default + # set :reload, false # Reload application files (default in development) + # set :default_builder, "foo" # Set a custom form builder (default 'StandardFormBuilder') + # set :locale_path, "bar" # Set path for I18n translations (default your_app/locales) + # disable :padrino_helpers # Disables padrino markup helpers (enabled by default if present) + # disable :padrino_mailer # Disables padrino mailer (enabled by default if present) + # disable :flash # Disables rack-flash (enabled by default) + # enable :authentication # Enable padrino-admin authentication (disabled by default) + # layout :my_layout # Layout can be in views/layouts/foo.ext or views/foo.ext (default :application) + # + + set :haml, {:format => :html5 } + + end + + ## + # You can configure for a specified environment like: + # + # configure :development do + # set :foo, :bar + # end + # + + ## + # You can manage errors like: + # + # error 404 do + # render 'errors/404' + # end + # + +end \ No newline at end of file diff --git a/app/controllers/pages.rb b/app/controllers/pages.rb new file mode 100644 index 0000000..5bafa03 --- /dev/null +++ b/app/controllers/pages.rb @@ -0,0 +1,72 @@ +Presto.controllers :pages do + # get :index, :map => "/foo/bar" do + # session[:foo] = "bar" + # render 'index' + # end + + # get :sample, :map => "/sample/url", :respond_to => [:any, :js] do + # case content_type + # when :js then ... + # else ... + # end + + # get :foo, :with => :id do + # "Maps to url '/foo/#{params[:id]}'" + # end + + # get "/example" do + # "Hello world!" + # end + + before do + @menu_items = Page.menu_items + @title = Nesta::Config.title + @subtitle = Nesta::Config.subtitle + @keywords = Nesta::Config.keywords + @description = Nesta::Config.description + @author = Nesta::Config.author + @google_analytics_code = Nesta::Config.google_analytics_code + @heading = @title + + end + + get :index, :map => '/' do + + @title = "#{@title} - #{@subtitle}" + @articles = Page.find_articles[0..7] + @body_class = "home" + render 'pages/index' + end + + get :feed, :map => '/feed' do + content_type :xml, :charset => "utf-8" + @articles = Page.find_articles.select { |a| a.date }[0..9] + render 'pages/atom' + end + + get :sitemap, :map => "/sitemap.xml" do + content_type :xml, :charset => "utf-8" + @pages = Page.find_all + @last = @pages.map { |page| page.last_modified }.inject do |latest, page| + (page > latest) ? page : latest + end + render 'pages/sitemap' + end + + get :attachments, :map => '/attachments/{:filename,(\w|\-|\.)}' do + puts params[:filename] + file = File.join( + Nesta::Config.attachment_path, params[:filename]) + send_file(file, :disposition => nil) + end + + get :catchall, :map => '*splat' do + @page = Page.find_by_path(File.join(params[:splat])) + raise Sinatra::NotFound if @page.nil? + @title = @page.title + @description = @page.description + @keywords = @page.keywords + render 'pages/page' + end + +end \ No newline at end of file diff --git a/app/helpers/pages_helper.rb b/app/helpers/pages_helper.rb new file mode 100644 index 0000000..517b5af --- /dev/null +++ b/app/helpers/pages_helper.rb @@ -0,0 +1,36 @@ +# Helper methods defined here can be accessed in any controller or view in the application + +Presto.helpers do + + def nesta_atom_id_for_page(page) + published = page.date.strftime('%Y-%m-%d') + "tag:#{request.host},#{published}:#{page.abspath}" + end + + def atom_id(page = nil) + if page + page.atom_id || nesta_atom_id_for_page(page) + else + "tag:#{request.host},2009:/" + end + end + + def url_for(page) + File.join(base_url, page.path) + end + + def base_url + url = "http://#{request.host}" + request.port == 80 ? url : url + ":#{request.port}" + end + + def absolute_urls(text) + text.gsub!(/( @@cache[path].mtime + end + + def self.load(path) + FORMATS.each do |format| + filename = model_path("#{path}.#{format}") + if File.exist?(filename) && needs_loading?(path, filename) + @@cache[path] = self.new(filename) + break + end + end + @@cache[path] + end + + def self.purge_cache + @@cache = {} + end + + def initialize(filename) + @filename = filename + @format = filename.split(".").last.to_sym + parse_file + @mtime = File.mtime(filename) + end + + def permalink + File.basename(@filename, ".*") + end + + def path + abspath.sub(/^\//, "") + end + + def abspath + prefix = File.dirname(@filename).sub(Nesta::Config.page_path, "") + File.join(prefix, permalink) + end + + def to_html + case @format + when :mdown, :markdown, :md + RDiscount.new(markup).to_html + when :haml + Haml::Engine.new(markup).to_html + when :textile + RedCloth.new(markup).to_html + end + end + + def last_modified + @last_modified ||= File.stat(@filename).mtime + end + + def description + metadata("description") + end + + def keywords + metadata("keywords") + end + + private + def markup + @markup + end + + def metadata(key) + @metadata[key] + end + + def paragraph_is_metadata(text) + text.split("\n").first =~ /^[\w ]+:/ + end + + def parse_file + first_para, remaining = File.open(@filename).read.split(/\r?\n\r?\n/, 2) + @metadata = {} + if paragraph_is_metadata(first_para) + @markup = remaining + for line in first_para.split("\n") do + key, value = line.split(/\s*:\s*/, 2) + @metadata[key.downcase] = value.chomp + end + else + @markup = [first_para, remaining].join("\n\n") + end + rescue Errno::ENOENT # file not found + raise Sinatra::NotFound + end +end diff --git a/app/models/page.rb b/app/models/page.rb new file mode 100644 index 0000000..4cbfd62 --- /dev/null +++ b/app/models/page.rb @@ -0,0 +1,129 @@ +class Page < FileModel + module ClassMethods + def model_path(basename = nil) + Nesta::Config.page_path(basename) + end + + def find_by_path(path) + load(path) + end + + def find_articles + find_all.select { |page| page.date }.sort { |x, y| y.date <=> x.date } + end + + def menu_items + menu = Nesta::Config.content_path("menu.txt") + pages = [] + if File.exist?(menu) + File.open(menu).each { |line| pages << Page.load(line.chomp) } + end + pages + end + end + + extend ClassMethods + + def ==(other) + self.path == other.path + end + + def heading + regex = case @format + when :mdown + /^#\s*(.*)/ + when :haml + /^\s*%h1\s+(.*)/ + when :textile + /^\s*h1\.\s+(.*)/ + end + markup =~ regex + Regexp.last_match(1) + end + + def date(format = nil) + @date ||= if metadata("date") + if format == :xmlschema + Time.parse(metadata("date")).xmlschema + else + DateTime.parse(metadata("date")) + end + end + end + + def atom_id + metadata("atom id") + end + + def read_more + metadata("read more") || "Continue reading" + end + + def title + if self.respond_to?(:parent) && self.parent + "#{self.heading} - #{self.parent.heading}" + else + "#{self.heading} - #{Nesta::Config.title}" + end + end + + def summary + if summary_text = metadata("summary") + summary_text.gsub!('\n', "\n") + case @format + when :textile + RedCloth.new(summary_text).to_html + else + RDiscount.new(summary_text).to_html + end + end + end + + def body + case @format + when :mdown, :markdown, :md + body_text = markup.sub(/^#[^#].*$\r?\n(\r?\n)?/, "") + RDiscount.new(body_text).to_html + when :haml + body_text = markup.sub(/^\s*%h1\s+.*$\r?\n(\r?\n)?/, "") + Haml::Engine.new(body_text).render + when :textile + body_text = markup.sub(/^\s*h1\.\s+.*$\r?\n(\r?\n)?/, "") + RedCloth.new(body_text).to_html + end + end + + def categories + categories = metadata("categories") + paths = categories.nil? ? [] : categories.split(",").map { |p| p.strip } + valid_paths(paths).map { |p| Page.find_by_path(p) }.sort do |x, y| + x.heading.downcase <=> y.heading.downcase + end + end + + def parent + Page.load(File.dirname(path)) + end + + def pages + Page.find_all.select do |page| + page.date.nil? && page.categories.include?(self) + end.sort do |x, y| + x.heading.downcase <=> y.heading.downcase + end + end + + def articles + Page.find_articles.select { |article| article.categories.include?(self) } + end + + private + def valid_paths(paths) + paths.select do |path| + FORMATS.detect do |format| + File.exist?( + File.join(Nesta::Config.page_path, "#{path}.#{format}")) + end + end + end +end diff --git a/app/views/layouts/.emptydirectory b/app/views/layouts/.emptydirectory new file mode 100644 index 0000000..e69de29 diff --git a/app/views/layouts/application.haml b/app/views/layouts/application.haml new file mode 100644 index 0000000..20bf1a4 --- /dev/null +++ b/app/views/layouts/application.haml @@ -0,0 +1,25 @@ +!!! +%html{ :lang => "en", "xml:lang" => "en", :xmlns => 'http://www.w3.org/1999/xhtml' } + %head + %meta{ "http-equiv" => "content-type", "content" => "text/html; charset=utf-8" } + - if @description + %meta{ "name" => "description", "content" => @description } + - if @keywords + %meta{ "name" => "keywords", "content" => @keywords } + %title= @title + %link{ :href => "/css/master.css", :media => "screen", :rel => "stylesheet", :type => "text/css" } + %link{ :href => "/articles.xml", :rel => "alternate", :type => "application/atom+xml" } + %body{ :class => @body_class } + #container + #wrapper + = yield + + #footer + %p + Powered by + = succeed "," do + %a{ :href => "http://effectif.com/nesta" } nesta + designed by + %a{ :href => "http://effectif.com" } Graham Ashton + + = partial 'shared/analytics' diff --git a/app/views/not_found.haml b/app/views/not_found.haml new file mode 100644 index 0000000..2aab2fc --- /dev/null +++ b/app/views/not_found.haml @@ -0,0 +1,13 @@ +.breadcrumb + %a{ :href => "/" } Home + +#sidebar + = haml :categories, :layout => false + = haml :feed, :layout => false + +#content + %h1 Page not found + + %p + Please try another page or, if you think something is wrong with our site, + do get in touch and let us know. diff --git a/app/views/pages/_categories.haml b/app/views/pages/_categories.haml new file mode 100644 index 0000000..15f2e5d --- /dev/null +++ b/app/views/pages/_categories.haml @@ -0,0 +1,6 @@ +- if ! @menu_items.empty? + %h2 Articles by category + %ul.menu + - @menu_items.each do |page| + %li + %a{ :href => page.abspath }= page.heading diff --git a/app/views/pages/_comments.haml b/app/views/pages/_comments.haml new file mode 100644 index 0000000..c1ad671 --- /dev/null +++ b/app/views/pages/_comments.haml @@ -0,0 +1,8 @@ +- if short_name = Nesta::Config.disqus_short_name + #disqus_thread + - if Sinatra::Application.environment == :development + %script{ :type => "text/javascript" } + var disqus_developer = true; + %script{ :type => "text/javascript", :src => "http://disqus.com/forums/#{short_name}/embed.js" } + %noscript + %a{ :href => "http://disqus.com/forums/#{short_name}/?url=ref" } View comments. diff --git a/app/views/pages/_feed.haml b/app/views/pages/_feed.haml new file mode 100644 index 0000000..4796152 --- /dev/null +++ b/app/views/pages/_feed.haml @@ -0,0 +1,5 @@ +- title ||= "our feed" +.feed + %a{ :href => "/feed", :title => "Subscribe to #{title}", :rel => "nofollow" } + Subscribe to + = title \ No newline at end of file diff --git a/app/views/pages/_social.haml b/app/views/pages/_social.haml new file mode 100644 index 0000000..5807727 --- /dev/null +++ b/app/views/pages/_social.haml @@ -0,0 +1,5 @@ +.social + %a{ :href => "http://delicious.com/post?url=#{url_for(@page)}&title=#{@page.heading}", :title => "Bookmark on delicious.com" } + %img{ :src => "/delicious.png", :alt => "Bookmark on delicous.com" } + %a{ :href => "http://digg.com/submit?phase=2&url=#{url_for(@page)}&title=#{@page.heading}", :title => "Digg it!" } + %img{ :src => "/digg.png", :alt => "Digg it!" } diff --git a/app/views/pages/_summary.haml b/app/views/pages/_summary.haml new file mode 100644 index 0000000..f1e2886 --- /dev/null +++ b/app/views/pages/_summary.haml @@ -0,0 +1,8 @@ +- haml_tag heading do + %a{ :href => article.abspath }= article.heading +- if article.summary.nil? || article.summary.empty? + ~ article.body +- else + ~ article.summary + %p.read_more + %a{ :href => article.abspath }= article.read_more diff --git a/app/views/pages/atom.builder b/app/views/pages/atom.builder new file mode 100644 index 0000000..16325a7 --- /dev/null +++ b/app/views/pages/atom.builder @@ -0,0 +1,28 @@ +xml.instruct! +xml.feed :xmlns => "http://www.w3.org/2005/Atom" do + xml.title @title, :type => "text" + xml.generator "Nesta", :uri => "http://effectif.com/nesta" + xml.id atom_id + xml.link :href => "#{base_url}/feed", :rel => "self" + xml.link :href => base_url, :rel => "alternate" + xml.subtitle @subtitle, :type => "text" + xml.author do + xml.name @author["name"] if @author["name"] + xml.uri @author["uri"] if @author["uri"] + xml.email @author["email"] if @author["email"] + end if @author + @articles.each do |article| + xml.entry do + xml.title article.heading + xml.link :href => url_for(article), + :type => "text/html", + :rel => "alternate" + xml.id atom_id(article) + xml.content absolute_urls(article.body), :type => "html" + xml.published article.date(:xmlschema) + article.categories.each do |category| + xml.category :term => category.permalink + end + end + end +end diff --git a/app/views/pages/error.haml b/app/views/pages/error.haml new file mode 100644 index 0000000..fcace3f --- /dev/null +++ b/app/views/pages/error.haml @@ -0,0 +1,13 @@ +.breadcrumb + %a{ :href => "/" } Home + +#sidebar + = haml :categories, :layout => false + = haml :feed, :layout => false + +#content + %h1 Sorry, something went wrong + + %p + An error occurred whilst we were trying to serve your page. Please bear + with us, or in the mean time, try another page. diff --git a/app/views/pages/index.haml b/app/views/pages/index.haml new file mode 100644 index 0000000..5d0ed98 --- /dev/null +++ b/app/views/pages/index.haml @@ -0,0 +1,11 @@ +%h1 + = @heading + %small= @subtitle + +#sidebar + = partial 'pages/categories' + = partial 'pages/feed' + +#content + - @articles.each do |article| + = partial 'pages/summary', :locals => { :article => article, :heading => :h2 } diff --git a/app/views/pages/page.haml b/app/views/pages/page.haml new file mode 100644 index 0000000..0e4cfc8 --- /dev/null +++ b/app/views/pages/page.haml @@ -0,0 +1,35 @@ +.breadcrumb + %a{ :href => "/" } Home + > + - if @page.parent + %a{ :href => @page.parent.abspath }= @page.parent.heading + > + = @page.heading + +#sidebar + = partial 'pages/categories' + = partial 'pages/feed' + +#content + - if @page.date + .date= format_date(@page.date) + ~ @page.to_html + + - @page.pages.each do |page| + = partial 'pages/summary', :locals => { :article => page, :heading => :h3 } + + - unless @page.articles.empty? + %h2.articles= "Articles on #{@page.heading}" + + - @page.articles.each do |article| + = partial 'pages/summary', :locals => { :article => article, :heading => :h3 } + + - unless @page.categories.empty? + .categories + Filed under + - @page.categories.each do |category| + %a{ :href => category.abspath }= category.heading + + = partial 'pages/social' + = partial 'pages/feed', :locals => { :title => @site_title } + = partial 'pages/comments' diff --git a/app/views/pages/sitemap.builder b/app/views/pages/sitemap.builder new file mode 100644 index 0000000..ab5158d --- /dev/null +++ b/app/views/pages/sitemap.builder @@ -0,0 +1,15 @@ +xml.instruct! +xml.urlset :xmlns => "http://www.sitemaps.org/schemas/sitemap/0.9" do + xml.url do + xml.loc base_url + xml.changefreq "daily" + xml.priority "1.0" + xml.lastmod @last.xmlschema + end + @pages.each do |page| + xml.url do + xml.loc url_for(page) + xml.lastmod page.last_modified.xmlschema + end + end +end diff --git a/app/views/shared/_analytics.haml b/app/views/shared/_analytics.haml new file mode 100644 index 0000000..1aaccaf --- /dev/null +++ b/app/views/shared/_analytics.haml @@ -0,0 +1,10 @@ +- if @google_analytics_code + :javascript + var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); + document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); + + :javascript + try { + var pageTracker = _gat._getTracker("#{@google_analytics_code}"); + pageTracker._trackPageview(); + } catch(err) {} diff --git a/config.ru b/config.ru new file mode 100644 index 0000000..df825bf --- /dev/null +++ b/config.ru @@ -0,0 +1,2 @@ +require ::File.dirname(__FILE__) + '/config/boot.rb' +run Padrino.application \ No newline at end of file diff --git a/config/apps.rb b/config/apps.rb new file mode 100644 index 0000000..b317423 --- /dev/null +++ b/config/apps.rb @@ -0,0 +1,20 @@ +=begin + +This file mounts each application within the Padrino project to a specific path. +You can mount additional applications using any of these below: + + Padrino.mount("blog").to('/blog') + Padrino.mount("blog", :app_class => "BlogApp").to('/blog') + Padrino.mount("blog", :app_file => "/path/to/blog/app.rb").to('/blog') + +Note that mounted apps by default should be placed into 'apps/app_name'. + +By default, this file simply mounts the core app which was generated with this project. +However, the mounted core can be modified as needed: + + Padrino.mount_core(:app_file => "/path/to/file", :app_class => "Blog") + +=end + +# Mounts the core application for this project +Padrino.mount_core("Presto") \ No newline at end of file diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 0000000..0abc6ee --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,21 @@ +# Defines our constants +PADRINO_ENV = ENV["PADRINO_ENV"] ||= ENV["RACK_ENV"] ||= "development" unless defined?(PADRINO_ENV) +PADRINO_ROOT = File.dirname(__FILE__) + '/..' unless defined? PADRINO_ROOT + +begin + # Require the preresolved locked set of gems. + require File.expand_path('../../.bundle/environment', __FILE__) +rescue LoadError + # Fallback on doing the resolve at runtime. + require 'rubygems' + require 'bundler' + Bundler.setup +end + +Bundler.require(:default, PADRINO_ENV) +puts "=> Located #{Padrino.bundle} Gemfile for #{Padrino.env}" + +Padrino.load! + +# Nesta::Overrides.load_theme_app +# Nesta::Overrides.load_local_app \ No newline at end of file diff --git a/config/config.yml b/config/config.yml new file mode 100644 index 0000000..d75b2d4 --- /dev/null +++ b/config/config.yml @@ -0,0 +1,55 @@ +# Title and subheading for your site. Used on the home page and in page +# titles. +# +title: "My Site" +subtitle: "(change this text in config/config.yml)" + +# If you want to set the descrition or keywords meta tags on your site's +# home page, do it here. +# +# description: "Set this to something that describes your home page" +# keywords: "enter 3 or 4, comma separated, keywords" + +# You should really specify your content's author when generating an +# Atom feed. Specify at least one of name, uri or email, and Nesta will +# include it in your feed. See the Atom spec for more info: +# +# http://www.atomenabled.org/developers/syndication/atom-format-spec.php#element.feed +# +# author: +# name: Your Name +# uri: http://yourhomepage.com +# email: you@yourdomain.com + +# You can stick with the default look and feel, or use a theme. Themes are +# easy to create or install, and live inside the themes directory. You +# can also use scripts/theme to install them. +# +# theme: name-of-theme + +# If you want to use the Disqus service (http://disqus.com) to display +# comments on your site, register a Disqus account and then specify your +# site's short name here. A comment form will automatically be added to +# the bottom of your pages. +# +# disqus_short_name: mysite + +# The remaining configuration settings are set separately in development +# (i.e. when running on your local workstation) and production (when running +# on your live server). +# +# content - the root directory where nesta will look for your article files. +# Should contain "articles", "categories" and "attachments" subdirectories +# that contain your actual content. +# +# google_analytics_code - set this if you want Google Analytics to track +# traffic on your site. Probably best not to set it in development mode. +# +development: + cache: false + content: content + +production: + cache: true + content: /var/apps/nesta/shared/content + # google_analytics_code: "UA-???????-?" diff --git a/config/config.yml.sample b/config/config.yml.sample new file mode 100644 index 0000000..d75b2d4 --- /dev/null +++ b/config/config.yml.sample @@ -0,0 +1,55 @@ +# Title and subheading for your site. Used on the home page and in page +# titles. +# +title: "My Site" +subtitle: "(change this text in config/config.yml)" + +# If you want to set the descrition or keywords meta tags on your site's +# home page, do it here. +# +# description: "Set this to something that describes your home page" +# keywords: "enter 3 or 4, comma separated, keywords" + +# You should really specify your content's author when generating an +# Atom feed. Specify at least one of name, uri or email, and Nesta will +# include it in your feed. See the Atom spec for more info: +# +# http://www.atomenabled.org/developers/syndication/atom-format-spec.php#element.feed +# +# author: +# name: Your Name +# uri: http://yourhomepage.com +# email: you@yourdomain.com + +# You can stick with the default look and feel, or use a theme. Themes are +# easy to create or install, and live inside the themes directory. You +# can also use scripts/theme to install them. +# +# theme: name-of-theme + +# If you want to use the Disqus service (http://disqus.com) to display +# comments on your site, register a Disqus account and then specify your +# site's short name here. A comment form will automatically be added to +# the bottom of your pages. +# +# disqus_short_name: mysite + +# The remaining configuration settings are set separately in development +# (i.e. when running on your local workstation) and production (when running +# on your live server). +# +# content - the root directory where nesta will look for your article files. +# Should contain "articles", "categories" and "attachments" subdirectories +# that contain your actual content. +# +# google_analytics_code - set this if you want Google Analytics to track +# traffic on your site. Probably best not to set it in development mode. +# +development: + cache: false + content: content + +production: + cache: true + content: /var/apps/nesta/shared/content + # google_analytics_code: "UA-???????-?" diff --git a/content/menu.txt b/content/menu.txt new file mode 100644 index 0000000..d3175ca --- /dev/null +++ b/content/menu.txt @@ -0,0 +1,3 @@ +tagged/ruby +tagged/python +tagged/audio \ No newline at end of file diff --git a/content/pages/about.mdown b/content/pages/about.mdown new file mode 100644 index 0000000..fa2fa56 --- /dev/null +++ b/content/pages/about.mdown @@ -0,0 +1 @@ +# About us \ No newline at end of file diff --git a/content/pages/about/test.mdown b/content/pages/about/test.mdown new file mode 100644 index 0000000..23db175 --- /dev/null +++ b/content/pages/about/test.mdown @@ -0,0 +1 @@ +# This is a test \ No newline at end of file diff --git a/content/pages/articles/a-ruby-gem-for-the-new-linkedin-api.mdown b/content/pages/articles/a-ruby-gem-for-the-new-linkedin-api.mdown new file mode 100644 index 0000000..0ce025f --- /dev/null +++ b/content/pages/articles/a-ruby-gem-for-the-new-linkedin-api.mdown @@ -0,0 +1,9 @@ +repo: pengwynn/linkedin +date: Sun Nov 29 19:23:00 -0600 2009 +categories: github,ruby,gems,linkedin + +# A Ruby gem for the new LinkedIn API + +LinkedIn launched its new [API](http://developer.linkedin.com) last week, allowing any developer brave enough to implement OAuth to integrate with one of the largest social networks around. This new Ruby gem makes it easier to integrate your Ruby app with LinkedIn. + +[[source on GitHub](http://github.com/pengwynn/linkedin)] [[Blog article introduction](http://wynnnetherland.com/2009/11/link-linkedin-into-your-next-ruby-application/)] diff --git a/content/pages/articles/ajax-org-o3-collection-of-c-components-exposed.mdown b/content/pages/articles/ajax-org-o3-collection-of-c-components-exposed.mdown new file mode 100644 index 0000000..8ce7005 --- /dev/null +++ b/content/pages/articles/ajax-org-o3-collection-of-c-components-exposed.mdown @@ -0,0 +1,72 @@ +repo: ajaxorg/o3 +date: Tue Feb 23 03:49:00 -0600 2010 +categories: github,javascript,server-side + +# Ajax.org O3: Collection of C++ components exposed through a JavaScript API + +While at [FOWA 2010](http://events.carsonified.com/fowa/2010/miami/), [Adam Stacoviak](http://adamstacoviak.com/) caught up with the guys and gals at [Ajax.org](http://ajax.org). And since we've been on this Node.js kick for a bit now, maybe it's time we introduce you to the guys at Ajax.org and what they've been doing with C++ and JavaScript to make the Ajax.org Platform APF and Ajax.org O3 provide developers with easy to use libraries and tools in order to make the browser the dominant application platform. + +Definitely check out their codes and follow them on Twitter [@ajax_org](http://twitter.com/ajax_org). + + + +Photo courtesy of our friend [Kevin Milden](http://twitter.com/kMilden) of [New Leaders](http://newleaders.com/). + +Oh, and for those VC's or groups that provide funding to companies that are developing Open Source software, [Ruben](http://twitter.com/javruben) (CEO) and [Rik](http://twitter.com/rikarends) (CTO) are looking to gain funding to take them to the next level. + +#### Ajax.org O3 + +[Ajax.org O3](http://www.ajax.org/#o3) is a collection of C++ components which are exposed through a JavaScript API. On top of that it's also a library that allows you to create those components. Ajax.org O3 allows you to run the same code anywhere: + +* Optimized for speed and security +* Same API's everywhere +* Runtime environments + + + + + +#### Example of the O3 File API + + var root = o3.fs; + var files = root.children; + + //Iterating the files in a folder + o3.out("Current dir: " + root.path); + files.each(function(file){ + o3.out([ + file.name, + file.size, + file.modifiedDate + ].join(", ")); + }); + + //Read a file + o3.out(root.get("file.txt").data); + + //Create and write a new (or existing) file + root.get("newfile.txt").data = "test"; + + //Append to a file + if (root.get("newfile.txt").exist) + root.get("newfile.txt").data += "test"; + + //Write binary data + var img = new o3.image(); + //fill img data here + root.get("photo.jpg").data = img; + + //Or access the blob directly: + root.get("photo.jpg").blob = img.blob; + +#### Ajax.org Platform + +[Ajax.org Platform](http://www.ajax.org/#home) is a pure javascript application framework for creating real-time collaborative applications that run in the browser. Ajax.org Platform radically changes the way you write applications: + +* Live markup +* Markup and JSON api +* Collaborative backbone +* 100% open source software + +[[Homepage](http://www.ajax.org/)] [[O3 on GitHub](http://github.com/ajaxorg/o3)] [[Ajax.org O3](http://www.ajax.org/#o3)] +[[Ajax.org Platform](http://www.ajax.org/#home)] diff --git a/content/pages/articles/appcelerator-titanium-mobile-0-8-0-is-out.mdown b/content/pages/articles/appcelerator-titanium-mobile-0-8-0-is-out.mdown new file mode 100644 index 0000000..036215d --- /dev/null +++ b/content/pages/articles/appcelerator-titanium-mobile-0-8-0-is-out.mdown @@ -0,0 +1,18 @@ +repo: appcelerator/titanium_mobile +date: Mon Nov 30 20:21:45 -0600 2009 +categories: github,iphone,android,releases + +# Appcelerator Titanium Mobile 0.8.0 is out + +[Appcelerator](http://appcelerator.com) released version 0.8.0 of Titanium Mobile which allows developers to build native iPhone and Android apps using HTML, CSS, and JavaScript. New in this release: + +* Native Map Support +* Access to Contacts +* Native Coverflow View (iPhone only) +* Push Notifications (iPhone only) +* Custom Table Views and Grouped Views +* Embedded SQLite database file support +* Facebook Connect for Android +* Record Video (iPhone only) + +[[Product page]](http://www.appcelerator.com/products/titanium-mobile/) [[Source on GitHub]](http://github.com/appcelerator/titanium_mobile) [[Changelog]](http://www.codestrong.com/timobile/changelog/) diff --git a/content/pages/articles/appsalesgraph-graph-your-app-store-sales-data.mdown b/content/pages/articles/appsalesgraph-graph-your-app-store-sales-data.mdown new file mode 100644 index 0000000..7ff58c8 --- /dev/null +++ b/content/pages/articles/appsalesgraph-graph-your-app-store-sales-data.mdown @@ -0,0 +1,11 @@ +repo: maxklein/AppSalesGraph +date: Fri Jan 22 22:01:00 -0600 2010 +categories: github,python,itunes,app-store,graphing,sales + +# AppSalesGraph: graph your App Store sales data + +AppSalesGraph from [@maxklein](http://github.com/maxklein) is a Python application that allows you graph your sales data from the app store. + +![Screenshot](http://maxklein.github.com/AppSalesGraph/screenshot_mac.png) + +[[Source on GitHub](http://github.com/maxklein/AppSalesGraph/)] [[Homepage](http://maxklein.github.com/AppSalesGraph/)] diff --git a/content/pages/articles/aruby-cucumber-from-the-command-line.mdown b/content/pages/articles/aruby-cucumber-from-the-command-line.mdown new file mode 100644 index 0000000..e168874 --- /dev/null +++ b/content/pages/articles/aruby-cucumber-from-the-command-line.mdown @@ -0,0 +1,23 @@ +repo: aslakhellesoy/aruba +date: Sat Feb 13 21:14:34 -0600 2010 +categories: github,testing,cucumber,ruby,gems,command-line,cli + +# aruba - Cucumber steps for testing your command line apps + +Terminal junkies rejoice! Now you can use [Cucumber](http://cukes.info) to test your command line interfaces just like you do for your web apps. [Aruba](http://github.com/aslakhellesoy/aruba) from Cucumber creator [Aslak Hellesøy](http://github.com/aslakhellesoy) provides familiar step definitions for testing output, exit statuses, and file system commands. Here's an example feature file for testing exit statuses: + + + +Aruba provides the exit status step: + + + +To use Aruba just install the gem + + sudo gem install aruba + +and then require it in your `env.rb` or any file under `features/support` + + require 'aruba' + +[[Source on GitHub](http://github.com/aslakhellesoy/aruba)] [[Cucumber homepage](http://cukes.info)] diff --git a/content/pages/articles/capcake-deploy-cakephp-apps-using-capistrano.mdown b/content/pages/articles/capcake-deploy-cakephp-apps-using-capistrano.mdown new file mode 100644 index 0000000..9d1d74d --- /dev/null +++ b/content/pages/articles/capcake-deploy-cakephp-apps-using-capistrano.mdown @@ -0,0 +1,11 @@ +repo: jadb/capcake +date: Fri Jan 22 10:34:14 -0600 2010 +categories: github,php,cakephp,capistrano,deployment + +# Capcake: Deploy CakePHP apps using Capistrano + +[Capistrano](http://github.com/capistrano/capistrano) isn't just for Rubyists you know. [@jadb](http://github.com/jadb) wants to bring all you CakePHP folks to the party too: + +> Capcake extends Capistrano, removing the rails-ism, replacing them by more cake-ish ones + +[[Source on GitHub](http://github.com/jadb/capcake)] diff --git a/content/pages/articles/configliere-lightweight-configuration-management-for-rub.mdown b/content/pages/articles/configliere-lightweight-configuration-management-for-rub.mdown new file mode 100644 index 0000000..c339680 --- /dev/null +++ b/content/pages/articles/configliere-lightweight-configuration-management-for-rub.mdown @@ -0,0 +1,11 @@ +repo: mrflip/configliere +date: Thu Jan 07 20:55:00 -0600 2010 +categories: github,ruby,configuration + +# Configliere: lightweight configuration management for Ruby + +> Configliere manage settings from many sources: static constants, simple config files, environment variables, commandline options, straight ruby. You don’t have to predefine anything, but you can ask configliere to type-convert, require, document or password-obscure any of its fields. Modules can define config settings independently of each other and the main program. + +Bonus points for a hilarious [README](http://github.com/mrflip/configliere#readme). + +[[Source on GitHub](http://github.com/mrflip/configliere)] diff --git a/content/pages/articles/congomongo-use-mongodb-from-clojure.mdown b/content/pages/articles/congomongo-use-mongodb-from-clojure.mdown new file mode 100644 index 0000000..d480dc5 --- /dev/null +++ b/content/pages/articles/congomongo-use-mongodb-from-clojure.mdown @@ -0,0 +1,22 @@ +repo: somnium/congomongo +date: Wed Jan 20 09:28:00 -0600 2010 +categories: github,clojure,mongodb,clojars + +# congomongo: Use MongoDB from Clojure + +A close-to-the-metal wrapper for the MongoDB Java driver, congomongo brings all that cool NoSQL goodness to Clojure: + +Here's an ad-hoc query example from the [README](http://github.com/somnium/congomongo#readme): + + (fetch-one + :points + :where {:x {:$gt 10 + :$lt 20} + :y 42 + :z {:$gt 500}}) + + => {:x 12, :y 42, :z 504, :_ns "points", :_id ... } + +[@purcell's fork](http://github.com/purcell/congomongo/commit/6bf22de379996dfeac85d5ff5f3093e331acb783) adds [GridFS](http://www.mongodb.org/display/DOCS/GridFS) support. Woot! + +[[Source on GitHub](http://github.com/somnium/congomongo)][[congomongo on Clojars](http://clojars.org/search?q=congomongo)] diff --git a/content/pages/articles/cradle-a-high-level-caching-couchdb-client-for-node-js.mdown b/content/pages/articles/cradle-a-high-level-caching-couchdb-client-for-node-js.mdown new file mode 100644 index 0000000..9b06474 --- /dev/null +++ b/content/pages/articles/cradle-a-high-level-caching-couchdb-client-for-node-js.mdown @@ -0,0 +1,30 @@ +repo: cloudhead/cradle +date: Tue Feb 16 14:36:00 -0600 2010 +categories: github,nodejs,javascript,couchdb,rest + +# cradle - A high-level, caching, CouchDB client for Node.js + +Intended to be a higher-level API on top of Couch, [cradle](http://github.com/cloudhead/cradle) from [Alexis Sellier](http://github.com/cloudhead) tries to bridge what's best about [CouchDB](http://couchdb.apache.org/) and [Node.js](http://nodejs.org). Cradle comes with built-in write-through caching to boost speed and easier updates and deletes. + +Most methods from CouchDB map one-to-one with Cradle although some like `save` can orchestrate multiple operations. + +From the [README](http://github.com/cloudhead/cradle#readme) + + var cradle = require('cradle'); + var db = new(cradle.Connection).database('starwars'); + + db.get('vador').addCallback(function (doc) { + doc.name; // 'Darth Vador' + assert.equal(doc.force, 'dark'); + }); + + db.save('skywalker', { + force: 'light', + name: 'Luke Skywalker' + }).addCallback(function (res) { + // Handle success + }).addErrback(function (res) { + // Handle error + }); + +[[Source on GitHub](http://github.com/cloudhead/cradle)] [[Follow Alexis Sellier on Twitter](http://twitter.com/cloudhead)] diff --git a/content/pages/articles/cspec-bdd-for-c.mdown b/content/pages/articles/cspec-bdd-for-c.mdown new file mode 100644 index 0000000..dc87f81 --- /dev/null +++ b/content/pages/articles/cspec-bdd-for-c.mdown @@ -0,0 +1,27 @@ +repo: visionmedia/cspec +date: Thu Dec 03 14:17:14 -0600 2009 +categories: github,c,testing,bdd + +# CSpec - BDD with C + +Very nice, readable syntax from CSpec that alllows you to do behavior driven development with C. + + #include "cspec.h" + + static int nbefore_each; + + describe "CSpec before_each" + before_each + ++nbefore_each; + end + + it "should be called before each spec" + nbefore_each should equal 1 + end + + it "should be called before each spec" + nbefore_each should equal 2 + end + end + +[[Source on GitHub](http://github.com/visionmedia/cspec)] diff --git a/content/pages/articles/delorean-mock-rubys-time-now-with-style.mdown b/content/pages/articles/delorean-mock-rubys-time-now-with-style.mdown new file mode 100644 index 0000000..354eaae --- /dev/null +++ b/content/pages/articles/delorean-mock-rubys-time-now-with-style.mdown @@ -0,0 +1,31 @@ +repo: bebanjo/delorean +date: Fri Feb 26 21:42:24 -0600 2010 +categories: github,ruby,testing,movies + +# Delorean - mock Ruby's Time.now with style + +[![Delorean photo courtesy Giancarlo Pitocco](http://dl.dropbox.com/u/645329/delorean.png)](http://github.com/bebanjo/delorean) + +At The Changelog, we give bonus points for [witty project names](http://thechangelog.com/post/322569039/configliere-lightweight-configuration-management-for-rub). How could we pass up a repo named Delorean. + +[Delorean](http://github.com/bebanjo/delorean) is a smart way to mock Ruby's `Time.now` method thereby allowing you to travel in time. Why is this helpful? Testing. Consider the following spec from the [README](http://github.com/bebanjo/delorean#readme): + + it "should show latest created user" do + + time_travel_to(3.minutes.ago) { create_user :name => "John" } + time_travel_to(5.minutes.ago) { create_user :name => "Chris" } + + get 'show' + + response.should have_text("John") + response.should_not have_text("Chris") + + end + +Want to get back to 1985? + + after(:each) { back_to_the_present } + +Brilliant! + +[[Source on GitHub](http://github.com/bebanjo/delorean)] [[Back to the Future on IMDB for you youngsters](http://www.imdb.com/title/tt0088763/)] diff --git a/content/pages/articles/do-simple-async-javascript-library.mdown b/content/pages/articles/do-simple-async-javascript-library.mdown new file mode 100644 index 0000000..6905c74 --- /dev/null +++ b/content/pages/articles/do-simple-async-javascript-library.mdown @@ -0,0 +1,64 @@ +repo: creationix/do +date: Thu Feb 18 09:01:00 -0600 2010 +categories: github,javascript,nodejs,async,libraries + +# do - simple async JavaScript library + +At the risk of having to change our name to Changelog.js [as some have suggested](http://twitter.com/jsconf/status/9237686006), we feature another cool JavaScript library. [Do](http://github.com/creationix/do) from [Tim Caswell](http://twitter.com/creationix) who brought us the [How To Node blog](http://howtonode.org/). + +So what does Do do? First, it adds higher level processing for [continuables](http://boshi.inimino.org/3box/asof/1263250371783/fileIO/README.html), the callback pattern for asynchronous processing in Node.js. + +As Tim explains: + +> A continuable is a function that returns a curried version of itself instead of a result directly. The last two arguments are the callback and the errback. So a continuable won't execute until you attach callbacks to it: + + function divide(a, b) { return function (callback, errback) { + // the timeout it to prove that we're working asynchronously + setTimeout(function () { + if (b === 0) { + errback(new Error("Cannot divide by 0")); + } else { + callback(a / b); + } + }); + }} + + + divide(100, 10)(function (result) { + puts("the result is " + result); + }, function (error) { + throw error; + }); + +Building on continuables, Do adds two more important features. + +#### Do.parallel + +'Do.parallel' takes an array of actions and runs them in parallel + + Do.parallel( + Do.read("/etc/passwd"), + Do.read(__filename) + )(function (passwd, self) { + // Do something + }, error_handler); + +#### Do.chain + +`Do.chain` chains several actions together in the familiar jQuery style: + + Do.chain( + Do.read(__filename), + function (text) { + return Do.save("newfile", text); + }, + function () { + return Do.stat("newfile"); + } + )(function (stat) { + // Do something + }, error_handler); + +Check out the [README](http://github.com/creationix/do#readme) for full docs as well as other functions in Do. + +[[Source on GitHub](http://github.com/creationix/do)] diff --git a/content/pages/articles/docsplit-break-apart-documents-into-images-text.mdown b/content/pages/articles/docsplit-break-apart-documents-into-images-text.mdown new file mode 100644 index 0000000..168f3cd --- /dev/null +++ b/content/pages/articles/docsplit-break-apart-documents-into-images-text.mdown @@ -0,0 +1,15 @@ +repo: documentcloud/docsplit +date: Mon Dec 07 11:41:00 -0600 2009 +categories: github,ruby + +# Docsplit: Break Apart Documents into Images, Text, Pages and PDFs + +Docsplit is a command-line utility and Ruby library for splitting apart documents into their component parts: searchable UTF-8 plain text, page images or thumbnails in any format, PDFs, single pages, and document metadata (title, author, number of pages...) + +Under the hood, Docsplit is a thin wrapper around the excellent PDFBox, GraphicsMagick, and JODConverter libraries. PDFBox is used to extract text and metadata from PDF documents, as well as to split them apart into pages. GraphicsMagick is used to generate the page images (internally, it's rendering them with GhostScript). JODConverter communicates with OpenOffice to perform the PDF conversions. + +Hat tip: [@documentcloud](http://twitter.com/documentcloud/status/6436280510) [http://twitter.com/documentcloud/status/6436280510](http://twitter.com/documentcloud/status/6436280510) + +> More software releases! Take a look at ... http://documentcloud.github.com/docsplit/ + +[[code on GitHub](http://github.com/documentcloud/docsplit)] [[documentation](http://documentcloud.github.com/docsplit/)] diff --git a/content/pages/articles/drupal-7-0-alpha-1-released.mdown b/content/pages/articles/drupal-7-0-alpha-1-released.mdown new file mode 100644 index 0000000..91c1e2e --- /dev/null +++ b/content/pages/articles/drupal-7-0-alpha-1-released.mdown @@ -0,0 +1,18 @@ +repo: mikl/drupal +date: Fri Jan 15 13:07:44 -0600 2010 +categories: github,drupal,php + +# Drupal 7.0 Alpha 1 released + +> After nearly two years of development, we are proud to announce the release of the first alpha version of the Drupal 7.x family. This alpha includes a tremendous number of new features and new under-the-hood improvements for both users and developers. + +#### What's new, what's changed? + +* Revamped User Interface +* Custom Fields +* Image Handling +* Update Manager +* Front-end "under-the-hood" improvements +* Back-end "under-the-hood" improvements + +[[Mirror on GitHub](http://github.com/mikl/drupal/tree/DRUPAL-7-0-ALPHA1)] [[Official Release](http://drupal.org/drupal-7.0-alpha1)] [[Homepage](http://drupal.org/)] diff --git a/content/pages/articles/emile-js-css-animation-javascript-framework.mdown b/content/pages/articles/emile-js-css-animation-javascript-framework.mdown new file mode 100644 index 0000000..3030026 --- /dev/null +++ b/content/pages/articles/emile-js-css-animation-javascript-framework.mdown @@ -0,0 +1,15 @@ +repo: madrobby/emile +date: Tue Dec 01 13:31:50 -0600 2009 +categories: github,javascript,frameworks,animation + +# Emile.js - a no-thrills stand-alone CSS animation JavaScript framework + +Stand-alone CSS animation JavaScript mini-framework + +* Doesn't need a JavaScript framework +* Full set of CSS properties for animation (length-based and colors) +* Easing and callbacks +* Less than 50 lines of code + +[[Source on GitHub](http://github.com/madrobby/emile)] [[ +Follow @emilejs on Twitter ](http://twitter.com/emilejs)] diff --git a/content/pages/articles/episode-0-0-4-chrome-os-thor-and-roar.mdown b/content/pages/articles/episode-0-0-4-chrome-os-thor-and-roar.mdown new file mode 100644 index 0000000..f476de4 --- /dev/null +++ b/content/pages/articles/episode-0-0-4-chrome-os-thor-and-roar.mdown @@ -0,0 +1,8 @@ +date: Tue Dec 01 12:41:00 -0600 2009 +categories: + +# Episode 0.0.4 - Chrome OS, Thor, and ROaR (30:34) + +In this episode we discuss: [Google Chrome OS](http://thechangelog.com/post/255853114/google-chrome-os-chromium-os), [HandBrake 0.9.4](http://thechangelog.com/post/256716884/handbrake-0-9-4-released-64-bit-support), [CocoUI](http://thechangelog.com/post/258093819/functional-cocoa-applications-using-webkit), [Rails 2.3.5](http://thechangelog.com/post/259540919/rails-2-3-5-released), [Restler](http://thechangelog.com/post/259598588/restler-for-node-js) & [Node.js](http://thechangelog.com/post/261021600/nodejs-evented-i-o-for-v8-javascript), [Riot](http://thechangelog.com/post/259987077/riot-an-extremely-fast-running-unit-testing), [Thor-Git](http://thechangelog.com/post/260932630/thor-git-make-developing-with-git-easier) and [WebROaR](http://thechangelog.com/post/261042337/webroar-ruby-rack-rails-application-server). + + diff --git a/content/pages/articles/facebooks-hiphop-leaves-phpers-dancing.mdown b/content/pages/articles/facebooks-hiphop-leaves-phpers-dancing.mdown new file mode 100644 index 0000000..afafbf2 --- /dev/null +++ b/content/pages/articles/facebooks-hiphop-leaves-phpers-dancing.mdown @@ -0,0 +1,18 @@ +repo: facebook/hiphop-php +date: Wed Feb 03 21:24:00 -0600 2010 +categories: github,php,facebook,scaling,performance + +# Facebook's HipHop leaves PHPers dancing + +When Twitter faced early scaling issues, much was made of decisions to rewrite large portions of the Rails site in Scala. + +Facebook however has decided to double down on PHP, releasing [HipHop](http://github.com/facebook/hiphop-php), a PHP source code transfomer: + +> HipHop programmatically transforms your PHP source code into highly optimized C++ and then uses g++ to compile it. HipHop executes the source code in a semantically equivalent manner and sacrifices some rarely used features — such as eval() — in exchange for improved performance. HipHop includes a code transformer, a reimplementation of PHP's runtime system, and a rewrite of many common PHP Extensions to take advantage of these performance optimizations. + +** Update ** + +We posted this blind yesterday when GitHub was unavailable. Looks like the repo isn't public yet. Keep an eye out. [GitHub explore](http://github.com/explore) shows five watchers... + + +[[Source on GitHub](http://github.com/facebook/hiphop-php)] [[Announcement](http://developers.facebook.com/news.php?blog=1&story=358)] diff --git a/content/pages/articles/fancy-buttons-with-compass-and-sass.mdown b/content/pages/articles/fancy-buttons-with-compass-and-sass.mdown new file mode 100644 index 0000000..6615eb4 --- /dev/null +++ b/content/pages/articles/fancy-buttons-with-compass-and-sass.mdown @@ -0,0 +1,16 @@ +repo: imathis/fancy-buttons +date: Mon Nov 23 16:19:00 -0600 2009 +categories: sass,,github,compass,css,buttons + +# Create fancy buttons with Compass and Sass + +[Brandon Mathis](http://brandonmathis.com) released a [Compass](http://compass-style.org) extension to create fancy CSS buttons that includes: + +1. Button reset - to get browsers to the same starting point +2. Rounded corners, Text shadows, and Gradients + vendoring +3. Background image fallback +4. Padding, Text size, line-height, etc +5. Default, Hover, and Active states for all styles +6. Lots of tricky color math to generate beautiful gradients from one color + +[[blog post](http://brandonmathis.com/blog/2009/11/19/fancy-buttons-are-here/)] [[video](http://vimeo.com/7723529)] [[code](http://github.com/imathis/fancy-buttons)] diff --git a/content/pages/articles/faye-pub-sub-for-rack-nodejs.mdown b/content/pages/articles/faye-pub-sub-for-rack-nodejs.mdown new file mode 100644 index 0000000..95961cf --- /dev/null +++ b/content/pages/articles/faye-pub-sub-for-rack-nodejs.mdown @@ -0,0 +1,27 @@ +repo: jcoglan/faye +date: Wed Mar 03 09:03:49 -0600 2010 +categories: github,rack,ruby,javascript,jsonp,pubsub,nodejs + +# Faye - dirt simple pub/sub for Rack and Node.js + +Two way communication in the browser isn't easy. [James Coglan](http://jcoglan.com/) brings aims to change that with Faye: + +This is a fancybox test! + +> Faye is an implementation of the [Bayeux prototcol](http://svn.cometd.com/trunk/bayeux/bayeux.html), a publish-subscribe messaging protocol designed primarily to allow client-side JavaScript programs to send messages to each other with low latency over HTTP. + +Essentially, Bayeux lets applications publish and subscribe to data in named channels, both in the browser and the server: + + fayeClient.subscribe('/path/to/channel', function(message) { + // process received message object + }); + + fayeClient.publish('/some/other/channel', {foo: 'bar'}); + +Faye supports long polling and callback polling, depending on if you would like to keep a persistent HTTP connection open in the browser or use a JSONP callback. + +The really cool part is that Faye ships with functionally identical server implementations for both [Rack](http://rack.rubyforge.org/) and [Node.js](http://nodejs.org). + +We just might have to try this out to enhance [Tail](http://tail.thechangelog.com). + +[Source on GitHub](http://github.com/jcoglan/faye) [James Coglan on Twitter](http://twitter.com/jcoglan) diff --git a/content/pages/articles/fiber-php-interface-to-couchdb.mdown b/content/pages/articles/fiber-php-interface-to-couchdb.mdown new file mode 100644 index 0000000..7dbb865 --- /dev/null +++ b/content/pages/articles/fiber-php-interface-to-couchdb.mdown @@ -0,0 +1,22 @@ +repo: lgomez/fiber +date: Sat Feb 13 22:46:07 -0600 2010 +categories: github,php,couchdb,nosql + +# Fiber: A simple PHP interface to CouchDB + +Fiber from [Luis Gomez](http://twitter.com/luisgo) is a simple way to add [CouchDB](http://couchdb.apache.org/) storage to your PHP app. + +Given a User class that extends a Fiber Document: + + $user = User::find('john'); + $user->email = "john@example.com"; + $user->city = "San Francisco"; + $user->save(); + +Fiber also includes some nifty chaining: + + $user->set( array( "email" => "peter@example.com", "city" => "Caracas" ) )->save(); + +Check out the [examples](http://github.com/lgomez/fiber/blob/master/example/example.php) in the source. + +[[Source on GitHub](http://github.com/lgomez/fiber)] diff --git a/content/pages/articles/firefox-3-6-beta-2.mdown b/content/pages/articles/firefox-3-6-beta-2.mdown new file mode 100644 index 0000000..104d9e6 --- /dev/null +++ b/content/pages/articles/firefox-3-6-beta-2.mdown @@ -0,0 +1,15 @@ +repo: http://www.mozilla.com/en-US/firefox/3.6b2/releasenotes/ +date: Tue Nov 10 00:00:00 -0600 2009 +categories: firefox,css3,javascript,releases + +# Firefox 3.6 beta 2 + +Over 190 bug fixes and several cool new features for developers including + +* -moz-background-size +* -moz-linear-gradient and -moz-radial-gradient properties, is supported for background-image +* multiple background images +* @font-face now supports the new WOFF web font file format +* HTML5 video supports poster frames +* The multiple attribute is now supported on HTMLInputElement +* Gecko 1.9.2 introduces JavaScript 1.8.2 diff --git a/content/pages/articles/firequery-jquery-love-for-firebug.mdown b/content/pages/articles/firequery-jquery-love-for-firebug.mdown new file mode 100644 index 0000000..fce01cc --- /dev/null +++ b/content/pages/articles/firequery-jquery-love-for-firebug.mdown @@ -0,0 +1,16 @@ +repo: darwin/firequery +date: Thu Feb 11 09:36:46 -0600 2010 +categories: github,jquery,firefox,add-ons,plugins,development,javascript,debugging,screencasts + +# firequery - jQuery love for Firebug + +[Firequery](http://firequery.binaryage.com/) from [Antonin Hildebrand](http://github.com/darwin) is a neat tool that adds jQuery features to Joe Hewitt's [FireBug](http://getfirebug.com) add-on for Firefox including: + +* jQuery expressions are intelligently presented in Firebug Console and DOM inspector +* attached jQuery datas are first class citizens +* elements in jQuery collections are highlighted on hover +* jQuerify: enables you to inject jQuery into any web page + + + +[[Source on GitHub](http://github.com/darwin/firequery)] [[Homepage](http://firequery.binaryage.com/)] [[Quick screencast](http://screenr.com/1Nx)] diff --git a/content/pages/articles/fix-me-100-open-source-bounty-from-seaofclouds.mdown b/content/pages/articles/fix-me-100-open-source-bounty-from-seaofclouds.mdown new file mode 100644 index 0000000..5bcc22a --- /dev/null +++ b/content/pages/articles/fix-me-100-open-source-bounty-from-seaofclouds.mdown @@ -0,0 +1,23 @@ +repo: seaofclouds/fix-me +date: Fri Dec 11 20:03:00 -0600 2009 +categories: github,bounty,css + +# fix-me: $100 open source bounty from seaofclouds + +Got CSS chops? Fork this repo from [seaofclouds](http://github.com/seaofclouds), fix the layout and make one hundred bucks: + +> Scrollbars appear when they don't need to. This is due to the 100% height / min-height style. I've tried many solutions; none have stuck. + +Requirements + +* Fixed width and centered content and sidebar +* Height of content and sidebar must be the same +* Height of content and sidebar must grow to accommodate more content +* Height of content and sidebar must not be shorter than window height +* Height of header must remain flexible, and not impact the CSS used to fix this issue. +* Content and sidebar background images contain gradients that must extend to fill 100% width +* Scrollbars only when needed. +* No Javascript to fix the problem (I realize that with jquery, it would be trivial to set the height, but there's gotta be a way in CSS!) +* Target Browsers: Firefox 3+, Safari 3+, bonus points for ie7+8 (separate stylesheet okay) + +[[Source on GitHub](http://github.com/seaofclouds/fix-me/tree/)] [[Homepage](http://fixme.heroku.com/)] [[Follow @seaofclouds](http://twitter.com/seaofclouds)] diff --git a/content/pages/articles/fluidium-native-mac-os-x-browser-platform-based-on-webki.mdown b/content/pages/articles/fluidium-native-mac-os-x-browser-platform-based-on-webki.mdown new file mode 100644 index 0000000..25083f7 --- /dev/null +++ b/content/pages/articles/fluidium-native-mac-os-x-browser-platform-based-on-webki.mdown @@ -0,0 +1,9 @@ +repo: itod/fluidium +date: Wed Dec 16 13:53:17 -0600 2009 +categories: github,osx,desktop,ssb + +# Fluidium: Native Mac OS X Browser Platform based on WebKit + +More great stuff from [@itod](http://twitter.com/itod), Fluidium is a Native Mac OS X Browser Platform based on WebKit with a Cocoa plug-in architecture, tabs, userscripting, userstyles, URL shortcuts, Twitter integration, more. + +[[Source on GitHub](http://github.com/itod/fluidium)] diff --git a/content/pages/articles/foursquarex-foursquare-client-for-osx.mdown b/content/pages/articles/foursquarex-foursquare-client-for-osx.mdown new file mode 100644 index 0000000..be82c5c --- /dev/null +++ b/content/pages/articles/foursquarex-foursquare-client-for-osx.mdown @@ -0,0 +1,11 @@ +repo: codebutler/FoursquareX +date: Sun Jan 24 15:10:00 -0600 2010 +categories: github,osx,foursquare,desktop,cocoa,location,apps + +# FoursquareX: Foursquare client for OSX + +Now you can be the mayor of your cube farm on Foursquare in style. [FoursquareX](http://codebutler.github.com/foursquarex) is a sexy [Foursquare](http://foursquare.com/) client for Snow Leopard. Oh, and it's open source, so go ahead and fork it and add your own features. + + + +[[Source on GitHub](http://github.com/codebutler/FoursquareX)] [[Homepage](http://codebutler.github.com/foursquarex/)] diff --git a/content/pages/articles/fowa-2010-david-recordon-on-facebook-open-source.mdown b/content/pages/articles/fowa-2010-david-recordon-on-facebook-open-source.mdown new file mode 100644 index 0000000..9e79008 --- /dev/null +++ b/content/pages/articles/fowa-2010-david-recordon-on-facebook-open-source.mdown @@ -0,0 +1,22 @@ +date: Sat Feb 27 10:28:00 -0600 2010 +categories: open source,facebook,FOWA2010,FOWA,video + +# FOWA 2010: David Recordon on Facebook Open Source Projects + +At [Future of Web Apps 2010](http://events.carsonified.com/fowa/2010/miami) in Miami, Florida; Senior Open Programs Manager, [David Recordon](http://twitter.com/DaveMan692) sat with Ryan Carson for just over 10 minutes to talk about a few of the notable Open Source projects Facebook is driving. + + + +The projects discussed were: + +* [OpenID](http://openid.net/) and [Facebook Connect](http://developers.facebook.com/connect.php) +* [Three20](http://github.com/facebook/three20) +* [Tornado](http://www.tornadoweb.org/) +* [PubSubHubbub](http://code.google.com/p/pubsubhubbub/) +* [OAuth 2.0](http://oauth.net/) + +Facebook has been developed from the ground up using open source software. They give back to the Open Source community through more than 21 open source projects and counting. + +Open Source Home, Cassandra, codemod, Facebook Animation, Facebook Exporter for iPhoto, Facebook, Firefox Toolbar, Facebook Mirror, Facebook Open Platform, flvtool++, HipHop for PHP, Hive, memcached, PHPEmbed, phpsh, Public Patches Library, Scribe, Three20, Thrift, Tornado, XHP and XHProf + +[[Facebook Open Source](http://facebook.com/opensource)] [[Facebook on GitHub](http://github.com/facebook)] diff --git a/content/pages/articles/fresnel-a-console-app-to-manage-lighthouse.mdown b/content/pages/articles/fresnel-a-console-app-to-manage-lighthouse.mdown new file mode 100644 index 0000000..8871e14 --- /dev/null +++ b/content/pages/articles/fresnel-a-console-app-to-manage-lighthouse.mdown @@ -0,0 +1,25 @@ +repo: smeevil/fresnel +date: Mon Dec 07 02:05:00 -0600 2009 +categories: github,ruby,lighthouse,api + +# Fresnel: A Console app to manage Lighthouse + +Fresnel is a console manager to [LighthouseApp.com](http://lighthouseapp.com) using the official [Lighthouse API](http://lighthouseapp.com/api). Using Fresnel you can browse your complete lighthouse account. + +To get started just install the gem `gem install fresnel`. + +#### Current features: + +* list projects +* list ticket bins +* list tickets (also in bins) +* create tickets +* assign tickets +* comment on tickets +* state changes + +Hat tip: [@smeevil](http://twitter.com/smeevil) - [http://twitter.com/smeevil/statuses/6301418208](http://twitter.com/smeevil/statuses/6301418208) + +> Made our (@narnach and me) new #lighthouseapp console tool #fresnel publicly available on github: http://bit.ly/6EG8TU, Enjoy! + +[[code on GitHub](http://github.com/smeevil/fresnel)] diff --git a/content/pages/articles/friendly-nosql-with-mysql-in-ruby.mdown b/content/pages/articles/friendly-nosql-with-mysql-in-ruby.mdown new file mode 100644 index 0000000..46c1274 --- /dev/null +++ b/content/pages/articles/friendly-nosql-with-mysql-in-ruby.mdown @@ -0,0 +1,9 @@ +repo: jamesgolick/friendly +date: Wed Dec 23 00:43:00 -0600 2009 +categories: nosql,document-oriented,mysql,github + +# Friendly: NoSQL with MySQL in Ruby + +Friendly lets you turn MySQL into a document-oriented database. If you are forced to deploy to MySQL, but still want the flexibility of schema-less database systems like MongoDB, this could be a perfect fit for your project. + +[[Source on GitHub](http://github.com/jamesgolick/friendly)] [[Homepage](http://friendlyorm.com/)] diff --git a/content/pages/articles/functional-cocoa-applications-using-webkit.mdown b/content/pages/articles/functional-cocoa-applications-using-webkit.mdown new file mode 100644 index 0000000..7f651c5 --- /dev/null +++ b/content/pages/articles/functional-cocoa-applications-using-webkit.mdown @@ -0,0 +1,13 @@ +repo: rsms/cocui +date: Thu Nov 26 03:40:00 -0600 2009 +categories: github + +# Functional Cocoa applications using WebKit + +Cocoa meets WebKit for more rapid UI development. Cocui is a way to quickly create functional Cocoa applications using WebKit. + +[[code](http://github.com/rsms/cocui)] [[video](http://vimeo.com/6600826)] [[blog post](http://blog.hunch.se/2009/09/introduction-to-cocui)] + +Hat tip: [@henrik](http://twitter.com/henrik): [http://twitter.com/henrik/status/6077108373](http://twitter.com/henrik/status/6077108373) + +> Cocui looks interesting. Cocoa apps using WebKit. Makes me want to code a decent kiosk. diff --git a/content/pages/articles/fusebox-a-safer-way-to-monkey-patch-javascript.mdown b/content/pages/articles/fusebox-a-safer-way-to-monkey-patch-javascript.mdown new file mode 100644 index 0000000..c7d17a9 --- /dev/null +++ b/content/pages/articles/fusebox-a-safer-way-to-monkey-patch-javascript.mdown @@ -0,0 +1,21 @@ +repo: jdalton/fusebox +date: Fri Jan 22 12:29:13 -0600 2010 +categories: github,javascript,monkey-patching + +# fusebox: A safer way to monkey-patch JavaScript? + +A standalone version of [FuseJS's fuse.Fusebox()](http://fusejs.com), fusebox provides a sandbox to extend native JavaScript types without worrying about collisions with third-party libraries and scripts. + +Example from the [README](http://github.com/jdalton/fusebox#readme): + + var fb = Fusebox(); + fb.Array.prototype.hai = function() { + return fb.String("Oh hai, we have " + this.length + " items."); + }; + + fb.Array(1, 2, 3).hai(); // "Oh hai, we have 3 items." + typeof window.Array.prototype.hai; // undefined + +Supported types include `Array`, `Date`, `Function`, `Number`, `Object`, `RegExp`, and `String`. + +[[Source on GitHub](http://github.com/jdalton/fusebox)] [[Introductory screencast](http://screenr.com/4X1)] diff --git a/content/pages/articles/fusejs-aims-to-improve-the-javascript-frameworks-you-alr.mdown b/content/pages/articles/fusejs-aims-to-improve-the-javascript-frameworks-you-alr.mdown new file mode 100644 index 0000000..a0c8e50 --- /dev/null +++ b/content/pages/articles/fusejs-aims-to-improve-the-javascript-frameworks-you-alr.mdown @@ -0,0 +1,11 @@ +repo: jdalton/fusejs +date: Mon Feb 01 08:58:31 -0600 2010 +categories: github,javascript,fusejs,optimization,frameworks + +# FuseJS aims to improve the JavaScript frameworks you already use + +Hot on the heels of [FuseBox](http://thechangelog.com/post/347681293/fusebox-a-safer-way-to-monkey-patch-javascript), [John-David Dalton](http://github.com/jdalton) releases [FuseJS](http://github.com/jdalton/fusejs), a new JavaScript framework that aims to provide "one stable, efficient, and optimized core JavaScript framework." FuseJS targets common framework features including DOM manipulation, event registration, and CSS selector engines and seeks to improve your favorite JavaScript framework. + +> In most cases a developer could simply replace a supported client-side framework with FuseJS + emulation layer and receive instant performance and stability gains while continuing to use the framework API they are familiar with. + +[[Source on GitHub](http://github.com/jdalton/fusejs)] diff --git a/content/pages/articles/google-analytics-api-v2-now-in-python-client-library-for.mdown b/content/pages/articles/google-analytics-api-v2-now-in-python-client-library-for.mdown new file mode 100644 index 0000000..495feb9 --- /dev/null +++ b/content/pages/articles/google-analytics-api-v2-now-in-python-client-library-for.mdown @@ -0,0 +1,37 @@ +repo: http://googlecode.blogspot.com/2009/12/google-analytics-api-v2-python-client.html +date: Sun Dec 20 20:47:09 -0600 2009 +categories: google,api,python + +# Google Analytics API v2 now in Python Client Library for Google Data APIs + +This newly updated Python wrapper for the Google Data APIs supports the following Google services: + + + +[[Source on Google Code](http://code.google.com/p/gdata-python-client/source/browse)] diff --git a/content/pages/articles/google-chrome-os-chromium-os.mdown b/content/pages/articles/google-chrome-os-chromium-os.mdown new file mode 100644 index 0000000..0dfe5a3 --- /dev/null +++ b/content/pages/articles/google-chrome-os-chromium-os.mdown @@ -0,0 +1,16 @@ +date: Tue Nov 24 12:08:00 -0600 2009 +categories: google,os + +# Google Chrome OS = Chromium OS + +In July [Google announced](http://googleblog.blogspot.com/2009/07/introducing-google-chrome-os.html) that they were working on Google Chrome OS, an open source operating system for people who spend most of their time on the web. + +This past week Google open-source the project as [Chromium OS](http://www.chromium.org/chromium-os). + +They say that they're doing this early, a year before Google Chrome OS will be ready for users, because they are eager to engage with partners, the open source community and developers. Which is just awesome! + +So, just as with the Google Chrome browser, development will be done in the open from this point on. This means the code is free, accessible to anyone and open for contributions. The Chromium OS project includes their current [code base (git)](http://www.chromium.org/chromium-os/building-chromium-os/getting-the-chromium-os-source-code), [user interface experiments](http://www.chromium.org/chromium-os/user-experience) and some [initial designs](http://www.chromium.org/chromium-os/chromiumos-design-docs) for ongoing development. + +Google Chrome OS will be ready for consumers this time next year. [Get on the mailing list](https://services.google.com/fb/forms/googlechromeossignup/) to get updates or if you like building your operating system from source, get involved at [chromium.org](http://chromium.org/). + +Watch this [video](http://www.youtube.com/watch?v=0QRO3gKj3qw) to learn more about more about Google Chrome OS. diff --git a/content/pages/articles/google-go.mdown b/content/pages/articles/google-go.mdown new file mode 100644 index 0000000..3c8ec2f --- /dev/null +++ b/content/pages/articles/google-go.mdown @@ -0,0 +1,9 @@ +repo: http://golang.org +date: Wed Nov 18 00:00:00 -0600 2009 +categories: google,languages + +# Google Go + +Productive as dynamically typed languages with the speed of static typed languages. But don't look for it on Windows... + +> We understand that a significant fraction of computers in the world run Windows and it would be great if those computers could run Go programs. However, the Go team is small and we don’t have the resources to do a Windows port at the moment. diff --git a/content/pages/articles/gordon-an-open-source-flash-runtime-written-in-pure-java.mdown b/content/pages/articles/gordon-an-open-source-flash-runtime-written-in-pure-java.mdown new file mode 100644 index 0000000..fbecd50 --- /dev/null +++ b/content/pages/articles/gordon-an-open-source-flash-runtime-written-in-pure-java.mdown @@ -0,0 +1,9 @@ +repo: tobeytailor/gordon +date: Wed Jan 13 15:40:00 -0600 2010 +categories: flash,javascript,github + +# Gordon: An open source Flash™ runtime written in pure JavaScript + +Wow! Could this be a viable way to get [Flash on the iPhone?](http://twitpic.com/xxmi2). + +[[Source on GitHub](http://github.com/tobeytailor/gordon/)] [[Demos](http://paulirish.com/work/gordon/demos/)] [[Follow @tobeytailor](http://twitter.com/tobeytailor)] diff --git a/content/pages/articles/gospecify-bdd-library-for-google-go.mdown b/content/pages/articles/gospecify-bdd-library-for-google-go.mdown new file mode 100644 index 0000000..1909d56 --- /dev/null +++ b/content/pages/articles/gospecify-bdd-library-for-google-go.mdown @@ -0,0 +1,9 @@ +repo: stesla/gospecify +date: Thu Dec 17 09:09:00 -0600 2009 +categories: github,go,bdd,testing + +# Gospecify - BDD library for Google Go + +For those familiar with [RSpec](http://rspec.info/), Gospecify provides a BDD syntax for testing your [Go](http://golang.org) code. + +[[Source on GitHub](http://github.com/stesla/gospecify)] [[From @stesla](http://twitter.com/stesla)] diff --git a/content/pages/articles/gritter-1-6-growl-like-notifications.mdown b/content/pages/articles/gritter-1-6-growl-like-notifications.mdown new file mode 100644 index 0000000..a115707 --- /dev/null +++ b/content/pages/articles/gritter-1-6-growl-like-notifications.mdown @@ -0,0 +1,9 @@ +repo: jboesch/Gritter +date: Thu Dec 03 14:32:00 -0600 2009 +categories: github,jquery,growl,javascript + +# Gritter 1.6 - A small growl-like notification plugin for jQuery + +Neat way to add [Growl](http://growl.info)-like notifications to your jQuery apps. Or you could use [JetPack](https://jetpack.mozillalabs.com/). + +[[Source on GitHub](http://github.com/jboesch/Gritter)] [[Homepage](http://boedesign.com/blog/2009/07/11/growl-for-jquery-gritter/)] [[Demo it!](http://boedesign.com/demos/gritter/)] diff --git a/content/pages/articles/handbrake-0-9-4-released-64-bit-support.mdown b/content/pages/articles/handbrake-0-9-4-released-64-bit-support.mdown new file mode 100644 index 0000000..67f0121 --- /dev/null +++ b/content/pages/articles/handbrake-0-9-4-released-64-bit-support.mdown @@ -0,0 +1,13 @@ +repo: http://handbrake.fr/ +date: Wed Nov 25 02:20:00 -0600 2009 +categories: + +# HandBrake 0.9.4 Released, 64-bit Support + +It's been a year in the making. The team behind Handbrake, the multi-platform, open-source video transcoder, has rev'd to version 0.9.4. Handbrake is a must-have app for any new Mac setup. + +One of the biggest new features with this update (their changelog shows over 1000 changes) is support for 64-bit, which allows Handbrake to encode approximately 10% faster than previous 32-bit builds. No worries though, 64-bit build is not exclusive to Snow Leopard. If you are still running 10.5 on a 64-bit machine, you'll still be able to reap the benefits of newly reduced encoding time. + +> Creation comes out of imperfection. + +[[download](http://handbrake.fr/downloads.php)] diff --git a/content/pages/articles/harvestthings-sync-projects-between-things-and-harvest.mdown b/content/pages/articles/harvestthings-sync-projects-between-things-and-harvest.mdown new file mode 100644 index 0000000..d2df50e --- /dev/null +++ b/content/pages/articles/harvestthings-sync-projects-between-things-and-harvest.mdown @@ -0,0 +1,13 @@ +repo: mkrisher/harvestthings +date: Mon Dec 07 02:51:00 -0600 2009 +categories: github,ruby,timetracking + +# HarvestThings: Sync projects between Things and Harvest + +HarvestThings is a Ruby Gem that syncs clients, projects, and tasks from [Things for Mac](http://culturedcode.com/things/) and pushed them into [Harvest](http://www.getharvest.com/). The gem can be installed from gemcutter using `gem install harvestthings`. + +Hat tip: [@harvest](http://twitter.com/harvest) [http://twitter.com/harvest/statuses/6316181772](http://twitter.com/harvest/statuses/6316181772) + +> Check out the brand spankin new Harvest+Things integration, developed by Harvest user .@mkrisher: http://github.com/mkrisher/HarvestThings + +[[code on Github](http://github.com/mkrisher/harvestthings/)] diff --git a/content/pages/articles/hotcocoa-macruby-hotcocoa-ui-library.mdown b/content/pages/articles/hotcocoa-macruby-hotcocoa-ui-library.mdown new file mode 100644 index 0000000..2122179 --- /dev/null +++ b/content/pages/articles/hotcocoa-macruby-hotcocoa-ui-library.mdown @@ -0,0 +1,31 @@ +repo: richkilmer/hotcocoa +date: Mon Feb 01 01:19:00 -0600 2010 +categories: github,ruby,osx,ui + +# HotCocoa: MacRuby HotCocoa UI library + +HotCocoa is a thin & idiomatic Ruby layer that sits above Cocoa and other frameworks, developed by [Rich Kilmer](http://twitter.com/rich_Kilmer). [MacRuby](http://twitter.com/macruby) 0.5, which was recently rev'd, now supports HotCocoa. + +> HotCocoa used to be developed inside the MacRuby project, but we decided that it would have a better life on GitHub, where it is far easier for developers to submit contributions... + +HotCocoa also has been transformed as a gem and is included in the 0.5 package installer. Be sure to require rubygems before using it. + +To see more information on HotCocoa (including tutorial) see [macruby.org](http://macruby.org/). + + require 'rubygems' + require 'hotcocoa' + include HotCocoa + application do |app| + win = window :size => [100,50] + b = button :title => 'Hello' + b.on_action { puts 'World!' } + win << b + end + +####Installation + + sudo macgem install hotcocoa + +(Please note 'macgem' instead of 'gem') + +[[Source on GitHub](http://github.com/richkilmer/hotcocoa)] [[Homepage](http://macruby.org/)] diff --git a/content/pages/articles/iphone-style-checkboxes-turn-boring-checkboxes-into.mdown b/content/pages/articles/iphone-style-checkboxes-turn-boring-checkboxes-into.mdown new file mode 100644 index 0000000..81c4c40 --- /dev/null +++ b/content/pages/articles/iphone-style-checkboxes-turn-boring-checkboxes-into.mdown @@ -0,0 +1,13 @@ +repo: tdreyno/iphone-style-checkboxes +date: Mon Jan 25 05:11:00 -0600 2010 +categories: github,iphone,ui,javascript,jquery,prototype,scriptaculous + +# iphone-style-checkboxes: Turn boring checkboxes into iPhone-style toggle switches + +Progressively enhance your forms by turning boring old checkboxes into stylish iPhone-style toggle switches. + +Dependencies: jQuery or Prototype + Scriptaculous + + + +[[Source on GitHub](http://github.com/tdreyno/iphone-style-checkboxes)] [[Homepage](http://tdreyno.github.com/iphone-style-checkboxes/)] diff --git a/content/pages/articles/ironjs-a-javascript-implementation-built-on-the-dynamic.mdown b/content/pages/articles/ironjs-a-javascript-implementation-built-on-the-dynamic.mdown new file mode 100644 index 0000000..b4e2522 --- /dev/null +++ b/content/pages/articles/ironjs-a-javascript-implementation-built-on-the-dynamic.mdown @@ -0,0 +1,9 @@ +repo: fholm/IronJS +date: Sun Jan 24 17:36:37 -0600 2010 +categories: github,dotent,csharp,javascript,dynamic + +# IronJS - A Javascript implementation built on the Dynamic Language Runtime for .NET + +Want to embed JavaScript ECMAScript 3.0 into your .NET apps? IronJS from [@fjholmstrom](http://twitter.com/fjholmstrom) aims to let you do just that. Recently released, it has already passed an important milestone by [compiling jQuery](http://ugh.cc/ironjs-now-compiles-jquery/). + +[[Source on GitHub](http://github.com/fholm/IronJS)] [[Homepage](http://ironjs.com)] diff --git a/content/pages/articles/jammit-rails-plugin-for-asset-packaging.mdown b/content/pages/articles/jammit-rails-plugin-for-asset-packaging.mdown new file mode 100644 index 0000000..3be52fb --- /dev/null +++ b/content/pages/articles/jammit-rails-plugin-for-asset-packaging.mdown @@ -0,0 +1,8 @@ +repo: documentcloud/jammit +date: Fri Nov 20 00:00:00 -0600 2009 +categories: github,rails,javascript,assets + +# JAMMIT - Rails plugin for asset packaging + +> Jammit is an industrial strength asset packaging library for Rails, providing both the CSS and JavaScript concatenation and compression that you'd expect, as well as ahead-of-time gzipping, built-in JavaScript template support, and optional Data-URI / MHTML image embedding. + diff --git a/content/pages/articles/javascript-as-a-teaching-tool.mdown b/content/pages/articles/javascript-as-a-teaching-tool.mdown new file mode 100644 index 0000000..3c471b4 --- /dev/null +++ b/content/pages/articles/javascript-as-a-teaching-tool.mdown @@ -0,0 +1,9 @@ +repo: nzakas/computer-science-in-javascript +date: Thu Jan 21 08:07:56 -0600 2010 +categories: github,javascript,computer-science + +# JavaScript as a teaching tool: Learn classic computer science approaches using a language you probably already know + +[Nicholas Zakas](http://github.com/nzakas) has created a repository of classic computer science paradigms, algorithms, and approaches written in JavaScript including Base64 encoding, linked lists, bubble sorts, and more. + +[[Source on GitHub](http://github.com/nzakas/computer-science-in-javascript)] [[Follow @slicknet](http://twitter.com/slicknet/)] diff --git a/content/pages/articles/job-board-a-simple-job-board-in-sinatra-mongo-effigy.mdown b/content/pages/articles/job-board-a-simple-job-board-in-sinatra-mongo-effigy.mdown new file mode 100644 index 0000000..9a00137 --- /dev/null +++ b/content/pages/articles/job-board-a-simple-job-board-in-sinatra-mongo-effigy.mdown @@ -0,0 +1,11 @@ +repo: dancroak/job-board +date: Wed Jan 13 23:52:00 -0600 2010 +categories: github,ruby,sinatra,jobboard,jobs + +# job-board: A simple job board in Sinatra/Mongo/Effigy + +No readme on this one and the details are in the short description...BUT you know we love [Ruby](http://www.ruby-lang.org/) AND [Sinatra](http://www.sinatrarb.com/). I have (^AS) high hopes for this. + +If you get a chance to pull the code and take a peek leave a comment on what you think! + +[[Source on GitHub](http://github.com/dancroak/job-board)] diff --git a/content/pages/articles/jquery-behavior-simple-javascript-library-for-complex-we.mdown b/content/pages/articles/jquery-behavior-simple-javascript-library-for-complex-we.mdown new file mode 100644 index 0000000..67c1c23 --- /dev/null +++ b/content/pages/articles/jquery-behavior-simple-javascript-library-for-complex-we.mdown @@ -0,0 +1,22 @@ +repo: rodp/jquery.behavior +date: Mon Dec 21 10:46:31 -0600 2009 +categories: github,jquery,plugins,javascript + +# jquery.behavior: chunk up your jQuery into 'behaviors' + +If you've written more than a trivial amount of jQuery, you quickly wonder about the best way to organize your JavaScript. [@rodpetrovic](http://twitter.com/rodpetrovic)'s take is called jquery.behavior: + + // 1. Create behavior: + function BadBehavior(element, config) { + this.misbehave = function () { + alert('Oh behave!'); + } + } + + // 2. Attach behavior: + $('.bad-behavior').behavior(BadBehavior); + + // 3. Use behavior: + $('.bad-behavior').behavior('misbehave'); // alert('Oh behave!') + +[[Source on GitHub](http://github.com/rodp/jquery.behavior)] [[Homepage](http://rodpetrovic.com/jquery/behavior/)] diff --git a/content/pages/articles/jquery-compat-1-3-backwards-compatibility-plugin-for.mdown b/content/pages/articles/jquery-compat-1-3-backwards-compatibility-plugin-for.mdown new file mode 100644 index 0000000..a9d2d06 --- /dev/null +++ b/content/pages/articles/jquery-compat-1-3-backwards-compatibility-plugin-for.mdown @@ -0,0 +1,9 @@ +repo: jquery/jquery-compat-1.3 +date: Wed Jan 13 23:27:00 -0600 2010 +categories: github,jquery,javascript,compatibility + +# jQuery Compat 1.3: Backwards compatibility plugin for jQuery 1.3 + +Looks like [John](http://ejohn.org/) is just adding in the initial plugin...but this is the repo to watch if you need backwards compatibility for [jQuery](http://jquery.com/) 1.3 (to be used with jQuery 1.4). + +[[Source on GitHub](http://github.com/jquery/jquery-compat-1.3)] diff --git a/content/pages/articles/jquery-haml-a-haml-like-language-written-in-json.mdown b/content/pages/articles/jquery-haml-a-haml-like-language-written-in-json.mdown new file mode 100644 index 0000000..bc6061c --- /dev/null +++ b/content/pages/articles/jquery-haml-a-haml-like-language-written-in-json.mdown @@ -0,0 +1,17 @@ +repo: creationix/jquery-haml +date: Wed Dec 02 02:27:00 -0600 2009 +categories: jquery,haml,jason,dom,github + +# jQuery-Haml: A Haml-like language written in JSON + +WOW! Haml is making in-roads to JSON! [jQuery-haml](http://github.com/creationix/jquery-haml) is a [Haml](http://haml-lang.com/)-like language written in [JSON](http://www.json.org/). This allows for easy DOM building so that web apps can do more work independent of the server for a better user experience. + +You can see a small example page using it at [http://static.creationix.com/jquery-haml/examples/index.html](http://static.creationix.com/jquery-haml/examples/index.html). View the source to see that all the content is built after page load. + +To be clear this project was recently split. The server-side half of the component stayed at the old name of [haml-js](http://github.com/creationix/haml-js) and has it's own documentation and everything there. + +Hat tip: [Us](http://thechangelog.com/) - [http://thechangelog.com/post/265338825/picard-a-micro-framekwork-for-node-js](http://thechangelog.com/post/265338825/picard-a-micro-framekwork-for-node-js) + +> Similar to Sinatra and uses Haml-js. Looks like things are heating up for Node.js. + +[[code at GitHub](http://github.com/creationix/jquery-haml)] [[demo](http://static.creationix.com/jquery-haml/examples/index.html)] [[homepage](http://plugins.jquery.com/project/jquery-haml)] diff --git a/content/pages/articles/jquery-lint-find-and-errors-and-improve-your-jquery-usag.mdown b/content/pages/articles/jquery-lint-find-and-errors-and-improve-your-jquery-usag.mdown new file mode 100644 index 0000000..87f3692 --- /dev/null +++ b/content/pages/articles/jquery-lint-find-and-errors-and-improve-your-jquery-usag.mdown @@ -0,0 +1,11 @@ +repo: jamespadolsey/jQuery-Lint +date: Wed Jan 20 08:58:00 -0600 2010 +categories: firebug,javascript,jquery,plugins,github + +# jQuery-Lint: find and errors and improve your jQuery usage + +Like its namesake, [JSLint](http://www.jslint.com/), jQuery Lint from [@jamespadolsey](http://twitter.com/jamespadolsey) aims to make you a better jQuery code monkey by finding errors and giving you hints on proper selector usage. It is also fully integrated into [Firebug](http://getfirebug.com): + +![Screenshot](http://img13.imageshack.us/img13/9527/lint.png) + +[[Source on Github](http://github.com/jamespadolsey/jQuery-Lint)] [[Homepage](http://james.padolsey.com/javascript/jquery-lint/)] diff --git a/content/pages/articles/jspec-robust-bdd-for-both-client-and-server-javascript.mdown b/content/pages/articles/jspec-robust-bdd-for-both-client-and-server-javascript.mdown new file mode 100644 index 0000000..047b773 --- /dev/null +++ b/content/pages/articles/jspec-robust-bdd-for-both-client-and-server-javascript.mdown @@ -0,0 +1,55 @@ +repo: visionmedia/jspec +date: Sun Jan 24 10:16:03 -0600 2010 +categories: github,javascript,bdd,testing,rhino,node-js,jquery,dojo + +# JSpec: Robust BDD for both client and server JavaScript + +JSpec from [@visionmedia](http://github.com/visionmedia) wants to be your [BDD](http://en.wikipedia.org/wiki/Behavior_Driven_Development) framework no matter where you run your JavaScript. JSpec supports not only JavaScript in the browser and popular client-side frameworks like jQuery, it also supports server-side JavaScript including Rhino and [Node.js](http://nodejs.org/). + +From the [README](http://github.com/visionmedia/jspec#readme) specs may be written using JSpec grammar: + + describe 'ShoppingCart' + before_each + cart = new ShoppingCart + end + + describe 'addProducts' + it 'should add several products' + cart.addProduct('cookie') + cart.addProduct('icecream') + cart.should.have 2, 'products' + end + end + + describe 'checkout' + it 'should throw an error when checking out with no products' + -{ cart.clear().checkout() }.should.throw_error EmptyCart + end + end + end + +or in pure JavaScript: + + JSpec.describe('ShoppingCart', function(){ + before_each(function{ + cart = new ShoppingCart + }) + + describe('addProducts', function(){ + it ('should add several products', function(){ + cart.addProducts('cookie') + cart.addProducts('icecream') + expect(cart).to(have, 2, 'products') + }) + }) + + describe('checkout', function(){ + it ('should throw an error when checking out with no products', function(){ + expect(function(){ cart.clear().checkout() }).to(throw_error, EmptyCart) + }) + }) + }) + +[[Source on GitHub](http://github.com/visionmedia/jspec)] [[Homepage](http://jspec.info/)] + + diff --git a/content/pages/articles/kohana-the-swift-php-framework.mdown b/content/pages/articles/kohana-the-swift-php-framework.mdown new file mode 100644 index 0000000..ecc1aa0 --- /dev/null +++ b/content/pages/articles/kohana-the-swift-php-framework.mdown @@ -0,0 +1,14 @@ +repo: kohana/kohana +date: Fri Feb 05 08:03:31 -0600 2010 +categories: github,php,mongodb,frameworks,mvc + +# Kohana - The Swift PHP Framework + +[Kohana](http://github.com/kohana/kohana) is a PHP MVC web framework that aims to be easy, lightweight, and secure. It has no dependencies on PECL or PEAR extensions and uses strict PHP 5 OOP. It uses what it calls "cascading resources" to allow developers to extend the framework without editing the core system. + +cascading resources + +There is an extensive list of [[modules](http://dev.kohanaphp.com/projects/)], even a MongoDB ORM, [MangoDB](http://github.com/Wouterrr/MangoDB). + +[[Source on GitHub](http://github.com/kohana/kohana)] [[Homepage](http://kohanaphp.com/)] [[Docs](http://docs.kohanaphp.com/)] + diff --git a/content/pages/articles/lawnchair-a-lightweight-client-side-json-document-store.mdown b/content/pages/articles/lawnchair-a-lightweight-client-side-json-document-store.mdown new file mode 100644 index 0000000..c904646 --- /dev/null +++ b/content/pages/articles/lawnchair-a-lightweight-client-side-json-document-store.mdown @@ -0,0 +1,18 @@ +repo: brianleroux/lawnchair +date: Fri Dec 11 11:13:15 -0600 2009 +categories: github,javascript,document-oriented,json + +# Lawnchair, a lightweight client-side JSON document store + +> Sorta like a couch except smaller and outside, also, a client side JSON document store. Perfect for webkit mobile apps that need a lightweight, simple and elegant persistence solution. + + +Features + +* micro tiny storage without the nasty SQL: pure and delicious JSON +* clean and simple oo design with one db table per store +* key/value store.. specifying a key is optional +*happily and handily will treat your store as an array of objects +* terse syntax for searching and therefore finding of objects + +[[Source on GitHub](http://github.com/brianleroux/lawnchair)] [[Homepage](http://brianleroux.github.com/lawnchair/)] diff --git a/content/pages/articles/libcloud-pure-python-client-library-for-interacting-with.mdown b/content/pages/articles/libcloud-pure-python-client-library-for-interacting-with.mdown new file mode 100644 index 0000000..d2ba869 --- /dev/null +++ b/content/pages/articles/libcloud-pure-python-client-library-for-interacting-with.mdown @@ -0,0 +1,11 @@ +repo: http://incubator.apache.org/libcloud/ +date: Mon Dec 14 16:37:47 -0600 2009 +categories: python,apache,svn,cloud + +# libcloud: Pure Python client library for interacting with cloud server providers + +libcloud is a pure python client library for interacting with many of the popular cloud server providers including: EC2, EC2-EU, Slicehost, Rackspace, Linode, VPS.net, RimuHosting, vCloud and Terremark + +> libcloud was originally created by the folks over at Cloudkick, but has since grown into an independent free software project licensed under the Apache License (2.0). + +[[SVN Source](https://svn.apache.org/repos/asf/incubator/libcloud/trunk/)] [[Homepage](http://incubator.apache.org/libcloud/)] diff --git a/content/pages/articles/masonry-grid-layout-for-jquery.mdown b/content/pages/articles/masonry-grid-layout-for-jquery.mdown new file mode 100644 index 0000000..0c08aa9 --- /dev/null +++ b/content/pages/articles/masonry-grid-layout-for-jquery.mdown @@ -0,0 +1,12 @@ +repo: desandro/masonry +date: Mon Dec 07 13:32:55 -0600 2009 +categories: github,jquery,layout,css,javascript + +# Masonry: Grid layout for jQuery + +Cool layout plugin for jQuery from [@desandro](http://twitter.com/desandro) with support for infinite scroll as well. + +> Think of it as the flip side of CSS floats. Whereas floating arranges elements horizontally then vertically, Masonry arranges elements vertically then horizontally according to a grid. + +[[Source on GitHub](http://github.com/desandro/masonry)] [[Homepage](http://desandro.com/resources/jquery-masonry)] [[Demos](http://desandro.com/demo/masonry/basic.html)] + diff --git a/content/pages/articles/mbcoverflowview-open-source-cover-flow-for-obj-c.mdown b/content/pages/articles/mbcoverflowview-open-source-cover-flow-for-obj-c.mdown new file mode 100644 index 0000000..ea76c3c --- /dev/null +++ b/content/pages/articles/mbcoverflowview-open-source-cover-flow-for-obj-c.mdown @@ -0,0 +1,9 @@ +repo: mattball/MBCoverFlowView +date: Fri Dec 04 19:28:00 -0600 2009 +categories: github,obj-c,cocoa + +# MBCoverFlowView - open source Cover Flow for Obj-C + +Build fantastic iTunes-like scrolling views into your Cocoa apps. ![screenshot](http://static.tumblr.com/njo56hx/fF8ku5o9d/cover-flow.jpg) + +[[Source on GitHub](http://github.com/mattball/MBCoverFlowView)] diff --git a/content/pages/articles/memcached-client-an-erlang-memcached-client.mdown b/content/pages/articles/memcached-client-an-erlang-memcached-client.mdown new file mode 100644 index 0000000..86e77ae --- /dev/null +++ b/content/pages/articles/memcached-client-an-erlang-memcached-client.mdown @@ -0,0 +1,13 @@ +repo: echou/memcached-client +date: Mon Dec 07 02:38:00 -0600 2009 +categories: github,erlang,memcached,OTP + +# memcached-client: An Erlang memcached client application + +memcached-client is a Erlang memcached client application that utilizes many new features to improve performance. + +Hat tip: [@mooooscar](http://twitter.com/mooooscar) [http://twitter.com/mooooscar/statuses/6306697750](http://twitter.com/mooooscar/statuses/6306697750) + +> [text] oh yeah, echou has open source his new erlang memcached client on github : http://github.com/echou/memcached-client + +[[code on GitHub](http://github.com/echou/memcached-client)] diff --git a/content/pages/articles/middleman-a-static-site-generator-with-haml-sass.mdown b/content/pages/articles/middleman-a-static-site-generator-with-haml-sass.mdown new file mode 100644 index 0000000..7918bc9 --- /dev/null +++ b/content/pages/articles/middleman-a-static-site-generator-with-haml-sass.mdown @@ -0,0 +1,13 @@ +repo: tdreyno/middleman +date: Mon Dec 07 23:36:00 -0600 2009 +categories: github,sinatra,ruby,generator + +# Middleman: A static site generator with Haml, Sass, Compass + YUI compression and cache busting + +Written in [Ruby](http://www.ruby-lang.org/en/) - Middleman is built upon [Sinatra](http://www.sinatrarb.com/). In fact, the Middleman `init.rb` is evaluated within a Sinatra context so anything you could do in Sinatra can be done in Middleman. Very nice!! + +Middleman watches your template files (Haml, Sass, Erb, Builder, Maruku & Markaby) for changes and provides a development environment for rapid site creation and prototyping. Some important features are layouts, ruby helpers and the integration of the Compass CSS library. Hawt!! + +Hat tip: [http://bit.ly/8bWzxO](http://bit.ly/8bWzxO) + +[[code on GitHub](http://github.com/tdreyno/middleman)] [[homepage](http://awardwinningfjords.com/2009/10/22/middleman.html)] diff --git a/content/pages/articles/mongo-admin-rails-plugin-for-web-based-mongomapper-admin.mdown b/content/pages/articles/mongo-admin-rails-plugin-for-web-based-mongomapper-admin.mdown new file mode 100644 index 0000000..3c34068 --- /dev/null +++ b/content/pages/articles/mongo-admin-rails-plugin-for-web-based-mongomapper-admin.mdown @@ -0,0 +1,9 @@ +repo: ahe/mongo_admin +date: Fri Dec 18 10:51:18 -0600 2009 +categories: github,mongo,mongomapper,rails,ruby,plugins + +# mongo_admin: Rails plugin for web based MongoMapper admin + +Browse and manage your MongoMapper data using your browser using this Rails plugin from [@2dc](http://twitter.com/2dc). + +[[Source on GitHub](http://github.com/ahe/mongo_admin)] [[Demo](http://mongo_admin.2dconcept.com/)] diff --git a/content/pages/articles/mongrations-migrations-for-mongomapper.mdown b/content/pages/articles/mongrations-migrations-for-mongomapper.mdown new file mode 100644 index 0000000..abafbd3 --- /dev/null +++ b/content/pages/articles/mongrations-migrations-for-mongomapper.mdown @@ -0,0 +1,23 @@ +repo: terrbear/mongrations +date: Sat Feb 27 09:19:43 -0600 2010 +categories: github,mongodb,mongomapper,rails,migrations,gems + +# Mongrations - migrations for MongoMapper + +Why would a schema-less database need migrations? Simple: to help you keep old data fresh as you change your data format. Recently added new columns to your MongoMapper model and need to update old values in your MongoDB collection? [Terry Heath](http://terrbear.org) gives you [Mongrations](http://github.com/terrbear/mongrations): + + script/generate mongration update_followers_count_for_existing + +You'll get a new file with the familiar Rails migration format: + + class UpdateFollowersCountForExisting < MongoMapper::Mongration + def self.up + end + + def self.down + end + end + +Just add your own code to manipulate your data and call `rake db:mongrate`. Mongrations include rake tasks for `db:mongrate:redo`, `db:mongrate:up`, `db:mongrate:down`, `db:mongrate:rollback`. + +[[Source on GitHub](http://github.com/terrbear/mongrations)] [[Blog post](http://terrbear.org/?p=249)] diff --git a/content/pages/articles/navvy-simple-database-agnostic-ruby-background-job-proce.mdown b/content/pages/articles/navvy-simple-database-agnostic-ruby-background-job-proce.mdown new file mode 100644 index 0000000..d33b7d4 --- /dev/null +++ b/content/pages/articles/navvy-simple-database-agnostic-ruby-background-job-proce.mdown @@ -0,0 +1,17 @@ +repo: jeffkreeftmeijer/navvy +date: Wed Jan 27 16:42:00 -0600 2010 +categories: github,ruby,mongodb,mysql,backgroundjobs,queues + +# Navvy: Simple database agnostic Ruby background job processor + +If you like [delayed_job](http://github.com/tobi/delayed_job) but want to BYODB, [@jeffkreeftmeijer](http://github.com/jeffkreeftmeijer) brings you Navvy. + +From the [README](http://github.com/jeffkreeftmeijer/navvy#readme) + +> Navvy is a simple Ruby background job processor inspired by delayed_job, but aiming for database agnosticism. Currently Navvy supports ActiveRecord, MongoMapper, Sequel and DataMapper but it’s extremely easy to write an adapter for your favorite ORM. Besides plain Ruby (1.8 & 1.9) it completely supports Rails Edge. + +Navvy gets an endorsement from Mr. MongoMapper [@jnunemaker](http://github.com/jnunemaker) in upcoming episode 0.1.2. + +We're looking forward to Monitor, the planned web UI to Navvy. + +[[Source on GitHub](http://github.com/jeffkreeftmeijer/navvy)] [[Wiki](http://wiki.github.com/jeffkreeftmeijer/navvy/)] [[Roadmap](http://wiki.github.com/jeffkreeftmeijer/navvy/roadmap)] diff --git a/content/pages/articles/neo4jr-social-rest-interface-for-neo4j.mdown b/content/pages/articles/neo4jr-social-rest-interface-for-neo4j.mdown new file mode 100644 index 0000000..ecd1109 --- /dev/null +++ b/content/pages/articles/neo4jr-social-rest-interface-for-neo4j.mdown @@ -0,0 +1,11 @@ +repo: mdeiters/neo4jr-social +date: Mon Jan 25 21:54:57 -0600 2010 +categories: github,java,REST,json,api,nosql + +# neo4jr-social: REST interface for Neo4j + +Need to talk to [Neo4j](http://neo4j.org/), the popular Java NoSQL database but no habla Java? No worries, [@mdeiters](http://github.com/mdeiters) has your back with [Neo4jr-Social](http://github.com/mdeiters/neo4jr-social): + +> Neo4jr-Social is a self contained HTTP REST + JSON interface to the graph database Neo4j. Neo4jr-Social supports simple dynamic node creation, building relationships between nodes and also includes a few common social networking queries out of the box (i.e. linkedin degrees of seperation and facebook friend suggestion) with more to come. + +[[Source on GitHub](http://github.com/mdeiters/neo4jr-social)] [[API docs](http://wiki.github.com/mdeiters/neo4jr-social/api-overview)] diff --git a/content/pages/articles/nextgen-mmo-architecture-a-platform-for-building.mdown b/content/pages/articles/nextgen-mmo-architecture-a-platform-for-building.mdown new file mode 100644 index 0000000..c46e44f --- /dev/null +++ b/content/pages/articles/nextgen-mmo-architecture-a-platform-for-building.mdown @@ -0,0 +1,23 @@ +repo: http://www.next-gen.cc/ +date: Mon Dec 07 23:02:00 -0600 2009 +categories: erlang,gaming + +# NextGen MMO Architecture: A platform for building massive online games + +NextGen MMO Architecture is a platform for building massive online games. The architecture is developed in [Erlang](http://www.erlang.org/), making it easier to scale and distribute. + +The NextGen MMO Architecture makes as few assumptions on the game logic as possible, allowing any kind of game online game to be developed, for example: online poker, RPG/FPS/RTS or just a simple chat server. + +The architecture consists of five types of servers: + +* Connection Server +* Account Server +* Character Server +* Area Servers +* Monitor Server + +Hat tip: [@technoweenie](http://twitter.com/technoweenie) [http://twitter.com/technoweenie/status/6448221320](http://twitter.com/technoweenie/status/6448221320) + +> wow, erlang mmo server: http://www.next-gen.cc/
 + +[[homepage](http://www.next-gen.cc/)] [[code](http://www.next-gen.cc/index.php?option=com_content&view=article&id=2&Itemid=3)] diff --git a/content/pages/articles/node-paperboy-a-node-js-static-page-module.mdown b/content/pages/articles/node-paperboy-a-node-js-static-page-module.mdown new file mode 100644 index 0000000..b024005 --- /dev/null +++ b/content/pages/articles/node-paperboy-a-node-js-static-page-module.mdown @@ -0,0 +1,39 @@ +repo: felixge/node-paperboy +date: Mon Jan 18 14:24:00 -0600 2010 +categories: github,nodejs,javascript + +# node-paperboy: A node.js module for delivering static files + +There's definitely no shortage of new Node.js projects these days. From [@felixge](http://twitter.com/felixge), node-paperboy let's you serve up static pages in your [Node.js](http://nodejs.org) app. + +Example: + + var + sys = require('sys'), + path = require('path'), + http = require('http'), + paperboy = require('../lib/paperboy'), + + PORT = 8003, + WEBROOT = path.join(path.dirname(__filename), 'webroot'); + + http.createServer(function(req, res) { + paperboy + .deliver(WEBROOT, req, res) + .before(function() { + sys.puts('About to deliver: '+req.url); + }) + .after(function() { + sys.puts('Delivered: '+req.url); + }) + .error(function() { + sys.puts('Error delivering: '+req.url); + }) + .otherwise(function() { + res.sendHeader(404, {'Content-Type': 'text/plain'}); + res.sendBody('Sorry, no paper this morning!'); + res.finish(); + }); + }).listen(PORT); + +[[Source on GitHub](http://github.com/felixge/node-paperboy)] diff --git a/content/pages/articles/nodejs-evented-i-o-for-v8-javascript.mdown b/content/pages/articles/nodejs-evented-i-o-for-v8-javascript.mdown new file mode 100644 index 0000000..ba0d3d4 --- /dev/null +++ b/content/pages/articles/nodejs-evented-i-o-for-v8-javascript.mdown @@ -0,0 +1,13 @@ +repo: ry/node +date: Sat Nov 28 13:22:00 -0600 2009 +categories: github + +# #nodejs - Evented I/O for v8 JavaScript + +Node's goal is to provide an easy way to build scalable network programs. Node is similar in design to and influenced by systems like Ruby's [Event Machine](http://rubyeventmachine.com/) or Python's [Twisted](http://twistedmatrix.com/). Node takes the event model a bit further—it presents the event loop as a language construct instead of as a library. + +[Ryan](https://twitter.com/ryah) just [announced the release of Version 0.1.20](http://groups.google.com/group/nodejs/browse_thread/thread/487703af7a9a004). + +Hat tip: [@grantmichaels](http://twitter.com/grantmichaels) - [http://twitter.com/grantmichaels/status/6144829957](http://twitter.com/grantmichaels/status/6144829957) + +[[code at GitHub](http://github.com/ry/node)] [[homepage](http://nodejs.org/)] [[documentation](http://nodejs.org/api.html)] diff --git a/content/pages/articles/opera-10-10-unite-turbo-awesome.mdown b/content/pages/articles/opera-10-10-unite-turbo-awesome.mdown new file mode 100644 index 0000000..3556800 --- /dev/null +++ b/content/pages/articles/opera-10-10-unite-turbo-awesome.mdown @@ -0,0 +1,24 @@ +date: Wed Nov 25 01:28:00 -0600 2009 +categories: browser + +# Opera 10.10: Unite + Turbo = Awesome + +While Opera itself isn't Open Source, what developers will develop for their new Unite feature will be. + +> The authors retain copyright of submitted applications, but the applications must either have a BSD-compatible license or be placed in the public domain. + +The latest version of [Opera](http://www.opera.com/) has been released, [Opera 10.10](http://www.opera.com/browser/). Now, we're not Opera users (at the moment), but what they are doing with this new "Unite" feature is pretty impressive. Opera is pushing for us all to become citizens on the Web. Rather than just receive data, our machines will now be able to send out files into the world. + +With Unite you will be able to share 10GB of photos instantly as well as stream your music anywhere. + +[video: [get started](http://www.youtube.com/watch?v=zeoHVeBwIsY), [sharing instantly](http://www.youtube.com/watch?v=2Wk570sqzqc)] + +They also added a new feature called "Turbo", which lets you boost your speed on slow connections. Opera Turbo compresses the web pages you are viewing, boosting your browsing speed on crowded Wi-Fi hotspots, tethered mobile phones or dial-up connections. + +[video: [introduction](http://www.youtube.com/watch?v=CYnYAtguXkM)] + +> We promised Opera Unite would reinvent the Web,' said Jon von Tetzchner, CEO, Opera. 'What we are really doing is reinventing how we as consumers interact with the Web. By giving our devices the ability to serve content, we become equal citizens on the Web. In an age where we have ceded control of our personal data to third-parties, Opera Unite gives us the freedom to choose how we will share the data that belongs to us. + +#### Create Opera Unite applications + +Opera is also inviting talented developers to submit new Opera Unite applications. Join Opera's [battle for the best Opera Unite application](http://my.opera.com/community/blog/2009/10/23/battle-for-the-best-opera-unite-applications), and win great prizes. diff --git a/content/pages/articles/otp-kickoff-kick-off-a-new-erlang-otp-project.mdown b/content/pages/articles/otp-kickoff-kick-off-a-new-erlang-otp-project.mdown new file mode 100644 index 0000000..7910b2e --- /dev/null +++ b/content/pages/articles/otp-kickoff-kick-off-a-new-erlang-otp-project.mdown @@ -0,0 +1,32 @@ +repo: leandrosilva/otp_kickoff +date: Sat Dec 05 13:01:00 -0600 2009 +categories: github,erlang,ruby,gem,OTP + +# otp_kickoff: Kick off a new Erlang/OTP project! + +OTP Kick-off is a simple project generator written in Ruby to make starting a new [Erlang](http://en.wikipedia.org/wiki/Erlang_%28programming_language%29)/[OTP](http://en.wikipedia.org/wiki/Open_Telecom_Platform_%28OTP%29) project a simple task. + +#### Usage + +After you have installed and configured `otp_kickoff` ... (see readme) + +In your terminal, type: + + otp_kickoff new_application --name=amazingapp + +That will generate: + + create amazingapp/src + create amazingapp/ebin + create amazingapp/deps + create amazingapp/src/amazingapp_app.app + create amazingapp/src/amazingapp_app.erl + create amazingapp/src/amazingapp_sup.erl + create amazingapp/src/amazingapp_server.erl + create amazingapp/src/amazingapp_handler.erl + create amazingapp/src/amazingapp.erl + create amazingapp/src/amazingapp.hrl + +Hat tip: [@codezone](http://twitter.com/codezone) [http://twitter.com/codezone/status/6360747343](http://twitter.com/codezone/status/6360747343) + +[[code on GitHub](http://github.com/leandrosilva/otp_kickoff)] [[follow Leandro Silva on Twitter](http://twitter.com/codezone)] diff --git a/content/pages/articles/persistence-high-level-persistance-database-system-for-n.mdown b/content/pages/articles/persistence-high-level-persistance-database-system-for-n.mdown new file mode 100644 index 0000000..99ab588 --- /dev/null +++ b/content/pages/articles/persistence-high-level-persistance-database-system-for-n.mdown @@ -0,0 +1,16 @@ +repo: creationix/node-persistence +date: Thu Dec 17 21:40:00 -0600 2009 +categories: github,node-js,javascript + +# Persistence: high level persistance/database system for node.js + +From [@creationix](http://twitter.com/creationix), Persistence is a project to allow a high level API for persisting data between process runs. The goal is to support backends that are easy to use, powerful, flexible, or all of the above if possible. + +Supported databases include: + + - **PostgreSQL** - An enterprise level relational database. The driver is implemented in pure JavaScript and communicates over TCP using the PostgreSQL wire protocol. + - **Sqlite3** - A simple, fast, server-less relational database. This driver is a wrapper around the command-line `sqlite3` program. It requires `sqlite3` to be in the path. The communication is extremely fast, but types aren't very precise. There are only strings and nulls returned. + - **MongoDB** - A scalable, high-performance, open source, schema-free, document-oriented database. This driver also implements the wire protocol in JavaScript and communicated with the server over TCP. + - **JSON-DB** - A homegrown system schema-free, document-oriented database that uses simple flat files containing JSON objects. This has no requirements at all except node and a filesystem. Performance is to be determined once it's implemented fully. + +[[Source on GitHub](http://github.com/creationix/node-persistence)] diff --git a/content/pages/articles/phpmoadmin-mongodb-admin-tool-for-php.mdown b/content/pages/articles/phpmoadmin-mongodb-admin-tool-for-php.mdown new file mode 100644 index 0000000..9f6ab23 --- /dev/null +++ b/content/pages/articles/phpmoadmin-mongodb-admin-tool-for-php.mdown @@ -0,0 +1,27 @@ +repo: MongoDB-Rox/phpMoAdmin-MongoDB-Admin-Tool-for-PHP +date: Fri Jan 22 11:51:00 -0600 2010 +categories: github,php,mongodb,admin + +# phpMoAdmin: MongoDB admin tool for PHP + +Extra (or deducted, depending on your point of view) points for an SEO optimized repo name, phpMoAdmin aims to be mo' admin than phpMyAdmin by providing a [MongoDB](http://mongodb.org) administration tool for PHP. phpMoAdmin is built on a stripped-down version of the Vork high-performance framework. + +### Features include: + +* Database + * List + * Create/drop + * Repair +* Collection + * Show collections + * Create/drop collection + * List indexes + * Create/drop indexes +* Data objects + * Show objects with 3-different viewing options (full, compact & uniform) + * Create/delete objects + * Edit object data +* Mongo GridFS + * GridFS objects automatically link GridFS chunks to GridFS files + +[[Source on GitHub](http://github.com/MongoDB-Rox/phpMoAdmin-MongoDB-Admin-Tool-for-PHP)] [[Homepage](http://www.phpmoadmin.com/)] diff --git a/content/pages/articles/picard-a-micro-framekwork-for-node-js.mdown b/content/pages/articles/picard-a-micro-framekwork-for-node-js.mdown new file mode 100644 index 0000000..6759810 --- /dev/null +++ b/content/pages/articles/picard-a-micro-framekwork-for-node-js.mdown @@ -0,0 +1,13 @@ +repo: dantebronto/picard +date: Tue Dec 01 16:08:00 -0600 2009 +categories: github,node-js,javascript + +# Picard - A micro-framework for Node.js + +Similar to Sinatra and uses [Haml-js](http://github.com/creationix/haml-js). Looks like things are heating up for [Node.js.](http://nodejs.org) + +Hat tip:[ @igalko](http://twitter.com/igalko) - [http://twitter.com/igalko/status/6248313763](http://twitter.com/igalko/status/6248313763) + +> Picard is a server-side #JavaScript web app micro-framework for #nodejs that's very similar to Sinatra: http://bit.ly/8FKJMZ @hallettj + +[[Source on GitHub](http://github.com/dantebronto/picard)] diff --git a/content/pages/articles/puppet-dashboard-a-web-interface-w-node-management.mdown b/content/pages/articles/puppet-dashboard-a-web-interface-w-node-management.mdown new file mode 100644 index 0000000..21b3f14 --- /dev/null +++ b/content/pages/articles/puppet-dashboard-a-web-interface-w-node-management.mdown @@ -0,0 +1,13 @@ +repo: reductivelabs/puppet-dashboard +date: Mon Dec 07 03:02:08 -0600 2009 +categories: github,puppet,automation,ruby + +# Puppet Dashboard: A web interface w/ node management and reporting tools + +The Puppet Dashboard is a Puppet web interface that provides node management and reporting tools. Nodes can be exported in YAML format, allowing the dashboard to be used as an external node classification tool. + +Requires `ruby >= 1.8.1` and `sqlite3` (by default). + +Hat tip: [@davewongillies](http://twitter.com/davewongillies) [http://twitter.com/davewongillies/statuses/6415696099](http://twitter.com/davewongillies/statuses/6415696099) + +[[code on GitHub](http://github.com/reductivelabs/puppet-dashboard)] diff --git a/content/pages/articles/qt-4-6-the-trailer.mdown b/content/pages/articles/qt-4-6-the-trailer.mdown new file mode 100644 index 0000000..7ef81ae --- /dev/null +++ b/content/pages/articles/qt-4-6-the-trailer.mdown @@ -0,0 +1,9 @@ +repo: http://www.youtube.com/watch?v=EURONfIqJ6o +date: Wed Nov 25 02:20:00 -0600 2009 +categories: javascript,ui,multi-touch + +# Qt 4.6: The Trailer + +Qt is a cross-platform application and UI framework. Qt 4.6’s QtScript implementation is based on WebKit’s JavaScript engine, JavaScriptCore (you might’ve also heard it being referred to as “SquirrelFish” or “SquirrelFish Extreme”). + +[[video](http://www.youtube.com/watch?v=EURONfIqJ6o)] [[learn more](http://qt.nokia.com/)] diff --git a/content/pages/articles/quicksand-awesome-jquery-plugin-to-filter-animate-html-l.mdown b/content/pages/articles/quicksand-awesome-jquery-plugin-to-filter-animate-html-l.mdown new file mode 100644 index 0000000..ff24f2c --- /dev/null +++ b/content/pages/articles/quicksand-awesome-jquery-plugin-to-filter-animate-html-l.mdown @@ -0,0 +1,27 @@ +repo: razorjack/quicksand +date: Fri Feb 12 08:38:00 -0600 2010 +categories: jquery,,animation,css3,design,github,javascript,plugins,video + +# Quicksand: Awesome jQuery plugin to filter/animate HTML lists + +Quicksand from [Jacek Galanciak](http://github.com/razorjack) is a jQuery plugin to help you filter and animate items in an HTML list. + +With code like this: + + $("#content").quicksand($("#data > li"), + { + // all the parameters have sensible defaults + // and in most cases can be optional + duration: 1000, + easing: "easeInOutQuad", + attribute: "data-id", + } + ); + +You can get the eye candy in this [video](http://screenr.com/S1x): + + + +Quicksand depends on [jQuery 1.4+](http://github.com/jquery/jquery) and most any browser that isn't abbreviated IE6. + +[[Source on Github](http://github.com/razorjack/quicksand)] [[Homepage](http://razorjack.net/quicksand/)] [[Demo](http://razorjack.net/quicksand/demos/ajax.html)] [[Happy Webbies!](http://www.happywebbies.com/)] diff --git a/content/pages/articles/rackamole-track-user-interactions-with-your-web-site.mdown b/content/pages/articles/rackamole-track-user-interactions-with-your-web-site.mdown new file mode 100644 index 0000000..423527e --- /dev/null +++ b/content/pages/articles/rackamole-track-user-interactions-with-your-web-site.mdown @@ -0,0 +1,11 @@ +repo: derailed/rackamole +date: Mon Dec 07 04:41:20 -0600 2009 +categories: github,rack,ruby + +# Rackamole: Track user interactions with your web site + +Rackamole is a rack application that tracks user's interactions with your web site. This is not about page hits. Rackamole captures the very essence of a user's activity by recording various elements of a request that occurs within your application. + +Using Rackamole you are able to see which feature is a hit or a bust. As an added bonus, you can also track performance and exceptions that might have escaped your test suites or alpha env. + +[[code on GitHub](http://github.com/derailed/rackamole)] diff --git a/content/pages/articles/rails-2-3-5-released.mdown b/content/pages/articles/rails-2-3-5-released.mdown new file mode 100644 index 0000000..537d50d --- /dev/null +++ b/content/pages/articles/rails-2-3-5-released.mdown @@ -0,0 +1,16 @@ +repo: rails/rails +date: Fri Nov 27 09:12:00 -0600 2009 +categories: github,releases,rails + +# Rails 2.3.5 released + +Unofficial release notes from [Mike Gunderloy](http://afreshcup.com): + +* An XSS vulnerability in strip_tags is fixed. +* Several Ruby 1.9 compatibility fixes +* :_delete option in nested attributes has been renamed to :_destroy +* The MySQL adapter is updated to allow the use of stored procedures +* Rails is tested with newer versions of Rack (1.0.1), the MySQL adapter (2.8.1), Mocha (0.9.8), and the sqlite3-ruby adapter (1.2.5). sqlite 2 is only supported if you're using Ruby 1.8.x. + +[[view full story]](http://afreshcup.com/home/2009/11/27/rails-235-unofficial-release-notes.html) [[Release on GitHub]](http://github.com/rails/rails/tree/v2.3.5) + diff --git a/content/pages/articles/rails-3-0-beta-gem.mdown b/content/pages/articles/rails-3-0-beta-gem.mdown new file mode 100644 index 0000000..3e8a3e8 --- /dev/null +++ b/content/pages/articles/rails-3-0-beta-gem.mdown @@ -0,0 +1,13 @@ +repo: rails/rails +date: Thu Feb 04 21:21:00 -0600 2010 +categories: rails,github,releases,gems,beta + +# Rails 3.0 beta! + +After more than a year and over 4000 commits by 250 authors, the Rails 3 Beta is here! +The Rails 3.0.0.beta gem is now live on Gemcutter: + + sudo gem install tzinfo builder memcache-client rack rack-test rack-mount erubis mail text-format thor bundler i18n + sudo gem install rails --pre + +[[Source on GitHub](http://github.com/rails/rails)] [[Official CHANGELOG](http://guides.rails.info/3_0_release_notes.html)] [[Ruby gem](http://gemcutter.org/gems/rails/versions/3.0.0.beta)][[Yehuda's blog post](http://www.engineyard.com/blog/2010/rails-3-beta-is-out-a-retrospective/)] diff --git a/content/pages/articles/restler-for-node-js.mdown b/content/pages/articles/restler-for-node-js.mdown new file mode 100644 index 0000000..770a7d4 --- /dev/null +++ b/content/pages/articles/restler-for-node-js.mdown @@ -0,0 +1,18 @@ +repo: danwrong/restler +date: Fri Nov 27 10:25:00 -0600 2009 +categories: github,what-we-are-watching,javascript,node-js + +# Restler: REST client library for node.js + +An HTTP client library for [node.js](http://nodejs.org). Hides most of the complexity of creating and using http.Client. + +* Easy interface for basic operations via http.Client +* Automatic serialization of post data +* Automatic serialization of query string data +* Automatic deserialization of XML, JSON and YAML responses to JavaScript objects +* Provide your own deserialization functions for other datatypes +* Automatic following of redirects +* Deals with basic auth for you, just provide username and password options + + +[[source on GitHub]](http://github.com/danwrong/restler) diff --git a/content/pages/articles/riak-high-performance-document-store-built-on-json-and-r.mdown b/content/pages/articles/riak-high-performance-document-store-built-on-json-and-r.mdown new file mode 100644 index 0000000..27f9bb0 --- /dev/null +++ b/content/pages/articles/riak-high-performance-document-store-built-on-json-and-r.mdown @@ -0,0 +1,29 @@ +repo: zeitgeist/riak +date: Wed Feb 10 13:49:00 -0600 2010 +categories: github,riak,nosql,json,rest,erlang,php,ruby,python,java + +# riak - high performance document store built on JSON and REST + +riak +[Riak](http://riak.basho.com), _REE-ahk_, combines the power of [Erlang](http://erlang.org/) with the ubiquity of JSON to deliver a highly scalable document store over REST. Hold on [CouchDB](http://couchdb.apache.org/) fans, before you pounce, you haven't heard this one before. + +#### Master-less replication + +Riak is architected for master-less replication from the GET-go. All nodes participate equally in the replication so scaling horizontally means just adding new servers to join the party. + +#### Links for powerful object graphs + +Riak supports _link-walking_ which is far more powerful than traditional relational DB joins. As [Sean Cribbs](http://seancribbs.com/tech/2010/02/06/why-riak-should-power-your-next-rails-app/) explains: + +> Every datum stored in Riak can have one-way relationships to other data via the Link HTTP header. In the canonical example, you know the key of a band that you have stored in the “artists” bucket (Riak buckets are like database tables or S3 buckets). If that artist is linked to its albums, which are in turn linked to the tracks on the albums, you can find all of the tracks produced in a single request. As I’ll describe in the next section, this is much less painful than a JOIN in SQL because each item is operated on independently, rather than a table at a time. Here’s what that query would look like: + + GET /raw/artists/TheBeatles/albums,_,_/tracks,_,1 + +#### More powerful Map/Reduce + +Map/Reduce works a bit differently in Riak. Riak's Map function expects a list of keys on which it should run. You can of course pass every key in your bucket, but doing Map in this way allows Map to be run on the node where the data is actually stored. + +Riak ships with [libraries for Python, Ruby, Java, Erlang, and even JavaScript](http://riak.basho.com/programming.html). Want to know more? Stay tuned. Riak will be the focus of an upcoming episode of The Changelog. + +[[Source on BitBucket](http://hg.basho.com/riak/wiki/Home)] [[Homepage](http://riak.basho.com)] [[Brian Fink's NYC-NoSQL talk](http://riak.basho.com/nyc-nosql/)] + diff --git a/content/pages/articles/riot-an-extremely-fast-running-unit-testing.mdown b/content/pages/articles/riot-an-extremely-fast-running-unit-testing.mdown new file mode 100644 index 0000000..8a02518 --- /dev/null +++ b/content/pages/articles/riot-an-extremely-fast-running-unit-testing.mdown @@ -0,0 +1,21 @@ +repo: thumblemonks/riot +date: Fri Nov 27 17:38:00 -0600 2009 +categories: github,unit-testing,framework,ruby,gem + +# Riot - An extremely fast-running unit testing framework. + +#### Background + +You start a new project. You get all excited. You're adding tests. You're adding factories. You're fixturating your setups. You're adding more tests. Your tests start slowing down, but you need to keep pushing because your backlog has a lot of new, nifty features in it. You've got 3000+ lines of test code, 2000+ assertions. Your tests are annoyingly slow. Your tests have become a burden. + +#### How Riot is different + +Riot differs primarily in that it does not rerun setup for each test in a context. I know this is going to shock a lot of folks. However, over the past several years of my doing TDD in some capacity or another, there are certain habits I have tried to pick up on any many others I have tried to drop. + +(content extracted from the project's readme) + +Hat tip: [JEG2](http://twitter.com/JEG2) - [http://twitter.com/JEG2/status/6123735447](http://twitter.com/JEG2/status/6123735447) + +> I made commits to riot and colorize today. Once there are new releases of both, riot will be promoted to my favorite Ruby testing library! + +[[code at GitHub](http://github.com/thumblemonks/riot/)] [[ruby gem at Gemcutter](http://gemcutter.org/gems/riot)] diff --git a/content/pages/articles/rippin-off-python-w-chris-wanstrath.mdown b/content/pages/articles/rippin-off-python-w-chris-wanstrath.mdown new file mode 100644 index 0000000..1362689 --- /dev/null +++ b/content/pages/articles/rippin-off-python-w-chris-wanstrath.mdown @@ -0,0 +1,14 @@ +date: Mon Feb 15 15:49:00 -0600 2010 +categories: talks,video,ruby,python + +# Rippin' off Python w/ Chris Wanstrath + + + +A great talk from [Chris Wanstrath](http://github.com/defunkt) ([@defunkt](http://twitter.com/defunkt)) on [Python](http://www.python.org/) from a [Rubyist's](http://www.ruby-lang.org/en/) perspective. + +We too favor awesome docs for the projects that we feature, peps seem like an awesome concept to support (seriously), and hacking side-by-side with two languages is a nice way to get started with a new language... + +Great work Chris on your journey through the various languages you've been able to have fun with. We appreciate you sharing what you've learned along the way. + +Also, check out [Episode 0.1.0](http://bit.ly/tcl-0-1-1) w/ Chris. diff --git a/content/pages/articles/ripple-ruby-client-for-riak.mdown b/content/pages/articles/ripple-ruby-client-for-riak.mdown new file mode 100644 index 0000000..ac824a9 --- /dev/null +++ b/content/pages/articles/ripple-ruby-client-for-riak.mdown @@ -0,0 +1,28 @@ +repo: seancribbs/ripple +date: Wed Feb 10 22:01:00 -0600 2010 +categories: github,ruby,gems,riak,basho,nosql,wrappers + +# ripple - Ruby client for Riak + +Are you a Rubyist and want to play with [Riak](http://riak.basho.com), the sweet new NoSQL distributed database we [featured earlier](http://thechangelog.com/post/382278264/riak-high-performance-document-store-built-on-json-and-r)? During our interview for upcoming Episode 0.1.4, [Sean Cribbs](http://seancribbs.com) gave us a scoop. Introducing [Ripple](http://github.com/seancribbs/ripple), a hot new Ruby client for Riak. + +#### An example from the [README](http://github.com/seancribbs/ripple#readme) + + require 'riak' + + # Create a client interface + client = Riak::Client.new + + # Retrieve a bucket + bucket = client.bucket("doc") # a Riak::Bucket + + # Get an object from the bucket + object = bucket.get("index.html") # a Riak::RObject + + # Change the object's data and save + object.data = "Hello, world!" + object.store + +Still want more Riak? Stay tuned. Episode 0.1.4 will rock! + +[[Source on GitHub](http://github.com/seancribbs/ripple)] [[Homepage](http://seancribbs.github.com/ripple/)] [[Backstory](http://seancribbs.com/tech/2010/02/10/introducing-ripple-0-5-you-got-your-riak-in-my-ruby/)] diff --git a/content/pages/articles/scss-css-style-syntax-for-sass.mdown b/content/pages/articles/scss-css-style-syntax-for-sass.mdown new file mode 100644 index 0000000..51baa94 --- /dev/null +++ b/content/pages/articles/scss-css-style-syntax-for-sass.mdown @@ -0,0 +1,15 @@ +repo: nex3/haml/commits/scss +date: Tue Jan 05 14:26:00 -0600 2010 +categories: github,sass,css,compass + +# SCSS: CSS-style syntax for Sass + +The [Sass](http://sass-lang.com/) vs vanilla CSS battle has been going on for some time now. For those new to the party, Sass is CSS, plus nested rules, variables, mixins, and more, all in a concise, readable syntax. When coupled with [Compass](http://compass-style.org/), things can get pretty interesting. + +Well, the developers of Sass have been wanting to go more mainstream and have realized that the Sass syntax, while there are many who love it, may not be for the everyday mainstream designer. + +####Enter SCSS. + +SCSS is a CSS-style syntax for Sass. It will have the same power and semantics as Sass, but the syntax won't be whitespace-sensitive; instead, it will be a superset of CSS, or as close as possible. It's currently in heavy development, but should work well enough that it can be used from the command line or via the Rails plugin, although not all the features are there yet. + +[[Code (branch) on GitHub](http://github.com/nex3/haml/commits/scss)] [[Sass Homepage](http://sass-lang.com/)] [[Mailing list thread](http://groups.google.com/group/compass-users/browse_thread/thread/a935eda5b860a350)] diff --git a/content/pages/articles/shortwiki-a-simple-sms-based-wiki-using-google-voice.mdown b/content/pages/articles/shortwiki-a-simple-sms-based-wiki-using-google-voice.mdown new file mode 100644 index 0000000..6e58ccd --- /dev/null +++ b/content/pages/articles/shortwiki-a-simple-sms-based-wiki-using-google-voice.mdown @@ -0,0 +1,21 @@ +repo: rndmcnlly/ShortWiki +date: Sun Dec 13 20:45:28 -0600 2009 +categories: github,python,wiki,google-voice + +# ShortWiki: A simple SMS-based wiki using Google Voice + +Built in Python, ShortWiki lets you edit a wiki via SMS: + +From the README: + +> Text "HelloWorld Hi! :)" to your number. This writes a wikipage called "HelloWorld". + +> Now text just "HelloWorld". You should receive "Hi :)" with a footer signature. + +> You can get a friend to text something like "HelloWorld lolcats!" to edit the page. + +> Now when you get "HelloWorld", you'll see "lolcats!" by your friend and when. + +> Make lots of pages! Serve up microcontent over SMS. :) + +[[Source on GitHub](http://github.com/rndmcnlly/ShortWiki)] diff --git a/content/pages/articles/showoff-the-best-darn-presentation-software-a-developer.mdown b/content/pages/articles/showoff-the-best-darn-presentation-software-a-developer.mdown new file mode 100644 index 0000000..f27e630 --- /dev/null +++ b/content/pages/articles/showoff-the-best-darn-presentation-software-a-developer.mdown @@ -0,0 +1,26 @@ +repo: schacon/showoff +date: Wed Jan 20 09:08:59 -0600 2010 +categories: github,sinatra,presentations,slides + +# Showoff - the best darn presentation software a developer could ever love + +From GitHub's own [@schacon](http://github.com/schacon), Showoff aims to do presentations developer style. + +> ShowOff is a Sinatra web app that reads simple configuration files for a presentation. It is sort of like a Keynote web app engine. + +Scott's goals are: + +* show simple text +* show images +* show syntax highlighted code +* re-enact command line interactions +* do simple transitions (instant, fade, slide in) +* show a timer - elapsed / remaining +* perform simple animations of images moving between keyframes +* show syncronized, hidden notes on another browser (like an iphone) +* show audience questions / comments (twitter or direct) +* let audience members go back / catch up as you talk +* let audience members vote on sections (?) +* call up a menu of sections/slides at any time to jump around. + +[[Source on GitHub](http://github.com/schacon/showoff)] diff --git a/content/pages/articles/simfinger-mobile-mac-screencasts.mdown b/content/pages/articles/simfinger-mobile-mac-screencasts.mdown new file mode 100644 index 0000000..a3b388a --- /dev/null +++ b/content/pages/articles/simfinger-mobile-mac-screencasts.mdown @@ -0,0 +1,16 @@ +repo: atebits/SimFinger +date: Wed Feb 17 21:33:49 -0600 2010 +categories: github,iphone,screencasting,tools,palm,palm-pre,mac,cocoa + +# SimFinger - make awesome screencasts of your mobile apps on your Mac + +[SimFinger](http://github.com/atebits/SimFinger) is a screencasting tool from Loren Brichter aka [@atebits](http://twitter.com/atebits), author of popular apps like [Tweetie](http://www.atebits.com/tweetie-iphone/) for the iPhone as well as the [desktop](http://www.atebits.com/tweetie-mac/). SimFinger is a Cocoa app for the Mac that adds some polish to your mobile app screencasts by providing: + +* A frame that sits on top of the simulator and adds shine and an iPhone 3G look +* A halo around the pointer to indicate touch events +* Ability to set the carrier text +* Fake apps (and dock badge counts) so that your app isn't so lonely on the home screen. + +Notice that we say 'mobile apps' and not 'iPhone' or 'Touch' apps because a [fork](http://github.com/kreutz/SimFinger) from [@kreutz](http://github.com/kreutz) adds support for the PalmPre simulator. + +[[Source on GitHub](http://github.com/atebits/SimFinger)] [[Original blog post](http://blog.atebits.com/2009/03/not-your-average-iphone-screencast/)] [[Palm fork](http://github.com/kreutz/SimFinger)] diff --git a/content/pages/articles/slidify-lightweight-slider-plugin-for-jquery.mdown b/content/pages/articles/slidify-lightweight-slider-plugin-for-jquery.mdown new file mode 100644 index 0000000..e259be5 --- /dev/null +++ b/content/pages/articles/slidify-lightweight-slider-plugin-for-jquery.mdown @@ -0,0 +1,29 @@ +repo: ryanmcgrath/slidify +date: Sun Dec 13 20:51:00 -0600 2009 +categories: github,javascript,jquery,plugins + +# Slidify: Lightweight slider plugin for jQuery + +A lightweight jQuery plugin that transforms input elements into UI Slider controls: + +Example from the README: + + + + + $(document).ready(function() { + $(".example").slidify({ + width: 400, + height: 20, + /* + wrapperClass/sliderClass are provided by default, + no need to specify if you don't want + */ + wrapperClass: "slidify_slider_container", + sliderClass: "slidify_slider_knob", + maxValue: 500, + callback: null + }); + }); + +[[Source on GitHub](http://github.com/ryanmcgrath/slidify)] [[@ryanmcgrath on Twitter](http://twitter.com/ryanmcgrath)] diff --git a/content/pages/articles/soundmanager2-cross-browser-platform-javascript-sound.mdown b/content/pages/articles/soundmanager2-cross-browser-platform-javascript-sound.mdown new file mode 100644 index 0000000..a7f1df5 --- /dev/null +++ b/content/pages/articles/soundmanager2-cross-browser-platform-javascript-sound.mdown @@ -0,0 +1,19 @@ +repo: scottschiller/SoundManager2 +date: Thu Jan 07 02:26:00 -0600 2010 +categories: github,javascript,sound + +# SoundManager2: Cross-Browser/Platform Javascript Sound API + +SoundManager 2 makes it easier to play sounds using Javascript. By wrapping and extending the Flash sound API, SoundManager 2 brings solid cross-browser/platform audio functionality to Javascript. + +As seen on [Muxtape](http://muxtape.com/), [SoundCloud](http://soundcloud.com/) / [The Cloud Player](http://www.thecloudplayer.com/) and [8tracks](http://8tracks.com/) + +Some of the Basic API Features (Flash 8) + +* Load, stop, play, pause, mute, seek, pan and volume control of sounds from Javascript +* Events: onload, whileloading, whileplaying, onfinish and more +* ID3V1 and ID3V2 tag support for MP3s (title, artist, genre etc.) + +[more...](http://github.com/scottschiller/SoundManager2#readme) + +[[Code on GitHub](http://github.com/scottschiller/SoundManager2)] [[Homepage](http://www.schillmania.com/projects/soundmanager2/)] diff --git a/content/pages/articles/storytlr-php-lifestreaming-for-geeks.mdown b/content/pages/articles/storytlr-php-lifestreaming-for-geeks.mdown new file mode 100644 index 0000000..c5ea266 --- /dev/null +++ b/content/pages/articles/storytlr-php-lifestreaming-for-geeks.mdown @@ -0,0 +1,30 @@ +repo: jmhobbs/storytlr +date: Fri Feb 12 07:47:00 -0600 2010 +categories: github,php,lifestreaming,social-media + +# storytlr - lifestreaming for geeks + +Open Source has its own [Circle of Life](http://en.wikipedia.org/wiki/Circle_of_Life). As we discussed in [Episode 0.1.1](http://thechangelog.com/post/360070705/episode-0-1-1-john-nunemaker-from-mongomapper), Open Source creates opportunities for entrepreneurs. Sometimes [those businesses](http://shopify.com) can spin off [their own projects](http://liquidmarkup.org), paving the way for the next round of startups. + +Sometimes commercial apps just don't survive, but let's not confuse viable with valuable. Take the case of [Storytlr](http://storytlr.com/), a hosted lifestreaming service which sought to let you remix your social networking interactions into your own "stories." When the hard decision was made to pull the plug on the service at the end of last year, the founders did what many apps have done and handed the source code over to the community. + +The official Storytlr open source project is on [Google Code](http://storytlr.googlecode.com/) but [John Hobbs](http://github.com/jmhobbs) has a [fork on GitHub](http://github.com/jmhobbs/storytlr) that adds: + +* A tool to rename users (dangerous if not handled properly) +* Plugins built in for... +* Github +* goodreads +* Foursquare +* Stack Overflow +* Twitter favorites +* Google Buzz +* Ability to delete items that are from other sources (not just ones from Storytlr itself) +* tidy is replaced by htmLawed +* Misc fixes for issues reported on the Google group +* Misc fixes from other forks, esp. paths courtesy of Stuart Herbert + +For a [live demo](http://stream.abrah.am/), check out [@abraham](http://twitter.com/abraham)'s Storytlr at [http://stream.abrah.am/](http://stream.abrah.am/). + +Storytlr runs on PHP (which runs darn near everywhere) and [installation instructions](http://github.com/jmhobbs/storytlr#readme) can be found in the [README](http://github.com/jmhobbs/storytlr#readme). + +[[Official Google Code Project](http://storytlr.googlecode.com/)] [[Source on GitHub](http://github.com/jmhobbs/storytlr)] diff --git a/content/pages/articles/tapkulibrary-beautiful-iphone-ui-class-library.mdown b/content/pages/articles/tapkulibrary-beautiful-iphone-ui-class-library.mdown new file mode 100644 index 0000000..bc959f5 --- /dev/null +++ b/content/pages/articles/tapkulibrary-beautiful-iphone-ui-class-library.mdown @@ -0,0 +1,11 @@ +repo: devinross/tapkulibrary +date: Thu Feb 04 21:35:00 -0600 2010 +categories: UI,iphone,libraries,obj-c,github + +# TapkuLibrary - Beautiful iPhone UI class library + +TapkuLibrary from [Devin Ross](http://devinsheaven.com) is a collection of UI classes for iPhone development. The [README](http://github.com/devinross/tapkulibrary#readme) includes detailed installation instructions and is full of gorgeous screenshots: + +screen shot + +[[Source on GitHub](http://github.com/devinross/tapkulibrary)] [[Tapku](http://tapku.com/)] diff --git a/content/pages/articles/temple-template-compilation-framework-in-ruby.mdown b/content/pages/articles/temple-template-compilation-framework-in-ruby.mdown new file mode 100644 index 0000000..4b8f56d --- /dev/null +++ b/content/pages/articles/temple-template-compilation-framework-in-ruby.mdown @@ -0,0 +1,9 @@ +repo: judofyr/temple +date: Fri Dec 18 22:45:59 -0600 2009 +categories: github,framework,ruby + +# TEMPLE: Template compilation framework in Ruby + +TEMPLE is "Rack" for Templating engines: http://judofyr.net/posts/temple.html Nice! (via [@assaf](http://twitter.com/assaf)) + +> The idea is to build an engine based on a chain of compilers. A compiler is simply a class which has a method called #compile which takes one arguments. It’s illegal for a compiler to mutate the argument, and it should be possible to use the same instance several times. diff --git a/content/pages/articles/text-haml-haml-parser-in-perl.mdown b/content/pages/articles/text-haml-haml-parser-in-perl.mdown new file mode 100644 index 0000000..894e1fa --- /dev/null +++ b/content/pages/articles/text-haml-haml-parser-in-perl.mdown @@ -0,0 +1,11 @@ +repo: vti/text-haml +date: Mon Nov 30 21:10:00 -0600 2009 +categories: github,perl,haml + +# Text-Haml: Haml Parser in Perl + +Don't look now, but you can get your Haml on in Perl too. Text-Haml is a newly released Haml parser written in Perl by [Viacheslav Tykhanovskyi](http://github.com/vti). + +Of course we love to see the ecosystem of [Haml](http://haml-lang.com/) / [Sass](http://sass-lang.com/) grow to further reaches. + +[[code on GitHub](http://github.com/vti/text-haml)] diff --git a/content/pages/articles/things-rb-ruby-lib-cli-for-things-mac.mdown b/content/pages/articles/things-rb-ruby-lib-cli-for-things-mac.mdown new file mode 100644 index 0000000..51e04e4 --- /dev/null +++ b/content/pages/articles/things-rb-ruby-lib-cli-for-things-mac.mdown @@ -0,0 +1,33 @@ +repo: haraldmartin/things-rb +date: Sat Jan 23 06:39:00 -0600 2010 +categories: github,things,ruby,cli,mac,OSX + +# things-rb: Ruby lib & CLI for Things (mac) + +A fellow Rubist and good friend [Andy Shen](http://twitter.com/shenie) had a conversation on Twitter with another fellow Rubist [Josh Price](http://twitter.com/joshprice) about [Things](http://culturedcode.com/things/), the Mac GTD application for the Desktop and iPhone. + +![Screenshot](http://farm5.static.flickr.com/4032/4297630426_f715cf9a02_o.jpg) + +What they probably didn't know is that there's a Ruby library & CLI tool for accessing the back-end of Things Open Sourced on GitHub. + +There are number of reasons why you'd use a command line version of Things, including: + +1. You're a geek and you like using Terminal and the command line +1. You don't need to keep "Things" running all the time +1. You can access your todo's remotely via SSH (even from a Windows or Linux box) +1. Use [GeekTool](http://projects.tynsoe.org/en/geektool/) to keep your todo's on the desktop + +Example from the [README](http://github.com/haraldmartin/things-rb#readme): + + things = Things.new # will use Things' default database location. + # things = Things.new(:database => '/path/to/Database.xml') + + tasks = things.today.map do |task| + tags = "(#{task.tags.join(' ')})" if task.tags? + project = "[#{task.parent}]" if task.parent? + [task.bullet, task.title, tags, project].compact.join(" ") + end + + puts tasks.compact.sort.join("\n") + +[[Source on GitHub](http://github.com/haraldmartin/things-rb)] [[README](http://github.com/haraldmartin/things-rb#readme)] diff --git a/content/pages/articles/thor-git-make-developing-with-git-easier.mdown b/content/pages/articles/thor-git-make-developing-with-git-easier.mdown new file mode 100644 index 0000000..1fbda8c --- /dev/null +++ b/content/pages/articles/thor-git-make-developing-with-git-easier.mdown @@ -0,0 +1,13 @@ +repo: cypher/thor-git +date: Sat Nov 28 11:51:00 -0600 2009 +categories: github + +# Thor-Git: Make developing with Git easier + +Thor-Git is a set of Thor tasks to make developing with Git easier. + +The tasks are designed around a particular workflow in which you primarily develop against a single upstream that you git-push or git-svn dcommit to. In this workflow master typically mirrors this upstream, and little or no work is done on master. Instead you branch off master with thor git:open and then commit as you go, using thor git:push to send your changes upstream, and finally using thor git:close to delete the branch when you’re done with it. + +(content extracted from the project’s readme) + +[[code at GitHub](http://github.com/cypher/thor-git/)] diff --git a/content/pages/articles/tip-use-filters-when-tailing-the-changelog.mdown b/content/pages/articles/tip-use-filters-when-tailing-the-changelog.mdown new file mode 100644 index 0000000..c2a578d --- /dev/null +++ b/content/pages/articles/tip-use-filters-when-tailing-the-changelog.mdown @@ -0,0 +1,8 @@ +date: Thu Feb 18 10:19:00 -0600 2010 +categories: screencast,tail,video + +# Tip: Use filters when tailing The Changelog + +It seems our settings icon on http://tail.thechangelog.com is a bit too subtle so we recorded a quick [screencast](http://screenr.com/Dkx) to show you how you can filter the GitHub firehose to see only the open source events you actually care about. + + diff --git a/content/pages/articles/topup-a-lightbox-for-jquery.mdown b/content/pages/articles/topup-a-lightbox-for-jquery.mdown new file mode 100644 index 0000000..f15be3f --- /dev/null +++ b/content/pages/articles/topup-a-lightbox-for-jquery.mdown @@ -0,0 +1,9 @@ +repo: archan937/topup +date: Tue Nov 24 08:48:00 -0600 2009 +categories: github,javascript,jquery,plugins + +# TopUp - Powerful lightbox plugin for jQuery + +Handles images, flash, movies, iframes, DOM elements and raw HTML. Compress and CSS sprite-driven, it weighs in at only 33.4KB. A number of presets and _toptions_ make setup easy. + +[[Visit the site](http://gettopup.com/)] [[View the demo](http://gettopup.com/demo)] diff --git a/content/pages/articles/toto-close-to-the-metal-blogging-on-top-of-rack.mdown b/content/pages/articles/toto-close-to-the-metal-blogging-on-top-of-rack.mdown new file mode 100644 index 0000000..89985c0 --- /dev/null +++ b/content/pages/articles/toto-close-to-the-metal-blogging-on-top-of-rack.mdown @@ -0,0 +1,30 @@ +repo: cloudhead/toto +date: Mon Feb 08 21:00:25 -0600 2010 +categories: github,rack,blogging,toto,heroku,varnish,static + +# toto - Close-to-the-metal blogging on top of Rack + +Take a look around the small site web landscape and it's clear we're not in Kansas anymore. It's no longer a foregone conclusion that a new blog or brochure site should be built on a CMS or even web framework. [Toto](http://github.com/cloudhead/toto) is the latest in a rising breed of static page generators. + +Toto dumps the database and stores its content in plain text files. Its built on top of Rack and is [Heroku](http://heroku.com) & [Varnish](http://varnish-cache.org/) friendly so that your site will scream on even a free single dyno. + +From the [README](http://github.com/cloudhead/toto#readme), here's how Toto works: + +* content is entirely managed through git; you get full fledged version control for free. +* articles are stored as .txt files, with embeded metadata (in yaml format). +* articles are processed through a markdown converter (rdiscount) by default. +* templating is done through ERB. +* toto is built right on top of Rack. +* toto was built to take advantage of HTTP caching. +* toto was built with heroku in mind. +* comments are handled by disqus +* individual articles can be accessed through urls such as /2009/11/21/blogging-with-toto +* the archives can be accessed by year, month or day, wih the same format as above. +* arbitrary metadata can be included in articles files, and accessed from the templates. +* summaries are generated intelligently by toto, following the :max setting you give it. +* you can also define how long your summary is, by adding ~ at the end of it (:delim). + +To get started quickly, clone the default template [Dorothy](http://github.com/cloudhead/dorothy) and deploy to Heroku in a snap. + +[[Source on GitHub](http://github.com/cloudhead/toto)] + diff --git a/content/pages/articles/tradui-civic-hacking-for-haiti.mdown b/content/pages/articles/tradui-civic-hacking-for-haiti.mdown new file mode 100644 index 0000000..c4b9512 --- /dev/null +++ b/content/pages/articles/tradui-civic-hacking-for-haiti.mdown @@ -0,0 +1,43 @@ +repo: brendanlim/Tradui +date: Mon Feb 15 08:25:00 -0600 2010 +categories: android,civichacking,github,iphone,haiti + +# Tradui: Civic Hacking for Haiti + +Tradui iPhone Screenshot + +Across the United States there has been a gathering of people looking for ways to ease the suffering caused by the devastating earthquake that struck Haiti on Jauary 12th, 2010. Three members of [Intridea](http://intridea.com/), [Chris Selmer](http://twitter.com/cselmer), [Brendan Lim](http://twitter.com/brendanlim) and [Jonathan Nelson](http://twitter.com/jonathannelson) stepped up to help with the efforts towards those in need in Haiti by heading to DC to take part in [Crisis Camp DC](http://crisiscampdc.ning.com/). + +Their "civic hacking" efforts in DC lead them to develop [Tradui](http://traduiapp.com/). + +Tradui is pronounced: Trad - eww - ee + +Tradui, Creole for "translate", is an application for the iPhone and Android platforms to translate Creole to English and English to Creole and was built by [Intridea](http://www.intridea.com/) for [Crisis Commons](http://crisiscommons.org/) as part of Crisis Camp DC. Additional work was also done by members of CrisisCamp Haiti on 1/23 in DC, Boston, and Boulder. + +#### Built in 15 man hours w/ Appcelerator + +We spoke with Brendan Lim, Intridea's mobile application extraordinaire who lead the development of Tradui. + +> "From concept to completion, the development for the actual mobile application took 15 man hours. Our biggest initial hurdle to get over was getting our hands on a good dictionary. Then we had to parse it out." + +When asked how they were able to keep the development time so short, Brendan replied... + +> "That's the beauty of using [Appcelerator's Titanium Development Platform](http://www.appcelerator.com/). We can do builds super quick for both the iPhone and Android platforms." + +If you want to learn more about [Appcelerator](http://www.appcelerator.com/) and their exciting open source development platforms, make a note to go back and listen to [Episode 0.0.8 with Marshall Culpepper from Appcelerator](http://bit.ly/tcl-0-0-8) after reading this. + +The data for Tradui's Creole to English and English to Creole dictionary was extracted with permission from the HaitiSurf Creole to English Dictionary. Each and every one of the translation capabilities inside Tradui are available offline. That means that no data plans are required. It is completely offline. + +#### It's Open Source, spread the word! + +In order to spread Tradui to other platforms and uses the code was [open sourced on GitHub](http://github.com/brendanlim/Tradui), allowing the community to fork the project and help with development. Many people have even ported the idea to other platforms. + +To learn more head to [traduiapp.com](http://traduiapp.com/) + +#### CrisisCamp @ SXSW + +If you plan to be in Austin for SXSW and want to take part in some Civic hacking at [CrisisCamp @ SXSW](http://crisiscampsxsw.eventbrite.com/), you can join CrisisCamp and many others March 16-17 to "hack to help" in times of Crisis. + +CrisisCamp is hoping to have LIVE streaming video from the event courtesy of [@texascoworking](http://twitter.com/texascoworking) + +[[Source on GitHub](http://github.com/brendanlim/Tradui)] [[Homepage](http://traduiapp.com/)] diff --git a/content/pages/articles/twitter-node-node-js-based-tweetstreaming.mdown b/content/pages/articles/twitter-node-node-js-based-tweetstreaming.mdown new file mode 100644 index 0000000..5b8987c --- /dev/null +++ b/content/pages/articles/twitter-node-node-js-based-tweetstreaming.mdown @@ -0,0 +1,9 @@ +repo: technoweenie/twitter-node +date: Sat Jan 16 20:24:45 -0600 2010 +categories: github,node-js,twitter,javascript + +# twitter-node: node.js based tweetstreaming + +Another interesting use of the super-fast [node.js](http://nodejs.org/), twitter-node from [@technoweenie](http://twitter.com/technoweenie) creates a streaming connection with twitter, and pushes any incoming statuses to a tweet event. + +[[Source on GitHub](http://github.com/technoweenie/twitter-node)] [[More on node.js](http://thechangelog.com/tagged/node-js)] diff --git a/content/pages/articles/uki-simple-uikit-for-complex-web-apps.mdown b/content/pages/articles/uki-simple-uikit-for-complex-web-apps.mdown new file mode 100644 index 0000000..534596a --- /dev/null +++ b/content/pages/articles/uki-simple-uikit-for-complex-web-apps.mdown @@ -0,0 +1,15 @@ +repo: voloko/uki +date: Wed Jan 20 14:35:45 -0600 2010 +categories: github,javascript,ui,tools,layout + +# UKI - simple UiKit for complex web apps + +UKI doesn't aim to be a broad framework but is instead a JavaScript user interface toolkit for desktop-like web applications. It handles layout and aims to do it well. + +#### Simple example + + uki({ view: 'Button', text: 'Click me', rect: '10 10 100 24' }).attachTo( window ); + + uki('Button[text^=Click]').click(function() { alert(this.text()); }); + +[[Source on GitHub](http://github.com/voloko/uki)] [[Homepage](http://ukijs.org/)] [[Examples and Demos](http://ukijs.org/examples/)] diff --git a/content/pages/articles/underscore-js-a-bowtie-for-jquerys-tux.mdown b/content/pages/articles/underscore-js-a-bowtie-for-jquerys-tux.mdown new file mode 100644 index 0000000..e234e7d --- /dev/null +++ b/content/pages/articles/underscore-js-a-bowtie-for-jquerys-tux.mdown @@ -0,0 +1,7 @@ +repo: documentcloud/underscore +date: Thu Nov 19 00:00:00 -0600 2009 +categories: github,javascript + +# Underscore.js a bowtie for jQuery's tux + +Neat little JavaScript framework from [DocumentCloud](http://documentcloud.org) that includes many convenience methods for arrays and collections. diff --git a/content/pages/articles/underscore-lua-from-mirven.mdown b/content/pages/articles/underscore-lua-from-mirven.mdown new file mode 100644 index 0000000..2433239 --- /dev/null +++ b/content/pages/articles/underscore-lua-from-mirven.mdown @@ -0,0 +1,9 @@ +repo: mirven/underscore.lua +date: Tue Dec 08 08:37:07 -0600 2009 +categories: github,lua,underscore,scripting,library + +# Underscore.lua - Utility library for Lua + +Inspired by [Underscore.js](http://thechangelog.com/post/255049350/underscore-js-a-bowtie-for-jquerys-tux) from [DocumentCloud](http://thechangelog.com/post/272530971/episode-0-0-5-document-cloud), Underscore.lua brings a host of utility functions to Lua. + +[[Source on Github](http://github.com/mirven/underscore.lua)] [[Homepage](http://mirven.github.com/underscore.lua/)] [[Follow @mirven](http://twitter.com/mirven)] diff --git a/content/pages/articles/wackamole-reporting-on-the-gathered-rackamole-data.mdown b/content/pages/articles/wackamole-reporting-on-the-gathered-rackamole-data.mdown new file mode 100644 index 0000000..cab3ccf --- /dev/null +++ b/content/pages/articles/wackamole-reporting-on-the-gathered-rackamole-data.mdown @@ -0,0 +1,11 @@ +repo: derailed/wackamole +date: Mon Dec 07 04:42:25 -0600 2009 +categories: github,rack,ruby + +# Wackamole: Reporting on the gathered Rackamole data + +This is a companion rails app for the [Rackamole framework](http://thechangelog.com/post/273051493/rackamole-track-user-interactions-with-your-web-site) which provides for recording interactions with your rack applications. Wackamole allows you to view, filter and drilldown on the collected moled information, hence allowing you to observe your applications live in the wild. + +Wackamole gives you pragmatic information on whether to tackle new features, take a look at performance or fix bugs on your next iteration. + +[[code on GitHub](http://github.com/derailed/wackamole)] diff --git a/content/pages/articles/webfinger-libraries-emerge.mdown b/content/pages/articles/webfinger-libraries-emerge.mdown new file mode 100644 index 0000000..1a6031f --- /dev/null +++ b/content/pages/articles/webfinger-libraries-emerge.mdown @@ -0,0 +1,28 @@ +repo: intridea/redfinger +date: Fri Feb 12 12:18:00 -0600 2010 +categories: github,google,ruby,python,api,webfinger + +# WebFinger libraries emerge + +Less than 24 hours after [Google broke the news](http://www.readwriteweb.com/archives/google_enables_webfinger_for_google_profiles_email_as_identity.php) of its take on [WebFinger](http://code.google.com/p/webfinger/), its 21st century take on the Unix [`finger`](http://www.manpagez.com/man/1/finger/) command, enterprising developers are releasing native libraries for the service. + +In case you missed it, WebFinger is a way to get profile information for a user of a service based solely on their email address. + +#### Ruby wrapper + +[Michael Bleigh](http://twitter.com/mbleigh) at Intridea released [Redfinger](http://github.com/intridea/redfinger) as a Ruby gem: + + sudo gem install redfinger + +You can then finger someone from the console: + + finger = Redfinger.finger('youraccount@gmail.com') + finger.open_id.first.to_s # => "http://www.google.com/profiles/youraccount" + +#### Python library + +[Jeremy Carbaugh](http://github.com/jcarbaugh) from Sunlight Labs (you did listen to [Episode 0.1.3](http://thechangelog.com/post/382418778/episode-0-1-3-civic-hacking-with-luigi-montanez-and-jere), didn't you?) released his own [Python take](http://github.com/jcarbaugh/python-webfinger). + +Spotted other WebFinger libraries in the wild? [Let us know!](http://twitter.com/changelogshow) Bonus points for one named [Goldfinger](http://www.imdb.com/title/tt0058150/). + +[[Redfinger on GitHub](http://github.com/intridea/redfinger)] [[python-webfinger on GitHub](http://github.com/jcarbaugh/python-webfinger)] diff --git a/content/pages/articles/webroar-ruby-rack-rails-application-server.mdown b/content/pages/articles/webroar-ruby-rack-rails-application-server.mdown new file mode 100644 index 0000000..45b1fde --- /dev/null +++ b/content/pages/articles/webroar-ruby-rack-rails-application-server.mdown @@ -0,0 +1,23 @@ +repo: webroar/webroar +date: Sat Nov 28 13:43:00 -0600 2009 +categories: github,rack,rails,server + +# WebROaR: Ruby/Rack/Rails Application Server + +[WebROaR](http://webroar.in/) aims to make the deployment of Ruby on Rails applications more easier, and provide an integrated solution to monitor the performance of the application and track its exceptions. This is made possible by a simple and easy to use admin panel of the server. + +It also is the best performing server as per the developers [benchmarks](http://webroar.in/blog/2009/11/25/comparison-of-rails-deployment-stacks-2). Although, they do encourage you to perform your own tests and arrive at the same conclusion. + +Features: + +* Simplified deployment with maximum performance +* Runs Ruby on Rails as well as other Rack compliant applications +* Run multiple applications simultaneously +* Intelligent load balancing +* Dynamically reap stuck Ruby processing instances +* Provides run time performance data for the deployed applications +* Generates notifications in case exceptions occur in any of the deployed applications + +Hat tip: [@igrigorik](http://twitter.com/igrigorik) - [http://twitter.com/igrigorik/status/6143783082](http://twitter.com/igrigorik/status/6143783082) + +[[code at GitHub](http://github.com/webroar/webroar)] [[homepage](http://webroar.in/)] [[documentation](http://github.com/webroar/webroar#readme)] diff --git a/content/pages/articles/welcome-to-the-changelog.mdown b/content/pages/articles/welcome-to-the-changelog.mdown new file mode 100644 index 0000000..7d2066d --- /dev/null +++ b/content/pages/articles/welcome-to-the-changelog.mdown @@ -0,0 +1,15 @@ +date: Thu Nov 05 18:03:00 -0600 2009 +categories: + +# Welcome to The Changelog + +If you're like us, following your private Github feed is a bit like drinking from the Twitter firehose. So how do you keep up? There is a constant flow of new and newly rev'd Open Source projects, and knowing what's what is a task in and of its self. + +Here's what you need to do. Subscribe to this little tumble log and we'll help you keep up! + +### Blog + +[[Subscribe w/ RSS (blog)](http://feeds.feedburner.com/thechangelog)] + +### Audio +[[Subscribe on iTunes](http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=341623264)] [[Subscribe w/ RSS (audio)](http://feeds.feedburner.com/changelogshow)] diff --git a/content/pages/articles/wordpress-2-9-released.mdown b/content/pages/articles/wordpress-2-9-released.mdown new file mode 100644 index 0000000..c84c12f --- /dev/null +++ b/content/pages/articles/wordpress-2-9-released.mdown @@ -0,0 +1,17 @@ +repo: http://wordpress.org/development/2009/12/wordpress-2-9/ +date: Fri Dec 18 19:21:45 -0600 2009 +categories: wordpress,releases,php + +# WordPress 2.9 released + +WordPress 2.9 'Carmen' is out. Release highlights include: + +> 1. Global undo/”trash” feature, which means that if you accidentally delete a post or comment you can bring it back from the grave (i.e., the Trash). This also eliminates those annoying “are you sure” messages we used to have on every delete. + +> 2. Built-in image editor allows you to crop, edit, rotate, flip, and scale your images to show them who’s boss. This is the first wave of our many planned media-handling improvements. + +> 3. Batch plugin update and compatibility checking, which means you can update 10 plugins at once, versus having to do multiple clicks for each one, and we’re using the new compatibility data from the plugins directory to give you a better idea of whether your plugins are compatible with new releases of WordPress. This should take the fear and hassle out of upgrading. + +> 4. Easier video embeds that allow you to just paste a URL on its own line and have it magically turn it into the proper embed code, with Oembed support for YouTube, Daily Motion, Blip.tv, Flickr, Hulu, Viddler, Qik, Revision3, Scribd, Google Video, Photobucket, PollDaddy, and WordPress.tv (and more in the next release). + +[[Download](http://wordpress.org/download/)] [[Announcement](http://wordpress.org/development/2009/12/wordpress-2-9/)] diff --git a/content/pages/episodes/episode-0-0-1-haml-sass-and-compass.mdown b/content/pages/episodes/episode-0-0-1-haml-sass-and-compass.mdown new file mode 100644 index 0000000..99c04ae --- /dev/null +++ b/content/pages/episodes/episode-0-0-1-haml-sass-and-compass.mdown @@ -0,0 +1,6 @@ +date: Sun Nov 22 00:00:00 -0600 2009 +categories: audio + +# Episode 0.0.1 - Haml Sass and Compass (59:42) + + diff --git a/content/pages/episodes/episode-0-0-2-first-weekly-show-21-29.mdown b/content/pages/episodes/episode-0-0-2-first-weekly-show-21-29.mdown new file mode 100644 index 0000000..99143b9 --- /dev/null +++ b/content/pages/episodes/episode-0-0-2-first-weekly-show-21-29.mdown @@ -0,0 +1,11 @@ +date: Thu Nov 26 04:35:00 -0600 2009 +categories: asset packaging,audio,browser,compass,google go,javascript,sass,fancy buttons + +# Episode 0.0.2 - First weekly show! (21:29) + +In this episode we discuss: [JAMMIT - Rails plugin for asset packaging](http://thechangelog.com/post/255052673/jammit-rails-plugin-for-asset-packaging), [Underscore.js the bowtie for jQuery's tux](http://thechangelog.com/post/255049350/underscore-js-a-bowtie-for-jquerys-tux), [Google Go](http://thechangelog.com/post/255055542/google-go), [Firefox 3.6 beta 2](http://thechangelog.com/post/255058455/firefox-3-6-beta-2), [Google Chrome OS](http://thechangelog.com/post/255853114/google-chrome-os-chromium-os) and [creating "fancy buttons" with Compass and Sass](http://thechangelog.com/post/254778611/fancy-buttons-with-compass-and-sass). + + + + +[[download](http://changelogshow.com/105/1859-episode-0-0-2-first-weekly-show.mp3)] [[listen in itunes](http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=341623264)] [[write a review in itunes](https://userpub.itunes.apple.com/WebObjects/MZUserPublishing.woa/wa/addUserReview?id=341623264&type=Podcast)] diff --git a/content/pages/episodes/episode-0-0-3-googles-go-programming-language.mdown b/content/pages/episodes/episode-0-0-3-googles-go-programming-language.mdown new file mode 100644 index 0000000..2a23e2c --- /dev/null +++ b/content/pages/episodes/episode-0-0-3-googles-go-programming-language.mdown @@ -0,0 +1,10 @@ +date: Fri Nov 27 05:41:00 -0600 2009 +categories: audio,go,programing language,google,go code + +# Episode 0.0.3 - Google's Go Programming Language (21:40) + +Wynn and I caught up with [Rob Pike](http://research.google.com/people/r/), Principal Engineer at [Google](http://www.google.com/) and Tech Lead for the [Google Go](http://go-lang.org/) team. The primary topic was, of course, Google's new Open Source programing language, [Go](http://go-lang.org/). + + + +[[download](http://changelogshow.com/105/1861-episode-0-0-3-google-s-go-programming-language.mp3)] [[listen in itunes](http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=341623264)] [[write a review in itunes](https://userpub.itunes.apple.com/WebObjects/MZUserPublishing.woa/wa/addUserReview?id=341623264&type=Podcast)] diff --git a/content/pages/episodes/episode-0-0-5-document-cloud.mdown b/content/pages/episodes/episode-0-0-5-document-cloud.mdown new file mode 100644 index 0000000..f17e0ad --- /dev/null +++ b/content/pages/episodes/episode-0-0-5-document-cloud.mdown @@ -0,0 +1,8 @@ +date: Sun Dec 06 20:14:41 -0600 2009 +categories: rails,,audio,javascript,ruby,cloud + +# Episode 0.0.5 - Document Cloud + +We interviewed [Jeremy Ashkenas](http://github.com/jashkenas) Lead Developer at [DocumentCloud](http://documentcloud.org) about their effort to revolutionize the way media organizations gather news. Jeremy discusses their open source projects [CloudCrowd](http://github.com/documentcloud/cloud-crowd), [Underscore.js](http://github.com/documentcloud/underscore), and [JAMMIT](http://github.com/documentcloud/jammit) that they've released along the way. + + diff --git a/content/pages/episodes/episode-0-0-6-steven-bristol-from-lesseverything-and-wee.mdown b/content/pages/episodes/episode-0-0-6-steven-bristol-from-lesseverything-and-wee.mdown new file mode 100644 index 0000000..308923f --- /dev/null +++ b/content/pages/episodes/episode-0-0-6-steven-bristol-from-lesseverything-and-wee.mdown @@ -0,0 +1,8 @@ +date: Tue Dec 15 10:24:00 -0600 2009 +categories: erlang,guest-hosts,javascript,less,rails,ruby,twitter,audio + +# Episode 0.0.6 - Steven Bristol from LessEverything and weekly news + +In this episode, [Adam](http://twitter.com/adamstac), [Wynn](http://twitter.com/pengwynn), and [Steven Bristol](http://twitter.com/stevenbristol) of [LessEverything](http://lesseverything.com) fame discuss [Erlang](http://thechangelog.com/post/270600791/otp-kickoff-kick-off-a-new-erlang-otp-project), [Javascript on the server](http://thechangelog.com/post/265338825/picard-a-micro-framekwork-for-node-js), [Lighthouse](http://thechangelog.com/post/272944314/fresnel-a-console-app-to-manage-lighthouse), [Docsplit](http://thechangelog.com/post/273398559/docsplit-break-apart-documents-into-images-text), [Rackamole](http://thechangelog.com/post/273051493/rackamole-track-user-interactions-with-your-web-site)/[whackamole](http://thechangelog.com/post/273052279/wackamole-reporting-on-the-gathered-rackamole-data), unfollowing under-performing Twitter peeps, and suing domain squatters. + + diff --git a/content/pages/episodes/episode-0-0-7-mike-dirolf-from-10gen-and-mongodb.mdown b/content/pages/episodes/episode-0-0-7-mike-dirolf-from-10gen-and-mongodb.mdown new file mode 100644 index 0000000..6a39b5f --- /dev/null +++ b/content/pages/episodes/episode-0-0-7-mike-dirolf-from-10gen-and-mongodb.mdown @@ -0,0 +1,22 @@ +date: Thu Dec 17 09:38:40 -0600 2009 +categories: audio,mongodb,ruby,python,nosql + +# Episode 0.0.7 - Mike Dirolf from 10gen and MongoDB + + + +Adam and Wynn spoke with [Mike Dirolf](http://twitter.com/mdirolf) from [10gen](http://10gen.com) about their fast-growing [MongoDB](http://mongodb.org) project. Mike gave us insight on how MongoDB came about, design decisions, and the future of this cool NoSQL server. + +Items mentioned in the show + +* Google's [V8 project](http://code.google.com/p/v8/) +* Mongo's new [Map/Reduce features](http://www.mongodb.org/display/DOCS/MapReduce) +* Mongo's [BSON storage format](http://www.mongodb.org/display/DOCS/BSON) +* [MongoMapper](http://github.com/jnunemaker/mongomapper) Ruby ORM from [John Nunemaker](http://twitter.com/jnunemaker) +* [MongoKit](http://bytebucket.org/namlook/mongokit/wiki/html/introduction.html) Python ORM from [@namlook](http://twitter.com/namlook) +* [Ming](http://merciless.sourceforge.net/tour.html) from SourceForge +* [MongoHQ](http://mongohq.com) - MongoDB hosting + +Got NoSQL chops? 10gen is hiring. Email jobs [at] 10gen [dot] com. Be sure to bring your community contributions! + +[[MongoDB on GitHub](http://github.com/mongodb)] [[Follow @MongoDB](http://twitter.com/mongodb)] diff --git a/content/pages/episodes/episode-0-0-8-marshall-culpepper-from-appcelerator-titan.mdown b/content/pages/episodes/episode-0-0-8-marshall-culpepper-from-appcelerator-titan.mdown new file mode 100644 index 0000000..c563078 --- /dev/null +++ b/content/pages/episodes/episode-0-0-8-marshall-culpepper-from-appcelerator-titan.mdown @@ -0,0 +1,17 @@ +date: Thu Jan 14 10:24:26 -0600 2010 +categories: javascript,apps,mobile,desktop,titanium,appcelerator,facebook,python,ruby,html5,audio + +# Episode 0.0.8 - Marshall Culpepper from Appcelerator Titanium + + + +Adam and Wynn spoke with [Marshall Culpepper](http://twitter.com/marshall_law) from [Appcelerator](http://www.appcelerator.com/) about their open source projects [Titanium Desktop](http://www.appcelerator.com/products/titanium-desktop/) and [Titanium Mobile](http://www.appcelerator.com/products/titanium-mobile/). + +Items mentioned in the show + +* [RaphaelJS](http://raphaeljs.com/) +* [WebGL](http://en.wikipedia.org/wiki/WebGL) +* [CodeStrong Titanium developer docs](http://www.codestrong.com/) +* [Fix Me](http://github.com/seaofclouds/fix-me) + +[[Titanium Desktop on GitHub](http://github.com/appcelerator/titanium_desktop)] [[Titanium Mobile on GitHub](http://github.com/appcelerator/titanium_mobile)] diff --git a/content/pages/episodes/episode-0-0-9-fix-me-configliere-and-more-node-js.mdown b/content/pages/episodes/episode-0-0-9-fix-me-configliere-and-more-node-js.mdown new file mode 100644 index 0000000..ab87b56 --- /dev/null +++ b/content/pages/episodes/episode-0-0-9-fix-me-configliere-and-more-node-js.mdown @@ -0,0 +1,18 @@ +date: Tue Jan 19 21:19:00 -0600 2010 +categories: audio,news,javascript,node-js,ruby,jquery,css + +# Episode 0.0.9: Fix-me, Configliere, and more Node.js + + + +Adam and Wynn ran down some news highlights with [Marshall Culpepper](http://twitter.com/marshall_law) from [Appcelerator](http://appcelerator.com). + + +Items discussed + +* [Fix me repo](http://thechangelog.com/post/279641017/fix-me-100-open-source-bounty-from-seaofclouds) +* [Persistence](http://thechangelog.com/post/288384650/persistence-high-level-persistance-database-system-for-n) +* [jQuery.behavior](http://thechangelog.com/post/293549644/jquery-behavior-simple-javascript-library-for-complex-we) +* [Configliere](http://thechangelog.com/post/322569039/configliere-lightweight-configuration-management-for-rub) + + diff --git a/content/pages/episodes/episode-0-1-0-chris-wanstrath-from-github.mdown b/content/pages/episodes/episode-0-1-0-chris-wanstrath-from-github.mdown new file mode 100644 index 0000000..5d3d128 --- /dev/null +++ b/content/pages/episodes/episode-0-1-0-chris-wanstrath-from-github.mdown @@ -0,0 +1,10 @@ +date: Mon Jan 25 12:11:26 -0600 2010 +categories: audio,git,interviews + +# Episode 0.1.0 - Chris Wanstrath from GitHub + + + +**New point release!** Adam and Wynn talk with Chris Wanstrath aka [@defunkt](http://github.com/defunkt) from GitHub about the magic of [Git](http://git-scm.com/), the past, present and future of [GitHub](http://github.com), building a bootstrapped startup and some other cool stuff you’ll just have to hear for yourself. + +Stick around until the end when we announce a new feature of The Changelog that will help you keep up with the fast-moving world of open source. diff --git a/content/pages/episodes/episode-0-1-1-john-nunemaker-from-mongomapper.mdown b/content/pages/episodes/episode-0-1-1-john-nunemaker-from-mongomapper.mdown new file mode 100644 index 0000000..c2ad073 --- /dev/null +++ b/content/pages/episodes/episode-0-1-1-john-nunemaker-from-mongomapper.mdown @@ -0,0 +1,22 @@ +date: Fri Jan 29 14:19:00 -0600 2010 +categories: mongodb,mongomapper,rails,ruby,audio,episodes + +# Episode 0.1.1 - John Nunemaker from Ordered List, RailsTips.org, and MongoMapper + + + +Adam and Wynn caught up with [John Nunemaker](http://github.com/jnunemaker) from [Ordered List](http://orderedlist.com) to chat about open source, improving your craft, building a business, and how MongoDB has changed his life. + +Items mentioned in the show: + +- John's Ruby projects The [Twitter gem](http://github.com/jnunemaker/twitter), [HTTParty](http://github.com/jnunemaker/httparty), [Crack](http://github.com/jnunemaker/crack), [MongoMapper](http://github.com/jnunemaker/mongomapper) +- [MongoHQ](http://mongohq.com), shared MongoDB hosting +- The GitHub [Fork Queue](http://github.com/blog/270-the-fork-queue) +- [Harmony](http://harmonyapp.com), the new CMS from [Ordered List](http://orderedlist.com) +- [Moonshine](http://github.com/railsmachine/moonshine) +- [Puppet](http://github.com/reductivelabs/puppet) +- [Navvy](http://thechangelog.com/post/356754061/navvy-simple-database-agnostic-ruby-background-job-proce) +- [Liquid Markup](http://liquidmarkup.org) from [Tobias Lütke](http://github.com/tobi) of [Shopify](http://www.shopify.com/) +- [Redis](http://code.google.com/p/redis/) +- [Resque](http://github.com/defunkt/resque) + diff --git a/content/pages/episodes/episode-0-1-2-gordon-is-such-a-showoff.mdown b/content/pages/episodes/episode-0-1-2-gordon-is-such-a-showoff.mdown new file mode 100644 index 0000000..abf35cd --- /dev/null +++ b/content/pages/episodes/episode-0-1-2-gordon-is-such-a-showoff.mdown @@ -0,0 +1,25 @@ +date: Wed Feb 03 15:35:00 -0600 2010 +categories: flash,javascript,mongodb,audio,news,ruby,testing,apple,foursquare,javascript + +# Episode 0.1.2 - Gordon is such a Showoff + + + +Adam and Wynn continued chatting with [John Nunemaker](http://twitter.com/jnunemaker) about some recent featured projects including Gordon, Showoff, jQuery Lint, JSpec, congomongo and more. + +Items discussed in the show: + +* [Friendly](http://thechangelog.com/post/296389293/friendly-nosql-with-mysql-in-ruby) NoSQL in MySQL +* [configliere](http://thechangelog.com/post/322569039/configliere-lightweight-configuration-management-for-rub) - Simple Ruby configuration +* [twitter-node](http://thechangelog.com/post/338328513/twitter-node-node-js-based-tweetstreaming) - Node.js tweetstreaming +* [Gordon](http://thechangelog.com/post/332910213/gordon-an-open-source-flash-runtime-written-in-pure-java) - Pure JavaScript Flash replacement +* [jQuery Lint](http://thechangelog.com/post/344388231/jquery-lint-find-and-errors-and-improve-your-jquery-usag) - jQuery validator +* [Showoff](http://thechangelog.com/post/344399156/showoff-the-best-darn-presentation-software-a-developer) - Keynote killer? +* [congomongo](http://thechangelog.com/post/344418038/congomongo-use-mongodb-from-clojure) clojure <3 MongoDB +* [Computer science in Javascript](http://thechangelog.com/post/345980582/javascript-as-a-teaching-tool) - JS as a teaching aide +* [phpMoAdmin](http://thechangelog.com/post/347642340/phpmoadmin-mongodb-admin-tool-for-php) Mo' admin for the money +* Momma's got a [FuseBox](http://thechangelog.com/post/347681293/fusebox-a-safer-way-to-monkey-patch-javascript) - and Daddy doesn't sleep at night +* [AppSalesGraph](http://thechangelog.com/post/348381295/appsalesgraph-graph-your-app-store-sales-data) - measure your App store sales +* [things-rb](http://thechangelog.com/post/348940141/things-rb-ruby-lib-cli-for-things-mac) call Things.app from Ruby +* [JSpec](http://thechangelog.com/post/350914743/jspec-robust-bdd-for-both-client-and-server-javascript) Get your Bee Dee Dee on in JavaScript +* [FoursquareX](http://thechangelog.com/post/351308544/foursquarex-foursquare-client-for-osx) Foursquare client for OS X diff --git a/content/pages/episodes/episode-0-1-3-civic-hacking-with-luigi-montanez-and-jere.mdown b/content/pages/episodes/episode-0-1-3-civic-hacking-with-luigi-montanez-and-jere.mdown new file mode 100644 index 0000000..39f472e --- /dev/null +++ b/content/pages/episodes/episode-0-1-3-civic-hacking-with-luigi-montanez-and-jere.mdown @@ -0,0 +1,30 @@ +date: Wed Feb 10 15:26:00 -0600 2010 +categories: api,gov20,government,hacking,meetups,python,ruby,audio + +# Episode 0.1.3 - Civic hacking with Luigi Montanez and Jeremy Carbaugh from Sunlight Labs + + + +Adam and Wynn caught up with [Luigi Montanez](http://twitter.com/luigimontanez) and [Jeremy Carbaugh](http://twitter.com/jcarbaugh) from [Sunlight Labs](http://sunlightlabs.com) and discussed their [Python and Ruby projects](http://github.com/sunlightlabs), government transparency, and civic hacking - open source contributions as activism. + +Items mentioned in the show: + +* [Real Time Congress](http://realtimecongress.org) - iPhone app for keeping tabs on Congress, built with [Appcelerator Titanium](http://thechangelog.com/post/334287138/episode-0-0-8-marshall-culpepper-from-appcelerator-titan) +* [Anthill](http://github.com/sunlightlabs/anthill) - Django-powered community website project that runs [SunlightLabs.com](http://sunlightlabs.com) +* [MediaSync](http://github.com/sunlightlabs/django-mediasync) - Django Toolkit to simplify the static media development and deployment. +* [Sunlight Labs API](http://services.sunlightlabs.com/api/) - Congressional data served up for your next mashup. +* [Underscore.js](http://thechangelog.com/post/255049350/underscore-js-a-bowtie-for-jquerys-tux) - The tie for jQuery's tux +* [Open Government Initiative](http://www.whitehouse.gov/open) - Every .gov web site now has to outline their transparency efforts +* [Apps for America](http://sunlightlabs.com/contests/appsforamerica/) - Build a mashup, win some $$$ +* [Great American Hackathon](http://sunlightlabs.com/hackathon09/) - Meetup and hack to improve your government +* [Open Government book from OReilly](http://oreilly.com/catalog/9780596804367) - Collaboration, Transparency, and Participation in Practice +* [Tweet Congress](http://tweetcongress.org) - SXSW Web Award-winning congressional Twitter directory built on Sunlight Labs API +* [Capitol Words](http://capitolwords.org/) - Amazing site and [API](http://capitolwords.org/api/) analysis of what's said on the floor of Congress +* [Open Congress](http://opencongress.org) - Browse, read, discuss, and vote on legislation before Congress. +* [Code for America](http://codeforamerica.org/) - Connecting city governments and Web 2.0 talent. +* [Some new gadget from Apple](http://www.apple.com/ipad/) +* [Chromium OS](http://www.chromium.org/chromium-os) - Google's new OS discussed on [Episode 0.0.4](http://thechangelog.com/post/265143734/episode-0-0-4-chrome-os-thor-and-roar) +* [SauceBrush](http://bitbucket.org/sunlightlabs/saucebrush/) - an attempt to build a python ETL library that doesn't suck +* [Homebrew](http://github.com/mxcl/homebrew) - Package management for Mac as discussed on [Episode 0.1.2](http://thechangelog.com/post/369304801/episode-0-1-2-gordon-is-such-a-showoff) +* [Transparency Camp](http://transparencycamp.org/) - THE unconference for government representatives, technologists, journalists, developers, NGOs, wonks and activists +* [Los Angeles Ruby Conf](http://www.larubyconf.com/) - See Luigi and others speak Ruby in beautiful downtown Burbank diff --git a/content/pages/episodes/episode-0-1-4-andy-gross-and-sean-cribbs-on-riak.mdown b/content/pages/episodes/episode-0-1-4-andy-gross-and-sean-cribbs-on-riak.mdown new file mode 100644 index 0000000..ae8ddb0 --- /dev/null +++ b/content/pages/episodes/episode-0-1-4-andy-gross-and-sean-cribbs-on-riak.mdown @@ -0,0 +1,14 @@ +date: Thu Feb 18 17:35:23 -0600 2010 +categories: audio,nosql,ruby,riak,json,erlang,rest,scaling + +# Episode 0.1.4 - Andy Gross and Sean Cribbs on Riak + + + +Adam and Wynn caught up with [Andy Gross](http://twitter.com/argv0) from [Basho](http://basho.com) and [Sean Cribbs](http://seancribbs.com), a freelance Ruby developer, to discuss [Riak](http://riak.basho.com), the new Erlang-based NoSQL store and [Ripple](http://seancribbs.github.com/ripple/), Sean's new Ruby wrapper for Riak. + +Items mentioned in the show: + +* [Ripple](http://thechangelog.com/post/383049531/ripple-ruby-client-for-riak) New Ruby wrapper for Riak +* [Link walking in Riak](http://seancribbs.com/tech/2010/02/06/why-riak-should-power-your-next-rails-app) +* [RadiantCMS](http://radiantcms.org) Ruby-powered Content Management System diff --git a/content/pages/episodes/episode-0-1-5-leah-culver-on-oauth-hurl-it-baconfile-and.mdown b/content/pages/episodes/episode-0-1-5-leah-culver-on-oauth-hurl-it-baconfile-and.mdown new file mode 100644 index 0000000..ac27b55 --- /dev/null +++ b/content/pages/episodes/episode-0-1-5-leah-culver-on-oauth-hurl-it-baconfile-and.mdown @@ -0,0 +1,24 @@ +date: Sat Feb 27 08:49:00 -0600 2010 +categories: audio,django,ruby,rails,API + +# Episode 0.1.5 - Leah Culver on OAuth, Hurl.it, Baconfile, and more + + + +Adam and Wynn caught up with [Leah Culver](http://blog.leahculver.com/) and talked about startups, APIs, and her open source work on [OAuth](http://oauth.net/), [oEmbed](http://www.oembed.com/), [Hurl.it](http://hurl.it), [Baconfile](http://baconfile.com), and more. + +* [OAuth](http://oauth.net/) An open protocol to allow secure API authorization in a simple and standard method from desktop and web applications. +* [oEmbed](http://www.oembed.com/) oEmbed is a format for allowing an embedded representation of a URL on third party sites. +* [90210](http://www.imdb.com/title/tt0098749/) One of Adam's favorite TV shows from the 90s +* [Beverly Hillbillies](http://www.imdb.com/title/tt0055662/) For the previous generation +* [Boxee](http://boxee.tv) Open Source media on your TV or PC/Mac +* [Hurl.it](http://hurl.it) Test APIs from your browser +* [Charles Proxy](http://www.charlesproxy.com/) Monitor or proxy HTTP and SSL / HTTPS traffic between your machine and the Internet. +* [Gowalla's API explorer](http://gowalla.com/api/explorer) Neat way to test your Gowalla API calls +* [Baconfile](http://baconfile.com/) Share files simply on your own S3 account +* [Chunky Baconfile](http://github.com/pengwynn/chunky-baconfile) Wynn's wrapper for Baconfile, a naming tribute to [_why](http://en.wikipedia.org/wiki/Why's_(poignant)_Guide_to_Ruby) +* [Motion](http://github.com/sixapart/typepad-motion) Community microblogging on the TypePad API written in Django. +* [TypeKit](http://typekit.com/) Legally embed fonts from the largest foundries +* [Node.js](http://nodejs.org) The streak continues! +* [How to Node](http://howtonode.org) Learn Node.js open blog from [Tim Caswell](http://twitter.com/creationix) and [Micheil Smith](http://twitter.com/miksago). And it's pronounced _Michael_, sorry, mate. + diff --git a/content/pages/tagged/add-ons.mdown b/content/pages/tagged/add-ons.mdown new file mode 100644 index 0000000..3d8a3b4 --- /dev/null +++ b/content/pages/tagged/add-ons.mdown @@ -0,0 +1,5 @@ + + +# Add-ons + +Posts tagged with Add-ons diff --git a/content/pages/tagged/admin.mdown b/content/pages/tagged/admin.mdown new file mode 100644 index 0000000..8578aca --- /dev/null +++ b/content/pages/tagged/admin.mdown @@ -0,0 +1,5 @@ + + +# Admin + +Posts tagged with Admin diff --git a/content/pages/tagged/android.mdown b/content/pages/tagged/android.mdown new file mode 100644 index 0000000..fd541fb --- /dev/null +++ b/content/pages/tagged/android.mdown @@ -0,0 +1,5 @@ + + +# Android + +Posts tagged with Android diff --git a/content/pages/tagged/animation.mdown b/content/pages/tagged/animation.mdown new file mode 100644 index 0000000..bc61b21 --- /dev/null +++ b/content/pages/tagged/animation.mdown @@ -0,0 +1,5 @@ + + +# Animation + +Posts tagged with Animation diff --git a/content/pages/tagged/apache.mdown b/content/pages/tagged/apache.mdown new file mode 100644 index 0000000..c24840f --- /dev/null +++ b/content/pages/tagged/apache.mdown @@ -0,0 +1,5 @@ + + +# Apache + +Posts tagged with Apache diff --git a/content/pages/tagged/api.mdown b/content/pages/tagged/api.mdown new file mode 100644 index 0000000..d29b890 --- /dev/null +++ b/content/pages/tagged/api.mdown @@ -0,0 +1,5 @@ + + +# Api + +Posts tagged with Api diff --git a/content/pages/tagged/app-store.mdown b/content/pages/tagged/app-store.mdown new file mode 100644 index 0000000..0718ebd --- /dev/null +++ b/content/pages/tagged/app-store.mdown @@ -0,0 +1,5 @@ + + +# App-store + +Posts tagged with App-store diff --git a/content/pages/tagged/appcelerator.mdown b/content/pages/tagged/appcelerator.mdown new file mode 100644 index 0000000..2c508ff --- /dev/null +++ b/content/pages/tagged/appcelerator.mdown @@ -0,0 +1,5 @@ + + +# Appcelerator + +Posts tagged with Appcelerator diff --git a/content/pages/tagged/apple.mdown b/content/pages/tagged/apple.mdown new file mode 100644 index 0000000..a90c8f8 --- /dev/null +++ b/content/pages/tagged/apple.mdown @@ -0,0 +1,5 @@ + + +# Apple + +Posts tagged with Apple diff --git a/content/pages/tagged/apps.mdown b/content/pages/tagged/apps.mdown new file mode 100644 index 0000000..c1e588e --- /dev/null +++ b/content/pages/tagged/apps.mdown @@ -0,0 +1,5 @@ + + +# Apps + +Posts tagged with Apps diff --git a/content/pages/tagged/asset-packaging.mdown b/content/pages/tagged/asset-packaging.mdown new file mode 100644 index 0000000..0497c98 --- /dev/null +++ b/content/pages/tagged/asset-packaging.mdown @@ -0,0 +1,5 @@ + + +# Asset-packaging + +Posts tagged with Asset-packaging diff --git a/content/pages/tagged/assets.mdown b/content/pages/tagged/assets.mdown new file mode 100644 index 0000000..78b550d --- /dev/null +++ b/content/pages/tagged/assets.mdown @@ -0,0 +1,5 @@ + + +# Assets + +Posts tagged with Assets diff --git a/content/pages/tagged/async.mdown b/content/pages/tagged/async.mdown new file mode 100644 index 0000000..3a1af9d --- /dev/null +++ b/content/pages/tagged/async.mdown @@ -0,0 +1,5 @@ + + +# Async + +Posts tagged with Async diff --git a/content/pages/tagged/audio.mdown b/content/pages/tagged/audio.mdown new file mode 100644 index 0000000..4960ed0 --- /dev/null +++ b/content/pages/tagged/audio.mdown @@ -0,0 +1,5 @@ + + +# Audio + +Posts tagged with Audio diff --git a/content/pages/tagged/automation.mdown b/content/pages/tagged/automation.mdown new file mode 100644 index 0000000..a4895e0 --- /dev/null +++ b/content/pages/tagged/automation.mdown @@ -0,0 +1,5 @@ + + +# Automation + +Posts tagged with Automation diff --git a/content/pages/tagged/backgroundjobs.mdown b/content/pages/tagged/backgroundjobs.mdown new file mode 100644 index 0000000..9ff56fc --- /dev/null +++ b/content/pages/tagged/backgroundjobs.mdown @@ -0,0 +1,5 @@ + + +# Backgroundjobs + +Posts tagged with Backgroundjobs diff --git a/content/pages/tagged/basho.mdown b/content/pages/tagged/basho.mdown new file mode 100644 index 0000000..eeeae1c --- /dev/null +++ b/content/pages/tagged/basho.mdown @@ -0,0 +1,5 @@ + + +# Basho + +Posts tagged with Basho diff --git a/content/pages/tagged/bdd.mdown b/content/pages/tagged/bdd.mdown new file mode 100644 index 0000000..300c3d1 --- /dev/null +++ b/content/pages/tagged/bdd.mdown @@ -0,0 +1,5 @@ + + +# Bdd + +Posts tagged with Bdd diff --git a/content/pages/tagged/beta.mdown b/content/pages/tagged/beta.mdown new file mode 100644 index 0000000..75d9f0c --- /dev/null +++ b/content/pages/tagged/beta.mdown @@ -0,0 +1,5 @@ + + +# Beta + +Posts tagged with Beta diff --git a/content/pages/tagged/blogging.mdown b/content/pages/tagged/blogging.mdown new file mode 100644 index 0000000..2e10cc6 --- /dev/null +++ b/content/pages/tagged/blogging.mdown @@ -0,0 +1,5 @@ + + +# Blogging + +Posts tagged with Blogging diff --git a/content/pages/tagged/bounty.mdown b/content/pages/tagged/bounty.mdown new file mode 100644 index 0000000..6ce0752 --- /dev/null +++ b/content/pages/tagged/bounty.mdown @@ -0,0 +1,5 @@ + + +# Bounty + +Posts tagged with Bounty diff --git a/content/pages/tagged/browser.mdown b/content/pages/tagged/browser.mdown new file mode 100644 index 0000000..de4af23 --- /dev/null +++ b/content/pages/tagged/browser.mdown @@ -0,0 +1,5 @@ + + +# Browser + +Posts tagged with Browser diff --git a/content/pages/tagged/buttons.mdown b/content/pages/tagged/buttons.mdown new file mode 100644 index 0000000..42838a9 --- /dev/null +++ b/content/pages/tagged/buttons.mdown @@ -0,0 +1,5 @@ + + +# Buttons + +Posts tagged with Buttons diff --git a/content/pages/tagged/c.mdown b/content/pages/tagged/c.mdown new file mode 100644 index 0000000..dc84550 --- /dev/null +++ b/content/pages/tagged/c.mdown @@ -0,0 +1,5 @@ + + +# C + +Posts tagged with C diff --git a/content/pages/tagged/cakephp.mdown b/content/pages/tagged/cakephp.mdown new file mode 100644 index 0000000..6a27ad7 --- /dev/null +++ b/content/pages/tagged/cakephp.mdown @@ -0,0 +1,5 @@ + + +# Cakephp + +Posts tagged with Cakephp diff --git a/content/pages/tagged/capistrano.mdown b/content/pages/tagged/capistrano.mdown new file mode 100644 index 0000000..d836195 --- /dev/null +++ b/content/pages/tagged/capistrano.mdown @@ -0,0 +1,5 @@ + + +# Capistrano + +Posts tagged with Capistrano diff --git a/content/pages/tagged/civichacking.mdown b/content/pages/tagged/civichacking.mdown new file mode 100644 index 0000000..c77a332 --- /dev/null +++ b/content/pages/tagged/civichacking.mdown @@ -0,0 +1,5 @@ + + +# Civichacking + +Posts tagged with Civichacking diff --git a/content/pages/tagged/cli.mdown b/content/pages/tagged/cli.mdown new file mode 100644 index 0000000..a9c932b --- /dev/null +++ b/content/pages/tagged/cli.mdown @@ -0,0 +1,5 @@ + + +# Cli + +Posts tagged with Cli diff --git a/content/pages/tagged/clojars.mdown b/content/pages/tagged/clojars.mdown new file mode 100644 index 0000000..55034c1 --- /dev/null +++ b/content/pages/tagged/clojars.mdown @@ -0,0 +1,5 @@ + + +# Clojars + +Posts tagged with Clojars diff --git a/content/pages/tagged/clojure.mdown b/content/pages/tagged/clojure.mdown new file mode 100644 index 0000000..fbc55a3 --- /dev/null +++ b/content/pages/tagged/clojure.mdown @@ -0,0 +1,5 @@ + + +# Clojure + +Posts tagged with Clojure diff --git a/content/pages/tagged/cloud.mdown b/content/pages/tagged/cloud.mdown new file mode 100644 index 0000000..fd66799 --- /dev/null +++ b/content/pages/tagged/cloud.mdown @@ -0,0 +1,5 @@ + + +# Cloud + +Posts tagged with Cloud diff --git a/content/pages/tagged/cocoa.mdown b/content/pages/tagged/cocoa.mdown new file mode 100644 index 0000000..78dfb81 --- /dev/null +++ b/content/pages/tagged/cocoa.mdown @@ -0,0 +1,5 @@ + + +# Cocoa + +Posts tagged with Cocoa diff --git a/content/pages/tagged/command-line.mdown b/content/pages/tagged/command-line.mdown new file mode 100644 index 0000000..e0b6304 --- /dev/null +++ b/content/pages/tagged/command-line.mdown @@ -0,0 +1,5 @@ + + +# Command-line + +Posts tagged with Command-line diff --git a/content/pages/tagged/compass.mdown b/content/pages/tagged/compass.mdown new file mode 100644 index 0000000..7fc3142 --- /dev/null +++ b/content/pages/tagged/compass.mdown @@ -0,0 +1,5 @@ + + +# Compass + +Posts tagged with Compass diff --git a/content/pages/tagged/compatibility.mdown b/content/pages/tagged/compatibility.mdown new file mode 100644 index 0000000..fcf3fa0 --- /dev/null +++ b/content/pages/tagged/compatibility.mdown @@ -0,0 +1,5 @@ + + +# Compatibility + +Posts tagged with Compatibility diff --git a/content/pages/tagged/computer-science.mdown b/content/pages/tagged/computer-science.mdown new file mode 100644 index 0000000..ef6b5c7 --- /dev/null +++ b/content/pages/tagged/computer-science.mdown @@ -0,0 +1,5 @@ + + +# Computer-science + +Posts tagged with Computer-science diff --git a/content/pages/tagged/configuration.mdown b/content/pages/tagged/configuration.mdown new file mode 100644 index 0000000..03a0105 --- /dev/null +++ b/content/pages/tagged/configuration.mdown @@ -0,0 +1,5 @@ + + +# Configuration + +Posts tagged with Configuration diff --git a/content/pages/tagged/couchdb.mdown b/content/pages/tagged/couchdb.mdown new file mode 100644 index 0000000..7c53e0c --- /dev/null +++ b/content/pages/tagged/couchdb.mdown @@ -0,0 +1,5 @@ + + +# Couchdb + +Posts tagged with Couchdb diff --git a/content/pages/tagged/csharp.mdown b/content/pages/tagged/csharp.mdown new file mode 100644 index 0000000..a7abe66 --- /dev/null +++ b/content/pages/tagged/csharp.mdown @@ -0,0 +1,5 @@ + + +# Csharp + +Posts tagged with Csharp diff --git a/content/pages/tagged/css.mdown b/content/pages/tagged/css.mdown new file mode 100644 index 0000000..41d1f8a --- /dev/null +++ b/content/pages/tagged/css.mdown @@ -0,0 +1,5 @@ + + +# Css + +Posts tagged with Css diff --git a/content/pages/tagged/css3.mdown b/content/pages/tagged/css3.mdown new file mode 100644 index 0000000..ee47e1e --- /dev/null +++ b/content/pages/tagged/css3.mdown @@ -0,0 +1,5 @@ + + +# Css3 + +Posts tagged with Css3 diff --git a/content/pages/tagged/cucumber.mdown b/content/pages/tagged/cucumber.mdown new file mode 100644 index 0000000..7e19455 --- /dev/null +++ b/content/pages/tagged/cucumber.mdown @@ -0,0 +1,5 @@ + + +# Cucumber + +Posts tagged with Cucumber diff --git a/content/pages/tagged/debugging.mdown b/content/pages/tagged/debugging.mdown new file mode 100644 index 0000000..f855bf3 --- /dev/null +++ b/content/pages/tagged/debugging.mdown @@ -0,0 +1,5 @@ + + +# Debugging + +Posts tagged with Debugging diff --git a/content/pages/tagged/deployment.mdown b/content/pages/tagged/deployment.mdown new file mode 100644 index 0000000..cb1aad2 --- /dev/null +++ b/content/pages/tagged/deployment.mdown @@ -0,0 +1,5 @@ + + +# Deployment + +Posts tagged with Deployment diff --git a/content/pages/tagged/design.mdown b/content/pages/tagged/design.mdown new file mode 100644 index 0000000..91cb81c --- /dev/null +++ b/content/pages/tagged/design.mdown @@ -0,0 +1,5 @@ + + +# Design + +Posts tagged with Design diff --git a/content/pages/tagged/desktop.mdown b/content/pages/tagged/desktop.mdown new file mode 100644 index 0000000..6cfbb4d --- /dev/null +++ b/content/pages/tagged/desktop.mdown @@ -0,0 +1,5 @@ + + +# Desktop + +Posts tagged with Desktop diff --git a/content/pages/tagged/development.mdown b/content/pages/tagged/development.mdown new file mode 100644 index 0000000..9cab5ed --- /dev/null +++ b/content/pages/tagged/development.mdown @@ -0,0 +1,5 @@ + + +# Development + +Posts tagged with Development diff --git a/content/pages/tagged/django.mdown b/content/pages/tagged/django.mdown new file mode 100644 index 0000000..9726ead --- /dev/null +++ b/content/pages/tagged/django.mdown @@ -0,0 +1,5 @@ + + +# Django + +Posts tagged with Django diff --git a/content/pages/tagged/document-oriented.mdown b/content/pages/tagged/document-oriented.mdown new file mode 100644 index 0000000..0680497 --- /dev/null +++ b/content/pages/tagged/document-oriented.mdown @@ -0,0 +1,5 @@ + + +# Document-oriented + +Posts tagged with Document-oriented diff --git a/content/pages/tagged/dojo.mdown b/content/pages/tagged/dojo.mdown new file mode 100644 index 0000000..dbb1ee9 --- /dev/null +++ b/content/pages/tagged/dojo.mdown @@ -0,0 +1,5 @@ + + +# Dojo + +Posts tagged with Dojo diff --git a/content/pages/tagged/dom.mdown b/content/pages/tagged/dom.mdown new file mode 100644 index 0000000..f3a756e --- /dev/null +++ b/content/pages/tagged/dom.mdown @@ -0,0 +1,5 @@ + + +# Dom + +Posts tagged with Dom diff --git a/content/pages/tagged/dotent.mdown b/content/pages/tagged/dotent.mdown new file mode 100644 index 0000000..f6ef6ce --- /dev/null +++ b/content/pages/tagged/dotent.mdown @@ -0,0 +1,5 @@ + + +# Dotent + +Posts tagged with Dotent diff --git a/content/pages/tagged/drupal.mdown b/content/pages/tagged/drupal.mdown new file mode 100644 index 0000000..ae4a9b5 --- /dev/null +++ b/content/pages/tagged/drupal.mdown @@ -0,0 +1,5 @@ + + +# Drupal + +Posts tagged with Drupal diff --git a/content/pages/tagged/dynamic.mdown b/content/pages/tagged/dynamic.mdown new file mode 100644 index 0000000..5b3995e --- /dev/null +++ b/content/pages/tagged/dynamic.mdown @@ -0,0 +1,5 @@ + + +# Dynamic + +Posts tagged with Dynamic diff --git a/content/pages/tagged/episodes.mdown b/content/pages/tagged/episodes.mdown new file mode 100644 index 0000000..c823628 --- /dev/null +++ b/content/pages/tagged/episodes.mdown @@ -0,0 +1,5 @@ + + +# Episodes + +Posts tagged with Episodes diff --git a/content/pages/tagged/erlang.mdown b/content/pages/tagged/erlang.mdown new file mode 100644 index 0000000..03b646c --- /dev/null +++ b/content/pages/tagged/erlang.mdown @@ -0,0 +1,5 @@ + + +# Erlang + +Posts tagged with Erlang diff --git a/content/pages/tagged/facebook.mdown b/content/pages/tagged/facebook.mdown new file mode 100644 index 0000000..8694c15 --- /dev/null +++ b/content/pages/tagged/facebook.mdown @@ -0,0 +1,5 @@ + + +# Facebook + +Posts tagged with Facebook diff --git a/content/pages/tagged/fancy-buttons.mdown b/content/pages/tagged/fancy-buttons.mdown new file mode 100644 index 0000000..8d8f073 --- /dev/null +++ b/content/pages/tagged/fancy-buttons.mdown @@ -0,0 +1,5 @@ + + +# Fancy-buttons + +Posts tagged with Fancy-buttons diff --git a/content/pages/tagged/firebug.mdown b/content/pages/tagged/firebug.mdown new file mode 100644 index 0000000..b7860fa --- /dev/null +++ b/content/pages/tagged/firebug.mdown @@ -0,0 +1,5 @@ + + +# Firebug + +Posts tagged with Firebug diff --git a/content/pages/tagged/firefox.mdown b/content/pages/tagged/firefox.mdown new file mode 100644 index 0000000..ee47fdf --- /dev/null +++ b/content/pages/tagged/firefox.mdown @@ -0,0 +1,5 @@ + + +# Firefox + +Posts tagged with Firefox diff --git a/content/pages/tagged/flash.mdown b/content/pages/tagged/flash.mdown new file mode 100644 index 0000000..2e83689 --- /dev/null +++ b/content/pages/tagged/flash.mdown @@ -0,0 +1,5 @@ + + +# Flash + +Posts tagged with Flash diff --git a/content/pages/tagged/foursquare.mdown b/content/pages/tagged/foursquare.mdown new file mode 100644 index 0000000..c98d618 --- /dev/null +++ b/content/pages/tagged/foursquare.mdown @@ -0,0 +1,5 @@ + + +# Foursquare + +Posts tagged with Foursquare diff --git a/content/pages/tagged/fowa.mdown b/content/pages/tagged/fowa.mdown new file mode 100644 index 0000000..68f6604 --- /dev/null +++ b/content/pages/tagged/fowa.mdown @@ -0,0 +1,5 @@ + + +# Fowa + +Posts tagged with Fowa diff --git a/content/pages/tagged/fowa2010.mdown b/content/pages/tagged/fowa2010.mdown new file mode 100644 index 0000000..c49e05e --- /dev/null +++ b/content/pages/tagged/fowa2010.mdown @@ -0,0 +1,5 @@ + + +# Fowa2010 + +Posts tagged with Fowa2010 diff --git a/content/pages/tagged/framework.mdown b/content/pages/tagged/framework.mdown new file mode 100644 index 0000000..f636101 --- /dev/null +++ b/content/pages/tagged/framework.mdown @@ -0,0 +1,5 @@ + + +# Framework + +Posts tagged with Framework diff --git a/content/pages/tagged/frameworks.mdown b/content/pages/tagged/frameworks.mdown new file mode 100644 index 0000000..5225dd9 --- /dev/null +++ b/content/pages/tagged/frameworks.mdown @@ -0,0 +1,5 @@ + + +# Frameworks + +Posts tagged with Frameworks diff --git a/content/pages/tagged/fusejs.mdown b/content/pages/tagged/fusejs.mdown new file mode 100644 index 0000000..defd538 --- /dev/null +++ b/content/pages/tagged/fusejs.mdown @@ -0,0 +1,5 @@ + + +# Fusejs + +Posts tagged with Fusejs diff --git a/content/pages/tagged/gaming.mdown b/content/pages/tagged/gaming.mdown new file mode 100644 index 0000000..9c6df98 --- /dev/null +++ b/content/pages/tagged/gaming.mdown @@ -0,0 +1,5 @@ + + +# Gaming + +Posts tagged with Gaming diff --git a/content/pages/tagged/gem.mdown b/content/pages/tagged/gem.mdown new file mode 100644 index 0000000..1616b3d --- /dev/null +++ b/content/pages/tagged/gem.mdown @@ -0,0 +1,5 @@ + + +# Gem + +Posts tagged with Gem diff --git a/content/pages/tagged/gems.mdown b/content/pages/tagged/gems.mdown new file mode 100644 index 0000000..18f9d39 --- /dev/null +++ b/content/pages/tagged/gems.mdown @@ -0,0 +1,5 @@ + + +# Gems + +Posts tagged with Gems diff --git a/content/pages/tagged/generator.mdown b/content/pages/tagged/generator.mdown new file mode 100644 index 0000000..b80a4a2 --- /dev/null +++ b/content/pages/tagged/generator.mdown @@ -0,0 +1,5 @@ + + +# Generator + +Posts tagged with Generator diff --git a/content/pages/tagged/git.mdown b/content/pages/tagged/git.mdown new file mode 100644 index 0000000..6363a29 --- /dev/null +++ b/content/pages/tagged/git.mdown @@ -0,0 +1,5 @@ + + +# Git + +Posts tagged with Git diff --git a/content/pages/tagged/github.mdown b/content/pages/tagged/github.mdown new file mode 100644 index 0000000..9594651 --- /dev/null +++ b/content/pages/tagged/github.mdown @@ -0,0 +1,5 @@ + + +# Github + +Posts tagged with Github diff --git a/content/pages/tagged/go-code.mdown b/content/pages/tagged/go-code.mdown new file mode 100644 index 0000000..b881e74 --- /dev/null +++ b/content/pages/tagged/go-code.mdown @@ -0,0 +1,5 @@ + + +# Go-code + +Posts tagged with Go-code diff --git a/content/pages/tagged/go.mdown b/content/pages/tagged/go.mdown new file mode 100644 index 0000000..995152a --- /dev/null +++ b/content/pages/tagged/go.mdown @@ -0,0 +1,5 @@ + + +# Go + +Posts tagged with Go diff --git a/content/pages/tagged/google-go.mdown b/content/pages/tagged/google-go.mdown new file mode 100644 index 0000000..22db56a --- /dev/null +++ b/content/pages/tagged/google-go.mdown @@ -0,0 +1,5 @@ + + +# Google-go + +Posts tagged with Google-go diff --git a/content/pages/tagged/google-voice.mdown b/content/pages/tagged/google-voice.mdown new file mode 100644 index 0000000..f3b2601 --- /dev/null +++ b/content/pages/tagged/google-voice.mdown @@ -0,0 +1,5 @@ + + +# Google-voice + +Posts tagged with Google-voice diff --git a/content/pages/tagged/google.mdown b/content/pages/tagged/google.mdown new file mode 100644 index 0000000..c89cd51 --- /dev/null +++ b/content/pages/tagged/google.mdown @@ -0,0 +1,5 @@ + + +# Google + +Posts tagged with Google diff --git a/content/pages/tagged/gov20.mdown b/content/pages/tagged/gov20.mdown new file mode 100644 index 0000000..9712283 --- /dev/null +++ b/content/pages/tagged/gov20.mdown @@ -0,0 +1,5 @@ + + +# Gov20 + +Posts tagged with Gov20 diff --git a/content/pages/tagged/government.mdown b/content/pages/tagged/government.mdown new file mode 100644 index 0000000..0c14c5a --- /dev/null +++ b/content/pages/tagged/government.mdown @@ -0,0 +1,5 @@ + + +# Government + +Posts tagged with Government diff --git a/content/pages/tagged/graphing.mdown b/content/pages/tagged/graphing.mdown new file mode 100644 index 0000000..d22095f --- /dev/null +++ b/content/pages/tagged/graphing.mdown @@ -0,0 +1,5 @@ + + +# Graphing + +Posts tagged with Graphing diff --git a/content/pages/tagged/growl.mdown b/content/pages/tagged/growl.mdown new file mode 100644 index 0000000..8bc2954 --- /dev/null +++ b/content/pages/tagged/growl.mdown @@ -0,0 +1,5 @@ + + +# Growl + +Posts tagged with Growl diff --git a/content/pages/tagged/guest-hosts.mdown b/content/pages/tagged/guest-hosts.mdown new file mode 100644 index 0000000..d435c2e --- /dev/null +++ b/content/pages/tagged/guest-hosts.mdown @@ -0,0 +1,5 @@ + + +# Guest-hosts + +Posts tagged with Guest-hosts diff --git a/content/pages/tagged/hacking.mdown b/content/pages/tagged/hacking.mdown new file mode 100644 index 0000000..b6ac43f --- /dev/null +++ b/content/pages/tagged/hacking.mdown @@ -0,0 +1,5 @@ + + +# Hacking + +Posts tagged with Hacking diff --git a/content/pages/tagged/haiti.mdown b/content/pages/tagged/haiti.mdown new file mode 100644 index 0000000..8f6b452 --- /dev/null +++ b/content/pages/tagged/haiti.mdown @@ -0,0 +1,5 @@ + + +# Haiti + +Posts tagged with Haiti diff --git a/content/pages/tagged/haml.mdown b/content/pages/tagged/haml.mdown new file mode 100644 index 0000000..0f3c258 --- /dev/null +++ b/content/pages/tagged/haml.mdown @@ -0,0 +1,5 @@ + + +# Haml + +Posts tagged with Haml diff --git a/content/pages/tagged/heroku.mdown b/content/pages/tagged/heroku.mdown new file mode 100644 index 0000000..5637897 --- /dev/null +++ b/content/pages/tagged/heroku.mdown @@ -0,0 +1,5 @@ + + +# Heroku + +Posts tagged with Heroku diff --git a/content/pages/tagged/html5.mdown b/content/pages/tagged/html5.mdown new file mode 100644 index 0000000..f3c3188 --- /dev/null +++ b/content/pages/tagged/html5.mdown @@ -0,0 +1,5 @@ + + +# Html5 + +Posts tagged with Html5 diff --git a/content/pages/tagged/interviews.mdown b/content/pages/tagged/interviews.mdown new file mode 100644 index 0000000..ea19552 --- /dev/null +++ b/content/pages/tagged/interviews.mdown @@ -0,0 +1,5 @@ + + +# Interviews + +Posts tagged with Interviews diff --git a/content/pages/tagged/iphone.mdown b/content/pages/tagged/iphone.mdown new file mode 100644 index 0000000..d851e6f --- /dev/null +++ b/content/pages/tagged/iphone.mdown @@ -0,0 +1,5 @@ + + +# Iphone + +Posts tagged with Iphone diff --git a/content/pages/tagged/itunes.mdown b/content/pages/tagged/itunes.mdown new file mode 100644 index 0000000..b9cf683 --- /dev/null +++ b/content/pages/tagged/itunes.mdown @@ -0,0 +1,5 @@ + + +# Itunes + +Posts tagged with Itunes diff --git a/content/pages/tagged/jason.mdown b/content/pages/tagged/jason.mdown new file mode 100644 index 0000000..f31e807 --- /dev/null +++ b/content/pages/tagged/jason.mdown @@ -0,0 +1,5 @@ + + +# Jason + +Posts tagged with Jason diff --git a/content/pages/tagged/java.mdown b/content/pages/tagged/java.mdown new file mode 100644 index 0000000..8d72094 --- /dev/null +++ b/content/pages/tagged/java.mdown @@ -0,0 +1,5 @@ + + +# Java + +Posts tagged with Java diff --git a/content/pages/tagged/javascript.mdown b/content/pages/tagged/javascript.mdown new file mode 100644 index 0000000..541aeeb --- /dev/null +++ b/content/pages/tagged/javascript.mdown @@ -0,0 +1,5 @@ + + +# Javascript + +Posts tagged with Javascript diff --git a/content/pages/tagged/jobboard.mdown b/content/pages/tagged/jobboard.mdown new file mode 100644 index 0000000..e747189 --- /dev/null +++ b/content/pages/tagged/jobboard.mdown @@ -0,0 +1,5 @@ + + +# Jobboard + +Posts tagged with Jobboard diff --git a/content/pages/tagged/jobs.mdown b/content/pages/tagged/jobs.mdown new file mode 100644 index 0000000..e91d62e --- /dev/null +++ b/content/pages/tagged/jobs.mdown @@ -0,0 +1,5 @@ + + +# Jobs + +Posts tagged with Jobs diff --git a/content/pages/tagged/jquery.mdown b/content/pages/tagged/jquery.mdown new file mode 100644 index 0000000..b65dd83 --- /dev/null +++ b/content/pages/tagged/jquery.mdown @@ -0,0 +1,5 @@ + + +# Jquery + +Posts tagged with Jquery diff --git a/content/pages/tagged/json.mdown b/content/pages/tagged/json.mdown new file mode 100644 index 0000000..add91b0 --- /dev/null +++ b/content/pages/tagged/json.mdown @@ -0,0 +1,5 @@ + + +# Json + +Posts tagged with Json diff --git a/content/pages/tagged/jsonp.mdown b/content/pages/tagged/jsonp.mdown new file mode 100644 index 0000000..9218d2e --- /dev/null +++ b/content/pages/tagged/jsonp.mdown @@ -0,0 +1,5 @@ + + +# Jsonp + +Posts tagged with Jsonp diff --git a/content/pages/tagged/languages.mdown b/content/pages/tagged/languages.mdown new file mode 100644 index 0000000..5aaf8c9 --- /dev/null +++ b/content/pages/tagged/languages.mdown @@ -0,0 +1,5 @@ + + +# Languages + +Posts tagged with Languages diff --git a/content/pages/tagged/layout.mdown b/content/pages/tagged/layout.mdown new file mode 100644 index 0000000..9654b26 --- /dev/null +++ b/content/pages/tagged/layout.mdown @@ -0,0 +1,5 @@ + + +# Layout + +Posts tagged with Layout diff --git a/content/pages/tagged/less.mdown b/content/pages/tagged/less.mdown new file mode 100644 index 0000000..119b198 --- /dev/null +++ b/content/pages/tagged/less.mdown @@ -0,0 +1,5 @@ + + +# Less + +Posts tagged with Less diff --git a/content/pages/tagged/libraries.mdown b/content/pages/tagged/libraries.mdown new file mode 100644 index 0000000..e99a05b --- /dev/null +++ b/content/pages/tagged/libraries.mdown @@ -0,0 +1,5 @@ + + +# Libraries + +Posts tagged with Libraries diff --git a/content/pages/tagged/library.mdown b/content/pages/tagged/library.mdown new file mode 100644 index 0000000..aaf329a --- /dev/null +++ b/content/pages/tagged/library.mdown @@ -0,0 +1,5 @@ + + +# Library + +Posts tagged with Library diff --git a/content/pages/tagged/lifestreaming.mdown b/content/pages/tagged/lifestreaming.mdown new file mode 100644 index 0000000..b9a8cab --- /dev/null +++ b/content/pages/tagged/lifestreaming.mdown @@ -0,0 +1,5 @@ + + +# Lifestreaming + +Posts tagged with Lifestreaming diff --git a/content/pages/tagged/lighthouse.mdown b/content/pages/tagged/lighthouse.mdown new file mode 100644 index 0000000..7e37d43 --- /dev/null +++ b/content/pages/tagged/lighthouse.mdown @@ -0,0 +1,5 @@ + + +# Lighthouse + +Posts tagged with Lighthouse diff --git a/content/pages/tagged/linkedin.mdown b/content/pages/tagged/linkedin.mdown new file mode 100644 index 0000000..bb46f94 --- /dev/null +++ b/content/pages/tagged/linkedin.mdown @@ -0,0 +1,5 @@ + + +# Linkedin + +Posts tagged with Linkedin diff --git a/content/pages/tagged/location.mdown b/content/pages/tagged/location.mdown new file mode 100644 index 0000000..20ca0d2 --- /dev/null +++ b/content/pages/tagged/location.mdown @@ -0,0 +1,5 @@ + + +# Location + +Posts tagged with Location diff --git a/content/pages/tagged/lua.mdown b/content/pages/tagged/lua.mdown new file mode 100644 index 0000000..b9bd5ba --- /dev/null +++ b/content/pages/tagged/lua.mdown @@ -0,0 +1,5 @@ + + +# Lua + +Posts tagged with Lua diff --git a/content/pages/tagged/mac.mdown b/content/pages/tagged/mac.mdown new file mode 100644 index 0000000..2f29860 --- /dev/null +++ b/content/pages/tagged/mac.mdown @@ -0,0 +1,5 @@ + + +# Mac + +Posts tagged with Mac diff --git a/content/pages/tagged/meetups.mdown b/content/pages/tagged/meetups.mdown new file mode 100644 index 0000000..d5bfd2c --- /dev/null +++ b/content/pages/tagged/meetups.mdown @@ -0,0 +1,5 @@ + + +# Meetups + +Posts tagged with Meetups diff --git a/content/pages/tagged/memcached.mdown b/content/pages/tagged/memcached.mdown new file mode 100644 index 0000000..cdb9435 --- /dev/null +++ b/content/pages/tagged/memcached.mdown @@ -0,0 +1,5 @@ + + +# Memcached + +Posts tagged with Memcached diff --git a/content/pages/tagged/migrations.mdown b/content/pages/tagged/migrations.mdown new file mode 100644 index 0000000..679f8c2 --- /dev/null +++ b/content/pages/tagged/migrations.mdown @@ -0,0 +1,5 @@ + + +# Migrations + +Posts tagged with Migrations diff --git a/content/pages/tagged/mobile.mdown b/content/pages/tagged/mobile.mdown new file mode 100644 index 0000000..e795704 --- /dev/null +++ b/content/pages/tagged/mobile.mdown @@ -0,0 +1,5 @@ + + +# Mobile + +Posts tagged with Mobile diff --git a/content/pages/tagged/mongo.mdown b/content/pages/tagged/mongo.mdown new file mode 100644 index 0000000..179b730 --- /dev/null +++ b/content/pages/tagged/mongo.mdown @@ -0,0 +1,5 @@ + + +# Mongo + +Posts tagged with Mongo diff --git a/content/pages/tagged/mongodb.mdown b/content/pages/tagged/mongodb.mdown new file mode 100644 index 0000000..6d8aaa2 --- /dev/null +++ b/content/pages/tagged/mongodb.mdown @@ -0,0 +1,5 @@ + + +# Mongodb + +Posts tagged with Mongodb diff --git a/content/pages/tagged/mongomapper.mdown b/content/pages/tagged/mongomapper.mdown new file mode 100644 index 0000000..aa1e3a0 --- /dev/null +++ b/content/pages/tagged/mongomapper.mdown @@ -0,0 +1,5 @@ + + +# Mongomapper + +Posts tagged with Mongomapper diff --git a/content/pages/tagged/monkey-patching.mdown b/content/pages/tagged/monkey-patching.mdown new file mode 100644 index 0000000..ee082b6 --- /dev/null +++ b/content/pages/tagged/monkey-patching.mdown @@ -0,0 +1,5 @@ + + +# Monkey-patching + +Posts tagged with Monkey-patching diff --git a/content/pages/tagged/movies.mdown b/content/pages/tagged/movies.mdown new file mode 100644 index 0000000..6d14ae8 --- /dev/null +++ b/content/pages/tagged/movies.mdown @@ -0,0 +1,5 @@ + + +# Movies + +Posts tagged with Movies diff --git a/content/pages/tagged/multi-touch.mdown b/content/pages/tagged/multi-touch.mdown new file mode 100644 index 0000000..c69f92c --- /dev/null +++ b/content/pages/tagged/multi-touch.mdown @@ -0,0 +1,5 @@ + + +# Multi-touch + +Posts tagged with Multi-touch diff --git a/content/pages/tagged/mvc.mdown b/content/pages/tagged/mvc.mdown new file mode 100644 index 0000000..d610a85 --- /dev/null +++ b/content/pages/tagged/mvc.mdown @@ -0,0 +1,5 @@ + + +# Mvc + +Posts tagged with Mvc diff --git a/content/pages/tagged/mysql.mdown b/content/pages/tagged/mysql.mdown new file mode 100644 index 0000000..a8d7c59 --- /dev/null +++ b/content/pages/tagged/mysql.mdown @@ -0,0 +1,5 @@ + + +# Mysql + +Posts tagged with Mysql diff --git a/content/pages/tagged/news.mdown b/content/pages/tagged/news.mdown new file mode 100644 index 0000000..f427f19 --- /dev/null +++ b/content/pages/tagged/news.mdown @@ -0,0 +1,5 @@ + + +# News + +Posts tagged with News diff --git a/content/pages/tagged/node-js.mdown b/content/pages/tagged/node-js.mdown new file mode 100644 index 0000000..05a1112 --- /dev/null +++ b/content/pages/tagged/node-js.mdown @@ -0,0 +1,5 @@ + + +# Node-js + +Posts tagged with Node-js diff --git a/content/pages/tagged/nodejs.mdown b/content/pages/tagged/nodejs.mdown new file mode 100644 index 0000000..5f094c7 --- /dev/null +++ b/content/pages/tagged/nodejs.mdown @@ -0,0 +1,5 @@ + + +# Nodejs + +Posts tagged with Nodejs diff --git a/content/pages/tagged/nosql.mdown b/content/pages/tagged/nosql.mdown new file mode 100644 index 0000000..f6dc18b --- /dev/null +++ b/content/pages/tagged/nosql.mdown @@ -0,0 +1,5 @@ + + +# Nosql + +Posts tagged with Nosql diff --git a/content/pages/tagged/obj-c.mdown b/content/pages/tagged/obj-c.mdown new file mode 100644 index 0000000..5634e50 --- /dev/null +++ b/content/pages/tagged/obj-c.mdown @@ -0,0 +1,5 @@ + + +# Obj-c + +Posts tagged with Obj-c diff --git a/content/pages/tagged/open-source.mdown b/content/pages/tagged/open-source.mdown new file mode 100644 index 0000000..22d6c4d --- /dev/null +++ b/content/pages/tagged/open-source.mdown @@ -0,0 +1,5 @@ + + +# Open-source + +Posts tagged with Open-source diff --git a/content/pages/tagged/optimization.mdown b/content/pages/tagged/optimization.mdown new file mode 100644 index 0000000..7b4096a --- /dev/null +++ b/content/pages/tagged/optimization.mdown @@ -0,0 +1,5 @@ + + +# Optimization + +Posts tagged with Optimization diff --git a/content/pages/tagged/os.mdown b/content/pages/tagged/os.mdown new file mode 100644 index 0000000..0500c61 --- /dev/null +++ b/content/pages/tagged/os.mdown @@ -0,0 +1,5 @@ + + +# Os + +Posts tagged with Os diff --git a/content/pages/tagged/osx.mdown b/content/pages/tagged/osx.mdown new file mode 100644 index 0000000..a59e9e9 --- /dev/null +++ b/content/pages/tagged/osx.mdown @@ -0,0 +1,5 @@ + + +# Osx + +Posts tagged with Osx diff --git a/content/pages/tagged/otp.mdown b/content/pages/tagged/otp.mdown new file mode 100644 index 0000000..50a7b62 --- /dev/null +++ b/content/pages/tagged/otp.mdown @@ -0,0 +1,5 @@ + + +# Otp + +Posts tagged with Otp diff --git a/content/pages/tagged/palm-pre.mdown b/content/pages/tagged/palm-pre.mdown new file mode 100644 index 0000000..5dd5399 --- /dev/null +++ b/content/pages/tagged/palm-pre.mdown @@ -0,0 +1,5 @@ + + +# Palm-pre + +Posts tagged with Palm-pre diff --git a/content/pages/tagged/palm.mdown b/content/pages/tagged/palm.mdown new file mode 100644 index 0000000..e037830 --- /dev/null +++ b/content/pages/tagged/palm.mdown @@ -0,0 +1,5 @@ + + +# Palm + +Posts tagged with Palm diff --git a/content/pages/tagged/performance.mdown b/content/pages/tagged/performance.mdown new file mode 100644 index 0000000..3318771 --- /dev/null +++ b/content/pages/tagged/performance.mdown @@ -0,0 +1,5 @@ + + +# Performance + +Posts tagged with Performance diff --git a/content/pages/tagged/perl.mdown b/content/pages/tagged/perl.mdown new file mode 100644 index 0000000..5097717 --- /dev/null +++ b/content/pages/tagged/perl.mdown @@ -0,0 +1,5 @@ + + +# Perl + +Posts tagged with Perl diff --git a/content/pages/tagged/php.mdown b/content/pages/tagged/php.mdown new file mode 100644 index 0000000..baf973b --- /dev/null +++ b/content/pages/tagged/php.mdown @@ -0,0 +1,5 @@ + + +# Php + +Posts tagged with Php diff --git a/content/pages/tagged/plugins.mdown b/content/pages/tagged/plugins.mdown new file mode 100644 index 0000000..57d2bb7 --- /dev/null +++ b/content/pages/tagged/plugins.mdown @@ -0,0 +1,5 @@ + + +# Plugins + +Posts tagged with Plugins diff --git a/content/pages/tagged/presentations.mdown b/content/pages/tagged/presentations.mdown new file mode 100644 index 0000000..839bb6e --- /dev/null +++ b/content/pages/tagged/presentations.mdown @@ -0,0 +1,5 @@ + + +# Presentations + +Posts tagged with Presentations diff --git a/content/pages/tagged/programing-language.mdown b/content/pages/tagged/programing-language.mdown new file mode 100644 index 0000000..496a70a --- /dev/null +++ b/content/pages/tagged/programing-language.mdown @@ -0,0 +1,5 @@ + + +# Programing-language + +Posts tagged with Programing-language diff --git a/content/pages/tagged/prototype.mdown b/content/pages/tagged/prototype.mdown new file mode 100644 index 0000000..2c1cfe7 --- /dev/null +++ b/content/pages/tagged/prototype.mdown @@ -0,0 +1,5 @@ + + +# Prototype + +Posts tagged with Prototype diff --git a/content/pages/tagged/pubsub.mdown b/content/pages/tagged/pubsub.mdown new file mode 100644 index 0000000..0d5dc77 --- /dev/null +++ b/content/pages/tagged/pubsub.mdown @@ -0,0 +1,5 @@ + + +# Pubsub + +Posts tagged with Pubsub diff --git a/content/pages/tagged/puppet.mdown b/content/pages/tagged/puppet.mdown new file mode 100644 index 0000000..303064b --- /dev/null +++ b/content/pages/tagged/puppet.mdown @@ -0,0 +1,5 @@ + + +# Puppet + +Posts tagged with Puppet diff --git a/content/pages/tagged/python.mdown b/content/pages/tagged/python.mdown new file mode 100644 index 0000000..167389b --- /dev/null +++ b/content/pages/tagged/python.mdown @@ -0,0 +1,5 @@ + + +# Python + +Posts tagged with Python diff --git a/content/pages/tagged/queues.mdown b/content/pages/tagged/queues.mdown new file mode 100644 index 0000000..11dbf74 --- /dev/null +++ b/content/pages/tagged/queues.mdown @@ -0,0 +1,5 @@ + + +# Queues + +Posts tagged with Queues diff --git a/content/pages/tagged/rack.mdown b/content/pages/tagged/rack.mdown new file mode 100644 index 0000000..5c6a6e8 --- /dev/null +++ b/content/pages/tagged/rack.mdown @@ -0,0 +1,5 @@ + + +# Rack + +Posts tagged with Rack diff --git a/content/pages/tagged/rails.mdown b/content/pages/tagged/rails.mdown new file mode 100644 index 0000000..7210212 --- /dev/null +++ b/content/pages/tagged/rails.mdown @@ -0,0 +1,5 @@ + + +# Rails + +Posts tagged with Rails diff --git a/content/pages/tagged/releases.mdown b/content/pages/tagged/releases.mdown new file mode 100644 index 0000000..87a67da --- /dev/null +++ b/content/pages/tagged/releases.mdown @@ -0,0 +1,5 @@ + + +# Releases + +Posts tagged with Releases diff --git a/content/pages/tagged/rest.mdown b/content/pages/tagged/rest.mdown new file mode 100644 index 0000000..8eee534 --- /dev/null +++ b/content/pages/tagged/rest.mdown @@ -0,0 +1,5 @@ + + +# Rest + +Posts tagged with Rest diff --git a/content/pages/tagged/rhino.mdown b/content/pages/tagged/rhino.mdown new file mode 100644 index 0000000..2a1acb8 --- /dev/null +++ b/content/pages/tagged/rhino.mdown @@ -0,0 +1,5 @@ + + +# Rhino + +Posts tagged with Rhino diff --git a/content/pages/tagged/riak.mdown b/content/pages/tagged/riak.mdown new file mode 100644 index 0000000..8feb854 --- /dev/null +++ b/content/pages/tagged/riak.mdown @@ -0,0 +1,5 @@ + + +# Riak + +Posts tagged with Riak diff --git a/content/pages/tagged/ruby.mdown b/content/pages/tagged/ruby.mdown new file mode 100644 index 0000000..738c49d --- /dev/null +++ b/content/pages/tagged/ruby.mdown @@ -0,0 +1,5 @@ + + +# Ruby + +Ruby is the bomb, yo! diff --git a/content/pages/tagged/sales.mdown b/content/pages/tagged/sales.mdown new file mode 100644 index 0000000..6371d67 --- /dev/null +++ b/content/pages/tagged/sales.mdown @@ -0,0 +1,5 @@ + + +# Sales + +Posts tagged with Sales diff --git a/content/pages/tagged/sass.mdown b/content/pages/tagged/sass.mdown new file mode 100644 index 0000000..ea76198 --- /dev/null +++ b/content/pages/tagged/sass.mdown @@ -0,0 +1,5 @@ + + +# Sass + +Posts tagged with Sass diff --git a/content/pages/tagged/scaling.mdown b/content/pages/tagged/scaling.mdown new file mode 100644 index 0000000..66d1736 --- /dev/null +++ b/content/pages/tagged/scaling.mdown @@ -0,0 +1,5 @@ + + +# Scaling + +Posts tagged with Scaling diff --git a/content/pages/tagged/screencast.mdown b/content/pages/tagged/screencast.mdown new file mode 100644 index 0000000..f909908 --- /dev/null +++ b/content/pages/tagged/screencast.mdown @@ -0,0 +1,5 @@ + + +# Screencast + +Posts tagged with Screencast diff --git a/content/pages/tagged/screencasting.mdown b/content/pages/tagged/screencasting.mdown new file mode 100644 index 0000000..5130e4b --- /dev/null +++ b/content/pages/tagged/screencasting.mdown @@ -0,0 +1,5 @@ + + +# Screencasting + +Posts tagged with Screencasting diff --git a/content/pages/tagged/screencasts.mdown b/content/pages/tagged/screencasts.mdown new file mode 100644 index 0000000..fcb7a97 --- /dev/null +++ b/content/pages/tagged/screencasts.mdown @@ -0,0 +1,5 @@ + + +# Screencasts + +Posts tagged with Screencasts diff --git a/content/pages/tagged/scriptaculous.mdown b/content/pages/tagged/scriptaculous.mdown new file mode 100644 index 0000000..98edaa1 --- /dev/null +++ b/content/pages/tagged/scriptaculous.mdown @@ -0,0 +1,5 @@ + + +# Scriptaculous + +Posts tagged with Scriptaculous diff --git a/content/pages/tagged/scripting.mdown b/content/pages/tagged/scripting.mdown new file mode 100644 index 0000000..1ed05a7 --- /dev/null +++ b/content/pages/tagged/scripting.mdown @@ -0,0 +1,5 @@ + + +# Scripting + +Posts tagged with Scripting diff --git a/content/pages/tagged/server-side.mdown b/content/pages/tagged/server-side.mdown new file mode 100644 index 0000000..0e7178d --- /dev/null +++ b/content/pages/tagged/server-side.mdown @@ -0,0 +1,5 @@ + + +# Server-side + +Posts tagged with Server-side diff --git a/content/pages/tagged/server.mdown b/content/pages/tagged/server.mdown new file mode 100644 index 0000000..5084dc8 --- /dev/null +++ b/content/pages/tagged/server.mdown @@ -0,0 +1,5 @@ + + +# Server + +Posts tagged with Server diff --git a/content/pages/tagged/sinatra.mdown b/content/pages/tagged/sinatra.mdown new file mode 100644 index 0000000..d81e429 --- /dev/null +++ b/content/pages/tagged/sinatra.mdown @@ -0,0 +1,5 @@ + + +# Sinatra + +Posts tagged with Sinatra diff --git a/content/pages/tagged/slides.mdown b/content/pages/tagged/slides.mdown new file mode 100644 index 0000000..80d4c63 --- /dev/null +++ b/content/pages/tagged/slides.mdown @@ -0,0 +1,5 @@ + + +# Slides + +Posts tagged with Slides diff --git a/content/pages/tagged/social-media.mdown b/content/pages/tagged/social-media.mdown new file mode 100644 index 0000000..c2b0d10 --- /dev/null +++ b/content/pages/tagged/social-media.mdown @@ -0,0 +1,5 @@ + + +# Social-media + +Posts tagged with Social-media diff --git a/content/pages/tagged/sound.mdown b/content/pages/tagged/sound.mdown new file mode 100644 index 0000000..dc183cf --- /dev/null +++ b/content/pages/tagged/sound.mdown @@ -0,0 +1,5 @@ + + +# Sound + +Posts tagged with Sound diff --git a/content/pages/tagged/ssb.mdown b/content/pages/tagged/ssb.mdown new file mode 100644 index 0000000..7d22bd8 --- /dev/null +++ b/content/pages/tagged/ssb.mdown @@ -0,0 +1,5 @@ + + +# Ssb + +Posts tagged with Ssb diff --git a/content/pages/tagged/static.mdown b/content/pages/tagged/static.mdown new file mode 100644 index 0000000..df7f267 --- /dev/null +++ b/content/pages/tagged/static.mdown @@ -0,0 +1,5 @@ + + +# Static + +Posts tagged with Static diff --git a/content/pages/tagged/svn.mdown b/content/pages/tagged/svn.mdown new file mode 100644 index 0000000..2f26c5e --- /dev/null +++ b/content/pages/tagged/svn.mdown @@ -0,0 +1,5 @@ + + +# Svn + +Posts tagged with Svn diff --git a/content/pages/tagged/tail.mdown b/content/pages/tagged/tail.mdown new file mode 100644 index 0000000..d84bd86 --- /dev/null +++ b/content/pages/tagged/tail.mdown @@ -0,0 +1,5 @@ + + +# Tail + +Posts tagged with Tail diff --git a/content/pages/tagged/talks.mdown b/content/pages/tagged/talks.mdown new file mode 100644 index 0000000..7d4f53e --- /dev/null +++ b/content/pages/tagged/talks.mdown @@ -0,0 +1,5 @@ + + +# Talks + +Posts tagged with Talks diff --git a/content/pages/tagged/testing.mdown b/content/pages/tagged/testing.mdown new file mode 100644 index 0000000..b87fc19 --- /dev/null +++ b/content/pages/tagged/testing.mdown @@ -0,0 +1,5 @@ + + +# Testing + +Posts tagged with Testing diff --git a/content/pages/tagged/things.mdown b/content/pages/tagged/things.mdown new file mode 100644 index 0000000..257b157 --- /dev/null +++ b/content/pages/tagged/things.mdown @@ -0,0 +1,5 @@ + + +# Things + +Posts tagged with Things diff --git a/content/pages/tagged/timetracking.mdown b/content/pages/tagged/timetracking.mdown new file mode 100644 index 0000000..735fc6e --- /dev/null +++ b/content/pages/tagged/timetracking.mdown @@ -0,0 +1,5 @@ + + +# Timetracking + +Posts tagged with Timetracking diff --git a/content/pages/tagged/titanium.mdown b/content/pages/tagged/titanium.mdown new file mode 100644 index 0000000..b86970e --- /dev/null +++ b/content/pages/tagged/titanium.mdown @@ -0,0 +1,5 @@ + + +# Titanium + +Posts tagged with Titanium diff --git a/content/pages/tagged/tools.mdown b/content/pages/tagged/tools.mdown new file mode 100644 index 0000000..781fd53 --- /dev/null +++ b/content/pages/tagged/tools.mdown @@ -0,0 +1,5 @@ + + +# Tools + +Posts tagged with Tools diff --git a/content/pages/tagged/toto.mdown b/content/pages/tagged/toto.mdown new file mode 100644 index 0000000..9154b17 --- /dev/null +++ b/content/pages/tagged/toto.mdown @@ -0,0 +1,5 @@ + + +# Toto + +Posts tagged with Toto diff --git a/content/pages/tagged/twitter.mdown b/content/pages/tagged/twitter.mdown new file mode 100644 index 0000000..423550a --- /dev/null +++ b/content/pages/tagged/twitter.mdown @@ -0,0 +1,5 @@ + + +# Twitter + +Posts tagged with Twitter diff --git a/content/pages/tagged/ui.mdown b/content/pages/tagged/ui.mdown new file mode 100644 index 0000000..9ed4e58 --- /dev/null +++ b/content/pages/tagged/ui.mdown @@ -0,0 +1,5 @@ + + +# Ui + +Posts tagged with Ui diff --git a/content/pages/tagged/underscore.mdown b/content/pages/tagged/underscore.mdown new file mode 100644 index 0000000..b86e34c --- /dev/null +++ b/content/pages/tagged/underscore.mdown @@ -0,0 +1,5 @@ + + +# Underscore + +Posts tagged with Underscore diff --git a/content/pages/tagged/unit-testing.mdown b/content/pages/tagged/unit-testing.mdown new file mode 100644 index 0000000..62d15b7 --- /dev/null +++ b/content/pages/tagged/unit-testing.mdown @@ -0,0 +1,5 @@ + + +# Unit-testing + +Posts tagged with Unit-testing diff --git a/content/pages/tagged/varnish.mdown b/content/pages/tagged/varnish.mdown new file mode 100644 index 0000000..e2d851c --- /dev/null +++ b/content/pages/tagged/varnish.mdown @@ -0,0 +1,5 @@ + + +# Varnish + +Posts tagged with Varnish diff --git a/content/pages/tagged/video.mdown b/content/pages/tagged/video.mdown new file mode 100644 index 0000000..83a1f50 --- /dev/null +++ b/content/pages/tagged/video.mdown @@ -0,0 +1,5 @@ + + +# Video + +Posts tagged with Video diff --git a/content/pages/tagged/webfinger.mdown b/content/pages/tagged/webfinger.mdown new file mode 100644 index 0000000..ea8c5e5 --- /dev/null +++ b/content/pages/tagged/webfinger.mdown @@ -0,0 +1,5 @@ + + +# Webfinger + +Posts tagged with Webfinger diff --git a/content/pages/tagged/what-we-are-watching.mdown b/content/pages/tagged/what-we-are-watching.mdown new file mode 100644 index 0000000..31e12e0 --- /dev/null +++ b/content/pages/tagged/what-we-are-watching.mdown @@ -0,0 +1,5 @@ + + +# What-we-are-watching + +Posts tagged with What-we-are-watching diff --git a/content/pages/tagged/wiki.mdown b/content/pages/tagged/wiki.mdown new file mode 100644 index 0000000..6bc8074 --- /dev/null +++ b/content/pages/tagged/wiki.mdown @@ -0,0 +1,5 @@ + + +# Wiki + +Posts tagged with Wiki diff --git a/content/pages/tagged/wordpress.mdown b/content/pages/tagged/wordpress.mdown new file mode 100644 index 0000000..64e8047 --- /dev/null +++ b/content/pages/tagged/wordpress.mdown @@ -0,0 +1,5 @@ + + +# Wordpress + +Posts tagged with Wordpress diff --git a/content/pages/tagged/wrappers.mdown b/content/pages/tagged/wrappers.mdown new file mode 100644 index 0000000..6d445d5 --- /dev/null +++ b/content/pages/tagged/wrappers.mdown @@ -0,0 +1,5 @@ + + +# Wrappers + +Posts tagged with Wrappers diff --git a/lib/config.rb b/lib/config.rb new file mode 100644 index 0000000..45bb3b1 --- /dev/null +++ b/lib/config.rb @@ -0,0 +1,79 @@ +module Nesta + class Config + @yaml = nil + + class << self + attr_accessor :yaml + end + + def self.cache + if Sinatra::Application.environment == :test + false + else + get(environment)["cache"] || false + end + end + + def self.title + configuration["title"] + end + + def self.subtitle + configuration["subtitle"] + end + + def self.description + configuration["description"] + end + + def self.keywords + configuration["keywords"] + end + + def self.author + configuration["author"] + end + + def self.theme + configuration["theme"] + end + + def self.google_analytics_code + get(environment)["google_analytics_code"] + end + + def self.disqus_short_name + configuration["disqus_short_name"] + end + + def self.content_path(basename = nil) + get_path(get(environment)["content"], basename) + end + + def self.page_path(basename = nil) + get_path(File.join(content_path, "pages"), basename) + end + + def self.attachment_path(basename = nil) + get_path(File.join(content_path, "attachments"), basename) + end + + private + def self.environment + Presto.environment.to_s + end + + def self.configuration + file = File.join(File.dirname(__FILE__), *%w[.. config config.yml]) + self.yaml ||= YAML::load(IO.read(file)) + end + + def self.get(key, default = {}) + configuration[key].nil? ? default : configuration[key] + end + + def self.get_path(dirname, basename) + basename.nil? ? dirname : File.join(dirname, basename) + end + end +end diff --git a/lib/path.rb b/lib/path.rb new file mode 100644 index 0000000..04312b0 --- /dev/null +++ b/lib/path.rb @@ -0,0 +1,10 @@ +module Nesta + class Path + @local = "local" + @themes = "themes" + + class << self + attr_accessor :local, :themes + end + end +end diff --git a/lib/sass.rb b/lib/sass.rb new file mode 100644 index 0000000..7b653cc --- /dev/null +++ b/lib/sass.rb @@ -0,0 +1,12 @@ +# Enables support for SASS template reloading for rack. +# Store SASS files by default within 'app/stylesheets/sass' +# See http://nex-3.com/posts/88-sass-supports-rack for more details. + +module SassInitializer + def self.registered(app) + require 'sass/plugin/rack' + Sass::Plugin.options[:template_location] = Padrino.root("app/stylesheets") + Sass::Plugin.options[:css_location] = Padrino.root("public/stylesheets") + app.use Sass::Plugin::Rack + end +end diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..e69de29 diff --git a/public/javascripts/application.js b/public/javascripts/application.js new file mode 100644 index 0000000..88a3216 --- /dev/null +++ b/public/javascripts/application.js @@ -0,0 +1 @@ +// Put your application scripts here \ No newline at end of file diff --git a/public/javascripts/jquery.js b/public/javascripts/jquery.js new file mode 100644 index 0000000..3d8e6f9 --- /dev/null +++ b/public/javascripts/jquery.js @@ -0,0 +1,19 @@ +/* + * jQuery JavaScript Library v1.3.2 + * http://jquery.com/ + * + * Copyright (c) 2010 John Resig + * Dual licensed under the MIT and GPL licenses. + * http://docs.jquery.com/License + * + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) + * Revision: 6246 + */ +(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("",""]||!O.indexOf("",""]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!O.indexOf("",""]||(!O.indexOf("",""]||!O.indexOf("",""]||!o.support.htmlSerialize&&[1,"div
","
"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); +/* + * Sizzle CSS Selector Engine - v0.9.3 + * Copyright 2009, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return UT[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="

";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="
";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("
").append(M.responseText.replace(//g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='
';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); \ No newline at end of file diff --git a/spec/atom_spec.rb b/spec/atom_spec.rb new file mode 100644 index 0000000..e14dd97 --- /dev/null +++ b/spec/atom_spec.rb @@ -0,0 +1,137 @@ +require File.join(File.dirname(__FILE__), "model_factory") +require File.join(File.dirname(__FILE__), "spec_helper") + +describe "atom feed" do + include ModelFactory + include RequestSpecHelper + + before(:each) do + stub_configuration + stub_config_key("author", { + "name" => "Fred Bloggs", + "uri" => "http://fredbloggs.com", + "email" => "fred@fredbloggs.com" + }) + get "/feed" + end + + after(:each) do + remove_fixtures + end + + it "should render successfully" do + last_response.should be_ok + end + + it "should use Atom's XML namespace" do + body.should have_tag("/feed[@xmlns=http://www.w3.org/2005/Atom]") + end + + it "should have an ID element" do + body.should have_tag("/feed/id", "tag:example.org,2009:/") + end + + it "should have an alternate link element" do + body.should have_tag("/feed/link[@rel=alternate][@href='http://example.org']") + end + + it "should have a self link element" do + body.should have_tag( + "/feed/link[@rel=self][@href='http://example.org/feed']") + end + + it "should have title and subtitle" do + body.should have_tag("/feed/title[@type=text]", "My blog") + body.should have_tag("/feed/subtitle[@type=text]", "about stuff") + end + + it "should include the author details" do + body.should have_tag("/feed/author/name", "Fred Bloggs") + body.should have_tag("/feed/author/uri", "http://fredbloggs.com") + body.should have_tag("/feed/author/email", "fred@fredbloggs.com") + end + + describe "for article" do + before(:each) do + @heading = "Heading" + @articles = [] + @category = create_category + 11.times do |i| + @articles << create_article( + :heading => "Article #{i + 1}", + :path => "article-#{i + 1}", + :metadata => { + "categories" => @category.path, + "date" => "#{i + 1} January 2009" + }, + :content => "Blah blah\n\n## #{@heading}\n\n[link](/foo)" + ) + end + @article = @articles.last + get "/feed" + end + + it "should set title" do + body.should have_tag("entry/title", "Article 11") + end + + it "should link to the HTML version" do + url = "http://example.org/#{@article.path}" + body.should have_tag( + "entry/link[@href='#{url}'][@rel=alternate][@type='text/html']") + end + + it "should define unique ID" do + body.should have_tag( + "entry/id", "tag:example.org,2009-01-11:#{@article.abspath}") + end + + it "should specify date published" do + body.should have_tag("entry/published", "2009-01-11T00:00:00+00:00") + end + + it "should specify article categories" do + body.should have_tag("category[@term=#{@category.permalink}]") + end + + it "should have article content" do + body.should have_tag( + "entry/content[@type=html]", /]*>#{@heading}<\/h2>/) + end + + it "should include hostname in URLs" do + body.should have_tag("entry/content", /http:\/\/example.org\/foo/) + end + + it "should not include article heading in content" do + body.should_not have_tag("entry/summary", /#{@article.heading}/) + end + + it "should list the latest 10 articles" do + body.should have_tag("entry", :count => 10) + body.should_not have_tag("entry/title", @articles.first.heading) + end + end + + describe "page with no date" do + before(:each) do + create_category(:path => "no-date") + get "/feed" + end + + it "should not appear in feed" do + body.should_not have_tag("entry/id", /tag.*no-date/) + end + end + + describe "article with atom ID" do + it "should use pre-defined ID" do + create_article(:metadata => { + "date" => "1 January 2009", + "atom id" => "use-this-id" + }) + get "/feed" + body.should have_tag("entry/id", "use-this-id") + end + end +end diff --git a/spec/model_factory.rb b/spec/model_factory.rb new file mode 100644 index 0000000..780234d --- /dev/null +++ b/spec/model_factory.rb @@ -0,0 +1,106 @@ +module ModelFactory + + FIXTURE_DIR = File.join(File.dirname(__FILE__), "fixtures") + + def stub_config_key(key, value) + @config ||= {} + @config[key] = value + end + + def stub_env_config_key(key, value) + @config ||= {} + @config["test"] ||= {} + @config["test"][key] = value + end + + def stub_configuration + stub_config_key("title", "My blog") + stub_config_key("subtitle", "about stuff") + stub_config_key("description", "great web site") + stub_config_key("keywords", "home, page") + stub_env_config_key("content", FIXTURE_DIR) + Nesta::Config.stub!(:configuration).and_return(@config) + end + + def create_page(options) + extension = options[:ext] || :mdown + path = filename(Nesta::Config.page_path, options[:path], extension) + create_file(path, options) + yield(path) if block_given? + Page.new(path) + end + + def create_article(options = {}, &block) + o = { + :path => "article-prefix/my-article", + :heading => "My article", + :content => "Content goes here", + :metadata => { + "date" => "29 December 2008" + }.merge(options.delete(:metadata) || {}) + }.merge(options) + create_page(o, &block) + end + + def create_category(options = {}, &block) + o = { + :path => "category-prefix/my-category", + :heading => "My category", + :content => "Content goes here" + }.merge(options) + create_page(o, &block) + end + + def create_menu(*paths) + menu_file = filename(Nesta::Config.content_path, "menu", :txt) + File.open(menu_file, "w") do |file| + paths.each { |p| file.write("#{p}\n") } + end + end + + def delete_page(type, permalink, extension) + file = filename(Nesta::Config.page_path, permalink, extension) + FileUtils.rm(file) + end + + def remove_fixtures + FileUtils.rm_r(FIXTURE_DIR, :force => true) + end + + def create_content_directories + FileUtils.mkdir_p(Nesta::Config.page_path) + FileUtils.mkdir_p(Nesta::Config.attachment_path) + end + + def mock_file_stat(method, filename, time) + stat = mock(:stat) + stat.stub!(:mtime).and_return(Time.parse(time)) + File.send(method, :stat).with(filename).and_return(stat) + end + + private + def filename(directory, basename, extension = :mdown) + File.join(directory, "#{basename}.#{extension}") + end + + def create_file(path, options = {}) + create_content_directories + metadata = options[:metadata] || {} + metatext = metadata.map { |key, value| "#{key}: #{value}" }.join("\n") + if options[:ext] == :haml + prefix = "%div\n %h1" + elsif options[:ext] == :textile + prefix = "
\nh1." + else + prefix = '# ' + end + heading = options[:heading] ? "#{prefix} #{options[:heading]}\n\n" : "" + contents =<<-EOF +#{metatext} + +#{heading}#{options[:content]} + EOF + FileUtils.mkdir_p(File.dirname(path)) + File.open(path, "w") { |file| file.write(contents) } + end +end diff --git a/spec/models_spec.rb b/spec/models_spec.rb new file mode 100644 index 0000000..94b7d9b --- /dev/null +++ b/spec/models_spec.rb @@ -0,0 +1,312 @@ +require File.join(File.dirname(__FILE__), "model_factory") +require File.join(File.dirname(__FILE__), "spec_helper") + +module ModelMatchers + class HavePage + def initialize(path) + @category = path + end + + def matches?(article) + @article = article + article.categories.map { |c| c.path }.include?(@category) + end + + def failure_message + "expected '#{@article.path}' to be assigned to #{@category}" + end + + def negative_failure_message + "'#{@article.path}' should not be assigned to #{@category}" + end + end + + def be_in_category(path) + HavePage.new(path) + end +end + +describe "Page", :shared => true do + include ModelFactory + include ModelMatchers + + def create_page(options) + super(options.merge(:ext => @extension)) + end + + before(:each) do + stub_configuration + end + + after(:each) do + remove_fixtures + FileModel.purge_cache + end + + it "should be findable" do + create_page(:heading => "Apple", :path => "the-apple") + Page.find_all.should have(1).item + end + + it "should find by path" do + create_page(:heading => "Banana", :path => "banana") + Page.find_by_path("banana").heading.should == "Banana" + end + + it "should not find non existant page" do + Page.find_by_path("no-such-page").should be_nil + end + + it "should ensure file exists on instantiation" do + lambda { Page.new("no-such-file") }.should raise_error(Sinatra::NotFound) + end + + it "should reload cached files when modified" do + create_page(:path => "a-page", :heading => "Version 1") + File.stub!(:mtime).and_return(Time.new - 1) + Page.find_by_path("a-page") + create_page(:path => "a-page", :heading => "Version 2") + File.stub!(:mtime).and_return(Time.new) + Page.find_by_path("a-page").heading.should == "Version 2" + end + + describe "with assigned pages" do + before(:each) do + @category = create_category + create_article(:heading => "Article 1", :path => "article-1") + create_article( + :heading => "Article 2", + :path => "article-2", + :metadata => { + "date" => "30 December 2008", + "categories" => @category.path + }) + @article = create_article( + :heading => "Article 3", + :path => "article-3", + :metadata => { + "date" => "31 December 2008", + "categories" => @category.path + }) + create_category(:path => "category-2", :metadata => { + "categories" => @category.path + }) + end + + it "should find articles" do + @category.articles.should have(2).items + end + + it "should list most recent articles first" do + @category.articles.first.path.should == @article.path + end + + it "should find pages" do + @category.pages.should have(1).item + end + end + + describe "when finding articles" do + before(:each) do + create_article(:heading => "Article 1", :path => "article-1") + create_article(:heading => "Article 2", + :path => "article-2", + :metadata => { "date" => "31 December 2008" }) + create_article(:heading => "Article 3", + :path => "foo/article-3", + :metadata => { "date" => "30 December 2008" }) + end + + it "should only find pages with dates" do + articles = Page.find_articles + articles.size.should > 0 + Page.find_articles.each { |page| page.date.should_not be_nil } + end + + it "should return articles in reverse chronological order" do + article1, article2 = Page.find_articles[0..1] + article1.date.should > article2.date + end + end + + describe "when assigned to categories" do + before(:each) do + create_category(:heading => "Apple", :path => "the-apple") + create_category(:heading => "Banana", :path => "banana") + @article = create_article( + :metadata => { "categories" => "banana, the-apple" }) + end + + it "should be possible to list the categories" do + @article.categories.should have(2).items + @article.should be_in_category("the-apple") + @article.should be_in_category("banana") + end + + it "should sort categories by heading" do + @article.categories.first.heading.should == "Apple" + end + + it "should not be assigned to non-existant category" do + delete_page(:category, "banana", @extension) + @article.should_not be_in_category("banana") + end + end + + it "should be able to find parent page" do + category = create_category(:path => "parent") + article = create_article(:path => "parent/child") + article.parent.should == category + end + + it "should set parent to nil when at root" do + create_category(:path => "top-level").parent.should be_nil + end + + describe "when not assigned to category" do + it "should have empty category list" do + article = create_article + Page.find_by_path(article.path).categories.should be_empty + end + end + + describe "with metadata" do + before(:each) do + @date = "07 September 2009" + @keywords = "things, stuff" + @description = "Page about stuff" + @summary = 'Multiline\n\nsummary' + @read_more = "Continue at your leisure" + create_article(:metadata => { + "date" => @date.gsub("September", "Sep"), + "description" => @description, + "keywords" => @keywords, + "summary" => @summary, + "read more" => @read_more + }) + @article = Page.find_by_path("article-prefix/my-article") + end + + it "should set permalink from filename" do + @article.permalink.should == "my-article" + end + + it "should set path from filename" do + @article.path.should == "article-prefix/my-article" + end + + it "should retrieve heading" do + @article.heading.should == "My article" + end + + it "should be possible to convert an article to HTML" do + @article.to_html.should have_tag("h1", "My article") + end + + it "should not include metadata in the HTML" do + @article.to_html.should_not have_tag("p", /^Date/) + end + + it "should not include heading in body" do + @article.body.should_not have_tag("h1", "My article") + end + + it "should retrieve description from metadata" do + @article.description.should == @description + end + + it "should retrieve keywords from metadata" do + @article.keywords.should == @keywords + end + + it "should retrieve date published from metadata" do + @article.date.strftime("%d %B %Y").should == @date + end + + it "should retrieve read more link from metadata" do + @article.read_more.should == @read_more + end + + it "should retrieve summary text from metadata" do + @article.summary.should match(/#{@summary.split('\n\n').first}/) + end + + it "should treat double newline chars as paragraph break in summary" do + @article.summary.should match(/#{@summary.split('\n\n').last}/) + end + end + + describe "without metadata" do + before(:each) do + create_article + @article = Page.find_all.first + end + + it "should parse heading correctly" do + @article.to_html.should have_tag("h1", "My article") + end + + it "should have default read more link text" do + @article.read_more.should == "Continue reading" + end + + it "should not have description" do + @article.description.should be_nil + end + + it "should not have keywords" do + @article.keywords.should be_nil + end + end + + describe "when checking last modification time" do + before(:each) do + create_article + @article = Page.find_all.first + end + + it "should check filesystem" do + mock_file_stat(:should_receive, @article.filename, "3 January 2009") + @article.last_modified.should == Time.parse("3 January 2009") + end + end +end + +describe "Markdown page" do + before(:each) do + @extension = :mdown + end + + it "should set heading from first h1 tag" do + create_article(:path => "headings", :content => '# Second heading') + Page.find_by_path("headings").heading.should == "My article" + end + + it_should_behave_like "Page" +end + +describe "Haml page" do + before(:each) do + @extension = :haml + end + + it "should set heading from first h1 tag" do + create_article(:path => "headings", :content => '%h1 Second heading') + Page.find_by_path("headings").heading.should == "My article" + end + + it_should_behave_like "Page" +end + +describe "Textile page" do + before(:each) do + @extension = :textile + end + + it "should set heading from first h1 tag" do + create_article(:path => "headings", :content => 'h1. Second heading') + Page.find_by_path("headings").heading.should == "My article" + end + + it_should_behave_like "Page" +end diff --git a/spec/page_spec.rb b/spec/page_spec.rb new file mode 100644 index 0000000..e9d00a5 --- /dev/null +++ b/spec/page_spec.rb @@ -0,0 +1,340 @@ +require File.join(File.dirname(__FILE__), "model_factory") +require File.join(File.dirname(__FILE__), "spec_helper") + +describe "layout" do + include ModelFactory + include RequestSpecHelper + + it "should not include GA JavaScript by default" do + stub_configuration + get "/" + body.should_not have_tag("script", /_getTracker\("UA-1234"\)/) + end + + it "should include GA JavaScript if configured" do + stub_env_config_key("google_analytics_code", "UA-1234") + stub_configuration + get "/" + body.should have_tag("script", /_getTracker\("UA-1234"\)/) + end +end + +describe "page with menus", :shared => true do + before(:each) do + @category = create_category + end + + it "should link to menu items" do + create_menu(@category.path) + get @category.abspath + body.should have_tag( + "#sidebar ul.menu a[@href=#{@category.abspath}]", @category.heading) + end + + it "should not be display menu if not configured" do + get @category.abspath + body.should_not have_tag("#sidebar ul.menu") + end +end + +describe "home page" do + include ModelFactory + include RequestSpecHelper + + before(:each) do + stub_configuration + create_category + get "/" + end + + after(:each) do + remove_fixtures + FileModel.purge_cache + end + + it_should_behave_like "page with menus" + + it "should render successfully" do + last_response.should be_ok + end + + it "should display title and subtitle in title tag" do + body.should have_tag("title", "My blog - about stuff") + end + + it "should display site title in h1 tag" do + body.should have_tag("h1", /My blog/) + end + + it "should display site subtitle in h1 tag" do + body.should have_tag("h1 small", /about stuff/) + end + + it "should set description meta tag" do + body.should have_tag("meta[@name=description][@content='great web site']") + end + + it "should set keywords meta tag" do + body.should have_tag("meta[@name=keywords][@content='home, page']") + end + + describe "when articles have no summary" do + before(:each) do + create_article + get "/" + end + + it "should display full content of article" do + body.should have_tag("p", "Content goes here") + end + + it "should not display read more link" do + body.should_not have_tag("a", /continue/i) + end + end + + describe "when articles have metadata" do + before(:each) do + @summary = 'Multiline\n\nsummary' + @read_more = "Continue at your leisure" + @article = create_article(:metadata => { + "summary" => @summary, + "read more" => @read_more + }) + get "/" + end + + it "should display link to article in h2 tag" do + body.should have_tag( + "h2 a[@href=#{@article.abspath}]", /^\s*#{@article.heading}$/) + end + + it "should display article summary if available" do + body.should have_tag("p", @summary.split('\n\n').first) + end + + it "should display read more link" do + body.should have_tag("a[@href=#{@article.abspath}]", @read_more) + end + end +end + +describe "page with meta tags", :shared => true do + it "should set description meta tag" do + body.should have_tag("meta[@name=description][@content='#{@description}']") + end + + it "should set the keywords meta tag" do + body.should have_tag("meta[@name=keywords][@content='#{@keywords}']") + end +end + +describe "article" do + include ModelFactory + include RequestSpecHelper + + before(:each) do + stub_configuration + @date = "07 September 2009" + @keywords = "things, stuff" + @description = "Page about stuff" + @summary = 'Multiline\n\nsummary' + @article = create_article(:metadata => { + "date" => @date.gsub("September", "Sep"), + "description" => @description, + "keywords" => @keywords, + "summary" => @summary, + }) + end + + after(:each) do + remove_fixtures + FileModel.purge_cache + end + + describe "that's not assigned to a category" do + before(:each) do + get @article.abspath + end + + it_should_behave_like "page with menus" + it_should_behave_like "page with meta tags" + + it "should render successfully" do + last_response.should be_ok + end + + it "should display the heading" do + body.should have_tag("h1", "My article") + end + + it "should not display category links" do + body.should_not have_tag("div.breadcrumb div.categories", /filed in/) + end + + it "should display the date" do + body.should have_tag("div.date", @date) + end + + it "should display the content" do + body.should have_tag("p", "Content goes here") + end + end + + describe "that's assigned to categories" do + before(:each) do + # FileModel.purge_cache + create_category(:heading => "Apple", :path => "the-apple") + create_category(:heading => "Banana", :path => "banana") + article = create_article( + :metadata => { "categories" => "banana, the-apple" }) + get article.abspath + end + + it "should render successfully" do + last_response.should be_ok + end + + it "should link to each category" do + body.should have_tag("div.categories", /Filed under/) + body.should have_tag("div.categories") do |categories| + categories.should have_tag("a[@href=/banana]", "Banana") + categories.should have_tag("a[@href=/the-apple]", "Apple") + end + end + end + + describe "with parent" do + before(:each) do + @category = create_category(:path => "topic") + article = create_article(:path => "topic/article") + get article.abspath + end + + it "should link to parent in breadcrumb" do + body.should have_tag( + "div.breadcrumb/a[@href=#{@category.abspath}]", @category.heading) + end + + it "should contain parent name in page title" do + body.should_not have_tag("title", /My blog/) + body.should have_tag("title", /- My category$/) + end + end +end + +describe "page" do + include ModelFactory + include RequestSpecHelper + + before(:each) do + stub_configuration + end + + after(:each) do + remove_fixtures + FileModel.purge_cache + end + + it_should_behave_like "page with menus" + + describe "that doesn't exist" do + it "should return 404 if page not found" do + get "/no-such-page" + last_response.should_not be_ok + end + end + + describe "that exists" do + before(:each) do + @description = "Page about stuff" + @keywords = "things, stuff" + @content = "Page content" + @category = create_category( + :content => "# My category\n\n#{@content}", + :metadata => { + "description" => @description, + "keywords" => @keywords + }) + @article = create_category( + :path => "another-page", + :heading => "Categorised", + :metadata => { :categories => @category.path }, + :content => "Article content") + @article2 = create_article( + :heading => "Second article", :path => "second-article") + get @category.abspath + end + + it_should_behave_like "page with meta tags" + + it "should render successfully" do + last_response.should be_ok + end + + it "should display the heading" do + body.should have_tag("h1", @category.heading) + end + + it "should display the content" do + body.should have_tag("p", @content) + end + + it "should display links to relevant pages" do + body.should have_tag( + "h3 a[@href='#{@article.abspath}']", /^\s*#{@article.heading}$/) + body.should_not have_tag("h3", @article2.heading) + end + + it "should not include Disqus comments by default" do + body.should_not have_tag('#disqus_thread') + end + end + + describe "that is configured to show Disqus comments" do + before(:each) do + stub_config_key("disqus_short_name", "mysite") + @category = create_category + get @category.abspath + end + + it "should display Disqus comments" do + body.should have_tag('#disqus_thread') + body.should have_tag('script[@src*="mysite/embed.js"]') + end + end +end + +describe "attachments" do + include ModelFactory + include RequestSpecHelper + + def create_attachment + stub_configuration + create_content_directories + path = File.join(Nesta::Config.attachment_path, "test.txt") + File.open(path, "w") { |file| file.write("I'm a test attachment") } + end + + before(:each) do + create_attachment + get "/attachments/test.txt" + end + + after(:each) do + remove_fixtures + FileModel.purge_cache + end + + it "should be served successfully" do + last_response.should be_ok + end + + it "should be sent to the client" do + body.should include("I'm a test attachment") + end + + it "should set the appropriate MIME type" do + last_response.headers["Content-Type"].should == "text/plain" + end +end diff --git a/spec/sitemap_spec.rb b/spec/sitemap_spec.rb new file mode 100644 index 0000000..c409dbe --- /dev/null +++ b/spec/sitemap_spec.rb @@ -0,0 +1,100 @@ +require File.join(File.dirname(__FILE__), "model_factory") +require File.join(File.dirname(__FILE__), "spec_helper") + +describe "sitemap XML" do + include ModelFactory + include RequestSpecHelper + + before(:each) do + stub_configuration + @category = create_category do |path| + mock_file_stat(:stub!, path, "3 Jan 2009, 15:07") + end + @article = create_article do |path| + mock_file_stat(:stub!, path, "3 Jan 2009, 15:10") + end + get "/sitemap.xml" + end + + after(:each) do + FileModel.purge_cache + remove_fixtures + end + + it "should render successfully" do + last_response.should be_ok + end + + it "should have a urlset tag" do + namespace = "http://www.sitemaps.org/schemas/sitemap/0.9" + body.should have_tag("/urlset[@xmlns=#{namespace}]") + end + + it "should reference the home page" do + body.should have_tag("/urlset/url/loc", "http://example.org") + end + + it "should configure home page to be checked frequently" do + body.should have_tag("/urlset/url") do |url| + url.should have_tag("loc", "http://example.org") + url.should have_tag("changefreq", "daily") + url.should have_tag("priority", "1.0") + end + end + + it "should set the homepage lastmod from latest article" do + body.should have_tag("/urlset/url") do |url| + url.should have_tag("loc", "http://example.org") + url.should have_tag("lastmod", /^2009-01-03T15:10:00/) + end + end + + it "should reference category pages" do + body.should have_tag( + "/urlset/url/loc", "http://example.org/#{@category.path}") + end + + it "should reference article pages" do + body.should have_tag( + "/urlset/url/loc", "http://example.org/#{@article.path}") + end +end + +describe "sitemap XML lastmod" do + include ModelFactory + include RequestSpecHelper + + before(:each) do + stub_configuration + end + + after(:each) do + remove_fixtures + FileModel.purge_cache + end + + it "should be set for file based page" do + create_article do |path| + mock_file_stat(:stub!, path, "3 January 2009, 15:37:01") + end + get "/sitemap.xml" + body.should have_tag("url") do |url| + url.should have_tag("loc", /my-article$/) + url.should have_tag("lastmod", /^2009-01-03T15:37:01/) + end + end + + it "should be set to latest page for home page" do + create_article(:path => "article-1") do |path| + mock_file_stat(:stub!, path, "4 January 2009") + end + create_article(:path => "article-2") do |path| + mock_file_stat(:stub!, path, "3 January 2009") + end + get "/sitemap.xml" + body.should have_tag("url") do |url| + url.should have_tag("loc", "http://example.org") + url.should have_tag("lastmod", /^2009-01-04/) + end + end +end diff --git a/spec/spec.opts b/spec/spec.opts new file mode 100644 index 0000000..4e1e0d2 --- /dev/null +++ b/spec/spec.opts @@ -0,0 +1 @@ +--color diff --git a/spec/spec.rake b/spec/spec.rake new file mode 100644 index 0000000..4c19ec9 --- /dev/null +++ b/spec/spec.rake @@ -0,0 +1,6 @@ +require 'spec/rake/spectask' + +Spec::Rake::SpecTask.new(:spec) do |t| + t.spec_files = Dir['**/*_spec.rb'] + t.spec_opts = %w(-fs --color) +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000..e6801a4 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,34 @@ +PADRINO_ENV = 'test' unless defined?(PADRINO_ENV) +require File.expand_path(File.dirname(__FILE__) + "/../config/boot") + +Spec::Runner.configure do |conf| + conf.include Rack::Test::Methods + conf.include(RspecHpricotMatchers) + conf.include(Nesta) +end + +def app + ## + # You can hanlde all padrino applications using instead: + # Padrino.application + Presto.tap { |app| } +end + + +# set :views => File.join(File.dirname(__FILE__), "..", "views"), +# :public => File.join(File.dirname(__FILE__), "..", "public") +# +# set :environment, :test +# set :reload_templates, true + +#require File.join(File.dirname(__FILE__), "..", "app") + +module RequestSpecHelper + # def app + # Sinatra::Application + # end + # + def body + last_response.body + end +end