フェムトセカンド #七味とーがラジオ / @melonsode

The Destination is unknown. The Journey is the Reward.
Author: 野澤真一 / NOZAWA Shinichi , version 2.0220330 / Podcast: 七味とーがラジオ / twitter: @melonsode

Octave,R,Perl, その他プログラミングtips: 2009年アーカイブ

MatlabとOctaveに関するtips

|

カテゴリ:

備忘録的に、おそらく他の人にも役に立つだろうから。

ツッコミ歓迎

  • Matlabのコメントは%
  • function, if, whileなどの閉じ方はendfunction, endifなどではなく全てend
  • matlabには「++」という演算子がない?
  • octaveでpcolorコマンドでできるグラフはMatlabだとimagescで同じようにできるっぽい。こちらの方が断然よい。octaveのpcolorはバグがあると思われる。(10x10の行列を与えても9x9の画像がでてくる!)
  • と思ったらoctaveにもimagescというコマンドがあり、これはきちんと動作しているっぽい!

[重要]Octave で扱っているデータを保存して、それをMatlabで読み出す方法 Octaveのsaveコマンドを使えばいいのだけど、ちょっと骨がある。

  • [octave] save -mat temp.mat

と打つことで、temp.mat というファイル名で現在扱っているOctave上のデータをすべて保存できる。もし扱っているデータの一部、例えばRという変数だけ保存したい場合は

  • [octave] save -mat temp.mat R

とする。

ポイントは、まず「 -mat 」というオプションを付けてsaveコマンドを実行していること。-matを付けることでMatlab用のバイナリとして保存してくれる。 もう一つのポイントはファイル名として「.mat」という拡張子をわざわざつけていること。これはMatlab側からこのファイルを読み込むときに重要で、この拡張子が付いていないとascii形式のテキストデータとして読み込もうとしてエラーになってしまう。

この保存したデータはMatlab上では以下のように読み出す。

  • [matlab] load temp

読み出すときは何のひなりもいらない。


Octaveで濃淡グラフ

|

カテゴリ:

少し前に作った図と同等の図。

matrixOct.png

以前作った図
HTMLのTableタグ自動的に生成するPerlのスクリプトを
駆使して実現していたんだけど、
今回はこれをOctaveで生成することに成功した。

以下、メモ的に。

Octaveの軸の設定

  • 軸の設定の仕方は axis( [0 10 0 10] ) でOK。最初の二つがx軸のmin,max、後の二つがy軸のmin, max
  • 3次元の場合はさらに axis( [0 10 0 10 -10 10] ) と数字を6個にすればOK。
  • axis( [0 10 0 10], "square" ) とすることで、グラフが正方形になる
  • squareの他に、equalとnormalがある。
  • axis( [0 10 0 10], "square", "ij") とすることで、y軸の向きが反転する
  • x軸の向きを変えるのはコマンドはなかった
  • [h, va, na] = __plt_\get_axis_arg__("axis") とやってhを取得し、 set(h, 'xdir' , 'reverse') とやれば無理矢理 x軸の向きを反転することはできた。

Octaveの濃淡グラフ

  • 今回は pcolor(0.5:1:10.5,0.5:1:10.5, matrix) とやって表示している。matrixは10x10の行列
  • pcolor(x, y, matrix)
  • x,yの生成にはmeshgrid関数も使える
  • x, y はmeshgridで生成した行列でもベクトルのままでもどちらでもいいみたい
  • 色はおそらくデフォルトだとカラーで表示される。
  • colormap("default")と打つと、カラーのグラフになる
  • colormap(gray)と打つとグレースケールになる(grayは関数)
  • 今回のは赤が濃くなるようにしてあるが、これはRは1で固定、でGとBは1から0.11刻みで10段階に変化させたものを使用した。(3列10行の行列)
  • そのような色テーブルをcolormap(red_grad)というように行列で渡せばカラースケールは変わる

matrixColor.pngmatrixGray.png

参考サイト

そのほかメモ

  • Octaveであまりの計算はrem(x, y)。
  • たぶんOctaveのバージョン3になってから2のころと様子が違うんだろうなと。
  • __gnuplot_set__みたいな記法があったけど、たぶんもう使えない?

OctaveをMacにインストールする [X11 or AquaTerm]

| | トラックバック(1)

カテゴリ:

以前にも同じ内容の記事を書いたけれど、
今回気づいたことがあるので再度書きます。

過去の関連記事はこちら。

