干支

wikipedia:干支

干支(かんし、えと、中国語: 干支、ピンイン:gānzhī)は、十干と十二支を組み合わせた60を周期とする数詞。

$ irb
irb(main):001:0> hs = ['甲','乙','丙','丁','戊','己','庚','辛','壬','癸']
=> ["甲", "乙", "丙", "丁", "戊", "己", "庚", "辛", "壬", "癸"]
irb(main):003:0> eb = ['子','丑','寅','卯','辰','巳','午','未','申','酉','戌','亥']
=> ["子", "丑", "寅", "卯", "辰", "巳", "午", "未", "申", "酉", "戌", "亥"]
irb(main):008:0> for i in 0..59
irb(main):009:1>   print "#{hs[ i % 10 ]}#{eb[ i % 12 ]} "
irb(main):010:1> end
甲子 乙丑 丙寅 丁卯 戊辰 己巳 庚午 辛未 壬申 癸酉 甲戌 乙亥 丙子 丁丑 戊寅 己卯 庚辰 辛巳 壬午 癸未 甲申 乙酉 丙戌 丁亥 戊子 己丑 庚寅 辛卯 壬辰 癸巳 甲午 乙未 丙申 丁酉 戊戌 己亥 庚子 辛丑 壬寅 癸卯 甲辰 乙巳 丙午 丁未 戊申 己酉 庚戌 辛亥 壬子 癸丑 甲寅 乙卯 丙辰 丁巳 戊午 己未 庚申 辛酉 壬戌 癸亥 => 0..59
irb(main):011:0>

干支による紀日
https://ja.wikipedia.org/wiki/%E5%B9%B2%E6%94%AF#%E5%B9%B2%E6%94%AF%E3%81%AB%E3%82%88%E3%82%8B%E7%B4%80%E6%97%A5

干支による紀年
https://ja.wikipedia.org/wiki/%E5%B9%B2%E6%94%AF#%E5%B9%B2%E6%94%AF%E3%81%AB%E3%82%88%E3%82%8B%E7%B4%80%E5%B9%B4




干支紀日の求め方
https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5#%E5%B9%B2%E6%94%AF%E7%B4%80%E6%97%A5%E3%81%AE%E6%B1%82%E3%82%81%E6%96%B9

該当日の修正ユリウス日を60で割って余りを求める。


修正ユリウス日(MJD)
https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5#%E4%BF%AE%E6%AD%A3%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E6%97%A5%EF%BC%88MJD%EF%BC%89


グレゴリオ暦から修正ユリウス日への換算
https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5#%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%82%AA%E6%9A%A6%E3%81%8B%E3%82%89%E4%BF%AE%E6%AD%A3%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E6%97%A5%E3%81%B8%E3%81%AE%E6%8F%9B%E7%AE%97


修正ユリウス日が導入された理由
https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5#%E4%BF%AE%E6%AD%A3%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E6%97%A5%E3%81%8C%E5%B0%8E%E5%85%A5%E3%81%95%E3%82%8C%E3%81%9F%E7%90%86%E7%94%B1


ユリウス通日の考案
https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5#%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5%E3%81%AE%E8%80%83%E6%A1%88


ユリウス日(理科年表オフィシャルサイト)
https://www.rikanenpyo.jp/kaisetsu/koyomi/koyomi_011.html




干支を表示するcalを作るぞ
(hscal.rb)

#!/usr/bin/env ruby
require 'date'

HS = ['甲寅','乙卯','丙辰','丁巳','戊午','己未','庚申','辛酉','壬戌','癸亥',
      '甲子','乙丑','丙寅','丁卯','戊辰','己巳','庚午','辛未','壬申','癸酉',
      '甲戌','乙亥','丙子','丁丑','戊寅','己卯','庚辰','辛巳','壬午','癸未',
      '甲申','乙酉','丙戌','丁亥','戊子','己丑','庚寅','辛卯','壬辰','癸巳',
      '甲午','乙未','丙申','丁酉','戊戌','己亥','庚子','辛丑','壬寅','癸卯',
      '甲辰','乙巳','丙午','丁未','戊申','己酉','庚戌','辛亥','壬子','癸丑']

if ARGV.size == 0
  date = Date.today
elsif ARGV[0] =~ /^(\d+)$/
  date = Date.parse("#{$1}-01-01")
elsif ARGV[0] =~ /^(\d+)-([1-9]|0[1-9]|1[0-2])$/
  date = Date.parse("#{$1}-#{$2}-01")
