Sasha Sydoruk

Building a better mousetrap with XHTML, AJAX and RSS

Archive for the 'Ruby On Rails' Category

C# vs Ruby Smackdown!

Finally I get to write a “smackdown” post. I had this post written for a while now, but just never got to publish it.

Here is my completely non-scientific comparison of C# and Ruby. I will come up with a simple task and will attempt to implement it in both languages. The results will be shown, but no analysis will be available; I don’t want to pick sides because I really like both languages and want to stay on good terms with both of them.

Enough of disclaimers, here is the task. Create a Day class and populate a collection of instances of class Day to represent a week. Display the week in the original order, reverse the order of the days, display the new order, restore the original order, show only the work day and show only the weekends.

Here is the expected output:

Regular Order
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday

Reversed Order
Sunday, Saturday, Friday, Thursday, Wednesday, Tuesday, Monday

Regular Order
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday

Work Week
Monday, Tuesday, Wednesday, Thursday, Friday

Weekend
Saturday, Sunday

Here is how I did it in C#:

   1:  using System;
   2:  using System.Collections;
   3:  using System.Collections.Generic;
   4:  
   5:  namespace RubyCsExample
   6:  {
   7:      internal class Example
   8:      {
   9:          public static void Main()
  10:          {
  11:              List<Day> daysOfWeek = Day.CreateWeek();
  12:              DisplayDays(daysOfWeek, “Regular Order”);
  13:  
  14:              //Reverse the order of the days
  15:              daysOfWeek.Sort(delegate(Day one, Day two)
  16:                                  {
  17:                                      return
  18:                                          (Comparer.Default.Compare(one.Ordinal,
  19:                                                                    two.Ordinal)*-1);
  20:                                  });
  21:              DisplayDays(daysOfWeek, “Reversed Order”);
  22:  
  23:              //Restore the order
  24:              daysOfWeek.Sort();
  25:              DisplayDays(daysOfWeek, “Regular Order”);
  26:  
  27:              //Show work week
  28:              DisplayDays(daysOfWeek.FindAll(delegate(Day d)
  29:                                                 {
  30:                                                     return !d.IsWeekend;
  31:                                                 }), “Work Week”);
  32:  
  33:              //Show weekends
  34:              DisplayDays(daysOfWeek.FindAll(delegate(Day d)
  35:                                                 {
  36:                                                     return d.IsWeekend;
  37:                                                 }), “Weekend”);
  38:  
  39:  
  40:              Console.ReadKey();
  41:          }
  42:  
  43:          public static void DisplayDays(List<Day> days, string message)
  44:          {
  45:              if (!string.IsNullOrEmpty(message))
  46:              {
  47:                  Console.WriteLine(message);
  48:              }
  49:              List<string> names = days.ConvertAll(new Converter<Day, string>(delegate(Day d)
  50:                                                                                  {
  51:                                                                                      return d.Name;
  52:                                                                                  }));
  53:              Console.WriteLine(string.Join(“, “, names.ToArray()) + “nn”);
  54:          }
  55:      }
  56:  
  57:      internal class Day : IComparable<Day>, IComparable
  58:      {
  59:          private string name;
  60:          private int ordinal;
  61:          private bool isWeekend;
  62:  
  63:          public Day(string name, int ordinal, bool isWeekend)
  64:          {
  65:              this.name = name;
  66:              this.ordinal = ordinal;
  67:              this.isWeekend = isWeekend;
  68:          }
  69:  
  70:          public string Name
  71:          {
  72:              get { return name; }
  73:              set { name = value; }
  74:          }
  75:  
  76:          public int Ordinal
  77:          {
  78:              get { return ordinal; }
  79:              set { ordinal = value; }
  80:          }
  81:  
  82:          public bool IsWeekend
  83:          {
  84:              get { return isWeekend; }
  85:              set { isWeekend = value; }
  86:          }
  87:  
  88:          public static List<Day> CreateWeek()
  89:          {
  90:              List<Day> days = new List<Day>(7);
  91:  
  92:              days.Add(new Day(“Monday”, 1, false));
  93:              days.Add(new Day(“Tuesday”, 2, false));
  94:              days.Add(new Day(“Wednesday”, 3, false));
  95:              days.Add(new Day(“Thursday”, 4, false));
  96:              days.Add(new Day(“Friday”, 5, false));
  97:              days.Add(new Day(“Saturday”, 6, true));
  98:              days.Add(new Day(“Sunday”, 7, true));
  99:  
 100:              return days;
 101:          }
 102:  
 103:          public int CompareTo(Day other)
 104:          {
 105:              return Comparer.Default.Compare(Ordinal, other.Ordinal);
 106:          }
 107:  
 108:          public int CompareTo(object obj)
 109:          {
 110:              return Comparer.Default.Compare(Ordinal, ((Day) obj).Ordinal);
 111:          }
 112:      }
 113:  }

