ページ

2013年7月6日土曜日

CentOS6にmonoをインストール

C#などの.NET系をLinuxで利用するためにmono projectがあります
2013/07/06現在最新版が3.0.12でありまたこちらをCentOSにインストールしようと思ったのでメモします。
ソースコードは70M程度の容量があるのでサイズに注意です

環境
環境情報 構築日 ソフトウェア
CentOS 6.3 2013/07/06 yum,make

結構いろいろ必要なのでOSをインストールしてすぐの想定で行います
$ su -
# とりあえずdev環境を整えるために必要そうなものをインストール
$ yum install bison gettext glib2 freetype fontconfig libpng libpng-devel libX11 libX11-devel glib2-devel libgdi* libexif glibc-devel urw-fonts java unzip gcc gcc-c++ automake autoconf libtool make bzip2 wget
$ wget http://download.mono-project.com/sources/mono/mono-3.0.12.tar.bz2
$ bunzip2 mono-3.0.12.tar.bz2
$ tar xvf mono-3.0.12.tar 
$ cd mono-3.0.12.tar 
$ ./configure --prefix=/usr/local
$ make && make install
$ mono --version

手順自体は単純ですが、ちょっと面倒ですね。 大体の時間はMac上にVMを立てて動かしましたが10分程度でした。 とりあえず動かす環境ができたので実際にexeなど作って今度動作させる予定

2013年7月2日火曜日

deteコマンドの使い方

dateコマンドは日付を確認するための機能ですが思いのほかオプションが
あり覚えられないのでよく利用するものをメモ
自分でよく利用するのはyyyy/MM/ddなので原則こちらのフォーマットにあわせています.

主に自分で利用するのは、今日、昨日、今月末、30日前などがよく利用します.


dateコマンド例(yyyy/MM/dd)
目的 コマンド
今日 date +'%Y/%m/%d'
明日 date -d '1day' +'%Y/%m/%d'
昨日 date -d '1day ago' +'%Y/%m/%d'
月初 date +'%Y/%m/01'
月末 date +'%Y/%m/%d' -d "1 day ago `date +'%Y/%m/01' -d'1 month'`"
前月 date -d '1month ago' +'%Y/%m/%d'
前月末 date +'%Y/%m/%d' -d "1 day ago `date +'%Y/%m/01'`"
来月末 date +'%Y/%m/%d' -d "1 day ago `date +'%Y/%m/01' -d'2 month'`"
来月末 date +'%Y/%m/%d' -d "1 day ago `date +'%Y/%m/01' -d'2 month'`"
1年前 date +'%Y/%m/%d' -d '1 year ago'
30日前 date +'%Y/%m/%d' -d '30day ago'


ついでに簡単な時間も出してみます。


dateコマンド例(hh:mm:ss)
目的 コマンド
現在時刻 date +'%H:%M:%S'
1時間前 date -d '1hour ago' +'%H:%M:%S'
1時間後 date -d '1hour' +'%H:%M:%S'

dateコマンドは意外と利用するがよく利用するのをメモするべきですね

2013年6月23日日曜日

改行付きcsvのパース

