1/17 学習記録 (カレンダープログラム)

<目標>

  • カレンダープログラム終了する
  • 丁寧に作業する ペースを守る
  • モチベーションをキープする
  • 12ポモドーロ
  • 日報の時間を測る
  • privateに関する技術書を読む
  • 他の方の日報を読む

<メモ>

カレンダープログラム作成

$ ./cal.rb -y 2020 -m 11 
      11月 2020        
日 月 火 水 木 金 土  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
15 16 17 18 19 20 21  
22 23 24 25 26 27 28  
29 30

これを表示させる。全然わからない。

クリアすべきこと(おそらく)。

  1. shell コマンドでのオプション設定 (-y&-m)OK 3
  2. 1行目の?月 ?年の表示 OK 2
  3. 2行目の曜日表示 OK 4
  4. カレンダー表示コマンドを探す OK 1
  5. 日にちの横並び表示OK 6
  6. 日にちの7日ごとの折り返し表示OK 7
  7. 1日目を表示する曜日の設定OK 5

  8. shellでのruby入力を省略するOK 8

でしょうか。。。

順番

  1. カレンダー表示コマンドを探す
  2. 1行目の?月 ?年の表示
  3. shell コマンドでのオプション設定 (-y&-m)
    • シェルコマンドから数値入力できた
  4. 2行目の曜日表示

  5. 日にちの横並び表示

  6. 日にちの7日ごとの折り返し表示

<1> shell コマンドでのオプション設定 (-y&-m)

.

引数付きショートネームオプションの処理.

  • オプションに:をつける
#!/usr/bin/env ruby
require 'optparse'

options = ARGV.getopts('a:')
puts options
% ./arg.rb -a 111
{"a"=>"111"}
#!/usr/bin/env ruby

これ何?、、、shebangでした!直接ファイルに書いてよし! なるほどー。ほんとかなー。

#!/usr/bin/env ruby
require 'optparse'
options = ARGV.getopts('y:','m:')
puts options
puts options["y"]
puts options["m"]
{"y"=>"2020", "m"=>"11"}
2020
11

よっしゃー。ARGV.getopts('y:','m:')はハッシュを出力してたんですねー。これでシェルとRubyが繋がった! で持ってハッシュから取り出した数字はSTRINGだったので、それをINTEGERに変更。


< 2 > 1行目の?月?年の表示.

time = Time.now
 
p time
p time.strftime("%Y年%-m月%-d日 %-H時%-M分%-S秒")

実行結果

2018-01-02 03:04:05 +0900
"2018年1月2日 3時4分5秒"
time = Time.now
p time.strftime("%-m月%Y")

この時間入力を

date = Date.new(2020,11.1)
p date.strftime("%-m月%Y")

に変更して

"11月2020" 

が得られる。 これにシェルから入力できるようにする。 pではなくputsメソッドでダブルクオーテーションが取れた :) (p (数値)は""なしで出力される)


<4> カレンダー表示コマンドを探す

Date.parseの使い方

date = Date.parse("2018/02/26")
p date
#=>#<Date: 2018-02-26 ((2458176j,0s,0n),+0s,2299161j)>
date = Date.parse("2018/3/3")
p date
#=#<Date: 2018-03-03 ((2458181j,0s,0n),+0s,
2299161j)>
>date = Date.parse("20181126")
p date
#= #<Date: 2018-11-26 ((2458449j,0s,0n),+0s,2299161j)>

Dateクラス.

require 'date'

a = Date.new(1993, 2, 24)
b = Date.parse('1993-02-24')
b += 10

b - a            #=> 10
b.year           #=> 1993
b.strftime('%a') #=> "Sat"

yesterday = Date.today - 1

曜日が出てきた! これを入力したらその月の初めの日が何曜日が特定できる

.strftimeメソッド

表示を選べる

入力した日付と曜日を表示

require 'date'
a = Date.new(2020, 11, 1)
p a.strftime('%a') #=> "Sat"

曜日の日本語表示.

require 'date'
 
date = Date.today
 
weeks = ["","","","","","",""]
 
index = date.strftime("%u").to_i
 
p date.strftime("%Y年%-m月%-d日 %u")
p date.strftime("%Y年%-m月%-d日 #{weeks[index - 1]}曜日")

<5> 日にちの横並び表示

n=0
while n<10
n += 1 
printf "#{n} "
end
printf "\n"

\で改行

7. 1日目を表示する曜日の設定