gnuplot can't show graphs - 2008年9月15日
How to install "Octave" in Mac OS X Leopard - 2008年9月17日

***************

で、今回の作業環境はこちら。

iMac
Mac OS X 10.5.7
3.06 GHz Intel Core 2 Duo
4GB 1067 MHz DDR3

***************

インストールはHow to install "Octave" in Mac OS X Leopard - 2008年9月17日の記事で書いた内容とほぼ同じです。

インストール方法

1.以下のページから「octave-3.2.0-i386.dmg 」をDLしてください。(26.6M)
(intel Macじゃない人はoctave-3.2.0-ppc.dmg の方をDLするんだと思います)
http://sourceforge.net/project/showfiles.php?group_id=2888&package_id=237839
or http://sourceforge.net/projects/octave
以前記事を書いたときはバージョンが3.0.2でしたが、今は3.2.0が最新みたいですね。

2.このdmgファイルをマウントしてください。

3.「Octave.app」というファイルをアプリケーションフォルダにドラッグアンドドロップしてください。これで、Octaveのインストールは完了!

4.Gnuplotがインストールされていない場合:octave-3.2.0-i386.dmgにgnuplotが含まれています。octave-3.2.0-i386.dmgの中のextrasフォルダを開きます。そのなかに「gnuplot-4.2.5-i386.dmg」というファイルがあります。これをマウントします。

5.「Gnuplot.app」というファイルをアプリケーションフォルダにドラッグアンドドロップしてください。これで、Gnuplotのインストールは完了!

以上でOctave, Gnuplotのインストールが完了です。

これでインストール完了なのですが、このままだと使い勝手が悪いし、
たぶんグラフが表示されません。

.bash_profileにAliasの設定をする

今のままだとアプリケーションフォルダの中のOctaveやGnuplotの
アイコンをダブルクリックしないとOctaveやGnuplotを起動できません。
あるいは、ターミナルで長ったらしいコマンド名を書かなければいけません。

アプリケーションフォルダのアイコン:
oct-gnu-app.png

ターミネルで長いコマンドを打つ:
oct-com.png

それではめんどくさいので、ターミナルで octave と打つだけで、
octaveが起動できるように設定します。

1.ターミナルを起動

2.フォルダを移動せずに「pico .bash_profile」と打つ。

3.そこで以下のように入力する。

alias gnuplot="/Applications/Gnuplot.app/Contents/Resources/bin/gnuplot"
alias octave=" /Applications/Octave.app/Contents/Resources/bin/octave"

入力したら、「control + O」を押す。
.bash_profileに保存するか?と聞かれるので、
そのままエンターキーを押す。
そして「control + X」を押して終了。

これでoctaveと打ったりgnuplotと打つだけで、
そのソフトを起動できるようになります。
ただし、この設定は次に新しく開いたターミナルウィンドウから有効です。

この.bash_profileの設定に関しては以下のページを参考にしてみてください。
初心者にはわかりずらいかと思います。
.bash_profileはターミナルの環境変数の設定を記述するファイルで、
picoというのはターミナル上で動くテキストエディタで、
他にもviやemacsなどがあります。

gnuplot can't show graphs - フェムトセカンド
ターミナルのことを調べてみた。 - ザリガニが見ていた...。


X11かAquaTermを設定する

もしAquaTermでグラフを表示したい場合はいまのままだとダメです。

OctaveとGnuplotはデフォルトではAquaTermでグラフを描画する設定になっていますが、
何もしていない状態のMacにはAquaTermが入っていません。
なので、AquaTermをインストールします。

1.下記のページからAquaTermをDLしてください。
http://sourceforge.net/project/showfiles.php?group_id=39915
or http://sourceforge.net/projects/aquaterm/

2.dmgをマウントし、AquaTerm.pkgをダブルクリックしてインストール!

以上でAquaTermのインストールは完了です。

もしX11でグラフを描画したい場合はAquaTermはいりませんし、
X11はMacに最初からインストールされているのでインストールは必要ありませんが、
.bash_profileに設定が必要です。

以下の手順で設定を追加してください。

1.ターミナルを起動

2.フォルダを移動せずに「pico .bash_profile」と打つ。

3.そこで以下のように入力する。
(既に何か入力してある場合は、一番最後に追加する。)

export GNUTERM=x11

入力したら、「control + O」を押す。
.bash_profileに保存するか?と聞かれるので、
そのままエンターキーを押す。
そして「control + X」を押して終了。

