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

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

Octave,R,Perl, その他プログラミングtipsの最近のブログ記事

11: YAPC::Japan 2019 - 駆け足で聞いた発表振り返り

|

カテゴリ:

七味とーがラジオ 11回目

  • 00:00 - YAPC::Japan 2019駆け足で聞いた発表振り返り

キーワード


自分が聞いた YAPC::Japan 2019

|

カテゴリ:

Opening

  • Opening

11:20 - 12:00

12:10 - 12:50

  • Perl to Go (40min) / xaicron

ランチスポンサーセッション

14:00 - 15:30

14:50 - 15:30

15:40 - 16:20

16:30 - 17:10

Lightning Talks 30min

  • LT x 6

Keynote

  • Keynote: 松野 徳大 (40min)

Closing

  • Closing

YAPC::Japan 2019 全発表のスライドへのリンク

|

カテゴリ:

YAPC::Japan 2019 全発表のスライドへのリンクです。現時点で自分が観測できる範囲で書いてます。漏れなどあればお気軽におしらせください。

  • 当日LTと前夜祭LTソンを追加しました

本編

YAPC::Tokyo 2019 - Timetable

Opening

  • Opening

11:20 - 12:00

12:10 - 12:50

ランチスポンサーセッション

14:00 - 15:30

14:50 - 15:30

15:40 - 16:20

16:30 - 17:10

Lightning Talks 30min

  • LT x 6

Keynote

Closing

  • Closing

ゼロからはじめるプログラミング講座(Perl)@越谷 第一回

以下、メモです。時間を見つけて、加筆修正する予定です。

前提

  • 参加者の方には下記の準備をしてきてもらっています。
  • 教えるプログラミング言語はPerlという言語です。
  • まったくの初心者歓迎
  • プログラミングを学ぶ時の一番最初にして最大の障害である、「環境の構築」を一緒にやります
  • 反響をみて、第二回以降を開催
  • 場所は越谷

準備

Perl入学式の第二回資料を印刷して持ってきてもらう。

Mac の人

  • テキストエディタをインストールしてきてもらう
  • テキストエディタは使い慣れているものがあれば、それでOK
  • テキストエディタというものがどういうものかわからない人にはSublime Text 2というエディタを紹介
  • http://www.sublimetext.com/

Winの人

  • VMWare Playerをインストールし、その上に仮想化したUbuntuをインストールしてきてもらう
  • インストールのやり方は下記のPerl入学式の下記スライドを参照
  • http://www.slideshare.net/papix/perl-1
  • インストール後はUbuntuを全画面で表示する設定や、ダッシュボードのアイコンを整理したりしてもらっておくほうが良かった

講座内容

ターミナルとテキストエディタ

ターミナル(Ubuntuは"端末"と呼ぶ)と、 テキストエディタを開いてもらう。

テキストエディタは、Macの場合、Sublime Text 2、 Ubuntu の場合は デフォルトで入ってる gedit。

以降、Perlの話よりもターミナルの使い方がメイン。

which perl

which perl
  • perlがどこにあるか
  • (どのPerlを使っているか)
  • そもそもPerlが入っているか

確認できる。

/usr/bin/perl

想定される反応はこういうもの。(環境によって異なるが)

ディレクトリの構成について解説

ls コマンド

今いるディレクトリのファイル・ディレクトリ一覧を表示するコマンド

  • ls
  • ls -l パーミッションや所有者名など詳細を表示
  • ls -a 「 . 」ではじまる隠しファイルも表示
  • ls -la -lと-aをあわせたもの

など。lsはlistの略。他にもオプションがある。

cd コマンド

  • cd [行きたい場所]

change directoryの略 とりあえず、

cd /

とやって、一番上の階層「 / 」に行ってもらって、 それからユーザーのデフォルトの場所まで戻ってきてもらった。

lsを使っていまいる場所にどんなディレクトリがあるか探ったり、 tabキーを打ってコマンドの補完をしたり、 ↑キーを使ってコマンドの履歴を呼び出したりする練習。

