無精・短気・傲慢

perlの事 いろいろ

WSLのvimでクリップボードを使う

windowsではXserverが無い為?にWSLのvimではクリップボードを共有する事が出来ません。Xserverを導入することでクリップボードを共有できる事を『WSL上のvimでクリップボードを共有する方法』で教えてもらいました。

   windowsにXserverを導入する

  1. ここ(VcXsrv Windows X Server)からVcXsrvをダウンロードしインストールする。
  2. インストールした「XLaunch」を起動する。(全てデフォルトでOK)
  3. .profileにexport DISPLAY=localhost:0.0を追加
  4. .vimrcにset clipboard=unnamedplusを追加

これでvimでyankした文字列をクリップボードに保存できwindowsアプリにてペースト(Ctrl+v)出来ます。また、windowsのアプリでコピー(Cirl+C)した文字列をvimにてペースト(pとか)できます。

   256倍便利

windowsアプリとクリップボードを共有出来るとやっぱり便利。てか、クリップボードを共有出来ないと不便すぎるでしょう。あっちこっちコピペは良くやりますから・・・

また、Xserverを導入する事で目玉や丸い時計を起動出来ます。

  • Xアプリインストール
    • sudo apt install x11-apps

カレンダー表示

 SOURCE

 menu.pm

sub panel_content{
    my $s = shift;
    my $m = $s->app->model;
    my $text = <<END_SCRIPT
   <pre>
   @{[`date +"%a %b %d %Y"`]}
   @{[$m->make_cal($m->today())]}
   </pre>
END_SCRIPT
}

 model.pm