参考:http://slashdot.jp/science/comments.pl?sid=38...

これでX11にグラフを描画することができます。
ただし、この設定は次に新しく開いたターミナルウィンドウから有効です。

もしX11からAquaTermに戻りたい場合はこの行を消すか、
「export GNUTERM=aqua」に書き換えればOKです。

X11とAquaTermの違い

X11を利用するのとAquaTermを利用するのはどちらがいいか?と気になりますが
それぞれ利点があります。

X11は3次元でグラフを描画した際などに、
グラフ上をマウスでグリグリやるだけで視点を変更できます。
たぶんそれ以外にもインタラクティブにグラフを変えることができるのだと思います。

AquaTermを使うと、PDFやEPS形式吐き出したり、
そのまま印刷したりすることができます。
また、X11よりはこちらの方がグラフがきれいらしいです。

好みややりたいことによって使い分けるといいと思います。

Octaveを終了すると...

補足ですが、X11の場合はOctave中でグラフを書こうとすると
X11が自動で起動し、Octaveを終了すると自動でX11も終了します。

これに対してAquaTermの場合、自動で起動はするのですが、
Octaveを終了してもAquaTermは起動したままで残ってしまいます。
これはどこかで設定をすることで自動でAquaTermを終了するように
することはできるのでしょうか?
どなたか知っていたら情報をお願いします。

それから、AquaTermはOctaveが起動中に終了してしまうと、
そのOctaveからはそれ以上グラフを描画することができなくなって
しまうので注意が必要です。
その場合はOctaveを起動し直してください。

Octaveでグラフを描画する簡単なコマンド

最後に、Octaveを使い慣れていないひとの為に、
さっとグラフを描画するコマンドを書いておきます。

plot(sin(1:100))

これだけで、sin(x) を描画できます。

sin.png

xが1, 2, 3, ... , 100と目が粗いのでギザギザしたsin関数になっています。

====================================================
追記 2012年8月17日

この記事を書いてからすでに3年経っていて、
この情報も相当古いと思われる。
実際、この通りにやったのに動かないという声もちらほら。

僕自身も、2008年製のMacBook Airでは気づいたらGNUPLOTが動かなくなっていた。
描画ソフトとしてAquaTermを指定しているにも書かわらず、
X11で描画しようとしていて見つかりませんてきなエラーがでる。

しかし不思議なことに、その環境をそっくり引き継いでいるはずの
2010年製のMacBook Proだときちんと動いたりする。
いみわからん。

博士課程を事実上ドロップアウトしてから、
Octaveを使う機会はめっきりなくなってしまったので
放置していたのだが、久々にOctaveをいじってみたら、
そのような状態を発見し、いらだっております。

少し調べてみたけど、どうしたら治るかわからん。
直し方はわからないがこんな記事を見つけた。

Octaveのオンラインマニュアル
15.1 Introduction to Plotting

Earlier versions of Octave provided plotting through the use of gnuplot. This capability is still available. But, a newer plotting capability is provided by access to OpenGL. Which plotting system is used is controlled by the graphics_toolkit function. (See Graphics Toolkits.)

The function call graphics_toolkit ("fltk") selects the FLTK/OpenGL system, and graphics_toolkit ("gnuplot") selects the gnuplot system. The two systems may be used selectively through the use of the graphics_toolkit property of the graphics handle for each figure. This is explained in Graphics Data Structures. Caution: The FLTK toolkit uses single precision variables internally which limits the maximum value that can be displayed to approximately 10^38. If your data contains larger values you must use the gnuplot toolkit which supports values up to 10^308.

だそうです。

以前のOctaveはgnuplotを使ってグラフの描画を行なっていたし、
今もそれは利用可能だけど、
OpenGLを使ってグラフを描画する方法も利用可能になったよ!

だそうです。

OpenGLの方を使えばGNUPLOTとかAquaTermとか気にしなくていいんじゃない?
とか思うんですが、誰かやってみてください。(投げやり)

Octaveを最新バージョンにして、

graphics_toolkit ("fltk")

と打てばOpenGLの描画になるそうです。

MacでOpenGLのプログラムを始める方法

|

カテゴリ:

MacでOpenGLのプログラムを始める方法を紹介します。

OpenGLは2D, 3Dのグラフィックスの描画に特化したライブラリで、
C言語などから利用できます。
Macには最初からインストールされているので、
わざわざOpenGLとそれを動かすためのGLUTを
自分でインストールする必要はありません。(少なくとも10.5は。)