As you can see, it took me 113 lines to achieve the required result. I am using Generics and some fancy stuff from List<>. You will need C# 2.0 to achieve similar results.

And here is the Ruby way of doing things:

   1:  class Day
   2:    attr_accessor :name, :ordinal, :is_weekend
   3:  
   4:    def initialize(name = :NotSet, ordinal = -1, is_weekend = false)
   5:      self.name, self.ordinal, self.is_weekend = name, ordinal, is_weekend
   6:    end
   7:  
   8:    def to_s
   9:      name
  10:    end
  11:  
  12:    def <=>(other_day)
  13:      self.ordinal <=> other_day.ordinal
  14:    end
  15:  
  16:    def Day.create_week
  17:      days = Array.new
  18:  
  19:      days << Day.new(:Monday, 1, false)
  20:      days << Day.new(:Tuesday, 2, false)
  21:      days << Day.new(:Wednesday, 3, false)
  22:      days << Day.new(:Thursday, 4, false)
  23:      days << Day.new(:Friday, 5, false)
  24:      days << Day.new(:Saturday, 6, true)
  25:      days << Day.new(:Sunday, 7, true)
  26:  
  27:      return days
  28:    end
  29:  
  30:  end
  31:  
  32:  def self.display_days(days, message = nil)
  33:    puts “#{message}n” if message
  34:    puts days.map{|day| day.name}.join(‘, ‘)
  35:    puts “nn”
  36:  end
  37:  
  38:  days_of_week = Day.create_week
  39:  
  40:  display_days(days_of_week, ‘Regular Order’)
  41:  
  42:  #Reverse the order of the days
  43:  days_of_week.sort!{ |a, b| (a <=> b) * -1 }
  44:  
  45:  display_days(days_of_week, ‘Reversed Order’)
  46:  
  47:  #Restore the order
  48:  days_of_week.sort!
  49:  
  50:  display_days(days_of_week, ‘Regular Order’)
  51:  
  52:  #Show work week
  53:  display_days(days_of_week.find_all{|day| !day.is_weekend}, ‘Work Week’)
  54:  
  55:  #Show weekends
  56:  display_days(days_of_week.find_all{|day| day.is_weekend}, ‘Weekend’)

As you can Ruby implementation took only 56 lines to achieve the required result.

Conclusion? I had a lot of fun playing with both languages. Give both languages a try!

12 comments

Ruby On Rails 1.2 is out! Yay!

Get out your party balloons and funny hats because we’re there, baby. Yes, sire, Rails 1.2 is finally available in all it’s glory. It took a little longer than we initially anticipated to get everything lined up (and even then we had a tiny snag that bumped us straight from 1.2.0 to 1.2.1 before this announcement even had time to be written).

Rails 1.2: REST admiration, HTTP lovefest, and UTF-8 celebrations

No comments

Ruby In Steel Developer Announced

