nishiru3の日記

備忘録です。ネットのゴミ。

Perl入学式の感想

Perl入学式に参加させていただいていたのですが、 せっかくなので、これまでの感想とかを書いておきます。


動機

私は大学から社会人まで科学技術計算で生きてきて、プログラムを書いておりましたが、 CとかFortranがメインです(おそらくこれからもそう)。 スクリプト言語AWKPythonRubyをテキストデータ整形用やグラフ描画用に書くくらいで、 見よう見まねでやっている状態でした。 それで、ちょっと調べてみたらPerl入学式という名の勉強会があるじゃないですか! 私のような初心者でも参加できそうなので、参加しようと思い立ったわけです。 といっても、第2回の開催前に気づいたので、参加できたのは第2回以降です。 Perl入学式のURLは下記です。

http://www.perl-entrance.org/

第1回

この時はまだ存在を知らず、不参加でした。 内容は、Perlを使う上での環境構築だった模様です。 対応OSはLinuxMacです。ただWindowsでもVMWareを使って、Ubuntuの環境を構築するので、 心配は要りません。 Webにアップされている資料だけでも、環境は構築できました。 正直、環境を構築できたので、参加しても得るものがあるかなと思い、第2回の参加を決めたのでした。

第2回

第2回の内容は大まかに以下のとおりです。

  • 前回の復習
  • おまじない
  • 変数
  • 標準入力
  • 四則演算
  • 基本的な演算子
  • if, else文
  • 論理演算子
  • for文, 配列

入出力、演算、反復や分岐等を学びます。 私自身は多言語で経験があったので、特に難しい印象はありませんでした。 ただし、「プログラムを書いたことがない」人でも出来ると思います。 とにかくサポーターが心強いです。レベルが低いかもしれない、みたいな事を聞いても問題ないです。

こういった勉強には初めて参加したのですが、Macが圧倒的に多い印象です。 まあ、OSXになってから爆発的に増えた気がします。 私も大学の研究室で始めてOSXを使って、「おー、Terminal使えるんだ!cdとかも使えるじゃん!すげー!」 とOS9との違いにびっくりしたものです。

第3回

大まかには、以下のとおりです。

  • 配列 (関数)
  • ハッシュ
  • リファレンス

配列とハッシュは、多言語で経験しているとわかりやすいです。 リファレンスはC言語の経験があって、ポインタを知っていれば理解しやすいと思います。 PythonRubyだと、参照について強く意識することはあまりないですが、 Perlは気にする必要があります。Perl入学式第3回後、ネットや書籍の情報で勉強してみたところ、 このリファレンス機能により、柔軟なデータ構造を表現できることが理解できました。

普通は、一気に書かずに、機能毎に途中出力結果を確認しながらコーディングをしますが、 リファレンスの出力には「Data::Dumper」を利用すると便利だなと感じました。

第4回

概要は以下のとおりです。

リファレンスの復習で撃沈気味でした。時間が空いてしまったため、普段使わないと忘れるのは仕方ないですが・・・。 サブルーチンは、C言語の関数です。Fortran以外でサブルーチンという音を聞くとは思いませんでした。

サブルーチンへ渡す引数は、基本的に1次元の配列です。 したがって、aという配列とbという配列を渡して、それぞれの要素ごとに足し合わせてcの配列を返す、なんてことはリファレンスを使わないと表現できません。 これは代表的なリファレンスの使い方ですが、オブジェクト指向等の表現もリファレンスの機能を使っているはず?です。

正規表現は「Perl入学式」に参加する大きなモチベーションのひとつでした。 Webアプリ等を仕事にしていないので、どちらかというとテキスト処理のツールとして、 Perlを使えないかなと思っていましたので、非常に勉強になりました。

テキスト処理にはAWKを使うことが多く、正規表現も結構適当で、とりあえず、パイプで繋げばいいじゃん! の感覚でいたので、Perl正規表現AWKにもフィードバックできるれば、 もう少しエレガント(コードが少なくわかりやすく)に書けるかなと思ってます。

第5回

概要は以下のとおりです。

  • 前回の復習
  • mapとgrep
  • while
  • next, last
  • package / 名前空間
  • モジュール
  • テスト
  • テストを使った開発
  • 付録: 後置if, 後置for

packageについては名前空間を使ったことがあると、理解が早まります。 また、テストは結構重要な要素かなと。

プログラムは、「環境構築して、プログラム書いて、回った回った!!!終わり」、 というわけではないので、 単体テストの実施方法を学べたのは良かったです。

第6回

概要は以下のとおりです。

  • Mojolicious の準備
  • HTTP の基礎
  • Mojolicious 入門
  • 簡易 BBS の作成

Mojoliciouのインストールからはじめます。cpanmは第1回でインストールしているので、 さくさく進みます。