elsif ARGV[0] =~ /^(\d+)-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|1[0-9]|2[0-9]|3[01])$/
  date = Date.parse("#{$1}-#{$2}-#{$3}")
else
  puts "invalid argument"
  exit(0)
end

day   = date.day
month = date.month
year  = date.year
lastday = Date.new(year, month, -1).day

if month == 1
  month = 13
  year -= 1
elsif month == 2
  month = 14
  year -= 1
else
  #pass
end

mjd = ( 365.25 * year.to_f ).to_i + ( year.to_f / 400.to_f ).to_i - ( year.to_f / 100.to_f ).to_i + ( 30.59 * ( month.to_f - 2.to_f ) ).to_i + 1 - 678912

month = date.month
year  = date.year
printf "%d年%2d月\n", year, month

puts "Sun    Mon    Tue    Wed    Thu    Fri    Sat    "

cwday = mjd % 7
i = cwday

while i % 7 != 4
  print "       "
  i -= 1
end

(1..lastday).each do |d|

  printf "%2d%s ", d, HS[ ( mjd + d - 1 ) % 60 ]

  if cwday % 7 == 3
    print "\n"
  end
  cwday += 1

end

print "\n"

使ってみる。

$ ./hscal.rb 
2022年 9月
Sun    Mon    Tue    Wed    Thu    Fri    Sat    
                             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丙戌 
$ ./hscal.rb 2022
2022年 1月
Sun    Mon    Tue    Wed    Thu    Fri    Sat    
                                           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癸未 31甲申 
$ ./hscal.rb 2022-11
2022年11月
Sun    Mon    Tue    Wed    Thu    Fri    Sat    
               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丁亥 

あってるかな?

sql server のバックアップファイルをリモートサーバに作成するスクリプト

(mssql_backup_full.bat)  フルバックアップ

echo %date% %time%

set workdir=%1
set dbname=%2
set filename=%dbname%_full.bak

sqlcmd -S localhost\sqlexpress -U <ユーザ名> -P <パスワード> -Q "backup database %dbname% to disk='%workdir%\%filename%' %3 %4"
net use Y: \\<リモートサーバのIPアドレス>\<ディレクトリ> /user:<ユーザ名> <パスワード>
copy /y %workdir%\%filename% Y:
net use Y: /delete

使い方

 > mssql_backup_full.bat <workdir> <dbname> [with init]

 workdir・・・直接リモートサーバにバックアップを作成する方法がわからないので、一旦ここで指定したディレクトリ(絶対パス指定)にファイルを作成し、これをリモートサーバにコピーする。
 dbname・・・バックアップするデータベースの名前を指定する。
 with init・・・これを指定するとファイルを上書きする。なければ追記する。



(mssql_backup_log.bat)  ログバックアップ

echo %date% %time%

set workdir=%1
set dbname=%2
set filename=%dbname%_log.bak

sqlcmd -S localhost\sqlexpress -U <ユーザ名> -P <パスワード> -Q "backup log %dbname% to disk='%workdir%\%filename%' %3 %4"
net use Y: \\<リモートサーバのIPアドレス>\<ディレクトリ> /user:<ユーザ名> <パスワード>
copy /y %workdir%\%filename% Y:
net use Y: /delete

使い方

 > mssql_backup_log.bat <workdir> <dbname> [with init]

 workdir・・・直接リモートサーバにバックアップを作成する方法がわからないので、一旦ここで指定したディレクトリ(絶対パス指定)にファイルを作成し、これをリモートサーバにコピーする。
 dbname・・・バックアップするデータベースの名前を指定する。
 with init・・・これを指定するとファイルを上書きする。なければ追記する。

美しい楷書 ―中国と日本―

企画展
中村不折コレクション
美しい楷書 ―中国と日本―
2022年6月28日(火)~10月23日(日)
https://www.taitocity.net/zaidan/shodou/


楷書
https://kotobank.jp/word/%E6%A5%B7%E6%9B%B8-42493


王羲之
https://kotobank.jp/word/%E7%8E%8B%E7%BE%B2%E4%B9%8B-38607

タイムラインを作るぞ(2)

ブロックタイプのカロリーメイトの販売期間をタイムラインで表示する。


販売期間のデータ
wikipedia:カロリーメイト
(caloriemate_timeline.txt)

