Filter: #Code view all
Posts related to computer programming.

Announcing x-gui

In March 2016 I presented at the Sandstorm SF Meetup. I shared the design process that went into creating TextEditor, and I extrapolated a set of design guidelines for creating open source apps. As a followup to this, I am anouncing x-gui, a library of web components for building consistent web apps.

X-gui is an experiment and is evolving rapidly as I prototype more apps to learn what components are needed. It could be compared to Google's Polymer Catalog, but key differences being it is built without a library like Polymer, and it has a completely different visual style (doesn't look like Google).

You can read more about the project on the x-gui github. The readme has a lot more info. There's also an online demo.

Want to start using it?

bower install x-gui/x-gui  
# or
git clone git@github.com:x-gui/x-gui.git  

Below are the slides from the talk.

Announcing django-cache-decorator

I have been using Django for over two years, and I have grown to love the rich feature set it comes with. Yes, there's a lot one ends up not using, but it is great that these things are there for when one needs it. It's worth noting that these extra features do not cause a performance impact. Django can be stripped down and is capable of returning < 10ms responses.

Django offers many interfaces with swappable backends. For example you can use the same ORM functions for interacting with Postgres or Mysql. Or you can send Email directly from the server or via a commercial service like SendGrid (3rd party). Or you can choose from a variety of cache backends: In-memory, Memcache, or Redis (3rd party).

And once one has experience with the Django framework, it is really quick to develop web applications. These are all reasons why it's compelling to invest further into Django.

I have put together a simple python package to make it easy to add caching to any function in a django project. It's called django-cache-decorator.

Installation

pip install django-cache-decorator  

Example Usages

from django_cache_decorator import django_cache_decorator

@django_cache_decorator(time=0)
def geocodeGoogleAddressJson(location):  
   """Cache indefinitely until cache is reset or expired"""
   ...


@django_cache_decorator(time=500, cache_key="TagManager:popularTags")
def popularTags(self):  
   """Cache for 500 seconds. Specify a custom cache key"""
    ...


@django_cache_decorator(time=0, cache_type='redis')
def reverse_geocode(lng, lat):  
   """Cache indefinitely with redis backend"""
   ...

How it works

When the @django_cache_decorator is applied to a function, it'll cache the results of that function. If no cache_key is passed, a cache key will be generated automatically from the function name and the arguments. See the function cache_get_key for details.

The decorator also supports the argument cache_type to specify which backend to use.

Announcing a Puppet module for Dokku

I am excited to announce that I published a Puppet module for installing Dokku. Dokku is a great tool for easily hosting and deploying projects. It's basically a copy of Heroku that can be installed on Ubuntu 14.04. I recommend Digital Ocean for $5 a month.

With Puppet and this module, you can declaratively install Dokku.

Links:
- https://forge.puppetlabs.com/rchrd2/dokku
- https://github.com/rchrd2/puppet-dokku

Installation

puppet module install rchrd2-dokku  

Usage

node web {  
  # install dokku
  class {'dokku':
    version => 'v0.3.12',
  }

  # install dokku plugins
  dokku::plugin { "dokku-rebuild":
    source => "https://github.com/scottatron/dokku-rebuild.git",
    version => "master",
  }
  dokku::plugin { "dokku-pg-plugin":
    source => "https://github.com/rchrd2/dokku-pg-plugin.git",
    version => "master",
  }
}

https://github.com/rchrd2/puppet-dokku

How to install Ghost with NPM and Dokku

Today I installed Ghost, a blog app, on my very own server!
I installed it with dokku, a mini Heroku clone.


Installation notes

On the server, create an app

dokku apps:create blog  
dokku config:set blog NODE_ENV=production  

Turns out it worked best to install Ghost via npm, because it's already built.

I have it installed, but I need to setup a shared directory.

On the server, add the shared directory

dokku docker-options:add blog "-v /home/dokku/blog/shared:/app/shared"  
dokku docker-options blog  

So... I needed to modify Ghost and things got crazy. Turns out the npm package isn't directly what is in the repo. It contains the built files. So I had to build the files and add those to my fork (in a branch). After that, it worked!

Nice! It works! Hallelujah!

What's really nice is I have a repo that only has the bare minimum to run ghost plus a theme.

It looks like this:

/themes
   /casper
config.js  
index.js  
package.json  
README.md  

Code samples

package.json

{
  "name": "blog",
  "version": "0.0.1",
  "description": "blog.rchrd.net",
  "main": "index.js",
  "dependencies": {
     "ghost": "rchrd2/Ghost#package"
  },
  "devDependencies": {},
  "scripts": {
    "start": "node index",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "Richard Caceres",
  "license": "ISC"
}

index.js

var path = require('path');  
var ghost = require('ghost');

ghost({  
    config: path.join(__dirname, 'config.js')
}).then(function (ghostServer) {
    ghostServer.start();
});

config.js

var path = require('path'),  
    config;

config = {  
  production: {
      url: 'http://blog.rchrd.net',
      mail: {},
      database: {
          client: 'sqlite3',
          connection: {
              filename: path.join(__dirname, '/shared/content/data/ghost.db')
          },
          debug: false
      },

      server: {
          host: '0.0.0.0',
          port: '5000'
      },
      paths: {
          contentPath: path.join(__dirname, '/shared/content/'),
          themePath: path.join(__dirname, '/themes')
      }
  },
  development: {
      url: 'http://localhost:2368',
      database: {
          client: 'sqlite3',
          connection: {
              filename: path.join(__dirname, '/content/data/ghost-dev.db')
          },
          debug: false
      },
      server: {
          host: '127.0.0.1',
          port: '2368'
      },
      paths: {
          contentPath: path.join(__dirname, '/content/'),
          themePath: path.join(__dirname, '/themes')
      }
  } 
}

// Export config
module.exports = config;  

At one point I was in a experimental trio with musicians Cynthia Payne and Leaf Tine. We would get together and play experimental music over Internet 2 with Stanford CCRMA and Rensselaer. Leaf's primary instruments were a circuit bent keyboard, amplified rocks, and a joystick synthesizer, which I was always envious of.

Since I am now acquainted with electronics, I created my own joystick synthesizer. It is a modified pc joystick with a built-in square wave oscillator and lowpass filter. It is an excellent sound source to use on its own or feed into effects. I have posted the schematic and parts list so that you can build your own (I take no responsibility for damage you cause to your speaker or yourself ... etc)!

Sound exploration with Joy Stick routed through effects: http://richard-c.com/touch/joystick/JOYSTICK-DEMO.mp3

Demo Video: https://www.youtube.com/watch?v=F6c_lH52834
Schematic: Schematic
Parts List: Parts List

June 2009