私はHTTPをちゃんとやってなかったですが、特に違和感なく出来ました。

1つ気になったのは、Mojoを使って吐き出されるソースで、インデントがスペース2つという所です。 おー、emacsの設定変えろって事?です。

不足分

オブジェクト指向については、十分に触れられません。 ただし、第5回までで学習したことを生かせば、書籍やネットの情報で理解することが出来るかなという印象です。

CPANモジュールは第1回で使い方を、第6回でMojoliciousをインストールしますが、 必要なモジュールを調べて、使ってみるのも面白いかと思います。 私はPDLというのを入れて使ってみました。

書籍

Perl入学式では特に書籍は必要ありません。 一冊くらいは購入して、体系的に学ぶこともしておいたほうが良いかと思います。 お勧めの書籍については第1回で紹介されています。

https://github.com/perl-entrance-org/workshop-2014-01/blob/master/slide2.md

また、書籍とPerl入学式で学んだことに差異がありますが、 Perl入学式の方が、最新の情報らしいです(まあ、生の情報が新しいに決まってますが)。 気になったら、サポーターの方に聞くのが一番です。 ハッシュタグ「#Perl入学式」でつぶやくと、すごい人々が対応してくれるそうです。

今後

Webアプリ

今後は、復習しながら、Mojoの学習かなと思いますが、 そもそもWebについては明るくないので、そこから学習するのもありかなと思います。 ただし、仕事で使うことはないと思われるので、 どうやって趣味としてモチベーションを維持するかは個人的な課題です。

テキスト処理

一方で、テキスト処理の自分用ツールを書きたいなという思いはあります。 こちらは普通に仕事でも使えると思うので、やってみたいかなと。 ですから、モチベーションの維持については課題はないと思ってます。 やれば、それだけ生産性が向上しますから。

Perlに対する印象の変化

Perl古い」という印象を持っていました。 まあ、CとかFortranとか使っているんで、古い事にはなれてますが・・・。

Perlは強い後方互換性を保ちながら、新しい機能を追加していく姿勢がすごいなと思います。 お勉強用の書籍については、RubyPythonに比べて少ないのかなとの印象ですが、 実はいろんな機能を追加したり、書き方の流行?の変化速度が速かったりして、 書籍じゃ追いつかないのかなという印象に変化しました。 「古くて新しい」が一番しっくりきます。

付随して得られたもの

開発環境については、「エディタ」を使うようになってます。 Perl入学式の中では推奨はEmacs、SublimeText、Vimでした。 個人的にはEmacsを使ってましたが、講師の方がVimでコーディングしている姿を見ると、 Vimもかっこいいなと思い、多少触ったり、カスタマイズの方法なんかも調べました。

大規模なプログラムになると、開発環境を整えることも重要かなと思います。

サポーターの皆様への感謝

プログラムを書くのは「楽しいから書く」のだな、と思います。 一人で書いても楽しいですが、仲間がいるともっと楽しいです。 ただ、いざ一人で新しい言語を勉強しようとすると難しいです。

こういった場を提供してくださった講師をしていただいた方をはじめ、 サポーターの皆様には感謝です。

加えて、プログラミング言語を学ぶ基礎として、コミュニティは重要だと認識しました。 職場でも、プログラムを書く人がいたとしても、職務の範疇でしか知識や経験が得られませんが、 こういった勉強会があると、幅も広がります。

また、機会があれば参加させていただきたいと思います。 皆様、本当にありがとうございました。

iTerm2

iTermについてです。

MacOSのシェル環境はどのようにされているのか?

はじめてのパソコンはiMacDV OS9.04 でした。 それ以降、OSXのはじめては10.2ジャガーでした。 大学で使ったシェルが使えて感動した覚えがあります。

iTermは下記にあります。

iTerm2 - Mac OS Terminal Replacement

便利ですね。

MarkDown

会社でMarkDownの話題が出ていたので、 Emacsに入れてみました。 「.md」ファイルに下記のように入力すると、

# 見出し1
# 見出し2
# 見出し3

以下のようになります。

見出し1

見出し2

見出し3

所詮テキストファイルなので、軽いですし、 .mdファイルの結果は、HTMLのブラウザで見れます。 このはてなも、マークダウン形式で書けます。

マークダウンのファイルはテキストファイルですが、 HTMLブラウザで見るには変換する必要があります。

EmacsVim、SublimeTextでは変換ツールが備わっています。

EmacsVimを使ったことがない人はSublimeTextが良いかと思います。 パッケージのインストールとか楽ですし、キーバインドも他のテキストエディタと比較して、 大きな違いがないかと思います。下記のページが非常に参考になります。

http://webmem.hatenablog.com/entry/sublime-text-markdown

