From jeff at jumpstartlab.com Wed Mar 2 10:01:10 2011 From: jeff at jumpstartlab.com (Jeff Casimir) Date: Wed, 2 Mar 2011 07:01:10 -0800 Subject: [raleigh.rb] No West End meetup for March, Ruby Primer course instead In-Reply-To: References: Message-ID: Hi all, We have about three seats left for tonight. If you'd like to join us, signup here: http://jumpstartlab.com/trainings/13-ruby-raleigh - Jeff --- Jeff Casimir Jumpstart Lab by Casimir Creative, LLC http://jumpstartlab.com @jumpstartlab on twitter On Wed, Feb 23, 2011 at 11:04 AM, TJ Stankus wrote: > This is just a reminder that in lieu of our regular monthly West End > Ruby meetup, on March 2nd Carrboro Coworking is hosting a FREE Ruby > Primer Course, taught by Jeff Casimir of Jump Start Lab. > > http://jumpstartlab.com/trainings/13-ruby-raleigh > > Jeff has a reputation as an awesome teacher. This is a great > opportunity for anyone who's looking to get going with Ruby. It looks > like there are some spots left, too! > > If you're planning to attend, please note the course starts at 6pm. > > We'll resume regular West End meetups in April. > > -TJ > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > From nathaniel at talbott.ws Wed Mar 2 13:50:55 2011 From: nathaniel at talbott.ws (Nathaniel Talbott) Date: Wed, 2 Mar 2011 13:50:55 -0500 Subject: [raleigh.rb] Carrburritos at 5 Message-ID: I'm hitting up Carrburritos at 5 tonight before crashing the Ruby Primer for an hour so. Would love to have company! http://t.co/GtOidTF -- Nathaniel Talbott <:((>< From efg at ncsu.edu Fri Mar 4 11:47:55 2011 From: efg at ncsu.edu (Ed Gehringer) Date: Fri, 04 Mar 2011 11:47:55 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces Message-ID: <4D70D171.7D16.00A7.1@gw.ncsu.edu> We are going to use a module to act as an interface, as described in http://www.chrisdavaz.com/blog/how-to-enforce-interfaces-in-ruby Is there any convention for naming an interface, e.g., the interface for a contributor object should be called "contributor-interface"? Thanks, Ed -------------- next part -------------- An HTML attachment was scrubbed... URL: From rick.denatale at gmail.com Fri Mar 4 13:29:03 2011 From: rick.denatale at gmail.com (Rick DeNatale) Date: Fri, 4 Mar 2011 13:29:03 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: <4D70D171.7D16.00A7.1@gw.ncsu.edu> References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> Message-ID: IMHO, the right answer to questions like this is MU http://en.wikipedia.org/wiki/Mu_(negative) This idea is cargo culting an idea from languages like C++ and Java. If you want a statically typed language use one, Ruby is perfectly fine without such stuff. Of course I might be wrong On Fri, Mar 4, 2011 at 11:47 AM, Ed Gehringer wrote: > We are going to use a module to act as an interface, as described in > http://www.chrisdavaz.com/blog/how-to-enforce-interfaces-in-ruby > Is there any convention for naming an interface, e.g., > > the interface for a contributor object should be called > "contributor-interface"? > > Thanks, > Ed > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -- Rick DeNatale Blog: http://talklikeaduck.denhaven2.com/ Github: http://github.com/rubyredrick Twitter: @RickDeNatale WWR: http://www.workingwithrails.com/person/9021-rick-denatale LinkedIn: http://www.linkedin.com/in/rickdenatale From mshiltonj at gmail.com Fri Mar 4 13:44:56 2011 From: mshiltonj at gmail.com (Steven Hilton) Date: Fri, 4 Mar 2011 13:44:56 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: <4D70D171.7D16.00A7.1@gw.ncsu.edu> References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> Message-ID: Curious: Are you going to be able to enforce return values and parameters lists as well as the method name? Also, when is interface adherence going to be enforced? During run time? Why not put such interface enforcement in test suite, out of production code? As for naming: Foo # The Foo Interface FooImpl # The Implementation of the Foo Interface. Yo dawg, I herd you like to java, so I put some java in your ruby, so you can java while you ruby. On Fri, Mar 4, 2011 at 11:47 AM, Ed Gehringer wrote: > We are going to use a module to act as an interface, as described in > http://www.chrisdavaz.com/blog/how-to-enforce-interfaces-in-ruby > Is there any convention for naming an interface, e.g., > > the interface for a contributor object should be called > "contributor-interface"? > > Thanks, > Ed > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > From tcrawley at gmail.com Fri Mar 4 11:04:27 2011 From: tcrawley at gmail.com (Tobias Crawley) Date: Fri, 4 Mar 2011 11:04:27 -0500 Subject: [raleigh.rb] Interested in a talk on TorqueBox? Message-ID: I'm looking for opportunities to talk about TorqueBox (http://torquebox.org) - would you guys be interested? If you haven't heard of TorqueBox - it's a ruby application server built on top of JBoss AS (using JRuby), and has integrated messaging, asynchronous processing, scheduled jobs, clustering, and more. I'm a member of the TorqueBox team. I live in Asheville, but would be happy to make the drive down. Toby -------------- next part -------------- An HTML attachment was scrubbed... URL: From efg at ncsu.edu Fri Mar 4 14:08:41 2011 From: efg at ncsu.edu (Ed Gehringer) Date: Fri, 04 Mar 2011 14:08:41 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: <4D70D171.7D16.00A7.1@gw.ncsu.edu> References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> Message-ID: <4D70F26B.7D16.00A7.1@gw.ncsu.edu> I meant "contributor_interface", of course :-) >>> "Ed Gehringer" 3/4/2011 11:47 AM >>> We are going to use a module to act as an interface, as described in http://www.chrisdavaz.com/blog/how-to-enforce-interfaces-in-ruby Is there any convention for naming an interface, e.g., the interface for a contributor object should be called "contributor-interface"? Thanks, Ed -------------- next part -------------- An HTML attachment was scrubbed... URL: From efg at ncsu.edu Fri Mar 4 14:30:44 2011 From: efg at ncsu.edu (Ed Gehringer) Date: Fri, 04 Mar 2011 14:30:44 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> Message-ID: <4D70F796.7D16.00A7.1@gw.ncsu.edu> I think you do have it wrong, Rick. We have a good application of unbounded polymorphism, where we have a receiver that may be a member of classes that are not in the same inheritance hierarchy. That's definitely impossible in C++ or Java. If we write code for a class that uses this unbounded polymorphism, we want a way to inform the programmer as soon as possible if the class lacks a method that might be invoked polymorphically. Thanks, Ed >>> Rick DeNatale 3/4/2011 1:29 PM >>> IMHO, the right answer to questions like this is MU http://en.wikipedia.org/wiki/Mu_(negative) ( http://en.wikipedia.org/wiki/Mu_(negative) ) This idea is cargo culting an idea from languages like C++ and Java. If you want a statically typed language use one, Ruby is perfectly fine without such stuff. Of course I might be wrong On Fri, Mar 4, 2011 at 11:47 AM, Ed Gehringer wrote: > We are going to use a module to act as an interface, as described in > http://www.chrisdavaz.com/blog/how-to-enforce-interfaces-in-ruby > Is there any convention for naming an interface, e.g., > > the interface for a contributor object should be called > "contributor-interface"? > > Thanks, > Ed > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -- Rick DeNatale Blog: http://talklikeaduck.denhaven2.com/ Github: http://github.com/rubyredrick Twitter: @RickDeNatale WWR: http://www.workingwithrails.com/person/9021-rick-denatale LinkedIn: http://www.linkedin.com/in/rickdenatale _______________________________________________ raleigh-rb-members mailing list raleigh-rb-members at rubyforge.org http://rubyforge.org/mailman/listinfo/raleigh-rb-members -------------- next part -------------- An HTML attachment was scrubbed... URL: From crnixon at gmail.com Fri Mar 4 14:39:32 2011 From: crnixon at gmail.com (Clinton R. Nixon) Date: Fri, 4 Mar 2011 14:39:32 -0500 Subject: [raleigh.rb] Interested in a talk on TorqueBox? In-Reply-To: References: Message-ID: On Fri, Mar 4, 2011 at 11:04 AM, Tobias Crawley wrote: > I'm looking for opportunities to talk about TorqueBox (http://torquebox.org) > - would you guys be interested? I'd very much like to know more about TorqueBox. It's seemed interesting to me, but a little overwhelming. -- Clinton R. Nixon From nathaniel at talbott.ws Fri Mar 4 14:55:13 2011 From: nathaniel at talbott.ws (Nathaniel Talbott) Date: Fri, 4 Mar 2011 14:55:13 -0500 Subject: [raleigh.rb] Interested in a talk on TorqueBox? In-Reply-To: References: Message-ID: On Fri, Mar 4, 2011 at 11:04 AM, Tobias Crawley wrote: > I'm looking for opportunities to talk about TorqueBox (http://torquebox.org) > - would you guys be interested? > If you haven't heard of TorqueBox - it's a ruby application server built on > top of JBoss AS (using JRuby), and has integrated messaging, asynchronous > processing, scheduled jobs, clustering, and more. > I'm a member of the TorqueBox team. I live in Asheville, but would be happy > to make the drive down. Hey Toby, sounds intriguing, but: tell us a bit more why the average Rubyist/Railsor should definitely be rocking some TorqueBox. I.e. how might it change our behavior if we learn more about it? -- Nathaniel Talbott <:((>< From mriffe at gmail.com Fri Mar 4 16:07:24 2011 From: mriffe at gmail.com (Mel Riffe) Date: Fri, 4 Mar 2011 16:07:24 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: <4D70F796.7D16.00A7.1@gw.ncsu.edu> References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> <4D70F796.7D16.00A7.1@gw.ncsu.edu> Message-ID: Ed, I'm a little slow these days, please forgive me, but can you please explain: We have a good application of unbounded polymorphism, where we have a receiver that may be a member of classes that are not in the same inheritance hierarchy. ?That's definitely impossible in C++ or Java. I'm not familiar with the phrase 'unbounded polymorphism' or its mechanics. Cheers, Mel On Fri, Mar 4, 2011 at 2:30 PM, Ed Gehringer wrote: > I think you do have it wrong, Rick. > > We have a good application of unbounded polymorphism, where we have a > receiver that may be a member of classes that are not in the same > inheritance hierarchy. ?That's definitely impossible in C++ or Java. > > If we write code for a class that uses this unbounded polymorphism, we want > a way to inform the programmer as soon as possible if the class lacks a > method that might be invoked polymorphically. > > Thanks, > > Ed > >>>> Rick DeNatale 3/4/2011 1:29 PM >>> > > IMHO, the right answer to questions like this is MU > http://en.wikipedia.org/wiki/Mu_(negative) > > This idea is cargo culting an idea from languages like C++ and Java. > If you want a statically typed language use one, Ruby is perfectly > fine without such stuff. > > Of course I might be wrong > > On Fri, Mar 4, 2011 at 11:47 AM, Ed Gehringer wrote: >> We are going to use a module to act as an interface, as described in >> http://www.chrisdavaz.com/blog/how-to-enforce-interfaces-in-ruby >> Is there any convention for naming an interface, e.g., >> >> the interface for a contributor object should be called >> "contributor-interface"? >> >> Thanks, >> Ed >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> > > > > -- > Rick DeNatale > > Blog: http://talklikeaduck.denhaven2.com/ > Github: http://github.com/rubyredrick > Twitter: @RickDeNatale > WWR: http://www.workingwithrails.com/person/9021-rick-denatale > LinkedIn: http://www.linkedin.com/in/rickdenatale > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > From tcrawley at gmail.com Fri Mar 4 16:23:32 2011 From: tcrawley at gmail.com (Tobias Crawley) Date: Fri, 4 Mar 2011 16:23:32 -0500 Subject: [raleigh.rb] Interested in a talk on TorqueBox? In-Reply-To: References: Message-ID: Sure thing: TorqueBox is more than just a "webserver + ruby interpreter" - it's a real ruby application server. So, out of the box, it provides (among other things): * asynchronous processing (using messaging) without having to setup and manage DelayedJob/Resque/what-have-you * scheduled jobs without dealing with external cron jobs * clustering, with web session affinity, and automatic messaging distribution All of which are configured and managed from within your app codebase, and share the lifecycle of your app. Therefore, if you undeploy or redeploy your app, these components are automatically undeployed or redeployed along with it, preventing them from getting out of sync, which can happen if they are external services. It uses JRuby, which provides speed, and proper threading. It is built on top of JBoss AS 6, which gives is stable and performant. Even though it is built on top of a Java application server, you can build and deploy applications without touching a line of XML or Java. It's under active development (we're rapidly approaching or 1.0RC1 release, with 1.0Final targeted for May), and is in use in production by a handful of 'customers' at this point. Is that enticing? It was to me, that's why I joined the TorqueBox team :) Toby On Fri, Mar 4, 2011 at 2:55 PM, Nathaniel Talbott wrote: > > > Hey Toby, sounds intriguing, but: tell us a bit more why the average > Rubyist/Railsor should definitely be rocking some TorqueBox. I.e. how > might it change our behavior if we learn more about it? > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From korebantic at gmail.com Fri Mar 4 17:03:22 2011 From: korebantic at gmail.com (korebantic) Date: Fri, 4 Mar 2011 17:03:22 -0500 Subject: [raleigh.rb] Interested in a talk on TorqueBox? In-Reply-To: References: Message-ID: I think it is (interesting). But I'm scared Steven may start the meeting with some Yo dawgin' LOL All BS aside +1 from me. On Fri, Mar 4, 2011 at 4:23 PM, Tobias Crawley wrote: > Sure thing: > > TorqueBox is more than just a "webserver + ruby interpreter" - it's a real > ruby application server. So, out of the box, it provides (among other > things): > > * asynchronous processing (using messaging) without having to setup and > manage DelayedJob/Resque/what-have-you > * scheduled jobs without dealing with external cron jobs > * clustering, with web session affinity, and automatic messaging > distribution > > All of which are configured and managed from within your app codebase, and > share the lifecycle of your app. Therefore, if you undeploy or redeploy your > app, these components are automatically undeployed or redeployed along with > it, preventing them from getting out of sync, which can happen if they are > external services. > > It uses JRuby, which provides speed, and proper threading. It is built on > top of JBoss AS 6, which gives is stable and performant. > > Even though it is built on top of a Java application server, you can build > and deploy applications without touching a line of XML or Java. > > It's under active development (we're rapidly approaching or 1.0RC1 release, > with 1.0Final targeted for May), and is in use in production by a handful of > 'customers' at this point. > > Is that enticing? It was to me, that's why I joined the TorqueBox team :) > > Toby > > > On Fri, Mar 4, 2011 at 2:55 PM, Nathaniel Talbott wrote: >> >> >> Hey Toby, sounds intriguing, but: tell us a bit more why the average >> Rubyist/Railsor should definitely be rocking some TorqueBox. I.e. how >> might it change our behavior if we learn more about it? >> >> >> > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -------------- next part -------------- An HTML attachment was scrubbed... URL: From motley.crue.fan at gmail.com Fri Mar 4 18:59:26 2011 From: motley.crue.fan at gmail.com (Phillip Rhodes) Date: Fri, 4 Mar 2011 18:59:26 -0500 Subject: [raleigh.rb] Interested in a talk on TorqueBox? In-Reply-To: References: Message-ID: +1 here. On Fri, Mar 4, 2011 at 4:23 PM, Tobias Crawley wrote: > Sure thing: > > TorqueBox is more than just a "webserver + ruby interpreter" - it's a real > ruby application server. So, out of the box, it provides (among other > things): > > * asynchronous processing (using messaging) without having to setup and > manage DelayedJob/Resque/what-have-you > * scheduled jobs without dealing with external cron jobs > * clustering, with web session affinity, and automatic messaging > distribution > > All of which are configured and managed from within your app codebase, and > share the lifecycle of your app. Therefore, if you undeploy or redeploy your > app, these components are automatically undeployed or redeployed along with > it, preventing them from getting out of sync, which can happen if they are > external services. > > It uses JRuby, which provides speed, and proper threading. It is built on > top of JBoss AS 6, which gives is stable and performant. > > Even though it is built on top of a Java application server, you can build > and deploy applications without touching a line of XML or Java. > > It's under active development (we're rapidly approaching or 1.0RC1 release, > with 1.0Final targeted for May), and is in use in production by a handful of > 'customers' at this point. > > Is that enticing? It was to me, that's why I joined the TorqueBox team :) > > Toby > > > On Fri, Mar 4, 2011 at 2:55 PM, Nathaniel Talbott wrote: >> >> >> Hey Toby, sounds intriguing, but: tell us a bit more why the average >> Rubyist/Railsor should definitely be rocking some TorqueBox. I.e. how >> might it change our behavior if we learn more about it? >> >> >> > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -------------- next part -------------- An HTML attachment was scrubbed... URL: From efg at ncsu.edu Fri Mar 4 19:18:01 2011 From: efg at ncsu.edu (Ed Gehringer) Date: Fri, 04 Mar 2011 19:18:01 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> <4D70F796.7D16.00A7.1@gw.ncsu.edu> Message-ID: <4D713AF0.7D16.00A7.1@gw.ncsu.edu> I looked it up, and liked the first description I came across on the Web: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/237598 Briefly, polymorphism in statically typed o-o languages depends on objects being in the same inheritance hierarchy. If you have a method "perimeter" that is defined in class Shape, and if Circle, Square, and Trapezoid are subclasses of Shape, then objects of classes Circle, Square, Trapezoid, and Shape can invoke perimeter. Other classes that are not subclasses of Shape cannot (for example, you can't call perimeter on a House object). In Ruby and all other dynamic o-o languages that I know of, this is not true. You could invoke the perimeter method on all the classes mentioned above, including House. If House had a perimeter method, however implemented, the same statement that invoked perimeter on a Circle could also be used to invoke it on a House, providing that the receiver variable actually held a House at the time of the call. This feature turned out to be very useful to us for a situation that would take a couple of paragraphs to explain. I will spare you the details. HTH, Ed >>> Mel Riffe 3/4/2011 4:07 PM >>> Ed, I'm a little slow these days, please forgive me, but can you please explain: We have a good application of unbounded polymorphism, where we have a receiver that may be a member of classes that are not in the same inheritance hierarchy. That's definitely impossible in C++ or Java. I'm not familiar with the phrase 'unbounded polymorphism' or its mechanics. Cheers, Mel On Fri, Mar 4, 2011 at 2:30 PM, Ed Gehringer wrote: > I think you do have it wrong, Rick. > > We have a good application of unbounded polymorphism, where we have a > receiver that may be a member of classes that are not in the same > inheritance hierarchy. That's definitely impossible in C++ or Java. > > If we write code for a class that uses this unbounded polymorphism, we want > a way to inform the programmer as soon as possible if the class lacks a > method that might be invoked polymorphically. > > Thanks, > > Ed > >>>> Rick DeNatale 3/4/2011 1:29 PM >>> > > IMHO, the right answer to questions like this is MU > http://en.wikipedia.org/wiki/Mu_(negative) > > This idea is cargo culting an idea from languages like C++ and Java. > If you want a statically typed language use one, Ruby is perfectly > fine without such stuff. > > Of course I might be wrong > > On Fri, Mar 4, 2011 at 11:47 AM, Ed Gehringer wrote: >> We are going to use a module to act as an interface, as described in >> http://www.chrisdavaz.com/blog/how-to-enforce-interfaces-in-ruby >> Is there any convention for naming an interface, e.g., >> >> the interface for a contributor object should be called >> "contributor-interface"? >> >> Thanks, >> Ed >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> > > > > -- > Rick DeNatale > > Blog: http://talklikeaduck.denhaven2.com/ > Github: http://github.com/rubyredrick > Twitter: @RickDeNatale > WWR: http://www.workingwithrails.com/person/9021-rick-denatale > LinkedIn: http://www.linkedin.com/in/rickdenatale > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > _______________________________________________ raleigh-rb-members mailing list raleigh-rb-members at rubyforge.org http://rubyforge.org/mailman/listinfo/raleigh-rb-members -------------- next part -------------- An HTML attachment was scrubbed... URL: From steve at iannopollo.com Fri Mar 4 21:27:22 2011 From: steve at iannopollo.com (Steve Iannopollo) Date: Fri, 4 Mar 2011 21:27:22 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: <4D713AF0.7D16.00A7.1@gw.ncsu.edu> References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> <4D70F796.7D16.00A7.1@gw.ncsu.edu> <4D713AF0.7D16.00A7.1@gw.ncsu.edu> Message-ID: <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> I'm pretty interested in your multi-paragraph explanation, because like Rick, I don't see any need to import a statically-typed language construct into a dynamic language. I checked out the chrisdavaz site to see what he was doing, and I'm wondering why nearly the same thing couldn't be accomplished in one shot (both interface and basic implementation methods) with something like the following: module MyInterface def required_method raise NotImplementedError.new('ahhh!') end end class Thing include MyInterface end This doesn't blow up at load time, but it will only blow up when it needs to (which some may argue is the proper time to do so). And it would allow you to keep the include at the top of the class (which the chrisdavaz example doesn't do). -Steve On Mar 4, 2011, at 7:18 PM, Ed Gehringer wrote: > I looked it up, and liked the first description I came across on the Web: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/237598 > > Briefly, polymorphism in statically typed o-o languages depends on objects being in the same inheritance hierarchy. If you have a method "perimeter" that is defined in class Shape, and if Circle, Square, and Trapezoid are subclasses of Shape, then objects of classes Circle, Square, Trapezoid, and Shape can invoke perimeter. Other classes that are not subclasses of Shape cannot (for example, you can't call perimeter on a House object). > > In Ruby and all other dynamic o-o languages that I know of, this is not true. You could invoke the perimeter method on all the classes mentioned above, including House. If House had a perimeter method, however implemented, the same statement that invoked perimeter on a Circle could also be used to invoke it on a House, providing that the receiver variable actually held a House at the time of the call. > > This feature turned out to be very useful to us for a situation that would take a couple of paragraphs to explain. I will spare you the details. > > HTH, > Ed > > >>> Mel Riffe 3/4/2011 4:07 PM >>> > Ed, > > I'm a little slow these days, please forgive me, but can you please explain: > > We have a good application of unbounded polymorphism, where we have a > receiver that may be a member of classes that are not in the same > inheritance hierarchy. That's definitely impossible in C++ or Java. > > I'm not familiar with the phrase 'unbounded polymorphism' or its mechanics. > > Cheers, > Mel > > On Fri, Mar 4, 2011 at 2:30 PM, Ed Gehringer wrote: > > I think you do have it wrong, Rick. > > > > We have a good application of unbounded polymorphism, where we have a > > receiver that may be a member of classes that are not in the same > > inheritance hierarchy. That's definitely impossible in C++ or Java. > > > > If we write code for a class that uses this unbounded polymorphism, we want > > a way to inform the programmer as soon as possible if the class lacks a > > method that might be invoked polymorphically. > > > > Thanks, > > > > Ed > > > >>>> Rick DeNatale 3/4/2011 1:29 PM >>> > > > > IMHO, the right answer to questions like this is MU > > http://en.wikipedia.org/wiki/Mu_(negative) > > > > This idea is cargo culting an idea from languages like C++ and Java. > > If you want a statically typed language use one, Ruby is perfectly > > fine without such stuff. > > > > Of course I might be wrong > > > > On Fri, Mar 4, 2011 at 11:47 AM, Ed Gehringer wrote: > >> We are going to use a module to act as an interface, as described in > >> http://www.chrisdavaz.com/blog/how-to-enforce-interfaces-in-ruby > >> Is there any convention for naming an interface, e.g., > >> > >> the interface for a contributor object should be called > >> "contributor-interface"? > >> > >> Thanks, > >> Ed > >> _______________________________________________ > >> raleigh-rb-members mailing list > >> raleigh-rb-members at rubyforge.org > >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members > >> > > > > > > > > -- > > Rick DeNatale > > > > Blog: http://talklikeaduck.denhaven2.com/ > > Github: http://github.com/rubyredrick > > Twitter: @RickDeNatale > > WWR: http://www.workingwithrails.com/person/9021-rick-denatale > > LinkedIn: http://www.linkedin.com/in/rickdenatale > > _______________________________________________ > > raleigh-rb-members mailing list > > raleigh-rb-members at rubyforge.org > > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > > > _______________________________________________ > > raleigh-rb-members mailing list > > raleigh-rb-members at rubyforge.org > > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members -------------- next part -------------- An HTML attachment was scrubbed... URL: From efg at ncsu.edu Fri Mar 4 22:18:41 2011 From: efg at ncsu.edu (Ed Gehringer) Date: Fri, 04 Mar 2011 22:18:41 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> <4D70F796.7D16.00A7.1@gw.ncsu.edu> <4D713AF0.7D16.00A7.1@gw.ncsu.edu> <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> Message-ID: <4D716549.7D16.00A7.1@gw.ncsu.edu> Hey Steve, I'll get to this tomorrow ... it will take a little time. As to the module you propose, that's a good solution if there's one required method. If there are 10, it gets a little repetitive, so I like the Chris Davaz approach better. -Ed >>> Steve Iannopollo 3/4/2011 9:27 PM >>> I'm pretty interested in your multi-paragraph explanation, because like Rick, I don't see any need to import a statically-typed language construct into a dynamic language. I checked out the chrisdavaz site to see what he was doing, and I'm wondering why nearly the same thing couldn't be accomplished in one shot (both interface and basic implementation methods) with something like the following: module MyInterface def required_method raise NotImplementedError.new('ahhh!') end end class Thing include MyInterface end This doesn't blow up at load time, but it will only blow up when it needs to (which some may argue is the proper time to do so). And it would allow you to keep the include at the top of the class (which the chrisdavaz example doesn't do). -Steve On Mar 4, 2011, at 7:18 PM, Ed Gehringer wrote: I looked it up, and liked the first description I came across on the Web: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/237598 Briefly, polymorphism in statically typed o-o languages depends on objects being in the same inheritance hierarchy. If you have a method "perimeter" that is defined in class Shape, and if Circle, Square, and Trapezoid are subclasses of Shape, then objects of classes Circle, Square, Trapezoid, and Shape can invoke perimeter. Other classes that are not subclasses of Shape cannot (for example, you can't call perimeter on a House object). In Ruby and all other dynamic o-o languages that I know of, this is not true. You could invoke the perimeter method on all the classes mentioned above, including House. If House had a perimeter method, however implemented, the same statement that invoked perimeter on a Circle could also be used to invoke it on a House, providing that the receiver variable actually held a House at the time of the call. This feature turned out to be very useful to us for a situation that would take a couple of paragraphs to explain. I will spare you the details. HTH, Ed >>> Mel Riffe 3/4/2011 4:07 PM >>> Ed, I'm a little slow these days, please forgive me, but can you please explain: We have a good application of unbounded polymorphism, where we have a receiver that may be a member of classes that are not in the same inheritance hierarchy. That's definitely impossible in C++ or Java. I'm not familiar with the phrase 'unbounded polymorphism' or its mechanics. Cheers, Mel On Fri, Mar 4, 2011 at 2:30 PM, Ed Gehringer wrote: > I think you do have it wrong, Rick. > > We have a good application of unbounded polymorphism, where we have a > receiver that may be a member of classes that are not in the same > inheritance hierarchy. That's definitely impossible in C++ or Java. > > If we write code for a class that uses this unbounded polymorphism, we want > a way to inform the programmer as soon as possible if the class lacks a > method that might be invoked polymorphically. > > Thanks, > > Ed > >>>> Rick DeNatale 3/4/2011 1:29 PM >>> > > IMHO, the right answer to questions like this is MU > http://en.wikipedia.org/wiki/Mu_(negative) > > This idea is cargo culting an idea from languages like C++ and Java. > If you want a statically typed language use one, Ruby is perfectly > fine without such stuff. > > Of course I might be wrong > > On Fri, Mar 4, 2011 at 11:47 AM, Ed Gehringer wrote: >> We are going to use a module to act as an interface, as described in >> http://www.chrisdavaz.com/blog/how-to-enforce-interfaces-in-ruby >> Is there any convention for naming an interface, e.g., >> >> the interface for a contributor object should be called >> "contributor-interface"? >> >> Thanks, >> Ed >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> > > > > -- > Rick DeNatale > > Blog: http://talklikeaduck.denhaven2.com/ > Github: http://github.com/rubyredrick > Twitter: @RickDeNatale > WWR: http://www.workingwithrails.com/person/9021-rick-denatale > LinkedIn: http://www.linkedin.com/in/rickdenatale > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > _______________________________________________ raleigh-rb-members mailing list raleigh-rb-members at rubyforge.org http://rubyforge.org/mailman/listinfo/raleigh-rb-members _______________________________________________ raleigh-rb-members mailing list raleigh-rb-members at rubyforge.org http://rubyforge.org/mailman/listinfo/raleigh-rb-members -------------- next part -------------- An HTML attachment was scrubbed... URL: From steve at iannopollo.com Fri Mar 4 23:24:33 2011 From: steve at iannopollo.com (Steve Iannopollo) Date: Fri, 4 Mar 2011 23:24:33 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: <4D716549.7D16.00A7.1@gw.ncsu.edu> References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> <4D70F796.7D16.00A7.1@gw.ncsu.edu> <4D713AF0.7D16.00A7.1@gw.ncsu.edu> <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> <4D716549.7D16.00A7.1@gw.ncsu.edu> Message-ID: <1EC59F74-C645-4A0F-8FEF-CC93156A7941@iannopollo.com> The concept could still be applied though: module MyInterface %w(method1 method2 method3).each do |method_name| define_method method_name do raise NotImplementedError.new("You need to implement ##{method_name}") end end end There always seems to be more than one way to skin the proverbial cat in ruby :-) -Steve On Mar 4, 2011, at 10:18 PM, Ed Gehringer wrote: > Hey Steve, > > I'll get to this tomorrow ... it will take a little time. > > As to the module you propose, that's a good solution if there's one required method. If there are 10, it gets a little repetitive, so I like the Chris Davaz approach better. > > -Ed > > >>> Steve Iannopollo 3/4/2011 9:27 PM >>> > I'm pretty interested in your multi-paragraph explanation, because like Rick, I don't see any need to import a statically-typed language construct into a dynamic language. I checked out the chrisdavaz site to see what he was doing, and I'm wondering why nearly the same thing couldn't be accomplished in one shot (both interface and basic implementation methods) with something like the following: > > module MyInterface > def required_method > raise NotImplementedError.new('ahhh!') > end > end > > class Thing > include MyInterface > end > > This doesn't blow up at load time, but it will only blow up when it needs to (which some may argue is the proper time to do so). And it would allow you to keep the include at the top of the class (which the chrisdavaz example doesn't do). > > -Steve > > On Mar 4, 2011, at 7:18 PM, Ed Gehringer wrote: > >> I looked it up, and liked the first description I came across on the Web: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/237598 >> >> Briefly, polymorphism in statically typed o-o languages depends on objects being in the same inheritance hierarchy. If you have a method "perimeter" that is defined in class Shape, and if Circle, Square, and Trapezoid are subclasses of Shape, then objects of classes Circle, Square, Trapezoid, and Shape can invoke perimeter. Other classes that are not subclasses of Shape cannot (for example, you can't call perimeter on a House object). >> >> In Ruby and all other dynamic o-o languages that I know of, this is not true. You could invoke the perimeter method on all the classes mentioned above, including House. If House had a perimeter method, however implemented, the same statement that invoked perimeter on a Circle could also be used to invoke it on a House, providing that the receiver variable actually held a House at the time of the call. >> >> This feature turned out to be very useful to us for a situation that would take a couple of paragraphs to explain. I will spare you the details. >> >> HTH, >> Ed >> >> >>> Mel Riffe 3/4/2011 4:07 PM >>> >> Ed, >> >> I'm a little slow these days, please forgive me, but can you please explain: >> >> We have a good application of unbounded polymorphism, where we have a >> receiver that may be a member of classes that are not in the same >> inheritance hierarchy. That's definitely impossible in C++ or Java. >> >> I'm not familiar with the phrase 'unbounded polymorphism' or its mechanics. >> >> Cheers, >> Mel >> >> On Fri, Mar 4, 2011 at 2:30 PM, Ed Gehringer wrote: >> > I think you do have it wrong, Rick. >> > >> > We have a good application of unbounded polymorphism, where we have a >> > receiver that may be a member of classes that are not in the same >> > inheritance hierarchy. That's definitely impossible in C++ or Java. >> > >> > If we write code for a class that uses this unbounded polymorphism, we want >> > a way to inform the programmer as soon as possible if the class lacks a >> > method that might be invoked polymorphically. >> > >> > Thanks, >> > >> > Ed >> > >> >>>> Rick DeNatale 3/4/2011 1:29 PM >>> >> > >> > IMHO, the right answer to questions like this is MU >> > http://en.wikipedia.org/wiki/Mu_(negative) >> > >> > This idea is cargo culting an idea from languages like C++ and Java. >> > If you want a statically typed language use one, Ruby is perfectly >> > fine without such stuff. >> > >> > Of course I might be wrong >> > >> > On Fri, Mar 4, 2011 at 11:47 AM, Ed Gehringer wrote: >> >> We are going to use a module to act as an interface, as described in >> >> http://www.chrisdavaz.com/blog/how-to-enforce-interfaces-in-ruby >> >> Is there any convention for naming an interface, e.g., >> >> >> >> the interface for a contributor object should be called >> >> "contributor-interface"? >> >> >> >> Thanks, >> >> Ed >> >> _______________________________________________ >> >> raleigh-rb-members mailing list >> >> raleigh-rb-members at rubyforge.org >> >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> >> >> > >> > >> > >> > -- >> > Rick DeNatale >> > >> > Blog: http://talklikeaduck.denhaven2.com/ >> > Github: http://github.com/rubyredrick >> > Twitter: @RickDeNatale >> > WWR: http://www.workingwithrails.com/person/9021-rick-denatale >> > LinkedIn: http://www.linkedin.com/in/rickdenatale >> > _______________________________________________ >> > raleigh-rb-members mailing list >> > raleigh-rb-members at rubyforge.org >> > http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> > >> > _______________________________________________ >> > raleigh-rb-members mailing list >> > raleigh-rb-members at rubyforge.org >> > http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> > >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members From mshiltonj at gmail.com Sat Mar 5 03:17:58 2011 From: mshiltonj at gmail.com (Steven Hilton) Date: Sat, 5 Mar 2011 03:17:58 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> <4D70F796.7D16.00A7.1@gw.ncsu.edu> <4D713AF0.7D16.00A7.1@gw.ncsu.edu> <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> Message-ID: Wouldn't it blow up anyway, with a NoMethodError? On Fri, Mar 4, 2011 at 9:27 PM, Steve Iannopollo wrote: > I'm pretty interested in your multi-paragraph explanation, because like > Rick, I don't see any need to import a statically-typed language construct > into a dynamic language. I checked out the chrisdavaz site to see what he > was doing, and I'm wondering why nearly the same thing couldn't be > accomplished in one shot (both interface and basic implementation methods) > with something like the following: > module MyInterface > ??def required_method > ?? ?raise NotImplementedError.new('ahhh!') > ??end > end > class Thing > ??include MyInterface > end > This doesn't blow up at load time, but it will only blow up when it needs to > (which some may argue is the proper time to do so). And it would allow you > to keep the include at the top of the class (which the?chrisdavaz example > doesn't do). > > -Steve > On Mar 4, 2011, at 7:18 PM, Ed Gehringer wrote: > > I looked it up, and liked the first description I came across on the Web: > http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/237598 > > Briefly, polymorphism in statically typed o-o languages depends on objects > being in the same inheritance hierarchy.? If you have a method "perimeter" > that is defined in class Shape, and if Circle, Square, and Trapezoid are > subclasses of Shape, then objects of classes Circle, Square, Trapezoid, and > Shape can invoke perimeter.? Other classes that are not subclasses of Shape > cannot (for example, you can't call perimeter on a House object). > > In Ruby and all other dynamic o-o languages that I know of, this is not > true.? You could invoke the perimeter method on all the classes mentioned > above, including House.? If House had a perimeter method, however > implemented, the same statement that invoked perimeter on a Circle could > also be used to invoke it on a House, providing that the receiver variable > actually held a House at the time of the call. > > This feature turned out to be very useful to us for a situation that would > take a couple of paragraphs to explain.? I will spare you the details. > > HTH, > Ed > >>>> Mel Riffe 3/4/2011 4:07 PM >>> > Ed, > > I'm a little slow these days, please forgive me, but can you please explain: > > We have a good application of unbounded polymorphism, where we have a > receiver that may be a member of classes that are not in the same > inheritance hierarchy.? That's definitely impossible in C++ or Java. > > I'm not familiar with the phrase 'unbounded polymorphism' or its mechanics. > > Cheers, > Mel > > On Fri, Mar 4, 2011 at 2:30 PM, Ed Gehringer wrote: >> I think you do have it wrong, Rick. >> >> We have a good application of unbounded polymorphism, where we have a >> receiver that may be a member of classes that are not in the same >> inheritance hierarchy.? That's definitely impossible in C++ or Java. >> >> If we write code for a class that uses this unbounded polymorphism, we >> want >> a way to inform the programmer as soon as possible if the class lacks a >> method that might be invoked polymorphically. >> >> Thanks, >> >> Ed >> >>>>> Rick DeNatale 3/4/2011 1:29 PM >>> >> >> IMHO, the right answer to questions like this is MU >> http://en.wikipedia.org/wiki/Mu_(negative) >> >> This idea is cargo culting an idea from languages like C++ and Java. >> If you want a statically typed language use one, Ruby is perfectly >> fine without such stuff. >> >> Of course I might be wrong >> >> On Fri, Mar 4, 2011 at 11:47 AM, Ed Gehringer wrote: >>> We are going to use a module to act as an interface, as described in >>> http://www.chrisdavaz.com/blog/how-to-enforce-interfaces-in-ruby >>> Is there any convention for naming an interface, e.g., >>> >>> the interface for a contributor object should be called >>> "contributor-interface"? >>> >>> Thanks, >>> Ed >>> _______________________________________________ >>> raleigh-rb-members mailing list >>> raleigh-rb-members at rubyforge.org >>> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >>> >> >> >> >> -- >> Rick DeNatale >> >> Blog: http://talklikeaduck.denhaven2.com/ >> Github: http://github.com/rubyredrick >> Twitter: @RickDeNatale >> WWR: http://www.workingwithrails.com/person/9021-rick-denatale >> LinkedIn: http://www.linkedin.com/in/rickdenatale >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > From jeff at jumpstartlab.com Sat Mar 5 11:48:54 2011 From: jeff at jumpstartlab.com (Jeff Casimir) Date: Sat, 5 Mar 2011 11:48:54 -0500 Subject: [raleigh.rb] Early Bird Ends TODAY for Ruby and Rails Jumpstart Classes Message-ID: RaleighRB, It was fun hanging out in your town this week and meeting several of you between my Ruby Primer and your Hack Night. I look forward to coming back down in a few weeks and hopefully having more time to see the cities. I wanted to remind you that today is the last day for Early Bird tickets for my two classes. The full two-day Ruby class will take place 3/26-3/27. We'll spend one day on a data manipulation project, cleaning up registration data from a conference and using it to access government representative information from the Sunlight Foundation. In the second day we'll build a command-line Twitter client to play around with accessing an external service and working with deeply nested data. This class is built for non-programmers, so if you don't have any experience or it's been a long time, this is for you: http://jumpstartlab.com/trainings/14-ruby-raleigh Then the following two days (3/28-3/29) I'll be teaching Intro to Rails. This course is really for existing programmers. If you're brand new to programming and take the Intro to Ruby class, you can just barely hang with Intro Rails, but it'll be tough! We're going to build a Rails application from the ground up, building your understanding of each component in the Rails architecture and how they fit together. Tickets are available here: http://jumpstartlab.com/trainings/15-rails-raleigh For both classes the early bird registration ends TODAY! You're welcome to use and share the discount code "raleighrb" which will take an additional 10% off the ticket price. Let me know if you have any questions, I look forward to seeing you in a few weeks! - Jeff --- Jeff Casimir Jumpstart Lab by Casimir Creative, LLC http://jumpstartlab.com @jumpstartlab on twitter From steve at iannopollo.com Sat Mar 5 13:07:16 2011 From: steve at iannopollo.com (Steve Iannopollo) Date: Sat, 5 Mar 2011 13:07:16 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> <4D70F796.7D16.00A7.1@gw.ncsu.edu> <4D713AF0.7D16.00A7.1@gw.ncsu.edu> <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> Message-ID: <67FB99FA-6B87-4890-8CA6-23967ECBEEE5@iannopollo.com> > Wouldn't it blow up anyway, with a NoMethodError? So with the following code: >> module MyInterface >> def required_method >> raise NotImplementedError.new('ahhh!') >> end >> end >> class Thing >> include MyInterface >> end You can call thing = Thing.new thing.required_method and that will raise a NotImplementedError. With the include of MyInterface in the Thing class, you already get #required_method defined for you, but it raises the error letting you know something is wrong. That should force you to redefine #required_method on the Thing class. Sorry dawg, I don't like the javaz in my ruby :-) -Steve >> This doesn't blow up at load time, but it will only blow up when it needs to >> (which some may argue is the proper time to do so). And it would allow you >> to keep the include at the top of the class (which the chrisdavaz example >> doesn't do). >> >> -Steve >> On Mar 4, 2011, at 7:18 PM, Ed Gehringer wrote: >> >> I looked it up, and liked the first description I came across on the Web: >> http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/237598 >> >> Briefly, polymorphism in statically typed o-o languages depends on objects >> being in the same inheritance hierarchy. If you have a method "perimeter" >> that is defined in class Shape, and if Circle, Square, and Trapezoid are >> subclasses of Shape, then objects of classes Circle, Square, Trapezoid, and >> Shape can invoke perimeter. Other classes that are not subclasses of Shape >> cannot (for example, you can't call perimeter on a House object). >> >> In Ruby and all other dynamic o-o languages that I know of, this is not >> true. You could invoke the perimeter method on all the classes mentioned >> above, including House. If House had a perimeter method, however >> implemented, the same statement that invoked perimeter on a Circle could >> also be used to invoke it on a House, providing that the receiver variable >> actually held a House at the time of the call. >> >> This feature turned out to be very useful to us for a situation that would >> take a couple of paragraphs to explain. I will spare you the details. >> >> HTH, >> Ed >> >>>>> Mel Riffe 3/4/2011 4:07 PM >>> >> Ed, >> >> I'm a little slow these days, please forgive me, but can you please explain: >> >> We have a good application of unbounded polymorphism, where we have a >> receiver that may be a member of classes that are not in the same >> inheritance hierarchy. That's definitely impossible in C++ or Java. >> >> I'm not familiar with the phrase 'unbounded polymorphism' or its mechanics. >> >> Cheers, >> Mel >> >> On Fri, Mar 4, 2011 at 2:30 PM, Ed Gehringer wrote: >>> I think you do have it wrong, Rick. >>> >>> We have a good application of unbounded polymorphism, where we have a >>> receiver that may be a member of classes that are not in the same >>> inheritance hierarchy. That's definitely impossible in C++ or Java. >>> >>> If we write code for a class that uses this unbounded polymorphism, we >>> want >>> a way to inform the programmer as soon as possible if the class lacks a >>> method that might be invoked polymorphically. >>> >>> Thanks, >>> >>> Ed >>> >>>>>> Rick DeNatale 3/4/2011 1:29 PM >>> >>> >>> IMHO, the right answer to questions like this is MU >>> http://en.wikipedia.org/wiki/Mu_(negative) >>> >>> This idea is cargo culting an idea from languages like C++ and Java. >>> If you want a statically typed language use one, Ruby is perfectly >>> fine without such stuff. >>> >>> Of course I might be wrong >>> >>> On Fri, Mar 4, 2011 at 11:47 AM, Ed Gehringer wrote: >>>> We are going to use a module to act as an interface, as described in >>>> http://www.chrisdavaz.com/blog/how-to-enforce-interfaces-in-ruby >>>> Is there any convention for naming an interface, e.g., >>>> >>>> the interface for a contributor object should be called >>>> "contributor-interface"? >>>> >>>> Thanks, >>>> Ed >>>> _______________________________________________ >>>> raleigh-rb-members mailing list >>>> raleigh-rb-members at rubyforge.org >>>> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >>>> >>> >>> >>> >>> -- >>> Rick DeNatale >>> >>> Blog: http://talklikeaduck.denhaven2.com/ >>> Github: http://github.com/rubyredrick >>> Twitter: @RickDeNatale >>> WWR: http://www.workingwithrails.com/person/9021-rick-denatale >>> LinkedIn: http://www.linkedin.com/in/rickdenatale >>> _______________________________________________ >>> raleigh-rb-members mailing list >>> raleigh-rb-members at rubyforge.org >>> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >>> >>> _______________________________________________ >>> raleigh-rb-members mailing list >>> raleigh-rb-members at rubyforge.org >>> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >>> >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> From nathaniel at talbott.ws Sat Mar 5 15:58:52 2011 From: nathaniel at talbott.ws (Nathaniel Talbott) Date: Sat, 5 Mar 2011 15:58:52 -0500 Subject: [raleigh.rb] Interested in a talk on TorqueBox? In-Reply-To: References: Message-ID: On Fri, Mar 4, 2011 at 4:23 PM, Tobias Crawley wrote: > Is that enticing? It was to me, that's why I joined the TorqueBox team :) Nicely done :-) I'll email you directly so we can work out details and get you scheduled. -- Nathaniel Talbott <:((>< From efg at ncsu.edu Sat Mar 5 23:54:22 2011 From: efg at ncsu.edu (Ed Gehringer) Date: Sat, 05 Mar 2011 23:54:22 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> <4D70F796.7D16.00A7.1@gw.ncsu.edu> <4D713AF0.7D16.00A7.1@gw.ncsu.edu> <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> Message-ID: <4D72CD39.7D16.00A7.1@gw.ncsu.edu> >>> Steve Iannopollo 3/4/2011 9:27 PM >>> I'm pretty interested in your multi-paragraph explanation, because like Rick, I don't see any need to import a statically-typed language construct into a dynamic language. <<< OK, here goes. The application is our Expertiza collaborative learning system. The code needs to assign reviewers for work that is produced either by an individual author or a team. If an individual author is being reviewed, the code finds information about the author (user-ID, topic that the author is writing on, links to submitted work, etc.) in the participants table. If a team is being reviewed, relevant information (team name, etc.) is found in the teams table. Obviously, author should not be a subclass of team, or vice versa. But both author and team need to respond to the same messages. A further complication is the fact that a participant can perform some functions (e.g., selecting a topic) as an individual, and then form a team, which "inherits" the topic that the participant has chosen. Thus, both Participant and Team need to respond to a common set of messages. (Both Participant and Team also need to respond to their own peculiar messages, which are not in this set.) The standard way to do this in Java, C#, etc., would be to have Participant and Team implement the same interface. In Ruby, they simply need to implement the common set of methods. Nonetheless, it will be useful to group these methods somewhere in the code, for the sake of readability and extensibility. -Ed -------------- next part -------------- An HTML attachment was scrubbed... URL: From rick.denatale at gmail.com Sun Mar 6 07:29:11 2011 From: rick.denatale at gmail.com (Rick DeNatale) Date: Sun, 6 Mar 2011 07:29:11 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: <4D72CD39.7D16.00A7.1@gw.ncsu.edu> References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> <4D70F796.7D16.00A7.1@gw.ncsu.edu> <4D713AF0.7D16.00A7.1@gw.ncsu.edu> <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> <4D72CD39.7D16.00A7.1@gw.ncsu.edu> Message-ID: On Sat, Mar 5, 2011 at 11:54 PM, Ed Gehringer wrote: >>>> Steve Iannopollo 3/4/2011 9:27 PM >>> > I'm pretty interested in your multi-paragraph explanation, because like > Rick, I don't see any need to import a statically-typed language construct > into a dynamic language. > > <<< > > OK, here goes. > > The application is our Expertiza collaborative learning system.? The code > needs to assign reviewers for work that is produced either by an individual > author or a team. > > If an individual author is being reviewed, the code finds information about > the author (user-ID, topic that the author is writing on, links to submitted > work, etc.) in the participants table.? If a team is being reviewed, > relevant information (team name, etc.) is found in the teams table. > Obviously, author should not be a subclass of team, or vice versa.? But both > author and team need to respond to the same messages.? A further > complication is the fact that a participant can perform some functions > (e.g., selecting a topic) as an individual, and then form a team, which > "inherits" the topic that the participant has chosen. > > Thus, both Participant and Team need to respond to a common set of > messages.? (Both Participant and Team also need to respond to their own > peculiar messages, which are not in this set.)? The standard way to do this > in Java, C#, etc., would be to have Participant and Team implement the same > interface.? In Ruby, they simply need to implement the common set of > methods.? Nonetheless, it will be useful to group these methods somewhere in > the code, for the sake of readability and extensibility. It occur to me that this would be simpler if you just modeled it as a work always being authored by a team, where a team has ONE or more participants, rather than treating single or multiple authorships as different cases. In any event, I'd user specs/tests rather than trying to build some kind of static typing kludge on top of Ruby. Use modules if there's reusable IMPLEMENTATION of methods, if you really need multiple inheritance, otherwise just give each class an implementation of the needed methods. -- Rick DeNatale Blog: http://talklikeaduck.denhaven2.com/ Github: http://github.com/rubyredrick Twitter: @RickDeNatale WWR: http://www.workingwithrails.com/person/9021-rick-denatale LinkedIn: http://www.linkedin.com/in/rickdenatale From skmetz at gmail.com Sun Mar 6 07:56:09 2011 From: skmetz at gmail.com (Sandi Metz) Date: Sun, 6 Mar 2011 07:56:09 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: <4D72CD39.7D16.00A7.1@gw.ncsu.edu> References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> <4D70F796.7D16.00A7.1@gw.ncsu.edu> <4D713AF0.7D16.00A7.1@gw.ncsu.edu> <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> <4D72CD39.7D16.00A7.1@gw.ncsu.edu> Message-ID: You can use the tests you've written for your modules to prove that the classes that include those modules honor the interface. http://relishapp.com/rspec/rspec-core/v/2-0/dir/example-groups/shared-example-group In your case you might have a contributor_spec, which defined some shared_examples_for "contributor" and then each class that included the contributor module would assert something like describe Participant it_should_behave_like "contributor" ... The tests ought to prove that everything is ok AND provide all of the documentation you need. If they don't, improve the tests. Win-win. Of course, this assumes that you're using rspec :-) but surely something similar is possible in other test frameworks. -Sandi On Sat, Mar 5, 2011 at 11:54 PM, Ed Gehringer wrote: > >>> Steve Iannopollo 3/4/2011 9:27 PM >>> > I'm pretty interested in your multi-paragraph explanation, because like > Rick, I don't see any need to import a statically-typed language construct > into a dynamic language. > > <<< > > OK, here goes. > > The application is our Expertiza collaborative learning system. The code > needs to assign reviewers for work that is produced either by an individual > author or a team. > > If an individual author is being reviewed, the code finds information about > the author (user-ID, topic that the author is writing on, links to submitted > work, etc.) in the *participants* table. If a team is being reviewed, > relevant information (team name, etc.) is found in the *teams* table. > Obviously, author should not be a subclass of team, or vice versa. But both > author and team need to respond to the same messages. A further > complication is the fact that a participant can perform some functions > (e.g., selecting a topic) as an individual, and then form a team, which > "inherits" the topic that the participant has chosen. > > Thus, both Participant and Team need to respond to a common set of > messages. (Both Participant and Team also need to respond to their own > peculiar messages, which are not in this set.) The standard way to do this > in Java, C#, etc., would be to have Participant and Team implement the same > interface. In Ruby, they simply need to implement the common set of > methods. Nonetheless, it will be useful to group these methods somewhere in > the code, for the sake of readability and extensibility. > > -Ed > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -------------- next part -------------- An HTML attachment was scrubbed... URL: From trent.albright at gmail.com Sun Mar 6 09:54:47 2011 From: trent.albright at gmail.com (Trent Albright) Date: Sun, 6 Mar 2011 09:54:47 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> <4D70F796.7D16.00A7.1@gw.ncsu.edu> <4D713AF0.7D16.00A7.1@gw.ncsu.edu> <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> <4D72CD39.7D16.00A7.1@gw.ncsu.edu> Message-ID: I've written plenty of production code in Java. I prefer by far duck typing in Ruby than having to declare and fulfill interface contracts: *In duck typing, one is concerned with just those aspects of an object that are used, rather than with the type of the object itself.* It feels like interfaces in Java are about compile time checking and something that the VM runtime cares about. From a developers perspective, seeing "implements MyInterface" in Java lets me know what kind of behavior the class has or that I should provide. It's an arbitrary contract that needs to be fulfilled. But I think all we really care about is whether a given object can receive a given message. We don't need interfaces in Ruby to accomplish that. In general, in Ruby when we want to make sure objects behave as they are supposed to we write specs/tests. In cases where you need to check at runtime we use "Object#respond_to?" I agree completely with Rick and Sandi. You can use the tests you've written for your modules to prove that the > classes that include those modules honor the interface. > > http://relishapp.com/rspec/rspec-core/v/2-0/dir/example-groups/shared-example-group > > In your case you might have a contributor_spec, which defined some > > shared_examples_for "contributor" > > and then each class that included the contributor module would assert > something like > > describe Participant > it_should_behave_like "contributor" > ... > > > The tests ought to prove that everything is ok AND provide all of the > documentation you need. > If they don't, improve the tests. > Win-win. > > Of course, this assumes that you're using rspec :-) but surely something > similar is possible in other test frameworks. > > -Sandi > -------------- next part -------------- An HTML attachment was scrubbed... URL: From seancribbs at gmail.com Sun Mar 6 12:52:12 2011 From: seancribbs at gmail.com (Sean Cribbs) Date: Sun, 6 Mar 2011 12:52:12 -0500 Subject: [raleigh.rb] Convention for naming modules used as interfaces In-Reply-To: References: <4D70D171.7D16.00A7.1@gw.ncsu.edu> <4D70F796.7D16.00A7.1@gw.ncsu.edu> <4D713AF0.7D16.00A7.1@gw.ncsu.edu> <933453D2-FB0B-4A96-B3E2-C7C636C2B625@iannopollo.com> <4D72CD39.7D16.00A7.1@gw.ncsu.edu> Message-ID: Interestingly, I've been more interested in having "contracts" of the Eiffel sort lately. We have some of these patterns in Rails for instance, like when a method checks its parameter formats or valid options in the trailing hash. However, overall I'll have to echo Rick's sentiment. You don't need something external to enforce an interface -- if your code is calling something it shouldn't, it's wrong anyway and you should rightly get a NameError or NotImplementedError. Sean On Sun, Mar 6, 2011 at 9:54 AM, Trent Albright wrote: > I've written plenty of production code in Java. I prefer by far duck typing > in Ruby than having to declare and fulfill interface contracts: > > In duck typing, one is concerned with just those aspects of an object that > are used, rather than with the type of the object itself. > > It feels like interfaces in Java are about compile time checking and > something that the VM runtime cares about. From a developers perspective, > seeing "implements MyInterface" in Java lets me know what kind of behavior > the class has or that I should provide. It's an arbitrary contract that > needs to be fulfilled.?But I think all we really care about is whether a > given object can receive a given message. We don't need interfaces in Ruby > to accomplish that. > In general, in Ruby when we want to make sure objects behave as they are > supposed to we write specs/tests. In cases where you need to check at > runtime we use "Object#respond_to?" > I agree completely with Rick and Sandi. >> >> You can use the tests you've written for your modules to prove that the >> classes that include those modules honor the interface. >> >> http://relishapp.com/rspec/rspec-core/v/2-0/dir/example-groups/shared-example-group >> In your case you might have a contributor_spec, which defined some >> >> shared_examples_for "contributor" >> >> and then each class that included the contributor module would assert >> something like >> >> describe Participant >> ?? it_should_behave_like "contributor" >> ?? ... >> >> The tests?ought?to prove that everything is ok AND provide all of the >> documentation you need. >> If they don't, improve the tests. >> Win-win. >> Of course, this assumes that you're using rspec ?:-) but surely something >> similar is possible in other test frameworks. >> -Sandi > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > From martin.streicher at gmail.com Mon Mar 7 20:06:20 2011 From: martin.streicher at gmail.com (Martin Streicher) Date: Mon, 7 Mar 2011 20:06:20 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: Tyler: did you ever post a followup? On Nov 30, 2010, at 3:00 PM, Tyler Smart wrote: > I've decided to go with a combination of > Request Log Analyzer https://github.com/wvanbergen/request-log-analyzer > Oink https://github.com/noahd1/oink > Memprof https://github.com/ice799/memprof > I'll let you guys know how successful it was. > > Tyler > > On Tue, Nov 30, 2010 at 1:28 PM, Donald Ball wrote: > On Tue, Nov 30, 2010 at 12:22 PM, Aaron Bedra wrote: > > If you are still on1.8.x REE is the ONLY ruby you should be using. The GC > > and threading fixes make it a deployable Ruby. I would not use MRI in > > production for anything. If you want the lowdown on what was fixed in REE > > take a look at Hong and Nihn's talk at google on it. It is very eye > > opening. > > Having a sysadmin whose got us stuck on 1.8.6 (!) still, and is > contemplating a move to MRI 1.8.7 instead of REE (or 1.9.2), > apparently due to some bad blood between the Redhat guys and the REE > guys, I'd appreciate a link to said talk if you happen to have one, I > couldn't find it just now. Thanks. > > - donald > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members -------------- next part -------------- An HTML attachment was scrubbed... URL: From tesmar at statsheet.com Tue Mar 8 07:32:37 2011 From: tesmar at statsheet.com (Tyler Smart) Date: Tue, 8 Mar 2011 07:32:37 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: Well, for the moment we have paused our profiling in order to write more code, but I was able to use bleakhouse to trackdown a bad activerecord optimizer plugin. I removed it and memory leaks went away, some of them :) RIght now since our rails app has 600 models and will soon be approaching 700-900 with the addition of new sports, I am working on a way to selectively deploy different sports as different apps using Rails engines. I want to create whitelists for which files will get deployed as which kind of server. For ex: if we are deploying an mlb app we will only include the base models + mlb for a total of 150 or so, not 600. I am hoping that this will speed the app up. And, we still have to switch to 1.9.2 or JRuby. On Mon, Mar 7, 2011 at 8:06 PM, Martin Streicher wrote: > > Tyler: did you ever post a followup? > > On Nov 30, 2010, at 3:00 PM, Tyler Smart wrote: > > I've decided to go with a combination of > > - Request Log Analyzer > https://github.com/wvanbergen/request-log-analyzer > - Oink https://github.com/noahd1/oink > - Memprof https://github.com/ice799/memprof > > I'll let you guys know how successful it was. > > Tyler > > On Tue, Nov 30, 2010 at 1:28 PM, Donald Ball wrote: > >> On Tue, Nov 30, 2010 at 12:22 PM, Aaron Bedra >> wrote: >> > If you are still on1.8.x REE is the ONLY ruby you should be using. The >> GC >> > and threading fixes make it a deployable Ruby. I would not use MRI in >> > production for anything. If you want the lowdown on what was fixed in >> REE >> > take a look at Hong and Nihn's talk at google on it. It is very eye >> > opening. >> >> Having a sysadmin whose got us stuck on 1.8.6 (!) still, and is >> contemplating a move to MRI 1.8.7 instead of REE (or 1.9.2), >> apparently due to some bad blood between the Redhat guys and the REE >> guys, I'd appreciate a link to said talk if you happen to have one, I >> couldn't find it just now. Thanks. >> >> - donald >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -------------- next part -------------- An HTML attachment was scrubbed... URL: From info at lojic.com Tue Mar 8 10:47:39 2011 From: info at lojic.com (Brian Adkins) Date: Tue, 8 Mar 2011 10:47:39 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: Tyler: I'm curious about the large number of models you have. Would you mind sharing some examples of what drives the need for a new model vs. parameterizing an existing model with data when new sports are introduced? I'm very unfamiliar with the domain, but at first glance the number of models seemed a bit extreme :) Thanks, Brian -- Brian Adkins Lojic Technologies, LLC http://lojic.com/ On Mar 8, 2011, at 7:32 AM, Tyler Smart wrote: > Well, for the moment we have paused our profiling in order to write > more code, but I was able to use bleakhouse to trackdown a bad > activerecord optimizer plugin. I removed it and memory leaks went > away, some of them :) > > RIght now since our rails app has 600 models and will soon be > approaching 700-900 with the addition of new sports, I am working on > a way to selectively deploy different sports as different apps using > Rails engines. I want to create whitelists for which files will get > deployed as which kind of server. For ex: if we are deploying an mlb > app we will only include the base models + mlb for a total of 150 or > so, not 600. I am hoping that this will speed the app up. And, we > still have to switch to 1.9.2 or JRuby. > > On Mon, Mar 7, 2011 at 8:06 PM, Martin Streicher > wrote: > > Tyler: did you ever post a followup? > > On Nov 30, 2010, at 3:00 PM, Tyler Smart wrote: > >> I've decided to go with a combination of >> Request Log Analyzer https://github.com/wvanbergen/request-log-analyzer >> Oink https://github.com/noahd1/oink >> Memprof https://github.com/ice799/memprof >> I'll let you guys know how successful it was. >> >> Tyler >> >> On Tue, Nov 30, 2010 at 1:28 PM, Donald Ball >> wrote: >> On Tue, Nov 30, 2010 at 12:22 PM, Aaron Bedra >> wrote: >> > If you are still on1.8.x REE is the ONLY ruby you should be >> using. The GC >> > and threading fixes make it a deployable Ruby. I would not use >> MRI in >> > production for anything. If you want the lowdown on what was >> fixed in REE >> > take a look at Hong and Nihn's talk at google on it. It is very >> eye >> > opening. >> >> Having a sysadmin whose got us stuck on 1.8.6 (!) still, and is >> contemplating a move to MRI 1.8.7 instead of REE (or 1.9.2), >> apparently due to some bad blood between the Redhat guys and the REE >> guys, I'd appreciate a link to said talk if you happen to have one, I >> couldn't find it just now. Thanks. >> >> - donald >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members -------------- next part -------------- An HTML attachment was scrubbed... URL: From tesmar at statsheet.com Tue Mar 8 10:55:38 2011 From: tesmar at statsheet.com (Tyler Smart) Date: Tue, 8 Mar 2011 10:55:38 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: Brian, The sports are just different enough that we thought that cramming all the models and writing super-methods which were really ugly would not be worth the maintenance. The code is somewhat similar, but branches enough that we thought about separating it. It is an extreme number of models, but considering the differences between the sports it will only grow with time. On Tue, Mar 8, 2011 at 10:47 AM, Brian Adkins wrote: > Tyler: > > I'm curious about the large number of models you have. Would you mind > sharing some examples of what drives the need for a new model vs. > parameterizing an existing model with data when new sports are introduced? > I'm very unfamiliar with the domain, but at first glance the number of > models seemed a bit extreme :) > > Thanks, > Brian > > -- > Brian Adkins > Lojic Technologies, LLC > http://lojic.com/ > > > > > On Mar 8, 2011, at 7:32 AM, Tyler Smart wrote: > > Well, for the moment we have paused our profiling in order to write more > code, but I was able to use bleakhouse to trackdown a bad activerecord > optimizer plugin. I removed it and memory leaks went away, some of them :) > > RIght now since our rails app has 600 models and will soon be approaching > 700-900 with the addition of new sports, I am working on a way to > selectively deploy different sports as different apps using Rails engines. I > want to create whitelists for which files will get deployed as which kind of > server. For ex: if we are deploying an mlb app we will only include the base > models + mlb for a total of 150 or so, not 600. I am hoping that this will > speed the app up. And, we still have to switch to 1.9.2 or JRuby. > > On Mon, Mar 7, 2011 at 8:06 PM, Martin Streicher < > martin.streicher at gmail.com> wrote: > >> >> Tyler: did you ever post a followup? >> >> On Nov 30, 2010, at 3:00 PM, Tyler Smart wrote: >> >> I've decided to go with a combination of >> >> - Request Log Analyzer >> https://github.com/wvanbergen/request-log-analyzer >> - Oink https://github.com/noahd1/oink >> - Memprof https://github.com/ice799/memprof >> >> I'll let you guys know how successful it was. >> >> Tyler >> >> On Tue, Nov 30, 2010 at 1:28 PM, Donald Ball wrote: >> >>> On Tue, Nov 30, 2010 at 12:22 PM, Aaron Bedra >>> wrote: >>> > If you are still on1.8.x REE is the ONLY ruby you should be using. The >>> GC >>> > and threading fixes make it a deployable Ruby. I would not use MRI in >>> > production for anything. If you want the lowdown on what was fixed in >>> REE >>> > take a look at Hong and Nihn's talk at google on it. It is very eye >>> > opening. >>> >>> Having a sysadmin whose got us stuck on 1.8.6 (!) still, and is >>> contemplating a move to MRI 1.8.7 instead of REE (or 1.9.2), >>> apparently due to some bad blood between the Redhat guys and the REE >>> guys, I'd appreciate a link to said talk if you happen to have one, I >>> couldn't find it just now. Thanks. >>> >>> - donald >>> _______________________________________________ >>> raleigh-rb-members mailing list >>> raleigh-rb-members at rubyforge.org >>> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >>> >> >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> >> >> >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -------------- next part -------------- An HTML attachment was scrubbed... URL: From nathaniel at talbott.ws Tue Mar 8 11:00:21 2011 From: nathaniel at talbott.ws (Nathaniel Talbott) Date: Tue, 8 Mar 2011 11:00:21 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: On Tue, Mar 8, 2011 at 10:55 AM, Tyler Smart wrote: > The sports are just different enough that we thought that cramming all the > models and writing super-methods which were really ugly would not be worth > the maintenance. The code is somewhat similar, but branches enough that we > thought about separating it. It is an extreme number of models, but > considering the differences between the sports it will only grow with time. Do you have a different database table for each of those models? -- Nathaniel Talbott <:((>< From trent.albright at gmail.com Tue Mar 8 11:13:32 2011 From: trent.albright at gmail.com (Trent Albright) Date: Tue, 8 Mar 2011 11:13:32 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: I've worked with schemas before that have hundreds of models. Even over 600. I realize it is certainly not typical but some domains require it. On Tue, Mar 8, 2011 at 10:47 AM, Brian Adkins wrote: > Tyler: > > I'm curious about the large number of models you have. Would you mind > sharing some examples of what drives the need for a new model vs. > parameterizing an existing model with data when new sports are introduced? > I'm very unfamiliar with the domain, but at first glance the number of > models seemed a bit extreme :) > > Thanks, > Brian > > -- > Brian Adkins > Lojic Technologies, LLC > http://lojic.com/ > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tesmar at statsheet.com Tue Mar 8 11:57:20 2011 From: tesmar at statsheet.com (Tyler Smart) Date: Tue, 8 Mar 2011 11:57:20 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: Most of them do, about 85%. There is some cleanup that can be done, and I have a project underway to do that, but that still leaves a significant number of models, something that will only grow. On Tue, Mar 8, 2011 at 11:00 AM, Nathaniel Talbott wrote: > On Tue, Mar 8, 2011 at 10:55 AM, Tyler Smart wrote: > > > The sports are just different enough that we thought that cramming all > the > > models and writing super-methods which were really ugly would not be > worth > > the maintenance. The code is somewhat similar, but branches enough that > we > > thought about separating it. It is an extreme number of models, but > > considering the differences between the sports it will only grow with > time. > > Do you have a different database table for each of those models? > > > -- > Nathaniel Talbott > <:((>< > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -------------- next part -------------- An HTML attachment was scrubbed... URL: From nathaniel at talbott.ws Tue Mar 8 12:27:56 2011 From: nathaniel at talbott.ws (Nathaniel Talbott) Date: Tue, 8 Mar 2011 12:27:56 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: On Tue, Mar 8, 2011 at 11:57 AM, Tyler Smart wrote: > Most of them do, about 85%. There is some cleanup that can be done, and I > have a project underway to do that, but that still leaves a significant > number of models, something that will only grow. While I concede that there are cases where that many models make sense, I've found in many cases there's a fundamental assumption that can be tweaked to simplify drastically. With Spreedly for instance we went from having one database table per payment gateway to a single payment gateway table by making one seemingly trivial change. I guess my next question is: do the models vary primarily in the data they contain, the behavior they need, some combo, or something else entirely? Oh, one other question while I'm at it - how many models are you adding per sport at this point? -- Nathaniel Talbott <:((>< From info at lojic.com Tue Mar 8 12:45:20 2011 From: info at lojic.com (Brian Adkins) Date: Tue, 8 Mar 2011 12:45:20 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: Just to be clear, my point wasn't to imply that using hundreds of models was wrong since I have little info on the requirements. I was genuinely curious about what requirements might indicate a need for hundreds of models. There are many ways to skin the cat :) With respect to some domains "requiring" that many; I expect that may be true, but I also think that the number of models is subjective and some folks would use less, some more. One of the things I like about Ruby is the flexibility it offers in structuring solutions - class inheritance, modules, metaprogramming, dynamic code loading, etc. I've been experimenting with using a more functional approach vs. object oriented approach in some of my Ruby code, so I was curious about this example which seemed to be heavy on the OO side. For example, given the overly simplistic example below, some people might lean toward the two model solution, others might lean toward the one model solution, or to an entirely different mechanism. As more functionality is added, it will likely become clear which is more advantageous for the particular system. For this simple example, it's moot. class Cat def speak 'meow' end end class Dog def speak 'bark' end end class Animal def initialize speech @speech = speech end def speak @speech end end [ Cat.new, Dog.new, Animal.new('meow'), Animal.new('bark') ].each {|animal| puts animal.speak } Thanks, Brian P.S. why is speak spelled with "ea" and speech with "ee" ? :) On Mar 8, 2011, at 11:13 AM, Trent Albright wrote: > I've worked with schemas before that have hundreds of models. Even > over 600. I realize it is certainly not typical but some domains > require it. > > On Tue, Mar 8, 2011 at 10:47 AM, Brian Adkins wrote: > Tyler: > > I'm curious about the large number of models you have. Would you > mind sharing some examples of what drives the need for a new model > vs. parameterizing an existing model with data when new sports are > introduced? I'm very unfamiliar with the domain, but at first glance > the number of models seemed a bit extreme :) > > Thanks, > Brian > > -- > Brian Adkins > Lojic Technologies, LLC > http://lojic.com/ > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tesmar at statsheet.com Tue Mar 8 13:42:05 2011 From: tesmar at statsheet.com (Tyler Smart) Date: Tue, 8 Mar 2011 13:42:05 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: They vary mostly in the behavior, so I suppose there could be a lib with a ton of logic in it that does crazy branching. We are moving to a new stats model that will take a lot of the tables out once we clean up and so for existing sports I expect the models to go down to about 400, maybe even 350. If we reworked the code to be sport-agnostic, then we are talking maybe 150 models? Maybe. But that would require a ton of rewriting, something we don't have time to do and would introduce complexity into the code. At this point I am thinking it would be easier to segment the app at deploy time. On Tue, Mar 8, 2011 at 12:27 PM, Nathaniel Talbott wrote: > On Tue, Mar 8, 2011 at 11:57 AM, Tyler Smart wrote: > > > Most of them do, about 85%. There is some cleanup that can be done, and I > > have a project underway to do that, but that still leaves a significant > > number of models, something that will only grow. > > While I concede that there are cases where that many models make > sense, I've found in many cases there's a fundamental assumption that > can be tweaked to simplify drastically. With Spreedly for instance we > went from having one database table per payment gateway to a single > payment gateway table by making one seemingly trivial change. I guess > my next question is: do the models vary primarily in the data they > contain, the behavior they need, some combo, or something else > entirely? > > Oh, one other question while I'm at it - how many models are you > adding per sport at this point? > > > -- > Nathaniel Talbott > <:((>< > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -------------- next part -------------- An HTML attachment was scrubbed... URL: From nathaniel at talbott.ws Tue Mar 8 15:35:15 2011 From: nathaniel at talbott.ws (Nathaniel Talbott) Date: Tue, 8 Mar 2011 15:35:15 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: On Tue, Mar 8, 2011 at 1:42 PM, Tyler Smart wrote: > They vary mostly in the behavior, so I suppose there could be a lib with a > ton of logic in it that does crazy branching. We are moving to a new stats > model that will take a lot of the tables out once we clean up and so for > existing sports I expect the models to go down to about 400, maybe even 350. > If we reworked the code to be sport-agnostic, then we are talking maybe 150 > models? Maybe. But that would require a ton of rewriting, something we don't > have time to do and would introduce complexity into the code. At this point > I am thinking it would be easier to segment the app at deploy time. As with Brian, I'm mostly just curious, seeing as you're pushing the boundaries and edge cases are fun :-) How many models do you add to the system at this point when a new sport is added? -- Nathaniel Talbott <:((>< From tesmar at statsheet.com Tue Mar 8 18:08:45 2011 From: tesmar at statsheet.com (Tyler Smart) Date: Tue, 8 Mar 2011 18:08:45 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: On average we add 30-40 models per sport. We will be adding 3-4 more sports, soon as well as a bunch of new functionality which will add even MORE models. On Tue, Mar 8, 2011 at 3:35 PM, Nathaniel Talbott wrote: > On Tue, Mar 8, 2011 at 1:42 PM, Tyler Smart wrote: > > > They vary mostly in the behavior, so I suppose there could be a lib with > a > > ton of logic in it that does crazy branching. We are moving to a new > stats > > model that will take a lot of the tables out once we clean up and so for > > existing sports I expect the models to go down to about 400, maybe even > 350. > > If we reworked the code to be sport-agnostic, then we are talking maybe > 150 > > models? Maybe. But that would require a ton of rewriting, something we > don't > > have time to do and would introduce complexity into the code. At this > point > > I am thinking it would be easier to segment the app at deploy time. > > As with Brian, I'm mostly just curious, seeing as you're pushing the > boundaries and edge cases are fun :-) > > How many models do you add to the system at this point when a new > sport is added? > > > -- > Nathaniel Talbott > <:((>< > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -------------- next part -------------- An HTML attachment was scrubbed... URL: From jrubyforge-raleigh-rb at indythinker.com Tue Mar 8 15:39:33 2011 From: jrubyforge-raleigh-rb at indythinker.com (Justis Peters) Date: Tue, 08 Mar 2011 15:39:33 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: <4D76933F.3000900@indythinker.com> References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> <4D76933F.3000900@indythinker.com> Message-ID: <4D769405.7090606@indythinker.com> This was originally sent from the wrong address, so I am resending it: On 03/08/2011 03:36 PM, Justis Peters wrote: > Tyler, > > How many rows do you expect to have in these tables? If it's a lot, > then the number of tables you have may have a significant impact on > index performance. If it will be rare that you want to join tables > across multiple sports, you will probably get the best performance by > keeping them in separate tables. > > Alternately, your database might support "table partitioning" or even > "index partitioning", which could solve the issue of index > performance. Here's some relevant info for PostgreSQL and MySQL (IIRC, > there is also support in Oracle and MS SQL Server) : > http://www.postgresql.org/docs/9.0/static/ddl-partitioning.html > http://dev.mysql.com/doc/refman/5.1/en/partitioning.html > > You might also want to consider how many queries it takes to > instantiate a model from the database. Some of the solutions that have > been suggested here would involve many iterations between rails and > the database before you would be done instantiating a collection. > > Kind regards, > Justis > > On 03/08/2011 01:42 PM, Tyler Smart wrote: >> They vary mostly in the behavior, so I suppose there could be a lib >> with a ton of logic in it that does crazy branching. We are moving to >> a new stats model that will take a lot of the tables out once we >> clean up and so for existing sports I expect the models to go down to >> about 400, maybe even 350. If we reworked the code to be >> sport-agnostic, then we are talking maybe 150 models? Maybe. But that >> would require a ton of rewriting, something we don't have time to do >> and would introduce complexity into the code. At this point I am >> thinking it would be easier to segment the app at deploy time. >> >> On Tue, Mar 8, 2011 at 12:27 PM, Nathaniel Talbott >> > wrote: >> >> On Tue, Mar 8, 2011 at 11:57 AM, Tyler Smart >> > wrote: >> >> > Most of them do, about 85%. There is some cleanup that can be >> done, and I >> > have a project underway to do that, but that still leaves a >> significant >> > number of models, something that will only grow. >> >> While I concede that there are cases where that many models make >> sense, I've found in many cases there's a fundamental assumption that >> can be tweaked to simplify drastically. With Spreedly for instance we >> went from having one database table per payment gateway to a single >> payment gateway table by making one seemingly trivial change. I guess >> my next question is: do the models vary primarily in the data they >> contain, the behavior they need, some combo, or something else >> entirely? >> >> Oh, one other question while I'm at it - how many models are you >> adding per sport at this point? >> -------------- next part -------------- An HTML attachment was scrubbed... URL: From tesmar at statsheet.com Wed Mar 9 07:56:27 2011 From: tesmar at statsheet.com (Tyler Smart) Date: Wed, 9 Mar 2011 07:56:27 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: <4D769405.7090606@indythinker.com> References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> <4D76933F.3000900@indythinker.com> <4D769405.7090606@indythinker.com> Message-ID: It depends on the sport. Some stat tables like mlb have upwards of 1 - 2 billion rows (keeps growing). Nba has only in the neighborhood of 100-200 million. A lot of the smaller tables only 1 or 2 million or so, and the smallest a few thousand. We are partitioning and using indexes wisely. Separating them into sports was done for performance, and it has worked nicely. I think this is largely an issue of "OH NO I HAVE TOO MANY MODELS" and I'll keep you up to date with how the deploy-time solution works. On Tue, Mar 8, 2011 at 3:39 PM, Justis Peters < jrubyforge-raleigh-rb at indythinker.com> wrote: > This was originally sent from the wrong address, so I am resending it: > > On 03/08/2011 03:36 PM, Justis Peters wrote: > > Tyler, > > How many rows do you expect to have in these tables? If it's a lot, then > the number of tables you have may have a significant impact on index > performance. If it will be rare that you want to join tables across multiple > sports, you will probably get the best performance by keeping them in > separate tables. > > Alternately, your database might support "table partitioning" or even > "index partitioning", which could solve the issue of index performance. > Here's some relevant info for PostgreSQL and MySQL (IIRC, there is also > support in Oracle and MS SQL Server) : > http://www.postgresql.org/docs/9.0/static/ddl-partitioning.html > http://dev.mysql.com/doc/refman/5.1/en/partitioning.html > > You might also want to consider how many queries it takes to instantiate a > model from the database. Some of the solutions that have been suggested here > would involve many iterations between rails and the database before you > would be done instantiating a collection. > > Kind regards, > Justis > > > On 03/08/2011 01:42 PM, Tyler Smart wrote: > > They vary mostly in the behavior, so I suppose there could be a lib with a > ton of logic in it that does crazy branching. We are moving to a new stats > model that will take a lot of the tables out once we clean up and so for > existing sports I expect the models to go down to about 400, maybe even 350. > If we reworked the code to be sport-agnostic, then we are talking maybe 150 > models? Maybe. But that would require a ton of rewriting, something we don't > have time to do and would introduce complexity into the code. At this point > I am thinking it would be easier to segment the app at deploy time. > > On Tue, Mar 8, 2011 at 12:27 PM, Nathaniel Talbott wrote: > >> On Tue, Mar 8, 2011 at 11:57 AM, Tyler Smart >> wrote: >> >> > Most of them do, about 85%. There is some cleanup that can be done, and >> I >> > have a project underway to do that, but that still leaves a significant >> > number of models, something that will only grow. >> >> While I concede that there are cases where that many models make >> sense, I've found in many cases there's a fundamental assumption that >> can be tweaked to simplify drastically. With Spreedly for instance we >> went from having one database table per payment gateway to a single >> payment gateway table by making one seemingly trivial change. I guess >> my next question is: do the models vary primarily in the data they >> contain, the behavior they need, some combo, or something else >> entirely? >> >> Oh, one other question while I'm at it - how many models are you >> adding per sport at this point? >> > > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -------------- next part -------------- An HTML attachment was scrubbed... URL: From nathaniel at talbott.ws Wed Mar 9 09:31:30 2011 From: nathaniel at talbott.ws (Nathaniel Talbott) Date: Wed, 9 Mar 2011 09:31:30 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> Message-ID: On Tue, Mar 8, 2011 at 6:08 PM, Tyler Smart wrote: > On average we add 30-40 models per sport. We will be adding 3-4 more sports, > soon as well as a bunch of new functionality which will add even MORE > models. Wow, that's about how many models the average Rails app has total after a year or two of life; Spreedly Subscriptions is at 100 now after three years. Of course you're dealing with an edge case - most apps don't have tables with billions of rows in them until they've been around for years, either - so I wouldn't be overly concerned. Your thought of partitioning the models somehow at deploy is interesting, and I'm curious to hear how it goes. FYI, if I was looking at refactoring this somehow, I'd probably start by looking not at finding commonalities between sports, but rather at finding a way to cut down on the number of models/tables needed on a per sport basis. I'd also probably be looking hard at the usage models to see if a non-relational database of some type (Mongo, Redis, Riak, etc.) would be a better fit for a portion of the problem and thereby reduce complexity. Thanks for sharing Tyler - it's great to get a peek into what ya'll are up to over there at Statsheet. In a few months we might have to have you come in to Raleigh.rb and do a talk on what you've learned working on a such a cool and unique problem. -- Nathaniel Talbott <:((>< From aok at chariotsolutions.com Wed Mar 9 10:03:26 2011 From: aok at chariotsolutions.com (Andrea O. K. Wright) Date: Wed, 9 Mar 2011 10:03:26 -0500 Subject: [raleigh.rb] Philly Emerging Tech Conference User Group Discount Message-ID: Earlier this year, I emailed about the annual Philly Emerging Tech Conference (a.k.a. "Emerging Technologies for the Enterprise" and "Philly ETE"), which is set for April 27 and April 28. Since then, the session details have been posted on the conference website: http://phillyemergingtech.com/2011/sessions Also, a discount is now available for user group members. With the $25 user group discount (use discount code "ruby1"), a pass for this 2-day, 5-track event costs $340. The per-ticket cost goes down to $255 if you can take advantage of the "4 for the price of 3" rate (4 colleagues or friends, not necessarily from the same company, registering at the same time) on top of the user group discount. To register: http://phillyemergingtech.com/2011/register Talks by Rubyists include: * David A. Black (author of The Well-Grounded Rubyist) -- Command Performance: the why and whether of small-scale optimizations * Ola Bini (JRuby Core Team) -- Polyglot Patterns * David Chelimsky (RSpec Lead Developer) -- Developer eXperience: The Forgotten User * Davis Frank (contributor to the Jasmine BDD/JS framework) -- Practical Jasmine: Test-Driving Your JavaScript with BDD * Jay McGavren (maintainer, Jemini JRuby game framework) -- Ruby on Android with Ruboto * Yehuda Katz (SproutCore project team; Rails Core team) -- An App Within an App: Rails 3 Engines, and What's Coming in Rails 3.1 * Nick Sieger (JRuby Core Team) -- Transitioning Legacy Java to Rails with JRuby: Step By Step * Bruce Tate (author of Seven Languages in Seven Weeks) -- Mary Poppins Meets the Matrix: Seven Languages at the Cinema * Jim Weirich (creator of the Ruby tool, rake) -- Are You Satisfied with Your Tests? The conference features a wide array of technology topics, in addition to Ruby-related sessions. Here's a sampling from the program: * Jonas Boner (Akka Framework Creator) -- Akka: Simpler Scalability, Fault-Tolerance, Concurrency & Remoting Through Actors * Ryan Dahl (creator of Node.js) -- Distributed Systems with Node.js * Debasish Ghosh (author of DSLs in Action) -- DSLs: Does Expressiveness for Domain Experts Have to Compromise the Underlying Implementation * Ron Jeffries & Chet Hendrickson (co-authors of The Agile Manifesto) -- A Retrospective Rant: 15 Years in the "Agile" Business * Dave Johnson (CTO & co-founder of Nitobi, creators of PhoneGap) -- PhoneGap: Past, Present & Future * David Kaneda (creator of jQtouch) -- Building Rich User Experiences with Sencha Touch * Stuart Sierra (Clojure/core team) -- Clojure: Lisp for the Real Work * Kevin Smith (author, Erlang in Practice screencasts) -- Get some REST with Erlang: Creating Rock-solid Web Services with Webmachine -------------- next part -------------- An HTML attachment was scrubbed... URL: From info at lojic.com Wed Mar 9 12:48:31 2011 From: info at lojic.com (Brian Adkins) Date: Wed, 9 Mar 2011 12:48:31 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> <4D76933F.3000900@indythinker.com> <4D769405.7090606@indythinker.com> Message-ID: <0A2B9940-AF03-453F-B342-FF4027F18C62@lojic.com> 2 billion rows ?! Do you mind sharing what database you're using, the amount of RAM consumed and how large the indexes are for the mlb table? I recently developed a Rails/MongoDB app with 40+ million rows, and the indexes (after some painful optimization) still take about 10GB. It runs fine on a 16GB server, but we'd have some serious performance issues with 2 billion rows :) For the type of queries we're running MongoDB *really* wants the indexes to fit in RAM. In case anyone's using MongoDB, here is the output from db.stats(); > db.stats(); { "collections" : 6, "objects" : 42201870, "avgObjSize" : 352.8811947906574, "dataSize" : 14892246308, "storageSize" : 15890273024, "numExtents" : 44, "indexes" : 10, "indexSize" : 10662621888, "fileSize" : 36423335936, "ok" : 1 } Thanks, Brian On Mar 9, 2011, at 7:56 AM, Tyler Smart wrote: > It depends on the sport. Some stat tables like mlb have upwards of 1 > - 2 billion rows (keeps growing). Nba has only in the neighborhood > of 100-200 million. A lot of the smaller tables only 1 or 2 million > or so, and the smallest a few thousand. We are partitioning and > using indexes wisely. Separating them into sports was done for > performance, and it has worked nicely. I think this is largely an > issue of "OH NO I HAVE TOO MANY MODELS" and I'll keep you up to > date with how the deploy-time solution works. > > On Tue, Mar 8, 2011 at 3:39 PM, Justis Peters > wrote: > This was originally sent from the wrong address, so I am resending it: > > On 03/08/2011 03:36 PM, Justis Peters wrote: >> >> Tyler, >> >> How many rows do you expect to have in these tables? If it's a lot, >> then the number of tables you have may have a significant impact on >> index performance. If it will be rare that you want to join tables >> across multiple sports, you will probably get the best performance >> by keeping them in separate tables. >> >> Alternately, your database might support "table partitioning" or >> even "index partitioning", which could solve the issue of index >> performance. Here's some relevant info for PostgreSQL and MySQL >> (IIRC, there is also support in Oracle and MS SQL Server) : >> http://www.postgresql.org/docs/9.0/static/ddl-partitioning.html >> http://dev.mysql.com/doc/refman/5.1/en/partitioning.html >> >> You might also want to consider how many queries it takes to >> instantiate a model from the database. Some of the solutions that >> have been suggested here would involve many iterations between >> rails and the database before you would be done instantiating a >> collection. >> >> Kind regards, >> Justis >> >> >> On 03/08/2011 01:42 PM, Tyler Smart wrote: >>> >>> They vary mostly in the behavior, so I suppose there could be a >>> lib with a ton of logic in it that does crazy branching. We are >>> moving to a new stats model that will take a lot of the tables out >>> once we clean up and so for existing sports I expect the models to >>> go down to about 400, maybe even 350. If we reworked the code to >>> be sport-agnostic, then we are talking maybe 150 models? Maybe. >>> But that would require a ton of rewriting, something we don't have >>> time to do and would introduce complexity into the code. At this >>> point I am thinking it would be easier to segment the app at >>> deploy time. >>> >>> On Tue, Mar 8, 2011 at 12:27 PM, Nathaniel Talbott >> > wrote: >>> On Tue, Mar 8, 2011 at 11:57 AM, Tyler Smart >>> wrote: >>> >>> > Most of them do, about 85%. There is some cleanup that can be >>> done, and I >>> > have a project underway to do that, but that still leaves a >>> significant >>> > number of models, something that will only grow. >>> >>> While I concede that there are cases where that many models make >>> sense, I've found in many cases there's a fundamental assumption >>> that >>> can be tweaked to simplify drastically. With Spreedly for instance >>> we >>> went from having one database table per payment gateway to a single >>> payment gateway table by making one seemingly trivial change. I >>> guess >>> my next question is: do the models vary primarily in the data they >>> contain, the behavior they need, some combo, or something else >>> entirely? >>> >>> Oh, one other question while I'm at it - how many models are you >>> adding per sport at this point? > > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members -------------- next part -------------- An HTML attachment was scrubbed... URL: From tesmar at statsheet.com Wed Mar 9 14:04:21 2011 From: tesmar at statsheet.com (Tyler Smart) Date: Wed, 9 Mar 2011 14:04:21 -0500 Subject: [raleigh.rb] Profiling a Rails App In-Reply-To: <0A2B9940-AF03-453F-B342-FF4027F18C62@lojic.com> References: <4447040F-AA10-47CB-9B38-A38FD819FAE1@aaronbedra.com> <4D76933F.3000900@indythinker.com> <4D769405.7090606@indythinker.com> <0A2B9940-AF03-453F-B342-FF4027F18C62@lojic.com> Message-ID: Yes, we are approaching 1 billion in our stats processing now for the last 100 years. We are using Amazon EC2 machines with 8 core CPUs and 7.5GB of Ram. We are using JRuby to multithread the stats processing. The tables + indexes are now running 80-100GB, but when we add ranks they will shoot up to 500-700GB. I think Amazon will let us have 2TB drives. The indexes take up most of the RAM, the tables are much smaller. So there is no way to fit a 50GB index much less a 300GB index in RAM. On Wed, Mar 9, 2011 at 12:48 PM, Brian Adkins wrote: > 2 billion rows ?! Do you mind sharing what database you're using, the > amount of RAM consumed and how large the indexes are for the mlb table? > > I recently developed a Rails/MongoDB app with 40+ million rows, and the > indexes (after some painful optimization) still take about 10GB. It runs > fine on a 16GB server, but we'd have some serious performance issues with 2 > billion rows :) For the type of queries we're running MongoDB *really* wants > the indexes to fit in RAM. > > In case anyone's using MongoDB, here is the output from db.stats(); > > > db.stats(); > { > "collections" : 6, > "objects" : 42201870, > "avgObjSize" : 352.8811947906574, > "dataSize" : 14892246308, > "storageSize" : 15890273024, > "numExtents" : 44, > "indexes" : 10, > "indexSize" : 10662621888, > "fileSize" : 36423335936, > "ok" : 1 > } > > > Thanks, > Brian > > On Mar 9, 2011, at 7:56 AM, Tyler Smart wrote: > > It depends on the sport. Some stat tables like mlb have upwards of 1 - 2 > billion rows (keeps growing). Nba has only in the neighborhood of 100-200 > million. A lot of the smaller tables only 1 or 2 million or so, and the > smallest a few thousand. We are partitioning and using indexes wisely. > Separating them into sports was done for performance, and it has worked > nicely. I think this is largely an issue of "OH NO I HAVE TOO MANY MODELS" > and I'll keep you up to date with how the deploy-time solution works. > > On Tue, Mar 8, 2011 at 3:39 PM, Justis Peters < > jrubyforge-raleigh-rb at indythinker.com> wrote: > >> This was originally sent from the wrong address, so I am resending it: >> >> On 03/08/2011 03:36 PM, Justis Peters wrote: >> >> Tyler, >> >> How many rows do you expect to have in these tables? If it's a lot, then >> the number of tables you have may have a significant impact on index >> performance. If it will be rare that you want to join tables across multiple >> sports, you will probably get the best performance by keeping them in >> separate tables. >> >> Alternately, your database might support "table partitioning" or even >> "index partitioning", which could solve the issue of index performance. >> Here's some relevant info for PostgreSQL and MySQL (IIRC, there is also >> support in Oracle and MS SQL Server) : >> http://www.postgresql.org/docs/9.0/static/ddl-partitioning.html >> http://dev.mysql.com/doc/refman/5.1/en/partitioning.html >> >> You might also want to consider how many queries it takes to instantiate a >> model from the database. Some of the solutions that have been suggested here >> would involve many iterations between rails and the database before you >> would be done instantiating a collection. >> >> Kind regards, >> Justis >> >> >> On 03/08/2011 01:42 PM, Tyler Smart wrote: >> >> They vary mostly in the behavior, so I suppose there could be a lib with a >> ton of logic in it that does crazy branching. We are moving to a new stats >> model that will take a lot of the tables out once we clean up and so for >> existing sports I expect the models to go down to about 400, maybe even 350. >> If we reworked the code to be sport-agnostic, then we are talking maybe 150 >> models? Maybe. But that would require a ton of rewriting, something we don't >> have time to do and would introduce complexity into the code. At this point >> I am thinking it would be easier to segment the app at deploy time. >> >> On Tue, Mar 8, 2011 at 12:27 PM, Nathaniel Talbott wrote: >> >>> On Tue, Mar 8, 2011 at 11:57 AM, Tyler Smart >>> wrote: >>> >>> > Most of them do, about 85%. There is some cleanup that can be done, and >>> I >>> > have a project underway to do that, but that still leaves a significant >>> > number of models, something that will only grow. >>> >>> While I concede that there are cases where that many models make >>> sense, I've found in many cases there's a fundamental assumption that >>> can be tweaked to simplify drastically. With Spreedly for instance we >>> went from having one database table per payment gateway to a single >>> payment gateway table by making one seemingly trivial change. I guess >>> my next question is: do the models vary primarily in the data they >>> contain, the behavior they need, some combo, or something else >>> entirely? >>> >>> Oh, one other question while I'm at it - how many models are you >>> adding per sport at this point? >>> >> >> >> _______________________________________________ >> raleigh-rb-members mailing list >> raleigh-rb-members at rubyforge.org >> http://rubyforge.org/mailman/listinfo/raleigh-rb-members >> > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > > > > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -------------- next part -------------- An HTML attachment was scrubbed... URL: From nathaniel at talbott.ws Tue Mar 15 11:13:00 2011 From: nathaniel at talbott.ws (Nathaniel Talbott) Date: Tue, 15 Mar 2011 11:13:00 -0400 Subject: [raleigh.rb] Pre-meeting Chow Message-ID: Chow tonight will be had at Randy's Pizza: http://bit.ly/gafHf7 http://www.randyspizzartp.com/ I'll be there by 5:30, and everyone is invited to join me to chat a bit and unwind before heading over to iContact for the meeting proper. See you there! -- Nathaniel Talbott <:((>< From tesmar at statsheet.com Tue Mar 15 15:19:30 2011 From: tesmar at statsheet.com (Tyler Smart) Date: Tue, 15 Mar 2011 15:19:30 -0400 Subject: [raleigh.rb] Pre-meeting Chow In-Reply-To: References: Message-ID: See all of you there, seeing as how it is right across the street. On Tue, Mar 15, 2011 at 11:13 AM, Nathaniel Talbott wrote: > Chow tonight will be had at Randy's Pizza: > > http://bit.ly/gafHf7 > http://www.randyspizzartp.com/ > > I'll be there by 5:30, and everyone is invited to join me to chat a > bit and unwind before heading over to iContact for the meeting proper. > > See you there! > > > -- > Nathaniel Talbott > <:((>< > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -------------- next part -------------- An HTML attachment was scrubbed... URL: From blakewatters at gmail.com Wed Mar 16 19:52:15 2011 From: blakewatters at gmail.com (Blake Watters) Date: Wed, 16 Mar 2011 19:52:15 -0400 Subject: [raleigh.rb] RestKit Slides Message-ID: Thanks to Nathaniel, iContact, and everyone who came out for last night's RestKit presentation. As requested, I've thrown the slides up on my Dropbox: Keynote: https://www.dropbox.com/s/maog7z0m87a4avv/Two%20Toasters%20-%20Presentation%20-%20RestKit%20for%20Rubyists.key PDF: https://www.dropbox.com/s/t5mhs0m5x3se544/Two%20Toasters%20-%20Presentation%20-%20RestKit%20for%20Rubyists.pdf If anybody is interested in RestKit or needs some help getting started, feel free to hit me up. Best, Blake -------------- next part -------------- An HTML attachment was scrubbed... URL: From thomas at ravinggenius.com Sat Mar 19 13:13:46 2011 From: thomas at ravinggenius.com (Thomas Ingram) Date: Sat, 19 Mar 2011 13:13:46 -0400 Subject: [raleigh.rb] help with dynamically setting root controller#action Message-ID: I'm building a CMS, and I'm trying to allow a site admin to specify what they want on the home page. I have some code that hopefully illustrates my intent (https://gist.github.com/877618). The code is not currently working, and I'm not sure how to make it work. Has anyone else ever come across this and found a way to make it work? -- Thomas Ingram ><> From steve at iannopollo.com Sat Mar 19 13:43:37 2011 From: steve at iannopollo.com (Steve Iannopollo) Date: Sat, 19 Mar 2011 13:43:37 -0400 Subject: [raleigh.rb] help with dynamically setting root controller#action In-Reply-To: References: Message-ID: <2DC40691-B938-4BD8-87BE-1D1F4975AE9A@iannopollo.com> Wouldn't the easiest thing to do is make the root_url go to an action (always the same action), and that action determines what to show? Your routes shouldn't care, since the root url is always going to be '/', right? -Steve On Mar 19, 2011, at 1:13 PM, Thomas Ingram wrote: > I'm building a CMS, and I'm trying to allow a site admin to specify > what they want on the home page. I have some code that hopefully > illustrates my intent (https://gist.github.com/877618). The code is > not currently working, and I'm not sure how to make it work. Has > anyone else ever come across this and found a way to make it work? > > -- > Thomas Ingram ><> > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members From thomas at ravinggenius.com Sat Mar 19 14:33:50 2011 From: thomas at ravinggenius.com (Thomas Ingram) Date: Sat, 19 Mar 2011 14:33:50 -0400 Subject: [raleigh.rb] help with dynamically setting root controller#action In-Reply-To: <2DC40691-B938-4BD8-87BE-1D1F4975AE9A@iannopollo.com> References: <2DC40691-B938-4BD8-87BE-1D1F4975AE9A@iannopollo.com> Message-ID: You are correct that the routes don't much care; I was just thinking I didn't need a whole controller for this one special action. I updated the gist to use a controller.... I want to do more than display a different view: I want to execute the specified action and let that action determine what to do (set ivars, run before_filters etc) and what to render. If I return the action, it seems to be ignored. On Sat, Mar 19, 2011 at 13:43, Steve Iannopollo wrote: > Wouldn't the easiest thing to do is make the root_url go to an action (always the same action), and that action determines what to show? > > Your routes shouldn't care, since the root url is always going to be '/', right? -- Thomas Ingram ><> From rick.denatale at gmail.com Sat Mar 19 14:50:23 2011 From: rick.denatale at gmail.com (Rick DeNatale) Date: Sat, 19 Mar 2011 14:50:23 -0400 Subject: [raleigh.rb] help with dynamically setting root controller#action In-Reply-To: References: Message-ID: On Sat, Mar 19, 2011 at 1:13 PM, Thomas Ingram wrote: > I'm building a CMS, and I'm trying to allow a site admin to specify > what they want on the home page. I have some code that hopefully > illustrates my intent (https://gist.github.com/877618). The code is > not currently working, and I'm not sure how to make it work. Has > anyone else ever come across this and found a way to make it work? I'm not sure how to tell you to make this work but.. first of all I assume that this is part of your config/routes.rb file. second root :to => dynamic_action is the same as match "/", dynamic_action :as => :root match expects the second argument to either be a string, or something which can act as a rack endpoint, now your lambda isn't a string, so it's going to be treated as a rack middleware. It's going to be called with the rack environment as the parameter, and it needs to return a 3 element array with the response status, headers, and body. Your lambda, returns a string, which ain't gonna work. -- Rick DeNatale Blog: http://talklikeaduck.denhaven2.com/ Github: http://github.com/rubyredrick Twitter: @RickDeNatale WWR: http://www.workingwithrails.com/person/9021-rick-denatale LinkedIn: http://www.linkedin.com/in/rickdenatale From rick.denatale at gmail.com Sat Mar 19 15:22:29 2011 From: rick.denatale at gmail.com (Rick DeNatale) Date: Sat, 19 Mar 2011 15:22:29 -0400 Subject: [raleigh.rb] help with dynamically setting root controller#action In-Reply-To: References: <2DC40691-B938-4BD8-87BE-1D1F4975AE9A@iannopollo.com> Message-ID: On Sat, Mar 19, 2011 at 2:33 PM, Thomas Ingram wrote: > You are correct that the routes don't much care; I was just thinking I > didn't need a whole controller for this one special action. I updated > the gist to use a controller.... > > I want to do more than display a different view: I want to execute the > specified action and let that action determine what to do (set ivars, > run before_filters etc) and what to render. If I return the action, it > seems to be ignored. > I think you are mixing the rack and actioncontroller abstraction levels. Let's go back to your original gist, something like this MIGHT be a start: dynamic_action = lambda do |env| # I renamed the parameter since that's the conventional name for a call to a rack middleware setting = Setting[:site, :home_page].split '#' params ||= {} case setting.count when 1 # show a specific node params[:path] = setting.first s_controller, s_action = :nodes, :show_human when 2, 3 # show an arbitrary controller#action pair, with optional id s_controller, s_action, params[:id] = setting else # this shouldn't happen... # fall back to just listing nodes s_controller, s_action = :nodes, :index end "#{s_controller}_controller".classify.constantize.action(s_action).call(env) end root :to => dynamic_action But this isn't doing the right thing in terms of setting the parameters in the rack request, you need to read and understand what's happening in the actionpack routing code in rails 3 to make this work. If you go this route (pun partially intended) I'm afraid you have a ways to go. I think Steve's suggesion of just using a static route and then having the action invoked for the root url use either redirects, or calls to other actions (which would probably have to explicitly name the views they render) is going to work better than trying to monkey patch rails routing, and will be less likely to break with new rails releases. -- Rick DeNatale Blog: http://talklikeaduck.denhaven2.com/ Github: http://github.com/rubyredrick Twitter: @RickDeNatale WWR: http://www.workingwithrails.com/person/9021-rick-denatale LinkedIn: http://www.linkedin.com/in/rickdenatale From rick.denatale at gmail.com Sat Mar 19 15:26:04 2011 From: rick.denatale at gmail.com (Rick DeNatale) Date: Sat, 19 Mar 2011 15:26:04 -0400 Subject: [raleigh.rb] help with dynamically setting root controller#action In-Reply-To: References: <2DC40691-B938-4BD8-87BE-1D1F4975AE9A@iannopollo.com> Message-ID: On Sat, Mar 19, 2011 at 3:22 PM, Rick DeNatale wrote: > But this isn't doing the right thing in terms of setting the > parameters in the rack request, you need to read and understand what's > happening in the actionpack routing code in rails 3 to make this work. > By the way, part of the problem is that Rails 3 action_dispatch uses a series of rack middlewares to set up the environment before you can actually dispatch to a controller, by giving rails routing a lambda instead of a string, all that gets bypassed so you need to do it yourself. -- Rick DeNatale Blog: http://talklikeaduck.denhaven2.com/ Github: http://github.com/rubyredrick Twitter: @RickDeNatale WWR: http://www.workingwithrails.com/person/9021-rick-denatale LinkedIn: http://www.linkedin.com/in/rickdenatale From thomas at ravinggenius.com Sat Mar 19 17:29:58 2011 From: thomas at ravinggenius.com (Thomas Ingram) Date: Sat, 19 Mar 2011 17:29:58 -0400 Subject: [raleigh.rb] help with dynamically setting root controller#action In-Reply-To: References: <2DC40691-B938-4BD8-87BE-1D1F4975AE9A@iannopollo.com> Message-ID: Thanks for the help guys; I got this working! I ended up going with a controller so I wouldn't have to worry about setting up the environment. Everything works as expected, but the way it is implemented feels sub-optimal. I've updated the gist (https://gist.github.com/877618) in case anyone wants to improve on it. Specifically I'd like to the call to render. Oh well... On Sat, Mar 19, 2011 at 15:26, Rick DeNatale wrote: > By the way, part of the problem is that Rails 3 action_dispatch uses a > series of rack middlewares to set up the environment before you can > actually dispatch to a controller, by giving rails routing a lambda > instead of a string, all that gets bypassed so you need to do it > yourself. -- Thomas Ingram ><> From robbie at statsheet.com Wed Mar 23 00:26:40 2011 From: robbie at statsheet.com (Robbie Allen) Date: Wed, 23 Mar 2011 00:26:40 -0400 Subject: [raleigh.rb] Job Opportunity: Sports + Rails Message-ID: My company has a position open for a sports-loving, Rails developer with at least 3 years experience with Ruby. If you are interested in working at a fast-paced, venture-backed startup in the Triangle that has one of the largest Rails environments around, please send me an email: robbie at statsheet.com Regards, Robbie Allen Founder & CEO http://statsheet.com -------------- next part -------------- An HTML attachment was scrubbed... URL: From jeff at jumpstartlab.com Wed Mar 23 16:44:56 2011 From: jeff at jumpstartlab.com (Jeff Casimir) Date: Wed, 23 Mar 2011 16:44:56 -0400 Subject: [raleigh.rb] Ruby Jumpstart & Rails Jumpstart at the American Underground Message-ID: Raleigh Rubyists, Thanks for all your support and help recruiting attendees for my Ruby and Rails Jumpstart classes. I'm excited to be coming down and look forward to scheduling more classes in your area (like intermediate Rails, advanced Ruby, jQuery, etc). It took WEEKS of emails and calls, but I was able to relocate these classes to a more accessible location at the American Underground in Durham (http://www.americanunderground.com/). Ruby Jumpstart, an introduction to Ruby for new programmers, is going down this Saturday and Sunday: http://jumpstartlab.com/trainings/14-ruby-durham Rails Jumpstart, an introduction to Rails for programmers, follows it on Monday & Tuesday: http://jumpstartlab.com/trainings/15-rails-durham I'd particularly like to pickup one or two more people for the Ruby class. If you know someone who'd like to try out programming, please put us in touch! If the ticket price is a barrier I'm open to many options like bartering a little work or whatever! If you're already a Ruby programmer and want to bring a friend, significant other, or kid to the class and be their pair, you'd only pay for one ticket. Plus there's the discount code "raleigh" to knock 10% off any ticket. Thanks, Jeff --- Jeff Casimir Jumpstart Lab by Casimir Creative, LLC http://jumpstartlab.com @jumpstartlab on twitter From sbauman at gmail.com Wed Mar 23 17:19:27 2011 From: sbauman at gmail.com (Shannon Bauman) Date: Wed, 23 Mar 2011 17:19:27 -0400 Subject: [raleigh.rb] Job opening at funded startup Message-ID: Ruby Folks, I've joined up with some other great folks in building a local startup called Spring Metrics. We now have an ex-Google engineer, an ex-Motricity engineer, and an ex-Google Product Manager. We are looking to bring on our first full time RoR engineer to continue building out the strong engineering team. We have a great location in downtown Durham, an unlimited vacation policy, and our employees get stake in the early funded startup. Full job posting is below as well as at: http://www.springmetrics.com/jobs.html If interested, send resumes to jobs at springmetrics.com. Feel free to forward on to others if you think they may be a good fit. Thanks! Shannon ====================== Ruby on Rails Engineer Spring Metrics, a Durham-based Internet startup, is looking to hire our first full-time Ruby on Rails engineer who will bring great ideas and rock-solid execution to the front end of our well-regarded web analytics service. We are fun-loving brainiacs who live to solve difficult problems and enjoy an informal setting where the best ideas carry the day. Our goal is to assemble a team of creative dynamos who love to build products that are, simply put, awesome. If you are excited about the opportunity to shape the culture and products of a company on the rise, drop us a line. Responsibilities - Architect and code customer facing applications in Ruby on Rails - Own cutting edge JS code that will get used by millions of people - Brainstorm product features with product team Requirements - Fluent in Ruby on Rails (experience with Rails 3.x preferred) - Fluent in Javascript (non-jQuery) - Experience with jQuery - Significant experience with databases - Significant knowledge of HTML and CSS - Experience testing for the web (unit testing, browser compatibility testing) Nice-to-haves - Bachelors or Masters degree in Computer Science - Experience with version control systems (preferably Git) Still not sure if the position is right for you? Did we mention that our office is in the heart of Durham?s thriving entrepreneurial scene? Or that we?re within walking distance of tons of great restaurants? Or that we have a foosball table and a hammock in our office? Oh, and that we happen to have an unlimited vacation policy? To submit an application, send a resume to jobs at springmetrics.com -------------- next part -------------- An HTML attachment was scrubbed... URL: From sbauman at gmail.com Wed Mar 23 17:50:04 2011 From: sbauman at gmail.com (Shannon Bauman) Date: Wed, 23 Mar 2011 17:50:04 -0400 Subject: [raleigh.rb] Job opening at funded startup In-Reply-To: References: Message-ID: P.S. We're having an open house on Friday to celebrate our new office and our round of funding. If you think you might be interested in the job, or even if you just want to swing by and say hi to the team - by all means come on by. 211 N. Church St Durham, NC -shannon On Wed, Mar 23, 2011 at 5:19 PM, Shannon Bauman wrote: > Ruby Folks, > > I've joined up with some other great folks in building a local startup > called Spring Metrics. We now have an ex-Google engineer, an ex-Motricity > engineer, and an ex-Google Product Manager. We are looking to bring on our > first full time RoR engineer to continue building out the strong engineering > team. We have a great location in downtown Durham, an unlimited vacation > policy, and our employees get stake in the early funded > startup. > > Full job posting is below as well as at: > http://www.springmetrics.com/jobs.html > > If interested, send resumes to jobs at springmetrics.com. Feel free to > forward on to others if you think they may be a good fit. > > Thanks! > Shannon > > ====================== > > > Ruby on Rails Engineer > > Spring Metrics, a Durham-based Internet startup, is looking to hire our > first full-time Ruby on Rails engineer who will bring great ideas and > rock-solid execution to the front end of our well-regarded web analytics > service. > > We are fun-loving brainiacs who live to solve difficult problems and enjoy > an informal setting where the best ideas carry the day. Our goal is to > assemble a team of creative dynamos who love to build products that are, > simply put, awesome. > > If you are excited about the opportunity to shape the culture and products > of a company on the rise, drop us a line. > > Responsibilities > > - Architect and code customer facing applications in Ruby on Rails > - Own cutting edge JS code that will get used by millions of people > - Brainstorm product features with product team > > Requirements > > - Fluent in Ruby on Rails (experience with Rails 3.x preferred) > - Fluent in Javascript (non-jQuery) > - Experience with jQuery > - Significant experience with databases > - Significant knowledge of HTML and CSS > - Experience testing for the web (unit testing, browser compatibility > testing) > > Nice-to-haves > > - Bachelors or Masters degree in Computer Science > - Experience with version control systems (preferably Git) > > Still not sure if the position is right for you? Did we mention that our > office is in the heart of Durham?s thriving entrepreneurial scene? Or that > we?re within walking distance of tons of great restaurants? Or that we have > a foosball table and a hammock in our office? Oh, and that we happen to have > an unlimited vacation policy? > > To submit an application, send a resume to jobs at springmetrics.com > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tom.brooke at gmail.com Thu Mar 24 08:49:42 2011 From: tom.brooke at gmail.com (Tom Brooke) Date: Thu, 24 Mar 2011 08:49:42 -0400 Subject: [raleigh.rb] Ruby Jumpstart & Rails Jumpstart at the American Underground In-Reply-To: References: Message-ID: Jeff I got a note from Jim Van Fleet about possible classes in Charlotte and which would be nice and the Raleigh classes but I guess in my case Raleigh is about the same so I could go to either. I was in contact with you earlier about Rails training in Raleigh and ended up going with Engine Yard which I don't regret but yours might have been a better choice and I plan to do some of yours in the future. The engine yard training was intense and it did get me going on Rails but barely which I guess is all I can expect in 4 days. The training had a heavy emphasis on rspec whic I know is a good thing but as a beginner just playing with Rails I feel like I need to just get a feel for rails and add the rspec later- They're philosophy was that even though rspec was difficult at first I would be grateful in the long run. Also the training was very fast whic again I guess was necessary since there was a lot to cover So as I continue I may be interested in advanced rails, advanced Ruby or jquery so keep me posted as to Raleigh or Charlotte schedules Keep me posted Tom Brooke On Wed, Mar 23, 2011 at 4:44 PM, Jeff Casimir wrote: > Raleigh Rubyists, > > Thanks for all your support and help recruiting attendees for my Ruby > and Rails Jumpstart classes. I'm excited to be coming down and look > forward to scheduling more classes in your area (like intermediate > Rails, advanced Ruby, jQuery, etc). It took WEEKS of emails and > calls, but I was able to relocate these classes to a more accessible > location at the American Underground in Durham > (http://www.americanunderground.com/). > > Ruby Jumpstart, an introduction to Ruby for new programmers, is going > down this Saturday and Sunday: > http://jumpstartlab.com/trainings/14-ruby-durham > > Rails Jumpstart, an introduction to Rails for programmers, follows it > on Monday & Tuesday: http://jumpstartlab.com/trainings/15-rails-durham > > I'd particularly like to pickup one or two more people for the Ruby > class. If you know someone who'd like to try out programming, please > put us in touch! If the ticket price is a barrier I'm open to many > options like bartering a little work or whatever! If you're already a > Ruby programmer and want to bring a friend, significant other, or kid > to the class and be their pair, you'd only pay for one ticket. Plus > there's the discount code "raleigh" to knock 10% off any ticket. > > Thanks, > Jeff > > --- > Jeff Casimir > Jumpstart Lab by Casimir Creative, LLC > http://jumpstartlab.com > @jumpstartlab on twitter > _______________________________________________ > raleigh-rb-members mailing list > raleigh-rb-members at rubyforge.org > http://rubyforge.org/mailman/listinfo/raleigh-rb-members > -------------- next part -------------- An HTML attachment was scrubbed... URL: From mikekeung at gmail.com Thu Mar 24 19:54:55 2011 From: mikekeung at gmail.com (Michael Keung) Date: Thu, 24 Mar 2011 19:54:55 -0400 Subject: [raleigh.rb] Startup looking for developer / tech strategist Message-ID: <000001cbea7e$e1712a60$a4537f20$@com> Hi all, I am currently developing an online fitness platform and am looking for developers who are interested in helping realize the vision. The platform focuses on developing interconnected applications and incorporating social networking aspects. The role would be to develop the concepts using Ruby on Rails but individuals are expected to play a major role in defining the company strategy and concept implementation. We want developers who are enthusiastic in the computer science field or enthusiastic about fitness. Developers would gain equity in the company. If interested, please contact me at mikekeung at gmail.com with a portfolio of your work. Best regards, Michael Keung Co-founder Evitca.com -------------- next part -------------- An HTML attachment was scrubbed... URL: