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
これを表示させる。全然わからない。
クリアすべきこと(おそらく)。
- shell コマンドでのオプション設定 (-y&-m)OK 3
- 1行目の?月 ?年の表示 OK 2
- 2行目の曜日表示 OK 4
- カレンダー表示コマンドを探す OK 1
- 日にちの横並び表示OK 6
- 日にちの7日ごとの折り返し表示OK 7
1日目を表示する曜日の設定OK 5
shellでの
ruby
入力を省略するOK 8
でしょうか。。。
順番
- カレンダー表示コマンドを探す
- 1行目の?月 ?年の表示
- shell コマンドでのオプション設定 (-y&-m)
- シェルコマンドから数値入力できた
2行目の曜日表示
日にちの横並び表示
- 日にちの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
できた。次は00
と123..
の文字列を連結。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インストールできず。。。
また明日。。。