EmacsVimの利用者は、説明する必要はないと思います。 (こだわりを持って利用されていると思います)

MarkDown記法はググればたくさん出てきます。、

置換

置換はよくやる作業だと思います。
事務処理でも、研究でも、ITでも。

Perlだと「s/置換前/置換後/」で変換できます。

  • ファイルの読み込み
  • 置換
  • 置換後のファイル出力

をやれば、複数ファイルでも、自動で置換できるはずです。

use strict;
use warnings;
my $str = "I am Ken.\n";
print $str;
$str =~ s/I am/You are/;
print $str;

相互相関係数

二変数の相関係数を相互相関係数と言います。
下記の式で表現されるようです。

データはxyの二つの時系列データがある場合を考えています。

\begin{eqnarray}
{r}_{xy}(h)= 
\frac{
\Sigma_{t=1}^{T-h}(x_t-\overline{x})(y_{t+h}-\overline{y})}
{\displaystyle\sqrt{\Sigma_{t=1}^{T-h}(x_t-\overline{x})^2}
\displaystyle\sqrt{\Sigma_{t=1}^{T}(y_{t+h}-\overline{y})^2}
}
\end{eqnarray}

その他の変数の意味は下記をご参照ください。


自己相関係数 - nishiru3の日記

自己相関や相互相関は、自己回帰モデルで使われるので、
重要な概念です。また、何度も言いますがスペクトル解析でも出てきます。

確率統計については、理系、文系問わずに必要な学問だなぁと改めて感じていますし、多くの分野で使われるということは、それだけ応用が利くということです。

自己相関係数のプログラム

自己相関係数を求めるためのプログラムです。

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cmath>
using namespace std;
void self_corr (double* x, int imax,double* r){
    // 平均値の算定
    double x_ave = 0.0;
    for(int i = 0; i < imax; i++){
	x_ave+=x[i];
    }
    x_ave/=(double)imax;
    // 平均値を差し引く
    double *y = new double[imax];
    for(int i = 0; i < imax; i++){
	y[i] = x[i]-x_ave;
    }
    // 自己相関係数のうち、分母denomの算定
    double denom=0.0;		// 分母denom
    for(int i = 0; i< imax; i++){
	denom=denom+y[i]*y[i];
    }
    // 自己相関係数のうち、分子numerおよび自己相関係数rの算定
    for(int h = 0; h <imax; h++){
	double numer = 0.0;	// 分子
	for(int i = 0; i < imax-h; i++){
	    numer=numer+y[i]*y[i+h];
	}
	r[h] = numer/denom;	// 自己相関係数
    }
}
//
int main(void) {
    // 入力ファイル
    fstream ifs("in.txt");
    // 時系列の個数
    int imax = 7306;
    // 時系列データxと自己相関係数rの配列確保
    double* x = new double[imax];
    double* r = new double[imax];
    // 入力ファイルからのデータ入力
    for(int i = 0; i < imax; i++) {
	ifs >> x[i];
    }
    // 自己相関係数の算定
    self_corr ( x, imax, r);
    // 自己相関係数の出力
    for(int i = 0; i < imax; i++) {
	cout << r[i] << endl;
    }
}

気象庁のホームページから、日平均気温を引っ張ってきて、
自己相関係数を求めてみました。


気象庁|過去の気象データ検索

日平均気温であれば、365日周期で、相関係数が1に近づきます。
(当たり前ですね。一年前との気温は概ね同じはず。)
ただし、ラグが大きくなればなるほど、周期はそのままに、相関係数は小さくなります。
このように当たり前のことであれば、自己相関を取るまでもなく、その特徴がわかるかと思います。

さらに踏み込むと、二変数に対して相関係数をとる方法に相互相関係数があります。
たとえば、雨と河川流量とかです。なんとなく、雨が降ると流量は増えそうだなと、直感でわかりますが、その時間差は?と聞かれると、不明です。

次回はぜひそれについて。

f:id:nishiru3:20141105184403j:plain

自己相関係数

乱流の話で出てきたのが、はじめてだったと思います。
あと、気温とか、雨量とかの分析でも使われます。

気温なんかは日変動量や月変動量等の理屈はわかっているので、あまり意味がないですが、
練習問題としてはわかりやすいです。

スペクトル解析でも当然のように出てきます。
非常に重要です。

以下、自己相関係数の定義です。

r(h) = \frac{\Sigma_{t=1}^{T-h}(x_t-\overline{x})(x_{t+h}-\overline{x})}{\Sigma_{t=1}^{T}(x_t-\overline{x})^2}

Tは時系列の個数、hはラグ、xはデータ、\overline{x}はデータの平均値です。h=0の場合、当然ですがr(0)=1です。ラグが0の場合は、その値と一致するからです。