Feel Physics Backyard

HoloLensの出張授業をする会社で、教材を開発しています

090630-スレッドを使ってみた

新しい記事があります。

リンク: 090720-別スレッドが終了するまで待つには: Non-programmer's Ruby in Pocket.


別スレッドが終了するまで待つようにしてみた。

先日作ったGoogleカレンダーを表示するプログラムが問い合わせに時間がかかるので、ネット上の問い合わせ部分とローカルの時計を参照する部分を分けて、別スレッドにしてみた。まだタイミングを合わせるなどはまったくしていない荒削りなスクリプトだが、とりあえず動く。 ====

$KCODE="UTF-8" # 外部とのやり取りはUTF-8で
require "kconv" # Windowsで表示するには、SJISに変換しなければならない

##### 目次 #####

##### 初期設定 #####
##### 時刻表示 #####
##### 天気 #####
##### Googleカレンダー #####

##### 初期設定 #####

def putsjis(string = "")
  puts(string.tosjis)
#  puts(string)
end

# 現在からの残り時間を整形する
class TimeLength
  def initialize(time)
    @seconds = time - Time.now
  end
  def format

    flag = "あと "
    if @seconds < 0
      @seconds = -@seconds
      flag = "《超過》 "
    end

    minutes = (@seconds / 60).round
    hours = (minutes / 60).round
    minutes = minutes % 60

    flag + hours.to_s + " 時間 " + minutes.to_s + " 分"
  end
end

class Event
  def initialize(label, notify_hour, notify_minute, hour, minute, day_option = :today)
    @label = label
    @now = Time.now
    if day_option == :tomorrow
      @day = @now.day + 1
    else
      @day = @now.day
    end
    @notify_starttime = Time.local(@now.year, @now.month, @now.day, notify_hour, notify_minute)
    @event_starttime = Time.local(@now.year, @now.month, @day, hour, minute)
  end

  def println
    if @notify_starttime <= @now && @now <= @event_starttime + 60*30 # 30分後まで
      tl = TimeLength.new(@event_starttime)
      putsjis @label + "まで:"
      putsjis tl.format
      putsjis
      sleep 1
    end
  end
end

##### 時刻表示 #####

Thread.new do
  # 現在時刻を表示して1秒待つ
  putsjis "現在時刻:"
  putsjis Time.now.strftime("%H 時 %M 分")
  putsjis
  sleep 1

  # 起床時刻は翌日の6時30分
  getup_event = Event.new("起床時刻", 17, 15, 6, 30, :tomorrow)
  getup_event.println
  # 準備開始時刻は当日の7時20分
  prepare_event = Event.new("準備開始時刻", 6, 30, 7, 20)
  prepare_event.println
  # 出発時刻は当日の7時30分
  going_event = Event.new("出発時刻", 6, 30, 7, 30)
  going_event.println
  # 昼食は当日の12時30分
  cooldown_event = Event.new("昼食", 10, 30, 12, 30)
  cooldown_event.println
  # 退勤時刻は当日の17時15分
  cooldown_event = Event.new("退勤時刻", 15, 15, 17, 15)
  cooldown_event.println
end

##### 天気 #####

require "weatherhacks"

forecast = WeatherHacks.lwws("東京", :tomorrow)
putsjis "明日の天気:"
putsjis forecast.telop
putsjis

##### Googleカレンダー #####

# 今日と明日の予定をGoogleカレンダーから取得し、表示します
# はじめにメールアドレス、パスワード、カレンダーの非公開URLを設定して下さい

require 'gcalapi'

# アカウントメールアドレス
mail = "xxxx@gmail.com"
# パスワード
pass = "xxxx"
# Googleカレンダーの「カレンダー設定」画面から取得した非公開URL
feed = "http://www.google.com/calendar/feeds/xxxx%40gmail.com/private-xxxxxxxx/basic"

# Googleカレンダーから予定を取得し、eventsに格納する
srv = GoogleCalendar::Service.new(mail, pass)
cal = GoogleCalendar::Calendar::new(srv, feed)
events = cal.events

# 今日の日付の文字列を作っておく
TODAY = Time.now.strftime("%Y/%m/%d")

putsjis "今日の予定:"
putsjis
sleep 1

# 各予定について・・・
events.each do |event|
  title = event.title

  # 時刻指定されている場合
  if /^(\w*): (\d{4}\/\d{2}\/\d{2}) (\d{2}):(\d{2})~(\d{2}:\d{2}).*/ =~ event.desc
    event_type = :time_ok
    type = Regexp.last_match(1).to_s
    date = Regexp.last_match(2).to_s
    hour = Regexp.last_match(3).to_s
    minute = Regexp.last_match(4).to_s
    endtime = Regexp.last_match(4).to_s
    if date == TODAY
      event_tmp = Event.new(title, 0, 0, hour, minute)
      event_tmp.println
    end

    # 時刻指定されていない場合
  elsif /^(\w*): (\d{4}\/\d{2}\/\d{2})~(\d{4}\/\d{2}\/\d{2}).*/ =~ event.desc
    event_type = :time_ng
    type = Regexp.last_match(1).to_s
    starttime = Regexp.last_match(2).to_s
    endtime = Regexp.last_match(3).to_s

    # 開始日のみの場合
  elsif /^(\w*): (\d{4}\/\d{2}\/\d{2}).*/ =~ event.desc
    event_type = :only_startdate
    type = Regexp.last_match(1).to_s
    starttime = Regexp.last_match(2).to_s
  else
    raise "unexpected format: " + event.desc
  end
end
putsjis "以上"

sleep 2