csvからtsvへコンバートが欲しかったのですが、 改行コードが入っているcsvであったため楽にできませんでした。 csvは改行コードがある場合ダブルクォーテンションで囲まれているのが特徴です。
下記のサイトに改行コードが含んでいるcsvをパースする方法がperlありましたので こちら 改変しましてコード化しました。
csv2tsv.pl
#!/usr/bin/perl
use strict;
use warnings;
my $column = '';
while (my $line = ) {
    my $count = 0;
    $line .=  while ($line =~ tr/"// % 2 and !eof(STDIN));
 
    $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
    my @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
    ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
    for $column (@values) {
        $column =~ s/\x0D\x0A|\x0D|\x0A//g;
        print $column, "\t";
    }
    print "\r\n";
}

上記をcsv2tsv.plとしてサンプルを作成いたしました。 test.csv
header1,header2,header3
test1,test2, "test,3"
"test
1",test2,test3 
上記が、サンプル用csvとなります。
cat test.csv | csv2tsv.pl
こちらのサンプルで改行付きcsvをパースできます。

2013年6月18日火曜日

postgresで累計グラフ用のデータを作成

postgresで累計グラフ(積み上げ折れ線グラフ)を作成するための集計を実施します。
使うようで使わない気がしますが、私では利用する頻度が多いのでメモ含め書き留めます。


今回は、あるシステムで6月の日付ごとにコストと集客人数を
入力したテーブルに対して6月の日毎のと累計を知りたいのが目的とします。
環境
環境情報 構築日 ソフトウェア
CentOS 5.6 2013/06/18 postgresql 8.4以降
今回利用するSQLではpostgresql 8.4以降でないと扱えない文法のため 8.4以上でお試しください。 まずは、お決まりのテーブルを作成
-- コスト、集客管理
CREATE TABLE report (
 date TIMESTAMP, -- 集計日
 cost NUMERIC(19, 0), -- コスト 
 person NUMERIC(19, 0) -- 集客人数
);

-- 日毎のデータ
INSERT INTO report VALUES
('2013/06/01', 100, 1),
('2013/06/02', 120, 3),
('2013/06/03', 150, 0),
('2013/06/04', 110, 6),
('2013/06/05', 130, 1),
('2013/06/06', 120, 4),
('2013/06/07', 160, 5),
('2013/06/08', 190, 7),
('2013/06/09', 100, 1),
('2013/06/10', 110, 9),
('2013/06/11', 100, 8),
('2013/06/12', 100, 5),
('2013/06/13', 130, 4),
('2013/06/14', 120, 3),
('2013/06/15', 100, 6),
('2013/06/16', 100, 1),
('2013/06/17', 110, 0),
('2013/06/18', 100, 0),
('2013/06/19', 170, 1),
('2013/06/20', 100, 2),
('2013/06/21', 100, 6),
('2013/06/22', 190, 7),
('2013/06/23', 100, 9),
('2013/06/24', 100, 1),
('2013/06/25', 190, 8),
('2013/06/26', 100, 6),
('2013/06/27', 120, 7),
('2013/06/28', 120, 4),
('2013/06/29', 150, 2),
('2013/06/30', 110, 1);


上記のデータが元データです。 集計には「over」と呼ばれるWindow関数を利用します。

-- 集計用SQL
SELECT date, SUM(cost) over (order by date) AS cost, SUM(person) over (order by date) AS person FROM report;
        date         | cost | person 
---------------------+------+--------
 2013-06-01 00:00:00 |  100 |      1
 2013-06-02 00:00:00 |  220 |      4
 2013-06-03 00:00:00 |  370 |      4
 2013-06-04 00:00:00 |  480 |     10
 2013-06-05 00:00:00 |  610 |     11
 2013-06-06 00:00:00 |  730 |     15
 2013-06-07 00:00:00 |  890 |     20
 2013-06-08 00:00:00 | 1080 |     27
 2013-06-09 00:00:00 | 1180 |     28
 2013-06-10 00:00:00 | 1290 |     37
 2013-06-11 00:00:00 | 1390 |     45
 2013-06-12 00:00:00 | 1490 |     50
 2013-06-13 00:00:00 | 1620 |     54
 2013-06-14 00:00:00 | 1740 |     57
 2013-06-15 00:00:00 | 1840 |     63
 2013-06-16 00:00:00 | 1940 |     64
 2013-06-17 00:00:00 | 2050 |     64
 2013-06-18 00:00:00 | 2150 |     64
 2013-06-19 00:00:00 | 2320 |     65
 2013-06-20 00:00:00 | 2420 |     67
 2013-06-21 00:00:00 | 2520 |     73
 2013-06-22 00:00:00 | 2710 |     80
 2013-06-23 00:00:00 | 2810 |     89
 2013-06-24 00:00:00 | 2910 |     90
 2013-06-25 00:00:00 | 3100 |     98
 2013-06-26 00:00:00 | 3200 |    104
 2013-06-27 00:00:00 | 3320 |    111
 2013-06-28 00:00:00 | 3440 |    115
 2013-06-29 00:00:00 | 3590 |    117
 2013-06-30 00:00:00 | 3700 |    118
(30 行)


苦労してSQLをくまないと行けないと考えていましたがWindow関数で簡単にできました。 EC売り上げ集計や、広告レポートを集計するのに役に立ちそうです。

【mac】capistranoのインストール

macにcapistranoを利用したかったのでまとめました。
sudo等が必要なためCentOS分から一部を抜粋

環境
環境情報 ソフトウェア 必要込コマンド
Mac OS X Mountain Lion ruby sudo,curl
$ sudo mkdir /usr/local/src
$ cd /usr/local/src
$ sudo curl -O http://production.cf.rubygems.org/rubygems/rubygems-1.8.24.tgz
$ sudo tar xzovf rubygems-1.8.24.tgz
$ cd rubygems-1.8.24
$ sudo ruby setup.rb
$ sudo gem install capistrano

capistranoサンプル集【tomcat restart】

capistranoのサンプル集です。 普段利用しているものを少しメモ含めまとめました。
role :host, "test1.com", "test1.com" # サーバを指定複数の場合は,区切りで追記
set :application, "deploy.test" # アプリケーション名
set :ssh_options, :port => "22" # ポート指定
set :user, "admin" # sshでログインするユーザー(要sodo権限)

# tomcat 再起動
task :tomcat-restart, :roles => :host do
 sudo "/etc/init.d/tomcat5 restart"
 sudo "/etc/init.d/httpd restart"
end
単純ですが、意外と使えます。 実運用では、ロードバランサーがあると全tomcatが止まるので監視が飛ぶかもしれない ので要注意です。ご利用の際は、監視を受け取っている方にご連絡を

2013年6月17日月曜日

bashでfor next

備忘録となるがシェル(bash)でforを利用したカウンタを作る際に苦労したので
紹介

やりたいことは、JavascriptやC言語などでよくある
for (i = 0; i < 10; i+=2) {
 処理を記述
}

上記みたいなi+=2のfor文を作りたい


実際にシェルで記載

#!/bin/bash
for i in `seq 0 2 10`;
do
  echo "${i}"
done
上記で対応ができるbash的にはforはforeachみたいな役割なので 少々書き方が面倒だが便利に行えます。