From: Ken Bloom Date: 2007-08-14T23:40:05+09:00 Subject: Re: Any Muslims around? On Tue, 14 Aug 2007 20:50:02 +0900, Kyrre Nyg奪rd wrote: > Just wondering if any Muslims have gotten around to making a Ruby script > that like plays a sound or something when it's time for prayer. > > Thanks, > Kyrre Nyg奪rd Would this help? I use it as part of a suite of scripts for computing times that Orthodox Jews use to compute times for prayer. The algorithm comes from the US Naval Observatory's Almanac for Computers. --Ken require 'date' require 'mathn' #methods stolen from ruby-doc.org class Date def to_datetime() DateTime.new0(self.class.jd_to_ajd(jd, 0, 0), @of, @sg) end def to_date() self end def to_time() Time.local(year, mon, mday) end end class DateTime def to_date() Date.new0(self.class.jd_to_ajd(jd, 0, 0), 0, @sg) end def to_datetime() self end def to_time d = new_offset(0) d.instance_eval do Time.utc(year, mon, mday, hour, min, sec, (sec_fraction * 86400000000).to_i) end. getlocal end end #end stolen def dms(degrees,minutes,seconds) degrees+minutes/60+seconds/60/60 end module Sunrise include Math class Location attr_accessor :latitude, :longitude, :offset def initialize(latitude,longitude) @latitude,@longitude=latitude,longitude end end def toRad(degrees) degrees*PI/180 end def toDeg(radians) radians*180/PI end def sun_rise_set(which,date,location,zenith) #step 1: first calculate the day of the year n=date.yday #step 2: convert the longitude to hour value and calculate an approximate time lngHour=location.longitude/15 t=n+ ((6-lngHour)/24) if which==:sunrise t=n+ ((18-lngHour)/24) if which==:sunset #step 3: calculate the sun's mean anomaly m=(0.9856 * t) - 3.289 #step 4: calculate the sun's true longitude l= (m+(1.1916 * sin(toRad(m))) + (0.020 * sin(toRad(2*m))) + 282.634) % 360 #step 5a: calculate the sun's right ascension ra = toDeg(atan(0.91764 * tan(toRad(l)))) % 360 ###step 5b: right ascension value needs to be in the same quadrant as L lquadrant = (l/90).floor*90 raquadrant = (ra/90).floor*90 ra=ra+(lquadrant-raquadrant) #step 5c: right ascension value needs to be converted into hours ra/=15 #step 6: calculate the sun's declination sinDec = 0.39782 * sin(toRad(l)) cosDec = cos(asin(sinDec)) #step 7a: calculate the sun's local hour angle cosH = (cos(toRad(zenith)) - (sinDec * sin(toRad (location.latitude)))) / (cosDec * cos(toRad(location.latitude))) return nil if (not (-1..1).include? cosH) #step 7b: finish calculating H and convert into hours h = (360 - toDeg(acos(cosH)))/15 if which==:sunrise h = (toDeg(acos(cosH)))/15 if which==:sunset #step 8: calculate local mean time t = h + ra - (0.06571 * t) - 6.622 t %=24 #step 9: convert to UTC return date.to_datetime+(t - lngHour)/24 end private :sun_rise_set def sunrise(date,location,zenith=90.8333) sun_rise_set :sunrise,date,location,zenith end def sunset(date,location,zenith=90.8333) sun_rise_set :sunset,date,location,zenith end end -- Ken Bloom. PhD candidate. Linguistic Cognition Laboratory. Department of Computer Science. Illinois Institute of Technology. http://www.iit.edu/~kbloom1/