一日目を表示する曜日の設定

day = date.strftime('%a')
p day
case day
    when "Mon"
    puts"00"
    when "Tue"
    puts"0000"
    when "Wed"
    puts"000000"
    when "Thu"
    puts"00000000"
    when "Fri"
    puts"0000000000"
    when "Sat"
    puts"000000000000"
end

この後に一日目からの文字列を入れる

if
n=0
while n<10
n += 1 
printf "#{n} "

end

whileの上限は閏年を分けて月ごとに設定

if year%4==0 and year%400!=0 
    case 
    when month == 4 , month == 6 , month == 9 ,month == 11
    puts "30" 
    when month == 1 , month == 3 , month == 5 , month == 7 , month == 8 ,month == 10||month == 12
    puts "31 "
    when month == 2
    puts "29 "
    end
else
    case 
    when month == 4 , month == 6 , month == 9 ,month == 11
    puts "30" 
    when month == 1 , month == 3 , month == 5 , month == 7 , month == 8 ,month == 10||month == 12
    puts "31"
    when month == 2
    puts "28"
    end
end

whenのor設定は

case month
    when 4 , 6 , 9 , 11

case 
when month == 4 , month == 6 , month == 9 ,month == 11

のどちらか。比較演算子

month = 6

puts month == 5 || month == 6

month ==表記のみ、当たり前か。caseの条件表記が簡素化されている。

つなげて表示

if year%4==0 and year%400!=0 
    case month
    when 4 , 6 , 9 , 11
    last = "30" 
    when 1 , 3 , 5 , 7 , 8 , 10, 12
    last = "31 "
    when 2
    last = "29 "
    end
else
    case month
    when 4 , 6 , 9 , 11
    last = "30" 
    when 1 , 3 , 5 , 7 , 8 , 10, 12
    last = "31"
    when 2
    last = "28"
     end
end

n=0
while n<last.to_i
n += 1 
printf " #{n}"
end
printf "\n"

カレンダーは1桁の数字も2桁表示。 でも全部の文字列の前にスペースが表示される。。。1桁なら2桁スペース。2桁なら3桁。。。バカっぽいけどマニュアルで付け足す

n += 1 
    if n < 10
    printf "  #{n}"
    else
    printf " #{n}"
    end
end

できた。次は00123..の文字列を連結。Joinだっけ?

array = ["GSE", "VSE", "MSE"]

puts array.join

#=>

GSEVSEMSE

違った。ちなみに、

array = ["GSE", "VSE", "MSE"]
puts array.join(",")

#=>

GSE,VSE,MSE

って足し算でよかったみたい。。。 ちなみにいろいろな文字列連結 メソッドによって処理スピードが700倍差が出るそうです。

と思ったら、printfは文字列を作っているのではく、改行せずに文字を出力しているから、文字列に見えていただけで、これを文字列にすることができず、一度配列にpush。

n=0
while n<31
n += 1 
    if n < 10
    monthly_date.push("  #{n}")
    else 
    monthly_date.push(" #{n}")  
    end
end

puts monthly_date

ここで.joinの出番?

puts monthly_date.join

で 横並びの文字列を取得!

0はあとでスペースにかえるとして、いよいよ切り分けて改行!

6. 日にちの7日ごとの折り返し表示

色付き出力.

配列を文字列にしてから分割するのは、改行が思いの外難しい。 配列を分割してから文字列にしてみよう。

Enamerable#Each.sliceなら分割できる?

data_2 = (0..100000).to_a
puts data_2[69762]

を範囲指定[1..7]、[8..14],,, 文字列の一番左の文字を削除.

str = "あいうえお"
str[1..-1] # => "いうえお" 

できたっぽい! 途中で見つけた .center()で年月をセンター寄せ。

8. shellでのruby入力を省略する

  • 実行権限を与える

年月の入力がなかった場合、今日の日付を表示する

begin rescue endを使用 rescueした先のファイル

日付の取得は.mdayメソッド 付きの最終日はlastdate = Date.new(year, month, -1)

Rubocopインストール 

Gemfileに追加(ローカルフォルダに保存されている)。

gem "pry" <=以前インストールしたもの。
gem 'rubocop', require:false
gem 'rubocop-rails', require:false
gem 'rubocop-performance', require:false

### その前にbundlerをインストール まだインストールしてなかった。

それにしても掘れば掘るほど右もわからない。。。

結局rubocopインストールできず。。。

また明日。。。