SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|

2023-04-30(Sun) Ruby on Rails and Factorio

  九四ドライブが楽しすぎたからか、帰ってきてからというもの、どうもやる気が出ない。九四ドライブのまとめも滞っているので、その先のブログも滞っている。

  が、やる気が出ずにダラダラしていると、次第に心が苦しくなってくるタチなので、なにか新しいことを始めなくては、と思って始めたのがRuby on Railsだ。

  我ながらRubyはネイティブ言語のように使いこなせるが、RailsはDBとくっついていて、敷居が高そうというイメージでイマイチ興味がわかなかった。しかし、Rubyでプログラマをしようと思うと、Ruby on Railsが基本らしい。

  つうわけで、まずはコンテナで開発できる環境を整えようと思ったのが4/10。しかし、開発環境が整うまでに10日ほどもかかった。それから、習作のカレンダを作り始めて10日。ようやく形になった。休日と予定の登録ができる。

  カジってみると、DBとくっついているというイメージはそのとおりだった。MVCスタイルを強要されるが、以前にメーラを開発した際、自己流ながら取り入れ、そこそこうまく行った経験があるのでイヤじゃない。

  結局、わかったことは、必要だと思うデータ構造を、全部「rails generatescaffold XXX」して、その雛形に肉付けしていけばいい、ということだ。驚くべきは、今回の習作のカレンダは、コードにして30行くらいで済んでいる。カレンダの描画以外、休日や予定の登録や更新、削除処理は書かずにデフォルト処理で済んでしまっているのが大きい。

  画像の説明

$ rails generate scaffold Calendar
$ rails generate scaffold Holiday day:date:index cause:string
$ rails generate scaffold Schedule day:date:index member:string note:text
diff --git a/config/routes.rb b/config/routes.rb
index c5228e5..880faaf 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1,4 +1,5 @@
 Rails.application.routes.draw do
+  root "calendars#index"
   resources :schedules
   resources :holidays
   resources :calendars
diff --git a/app/controllers/calendars_controller.rb b/app/controllers/calendars_controller.rb
index ec6db2e..3c75b0f 100644
--- a/app/controllers/calendars_controller.rb
+++ b/app/controllers/calendars_controller.rb
@@ -4,6 +4,27 @@ class CalendarsController < ApplicationController
   # GET /calendars or /calendars.json
   def index
     @calendars = Calendar.all
+
+	@today = Date.today
+	@first_day = @today.beginning_of_month
+	@start_day = @first_day - @first_day.wday
+
+	@days = []; day = @start_day
+	loop {
+		7.times {
+			@days << {
+				day:			day,
+				holidays:		Holiday.where(day: day),
+				schedules:		Schedule.where(day: day),
+				attrs:			{},
+			}
+			@days.last[:attrs][:color] = day.strftime('%a').downcase
+			@days.last[:attrs][:color] = 'holiday' if(@days.last[:holidays].size > 0)
+			@days.last[:attrs][:size] = 'small' if(day.mon != @today.mon)
+			day += 1
+		}
+		break if(day.mon != @today.mon)
+	}
   end
 
   # GET /calendars/1 or /calendars/1.json
diff --git a/app/views/calendars/index.html.erb b/app/views/calendars/index.html.erb
index 069f2ce..5c44f22 100644
--- a/app/views/calendars/index.html.erb
+++ b/app/views/calendars/index.html.erb
@@ -1,5 +1,29 @@
 <p style="color: green"><%= notice %></p>
 
+<H1>Calendar</H1>
+	<H3><%= @today.year %>/<%= @today.mon %></H3>
+		<TABLE border='1' cellspacing='0' cellpadding='4'>
+			<TR align='center'><TD>
+<%				@days[0, 7].each {|day| %>
+					<TD><IMG src='/rd.png' width='128' height='1'><BR><SPAN class='<%= day[:attrs][:color] %>'><%= day[:attrs][:color].upcase %></SPAN>
+<%				}
+				@days.each {|day|
+					if(day[:day].wday == 0) %>
+						<TR valign='top'><TD><IMG src='/rd.png' width='1' height='64'>
+<%					end %>
+							<TD><SPAN class='<%= [day[:attrs][:color], day[:attrs][:size]].join(' ').strip %>'><%= link_to(day[:day].day, new_schedule_path(day: day[:day])) %></SPAN>
+<%							day[:holidays].each {|holiday| %>
+								<SPAN class='cause'><%= holiday.cause %></SPAN>
+<%							}
+							day[:schedules].each {|schedule| %>
+								<BR><SPAN class='member'><%= schedule.member %></SPAN>:
+								<SPAN class='note'><%= link_to(schedule.note, schedule) %></SPAN>
+<%							}
+				} %>
+		</TABLE>
+
+<%= link_to "Manage Holidays", holidays_path %>
+
 <h1>Calendars</h1>
 
 <div id="calendars">
diff --git a/app/views/schedules/_form.html.erb b/app/views/schedules/_form.html.erb
index 29f58c0..3662bbd 100644
--- a/app/views/schedules/_form.html.erb
+++ b/app/views/schedules/_form.html.erb
@@ -13,7 +13,7 @@
 
   <div>
     <%= form.label :day, style: "display: block" %>
-    <%= form.date_field :day %>
+    <%= form.date_field(:day, value: params[:day]) %>
   </div>
 
   <div>
diff --git a/app/assets/stylesheets/base.css b/app/assets/stylesheets/base.css
index e69de29..08a0148 100644
--- a/app/assets/stylesheets/base.css
+++ b/app/assets/stylesheets/base.css
@@ -0,0 +1,25 @@
+a {
+	color: inherit;
+}
+span.sun {
+	color: red;
+}
+span.sat {
+	color: blue;
+}
+span.holiday {
+	color: red;
+}
+span.small {
+	font-size: 60%;
+}
+span.cause {
+	font-size: 80%;
+}
+span.member {
+	font-size: 80%;
+}
+span.note {
+	font-size: 80%;
+}
+

  まだ、月間の移動機能がなかったり、曜日表示にバグがあったりするが、習作のカレンダを完成させるより、何か実用的なものを作ってみたくなったな。

  と、もうひとつ。始めてしまったのがFactorioだ。

  以前に任天堂スイッチのデモでチラッと見たデモが面白そうだったのだが、体験版をダウンロードしたら、いきなり病みつきになってしまった。恐ろしいことに、Linux版が手元の環境で快適に動いてしまった。これはアブない。

  体験版は5つのキャンペーンの形を採っているが、十数時間は遊べるボリュームで、かつ、目的達成後もご自由にお続けください、と、まったくケチなところがない。

  目的は手動でも達成できないことはないが、自動化して楽をするため、目的を達成するための工場を作り、次の目的を達成するための工場を作り……と、延々と遊べてしまう。これは、一種のプログラミングだよな。楽しいわけだ。

  ただし、行き当たりばったりで作っていると、ラインが詰まったりして、頻繁に手作業が生じてストレスが溜まる。結局、体験版を2度もクリアしてしまったが、どうにも納得できない。

  画像の説明

  あー、一番最初のサラ地から遊びたいが製品版を買いたくないなぁ。いや、このゲームのデキなので、金が惜しいという思いはまったくないが、製品版を買ったら最後、どれくらいの時間を吸い取られてしまうのか考えると、怖すぎるのだ……。