SlideShare a Scribd company logo
1 of 11
Download to read offline
Runt
           Ruby gem for building temporal expressions




squeejee                                           Chris Lee
Getting started
 Install from the command line:
 $ sudo gem install runt


 Include the library in your project
 require 'rubygems'   #(not necessary in Rails)
 require 'runt'
 include Runt




squeejee                                          Chris Lee
What's a temporal expression?
 For our purposes, a temporal expression can be described as a pattern*
 that uses set expressions to describe recurring events or dates.




 * http://martinfowler.com/apsupp/recurring.pdf




squeejee                                                             Chris Lee
Simple expressions
    Every
    week      EveryTE.new(Time.now, 1, DPrecision::Precision.week)




    Tues,
    Thurs     DIWeek.new(2) | DIWeek(Thursday)




    Except
   Holidays   Date.new(2008, 11, 27), Date.new(2008, 12, 25)




squeejee                                                             Chris Lee
Putting it together

                                       Every            Tues,               Except
  temporal_expression                  week             Thurs              Holidays




  weekly_interval = EveryTE.new(Time.now, 1, DPrecision::Precision.week)
  days_in_week    = DIWeek.new(2) | DIWeek.new(Thursday)
  holidays        = Date.new(2008, 11, 27), Date.new(2008, 12, 25)

  temporal_expression = weekly_interval & days_in_week - holidays




squeejee                                                               Chris Lee
Matching
  temporal_expression = weekly_interval & days_in_week - holidays

  temporal_expression.to_s

  # => quot;every 1 weeks starting Fri Oct 10
  11:14:32 2008 and every Tuesday or Thursday
  except for 2008-11-272008-12-25quot;

  temporal_expression.include?(Date.new(2008,   10,   6)) # => false, monday
  temporal_expression.include?(Date.new(2008,   10,   7)) # => true, tuesday
  temporal_expression.include?(Date.new(2008,   11,   20)) # => true, thursday
  temporal_expression.include?(Date.new(2008,   11,   27)) # => false # thanksgiving

  temporal_expression.include?(Date.new(2008, 9, 25))
  # => false why? It’s a thursday

  # Use quot;REWeek.new(0, 6)quot; instead if there is no base date.




