capistrano and git, sitting in a tree - display the latest revision from both
Figure out if your deployed revision is the same as your local revision.
1 2 3 4 5 |
# plain jane capistrano cap status # capistrano multi-stage cap production status |
Plop this into your deploy.rb
1 2 3 4 5 6 7 8 9 10 11 |
desc "where's my server at?" task :status, :roles => :app do server = current_revision local = source.local.query_revision('HEAD'){|cmd| `#{cmd}` } if server == local puts "Delpoyed & localhost synced! (#{source.head} at #{server})" else puts "Deployed: #{server} (#{source.head})" puts "Local: #{local} (#{source.local.head})" end end |
Oh, behave! An example of Jquery with Low Pro behaviors.
I'm going to do a quick tour of the javascript code used in the upcoming design of alonetone, the kick-ass home for musicians.
For this version of alonetone, I ported the existing code to jquery to try out the library. As a low pro addict, however, I wanted to use the behaviors I know and love. Luckily, just about this time, a port of low pro to jquery was written by the trusty and talented Dan Webb.
Why low pro, when jquery is already unobtrusive?
- Behaviors allow me to easily name and encapsulate functionality that I can later reuse.
- Behaviors are inheritable, allowing me to group like things together, and avoiding writing chunks of similar code.
- Low Pro's implementation of behaviors has Event Delegation built in, vital for larger web apps (unless you want browsers to try and cope with 400 event bindings).
- I like the way behaviors look and way they read. My code feels more organized. I can quickly tell what is going on. I write less, and more importantly, I write less mess.
A quick note on this implementation
I have a github fork of low pro for jquery that contains a fix I needed for event delegation, as well as a (rudimentary) implementation of automatically binding ajax callbacks (in Remote.Base ported from the Prototype version). You'll need to use my fork, until Dan Webb pulls from it or otherwise adds the ajax callback bindings.
What we want to build
In this example, we are building a comment form that submits in-place via ajax. We've got a couple specific requirements.
- When a user clicks submit, we want to disable the submit button and change the text to "submitting..."
- We also want to show a fancy ajax spinner to reinforce the 'hold on, something is happening'
- If the comment submits successfully, we want to display a success message and clear the forms contents, allowing it to be submitted again.
- If the comment submit fails, we want to display a "Sorry, that didn't work!" message and keep the form contents in case the user wants to submit again.
- Either way, after the request comes back, we want to stop the spinner, and re-enable the submit button with the original button's text.
Complex? Nah.
For a demo of this, you can check out alonetone's staging site and either "report something" or play a track on the site (the comment box will open for you). Go ahead, don't be shy.
The code, with comments
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
// First off, we want to take advantage of Remote.Form // We are going to inherit from that existing behavior // which comes built in with low-pro CommentForm = $.klass(Remote.Form, { // When inheriting from an existing behavior // we can use the special variable called $super, // which gives us a reference to the behavior's parent. // You can use $super anywhere a parent already defines // a function. // In this case, we are inheriting from Remote.Form // which in turn inherits from Remote.Base. // We want to make sure the initialize function // in Remote.Base gets called, as it automagically binds // our ajax callbacks initialize : function($super,options) { // initialize is called when you first attach a behavior // to an element or a group of elements. // A common pattern is to define some variables here // to be used in other actions/methods of the behavior // Our submit button this.submitButton = $('.comment_submit', this.element); // Our submit button's original text this.submitText = this.submitButton.val(); // The "loading" spinner this.spinner = $('.small_spinner',this.element); // The box that contains our result message this.resultBox = $('.comment_waiting', this.element); // The text area we want to clear on success this.textarea = $('textarea', this.element); // E.T. phone home $super(); }, // You may be wondering where the onclick handler is... // It is already defined for us in Remote.Form // The next 4 functions are automagically bound // to the ajax call that Remote.Form makes // before sending, show the spinner and disable the form beforeSend:function(){ this.spinner.show(); this.disable(); }, // after sending, hide the spinner and enable the form complete:function(){ this.spinner.hide(); this.enable(); }, // on success, fill our result box with some 'feel good' text success:function(){ this.resultBox.text('Submitted, thanks!').fadeIn(100); this.textarea.val(''); }, // on error, fill our result box with an error message error: function(){ this.resultBox.text("Didn't work. Try again?").fadeIn(100); }, // These two functions disable/enable the form and toggle // the text of the submit button disable:function(){ this.submitButton.attr('disabled','disabled'). val('sending comment...'); }, enable:function(){ this.submitButton.removeAttr('disabled'). val(this.submitText); } }); |
Attach the behavior and you are done
So, the point of writing that behavior was to have an encapsulated idea of what my version of a Comment Form looks like. Now, I can go ahead and attach the behavior to an element or group of elements of my choice, either on dom load....
1 2 3 4 5 |
jQuery(function($) { // Find all of my comment forms and give them my behavior $('div.comment_form form').attach(CommentForm); }); |
...or attach it within another behavior (as I do on alonetone)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Track = $.klass({
// ...my track implementation...
// I want to create the CommentForm behavior on the fly.
// I'm going to call this function somewhere else in the Track Behavior
openCommentForm : function(){
// I use .attachAndReturn() because I want this.commentForm
// to refer directly to this instance so I can "talk to it" later.
// Also, notice that attachAndReturn is handing me back an array
this.commentForm = $('.comment_form form',this).attachAndReturn(CommentForm)[0];
}
});
|
For more...
I may write a bit more about behaviors, but until then, you can check out alonetone's github repo for more examples. It's not always pristine and pretty (it drives a production site), but have fun!
towel off with .present? - taking try() one step further
Chris over at ozmm.org wrote this great little method he calls try().
I liked the idea. Reduce
@person ? @person.name : nil |
to
@person.try :name |
Great. Factor out the conditional logic.
In my rails apps, and rails apps I've worked on, however, i see tons of this in controllers:
if params[:search] && !params[:search].empty? |
and this in views:
if @user.name and !@user.name.empty? |
I mean, yuk. So, you could use try() in these cases, but that doesn't deal with the whole empty? thang. What are we asking for in these conditional spaghetti code moments? Typcially, we don't care about the actual value, we want to know that something exists and it has a value worth using?
So, I've started using .present?
It works like this:
1 2 3 4 5 6 7 8 9 10 11 |
# check if an incoming param is useful if param.present? :search # heck, check two at a time (returns true if they are both useful) if param.present? :search, :query # check if our user has a name worth printing if @user.present? :name # check if that collection actually has anything useful in it if present? @users |
So that is the trick. Stop getting "busted" because your method isn't there. Stop wasting your finger time checking to see if it's got anything inside.
The code
Throw this boy into lib/goodies.rb (and make sure to require it) http://pastie.caboo.se/183911
The name
Yeah, present? kinda sucks. What would be better?
a better to_csv plugin
This is 90% a rip-off from the Active Record Extensions by Zach Dennis version of to_csv but extracted out and updated a bit (to rails 2.0 and a bit more friendly with your models).
It depends on fastercsv, a gem.
How it works
1 2 3 4 5 6 7 8 9 |
# just do the thang @reports.to_csv # include a relation @reports.to_csv(:include => :reporter) # change the column headers @reporters.to_csv(:headers => {'Contact Last Name' => 'last_name', 'Contact First Name' => 'first_name', 'Contact Email' => 'email'}) |
Try it out
1 2 3 |
sudo gem install fastercsv script/plugin install svn://svn.joots.com/public/plugins/to_csv |
Ruby iterators - collect, select, inject, reject, detect and friends (part I)
a.k.a. Blogging as a way to solidify knowledge and/or opinion.
a.k.a. Sometimes you gotta write things down to remember them.
Lets talk about iterators. These are the bread and butter of ruby. There is each, and then there are the lovely -ects. Reject. Select. Collect. Strong powerful verbs.
You typically call iterators with a block.
A block is either a chunk of code between curly brackets {} or a chunk of code between a do ... end
Iterators in RUBY (psst, not rails specific)
Yes, plain jane ruby. No fancy extensions by Rails. Hold your breath!
map and collect are the same thing.
map and collect return an array that contains the results of running the block with each item.
1 2 |
singles = [1,2,3,4] doubles = singles.collect { |i| i+i } #=> [2, 4, 6, 8] |
Get it? Lovely. For PHP heads: It's like you went to the trouble to initialize an array, build a for loop that goes to each number, doubles it, and adds it to the new array. Only without the work ;)
But maybe you want to modify the array in-place?
Simple. Bang!
1 2 |
[1,2,3,4].collect! { |i| i+i } #=> [2, 4, 6, 8] |
Use each to get fancy iterating
Let's say you want to do something more interesting with your array. You don't want to just create another array from going through each item, you want to do something more fancy.
1 2 3 |
story = "" ['once','upon','a','time'].each {|word| story << word << " "} |
select and find_all are the same thing
select can be confusing as a name. It just means "go through and select out the elements where my block is true." Maybe you have a basket of fruit, and you only want citrus. Assuming your fruits have a is_citrus? method, use select to get the tangy ones:
1 2 |
[Banana, Apple, Orange, Lemon].select { |fruit| fruit.is_citrus? } #=> [Orange, Lemon] |
reject
Reject is what you don't select - the opposite of select.
In other words, it'll "go through and select the elements where the block is false". So, your tummy is a bit on edge, and you are looking for fruits without too much citric acid:
1 2 |
[Banana, Apple, Orange, Lemon].reject { |fruit| fruit.is_citrus? } #=> [Banana, Apple] |
inject
An annoying named method, perhaps - the most powerful and typically last-learned of the ruby iterators. Inject? Like injection?
You can think of Inject as being the action and the result being an accumulation or gathering of what happens in the block.
Let's say you want to know the weight of your fruit basket:
1 2 |
[Banana, Apple, Orange, Lemon].inject{|total_weight, fruit| total_weight += fruit.weight } |
Inject also takes a default value for the accumulator (in this case, total_weight). So, let's say we want to weigh our fruits AND our basket:
1 2 |
[Banana, Apple, Orange, Lemon].inject(100){|total_weight, fruit| total_weight += fruit.weight } |
That will take 100 as the starting weight, go through each fruit, weigh it, and add it to the total.
Maybe the easiest way to remember Inject is "you have an extra variable to play with in the block which is returned to you at the end of the iterating"
To do the fruits example without inject would take this:
1 2 3 4 |
total_weight = 100 [Banana, Apple, Orange, Lemon].each {|fruit| total_weight += fruit.weight} total_weight |
a facebooker tutorial: launch an app with rails
Actually going somewhere with facebook and the rails facebooker plugin
Ok, so this isn't a complete how-to, or a all-inclusive guide, but hopefully it should cover the basics, and explain the tougher bits. Unfortunately developing for facebook doesn't (to me) feel as easy as it could. Facebook themselves went ahead and took the liberty of inventing, uhm, 4 Domain Specific Lanugages that you have to learn and then the facebooker library itself abstracts the real API calls into ruby-friendly goodness, bringing the total amount of information to absorb fairly high.
Thanks to recent work by the facebooker crew, integration with rails is relatively painless. If you are not a reader, but a doer, click this link to add David Clement's Fackbooker Tutorial Application to your facebook account.
I'm not going to take you on the 'how facebook applications work' ride. You can hop on that somewhere else. Oh, and if you are serious about getting an app going go join the facebooker list, cause you'll need the help
Oh, and this is for Rails 2.0.2 and facebooker as of January 2008. So, if you are in the future, maybe some stuff has changed (silver suits, melted icecaps, flying cars). Even in February some major changes have happened. Be prepared for change.
On facebook
Get on facebook. Add the developer application, and create a new facebook app. Edit the settings. They look like this:

Note the Callback Url. See how it is your domain there? Good. Keep it like that. If you are coming from rFacebook to facebooker, don't freak out, you want your plain jane domain there, bub.
On rails
Install the plugin
1 |
script/plugin install http://facebooker.rubyforge.org/svn/trunk/facebooker/
|
You'll get a file called config/facebooker.yml
This is different from the facebooker past, where you had to add manual config to an initializers file, etc. It is done when you install the plugin, so jump in and edit that file.
Routes
Ok. Let's start with routes. Pretend you built your app already. Wow, that was easy. Ok, now, someone added your application and is cruising your app inside facebook. They are digging it (maybe literally).
Did you work with rFacebook before? Then get this in your skull - don't try and play with callback_paths, canvas_paths, etc. Forget about it. It is easy. All incoming calls from facebook with your app's name on it are going to hit the root of your rails app. The root. What you say? You already have other stuff mapped to root? Yeah, cool. But you don't have other FACEBOOK stuff mapped to root, and so there is no need to worry. facebooker does a great job at seperating normal calls from facebook calls, so don't worry if you are overlapping your mapping and routes...the routing is smart and knows when it is talking with facebook.
Just remember: facebooker is hot. It makes life easier than you think. It is best you forget about the hard stuff and just write your rails code.
So, try this out in routes.rb
1 |
map.resources :profiles, :conditions=>{:canvas=>true} |
Yum! That looks familiar. That will give us create, update, destroy, and all that other stuff. That will generate fake restful routes. Fake? Fake because really facebook only will issue POSTs to your app. Restful because uhmm....they fake you out and look restful. Silly, but hey, easy to remember. Actually, forget I said anything. They are restful, ok? The only way this differs in reality from real rails restful routes (rrrrrr!) is that you are adding a condition: Canvas has to be true before this route will do anything for you. Where you do set canvas? Nowhere, facebooker handles that part. Just remember...if you want a route to respond to in-canvas calls, add the condition. If you want the route to respond to regular rails calls, uhm, just keep doing your thing as you normally would.
Ok, wait. There is one other difference with facebook routes. Because they only WANT TO BE restful, we can't use the same exact url helpers in all cases. Instead, we have to be a bit more explicit. So, if you want to get the url for deleting a profile it is destroy_profile_path(@profile). Get it? Here is an example:
1 2 3 4 5 6 7 8 9 10 |
# Generates the following routes: # # new_profile POST /profiles/new {:controller=>"profiles", :action=>"new"} # profiles POST /profiles/index {:controller=>"profiles", :action=>"index"} # show_profile POST /profiles/:id/show {:controller=>"profiles", :action=>"show"} # create_profile POST /profiles/create {:controller=>"profiles", :action=>"create"} # edit_profile POST /profiles/:id/edit {:controller=>"profiles", :action=>"edit"} # update_profile POST /profiles/:id/update {:controller=>"profiles", :action=>"update"} # destroy_profile POST /profiles/:id/destroy {:controller=>"profiles", :action=>"destroy"} |
Now remember, this call to map.resources ain't no hack on the inside, so you can do all your same fancy tricks as always, such as:
1 |
map.resources 'facebook', :controller => 'facebook_accounts', :member => {:add_thingy_to_profile => :post}, :collection => {:search => :get}, :conditions =>{:canvas => true} |
Oh, and normal routes work fine. For example, this might be a good time to map the root of your app to a facebook-friendly controller.
1 |
map.facebook_home 'facebook_home', :controller => 'facebook_accounts', :action => 'index', :canvas => true |
Controller stuff
Ok, so in the controller, you get two before filters. They are:
1 2 |
ensure_authenticated_to_facebook ensure_application_is_installed_by_facebook_user |
I'm not going to explain what they are because I know how smart you are. It is strange because you don't see 'before_filter' there, but don't worry, you can still do this:
1 |
ensure_authenticated_to_facebook :only => [:create, :update, :destroy] |
Ok, I will explain, just in case you are new. What happens with that before filter? If the user does not have the app installed, a magic redirect to login and/or install your application will occur.
What if you just want to check if the user has the app installed, but NOT redirect. You know, peep the situation a bit. Maybe you allow everyone to visit your facebook app's main page, but want to display special stuff for those that have installed your app:
1 |
application_is_installed? |
Everything you need is in the session
I'll repeat that. All fancy dancy calls you need to make to the facebook API you are going to do from the session. Like so:
Want to grab the friends of the current user?
1 |
@current_friends = session[:facebook_session].user.friends! |
The friends! method (with exclamation) will not only grab the friends, but grab the friends info (name, etc) and cache it in memory because it knows how often you need to check to see if you have friends, remember where they live, and remember how many you have.
Wont to set the user's profile box code? This will do it if you have a profile partial:
1 |
session[:facebook_session].user.profile_fbml = (render_to_string :partial => 'profile') |
See, you have to render to string, because you are actually posting that data for facebook to store on it's servers.
redirects are smart (of course), so you can do
1 |
redirect_to facebook_user_path |
It knows if you are in the facebook canvas (aka, your app is running within facebook) to redirect to a proper in-canvas url (like http://apps.facebook.com/yourapp/facebook_user/345 )
Organizing your app
I'm not going to tell you how to run your ship. My facebook app is in the same app as a larger rails app. So what did I do? Just created a new model and controller called facebook_accounts, and put all my facebook related stuff there. I have a little before filter that runs on all actions:
1 2 3 4 |
def find_facebook_user @facebook_user = session[:facebook_session].user @facebook_account = FacebookAccount.find_or_create_by_fb_user_id(@facebook_user.id) end |
Actually, my facebook controller isn't very restful, but I don't really care. I dont need it to be. M
Useful things
You probably want to save some of the facebook junk inside your trunk.
Well, you are going to need a big trunk. Facebook has a lot of users, and you'll need to get all BIGINT on it if you want to store facebook ids in your DB.
As far as I know, facebooker doesn't help you out with models. I think it should be kept that way. Personally, my users are my users, and my facebook_users are my facebook_users.
If you are storing the facebook users, you need to BIGINT the DB column that is storing the facebook user id. Add the following to a migration, but make sure you specify whatever table and column YOU are using. You probably have something more sane than 'fb_user_id' as your column name, right? Good. This is what it looks like for MySQL:
1 |
execute("alter table facebook_accounts modify fb_user_id bigint")
|
Views
Same story. Rails is smart, facebooker is smart. What do you want to generate when inside the facebook canvas? FBML. Ok, so name your views like so:
1 |
profile.fbml.erb |
or if you are funky and like HAML
1 |
profile.fbml.haml |
rFacebook users, don't flinch. You don't need to do a single other thing (like set a before filter or manually set the format, or any of the Giant Robots rFacebook tutorial stuff). Just name your views right.
In the views, link_to will detect if you are in facebook canvas or not and write the appropriate path. Same with image_tag. If you are running a normal rails app together with facebook stuff....no worries, it is smart, like we said. It won't touch your link_to, buddy.
There are a handful of special view helpers to help you avoid dealing with FBML. Most notably, facebook_form_for, fb_profile_pic...uhm...fb_pronoun...yeah, the list goes on, check Facebooker::Rails::Helpers and don't try and write all that FBML bullshit by yourself. Use ruby, dude(ette). Actually, do FBML if you like that. It is your choice - poke around the facebook documentation and write FBML or poke around rdoc (yuk) and write rubyish things.
Flash Messages
If you know rails, you know flash[:error] and flash[:notice]
Use those as normal in your controller, and place this in your views:
1 |
<%= facebook_messages %>
|
You may find yourself backing away from using linkto, and using urlfor more often because of the way facebook demands forms and stuff like that. Please note that if the page being rendered is being rendered in canvas, you will always get your canvaspath prepended to the url. Say that ten times fast. That means linkto is always going to keep you in the canvas, and won't let you link to your main rails app or anywhere outside of http://apps.facebook.com/yourappname. If you DO want to escape the jail that the facebook canvas is (for example linking to an external file, a download, whatever) then you can use the option :canvas => false like so:
1 |
url_for :controller => 'blah', :action 'blee', :canvas => false |
One strange thing about the facebook_form_for is that it is a bit unintuitive if you want to build an url from a hash (not a helper):
1 |
facebook_form_for :asset, asset, :url => (url_for(:controller => 'profile', :action => 'add_to_profile', :id => asset.id)) |
Didn't quite get why it is like that. The code seems to say that whatever goes to the :url option gets passed directly to the form action.
Try it out, the smart way
The facebooker rails plugin also comes with a tunnel task. rFacebook folks know about this: facebook has it too, don't worry. If you are new, listen up, this is a big deal: This lets you develop your facebook app locally, but view and test out your app live on apps.facebook.com. Get it? You don't have to deploy anything, though you do need to have a production server setup somewhere and then generate this config file.
1 |
rake facebooker:tunnel:configure to create a blank config in config/tunnel.yml |
Edit that file, then run
1 |
rake facebooker:tunnel:start |
What this does is route all requests from your production server to your local machine. A proxy. It means, when facebook comes asking for something, your little localhost-that-could is serving it what it needs.
For this to work, you need to go and edit your facebook application's settings (on facebook itself) and make sure the callback url to be http://yourpublicsite.com:8888 like I did -replace the 8888 with whatever port you want to be using. Also, you may want to change the ssh timeout on your server so that it can just hang there forever. Otherwise you may get booted from the server if you wait a whole gosh darn 2 minutes between requests.
Nothing to do with shame, but indeed a pliggity plug
Hey, I learned facebooker and wrote this article to do one thing. Build my baby alonetone, a kickass home for musicians to upload and share their tunes. Musicians are kinda screwed these days and being taken advantage of left and right. DIY musicians and independent musicians have very little in the way of real, down home options. alonetone is an alternative to the sketchy other musician homes out there. It cost nothing, and yet music makers get everything they need (and nothing they don't need). We don't run ads, it is built by a musician (me) and is non-commercial (I'm personally losing money).
If this article helped you out, do me a favor and the next time a musician friend asks you where s/he can upload their stuff, tell them alonetone.com will give them a good home.
Make your test data realistic with faker and then some
Our latest Rails project is getting a fair bit of use out of the great faker gem, which allows one to generate loads of bullshit-but-real-looking data like names, emails, addresses, etc. Forget lorem ipsum or tedious manual entry, faker is the way to go for simulating the real world.
But wait, I want my app to go one step further. I need to populate my app with a lot of test data, and I don't want it all uniform, I want it random and sketchy like how it REALLY goes down, you know?
Check it:
Email is not required, and so only sometimes is it actually entered:
1 2 3 4 |
sometimes do user.email = Faker::Internet.email end |
Maybe 80% of your fake orders have have a fake discount:
1 2 3 4 |
80.percent_of_the_time do order.line_items.build(:amount => -1000, :name => 'bulk discount') end |
Maybe each fake reservation in your system can have somewhere between 0 to 4 fake attendees:
1 2 3 4 5 |
(0..4).times do reservation.attendees.build(:last_name => Faker::Name.last_name, :first_name => Faker::Name.first_name, :attendee_type => AttendeeType.find(:all).rand) end |
Anywho, you get the drift. The faker library kicks ass.
To have as much fun as I'm having throw this into your lib directory.
Use it in migrations or directly in SomeModel.create_bullshit_data! class method. Heck, use it in your controllers to give a little more flavor to the user experience.
1 2 |
5.percent_of_the_time { flash[:notice] = 'We are watching you' } |
alonetone gets a flash player and itunes support
In the home stretch to bring alonetone to version 1 (yeah, I’ve been saying it for weeks, but we’re finally getting there, folks) alonetone gets a flash player.
That means? For any playlist on alonetone, click share, copy the code, and you get this:
and for single songs:
Exciting, eh?
Oh, and we’re dynamically generating podcasts for every user now. What fun! Submit them to apple, and in 3 days your latest music shows up in iTunes. Oooooooh.
The facebook application should be rolling in the next two weeks, and then I’m going to take a nice little vacation from programming in my free time and get back to the music.
The 48 hour countdown to alonetone.com

Most of the hard work is done, so I'm going to release the first version of alonetone sometime in the next two days!
The feature set it is launching with is nice and simple:
- Upload mp3s (unlimited and unmetered) several at a time
- Browse the music of others, stream each song live or download
- Create albums/playlists of your own and other's mp3s
- Browse what other people have been listening to
- Get stats about who/when/where people are listening to your music
- A plethra of sharing/exporting options
- No advertisements making money off your music or companies with mysterious agendas
- No promises of this being the first step to your fabulous career
- Created and maintained by an actual user of the site (that'd be moi!)
Watch this space for the link so you can be one of the first to try it out!
Help! tell me which alonetone.com logo YOU would choose
Hi!
I've been pouring 80% of my free creative energy towards getting the first iteration of aLoneTone.com online.
What is alonetone?
- A "home" for DIY musicians to easily and freely upload, publish, share, and organize their own music
- A way for musicians to more easily connect to a shared audience (bypassing industry, taking advantage of our collective network, etc)
- A place where listeners and fans of the musicians can "reach through the musicians they know" and find other artists making great free music.
How is alonetone different then XYZ?
- Not a company, just a community. Free of advertising or costs. Music centered, not industry centered.
- No hype, or imaginary promises of this being 'first step to get into the industry!!!!'
- Makes it much simpler then existing tools to share and track listens on uploaded music, without limits or charges.
- Casual listeners and passerbys are presented with the favorites of the artist community. If they are visiting one artist they know/love, they have the option explore the site from the point of view of that artist's taste.
Really, when it first launches (really really soon now) it's going to be a pretty basic tool for artists. We'll see what direction it takes.
So - I would love your help in picking a logo. 3 wonderful and talented designers have been kind enough to cook up one or two logos each, and we now have so many choices for a logo that I really can't settle on anything. Each of these is just a first sketch, so just let me know which one captures you the most!
Here they are, let me know what you think in the comments:

New Open Source Model needed?
A good friend of mine, Samo, and I are about to release a piece of ruby/rails code as open source.
I've used open source stuff for years, and been active in a community or two, and been a lurking community member in dozens of projects.
I'm most attracted by the people. The attitude. The culture. What makes everything tick. Why it is free. What motivates people. What is going on here.
I don't "get" two things about open source:
- One codebase +one group of leaders = one slow-moving project + lots of left out opinions
- Projects are abandoned or worked on forever, but never given the stamp of approval: "It's Done"
I'll start with the first:
It seems that with mature open source projects, hundreds of people want to get involved. They don't. They voice opinion, and either often get turned away, or go unheard. It's simply impossible for the group of programmers heading the project to really steer the project, do the work, and respond to every last request.
My question is: Why one code base? Why doesn't everyone get a branch to work with, and the core developers are in charge of merging 'the best of the best' ?
I'll come right out and say it. Open source is not open. It's "if you obey our rules, follow our vision, and do work that is just as good as we do" source.
On top of that it's slow. The more people involved (in the current model), the more communication required, the more difference in opinion, the less "Ok, I'll just get it done" attitude.
My real bone to pick is the quantity of discussion needed to get software to move forward. Still. You'd think we'd be more efficient then having one subversion trunk with 12 core members and 100's of people playing catch up trying to write timely patches while the code runs away from them.
The second:
What's up with the need to constantly improve and add and change and...version after version. Is it just the truth that all open source starts out incomplete and buggy, and exponentially slows down as it approaches 'perfect' to a snail's pace?
What's up with "abandoned"? How about - "I/We solved my/our needs" and moved on?
UPDATE: I'm liking git! It seems to answer exactly this issue!
First day of Work.
As of today, I'm working as a partner at Joots.
Rails will be the name of the game.
Technoblogging
Hello.
I work as a programmer / internet guru in Innsbruck Austria. Part of my job now entails writing regular technical articles, both for my company blog and for the official Typo3 blog. Fun stuff. It's only worth checking out if you a) are a computer geek or b) you are shamelessly obsessed with any of my current activity or b) you are really bored.
Enjoy!
(T minus 1 day until Golden Studios is up and running!)
sudara