sub make_days{
    my ($s,$y,$m,$d,$dumy) = @_;
    my @days = map{[$y,$m,$_]} (1 .. $s->end_day($y*100+$m));
    my $w = $s->getwday($y,$m,$s->end_day($y*100+$m));
    my ($yy,$mm,$dd) = (0,0,0);
    for ($w+1 .. 6){
        ($yy,$mm,$dd) = $s->adddate($y,$m,$s->end_day($y*100+$m),$dd+1);
        push(@days,[$yy,$mm,$dd]);
    }
    $d = 1;
    $w = $s->getwday($y,$m,$d);
    while($w--){
        ($y,$m,$d) = $s->adddate($y,$m,$d,-1);
        unshift(@days,[$y,$m,$d]);
    }
    return @days;
}
sub make_cal{
    my ($s,$y,$m,$d,$dumy) = @_;
    my $cal = '';
    $cal .= "<table border=0 width=50%>";
    $cal .= $s->tag("tr",$s->tag("td",qw(日 月 火 水 木 金 土)));
    my $i = 0;
    $cal .= join ("",map {$s->day_class($i++,$y,$m,$_) } $s->make_days($y,$m,$d));
    $cal .= "</table>";
    return $cal;
}
sub day_class{
    my ($s,$i,$y,$m,$d) = @_;
    my $text ='';
    my $class = $s->holiday(-date=>$d->[0]*10000+$d->[1]*100+$d->[2]);
    if($class ne ''){
        $class = 'hol';
    }else{
        $class = qw(Sun Mon Tue Wed Thu Fri Sat)[$i % 7];
    }
    $class .= ' today' if ($s->isToday($d->[0],$d->[1],$d->[2]));
    $class = 'Non' if($m != $d->[1]);
    $text .= '<tr>' if($i % 7 == 0);
    $text .= qq{<td class="$class">$d->[2]</td>};
    $text .= '</tr>' if($i % 7 == 6);
    return $text;
}
#------------------------------------------------------------------
sub holiday{
#------------------------------------------------------------------

=head2 祝日計算 [holiday]

=over 2

祝日なら祝日の名前を返す

=item $name = holiday(-date=>YYYYMMDD)

 西暦年月日より祝日の判断を行う

=back

=cut

    my $s = shift;
    my %x = (
        1 => {1 => "元旦",},
        2 => {11 => "建国記念日",
            23 => "天皇誕生日"},
        4 => {29 => "昭和の日",},
        5 => {3 => "憲法記念日",
            4 => "みどりの日",
            5 => "こどもの日",},
        8 => {11 => "山の日",},
        11 => {3 => "文化の日",
            23 => "勤労感謝の日",},
        @_);
    my($y,$m,$d) = $s->ymd_split($x{-date});
    $m = $m+0;
    $d = $d+0;
    $x{1}{$s->get_w_day($y,1,2,1)} = "成人の日";
    $x{7}{$s->get_w_day($y,7,3,1)} = "海の日";
    $x{9}{$s->get_w_day($y,9,3,1)} = "敬老の日";
    $x{10}{$s->get_w_day($y,10,2,1)} = "スポーツの日";
    my ($vernal,$autumnal)=$s->get_equinox_day($y);
    $x{3}{$vernal} = "春分の日";
    $x{9}{$autumnal} = "秋分の日";
    my($yy,$mm,$dd) = $s->adddate($y,$m,$d,-1);
    if($s->getwday($yy,$mm,$dd) == 0 and defined $x{$mm}{$dd}){
        $x{$m}{$d} = "振替の休日";
    }
    if($s->getwday($yy,5,5) <= 2){
        $x{5}{6} = "国民の休日";
    }
    return $x{$m}{$d};
}
#------------------------------------------------------------------
sub get_w_day{
#------------------------------------------------------------------

=head2 $y年$m月第$n曜日の日を返す [get_w_day]

=over 2

=item $d = get_w_day($y,$m,$n,$wday)

 $y: 年
 $m: 月
 $n: 第何曜日かを指定[1&#12316;5]
 $n: 曜日 [0&#12316;6] (0:日曜 1:月曜 2:火曜 3:水曜 4:木曜 5:金曜 6:土曜)
 $d: 対象の日付を返す

=back

=cut

   my $s = shift;
   my ($y,$m,$n,$wday) = @_;
   my $st_wday = $s->getwday($y,$m,1);
   my $end_day = $s->end_day($y*100+$m);
   my $d;
   if($wday >= $st_wday){$n--;}
   $d = 7 * $n + $wday + 1 - $st_wday;
   if($d > $end_day or $d <= 0){$d = '';}
   return $d;
}
#------------------------------------------------------------------
sub get_equinox_day{
#------------------------------------------------------------------

=head2 春分の日秋分の日を求める [get_equinox_day]

=over 2

 指定した年の春分日・秋分日をもとめる
(1980年から2099年に適用)
 ($vernal,$autumnal)=get_equinox_day($y);

=back

=cut

    my $s = shift;
    my ($yy)=@_;
    my ($vernal) = int(20.8431+0.242194*($yy-1980)-int(($yy-1980)/4));
    my ($autumnal)=int(23.2488+0.242194*($yy-1980)-int(($yy-1980)/4));

    return ($vernal,$autumnal);
}
#------------------------------------------------------------------
sub end_day{
#------------------------------------------------------------------

=head2 末日算出 [end_day]

=over 2

入力年月から末日を計算する。

=item $day = end_day($DATE)

 $DATE: 日付 YYYYMM or YYYY/MM
 $day: $DATEの末日(28or29or30or31)

=back

=cut
   my $s = shift;
   my $yymm = shift;
   my @end = (31,28,31,30,31,30,31,31,30,31,30,31);
   $yymm =~ /^(\d{1,4})\D*(\d{1,2})$/;
   my ($y,$m) = ($1,$2);
   if($2 != 2){return $end[$m - 1];}
   if($y % 400 == 0 or $y % 100 != 0 and $y %4 == 0){
       return 29;
   }else{  return $end[$m - 1];}
}

 demo.css

.Sun{color:RED;}
.Sat{color:BLUE;}
.hol{color:RED;}
.today{
    box-shadow:  3px 3px 7px 1px rgba(0,0,0,0.4);
    transform: scale(1.05,1.05);
}
.Non{color:GRAY;}

ツェラーの公式(Zeller's congruence):曜日計算

ツェラーの公式(ツェラーのこうしき、英: Zeller's congruence)とは西暦(グレゴリオ暦またはユリウス暦)の年・月・日から、その日が何曜日であるかを算出する公式である。クリスティアン・ツェラー (Christian Zeller) が考案した。ユリウス通日を求め、そこから曜日を求める計算と本質は同じである。ウィキペディア(Wikipedia)より

 ツェラーの公式の導出

ツェラーの公式はフェアフィールド (Fairfield) の公式の変形である。

 フェアフィールドの公式

1年1月1日(0年13月1日) ~ y 年 m 月 d の日数を求める。ただし、m = 1, 2 の場合は、y = y - 1, m = m + 12とし、1年を、3月1日 ~ 14月28日(閏年は29日)と再定義する。

1年1月1日(0年13月1日)を含めた、y 年 m 月 d 日迄の日数は以下の通り。

 1年1月1日(0年13月1日) ~ 1年2月28日(0年14月28日)

  ・・・  31 + 28 (日)

 1年3月1日 ~ ( y - 1 ) 年14月末日(この時点では閏年は考慮しない)

  ・・・  365 ( y - 1 ) (日)

 1年1月1日(0年13月1日) ~ ( y - 1 ) 年14月末日の閏年の回数

  ・・・  [ ( 1 + ( y - 1 ) ) / 4 ) ] - [ ( 1 + ( y - 1 ) ) / 100 ) ] + [ ( 1 + ( y - 1 ) ) / 400 ) ]

      = [ y / 4 ] - [ y / 100 ] + [ y / 400 ] (日)

 y年3月1日 ~ y 年 ( m - 1 ) 月末日

  ・・・  [ 306 ( m + 1 ) / 10 ] - 122 (日) (以下表を参照)

 y 年 m 月1日 ~ y 年 m 月 d 日

  ・・・  d (日)

 3月1日 ~ ( m - 1 )月末日迄の日数と、[ 306 ( m + 1 ) / 10 ] - 122 の値は完全に一致している。

当月(m) 前月(m-1) 日数(Σ) [306(m+1)/10]-122
3   0 0
4 3 31 31
5 4 61 61
6 5 92 92
7 6 122 122
8 7 153 153
9 8 184 184
10 9 214 214
11 10 245 245
12 11 275 275
13 12 306 306
14 13 337 337

従って、1年1月1日 ~ y 年 m 月 d 日の日数は、上記全てを合算した、

  31 + 28 + 365 ( y - 1 ) + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ 306 ( m + 1 ) / 10 ] - 122 + d

