2011年12月30日金曜日

Ruby で nヶ月前の日付を取得する。

●Excel の株価の一覧表をRubyを使って自動作成しようとすると、今日を起点としてnヵ月前の日付を知りたくなったりします。例えば2ヵ月前の日付は以下のようにして求められます。(#以降はコメント)


require 'date'

day = Date.today        # get today date(2011-12-30)

day = day <<  2         # 2 months ago


p day.month             # 2011
p day.day               # 10
p day.year              # 30


注意したい点としては、例えば2ヶ月前のさらに2ヶ月前は、4ヶ月前の日付と、同じにならないことがあるということです。


●もし、2ヶ月前ではなくて、2ヶ月後の日にちを知りたいときには以下のようにします。

day = day >>  2



●もし1日後の日付を知りたい場合には、以下のようにします。


day = day + 1

●もし1日前の日付を知りたい場合には、以下のようにします。


day = day - 1


2011年12月13日火曜日

Perlでファイルに書き込む

Perlでファイルに書き込みを行なうには、以下のようなコードを使います。ファイルオープン時に>により書き込みを指示します。




$line = "sample";
open(OUT, ">data.dat"); # 上書きオープン
print OUT $line; # data.dat に $line の内容を出力
close(OUT);






ファイルに追加で書き込むには>>により指定します。

$line = "test";
open(OUT, ">>data.dat"); # 追加オープン
print OUT $line; # data.dat に $line の内容を出力
close(OUT);

Perl でファイルを読み込む

Perl でテキストファイルから一行づつファイルを読み込むには。
以下のサンプルでは、zzz.txtと言うファイルから一行づつ読み込んで配列に格納しています。


--------------------------------------

my @hairetu;
my $i = 0;

open(IN,"zzz.txt");
while( my $Meigara = <IN> )
{
chomp($Meigara);
print $Meigara . "\n";
$hairetu[$i] = $Meigara;
$i = $i + 1
}


$length = @hairetu;
for( $i=0 ; $i<$length ; $i++ )
{
   print $hairetu[$i] . "\n";
}

----------------------------------------
以下のサンプルでも、読み込んだ行を配列に格納しています。


$datafile="zzz.txt";
open(FH, $datafile);

@list = <FH>;

# 1行ごとに出力

foreach $data_line( @list ) {
    print $data_line;
}

----------------------------------------


$FH = "filename.txt";
open FH;
@list = <FH>;
foreach $data_line( @list ){
        print $data_line;
}


----------------------------------------
以下のサンプルでは、読み込みファイルを開く時のエラーチェックをしています。


$filename = "./data.dat";
open( FH , "$filename" ) || die "Error: $filename $!\n";

----------------------------------------
以下のサンプルでも、読み込むファイルを開くときのエラー処理をしています。


$filename = "data.txt";
if( ! open FH , $filename ){
      print "open error";
}









参考サイト


2011年12月6日火曜日

PHP でタイムスタンプを取得する


●PHP でタイムスタンプを取得するサンプル(例えば2011-12-06を入力するとTimeStamp:1323097200が得られます。)



<?php
/*
日付のテキストからタイムスタンプを得るには
*/
echo "please input Date(yyyy-mm-dd):";
$a = trim(fgets(STDIN));
echo "TimeStamp:" . strtotime($a);

?>



●PHP でタイムスタンプを取得するサンプル2(例えば2011,12,06を入力するとtimestamp:1323097200が得られます。)



<?php
/*
   タイムスタンプを得るには
*/

echo "please input Hiduke(yyyy,mm,dd)";
$a = explode(',',trim(fgets(STDIN)));
echo "timestamp:" . mktime(0,0,0,$a[1],$a[2],$a[0]);

?>




●日付や時刻を表示するには



<?php

// 日付や時刻を表示するには

$d = getdate();
echo $d['year'] . '/' . $d['mon'] . '/' . $d['mday'] . "\n";
echo $d['hours'] . ':' . $d['minutes'] . ':' . $d['seconds'];

?>



2011年12月5日月曜日

PHP の技


●今日から、XX日後はいつでしょうという場合

<?php
# 今日からXX日後を計算するには
#
#
echo "日数を入力:";
$d = trim(fgets(STDIN));
echo "今日から" . $d . "日後:" . date('Y/n/j',time() + 60 * 60 * 24 * $d);
?>






●echo "DateTimeクラスでフォーマットして表示するには"
<?php

echo "DateTimeクラスでフォーマットして表示するには";

echo "input format:";
$d = new DateTime("now");
echo $d->format(trim(fgets(STDIN)));
?>





●日時クラスを使うには
<?php

/*
日時クラスを使うには
日時としてnowを指定しても可
*/

echo  "日時を入力(ex.2011-12-17):";
$a = trim(fgets(STDIN));
print_r(new DateTime($a));
?>




●指定した日まで何日あるか計算するには
<?php
/*
指定した日まで何日あるか計算するには
*/

echo "input Hiduke(yyyy-mm-dd):";
$d = strtotime(trim(fgets(STDIN)));
echo ceil(($d -time()) / ( 60 * 60 * 24 )) . "days";
?>




●今日の日付を指定したフォーマットで表示するには

<?php
/*
今日の日付を指定したフォーマットで表示するには
*/
echo "format(Y/y/m/n/d/j);";
$a = trim(fgets(STDIN));
echo date($a,time());
/*
Y 年4桁表記
y 年2桁表記
m月(先頭に0をつける)
n月(先頭に0をつけない
F月(フルスペル英文表記)
M月(3文字の英語表記)
d日(先頭に0をつける)
j日(先頭に0をつけない)
D曜日(3文字の英語表記)
l曜日(フルスペルの英語表記)
w曜日(0から6の整数)
h時(12時間単位先頭に0をつける)
H時(24時間単位先頭に0をつける)
g時(12時間単位先頭に0をつけない)
G時(24時間単位先頭に0をつけない)
a午前またた午後(amまたはpm)


A午前または午後(AMまたはPM)
i分(先頭に0をつける)
s秒(先頭に0をつける)
*/
?>


2011年12月4日日曜日

Strawberry Perl をインストール


WindowsXP にStrawberry Perl をインストールしました。
以下のサイトから、バージョンは 5.12.3.0のものをダウンロードしました。
Windows版のPerlと言えばActivePerlだと思っていましたが、Strawberryのほうがよりcpanなどの面においてUNIX版とほぼ同様に使用しやすいらしいです。

http://strawberryperl.com/

上記のサイトをみると、いちごが非常にきれいでおいしそうです。Larry Wall がWindows上で使っているとも書いてあります。思わず、ダウンロードしてしまいました。

2011年12月3日土曜日

Perl で株価を取り込む

Perl でヤフーファイナンスから株価データを取り込むことはできるのだろうかとインターネットで調べたところWeb::Scraperを使ってできるらしいことがわかりました。以下はサンプルです。


#!/usr/bin/perl
use strict;
use warnings;
use Web::Scraper;
use URI;
use Encode;
my $scraper = scraper {
 process '//tr[@bgcolor="#ffffff"]/td[1]','sdata[]' => 'TEXT';
 process '//tr[@bgcolor="#ffffff"]/td[2]','svalue[]' => 'TEXT';
};
  my $res = $scraper->scrape(URI->new("http://table.yahoo.co.jp/t?c=2010&a=11&b=1&f=2010&d=11&e=7&g=d&s=9631.t&y=0&z=&x=sb"));

 my @sdata = @{$res->{sdata}};
 my @svalue = @{$res->{svalue}};
 my $length = @svalue;

 for ( $_= 0; $_ < $length; $_++){
  print encode('utf-8',$sdata[$_]), ",", "\"";
  print encode('utf-8',$svalue[$_]), "\"", ",", "\"","\n";
 }


●このプログラムは、Linux(Ubuntu)上で動作させました。Windows上で実行させる場合には、utf-8 となっているところを、shift-jis にするなどの処理が必要と思います。

●参考にさせて頂いたサイト

http://e8y.net/mag/013-web-scraper/
http://www16.atwiki.jp/netscreen/pages/13.html



2011年12月2日金曜日

Ubuntu11.10 で RMagick をインストールする

RubyでExcel出力する方法について、axlsxを使う方法をコメントで頂きました。インストールしようとして以下のコマンドを入力しましたが、エラーが発生してしまいました。
sudo gem install axlsx
http://rubygems.org/gems/axlsx


調べてみると、rmagick というのが必要だとわかりました。Ubuntuでの rmagickのインストール方法は以下のサイトを参考にさせていただきました。

http://d.hatena.ne.jp/kaorumori/20100510/1273544324
http://d.hatena.ne.jp/mostlyfine/20081012/1223837676

Windowsでの、インストール方法は、また別です。以下を参考にさせていただきました。ただしこれでインストールできるのは、2.12.0というバージョンで、axlsx を使用するには、2.12.2以上のバージョンが必要のようです。
http://rmagick.rubyforge.org/install-faq.html#win