チーズ味,1983-04,
フルーツ味,1984-04,
チョコレート味,1993-10,
ベジタブル味,2000-09,2007
ポテト味,2007-04,2014
メープル味,2009-09,
プレーン味,2014-09,2022
バニラ味,2022-03,

名称、発売開始年月、販売終了年月。


タイムラインを作るぞ - マイノート
のmy_timeline.pl を修正し、my_timeline2.plを作る。


主な修正点
・期間は年月日で指定できるようにした。年月日は年で表現する。
 1981-01-01 → 1981 + ( 1 - 1 ) / 365 = 1981
 1981-01-02 → 1981 + ( 2 - 1 ) / 365 = 1981.00274
 1981-12-31 → 1981 + ( 365 - 1 ) /365 = 1981.99726
 ※月、日は省略してもよい。
  月、日を省略したときは、その年の1月1日。日を省略したときはその月の1日になる。
・終了日を入力しなかった場合は、"-"をタイムラインの終了日まで継続するようにした。
・タイムラインの開始年、終了年、間隔(年)は、対数を使って自動計算するようにし、また、コマンド引数でも指定できるようにした。
 タイムラインの年は、"間隔"*10 で割りきれる場合に表示する。

(my_timeline2.pl)

$ more my_timeline2.pl 
#!/usr/bin/env perl
use DateTime::Format::ISO8601;
use DateTime;

$usage = <<"EOS";
書式
  $0 <event file> [<min date>] [<max date>] [<step>]

説明
  event file : csv形式のファイル。
               event name, start date, end date
               event name : イベントの名称
               start date : 開始日または誕生日。フォーマットはyyyy[-mm[-dd]]
               end date : 終了日または没年月日。フォーマットはyyyy[-mm[-dd]]
  min date : タイムラインの開始年を指定する。
  max date : タイムラインの終了年を指定する。
  step : タイムラインのステップを指定する。単位は年。
EOS

if( $#ARGV < 0 ){
  die $usage;
}

$min = undef;
$max = undef;

$i = 0;

open( FILE, $ARGV[0] ) || die "FILE: $ARGV[0] not found.";

while(<FILE>){

  chomp();
  ($name, $start_date, $end_date) = split(/,/);

  $event[$i]{name} = $name;

  if( $start_date =~ /^(\d{4}(-(0[1-9]|1[0-2]){1}(-(0[1-9]|[12][0-9]|3[01]){1}){0,1}){0,1})(\?*)$/ ){
    #print "$1, $2, $3, $4, $5, $6";
    $event[$i]{start_date} = $start_date;
    $event[$i]{start_question} = $6;
    $temp = DateTime::Format::ISO8601->parse_datetime($1);
    $event[$i]{start_year} = $start_year = $temp->year + ( $temp->day_of_year - 1 ) / ( 365 + $temp->is_leap_year );
  }

  if( $end_date =~ /^(\d{4}(-(0[1-9]|1[0-2]){1}(-(0[1-9]|[12][0-9]|3[01]){1}){0,1}){0,1})(\?*)$/ ){
    #print "$1, $2, $3, $4, $5, $6";
    $event[$i]{end_date} = $end_date;
    $event[$i]{end_question} = $6;
    $temp = DateTime::Format::ISO8601->parse_datetime($1);
    $event[$i]{end_year} = $end_year = $temp->year + ( $temp->day_of_year - 1 ) / ( 365 + $temp->is_leap_year );
  }else{
    $event[$i]{end_date} = "";
    $event[$i]{end_question} = "";
    $event[$i]{end_year} = "continue";
  }

  if( $min eq undef || $start_year < $min ){ $min = $start_year; }
  if( $max eq undef || $max < $end_year ){ $max = $end_year; }

  $i++;

}

$n = $i;

print "min:$min\n";
print "max:$max\n";
$diff = $max - $min;
print "diff:$diff\n\n";

$a = int(log($diff)/log(10)); #maxとminの差から10を底とする対数を求める

if( $ARGV[1] ){
  $min = int( $ARGV[1] );
}else{
  $min = int( $min / 10 ** $a ) * 10 ** $a; #下位の数字を切り捨てる
}

if( $ARGV[2] ){
  $max = int( $ARGV[2] );
}else{
  $max = int( $max / 10 ** $a  + 1 ) * 10 ** $a; #下位の数字を切り上げる
}

print "range: $min - $max\n";

if( $ARGV[3] ){
  $step = $ARGV[3];
}else{
  $step = 10 ** $a / 10;
}

print "step:$step\n\n";

