さんぷるこーどをこぴーすれば、そのままPerlでじっこうして、ためすことができます。(きゅうしょうさいもくじ,きゅうかてごりべつもくじ)
でばっがで、さんぷるこーどをたどればりかいがふかまります。 (でばっがのつかいかた)
2008-11-20
DateTimeでのひづけけいさんのちゅういてん
ひづけのけいさんはふきそくなぶぶんがあるのでできるだけたんじゅんなほうほうですますほうがよいです。ひづけけいさんをふくざつにしているげんいんをふくめて、ひづけけいさんのちゅういてんについてかいておきます。
ふろーてぃんぐたいむぞーん( floating TimeZone )
DateTimeおぶじぇくとは、new めそっどでさくせいされて、たいむぞーんがしていされないばあいは、でふぉるとのたいむぞーんは、ふろーてぃんぐたいむぞーんとよばれるものになります。
ふろーてぃんぐたいむぞーんとは、そんざいするどのたいむぞーんともかんけいがない、うるうびょうをこうりょしないたいむぞーんのことです。
たいむぞーんとうるうびょうをこうりょするひつようがないばあいは、ふろーてぃんぐたいむぞーんをもちいてけいさんをおこなえばもっともあんしんだということになります。
たとえばろぐからねんがっぴをしゅとくして、3げつごのねんがっぴをしゅとくしたいといったばあい、ふろーてぃんぐたいむぞーんでけいさんしてもんだいはありません。
うるうびょうとは
じこくはぜったいてきなものではなくて、ちきゅうのじてんが1しゅうしたときがついたちとかぞえますから、ちきゅうのじてんがおくれるとついたちのながさがかわってしまいます。うるうびょうとはちきゅうのじてんがねんねんおくれていくために、なんねんかにいちどそうにゅうされるびょうのことです。
うるうびょうがこうりょされているたいむぞーんをもちいて、うるうびょうがまにはさまるようにひづけをけいさんすると、うるうびょうがまにはさまらないばあいと1びょうのずれがしょうじます。
さまーたいむとは
さまーたいむとは1ねんのあるきかんだけじこくを1じかんはやめるというせいさくのことです。あるしゅんかんにじこくを1じかんはやめるわけですから、1じかんじこくがちょうふくしてしまいます。ふつうのじこくが2ときだったとしたら、さまーたいむへんこうしたちょくごは1ときになるけです。
このにちは、1ときから2ときがかさなってしまいます。
だからさまーたいむをどうにゅうしているくにでは、じこくのけいさんをおこなおうとするとひじょうにふくざつなことになってしまいます。
にっぽんのばあいはさまーたいむがありませんので、さまーたいむのえいきょうはかんがえるひつようがありません。
とくていのたいむぞーんをUTCにへんかんする。
ひづけのけいさんをたんじゅんにするために、とくていのたいむぞーんをUTCにへんかんしてからけいさんします。
そしてけいさんがおわったあとで、もとのたいむぞーんにもどします。
my $dt = DateTime->new( %user_input, time_zone => $user_tz ); $dt->set_time_zone('UTC'); # UTCにへんかん # ひづけのけいさんをおこなう。 $dt->set_time_zone($user_tz); # もとのたいむぞーんにもどす。 print $dt->datetime;
にっぽんのばあいはさまーたいむがありませんので、ろーかるじこくでけいさんをしてもきみょうなけっかになることはありません。せかいてきにはさまーたいむをどうにゅうしているくにがけっこうあるようです。
とくていのたいむぞーんでのけいさん
とくていのたいむぞーんでけいさんをいってもたいていのばあいはただしいけっかがかえります。ただし、さまーたいむがどうにゅうされているばあいで、さまーたいむへのへんこうのじかんたいふきんをふくむばあいは、きみょうなけっかがかえります。
じょうきでかいせつしたように、いったんUTCにへんかんしてけいさんしてからもとにもどすのがあんぜんです。
nowめそっどのでふぉるとのたいむぞーん
nowめそっどでげんざいじこくをしゅとくすることができますが、でふぉるとのたいむぞーんはUTCになります。
newでDateTimeおぶじぇくとつくったばあいは、でふぉるとのたいむぞーんは、ふろーてぃんぐたいむぞーんになります。
さいとあんない
2008-11-19
DateTime::Duration きかんをあらわすおぶじぇくと
ひづけとひづけのまのきかんをあらわすおぶじぇくと DateTime::Durationおぶじぇくとというものがあります。
DateTimeがひづけのじょうほうをひょうげんするのにたいして、DateTime::Duration はきかんのじょうほうをひょうげんします。
ひづけにあるきかんをくわえたり、あるきかんをひいたりしたばあいは、addめそっどやsubstructめそっどをしようしましたが、ないぶてきには、DateTime::Durationおぶじぇくとがさくせいされたうえでえんざんがなされています。
さんぷる
DateTimeのいんすとーるがひつようです。
use strict; use warnings; use DateTime; # DateTimeおぶじぇくとどうしのひきざん my $dt1 = DateTime->new( year => 2000 , month => 2, day => 1, hour => 12, minute => 44, second => 30 ); my $dt2 = DateTime->new( year => 2003 , month => 3, day => 19, hour => 23, minute => 54, second => 40 ); my $duration = $dt2 - $dt1; # ひきざんのきごうをそのままつかえます。 print "(1) きかんをしゅとくする。\n"; print "きかんは",$duration->years,"ねんと", $duration->months,"がつと", $duration->days, "にちと", $duration->hours, "じかんと", $duration->minutes, "ふんと", $duration->seconds, "びょう\n\n"; print "(2)きかんのじゅんじょをはんていする。\n"; if( $duration->is_positive ){ print "\$dt2は\$dt1よりのちのひづけです。\n"; } elsif( $duration->is_zero ){ print "\$dt2は\$dt1とひとしいです。\n"; } elsif( $duration->is_negative ){ print "\$dt2は\$dt1よりまえのひつきです。\n"; } print "\n"; print "(3)きかんをがつかんさんでしゅとくする。\n"; print "きかんはがつかんさんで", $duration->in_units( 'months' ), "がつです。\n"; __END__
かいせつ
(1)-1 DateTime::Duration
きかんをひょうげんするDateTime::Durationくらすというものがあります。DateTimeおぶじぇくとどうしのひきざんをおこなうと、もどりちとしてDateTime::Durationおぶじぇくとがへんきゃくされます。
えんざんしのおーばーろーどというきのうがりようされていて、- きごうをつかってDateTimeおぶじぇくとどうしのひきざんをおこなうことができます。
my $dt1 = DateTime->new( year => 2000 , month => 2, day => 1, hour => 12, minute => 44, second => 30 ); my $dt2 = DateTime->new( year => 2003 , month => 3, day => 19, hour => 23, minute => 54, second => 40 ); my $duration = $dt2 - $dt1; # ひきざんのきごうをそのままつかえます。
(1)-2 DateTime::Durationのあくせっさめそっど
いかのめそっどできかんのじょうほうをしゅとくできます。DateTimeとはことなり、めそっどめいのさいごにsがつきます。
$duration->years; # ねん $duration->months; # がつ $duration->days; # にち $duration->hours;# じかん $duration->minutes; # ふん $duration->seconds; # びょう
ちゅういしないといけないことは、それぞれのめそっどはたんどくではいみをもたないということです。たとえば、$duration->days は、きかんのにっすうそのものをあらわしているのではないということです。
きかんが1がつと30にちだとすると、$duration->days は30になります。 60 や 61 になることはありません。
(2)きかんのじゅんじょをはんていする。
じょうきのめそっどはつねにまさのあたいをへんきゃくするので、どちらのきかんがさきかというはんていをおこなうことができません。きかんのじゅんじょをはんていするには、is_positive, is_zero, is_negative めそっどをしようします。
if( $duration->is_positive ){ print "\$dt2は\$dt1よりのちのひづけです。\n"; } elsif( $duration->is_zero ){ print "\$dt2は\$dt1とひとしいです。\n"; } elsif( $duration->is_negative ){ print "\$dt2は\$dt1よりまえのひつきです。\n"; }
(3)-1 きかんをがつかんさんでしゅとくする。
きかんをあるたんいでしゅとくするには in_unitsめそっどをしようします。
$duration->in_units( 'months' ); # きかんが1ねんと15がつのばあいは27になります。 $duration->in_inits( 'years' ); # きかんが1ねんと15がつのばあいは2になります。 $duration->in_units( 'years', 'months' ); # きかんが1ねんと15がつのばあいは( 2, 3 )になります。
ひきすうを2つわたすばあいは、りすとこんてきすとでうけとるひつようがあります。
(3)-2 へんかんかのうなたんい
たんいでへんかんかのうであるのはいかの4つだけです。
ねんとがつ ( 1ねんは12がつ ) # years <=> months しゅうとにち ( 1しゅうかんは7にち ) # weeks <=> days じかんとふん ( 1じかんは60ふん ) # hours <=> minutes びょうとみりびょう ( 1びょうは1000みりびょう ) # seconds <=> nanoseconds
にちとがつはそうごにへんかんできません。にっすうががつによってことなるためです。
ふんとびょうはそうごにへんかんできそうですが、へんかんできません。うるうびょうのそんざいによって、1ふんが61びょうになることがあるためです。
どきゅめんと
さいとあんない
2008-11-09
WindowsXPをこうそくかする。
かんたんにできてこうかがたかいとおもわれるWindowsのこうそくかのほうほうです。
こじんてきには、Windowsのぱふぉーまんすのぼとるねっくはめもりであることがおおいとかんがえています。
めもりうえのでーたをできるかぎりりようするようにして、でぃすくへのあくせすのかいすうをへらすとぱふぉーまんすがこうじょうします。
- できるだけめもりをつむ。
- めもりをしすてむきゃっしゅにりようする。
- MyDocumentにはふぁいるをおかない。でーたをCどらいぶいがいにおく。
- ですくとっぷにはふぁいるをおかない。
- いらないあぷりけーしょんはさいしょうかする。
- すたんばいきのうをりようする。
- すたんばいするときは、すべてさいしょうかしておく。
- がめんのいろかずを16bitにする。
- でざいんをWindowsくらしっくにする
- ぱふぉーまんすをゆうせんするせっていにする。
(1) できるだけめもりをつむ。
しんきにこうにゅうするばあいはめもりはできるだけおおきいものかいます。おぷしょんでめもりをついかできるばあいはついかします。
(2) めもりをしすてむきゃっしゅにりようする。
しすてむきゃっしゅとはたぶんふぁいるきゃっしゅのことで、めもりうえにおいておけるふぁいるのようりょうがおおきくなります。でぃすくあくせすのかいすうをすくなくできます。
→しすてむきゃっしゅめもりのわりあてをふやすでかいせつされています。
(3) MyDocumentにはふぁいるをおかない。でーたをCどらいぶいがいにおく。
りゆうはよくわかりませんが、MyDocumentにふぁいるがおおくなるとぱふぉーまんすがわるくなるようなきがします。
でーたふぁいるは、Cどらいぶいがいにおくようにします。Dどらいぶとかにおきます。
あぷりけーしょんは、C:\Program Files におくのがよいです。
ここいがいにおくとどうさがおかしくなるあぷりけーしょんがときどきそんざいするからです。
(4) ですくとっぷにふぁいるをおかない。
ですくとっぷにはできるだけふぁいるをおかないようにします。ですくとっぷにあいこんがふえると、ぱふぉーまんすがおちます。( OSがめもりうえになにかをじょうっけるため。たぶん )
(5) いらないあぷりけーしょんはさいしょうかしておく。
たくさんあぷりけーしょんをきどうしているばあいは、いらないあぷりけーしょんをさいしょうかしておきます。ぜんめんにうぃんどうがたくさんでているとぱふぉーまんすがおちます。
Windowsきー + D でさいしょうかして、つかうものだけをぜんめんにだしておきます。
(6) すたんばいきのうをりようする。
すたんばいきのうをりようすると、ぱそこんのきどうがはやくなります。すたんばいするとめもりうえのでーたがでぃすくにほぞんされ、さいかいするともとのじょうたいにもどせます。
すたんばいするには、しゅうりょうおぷしょんからすたんばいをえらびます。
(7) すたんばいするときは、すべてさいしょうかしておく。
すべてさいしょうかしておくと、すたんばいとさいかいがこうそくになります。
(8) がめんのいろかずを16bitにする。
がめんのいろかずを16びっとにします。わたしのWindowsXPのばあいは、でふぉるとは32bitでした。16bitにするとびょうがそくどがこうじょうします。
→WindowsXP、ぱそこんのうごきをはやくするほうほう!3けんでかいせつされています。
(9) でざいんをWindowsくらしっくにする
これは、Windowsのでざいんがふるめかしいものになるので、ぱふぉーまんすゆうせんのにんむけです。
→WindowsXP、ぱそこんのうごきをはやくするほうほう!3けんでかいせつされています。
(10) ぱふぉーまんすをゆうせんするせっていにする。
これはWindowsのがめんのびょうがきのうをせいげんしてしまうので、ぱふぉーまんすゆうせんのにんむけです。
→WindowsXP、ぱそこんのうごきをはやくするほうほう!3けんでかいせつされています。
2008-11-08
DateTime::Locale ろけーるしていのためのくらす
DateTimeのこんすとらくたのひきすうでろけーるめいをしていすることができます。
DateTimeはこんすとらくたのなかで、DateTime::Localeおぶじぇくとをせいせいしています。そしてせいせいしたろけーるおぶじぇくとにもとづいてちいきやくにごとのひづけじょうほうのしゅつりょくをつくります。
さんぷる
DateTimeのいんすとーるがひつようです。
use strict; use warnings; use DateTime; use DateTime::Locale; # えんこーどよう use Encode; my $encode_to; if( $^O eq 'MSWin32' ){ $encode_to = 'shift-jis'; } else{ $encode_to = 'utf8'; # おこのみにおうじて } print "(1) DateTime::Localeおぶじぇくと\n"; my $locale = DateTime::Locale->load( 'ja' ); # ろけーるのせいせい my $dt = DateTime->now( locale => $locale , time_zone => 'local' ); my $day_name = $dt->day_name; # ようびめい print encode( $encode_to, $day_name ), "\n"; __END__
かいせつ
(1)ろけーるおぶじぇくとのめいじてきなさくせい
my $locale = DateTime::Locale->load( 'ja' ); # ろけーるのせいせい
めいじてきにDateTime::Localeおぶじぇくとをさくせいするには、loadめそっどをしようします。
loadめそっどは、しょかいはDateTime::Localeおぶじぇくとをさくせいしますが、2かいめいこうはめもりにほぞんしたDateTime::Localeおぶじぇくとをさいりようします。
ぷろぐらむなかで'ja'をひょうげんするDateTime::Localeおぶじぇくとはつねにそんざいしないかたったひとつであるかのどちらかです。(このようなおぶじぇくとをsingleton(しんぐるとん)とよびます。)
DateTime::TimeZoneおぶじぇくとのようにまいかいさくせいされるわけではありません。
(2)ろけーるおぶじぇくとをこんすとらくたにわたす
ろけーるおぶじぇくとをDateTimeのこんすとらくたにわたすには、いかのようにします。
my $dt = DateTime->now( locale => $locale , time_zone => 'local' );
めいじてきにろけーるおぶじぇくとをわたすこともできますが、
my $dt = DateTime->now( locale => 'ja' , time_zone => 'local' );
のように、もじれつでしていするのがらくです。こうかくと、DateTimeのこんすとらくたのなかでじどうてきにDateTime::Localeおぶじぇくとがさくせいされます。
さいとあんない
2008-10-17
せんれんされたPerl: CおよびJavaぷろぐらまーのためのPerl 5.6
だいぶふるいきじですが。
せんれんされたPerl: CおよびJavaぷろぐらまーのためのPerl 5.6
もくじ
いんたーぷりたーのしくみ
そくどおよびべんちまーく・てすと
れいがい、こんぱいる、およびぶんしょ
げんごのあいまいさ
1つのもくてきにたいしてふくすうのしゅほうがそんざいする (There's more than one way to do it (TMTOWTDI))
せいきひょうげんのなきところ
すからー、はいれつ、はっしゅ: おどろきのこうきのう
Perlにないきのう
Perlのもっともまされているぶぶんとは
さんこうぶんけん
ちょしゃについて
きじのひょうか
きじのぬきだし
C/C++/Javaぷろぐらまーにとって、よりまされたぶぶんをもつPerlはひじょうにかちのあるものです。
ゆうしゅうなぷろぐらまーは、つねにふくすうのつーるをよういしておくものです。
Perlははんようてきなげんごです。そして、かずおおくのことなるもじゅーるをむすびつけるやくわりをはたすじゅうなんなげんごです。
しかしもっともたいせつなのは、Perlをつかったぷろぐらみんぐはたのしく、つねになにかをまなんでいけるということです。
さいとあんない
2008-10-16
げつまつじつをしゅとくする。
げつまつじつをしゅとくするかんすうのさんぷるです。Time::Localもじゅーるのtimelocalかんすうをつかってそんざいするひづけをたしかめています。
さんぷる
use strict; use warnings; print "(1)げつまつじつをしゅとくする。\n"; my $end_of_month_200802 = end_of_month( 2008, 2 ); print "2008ねん2がつのげつまつじつは$end_of_month_200802にちです。\n"; # げつまつじつをもとめるかんすう。 sub end_of_month{ my ( $year, $month ) = @_; return if !$year || !$month; $year -= 1900; # Time::Local::timelocalかんすうは1900からのけいかねんをひきすう # にとるので、1900をひく。 $month--; # Time::Local::timelocalかんすうは 1がつは0,2がつは1のように0から # はじまるがつをひきすうにとるので、1をひく。 my @days = ( 31, 30, 29, 28 ); # げつまつじつのこうほはこの4つ require Time::Local; # ひづけのそんざいちぇっくようにしよう。 foreach my $day ( @days ){ eval{ Time::Local::timelocal( 0, 0, 0, $day, $month, $year ); # そんざいしないにちをしていするとれいがいがおこる。 }; return $day unless $@; # れいがいがおこらなければそんざいするひづけ。 } return; } __END__
こーどかいせつ
(1)げつまつじつをしゅとくする。
(1)-1 げつまつじつのこうほになるひづけ
げつまつじつになるのは、28にち、29にち、30にち、31にちのどれかです。31にちからじゅんにちぇっくしていってそんざいするひづけであればそれがげつまつじつです。
my @days = ( 31, 30, 29, 28 ); # げつまつじつのこうほはこの4つ
(1)-2 そんざいするひづけのちぇっく
「そんざいするひづかどうかをはんていする。」でかいせつしたように、Time::Localもじゅーるのtimelocalかんすうでひづけのちぇっくをおこないます。
31にちからじゅんに28にちまでちぇっくをしていきます。そんざいしないひづけをしていするとれいがいがおこるので、れいがいがおこらなければそれがげつまつじつです。
require Time::Local; # ひづけのそんざいちぇっくようにしよう。
foreach my $day ( @days ){
eval{
Time::Local::timelocal( 0, 0, 0, $day, $month, $year );
# そんざいしないにちをしていするとれいがいがおこる。
};
return $day unless $@; # れいがいがおこらなければそんざいするひづけ。
}
かんれんきじ
げつまつじつをもとめるべつのやりほうがしょうかいされていました。れいがいしょりをつかわないので、MAS3さんのやりほうのほうがよいです。
さいとあんない
2008-10-13
そんざいするひづかどうかをはんていする。
そんざいするひづかどうかをかんたんにはんていするには、Time::Localもじゅーるをりようします。
Time::Localのtimelocalかんすうはしていしたひづけをえぽっくからのけいかびょうにへんかんするかんすうですが、そんざいしないひづけをしていするとれいがいをなげます。
このことをりようするとそんざいするひづけのはんていをおこなうことができます。
use strict; use warnings; use Time::Local qw( timelocal ); print "(1)そんざいするひづかどうかをかくにんする。\n"; my $year = 2008 -1900; # Perlではじこくは1900ねんからのけいかねんすうであつかうので # 1900をひく。 my $mon = 10 - 1; # がつは0からはじまるので、もとめたいがつから1をひく。 my $mday = 32; # そんなにちはないはず。 # そんざいしないにちをしていするとれいがいをなげるのでevalできゃっち eval{ timelocal( 0, 0, 0, $mday, $mon, $year ); }; $year += 1900; # ふくげん $mon++; # ふくげん # れいがいがおこると$@がせっとされる。 if( $@ ){ print "$yearねん$monがつ$mdayにちはそんざいしません。\n\n"; } else{ print "$yearねん$monがつ$mdayにちはそんざいします。\n\n"; } print "(2)ひづけはんていをかんすうにする。\n"; if( day_exist( $year, $mon, $mday ) ){ print "$yearねん$monがつ$mdayにちはそんざいします。\n"; } else{ print "$yearねん$monがつ$mdayにちはそんざいしません。\n"; } # ひづけがそんざいするかをはんていするかんすう sub day_exist{ my ( $year, $mon, $mday ) = @_; $year -= 1900; $mon--; require Time::Local; eval{ Time::Local::timelocal( 0, 0, 0, $mday, $mon, $year ); }; return $@ ? 0 : 1; } __END__
(1)そんざいするひづかどうかをかくにんする。
(1)-1ひづけをあつかうときのちゅうい
Perlのひょうじゅんかんすうでは、ねんは1900ねんからのけいかねんすうであつかいます。がつは1がつは0、2がつは1のように0からすたーとします。
Time::Localもじゅーるの timelocalかんすうにひきすうをわたすときはこのことをこうりょするひつようがあります。
my $year = 2008 -1900; # Perlではじこくは1900ねんからのけいかねんすうであつかうので # 1900をひく。 my $mon = 10 - 1; # がつは0からはじまるので、もとめたいがつから1をひく。 my $mday = 32; # そんなにちはないはず。
(1)-2 ひづけがそんざいするかのはんていをおこなう。
Time::Localもじゅーるのtimelocalかんすうをしようしてひづけのはんていをおこないます。
timelocalかんすうのひきすうは、「びょうふんときにちげつねん」のじゅんでしていするひつようがあるので、だみーとしてびょうふんときには0をわたしています。
そんざいしないひづけのばあいはtimelocalかんすうはれいがいをなげますので、evalできゃっちします。れいがいがおきたばあいは$@にないようがせっとされるので、これではんていをおこないます。
use Time::Local qw( timelocal ); eval{ timelocal( 0, 0, 0, $mday, $mon, $year ); }; if( $@ ){ print "$yearねん$monがつ$mdayにちはそんざいしません。\n\n"; } else{ print "$yearねん$monがつ$mdayにちはそんざいします。\n\n"; }
(2)ひづけがそんざいするかをはんていするかんすうをさくせいする。
はんていほうほうがじょうきのようにかなりはんざつなので、ひきすうを「ねんがっぴ」でしていできるひづけはんていかんすうをつくっておくとべんりです。
sub day_exist{ my ( $year, $mon, $mday ) = @_; $year -= 1900; $mon--; require Time::Local; eval{ Time::Local::timelocal( 0, 0, 0, $mday, $mon, $year ); }; return $@ ? 0 : 1; }