環境:
Mac OS X Lepard 10.5.6
1.8GHz Intel Core 2 Duo
MacBook Air

1.Xcodeを起動する。

2.新規プロジェクトをつくる

3.StandardToolを選択し、作成

Command Line Utilityの中のStandard Utilityを選択。
(プログラムをC言語で行いたいときはこれを選ぶけれど、
他の言語でやりたいときはこれじゃないんだと思う)

プロジェクト名は適当につけてください。
場所は例えば「~/Desktop/hogehoge」とすると
デスクトップ上のhogehogeというフォルダに保存されます。

4.既存のフレームワークを追加:OpenGLとGLUT

パネルが出てくるので、ギヤのマークのプルダウンをクリックして、
「追加 > 既存のフレームワーク...」をクリック。

フレームワークの中からGLUTとOpenGLを選択。(2回追加を行う)

追加されると次のようになる。

5.main.cにOpenGLとGLUTのヘッダを付け加える

OpenGLとGLUTのヘッダは

#include <OpenGL/gl.h>
#include <GLUT/glut.h>

となる。ここはWindowsと異なるので注意。

ヘッダを付け加えるのは別にmain.cじゃなくてもいいと思うけど、
(例えばmain.hというファイルを作ってそこに書く)
僕はC言語は詳しくないのでこうしています。

これで少なくともコンパイルはできるはずです。

6.コンパイルしてみる

Xcodeのコンソールを表示して(実行 > コンソール)、

「ビルドして実行」を押してみましょう。

コンソールに「Hello, World!」と表示されるはずです。

これでうまくコンパイルされるなら、
main.cの中で自由にGLUTとOpenGLのライブラリが使えるはずです。

OpenGLのプログラミングに関しては、
例えば以下のページを参考にしてみてください。

GLUTによる「手抜き」OpenGL入門

補足

OpenGLは当然ながらXcodeを使わなくてもできます。

例えばテキストエディタでC言語のプログラムをするときは、
プログラムの最初に

#include <OpenGL/gl.h>
#include <GLUT/glut.h>

というのを付け加えて、
コンパイルするときに、

cc -framework OpenGL -framework GLUT -framework Foundation program.c

というような引数をいろいろつけてコンパイルすればいい、のだと思うけど、
僕はC言語のプログラムには疎いので、
もしかしたらまちがっているかもしれない。

Xcodeを使うメリットはそう言ったコンパイル時の引数のことを
気にしなくても「フレームワークを追加」という操作で、
それが自動的に実現されることと、
プログラムのエラーを分かりやすく教えてくれるところと、
あとはプログラムが致命的なエラーを内包していても、
被害を小さく収めてくれるなど点があります。

ぼやき

僕はC言語は苦手で嫌いなので、
本当はOpenGLを得意なPerlで扱いたい。

PerlからOpenGLを扱うためのモジュールがあって、
それをPOGLという。

http://graphcomp.com/opengl/
http://search.cpan.org/dist/OpenGL/

これを使いたいのだけど、モジュールのインストールがうまくいかない。

cpan install OpenGL

とやって、CPANからこのモジュールをインストールしようとするのだけど、
コンパイルでこけてしまう。

どなたかわかるかた教えてください。