下記のコマンドで一発で戻れる

cd ~/

「 ~ 」このニョロのマークはチルダと読む

Hello, World を書いて保存

やっとPerlの話になる。

プログラム初心者のはじめの一歩、Hello, Worldを表示するプログラムを書く。 テキストエディタで下記のように書く。 最初は、改行文字( ¥n あるいは バックスラッシュn)はなしで。

#!/usr/bin/perl

print "Hello, World";

そして、これを適切な場所に保存する。 今回は、Document(あるいは書類)というディレクトリに 「sample.pl」という名前で保存してもらった。 (この操作はGUIで行う)

そして、先ほどの cd コマンドや ls コマンドを駆使して、 ターミナル上でそのファイルを見つけ出し、実行してもらう。

sample.plの実行

sample.plが置いてあるディレクトリまで移動できたら、

perl sample.pl

とやって実行してもらう。

Hello, Worldの解説

1行目はシバン行(シェバン行)と呼ばれているが、 おまじないとしておく。

最初は、行末の改行文字なしで実行してもらい、 改行文字がないと結果がどうなるかを実感してもらった。 それから、改行文字あり。

#!/usr/bin/perl

print "Hello, World¥n";
  • Hello, World を囲っているのはダブルクォート(シングルクォートではない)
  • 全部半角文字でうつ
  • print と「 " 」の間にはスペースを必ず入れる

それから、ダブルクォートをシングルクォートにするとどうなるか、実験。 シングルクォートにすると、変数展開しないため、¥nは改行にならず、 そのまま¥n(えんまーくえぬ)と表示されるのを確認。

プログラムを実行するもうひとつの方法

実は

perl sample.pl