曜日は7日間で循環しているので、上記【※】式の 7 の剰余を求めることで、曜日が判明する。即ち、

  h = ( 365y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ 306 ( m + 1 ) / 10 ] d - 428 ) mod 7 ・・・【I】

 ツェラーの公式への変形

【I】式が 7 の剰余である事を利用すると、以下の通り変形できる。

  h = ( 7 ( 52 y - 62) + y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ 153 ( m + 1 ) / 5 ] + 6 + d ) mod 7

   = (          y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ 153 ( m + 1 ) / 5 ] + 6 + d ) mod 7

ここで、[ ] (ガウス記号)の性質( [ a ] + b = [ a + b ] , ただし b は整数)を利用すると、

  h = ( y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ 153 ( m + 1 ) / 5 + 6 ] + d ) mod 7

   = ( y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ ( 153 m + 153 + 30 ) / 5 ] + d ) mod 7

   = ( y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ ( 153 m + 183 ) / 5 ] + d ) mod 7

   = ( y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ ( 35 ( 4 m + 5 ) + 13 m + 8 ) / 5 ] + d ) mod 7

   = ( y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ 7 ( 4 m + 5 ) + ( 13 m + 8 ) / 5 ] + d ) mod 7

さらに、h が 7 の剰余であることを利用して、 ・ ・ ・

 実装してみる