SapphireSteel Software today formally announced Ruby In Steel Developer – the only professional Ruby programming environment for Microsoft’s Visual Studio 2005.

Ruby In Steel Developer provides a full suite of editing and debugging tools for Ruby and Ruby On Rails (‘Rails’) developers. Product highlights include:

Editing
- Ruby and Rails (RHTML) code coloring
- Ruby and Rails code folding/collapsing
- Smart Indenting and code formatting
- Ruby auto-expand snippets

Debugging
- Ultra-fast integrated debugger
- Step-Into/Step-Over/Step-Out tracing
- ‘Drill-down’ watch variables
- Interactive ‘run and debug’ console

IntelliSense
- Accurate (by class and scope) member completion
- Parameter completion tooltips
- Class and method documentation in tooltips
- Code navigation drop-down combos over the editor

Ruby On Rails
- Import Existing Ruby On Rails Projects
- Rails Toolbar and script-runner dialogs
- RHTML / HTML switchable editor
- One-click Rails Debugger

A complete feature list can be found on the SapphireSteel web site:
Feature List

No comments

Mike Gunderloy and Microsoft

Well, it looks like the journey is over.

Mike Gunderloy of Larkware fame is trying to remove Microsoft and everything Microsoft related from his life.

Choosing to use Microsoft software as the basis for my work, whatever else it may do, contributes to the growth and health of Microsoft. It supplies funds for Microsoft’s continued initiatives in the area of intellectual property and DRM. And it seems to me that the ultimate consequence of these initiatives will be to limit my own freedom of action, both as a software user and a software developer.

This is taken from A Fresh Cup - Mike’s new blog that details his exploration of non-Microsoft technologies as a way to earn a living. So far it looks very intriguing and I am already subscribed to the feed. Currently Mike is evaluating Ubuntu and Ruby on Rails.

This reminds me somewhat of Softies On Rails. The guys from Softies On Rails were originally ASP.NET developers that later completely switched to Ruby On Rails and never looked back. Here is the post - Rails is (officially) life-changing. And here is some more - Why Rails? Part 1: Microsoft pisses me off, Why Rails? Part 2: All the Cool Kids Are Doing It, Why Rails? Part 3: Ruby, Why Rails? Part 4: Because It’s Free and Why Rails? Part 5: Because I Can Test It.

A Fresh Cup looks like it is going to be a great blog and I can’t wait for more posts. Good luck Mike on your journey and make sure you blog the details.

No comments

What is wrong with Typo?

No wonder people are switching from Typo. For at least a month I have been getting the following message:

Bad Gateway

The proxy server received an invalid response from an upstream server.


Apache/2.0.52 (CentOS) Server at www.typosphere.org Port 80

What the hell is going on? Is this the end of Typo? I hope they get their stuff together.

1 comment

DHH respondes to Joel Spolsky’s remarks about Ruby and Rails

or using Digg terminology - Joel vs DHH smackdown!!!

If you didn’t read Joel Spolsky’s “Language Wars”, please read it now. And now go read DHH’s response to the article -  Fear, Uncertain, and Doubt by Joel Spolsky.

I happen to like both technologies involved in the smackdown. ASP.NET and C# pay my mortgage and Rails is really enjoyable to work with and I am planning to spend more time learning it.

Currently I am concentrating on C# because I am studying for MCTS 70-536 - .NET Framework 2.0 Application Development Foundation, but when “Agile Web Development with Rails—Second Edition” comes out - I will buy it.

I am very interested to see how this story develops…

No comments

Yay, Streamlined v0.0.4 has been released!

New version of Streamlined v0.0.4 has been released. Streamlined is an excellent way to create admin portions for your Ruby on Rails applications. What does one get by using Streamlined? Well, one will get list, detail and edit pages for all the models in your application and also an admin facility to manage relationships between the models.

To get latest version of “Streamlined” go here. To see a screencast highlighting great features go here.

No comments