#年を描く
for($i=$min; $i<=$max; $i+=$step){
  if( $i == int($i) && $i % ( $step * 10 ) == 0 ){
    print $i;
    $len = length($i) - 1;
  }elsif( $len > 0 ){
    $len--;
  }else{
    print " ";
  }
}
print "\n";

#線を描く
for($i=$min; $i<=$max; $i+=$step){
  if( $i == int($i) && $i % ( $step * 10 ) == 0 ){
    print "+";
  }else{
    print "-";
  }
}
print "\n";

#個々のイベントを描く
for($i=0; $i<$n; $i++){

  if( $event[$i]{end_year} == "continue" ){
    $event[$i]{end_year} = $max * 10; #大きい数字にする
  }

  #print "$event[$i]{start_year} - $event[$i]{end_year}\n";

  $status = "out";
  for($j=$min; $j<=$max; $j+=$step){

    if( $j <= $event[$i]{start_year} && $event[$i]{start_year} < $j + $step ){
      if( $event[$i]{start_question} ){
        print "?";
      }else{
        print "I";
      }
    }elsif( $j <= $event[$i]{end_year} && $event[$i]{end_year} < $j + $step ){
      if( $event[$i]{end_question} ){
        print "?";
      }else{
        print "I";
      }
    }else{
      if( $event[$i]{start_year} <= $j && $j <= $event[$i]{end_year} ){
        print "-";
      }else{
        print " ";
      }
    }

  }

  print " $event[$i]{name}, $event[$i]{start_date} - $event[$i]{end_date}\n";

}


使ってみる

$ ./my_timeline2.pl caloriemate_timeline.txt 
min:1983.24657534247
max:2022
diff:38.7534246575342

range: 1980 - 2030
step:1

1980      1990      2000      2010      2020      2030
+---------+---------+---------+---------+---------+
   I----------------------------------------------- チーズ味, 1983-04 - 
    I---------------------------------------------- フルーツ味, 1984-04 - 
             I------------------------------------- チョコレート味, 1993-10 - 
                    I------I                        ベジタブル味, 2000-09 - 2007
                           I------I                 ポテト味, 2007-04 - 2014
                             I--------------------- メープル味, 2009-09 - 
                                  I-------I         プレーン味, 2014-09 - 2022
                                          I-------- バニラ味, 2022-03 - 


自動計算だとタイムラインの終了日が2030年になるので、終了年を2022年にする。

$ ./my_timeline2.pl caloriemate_timeline.txt 1980 2022
min:1983.24657534247
max:2022
diff:38.7534246575342

range: 1980 - 2022
step:1

1980      1990      2000      2010      2020
+---------+---------+---------+---------+--
   I--------------------------------------- チーズ味, 1983-04 - 
    I-------------------------------------- フルーツ味, 1984-04 - 
             I----------------------------- チョコレート味, 1993-10 - 
                    I------I                ベジタブル味, 2000-09 - 2007
                           I------I         ポテト味, 2007-04 - 2014
                             I------------- メープル味, 2009-09 - 
                                  I-------I プレーン味, 2014-09 - 2022
                                          I バニラ味, 2022-03 - 


タイムラインの間隔を0.5年に変更してみる。

$ ./my_timeline2.pl caloriemate_timeline.txt 1980 2022 0.5
min:1983.24657534247
max:2022
diff:38.7534246575342

range: 1980 - 2022
step:0.5

1980      1985      1990      1995      2000      2005      2010      2015      2020 
+---------+---------+---------+---------+---------+---------+---------+---------+----
      I------------------------------------------------------------------------------ チーズ味, 1983-04 - 
        I---------------------------------------------------------------------------- フルーツ味, 1984-04 - 
                           I--------------------------------------------------------- チョコレート味, 1993-10 - 
                                         I------------I                               ベジタブル味, 2000-09 - 2007
                                                      I-------------I                 ポテト味, 2007-04 - 2014
                                                           I------------------------- メープル味, 2009-09 - 
                                                                     I--------------I プレーン味, 2014-09 - 2022
                                                                                    I バニラ味, 2022-03 - 

jqを使って少し複雑な条件式でフィルタリングする方法をまとめてみた

https://qiita.com/ttiger55/items/150e9a18313a55841a32



aws ec2 describe-instances | jq -c '.Reservations[]|.Instances[]|[.InstanceId]' | wc -l
aws ec2 describe-instances | jq '.Reservations[].Instances[] | select(.State.Name != "terminated")' | grep InstanceId