cpan> install OpenGL CPAN: Storable loaded ok Going to read /Users/shinichi/.cpan/Metadata Database was generated on Fri, 17 Jul 2009 09:27:05 GMT Running install for module OpenGL Running make for B/BF/BFREE/OpenGL-0.57.tar.gz CPAN: Digest::MD5 loaded ok CPAN: Compress::Zlib loaded ok Checksum for /Users/shinichi/.cpan/sources/authors/id/B/BF/BFREE/OpenGL-0.57.tar.gz ok Scanning cache /Users/shinichi/.cpan/build for sizes Deleting from cache: /Users/shinichi/.cpan/build/Parse-RecDescent-1.94 (16.5>10.0 MB) Deleting from cache: /Users/shinichi/.cpan/build/Spreadsheet-WriteExcel-2.25 (15.8>10.0 MB) Deleting from cache: /Users/shinichi/.cpan/build/OpenGL-0.57 (12.8>10.0 MB) OpenGL-0.57/ OpenGL-0.57/CHANGES OpenGL-0.57/COPYRIGHT OpenGL-0.57/examples/ OpenGL-0.57/examples/clip OpenGL-0.57/examples/cube OpenGL-0.57/examples/depth OpenGL-0.57/examples/double OpenGL-0.57/examples/fun OpenGL-0.57/examples/glu_test OpenGL-0.57/examples/light OpenGL-0.57/examples/plane OpenGL-0.57/examples/planets OpenGL-0.57/examples/quest OpenGL-0.57/examples/README OpenGL-0.57/examples/simple OpenGL-0.57/examples/smooth OpenGL-0.57/examples/spaceship.nff OpenGL-0.57/examples/stan.ppm OpenGL-0.57/examples/texhack OpenGL-0.57/examples/texture OpenGL-0.57/examples/tk_demo OpenGL-0.57/examples/tk_steal OpenGL-0.57/examples/try OpenGL-0.57/examples/wolf.bin OpenGL-0.57/fragment.arb OpenGL-0.57/fragment.cg OpenGL-0.57/fragment.glsl OpenGL-0.57/FreeGLUT/ OpenGL-0.57/FreeGLUT/freeglut.dll OpenGL-0.57/FreeGLUT/freeglut.lib OpenGL-0.57/FreeGLUT/README.txt OpenGL-0.57/genvars.pl OpenGL-0.57/glext_procs.h OpenGL-0.57/glpm_const.h OpenGL-0.57/glut_const.h OpenGL-0.57/glut_util.h OpenGL-0.57/glu_const.h OpenGL-0.57/glu_util.h OpenGL-0.57/glx_const.h OpenGL-0.57/glx_util.h OpenGL-0.57/gl_const.h OpenGL-0.57/gl_util.c OpenGL-0.57/gl_util.h OpenGL-0.57/include/ OpenGL-0.57/include/GL/ OpenGL-0.57/include/GL/freeglut.h OpenGL-0.57/include/GL/freeglut_ext.h OpenGL-0.57/include/GL/freeglut_std.h OpenGL-0.57/include/GL/gl.h OpenGL-0.57/include/GL/glext.h OpenGL-0.57/include/GL/glprocs.h OpenGL-0.57/include/GL/glut.h OpenGL-0.57/include/GL/glxext.h OpenGL-0.57/include/GL/SGIFreeSWLicB.1.1.pdf OpenGL-0.57/include/GL/wglext.h OpenGL-0.57/INSTALL OpenGL-0.57/isosurf.bin OpenGL-0.57/isosurf.pl OpenGL-0.57/KNOWN_PROBLEMS OpenGL-0.57/Makefile.PL OpenGL-0.57/MANIFEST OpenGL-0.57/menutest.pl OpenGL-0.57/META.yml OpenGL-0.57/oga.pl OpenGL-0.57/OpenGL.pm OpenGL-0.57/OpenGL.pod OpenGL-0.57/OpenGL.xs OpenGL-0.57/os2pm_X.h OpenGL-0.57/ppport.h OpenGL-0.57/README OpenGL-0.57/README.cygwin OpenGL-0.57/README.FreeBSD OpenGL-0.57/README.macosx OpenGL-0.57/README.nvidia OpenGL-0.57/README.os2 OpenGL-0.57/README.Win32 OpenGL-0.57/SUPPORTS OpenGL-0.57/test.jpg OpenGL-0.57/test.pl OpenGL-0.57/test.png OpenGL-0.57/test.tga OpenGL-0.57/TODO OpenGL-0.57/typemap OpenGL-0.57/utils/ OpenGL-0.57/utils/cleanup.pl OpenGL-0.57/utils/const.pl OpenGL-0.57/utils/exports.pl OpenGL-0.57/utils/exports.txt OpenGL-0.57/utils/glext_procs.pl OpenGL-0.57/utils/glversion.c OpenGL-0.57/utils/hdr_diff.pl OpenGL-0.57/utils/Makefile OpenGL-0.57/utils/Makefile.cygwin OpenGL-0.57/utils/Makefile.macosx OpenGL-0.57/utils/makefile.mak OpenGL-0.57/utils/makefile.mingw OpenGL-0.57/utils/mingw.bat OpenGL-0.57/utils/opengl32.txt OpenGL-0.57/utils/wgl_ext.txt OpenGL-0.57/vertex.arb OpenGL-0.57/vertex.cg OpenGL-0.57/vertex.glsl

CPAN.pm: Going to build B/BF/BFREE/OpenGL-0.57.tar.gz

2009-07-18 02:27:55.725 glversion[15023:10b] GLUT Warning: invalid glutGet parameter: 508
Found GLUT - unknown version