sub getwday{
   my $s = shift;
   my($year, $mon, $mday) = @_;

   if ($mon == 1 or $mon == 2) {
       $year--;
       $mon += 12;
   }
   return int($year + int($year / 4) - int($year / 100) + int($year / 400)
       + int((13 * $mon + 8) / 5) + $mday) % 7;
}

春分の日・秋分の日

春分の日・秋分の日は前年に決まる

春分の日」及び「秋分の日」については、国立天文台が、毎年2月に翌年の「春分の日」、「秋分の日」を官報で公表しています。

  春分の日・秋分の日を求める

公転時の誤差によって日にちの確定ができない春分の日ですが、何年後・何十年後の遠い将来まで予測することはできるのでしょうか。

地球の運行状態などが今のまま続くと仮定した場合、将来の春分日や秋分日も、計算で予測することが可能です。

 計算

1980年を基準に1980年から2099年までの春分の日・秋分の日を計算する

#------------------------------------------------------------------
sub get_equinox_day{
#------------------------------------------------------------------

=head2 春分の日秋分の日を求める [get_equinox_day] 

=over 2

指定した年の春分日・秋分日をもとめる
(1980年から2099年に適用)
($vernal,$autumnal)=get_equinox_day($y);

=back

=cut

   my $s = shift;
   my ($yy)=@_;
   my ($vernal) = int(20.8431+0.242194*($yy-1980)-int(($yy-1980)/4));
   my ($autumnal)=int(23.2488+0.242194*($yy-1980)-int(($yy-1980)/4));

   return ($vernal,$autumnal);
}

 

閉じれる半透明のパネル

 半透明のパネルを追加

[html]

<div id="overlay" class="content">
    <div class="inner">
    @{[$s->panel_content()]}
            <div id="panel" class="panel hide"></div>
    </div>
</div>

[css]

.content{
  position:absolute;
  top: 375px;
  left:0px;
  width:60%;
  min-width:315px;
  display:none;
  z-index:100;
}
.inner{
  padding:10px;
  background-color:rgba(0,0,0,0.5);
}

 閉じたり開いたり

[JavaScript]

<script type="text/javascript">
    $(function() {
        $('#panel').toggle(
            function() {
                $(this).addClass('show').removeClass('hide');
                $('#overlay').stop().animate( { left : - $('#overlay').width()   + 20 + 'px' }, 300 );
            },
            function() {
                $(this).addClass('hide').removeClass('show');
                $('#overlay').stop().animate( { left : '0px' }, 300 );
            }
        );
        $('#overlay').fadeIn(500);
    });

</script>

 作ってみる

 画面

 SOURCE

diff --git a/toolmmt/lib/Tool/mmt/Controller/Menu.pm b/toolmmt/lib/Tool/mmt/Controller/Menu.pm
index ef1ca1f..8ed6945 100644
--- a/toolmmt/lib/Tool/mmt/Controller/Menu.pm
+++ b/toolmmt/lib/Tool/mmt/Controller/Menu.pm
@@ -62,4 +62,48 @@
      }
      return $text;
  }
+ sub make_panel{
+     my $s = shift;
+     my $text = <<END_SCRIPT;
+<link rel="stylesheet" type="text/css" href="/css/demo.css" />
+
+<div id="overlay" class="content">
+    <div class="inner">
+    @{[$s->panel_content()]}
+            <div id="panel" class="panel hide"></div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    \$(function() {
+        \$('#panel').toggle(
+            function() {
+                \$(this).addClass('show').removeClass('hide');
+                \$('#overlay').stop().animate( { left : - \$('#overlay').width() + 20 + 'px' }, 300 );
+            },
+            function() {
+                \$(this).addClass('hide').removeClass('show');
+                \$('#overlay').stop().animate( { left : '0px' }, 300 );
+            }
+        );
+        \$('#overlay').fadeIn(500);
+    });
+    window.onload = function(){
+//      document.getElementById("panel").click();
+    };
+
+</script>
+
+END_SCRIPT
+     return $text;
+ }
+ sub panel_content{
+     my $s = shift;
+     my $text = <<END_SCRIPT
+    <pre>
+    @{[`cal -3h`]}
+    @{[`date +"%a %b %d %Y"`]}
+    </pre>
+END_SCRIPT
+ }
  1;