squeejee                                                                    Chris Lee
Date ranges
 Create an event that occurs every week, on Tuesdays and Thursdays, except
 Thanksgiving and Christmas, for 1 year (2008).
  temporal_expression.dates(DateRange.new(
     PDate.day(2008, 1, 1), # start date
     PDate.day(2008, 12, 31)) # end date
   ).each do |date
        a = Activity.new(
           :scheduled_at => Time.utc(date.year, date.month, date.day)
       a.save
    end




squeejee                                                                Chris Lee
More expressions
 “Every 3 months, starting this month”
   EveryTE.new(Time.now, 3, DPrecision::Precision.month)


 “The last Thursday of a month”
   DIMonth.new(Last, Thursday)


 “The 12th-15th of a month”
   REMonth.new(12, 15)

 “December 25th of a year”
   REYear.new(12, 25, 12, 25)

 “3pm – 5:30pm, every Mon, Wed, and Fri”
   (DIWeek.new(1) | DIWeek.new(3) | DIWeek.new(5)) & REDay.new(15,00,17,30)




squeejee                                                               Chris Lee
Expression builder
 “Daily 8:45am to 9:30 and Fridays or Saturday except not the last Friday of
 the month”
 Option 1
   temporal_expression = REDay.new(8,45,9,30) & DIWeek.new(Friday) |
   DIWeek.new(Saturday) - DIMonth.new(Last, Friday)
                          	


 Option 2
   temporal_expression = ExpressionBuilder.new.define do
     occurs daily_8_45am_to_9_30am
     on friday
     possibly saturday
     except last_friday
   end




squeejee                                                               Chris Lee
Runt resources
 Rubyforge: http://runt.rubyforge.org/

 Practical Ruby Gems:
 Chapter 22: ‘Handling Recurring Events with runt’




squeejee                                             Chris Lee
Thanks!
 Drop me a line: chris.lee@squeejee.com

 Web: http://squeejee.com
 Blog: http://locomotivation.com
 Code: http://github.com/squeejee
       http://github.com/cglee

 Twitter: cglee


squeejee                                  Chris Lee

More Related Content

Viewers also liked

Copyright Hil Tech Ltd Animated Road Presentation With Dynamic Road Issues Ju...
Copyright Hil Tech Ltd Animated Road Presentation With Dynamic Road Issues Ju...Copyright Hil Tech Ltd Animated Road Presentation With Dynamic Road Issues Ju...
Copyright Hil Tech Ltd Animated Road Presentation With Dynamic Road Issues Ju...guest7168f1
 
Target Presentation
Target PresentationTarget Presentation
Target Presentationguest1765c7
 
Tomate Hib Letycia F1
Tomate Hib Letycia F1Tomate Hib Letycia F1
Tomate Hib Letycia F1Semesul
 
ESE2008: WTP Update
ESE2008: WTP UpdateESE2008: WTP Update
ESE2008: WTP Updatek_raev
 
MáQuinas De Escrever De SéCulos Passados
MáQuinas De Escrever De SéCulos PassadosMáQuinas De Escrever De SéCulos Passados
MáQuinas De Escrever De SéCulos PassadosLuis Antonio Rebolo
 
How to request books from home.
How to request books from home.How to request books from home.
How to request books from home.lvlibrary
 
Presentation Re Victimization
Presentation Re VictimizationPresentation Re Victimization
Presentation Re Victimizationumbcpsych308
 
Tmp94 C251 Adfg Ja Datasheet 070914
Tmp94 C251 Adfg Ja Datasheet 070914Tmp94 C251 Adfg Ja Datasheet 070914
Tmp94 C251 Adfg Ja Datasheet 070914guesta378c1
 
Presentacion Clase Buenoooooooooo Definitivoooo
Presentacion Clase Buenoooooooooo DefinitivooooPresentacion Clase Buenoooooooooo Definitivoooo
Presentacion Clase Buenoooooooooo Definitivooooaloalobii
 
Мобильный интернет – кто здесь?!
Мобильный интернет – кто здесь?!Мобильный интернет – кто здесь?!
Мобильный интернет – кто здесь?!Elena Kotina
 
Подход к созданию независимой системы рейтингования российских вузов
Подход к созданию независимой системы рейтингования российских вузовПодход к созданию независимой системы рейтингования российских вузов
Подход к созданию независимой системы рейтингования российских вузовAnatoly Simkin
 
Publicité Linagora Avril 2008
Publicité Linagora Avril 2008Publicité Linagora Avril 2008
Publicité Linagora Avril 2008LINAGORA
 
Pedal for Charity
Pedal for CharityPedal for Charity
Pedal for Charityguymclaren
 
Poetry WebQuest
Poetry WebQuestPoetry WebQuest
Poetry WebQuesttrhl1525
 
European Leveraged Loan/HY Bond Market Analysis - November 2010
European Leveraged Loan/HY Bond Market Analysis - November 2010European Leveraged Loan/HY Bond Market Analysis - November 2010
European Leveraged Loan/HY Bond Market Analysis - November 2010Leveraged Commentary & Data
 
Development of the model of maturity of the strategic university management b...
Development of the model of maturity of the strategic university management b...Development of the model of maturity of the strategic university management b...
Development of the model of maturity of the strategic university management b...Anatoly Simkin
 
Математическая модель системы оценки эффективности реализации программ развит...
Математическая модель системы оценки эффективности реализации программ развит...Математическая модель системы оценки эффективности реализации программ развит...
Математическая модель системы оценки эффективности реализации программ развит...Anatoly Simkin
 

Viewers also liked (20)

Copyright Hil Tech Ltd Animated Road Presentation With Dynamic Road Issues Ju...
Copyright Hil Tech Ltd Animated Road Presentation With Dynamic Road Issues Ju...Copyright Hil Tech Ltd Animated Road Presentation With Dynamic Road Issues Ju...
Copyright Hil Tech Ltd Animated Road Presentation With Dynamic Road Issues Ju...
 
Target Presentation
Target PresentationTarget Presentation
Target Presentation
 
Tomate Hib Letycia F1
Tomate Hib Letycia F1Tomate Hib Letycia F1
Tomate Hib Letycia F1
 
ESE2008: WTP Update
ESE2008: WTP UpdateESE2008: WTP Update
ESE2008: WTP Update
 
La Web 2
La Web 2La Web 2
La Web 2
 
MáQuinas De Escrever De SéCulos Passados
MáQuinas De Escrever De SéCulos PassadosMáQuinas De Escrever De SéCulos Passados
MáQuinas De Escrever De SéCulos Passados
 
How to request books from home.
How to request books from home.How to request books from home.
How to request books from home.
 
Presentation Re Victimization
Presentation Re VictimizationPresentation Re Victimization
Presentation Re Victimization
 
Tmp94 C251 Adfg Ja Datasheet 070914
Tmp94 C251 Adfg Ja Datasheet 070914Tmp94 C251 Adfg Ja Datasheet 070914
Tmp94 C251 Adfg Ja Datasheet 070914
 
Presentacion Clase Buenoooooooooo Definitivoooo
Presentacion Clase Buenoooooooooo DefinitivooooPresentacion Clase Buenoooooooooo Definitivoooo
Presentacion Clase Buenoooooooooo Definitivoooo
 
Scale Mineral Production In Brazil
Scale Mineral Production In BrazilScale Mineral Production In Brazil
Scale Mineral Production In Brazil
 
Мобильный интернет – кто здесь?!
Мобильный интернет – кто здесь?!Мобильный интернет – кто здесь?!
Мобильный интернет – кто здесь?!
 
Подход к созданию независимой системы рейтингования российских вузов
Подход к созданию независимой системы рейтингования российских вузовПодход к созданию независимой системы рейтингования российских вузов
Подход к созданию независимой системы рейтингования российских вузов
 
Publicité Linagora Avril 2008
Publicité Linagora Avril 2008Publicité Linagora Avril 2008
Publicité Linagora Avril 2008
 
Bilder Og Formater
Bilder Og FormaterBilder Og Formater
Bilder Og Formater
 
Pedal for Charity
Pedal for CharityPedal for Charity
Pedal for Charity
 
Poetry WebQuest
Poetry WebQuestPoetry WebQuest
Poetry WebQuest
 
European Leveraged Loan/HY Bond Market Analysis - November 2010
European Leveraged Loan/HY Bond Market Analysis - November 2010European Leveraged Loan/HY Bond Market Analysis - November 2010
European Leveraged Loan/HY Bond Market Analysis - November 2010
 
Development of the model of maturity of the strategic university management b...
Development of the model of maturity of the strategic university management b...Development of the model of maturity of the strategic university management b...
Development of the model of maturity of the strategic university management b...
 
Математическая модель системы оценки эффективности реализации программ развит...
Математическая модель системы оценки эффективности реализации программ развит...Математическая модель системы оценки эффективности реализации программ развит...
Математическая модель системы оценки эффективности реализации программ развит...
 

Recently uploaded

How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?XfilesPro
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptxLBM Solutions
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 

Recently uploaded (20)

How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?How to Remove Document Management Hurdles with X-Docs?
How to Remove Document Management Hurdles with X-Docs?
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Key Features Of Token Development (1).pptx
Key  Features Of Token  Development (1).pptxKey  Features Of Token  Development (1).pptx
Key Features Of Token Development (1).pptx
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 

Gem and I: Runt

  • 1. Runt Ruby gem for building temporal expressions squeejee Chris Lee
  • 2. Getting started Install from the command line: $ sudo gem install runt Include the library in your project require 'rubygems' #(not necessary in Rails) require 'runt' include Runt squeejee Chris Lee
  • 3. What's a temporal expression? For our purposes, a temporal expression can be described as a pattern* that uses set expressions to describe recurring events or dates. * http://martinfowler.com/apsupp/recurring.pdf squeejee Chris Lee
  • 4. Simple expressions Every week EveryTE.new(Time.now, 1, DPrecision::Precision.week) Tues, Thurs DIWeek.new(2) | DIWeek(Thursday) Except Holidays Date.new(2008, 11, 27), Date.new(2008, 12, 25) squeejee Chris Lee
  • 5. Putting it together Every Tues, Except temporal_expression week Thurs Holidays weekly_interval = EveryTE.new(Time.now, 1, DPrecision::Precision.week) days_in_week = DIWeek.new(2) | DIWeek.new(Thursday) holidays = Date.new(2008, 11, 27), Date.new(2008, 12, 25) temporal_expression = weekly_interval & days_in_week - holidays squeejee Chris Lee
  • 6. Matching temporal_expression = weekly_interval & days_in_week - holidays temporal_expression.to_s # => quot;every 1 weeks starting Fri Oct 10 11:14:32 2008 and every Tuesday or Thursday except for 2008-11-272008-12-25quot; temporal_expression.include?(Date.new(2008, 10, 6)) # => false, monday temporal_expression.include?(Date.new(2008, 10, 7)) # => true, tuesday temporal_expression.include?(Date.new(2008, 11, 20)) # => true, thursday temporal_expression.include?(Date.new(2008, 11, 27)) # => false # thanksgiving temporal_expression.include?(Date.new(2008, 9, 25)) # => false why? It’s a thursday # Use quot;REWeek.new(0, 6)quot; instead if there is no base date. squeejee Chris Lee
  • 7. Date ranges Create an event that occurs every week, on Tuesdays and Thursdays, except Thanksgiving and Christmas, for 1 year (2008). temporal_expression.dates(DateRange.new( PDate.day(2008, 1, 1), # start date PDate.day(2008, 12, 31)) # end date ).each do |date a = Activity.new( :scheduled_at => Time.utc(date.year, date.month, date.day) a.save end squeejee Chris Lee
  • 8. More expressions “Every 3 months, starting this month” EveryTE.new(Time.now, 3, DPrecision::Precision.month) “The last Thursday of a month” DIMonth.new(Last, Thursday) “The 12th-15th of a month” REMonth.new(12, 15) “December 25th of a year” REYear.new(12, 25, 12, 25) “3pm – 5:30pm, every Mon, Wed, and Fri” (DIWeek.new(1) | DIWeek.new(3) | DIWeek.new(5)) & REDay.new(15,00,17,30) squeejee Chris Lee
  • 9. Expression builder “Daily 8:45am to 9:30 and Fridays or Saturday except not the last Friday of the month” Option 1 temporal_expression = REDay.new(8,45,9,30) & DIWeek.new(Friday) | DIWeek.new(Saturday) - DIMonth.new(Last, Friday) Option 2 temporal_expression = ExpressionBuilder.new.define do occurs daily_8_45am_to_9_30am on friday possibly saturday except last_friday end squeejee Chris Lee
  • 10. Runt resources Rubyforge: http://runt.rubyforge.org/ Practical Ruby Gems: Chapter 22: ‘Handling Recurring Events with runt’ squeejee Chris Lee
  • 11. Thanks! Drop me a line: chris.lee@squeejee.com Web: http://squeejee.com Blog: http://locomotivation.com Code: http://github.com/squeejee http://github.com/cglee Twitter: cglee squeejee Chris Lee