Using interface: AGL

Checking if your kit is complete...
Looks good
Writing Makefile for OpenGL
cp OpenGL.pm blib/lib/OpenGL.pm
AutoSplitting blib/lib/OpenGL.pm (blib/lib/auto/OpenGL)
cp Config.pm blib/lib/OpenGL/Config.pm
cp OpenGL.pod blib/lib/OpenGL.pod
/usr/bin/perl /System/Library/Perl/5.8.8/ExtUtils/xsubpp -noprototypes -typemap /System/Library/Perl/5.8.8/ExtUtils/typemap -typemap typemap OpenGL.xs > OpenGL.xsc && mv OpenGL.xsc OpenGL.c
cc -c -Iinclude -I/usr/X11/include -arch i386 -arch ppc -g -pipe -fno-common -DPERL_DARWIN -no-cpp-precomp -fno-strict-aliasing -Wdeclaration-after-statement -I/usr/local/include -O3 -DVERSION=\"0.57\" -DXS_VERSION=\"0.57\" "-I/System/Library/Perl/5.8.8/darwin-thread-multi-2level/CORE" -DHAVE_VER -DHAVE_GL -DHAVE_GLU -DHAVE_GLUT OpenGL.c
cc -c -Iinclude -I/usr/X11/include -arch i386 -arch ppc -g -pipe -fno-common -DPERL_DARWIN -no-cpp-precomp -fno-strict-aliasing -Wdeclaration-after-statement -I/usr/local/include -O3 -DVERSION=\"0.57\" -DXS_VERSION=\"0.57\" "-I/System/Library/Perl/5.8.8/darwin-thread-multi-2level/CORE" -DHAVE_VER -DHAVE_GL -DHAVE_GLU -DHAVE_GLUT gl_util.c
Running Mkbootstrap for OpenGL ()
chmod 644 OpenGL.bs
rm -f blib/arch/auto/OpenGL/OpenGL.bundle
cc -mmacosx-version-min=10.5.6 -arch i386 -arch ppc -bundle -undefined dynamic_lookup -L/usr/local/lib OpenGL.o gl_util.o -framework OpenGL -framework GLUT -o blib/arch/auto/OpenGL/OpenGL.bundle \
\

chmod 755 blib/arch/auto/OpenGL/OpenGL.bundle
cp OpenGL.bs blib/arch/auto/OpenGL/OpenGL.bs
chmod 644 blib/arch/auto/OpenGL/OpenGL.bs
Manifying blib/man3/OpenGL.3pm
/usr/bin/make -- OK
Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-Iblib/lib" "-Iblib/arch" test.pl
Can't load 'blib/arch/auto/OpenGL/OpenGL.bundle' for module OpenGL: dlopen(blib/arch/auto/OpenGL/OpenGL.bundle, 2): Symbol not found: _glutBitmapHeight
Referenced from: /Users/shinichi/.cpan/build/OpenGL-0.57/blib/arch/auto/OpenGL/OpenGL.bundle
Expected in: dynamic lookup
at test.pl line 9
Compilation failed in require at test.pl line 9.
BEGIN failed--compilation aborted at test.pl line 9.
make: *** [test_dynamic] Error 2
/usr/bin/make test -- NOT OK
Running make install
make test had returned bad status, won't install without force

2009-07-18 02:27:55.725 glversion[15023:10b] GLUT Warning: invalid glutGet parameter: 508
Found GLUT - unknown version

とあるので、おそらくGLUTのヘッダファイルが古いのだと思われる。

が、どうやったらそれを修正できるのか、
わからない。

アクセス数自己相関

|

カテゴリ:

このページのアクセス解析はninja toolsとGoogleAnalyticsを使っています。
どちらも、4ヶ月分のログを記録してくれるようになっていますが、
それより時間が経ったログは消えていってしまいます。

ま、4ヶ月分のアクセス解析結果があれば十分といえば十分なのですが、
年単位でみたときにアクセス数がどう変化してきたのかが
知りたくなるのが人情というもので、
あるときからせっせとログをローカルに保存するというようなことを
するようになりました。(不完全ながら)

赤いのがユニークビジターで青いのが総閲覧数。
それぞれ、日毎と一週間移動平均を示してあります。
縦線のうち、緑が月単位の区切りで、茶色が年の区切りです。

これだけ長いスパンでみると、
一年と通して着実にアクセス数が伸びていることとか、
お盆とお正月にはガクンとアクセス数が下がることとかがわかる。
ぼんやりとだけど、世の中の大きな流れを反映しているのが面白い。

