[kansaipm] Re: 第2回無事終了 !

mishima at momo.so-net.ne.jp mishima at momo.so-net.ne.jp
Mon May 22 20:05:22 CDT 2000


三嶋です。

講師の皆様、準備に携わってくださった皆様、お疲れ様でした。

今回は、開始時間は間違うわ、森若さんは別の予定と重なるわ、森若さんのファ
イルはダウンロードに苦労するわ、イバノフさんのマシンはいかれるわと、ト
ラブルが多かったですが、結果的には意外と(?)盛り上がって楽しかったで
す。

ところで、Perl 5.6 の open プラグマのことなんですが、
use open IN => ":crlf", OUT => ":raw";
と書く場合の IN と OUT は、ファイルハンドルではなくて、やっぱり
入力時と出力時デフォルトの指定ではないでしょうか。 > イバノフさん

open - perl pragma to set default disciplines for input and output
という標題ですし。


さてと...

From: Nagayoshi_Michio <cudjo at venus.dti.ne.jp>
Subject: Re: [kansaipm] 第2回無事終了 !
Date: Mon, 22 May 2000 05:58:23 +0900

> 00/05/22 02:39:08 に 福原 さんが曰く
> > > #あの時のソース、お持ちの方いませんか?
> > > #出来たら見せていただきたいんですが。
> > ということなので,添付します.
> 
> すみません。添付していただいたのはわたしがでっち上げた
> C言語バージョンで、欲しかったのはPerl版の方だったり
> します。引き続き、Perl版お持ちの方にお願いします。
> #C版のほう、デバッグしてないのであまり信じないでください。

はーい、CUDJOさん。

Perl版のソースはお持ち帰りしなかったのですが、福原さんがCのソースを添
付してくださったおかげで再度翻訳できましたので、添付します。
今度は Tk の画面付きですよ。コメントも入れときました。

> > 「世界のパールショウ」楽しみです.
> > 昨日のCUDJOさんと三嶋さんのcoding を見ていて,
> > あーだこーだいいながらcoding という所が非常に新鮮でした.
> 
> ふふふ、掛け合い漫才形式っつーのもよさげかも。
> #「君とはやっとられんわ」よりも「それでは皆様、ごきげんよぉ〜」
> #の方が平和かも。

おお、結構好評なんですね。
しかし、コーディングしながら漫才しようとなると、大変そう。
相当リハーサルが要りますね。(^^;)
二人羽折か、実況中継付きのほうがいいかもしれません。
対戦は遠慮しときます。Emacs起動しただけでブーイングとかされたら、
プレッシャーでつぶれちゃいます。(^^;)

> > 会場からの意見を取り入れながらのcoding というのも
> > 面白いですね.
> 
> たとえば、「ある月の一日が何曜日か求める」というロジックを
> その場で公募する、っていうのはあります。

私は一度、適当なPerlスクリプトをよってたかってキレイにするというのをやっ
てみたいと思っています。基本的には、スタイルを揃え、コメントを入れ、冗
長なコードを簡潔に、あるいは簡潔すぎてわかりにくいコードを冗長に書き換
えていくわけですが、Perl は There's more than one thing to do it. のモッ
トーの通り、複数の書き方があって、好みの違いなんかもあるでしょう。
きっと、新しい発見があると思いますよ。

手始めに、whatsnew なんてどうかなー。 > 清香さん


--
$p='Perl'; $_='Masahiro Mishima'; sub _{pack'c*',$x=110+ at _*5,$x+1}
tr/oma/fa_/;s/./chr(ord($&)+2)/ge;@x=(sort(grep{!$_{$_}++}split//),
$p=~/(.(..).)/);$x[7]=~s/^/_/e;$x[8].=_ 1;for(@w=(47,1639,8,31259))
{s/\d/$x[$&+1]/g} print ucfirst "@w.\n";
-------------- next part --------------
#!/usr/local/bin/perl -w

use Tk;
use strict;

my $mw = MainWindow->new;
my($y,$m) = (localtime)[5,4];
$y += 1900;	# localtime が返す年は「西暦−1900」なので注意
$m += 1;	# localtime が返す月は「0〜11」なので注意
dispMonth($y,$m);
MainLoop;

##
## 西暦1年1月1日から数えた日数
##
sub from_1_1_1 {
    my( $year, $month, $day ) = @_;
    my $lastyear = $year - 1;
    my $ans = 365 * $lastyear
        + $lastyear / 4
	- $lastyear / 100
	+ $lastyear / 400		# ここまでが昨年末までの日数
	+ juldate($year, $month, $day);	# 今年に入ってから今日までの日数

    return $ans;
}

##
## 今年の1月1日から数えた日数
##
sub juldate {
    my( $year, $month, $day ) = @_;
    my @maxTbl = (0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
    # 今月初めから今日までの日数
    my $ans = $day;
    # 先月末までの日数を加算
    for ( my $i = 0; $i < $month; $i++ ){
	$ans += $maxTbl[$i];
    }
    # 閏年で、3月以降なら1を加算
    if ( $month > 2 and leapYear($year) ){
	$ans++;
    }
    return $ans;
}

##
## 閏年なら True を返す
##
sub leapYear {
    my($year) = @_;
    return( $year % 400 == 0 or
	    $year % 4   == 0 && $year % 100 != 0 );
}


##
## 曜日(日=0…土=6)
##
sub weekday {
    my( $y, $m, $d ) = @_;
    my $jd = from_1_1_1( $y, $m, $d );

    return ( $jd % 7 );
}


##
## 月の表示
##
sub dispMonth {
    my( $y, $m ) = @_;
    my( $maxD );

    if ( $m == 1 or $m == 3  or $m == 5  or  $m == 7  or
	 $m == 8 or $m == 10 or $m == 12 ) {
	$maxD = 31;
    } elsif ( $m == 4  or  $m == 6  or  $m == 9 or $m == 11 ) {
	$maxD = 30;
    } else {
	$maxD = ( leap( $y ) ? 29 : 28 );
    }

    my $r = 0;				# 最初は0行目
    my $c = weekday( $y, $m, 1 );	# 月曜が0列目として、1日の列から
    for ( my $d = 1; $d <= $maxD; $d++, $c++ ) {
	if ( $c >= 7 ) {		# 最後の列を超えるようなら
	    $r++;			# 次の行へ行って
	    $c = 0;			# 最初の列に戻る
	}
	my $label = $mw->Label(-text=>$d);
	$label->grid($label, -row => $r, -column => $c);
    }
}



More information about the Kansai-pm mailing list