とやって実行する場合は、最初の一行のシバン行(#!/usr/bin/perl)はいらない。 なぜなら、実行するときに、perlと打っているから。

そして、次のようにも実行できる。

./sample.pl

しかし、現状では「Permission Denied(権限がありません)」と表示されて、実行できない。

権限を変更する方法 chmod コマンド

  • 読み、書き、実行の3種類の権限の組み合わせ
  • 読み = read = r, 書き= write = w, 実行 = execute = x
  • user, group, otherの3種類の実行者分類
  • 権限を変更するのは chmod コマンド
  • change mode
  • userに実行権限を付与するとき:chmod u+x sample.pl
  • 権限をなくすとき:chmod u-x sample.pl
  • u+xとかではなく、644とか755とか数字で表現することもできる

和暦(平成)を西暦 に変換するプログラム

Hello, Worldができたところで、変数の扱いを知るために、 与えられた数字を西暦に変換するプログラムを作る。

#!/usr/bin/perl

$jyear = 25;
$year = $jyear + 1998;

print "$year¥n";

これを実行すると、「2013」という答えが返ってくる。
意味合いとしては、入力された数字を平成の年だと解釈して、 それを西暦に変換してる。

もう少し、結果をわかりやすくするために、下記のように加工。

#!/usr/bin/perl

$jyear = 25;
$year = $jyear + 1998;

print "平成 $year 年は $year 年です。¥n";

こうすると、「平成 25 年は 2013 年です。」という結果がでてくるようになる。

値を入力できるようにする(標準入力を受け取る)

いまの状態だと、平成21年が西暦何年か、平成3年が西暦何年か調べるために、 いちいちプログラムを書き換えなければならない。 そこで、平成何年を調べたいかプログラムに尋ねさせて、それに答えて(数字を入力して)結果を出力するという風に変更する。

#!/usr/bin/perl

print "平成?";
$jyear = <STDIN>;
$year = $jyear + 1998;

print "平成 $jyear 年は $year 年です。¥n";

こうすると、「平成?」と画面に出た後に入力待ちになり、 そこに数字を打ち込んでエンターを押す(例えば20)と、

平成 20
年は 2008 年です。

という結果になる。

ここで、結果が二行になってしまっているのは、表記ミスではなく、実際にそうなってしまう。

この場合は、20と打った後にエンターキーを叩くので、そのエンターキーによって入力された改行がそのまま反映されてしまうからである。

その余分な改行を取り除くにはchompという関数を使う。

#!/usr/bin/perl

print "平成?";
$jyear = <STDIN>;
$year = $jyear + 1998;

chomp( $jyear );
print "平成 $jyear 年は $year 年です。¥n";

こうすると、余分な改行は出てこない。

  • STDINはStandard Inputのこと。日本語だと標準入力。
  • これを書くと、ターミナルの入力を受け付ける
  • STDINを囲んでいるくの字カッコ( < と > )は見た目のためではなく意味がある
  • STDINという文字列は予約されていて、他の用途では使えない
  • STDINの他に、STDOUT, STDERRというのがある

変数とは

変数とは文字列とか数値とかを1個格納するもの。

上記のプログラムでは、$jyearと書かれているところに、例えば25と書けば、実行できるがそうすると、別の数字で実行したいときに全部書き換えなければいけない。

しかし、変数でおいておけば、その変数に値を代入する行だけ書き換えればよい。

今回のコードでは、和暦の数字を格納するための変数の変数名として「$jyear」という変数名を使った。jyearの j はJapanのJのつもりだったが、j を l (エル)とか i (アイ)とかと見間違える人が多かったし、そのあとで出てくる、「$year」という変数と1文字しか違いがなく、それも間違いのもとなので、 $jyear という名前の付け方は良くなかったようだ。

というわけで、 $jyear という変数名はやめて、 $input という変数名にしましょうと提案、実際に書き換えてもらった。

#!/usr/bin/perl

print "平成?";
$input = <STDIN>;
$year = $input + 1998;

chomp( $input );
print "平成 $input 年は $year 年です。¥n";

ポイントは、$jyearだったところで、全て、残らず、書き換えることである。1個でも漏らしたり、スペルミスをすると、動かない。(動くかもしれないが、望む挙動をしてくれない。)

Perlにおける変数名は、先頭に必ず「 $ (ドルマーク)」がつくこと。これが、他の言語とは異なる特徴で、他の言語の場合、こういうマークは一切つかない。

配列、ハッシュ

変数の次は配列とハッシュ。配列は値を複数持つもの。

@array = ('John', 'Taro', 'Hanako');

このように、表現する。変数と違い、先頭の文字は「 @ (アットマーク)」である。 配列にアクセスするときは何番目の要素かを指定してアクセスする。

$array[0] だったら John
$array[1] だったら Taro
$array[2] だったら Hanako

ということになる。注意することは、1番目からはじまるのではなく、0番目から始まるということ。

ハッシュは、配列の時は添字(何番目の要素か)という情報をもとにアクセスしたが、それだと不便なときがある。そういうときに、キーワードになる文字列でアクセスできるようなキーと値のペアのことである。

%hash = ( 'Taro' => 'Japanese', 'John' => 'American');

この場合、Taro と Japanese という文字列がペアになっている。 要素にアクセスするときは次のようにする。

$hash{'Taro'} とすると Japanese という値が出てくる

配列とハッシュで注意することは、まず、個々の値を呼ぶときは先頭の文字が@や%ではなく、変数と同じ $ になっていることである。

配列:@array 配列の要素:$array[0]

 ハッシュ:%hash ハッシュの要素:$hash{'Taro'}

次に、カッコの形も重要である。配列は添字を書き込むときに、角カッコで囲む。一方、ハッシュの時は弓カッコで囲む。

配列の要素:$array[0] ← 添字 0 は [  ] で囲われてる

 ハッシュの要素:$hash{'Taro'} ← キー'Taro' は { } で囲われてる

配列を使ってみる

@array = ('Yamada', 'Tanaka', 'MyName', 'Suzuki');

上のような配列を与えられた時に、自分の名前を表示するようにする。 (私の名前は MyName です)

解答:

#!/usr/bin/perl

@array = ('Yamada', 'Tanaka', 'MyName', 'Suzuki');

print "私の名前は $array[2] です¥n";

ポイントは

  • 添字は3ではなく、2である(0番目からはじまる)
  • ダブルクォートでくくる

そのほかに、確認として、ダブルクォートをシングルクォートに変えてみたり、 「"私の名前は" . $array[2] . "です¥n" 」と文字列を分割し、 ピリオドを使って結合してみたりしました。

第一回はここまで〜

その他

  • 今回の参加者は6名(自分含む)
  • 会場費 500円いただいた
  • 会場代 3500円(午後・夜間使用料+電源代)
  • 電源が遠く、テーブルタップのコンセントが足りず
  • 携帯の電波は良好
  • スクリーンなかったけどプロジェクタはきれいに映った
  • プロジェクタのアダプタの問題で、 ターミナルとテキストエディタを実際に移す様子を見せられなかった
  • 前日に参加を決めた方がおり、連絡が間に合わずUbuntuがない状態で参加
  • dankogaiさんのサーバーを使用 http://colabv6.dan.co.jp/lleval.html
  • 終了後は、サンシティの地下のお店(るーぱん)で懇親会
  • 懇親会は5名参加(割り勘で1200円程度)

Amazonの広告があるとJavascriptがonloadで動作しない件

|

カテゴリ:

このブログでは、
トップページの上の方に、
Flickrにアップされた最新の画像6件が
自動的に表示されるようになっている。

それはJavascriptで動的に実行されるようになっていて、
「window.onload」でその部分の表示を書き換えるようになっている。

つまり、ページの読み込みが完了したら、
Flickrの画像を取得して表示するという動きを実行する仕組み。
window.onloadがFlickr画像取得の関数をフックする。

で、この仕組がうまくいくときといかないときがあって、
その原因がわからなかった。
すこし調べてみたらどうもAmazonのアフィリエイトリンクがあるときに、
動作しなくなっているのがわかった。

Amazonのアフィリエイトリンクはiframeタグで表示されていて、
どうもそのあたりが原因らしい。
iframeの内容を表示するためにurlを指定するのだが、
そのurlの情報の取得が失敗しているがために、
window.onloadが機能しなくて、
結果、Flickrの画像を取得する関数も動作しないということのようだ。

Amazonのリンクは表示はされているし、
ブラウザも一見して取得は完了しているようにみえるので、
そのあたりどうなってるか謎だ。

苦肉の策として、読み込めなかった場合はリンクをクリックすることで、
関数を呼び出して実行させるようにした。

追記:上に書いた問題は解決できなかったのだけど、
別の解決方法を見つけたので書いておく。

上で書いた「表示されない場合はクリックをする」という解決法は、
クリックするという手間があるのであまりうれしくない。

画像のonLoadでも動作のフックになりうるということがわかったので、
それを応用してみた。

なんでもいいからimgタグを書いて、そこに何かしらの画像のurlを指定して、
そこに onLoad="動かしたい関数" と書けばそれでフックになる。

せっかくなのでFlickrのWebページのFlickrロゴに直接リンクを貼って、
それが読み込まれたら画像を取得して表示する関数を動かすという風にしてみた。

うまくいったので、window.onloadで画像を呼び出すのはやめにしました。

-----------
追記2:ちなみにどうやっているかというとこんな感じ。

HTMLのヘッダ部分に下記のように書きます。

<script type="text/javascript" src="flickr-search.js"></script>

このflickr-search.jpというのは下記のサイトを参考にさせてもらいました。
第2回 JavaScriptからFlickr APIで画像検索 - マッシュアップ・ラボ:ITpro

で、Flickrの画像を表示したい部分にこういうふうに書きます。

<div id="photos_here">Loading...</div>

最後に、何でもいいので画像を読み込ませて、そこにonLoadで
画像呼び出しの関数名を書く(この場合はphoto_search)。

<img src="http://l.yimg.com/g/images/en-us/flickr-yahoo-logo.png.v3"
width="50"
onLoad="photo_search({ user_id: '25933488@N07' });">)

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

プロフィール

月別アーカイブ

全アーカイブ

フェムトセカンド1.0

メールを送る(故障中)