それから、よーくみるとわかるのが、日毎のグラフには月に4回程度、
山と谷があるということ。
これは、土日はアクセス数が少なめで、平日にアクセス数が多いということを
反映していると考えられる。

それを確かめるために自己相関関数を計算してみた。
すごくおおざっぱな計算なのだが、ぴったり7日で周期があるのが
一目瞭然である。

縦の赤い線が7日ごとの区切り線。 見事に山の頂点と一致している。 データは2008年の366日分を用いた。

octaveで書いたコードをさらしておきます。 (自己相関関数の計算はかなり適当ですのであしからず。)

* * *

過去のアクセス数に言及した記事

year_aa.m

function [data]=year_aa()

tail = 20000;

fid=fopen("./2008_1yearLog.txt", 'r', 'native');

data = fscanf(fid, "%s %d %d", [12,tail]);
fclose(fid);
data=data';#'

data(:,1:10)=[];

u_visit = data(:,1);
last = length(u_visit);

limit = 75;
result = zeros(1, limit);
for i = 0:(limit-1)
result(i+1) = sqrt( sum(u_visit(1+i:last).*u_visit(1:last-i))   /(last - i  )) ;
endfor

p = 0;
measure = zeros(1,limit).+70;
while p<limit
measure(p+1) = 84.99999;
p = p+7;
endwhile

clg
axis([0,limit,75, 85])
hold on;

plot(0:limit-1,result(1:limit))
stem(0:limit-1, measure(1:limit))

hold off

no automatic redirect in post request

|

カテゴリ:

二、三ヶ月前からうまくうごかなかったPerlスクリプトが動いた!

ものすごくうれしいんですけど。

LWPでAmazonのアフィリエイト管理画面にログインして、
売り上げのデータを取得したい、というのが目的だった。

LWPでユーザエージェントを作って
それに情報をとってこさせる方法を知ってから、
単にGETメソッドでのアクセスしかできなかったのが、
POSTメソッドでアクセスしたり、
Cookieをユーザーエージェントに保持させたりと
複雑なことができるようになってきて、
その成果がGoogleAnalyticsWidgetというMTのプラグイン。

そのプラグインはMTの背後でLWPのユーザーエージェントが
MTで設定されたIDとパスワードでGoogleにログインして、
あたかも本物のユーザーになりすまして、
データを取得するというのをやっている。

これができるんだから、Amazonでもできるはず!と思って、
何度かトライしたのだけど、何故かできなかった。

AmazonがLWPを嫌うせい?と考えて、ユーザーエージェント名を偽装したり、
Javascriptを使わないと埋められないPOSTデータがあるとか?と
考えて、javascriptの部分を読んで、考えうる限りjavascriptで
設定されるPOSTデータ部分を埋めたりした。
しかし、惨敗。

今日、再度トライしてみて、やっと原因がわかった。
問題はログインの認証には成功しているのだが、
実はそのあとにリダイレクトが起こっていて、
そのリダイレクトに追随できずに止まってしまっていたということだった。

GETでアクセスしたときは自動的にリダイレクトするのだけど、
POSTの場合は自動ではそうしないという仕様なのだった!

HTTPヘッダをよく見るべきだった。

HTTP/1.1 302 MovedTemporarily
Connection: close
Date: Wed, 11 Feb 2009 17:35:31 GMT
Location: https://affiliate.amazon.co.jp/gp/associates/join/landing/main.html
Server: Server Vary: Accept-Encoding,User-Agent
Content-Type: text/html; charset=UTF-8
Client-Date: Wed, 11 Feb 2009 17:35:32 GMT
Client-Peer: 207.171.191.185:443
Client-Response-Num: 1
Client-SSL-Cert-Issuer: /C=US/O・・・(中略)・・・
Client-SSL-Cipher: RC4-MD5
Client-SSL-Warning: Peer certificate not verified
Client-Transfer-Encoding: chunked
Set-Cookie: ubid-・・・(略)

HTTP/1.1 302 MovedTemporarily:これはページが移ったということ。
301と302はHTTPリダイレクト用のコード。

これをきちんと確認しておけばよかった。

それに気付く前は、

Client-SSL-Warning: Peer certificate not verified

という部分があやしいと思っていて、
確かにこのセンテンスでググるとSSLのあたりでhttps.pmに問題があるから、
パッチをあてたという話がでてくる。
けれどそれらの話は2002年頃の話で、すでに修正は済んでいる模様だった。

