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 commentsRuby 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 commentsRuby In Steel Developer Announced
No commentsSapphireSteel 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
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 commentDHH 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 commentsYay, 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