diff --git a/toolmmt/public/css/demo.css b/toolmmt/public/css/demo.css
new file mode 100644
index 0000000..0941c15
--- /dev/null
+++ b/toolmmt/public/css/demo.css
@@ -0,0 +1,27 @@
+.content{
+  position:absolute;
+  top: 375px;
+  left:0px;
+  width:60%;
+  min-width:315px;
+  display:none;
+  z-index:100;
+}
+.inner{
+  padding:10px;
+  background:transparent url(/css/black.png) repeat top left;
+}
+.panel{
+  position:absolute;
+  height:86px;
+  width:20px;
+  right:0px;
+  top:10px;
+  cursor:pointer;
+}
+.hide{
+  background:transparent url(/css/hide.png) no-repeat center center;
+}
+.show{
+  background:transparent url(/css/show.png) no-repeat center center;
+}
diff --git a/toolmmt/templates/menu/menu.html.ep b/toolmmt/templates/menu/menu.html.ep
index ec27318..48724f8 100644
--- a/toolmmt/templates/menu/menu.html.ep
+++ b/toolmmt/templates/menu/menu.html.ep
@@ -1,5 +1,6 @@
 % layout 'default';
 % title 'menu' ;
+%== $self->make_panel();
 <table width=98%><tr><td style="vertical-align: top;">
 %   for my $r (@$_data){
 %       if ($r->{menukbn} =~ /^(H\d)/i){
                   

rwt - 作表検索条件入力画面を追加

 作表検索条件入力画面を追加

メニュー登録時に帳票作成時の範囲指定の入力を設定できる機能を追加

 条件入力画面

 メニューメンテ

  • メニュー区分に"select"を設定
  • memoに検索項目を設定

パスフレーズの入力内容を確認出来る様にする

   パスワードからパスフレーズ

あのパスワード規則、実は失敗作だった数字・記号・大文字の組み合わせ、2003年に考案した人物が後悔しているらしい。

  • パスワードのルールは間違いだった
  • 「NISTスペシャルパブリケーション800-63」は今年2017年6月に全面改定
  • 「パスワード」ではなく、スペースも入れられる最低64文字の「英単語の組み合わせによるパスフレーズ」の使用を推奨
  • ユーザーがパスワードを変更すべきなのは、盗まれた兆候があった時だけ

    ログイン画面

なが~いパスフレーズ(漢字を含む)を入力できる様にすると入力内容を確認したくなるのでパスフレーズを確認出来る様にした。

チェックボックスのクリックでパスワードの表示を切り替えるサンプル画面

Index: templates/auth/login.html.ep
===================================================================
--- templates/auth/login.html.ep   (revision 145)
+++ templates/auth/login.html.ep   (working copy)
@@ -6,8 +6,21 @@
  <br>Name:
  %= text_field 'user',size => 60
  <br>password:
- %= text_field 'passwd',size => 60
+ %= text_field 'passwd',size => 60,id=>"passwd"
  <br>
+ <input type="checkbox" id="password-check" checked="checked">パスワードを表示する
+ <br>
  %= submit_button 'Login'
  %= hidden_field url => $url
 % end
+<script>
+ const pwd = document.getElementById('password');
+ const pwdCheck = document.getElementById('password-check');
+ pwdCheck.addEventListener('change', function() {
+     if(pwdCheck.checked) {
+         passwd.setAttribute('type', 'text');
+     } else {
+         passwd.setAttribute('type', 'password');
+     }
+ }, false);
+</script>
  • アンドロイドではpassword fieldでは日本語がいれられないのね、どうしよう・・・