まあ、なんとか気付けてよかった。


参考リンク:
Perlモジュール/LWP - Walrus, Digit.
HTTPリダイレクトとは 【HTTP redirect】 - 意味・解説 : IT用語辞典

PATCH: Peer certificate not verified for https Crypt::SSLeay

memo: apache

|

カテゴリ:

Apacheの設定に関してメモ。

設定ファイル
/etc/httpd/conf/httpd.conf

ウェブに公開しているフォルダの構成が
/var/www/の下のhtmlとcgi-binというフォルダ。
これだとHTMLなどの静的ファイルはhtmlフォルダに、
Perlなどの実行されるファイルはcgi-binにということで、
面倒くさい。

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

の行を書き換えて、htmlに設定し直せばいいのかと
思っていたけど、そうでもない。

ScriptAlias / "/var/www/html/"

としてみたけど、こうするとCSSやFlashなどの外部埋め込みファイルを
読み込まなくなるし、
Apacheを起動したときに、warningがでる。

で、htmlフォルダ以下でもCGIを実行したい場合は

AddHandler cgi-script .cgi

のコメントアウトを外して、
それから、

<Directory "/var/www/html">
....
</Directory>

この中に、

Options ExecCGI

を追加すればよいみたい。

R language prevailing

Rが普及しているらしい。

「R言語」、企業や研究機関での利用が急拡大 - Technobahn

===
最近になって登場したコンピューター言語としてはサンマイクロのJavaに並ぶヒット作ともなる。
===

ほんとうかっ!(N先生風)
Octave + Gnuplot もいい組み合わせだけどなー。
Rはいまいち馴染めないでいる。

ちなみにCentOS 5.2へのRのインストール方法はこちらです!(宣伝)
install R in CentOS 5.2 - フェムトセカンド

Mac OS XへのRのインストールする場合は以下のリンクから最新版を
ダウンロードして、インストーラーをダブルクリックするだけです!
R for Mac OS X

インストールしたら、ターミナルで「R」と打てば起動します。
「quit()」と打てば終了します。
exitじゃだめです。quit()のカッコを忘れてもだめです。

Rの本としてはこれがおすすめ。

Rによるやさしい統計学
山田 剛史 (著), 杉澤 武俊 (著), 村井 潤一郎 (著)

心理統計の初歩の話とともに、Rの使い方を解説してくれています。

ニュースの記事では「R言語」って書いてあるけど、
普通は単に「R」って呼ぶ。
だけど、Rだと、Googleで検索するときに困る。

「R」って一文字だから、Rを含む英単語がすべて引っかかってしまう。
統計とかstatisticsとかつけないと検索できない。
だからやっぱり、あえて「R言語」と呼ぶのがいいのだろう。

というわけでみなさん。
これからはRのことをR言語と呼びましょう!


* * *

追記:2009/01/10 22:46

柏野さんの記事で、思ったよりもR言語が普及していることを知った。
wrong, rogue and log : R You Ready for R?

technobahnの記事もきっとNY Timesの記事が元ネタなんだろう。

R言語がこれだけの勢いがあるのに、
日本じゃ相変わらずSPSSが主流なのだから、
困ったものだ。

RはフリーソフトだがSPSSは商用ソフトでけっこう高価らしい。 討論者の一人が、 「教授会で心理統計の授業では SPSSはやめてRを使いましょうと提案するのだが、 教授陣がSPSSしか使えないという理由で却下されてしまう」 ということを話していた。 また、 「Rはオブジェクト指向の現代的なプログラム言語であるのに、 SPSSはオブジェクト指向であるどころか構造化言語ですらないのに、 いまだに圧倒的にシェアがナンバーワン」 という内容のことを言っていた。 そうなのか。がんばれR。負けるなR。

--- R and RNG - フェムトセカンド

R言語はインストールがちとめんどくさいという難点があるので、
サーバーにR言語をインストールして、
ブラウザで操作できるASPサービスをやったらどうかと考えたことがある。
1年で数百円程度の会費をとるぐらいにすれば、
学生だって使ってくれるだろう。
それなら卒業した後だって、使おうと思えば活用できる。

時間ができたらやりたいなと思っているけど、
ぼやぼやしてるうちにあっというまに他の人にやられてしまうだろうな。

プロフィール

月別アーカイブ

全アーカイブ

フェムトセカンド1.0


メールを送る(故障中)