新規記事の投稿を行うことで、非表示にすることが可能です。
2021年01月07日
windows10でfortranの複素数のプログラミング
昔のスペクトル解析の専門書の巻末に書かれた
fortranのプログラムをwindows10のsurface proで回すために始めた勉強は、
現在、本の巻末の例題を3つ再現できたところである。
(ここには書かないが。)
次は複素数の計算が出てきたのでfortranの複素数のプログラミングを
調べて覚える。
(複素数のコードの書き方知らないと覚えようとしている
複素数の高速フーリエ変換はできないから。)
あぁ、、とうとう自分は複素数の計算をプログラミングできるように
なるのだ、、。
大学受験の時に複素数の問題は解けたけど、
大学の専門分野の講義の時は複素数を使った技術計算は
よく理解できなかった。そんな13〜14年前にできなかったことを
今日、明日で超えれるのだと思うと感慨深い。いつの歳になっても
日々勉強である。
で、調べると下記サイトを見つける。
>大気海洋科学のための計算機講習会
>稲津 將(北海道大学地球環境科学研究科)
>Fortran 複素数
>https://www.sci.hokudai.ac.jp/~inaz/doc/B/Education/node6.html
複素数の変数の宣言の仕方は分かった。
次に、プログラミングの前に複素数の足し算、引き算、掛け算、割り算
をおさらいせねば。
足し算、引き算は実部、虚部をそのまま足し引きするだけだが、
掛け算、割り算ってどうやるのだったか、、。
もう13、14年も経っているから覚えてない。
で、検索すると下記のサイトが出てきた。
>マナペディア
>複素数の四則計算
>OKボーイ
>https://manapedia.jp/text/52
割り算がちょっと面倒だな。
分母に共役複素数を掛けてたか。
ではfortranの
・足し算、引き算、掛け算、割り算
・共益複素数を出力するconjg関数
・2乗(x^2)
・指数関数(e^x)
を試してみる。
下記のようにコードを書いてみた。
(1〜27行目)
(28〜51行目)
その際、複素数のformat文は
どうやって書けばいいか分からなかったので
下記のサイトを参考にした。
(実部、虚部をコンマで区切ってカッコで囲めばいい)
>早稲田大学 理工情報関連科目・情報教育ウェブサイト FORTRANプログラミング入門
>2019年度春学期・Fortranプログラミング入門
>Format文の書式
>http://www-it.sci.waseda.ac.jp/FPR1/class02/Fortran/Japan/3_2fmt.pdf
ついでに下記のURLを貼っておこう。
(C、Fortran、JAVAのプログラミング言語の講義が聴けるから。)
>早稲田大学理工メディアセンター
>http://www.waseda.jp/mse/web/infotechedu/
で、回した結果は下記。
よしよし、うまくいった。
同じ計算をエクセルでやったのが下記。
数値も合っている。
※指数関数部分はIMEXP関数にCOMPLEX関数の複素数を代入し、
その実部と虚部をそれぞれIMREAL関数、IMAGINARY関数で
セルに出力した。
これで、複素数のコードに必要な内容は把握できただろう。
(追記)
実数、整数から複素数を作るcmplx関数が必要だったので追記する。
cmplx関数がないと、
整数または実数変数を組み合わせて複素数を作ることができない。
c=(a,2.0)やc=(a,b)とするとエラーになる。
(数値だけならいけるが、変数が入るとカッコだけではだめになる。)
c=cmplx(a,2.0)やc=cmplx(a,b)とするとエラーでなくなる。
それを使って下記のコードを書いた。
で実行すると下記のようになる。
fortranのプログラムをwindows10のsurface proで回すために始めた勉強は、
現在、本の巻末の例題を3つ再現できたところである。
(ここには書かないが。)
次は複素数の計算が出てきたのでfortranの複素数のプログラミングを
調べて覚える。
(複素数のコードの書き方知らないと覚えようとしている
複素数の高速フーリエ変換はできないから。)
あぁ、、とうとう自分は複素数の計算をプログラミングできるように
なるのだ、、。
大学受験の時に複素数の問題は解けたけど、
大学の専門分野の講義の時は複素数を使った技術計算は
よく理解できなかった。そんな13〜14年前にできなかったことを
今日、明日で超えれるのだと思うと感慨深い。いつの歳になっても
日々勉強である。
で、調べると下記サイトを見つける。
>大気海洋科学のための計算機講習会
>稲津 將(北海道大学地球環境科学研究科)
>Fortran 複素数
>https://www.sci.hokudai.ac.jp/~inaz/doc/B/Education/node6.html
複素数の変数の宣言の仕方は分かった。
次に、プログラミングの前に複素数の足し算、引き算、掛け算、割り算
をおさらいせねば。
足し算、引き算は実部、虚部をそのまま足し引きするだけだが、
掛け算、割り算ってどうやるのだったか、、。
もう13、14年も経っているから覚えてない。
で、検索すると下記のサイトが出てきた。
>マナペディア
>複素数の四則計算
>OKボーイ
>https://manapedia.jp/text/52
割り算がちょっと面倒だな。
分母に共役複素数を掛けてたか。
ではfortranの
・足し算、引き算、掛け算、割り算
・共益複素数を出力するconjg関数
・2乗(x^2)
・指数関数(e^x)
を試してみる。
下記のようにコードを書いてみた。
(1〜27行目)
(28〜51行目)
その際、複素数のformat文は
どうやって書けばいいか分からなかったので
下記のサイトを参考にした。
(実部、虚部をコンマで区切ってカッコで囲めばいい)
>早稲田大学 理工情報関連科目・情報教育ウェブサイト FORTRANプログラミング入門
>2019年度春学期・Fortranプログラミング入門
>Format文の書式
>http://www-it.sci.waseda.ac.jp/FPR1/class02/Fortran/Japan/3_2fmt.pdf
ついでに下記のURLを貼っておこう。
(C、Fortran、JAVAのプログラミング言語の講義が聴けるから。)
>早稲田大学理工メディアセンター
>http://www.waseda.jp/mse/web/infotechedu/
で、回した結果は下記。
よしよし、うまくいった。
同じ計算をエクセルでやったのが下記。
数値も合っている。
※指数関数部分はIMEXP関数にCOMPLEX関数の複素数を代入し、
その実部と虚部をそれぞれIMREAL関数、IMAGINARY関数で
セルに出力した。
これで、複素数のコードに必要な内容は把握できただろう。
(追記)
実数、整数から複素数を作るcmplx関数が必要だったので追記する。
cmplx関数がないと、
整数または実数変数を組み合わせて複素数を作ることができない。
c=(a,2.0)やc=(a,b)とするとエラーになる。
(数値だけならいけるが、変数が入るとカッコだけではだめになる。)
c=cmplx(a,2.0)やc=cmplx(a,b)とするとエラーでなくなる。
それを使って下記のコードを書いた。
で実行すると下記のようになる。
2021年01月02日
fortranのformat文覚える
windows10で化石言語であるfortranを回す。
古い本の巻末に書かれているプログラムを読むべく始めたが、
1個書けた。で回った。
(ここにはソースは書かないが。)
1個読めたら全部読めるね。
複数例題が書いてあっても同じ著者がプログラムを書いてるから。
英語とかと違ってプログラムはコードに使っているキーワードが少ないんだよな。
ただ、1個引っかかったのが、
本質的な計算部分ではなく、
画面やテキストファイルに出力する際の
書式のformat文である。
普通はformatの中は数値の全桁数、小数点以下の桁数が
書いてあるはずだが、
本の巻末のプログラムだと、
format文の中に文字が書いてあり、その文字が見出しの様に
画面やファイルにも出力されている。
この形式をマスターせねば本の巻末のプログラムを覚えたことにはならない。
で、下記のサイトを参考にした。
>福岡大学電気工学科
>FORTRAN 言語の構文
>http://tepe.tec.fukuoka-u.ac.jp/HP98/studfile/ssm/ssmdata/ssm-08.pdf
で、自分も書いてみた。
で、回した結果は下記。
うん。本の巻末のプログラムもこれで読めるかな。
format文にスラッシュ( / )入れると改行もできるんだな。
で、本の巻末のプログラムを見返した。
なんかformat文に「 TR5 」とか、「 T 」とかある。
これはなんだ。
検索するもなかなか出てこない。
途中で、どうやらformatの記号のアルファベットは
「編集記述子」と言うようだ。
「 f8.3 」とかは「F形式の編集記述子」または「F形編集記述子」と言うらしい。
ということで「T形編集記述子」で検索したら下記のサイトが引っかかった。
>東京理科大学 山本研究室ホームページ
>Fortranマニュアル 入出力編集
>https://www.rs.kagu.tus.ac.jp/yama/f90/FORMAT.html
上記サイトを参考に、さっきのコードを改造してみた。
で、回してみるとこんな感じ。
令和の時代にFortranの勉強をしているのは自分くらいだろうな。
でも、専門の本ってどんどん古くなる。
新しく発売される本には式の根拠とか、基準値の理由とか書いてないんだよな。
プラグラミングもブラックボックス。
計算根拠が分かっている人はどんどん定年になり、退職していく。
ちょっとでいいからそういう根拠とかが分かったらいいなと思う。
(追記)
もう1回、本の巻末のプログラムを見返したら、
配列をDo文を使わずにformat文の書式だけで羅列している。
こんな機能があるんだな。
で、自分もさっきのコードの一番下に配列をDo文を使わずに羅列して書いてみる。
で、実行して結果を出力してみる。
よしよし。
format文をマスターしたぞ。
write文の横が数値だけになってすっきりしたな。
古い本の巻末に書かれているプログラムを読むべく始めたが、
1個書けた。で回った。
(ここにはソースは書かないが。)
1個読めたら全部読めるね。
複数例題が書いてあっても同じ著者がプログラムを書いてるから。
英語とかと違ってプログラムはコードに使っているキーワードが少ないんだよな。
ただ、1個引っかかったのが、
本質的な計算部分ではなく、
画面やテキストファイルに出力する際の
書式のformat文である。
普通はformatの中は数値の全桁数、小数点以下の桁数が
書いてあるはずだが、
本の巻末のプログラムだと、
format文の中に文字が書いてあり、その文字が見出しの様に
画面やファイルにも出力されている。
この形式をマスターせねば本の巻末のプログラムを覚えたことにはならない。
で、下記のサイトを参考にした。
>福岡大学電気工学科
>FORTRAN 言語の構文
>http://tepe.tec.fukuoka-u.ac.jp/HP98/studfile/ssm/ssmdata/ssm-08.pdf
で、自分も書いてみた。
で、回した結果は下記。
うん。本の巻末のプログラムもこれで読めるかな。
format文にスラッシュ( / )入れると改行もできるんだな。
で、本の巻末のプログラムを見返した。
なんかformat文に「 TR5 」とか、「 T 」とかある。
これはなんだ。
検索するもなかなか出てこない。
途中で、どうやらformatの記号のアルファベットは
「編集記述子」と言うようだ。
「 f8.3 」とかは「F形式の編集記述子」または「F形編集記述子」と言うらしい。
ということで「T形編集記述子」で検索したら下記のサイトが引っかかった。
>東京理科大学 山本研究室ホームページ
>Fortranマニュアル 入出力編集
>https://www.rs.kagu.tus.ac.jp/yama/f90/FORMAT.html
上記サイトを参考に、さっきのコードを改造してみた。
で、回してみるとこんな感じ。
令和の時代にFortranの勉強をしているのは自分くらいだろうな。
でも、専門の本ってどんどん古くなる。
新しく発売される本には式の根拠とか、基準値の理由とか書いてないんだよな。
プラグラミングもブラックボックス。
計算根拠が分かっている人はどんどん定年になり、退職していく。
ちょっとでいいからそういう根拠とかが分かったらいいなと思う。
(追記)
もう1回、本の巻末のプログラムを見返したら、
配列をDo文を使わずにformat文の書式だけで羅列している。
こんな機能があるんだな。
で、自分もさっきのコードの一番下に配列をDo文を使わずに羅列して書いてみる。
で、実行して結果を出力してみる。
よしよし。
format文をマスターしたぞ。
write文の横が数値だけになってすっきりしたな。
2020年12月30日
fortranのif文、行番号、go to
windows10でfortran使って波形データ読み込み
スペクトル解析の古い本の巻末に載っているfortranのプログラムを解読して
windows10のsurface proで回してみようとして始めた
この作業。
前回はサブルーチンの書き方、使い方を覚えた。
本の巻末に載っているプログラムで波の解析をするのに、
そういえば波形データの読み込みのプログラムが載ってない。
なので、自力で書くしかない。
で、試行錯誤して書いてみた。
かなり苦戦した。(下記画像)
これがメインのプログラム。
で、これがテキストファイルを読み込むサブルーチン。
で、こちらが、読み込んだ配列を確認用にテキストファイルに出力するプログラム。
波形データは固定長で、1個のデータが8文字(うち3桁が少数)、
1行あたり9個のデータがあり、299行あるデータを読み込むプログラムである。
よくわからないが、
サブルーチンだと配列のサイズの宣言に9*mと式を入れても回るのに、
メインのプログラムだと配列のサイズの宣言に整数を入れないと回らない。(そこは諦めた)
これによりdoループ、formatも勉強した。
どうやら行の最初にある数値はdoループ、format、あとgo toで使うようだ。
go toとif文くらいを覚えたら、あとは
計算内容の理解だけだと思う。
というか、昔のプログラムはどんだけgo to文があるんだ。。かなり多いなあ。
糖質減らしている状態で、つかれた。。
細かいことは書けそうにない。(エラーつぶしに苦労した。。)
化石プログラムにここまで労力を使うとは、、無駄な気がしてきた。。
(こんなことはこの令和の時代に同じ職の人は誰もやらないな。)
でも、やる。
windows10のsurface proで回してみようとして始めた
この作業。
前回はサブルーチンの書き方、使い方を覚えた。
本の巻末に載っているプログラムで波の解析をするのに、
そういえば波形データの読み込みのプログラムが載ってない。
なので、自力で書くしかない。
で、試行錯誤して書いてみた。
かなり苦戦した。(下記画像)
これがメインのプログラム。
で、これがテキストファイルを読み込むサブルーチン。
で、こちらが、読み込んだ配列を確認用にテキストファイルに出力するプログラム。
波形データは固定長で、1個のデータが8文字(うち3桁が少数)、
1行あたり9個のデータがあり、299行あるデータを読み込むプログラムである。
よくわからないが、
サブルーチンだと配列のサイズの宣言に9*mと式を入れても回るのに、
メインのプログラムだと配列のサイズの宣言に整数を入れないと回らない。(そこは諦めた)
これによりdoループ、formatも勉強した。
どうやら行の最初にある数値はdoループ、format、あとgo toで使うようだ。
go toとif文くらいを覚えたら、あとは
計算内容の理解だけだと思う。
というか、昔のプログラムはどんだけgo to文があるんだ。。かなり多いなあ。
糖質減らしている状態で、つかれた。。
細かいことは書けそうにない。(エラーつぶしに苦労した。。)
化石プログラムにここまで労力を使うとは、、無駄な気がしてきた。。
(こんなことはこの令和の時代に同じ職の人は誰もやらないな。)
でも、やる。
2020年12月27日
fortranのプログラムの形式
スペクトル解析の古い本の巻末に載っているfortranのプログラムを解読して
windows10のsurface proで回してみようとして始めた
この作業。
巻末に載っているプログラムには
なんか1文字目にCという文字や、
各行の最初に3桁の番号や*(アスタリスク)がある。
なんだろう。
で、下記のサイトを見てみる。
>JAMSTEC 国立研究開発法人 海洋研究開発機構
>EARTH SIMULATOR
>参考資料 Fortran90を用いたプログラミングの記述方法
>https://www.jamstec.go.jp/es/jp/simschool/f90learning/index.html
>2章:Fortran90プログラミング基礎
>https://www.jamstec.go.jp/es/jp/simschool/f90learning/chap2/page1.html
どうやら自由形式と固定形式があるらしい。
Cと*とか3桁の数値とかが行の最初に書いてあるのは固定形式らしい。
今回はどっちで書いたらよいのだろう。
あと、Cや*は注釈行(コメント?)らしい。
あと、拡張子についても説明が書いてある。
ファイル名はtest.f90にしているが、
どうやら.f90は自由形式らしい。(固定形式は.fのようだ。)
なので、MinGW-64では.fでもプログラムが回るのかを確かめてみる。
コードを固定形式で書いてみた。(下記画像)
で、回してみる。
正しく出力された。
どうやら固定形式にも対応しているようだ。
なので、今後は固定形式で書いていくことにする。
(本の巻末のプログラムを写すだけでいいから。もちろん勉強+理解しながら打つが。)
で、本の巻末のコードの中身を再度見ていくと、
最初にSUBROUTINEと書いてある、、、
これはvbaでいうsubプロシージャと違うのだろうか。
よくわからないので、先ほどの海洋研究開発機構のサイトをまた見てみる。
(なんでかわからんがこんな組織のホームぺージにfortranのまとめサイトがあるとは。
ありがたや。)
>JAMSTEC 国立研究開発法人 海洋研究開発機構
>EARTH SIMULATOR
>参考資料 Fortran90を用いたプログラミングの記述方法
>4章:関数とサブルーチン
>4.2 副プログラム
>https://www.jamstec.go.jp/es/jp/simschool/f90learning/chap4/page2.html
>4.3 サブルーチン
>https://www.jamstec.go.jp/es/jp/simschool/f90learning/chap4/page3.html
うーん、「内部関数、外部関数」と「サブルーチン」
の違いが分からん。
(文関数はなんとなくわかった)
これは実際にいくつか簡単なプログラムを書いてみるしかないな。
といっても、正式なfortranのプログラムの構成を知らん。
ということで今度は下記を見てみる。
>JAMSTEC 国立研究開発法人 海洋研究開発機構
>EARTH SIMULATOR
>参考資料 Fortran90を用いたプログラミングの記述方法
>2章:Fortran90プログラミング基礎
>2.1 プログラムの基本構成
>2.1.2 プログラムの構成について
>https://www.jamstec.go.jp/es/jp/simschool/f90learning/chap2/page1.html
前回書いた、テキストファイルに’Hello World!’を出力するプログラムに
見出しや、暗黙の型宣言無効の「implicit none」を付け加えてみる。(下記画像)
回してみても、前回と変わらずテキストファイルに’Hello World!’が出力された。
スペクトル解析の本の巻末に載っているプログラムは全部サブルーチンとして書かれており、
それを回すためのメインのプログラムは自分で書くことになっているから、
fortranのメインのプログラムの書き方を覚えておかないとね。
そういえば無意識にコードを小文字で書いている、、
本の巻末に載っているプログラムは全部大文字だけど。いいのかな。
まあ、大文字と小文字は区別しないらしいからまあいいか。
Atomの予測変換は小文字になるから、小文字で書き続けることにした。
で、今度は変数の宣言と数値計算をちょっと取り入れて
結果をテキストファイルに出力してみる。
変数の宣言は、x1は宣言時に初期値を設定してみて、
y1はx1を使ったべき乗の数式で決まるようにした。(下記画像)
べき乗ってvbaだとA^Bとかになるけど、
fortranだとA**Bになるんだな。知らなかった。
また、宣言時に初期値を設定するコロン2つは、
各サイトだとコロンとコロンの間に半角スペースがあるけど、
実際コンパイルしたらエラーになって、
半角スペースを抜いたら回った。なんでかはわからんがまあいいや。
結果もきちんと出力された。よしよし。(下記画像)
次は外部関数のプログラムを書いてみる。
どのプログラミング言語の例題でもよくある、
数値を入れ替えるswap関数である。
これにより、外部関数の引数がvbaで言う「値渡し」なのか「参照渡し」なのかを
確認したい。(下記画像)
もし関数内ではxとyを入れ替えたのに、
メインのプログラムの中では値が入れ替わってなければ「値渡し」、
メインのプログラムの中でも値が入れ替わっていれば「参照渡し」ということだ。
で、回してみる。
、、お、値が入れ替わっている。
3つの数値のうち、1つ目がx1、2つ目がy1で、当初の値から入れ替わっている。
3つ目の数値はswap関数の戻り値で、1.0が入っているので
プログラムがきちんと回ったことを示している。(下記画像)
下記サイトによると、
引数の場合につけると言われている「intent(in)」をつけると値を変更できないらしい。
今回はつけていないが、付けるとエラーになる。
あと、今回もうひとつ注意すべきは、
下記のサイトによるとメインのプログラムの冒頭で関数名の型の宣言が必要という事だ。
(これを知らなくて何度やってもエラーで困ってたので、下記サイトのおかげで助かった、、、)
>筑波大学 計算科学研究センター 原子核物理研究部門 日野原 伸生 計算物理学II
>Fortranの文法まとめ
>https://wwwnucl.ph.tsukuba.ac.jp/~hinohara/compphys2-20/doc/fortran.pdf
で、次に、同じ内容を内部関数として記述してみる。
特筆すべきは
・mainのプログラムの冒頭の関数名の型宣言は不要
・mainのプログラムのstopのあとにcontainsを記載し、
end programとの間に関数を記載する。
(stopの位置に迷ったが、下記サイトを参考にした。)
・関数の中身は外部関数の時と同じ。
>Takanobu Amano @ U-Tokyo Fortran演習 (地球惑星物理学演習)
>7. 関数とサブルーチン
>https://amanotk.github.io/fortran-resume-public/chap07.html
で、解析を回したところ、きちんと回った。
(外部関数のときと同じで引数に使った数値がmainプログラム内でも入れ替わっている。)
よし、最後にサブルーチンで書いてみよう。
特筆すべきは
・引数に戻り値用の変数を用意してあげないとサブルーチン内で初めて登場する変数は
返せない。(retはプログラムがきちんと回ったことの確認出力用なのでintent(out)を記載した。)
・main関数内でcallで呼びだす。
・retを引数に増やしたから、mainプログラム冒頭でも型を宣言。
かな。
実際に回してみると、きちんと回った。
で、はき出されたテキストファイルを見ても、
main関数側のx1とy1はきちんと入れ替わっていた。(参照渡しということ)
最後の戻り値であるretも1.0になっている。
よしよし。できたぞ。
これでサブルーチンが使えるぞ。
次に、サブルーチンだけ別ファイルに書いてみたい。
まずこれがmainプログラム(test.f)。
で、次がサブルーチン(sub01.f)。
で、コンパイルするときのBATファイルの中身は、ソースファイル名を2つ並べるだけ。
で、はき出されたa.exeを実行すると、きちんと同じ結果が出た。
(しつこいので出力の画像は貼らないが。)
これで本の巻末に書いてあるサブルーチンを使えるようになる第1歩が終わったな。
windows10のsurface proで回してみようとして始めた
この作業。
巻末に載っているプログラムには
なんか1文字目にCという文字や、
各行の最初に3桁の番号や*(アスタリスク)がある。
なんだろう。
で、下記のサイトを見てみる。
>JAMSTEC 国立研究開発法人 海洋研究開発機構
>EARTH SIMULATOR
>参考資料 Fortran90を用いたプログラミングの記述方法
>https://www.jamstec.go.jp/es/jp/simschool/f90learning/index.html
>2章:Fortran90プログラミング基礎
>https://www.jamstec.go.jp/es/jp/simschool/f90learning/chap2/page1.html
どうやら自由形式と固定形式があるらしい。
Cと*とか3桁の数値とかが行の最初に書いてあるのは固定形式らしい。
今回はどっちで書いたらよいのだろう。
あと、Cや*は注釈行(コメント?)らしい。
あと、拡張子についても説明が書いてある。
ファイル名はtest.f90にしているが、
どうやら.f90は自由形式らしい。(固定形式は.fのようだ。)
なので、MinGW-64では.fでもプログラムが回るのかを確かめてみる。
コードを固定形式で書いてみた。(下記画像)
で、回してみる。
正しく出力された。
どうやら固定形式にも対応しているようだ。
なので、今後は固定形式で書いていくことにする。
(本の巻末のプログラムを写すだけでいいから。もちろん勉強+理解しながら打つが。)
で、本の巻末のコードの中身を再度見ていくと、
最初にSUBROUTINEと書いてある、、、
これはvbaでいうsubプロシージャと違うのだろうか。
よくわからないので、先ほどの海洋研究開発機構のサイトをまた見てみる。
(なんでかわからんがこんな組織のホームぺージにfortranのまとめサイトがあるとは。
ありがたや。)
>JAMSTEC 国立研究開発法人 海洋研究開発機構
>EARTH SIMULATOR
>参考資料 Fortran90を用いたプログラミングの記述方法
>4章:関数とサブルーチン
>4.2 副プログラム
>https://www.jamstec.go.jp/es/jp/simschool/f90learning/chap4/page2.html
>4.3 サブルーチン
>https://www.jamstec.go.jp/es/jp/simschool/f90learning/chap4/page3.html
うーん、「内部関数、外部関数」と「サブルーチン」
の違いが分からん。
(文関数はなんとなくわかった)
これは実際にいくつか簡単なプログラムを書いてみるしかないな。
といっても、正式なfortranのプログラムの構成を知らん。
ということで今度は下記を見てみる。
>JAMSTEC 国立研究開発法人 海洋研究開発機構
>EARTH SIMULATOR
>参考資料 Fortran90を用いたプログラミングの記述方法
>2章:Fortran90プログラミング基礎
>2.1 プログラムの基本構成
>2.1.2 プログラムの構成について
>https://www.jamstec.go.jp/es/jp/simschool/f90learning/chap2/page1.html
前回書いた、テキストファイルに’Hello World!’を出力するプログラムに
見出しや、暗黙の型宣言無効の「implicit none」を付け加えてみる。(下記画像)
回してみても、前回と変わらずテキストファイルに’Hello World!’が出力された。
スペクトル解析の本の巻末に載っているプログラムは全部サブルーチンとして書かれており、
それを回すためのメインのプログラムは自分で書くことになっているから、
fortranのメインのプログラムの書き方を覚えておかないとね。
そういえば無意識にコードを小文字で書いている、、
本の巻末に載っているプログラムは全部大文字だけど。いいのかな。
まあ、大文字と小文字は区別しないらしいからまあいいか。
Atomの予測変換は小文字になるから、小文字で書き続けることにした。
で、今度は変数の宣言と数値計算をちょっと取り入れて
結果をテキストファイルに出力してみる。
変数の宣言は、x1は宣言時に初期値を設定してみて、
y1はx1を使ったべき乗の数式で決まるようにした。(下記画像)
べき乗ってvbaだとA^Bとかになるけど、
fortranだとA**Bになるんだな。知らなかった。
また、宣言時に初期値を設定するコロン2つは、
各サイトだとコロンとコロンの間に半角スペースがあるけど、
実際コンパイルしたらエラーになって、
半角スペースを抜いたら回った。なんでかはわからんがまあいいや。
結果もきちんと出力された。よしよし。(下記画像)
次は外部関数のプログラムを書いてみる。
どのプログラミング言語の例題でもよくある、
数値を入れ替えるswap関数である。
これにより、外部関数の引数がvbaで言う「値渡し」なのか「参照渡し」なのかを
確認したい。(下記画像)
もし関数内ではxとyを入れ替えたのに、
メインのプログラムの中では値が入れ替わってなければ「値渡し」、
メインのプログラムの中でも値が入れ替わっていれば「参照渡し」ということだ。
で、回してみる。
、、お、値が入れ替わっている。
3つの数値のうち、1つ目がx1、2つ目がy1で、当初の値から入れ替わっている。
3つ目の数値はswap関数の戻り値で、1.0が入っているので
プログラムがきちんと回ったことを示している。(下記画像)
下記サイトによると、
引数の場合につけると言われている「intent(in)」をつけると値を変更できないらしい。
今回はつけていないが、付けるとエラーになる。
あと、今回もうひとつ注意すべきは、
下記のサイトによるとメインのプログラムの冒頭で関数名の型の宣言が必要という事だ。
(これを知らなくて何度やってもエラーで困ってたので、下記サイトのおかげで助かった、、、)
>筑波大学 計算科学研究センター 原子核物理研究部門 日野原 伸生 計算物理学II
>Fortranの文法まとめ
>https://wwwnucl.ph.tsukuba.ac.jp/~hinohara/compphys2-20/doc/fortran.pdf
で、次に、同じ内容を内部関数として記述してみる。
特筆すべきは
・mainのプログラムの冒頭の関数名の型宣言は不要
・mainのプログラムのstopのあとにcontainsを記載し、
end programとの間に関数を記載する。
(stopの位置に迷ったが、下記サイトを参考にした。)
・関数の中身は外部関数の時と同じ。
>Takanobu Amano @ U-Tokyo Fortran演習 (地球惑星物理学演習)
>7. 関数とサブルーチン
>https://amanotk.github.io/fortran-resume-public/chap07.html
で、解析を回したところ、きちんと回った。
(外部関数のときと同じで引数に使った数値がmainプログラム内でも入れ替わっている。)
よし、最後にサブルーチンで書いてみよう。
特筆すべきは
・引数に戻り値用の変数を用意してあげないとサブルーチン内で初めて登場する変数は
返せない。(retはプログラムがきちんと回ったことの確認出力用なのでintent(out)を記載した。)
・main関数内でcallで呼びだす。
・retを引数に増やしたから、mainプログラム冒頭でも型を宣言。
かな。
実際に回してみると、きちんと回った。
で、はき出されたテキストファイルを見ても、
main関数側のx1とy1はきちんと入れ替わっていた。(参照渡しということ)
最後の戻り値であるretも1.0になっている。
よしよし。できたぞ。
これでサブルーチンが使えるぞ。
次に、サブルーチンだけ別ファイルに書いてみたい。
まずこれがmainプログラム(test.f)。
で、次がサブルーチン(sub01.f)。
で、コンパイルするときのBATファイルの中身は、ソースファイル名を2つ並べるだけ。
で、はき出されたa.exeを実行すると、きちんと同じ結果が出た。
(しつこいので出力の画像は貼らないが。)
これで本の巻末に書いてあるサブルーチンを使えるようになる第1歩が終わったな。
2020年12月26日
fortranのエディタにAtom使いたい
前回、windows10 64bitのsurface proで
fortranのプログラムをメモ帳で数行書いて、
テキストファイルをはき出してみた。
>fortranでテキストファイル出力してみる
>https://fanblogs.jp/mountain4101/archive/70/0
まあ3、4行のはじめてのコードならよいが、
本当に使うなら、ちゃんとしたテキストエディタがほしい。
きっときちんとしたエディタにはエラーチェック機能が
あるのではないだろうか。
ということで、ネットで検索してみると、
Atomというエディタがよいようである。
ダウンロードしようとサイトに行くと、
やけにかわいい画面。(下記画像)
バージョンは1.53.0
さっそくダウンロードしてインストールを試みる。
で、下記のサイトを参考にした。
>エンジニアの入り口
>【すぐわかる!】Atomエディタのインストールと日本語化、便利な使い方
>https://eng-entrance.com/atom-editor
インストールしようとすると
これまたおしゃれな画面が立ち上がった。
で、終わると以下の画面があがった。
「Register as default atom:// URI handler?」
と聞かれるので、ここは「No,Never」を選ぶらしい。
上記サイトのとおりに
「Japanese-menu」のpackageをインストール。
お、日本語になった。
よくわからないが、文字コードを「Japanese(Shift JIS)」にしてみる。
次に上記サイトのとおり「auto-encoding」をインストールした。
ずっと画面左の方に
「Your project is currently empty」
と表示されているのでフォルダの場所を設定してみる。
とりあえずデスクトップでatomのいう名前のフォルダにしてみた。
画面真ん中に「Telemetry Consent」というタブがあるが、
これは「No, do not send my usage data」を選んだ。
これで上記サイトに書いてあることはやった気がするが、
そういえば、fortran関連の設定をしていないから、
何のプログラミング言語に使うかが設定されていないはず。
で、下記サイトに書いてある5項目くらいのうち
・ファイルの種類別にアイコンを変えるという「file-icons」のインストール
・Fortranのシンタックスを有効にするという「language-fortran」のインストール
をやってみる。
>カオスラボ
>Atomの設定
>http://chaoscloud950.blog60.fc2.com/blog-entry-52.html
今までインストールしたパッケージは下記画像の4つだ。
次に下記のサイトを参考にしてエディタの設定をした。
>WebDesigner's Memorandum ウェブデザイナーの備忘録
>テキストエディタのAtomをインストールしたら最低限設定しておきたいアレコレ
>https://webrandum.net/atom-base-setting/
・インデントガイドを表示
・不可視文字を追加
・ソフトタブ
にチェックを入れた。
編集画面はこんな感じ。
とりあえず、これで始めれるだろう。
メモ帳よりはだいぶましだと思うので。
使いながら便利なパッケージがあれば追加するだな。
fortranのプログラムをメモ帳で数行書いて、
テキストファイルをはき出してみた。
>fortranでテキストファイル出力してみる
>https://fanblogs.jp/mountain4101/archive/70/0
まあ3、4行のはじめてのコードならよいが、
本当に使うなら、ちゃんとしたテキストエディタがほしい。
きっときちんとしたエディタにはエラーチェック機能が
あるのではないだろうか。
ということで、ネットで検索してみると、
Atomというエディタがよいようである。
ダウンロードしようとサイトに行くと、
やけにかわいい画面。(下記画像)
バージョンは1.53.0
さっそくダウンロードしてインストールを試みる。
で、下記のサイトを参考にした。
>エンジニアの入り口
>【すぐわかる!】Atomエディタのインストールと日本語化、便利な使い方
>https://eng-entrance.com/atom-editor
インストールしようとすると
これまたおしゃれな画面が立ち上がった。
で、終わると以下の画面があがった。
「Register as default atom:// URI handler?」
と聞かれるので、ここは「No,Never」を選ぶらしい。
上記サイトのとおりに
「Japanese-menu」のpackageをインストール。
お、日本語になった。
よくわからないが、文字コードを「Japanese(Shift JIS)」にしてみる。
次に上記サイトのとおり「auto-encoding」をインストールした。
ずっと画面左の方に
「Your project is currently empty」
と表示されているのでフォルダの場所を設定してみる。
とりあえずデスクトップでatomのいう名前のフォルダにしてみた。
画面真ん中に「Telemetry Consent」というタブがあるが、
これは「No, do not send my usage data」を選んだ。
これで上記サイトに書いてあることはやった気がするが、
そういえば、fortran関連の設定をしていないから、
何のプログラミング言語に使うかが設定されていないはず。
で、下記サイトに書いてある5項目くらいのうち
・ファイルの種類別にアイコンを変えるという「file-icons」のインストール
・Fortranのシンタックスを有効にするという「language-fortran」のインストール
をやってみる。
>カオスラボ
>Atomの設定
>http://chaoscloud950.blog60.fc2.com/blog-entry-52.html
今までインストールしたパッケージは下記画像の4つだ。
次に下記のサイトを参考にしてエディタの設定をした。
>WebDesigner's Memorandum ウェブデザイナーの備忘録
>テキストエディタのAtomをインストールしたら最低限設定しておきたいアレコレ
>https://webrandum.net/atom-base-setting/
・インデントガイドを表示
・不可視文字を追加
・ソフトタブ
にチェックを入れた。
編集画面はこんな感じ。
とりあえず、これで始めれるだろう。
メモ帳よりはだいぶましだと思うので。
使いながら便利なパッケージがあれば追加するだな。
2020年12月24日
fortranでテキストファイル出力してみる
昨日からfortranを始めた。
まず初めてコンパイル、実行したとき、
いちいちコマンドプロンプトに打ち込むのが面倒だった。
なので下記の画像のBATファイルを作成した。
このBATファイルをダブルクリックすれば
test.f90がコンパイルされ、
a.exeがフォルダ内に出力されるようなった。(下記画像)
ついでに、
a.exeをコマンドプロンプトから実行する
BATファイルを作成してみた。
で、このBATファイルをダブルクリックすると、
コマンドプロンプトが立上り、
Hello World!の文字が出た!
よしよし。
じゃあ、BATファイルを介さず、a.exeをそのままダブルクリックしてもいいかと思ったが、
ダブルクリックするとエラーで実行されない。(下記画像)
きちんとコマンドプロンプト上で実行すると実行できた。
これはコマンドプロンプト上でPASSを指定しているからである。
(環境変数でPASSを登録しても実行できる)
でもexeファイルをダブルクリックして実行できないなんて変だ、と思い
検索して調べると下記のサイトが見つかった。
>プログラミングやってみる!
>.dllが見つかりません。
>http://proprog583.blog.fc2.com/blog-entry-3.html
どうやら
C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin
のなかにある
・libgcc_s_seh-1.dll
・libquadmath-0.dll
・libwinpthread-1.dll
の3つがa.exeと同じフォルダにあると動くようなので
コピーしてみる。
でダブルクリックしたところ、上記サイトにあるようにエラーなく動いたが、
コマンドプロンプトが出ない(一瞬で消えている?)ので
exeファイルをダブルクリックだとHello World!の文字が見れず
プログラムが本当に想定通りに動いたか確かめれない。
なので、、、
実行されるとtextファイルをはき出すプログラムを書きたい。
(そうすればきちんと実行されたか分かるので。)
で、下記のサイトを参考にしてプログラムを書いてみた。(下記画像)
>nag
>Fortran 入門
>15 ファイル操作
>https://www.nag-j.co.jp/fortran/FI_15.html
writeのカッコの中の意味は以下のサイトを参考にした。
>[itbase2018]Fortran 実習 入出力
>https://itpass.scitec.kobe-u.ac.jp/hiki/hiki.cgi?%5Bitbase2018%5DFortran+%E5%AE%9F%E7%BF%92+%E5%85%A5%E5%87%BA%E5%8A%9B
で、コンパイルしてみる。
先ほど作ったtest.batファイルをダブルクリックするとa.exeがはき出され、
a.exeをダブルクリックするとoutput.txtがはき出される。(下記画像)
ちなみに
・libgcc_s_seh-1.dll
・libquadmath-0.dll
・libwinpthread-1.dll
の3つはフォルダ内に入れっぱなし。
理由は、素人の素朴な印象として
exeファイルって環境変数でPATHを設定しないと使えないなんて
変だな、って思ったから。
(便利なプログラム作っても、環境変数を設定しないといけないとコピペで渡せないよね。
まあ、PATHを指定したa.batを一緒に入れておけばいいわけだが。)
で、はき出されたoutput.txtの中身を開くとこうなっている。
なんか、、
1文字目になぞのスペースがある、、
どうしてだろう。
'hello, world!'と打ったから、
1文字目にスペースは入れてないのに!
そんなことが気になるのはA型だからなのか、それとも糖質制限してイライラしているのか。
で、色々調べてみる。
どうやら、書式を指定しないと1文字目にスペースが入るようだ。
なので文字列としての’(a)’をwriteのカッコ内に入力してみる。
で、コンパイルして、実行して、はき出されたテキストファイルを見てみる。
やった!できてる。(下記画像)
1文字目にスペースなしになってる!
よしよし。
今回はここまでだな。
まず初めてコンパイル、実行したとき、
いちいちコマンドプロンプトに打ち込むのが面倒だった。
なので下記の画像のBATファイルを作成した。
このBATファイルをダブルクリックすれば
test.f90がコンパイルされ、
a.exeがフォルダ内に出力されるようなった。(下記画像)
ついでに、
a.exeをコマンドプロンプトから実行する
BATファイルを作成してみた。
で、このBATファイルをダブルクリックすると、
コマンドプロンプトが立上り、
Hello World!の文字が出た!
よしよし。
じゃあ、BATファイルを介さず、a.exeをそのままダブルクリックしてもいいかと思ったが、
ダブルクリックするとエラーで実行されない。(下記画像)
きちんとコマンドプロンプト上で実行すると実行できた。
これはコマンドプロンプト上でPASSを指定しているからである。
(環境変数でPASSを登録しても実行できる)
でもexeファイルをダブルクリックして実行できないなんて変だ、と思い
検索して調べると下記のサイトが見つかった。
>プログラミングやってみる!
>.dllが見つかりません。
>http://proprog583.blog.fc2.com/blog-entry-3.html
どうやら
C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin
のなかにある
・libgcc_s_seh-1.dll
・libquadmath-0.dll
・libwinpthread-1.dll
の3つがa.exeと同じフォルダにあると動くようなので
コピーしてみる。
でダブルクリックしたところ、上記サイトにあるようにエラーなく動いたが、
コマンドプロンプトが出ない(一瞬で消えている?)ので
exeファイルをダブルクリックだとHello World!の文字が見れず
プログラムが本当に想定通りに動いたか確かめれない。
なので、、、
実行されるとtextファイルをはき出すプログラムを書きたい。
(そうすればきちんと実行されたか分かるので。)
で、下記のサイトを参考にしてプログラムを書いてみた。(下記画像)
>nag
>Fortran 入門
>15 ファイル操作
>https://www.nag-j.co.jp/fortran/FI_15.html
writeのカッコの中の意味は以下のサイトを参考にした。
>[itbase2018]Fortran 実習 入出力
>https://itpass.scitec.kobe-u.ac.jp/hiki/hiki.cgi?%5Bitbase2018%5DFortran+%E5%AE%9F%E7%BF%92+%E5%85%A5%E5%87%BA%E5%8A%9B
で、コンパイルしてみる。
先ほど作ったtest.batファイルをダブルクリックするとa.exeがはき出され、
a.exeをダブルクリックするとoutput.txtがはき出される。(下記画像)
ちなみに
・libgcc_s_seh-1.dll
・libquadmath-0.dll
・libwinpthread-1.dll
の3つはフォルダ内に入れっぱなし。
理由は、素人の素朴な印象として
exeファイルって環境変数でPATHを設定しないと使えないなんて
変だな、って思ったから。
(便利なプログラム作っても、環境変数を設定しないといけないとコピペで渡せないよね。
まあ、PATHを指定したa.batを一緒に入れておけばいいわけだが。)
で、はき出されたoutput.txtの中身を開くとこうなっている。
なんか、、
1文字目になぞのスペースがある、、
どうしてだろう。
'hello, world!'と打ったから、
1文字目にスペースは入れてないのに!
そんなことが気になるのはA型だからなのか、それとも糖質制限してイライラしているのか。
で、色々調べてみる。
どうやら、書式を指定しないと1文字目にスペースが入るようだ。
なので文字列としての’(a)’をwriteのカッコ内に入力してみる。
で、コンパイルして、実行して、はき出されたテキストファイルを見てみる。
やった!できてる。(下記画像)
1文字目にスペースなしになってる!
よしよし。
今回はここまでだな。
2020年12月23日
windows10でfortran
久しぶりに記事を書いてみることにした。
ここ2年間とても忙しかったが、この年末は落ち着いている。
怪我のせいでしばらく運動はできないし、
コロナのせいで外出もあまりできない(気乗りがしない)。
ふと昔の専門書を読んでいる。(スペクトル解析の本)
大学院の時に勧められたとても良い本らしい。
ただ、自分は大学院の時は読んでも理解できなかった。(優秀ではなかったのだ)
大学院の時が23〜24歳、今はもう37歳のおじさんだ。
一応、専門分野の職に就いているが、
その本の内容は使うことはない。
ただ、
・理解出来たらワンランク上の目線で仕事ができるかもしれない、、
・今の自分なら大学院の時より理解できるのでは、、、
・これらの内容が理解できる大学の先生はかっこよかったな、、
などという根拠のない好奇心で当時の専門書を読んでいる。
古いので巻末に載っているプログラムがfortranで書かれている。
大学の時は世間がC言語やC++を使っているときに
2006年〜2007年当時、自分の周りの研究室の大学院生はなぜかfortranを使っていた。
自分はC++は使ったことあるがfortranは使ったことない。
会社に入ってからは仕事でexcelを多用する関係で、新入社員の時からvbaを少しずつ覚えた。
そしてあれから13年経った今、世間ではpythonがはやっている。
(自分は遊びでいじったことがある程度である)
そんな時代にfortranを覚えても無駄なのだが、
あえて無駄なことをしてみる。
このwindows10、64bitのsurface proで
古い専門書の巻末に載っているfortranのプログラムを回してみたい。
(ここでワンピースのポーネグリフを連想した自分は気持ち悪いと思う。
考古学者の気持ちはこんな感じなのだろうか。)
まず、googleで「fortran free windows10」で検索してみる。
すると、下記のサイトが引っかかる。
>TIM Labs タイムインターメディア技術者ブログ
>Windows10でFORTRANを動かさねばならない(上)
>http://labs.timedia.co.jp/2017/06/gnufortran.html
どうやらgfortranというものを使えばよいらしい。
今度は「gfortran windows10 64bit」で検索してみる。
すると、下記のサイトが引っかかる。
>あらきけいすけの雑記帳
>64bit の Windows10 上でフリーの fortran コンパイラを導入して、簡単なプログラムを作成する
>https://arakik10.hatenadiary.org/entry/20160101/p1
MinGW-w64というのをインストールするのが簡単らしい。
でインストールしてみる。
上記サイトにあるとおりに
インストールの際、versionは最新の8.1.0で、
Architectureはx86_64にした。
上記サイトに記載の通り、デスクトップにfortフォルダを作成して
mingw-w64.batのファイルをfortフォルダへ移動し、設定もした。
でmingw-w64.batを実行して表示されたコマンドプロンプトに「gfortran[enter]」と打ったが
以下の写真のようにエラーになる。
なんかおかしい。
もしかしてと思い、「gfortran」と打ってenterキーを押すとなんか動いた。(下記画像)
[enter]ってキーを打つことなのね。
そのまま上記サイトの通りに入力ファイルをメモ帳で作成する。(下記画像)
そして上記サイトの通りにコマンドプロンプトに「gfortran test.f90」と打ってみた。
おー、ちゃんとexeファイルが出力された。感動である。(下記画像)
そしてa.exeをダブルクリックしてみる。
なぜかエラー。(下記画像)
どうやらコマンドプロンプトで実行しないといけないようだ。
(パスを通せば行けるのだろうか?)
とりあえず、mingw-w64.batでコマンドプロンプトを立ち上げ、
「a.exe」と打ってみる。
「Hello world!」が表示された!
やったね。(下記画像)
なんかいちいちコマンドプロンプトを起動するのは面倒だ。
(入力ファイル名固定でバッチファイルを作ってしまったほうがよいのか?)
とりあえずfortranが使える環境ができた。
今日はここまでだ。
またいろいろやっていこう。
ここ2年間とても忙しかったが、この年末は落ち着いている。
怪我のせいでしばらく運動はできないし、
コロナのせいで外出もあまりできない(気乗りがしない)。
ふと昔の専門書を読んでいる。(スペクトル解析の本)
大学院の時に勧められたとても良い本らしい。
ただ、自分は大学院の時は読んでも理解できなかった。(優秀ではなかったのだ)
大学院の時が23〜24歳、今はもう37歳のおじさんだ。
一応、専門分野の職に就いているが、
その本の内容は使うことはない。
ただ、
・理解出来たらワンランク上の目線で仕事ができるかもしれない、、
・今の自分なら大学院の時より理解できるのでは、、、
・これらの内容が理解できる大学の先生はかっこよかったな、、
などという根拠のない好奇心で当時の専門書を読んでいる。
古いので巻末に載っているプログラムがfortranで書かれている。
大学の時は世間がC言語やC++を使っているときに
2006年〜2007年当時、自分の周りの研究室の大学院生はなぜかfortranを使っていた。
自分はC++は使ったことあるがfortranは使ったことない。
会社に入ってからは仕事でexcelを多用する関係で、新入社員の時からvbaを少しずつ覚えた。
そしてあれから13年経った今、世間ではpythonがはやっている。
(自分は遊びでいじったことがある程度である)
そんな時代にfortranを覚えても無駄なのだが、
あえて無駄なことをしてみる。
このwindows10、64bitのsurface proで
古い専門書の巻末に載っているfortranのプログラムを回してみたい。
(ここでワンピースのポーネグリフを連想した自分は気持ち悪いと思う。
考古学者の気持ちはこんな感じなのだろうか。)
まず、googleで「fortran free windows10」で検索してみる。
すると、下記のサイトが引っかかる。
>TIM Labs タイムインターメディア技術者ブログ
>Windows10でFORTRANを動かさねばならない(上)
>http://labs.timedia.co.jp/2017/06/gnufortran.html
どうやらgfortranというものを使えばよいらしい。
今度は「gfortran windows10 64bit」で検索してみる。
すると、下記のサイトが引っかかる。
>あらきけいすけの雑記帳
>64bit の Windows10 上でフリーの fortran コンパイラを導入して、簡単なプログラムを作成する
>https://arakik10.hatenadiary.org/entry/20160101/p1
MinGW-w64というのをインストールするのが簡単らしい。
でインストールしてみる。
上記サイトにあるとおりに
インストールの際、versionは最新の8.1.0で、
Architectureはx86_64にした。
上記サイトに記載の通り、デスクトップにfortフォルダを作成して
mingw-w64.batのファイルをfortフォルダへ移動し、設定もした。
でmingw-w64.batを実行して表示されたコマンドプロンプトに「gfortran[enter]」と打ったが
以下の写真のようにエラーになる。
なんかおかしい。
もしかしてと思い、「gfortran」と打ってenterキーを押すとなんか動いた。(下記画像)
[enter]ってキーを打つことなのね。
そのまま上記サイトの通りに入力ファイルをメモ帳で作成する。(下記画像)
そして上記サイトの通りにコマンドプロンプトに「gfortran test.f90」と打ってみた。
おー、ちゃんとexeファイルが出力された。感動である。(下記画像)
そしてa.exeをダブルクリックしてみる。
なぜかエラー。(下記画像)
どうやらコマンドプロンプトで実行しないといけないようだ。
(パスを通せば行けるのだろうか?)
とりあえず、mingw-w64.batでコマンドプロンプトを立ち上げ、
「a.exe」と打ってみる。
「Hello world!」が表示された!
やったね。(下記画像)
なんかいちいちコマンドプロンプトを起動するのは面倒だ。
(入力ファイル名固定でバッチファイルを作ってしまったほうがよいのか?)
とりあえずfortranが使える環境ができた。
今日はここまでだ。
またいろいろやっていこう。
2017年01月14日
pythonで「Internet Explorer_Server」クラスの子ウインドウ内のボタンを自動クリック
前回少し書いたが
pywinautoでソフトを自動操作して
ボタンを押していく中で、
「Internet Explorer_Server」というクラスの子ウインドウ
の中にログインボタンがあるのだが、
子ウインドウに対してcontrol_identifiers
を使ってもボタンの情報が見当たらない。
どうやらHTMLのページがソフトのウインドウの中に埋め込まれているようだ。
そのHTMLの情報を取得しないと
ログインボタンは押せないと考えた。
で前回の記事では
下記の本を参考にVBAでinternet explorerの操作を勉強した。
>Excel VBAでIEを思いのままに操作できるプログラミング術 Excel
どうやらHTMLデータ全体であるHTMLドキュメントなるものを取得して
その中の色んなプロパティのうちの一つを指定することで
必要なデータを見れるようだ。
「DOM(Document Object Model)」という概念らしい。
他ソフトの中に組み込まれている「Internet Explorer_Server」クラスの子ウインドウから
HTMLドキュメントを取得し、ボタンの情報を取得しクリックするのが目標だ。
HTMLドキュメントを取得するところまでは
前回記事にも記載した下記のサイトが参考になる。
>Python : Automating Internet Explorer_Server
>http://stackoverflow.com/questions/35778771/python-automating-internet-explorer-server
HTMLドキュメントにどんなプロパティがあるかは
下記のサイトを見つけて知った。
>IHTMLDocument2 Object
>https://msdn.microsoft.com/ja-jp/library/office/aa219325(v=office.11).aspx
activeElement PropertyからvlinkColor Propertyまで
たくさんのプロパティがある。
取得したHTMLドキュメントを変数docに格納したとすると
print(doc.URL)でURLを確認できる。
※ちなみに全部print()で確認したが
fileCreatedDate Property〜parentWindow Property
はエラーで表示されなかった。
HTMLのテキストを見たかったが、
見れるプロパティは見つからなかった。おかしいなあ。
次の日、再度各プロパティ名を使ってgoogle検索してみると
下記のサイトを見つけた。
>DOM(Document Object Model)のouterTextとinnerTextの違いについて
>http://www.vba-ie.net/element/outer-innertext.html
「AllプロパティはHTMLドキュメント内の全ての要素オブジェクトを返すプロパティ」
と書いてある。
この中に絶対HTMLのテキスト情報が含まれているはずだ、、、
(でもprint(doc.all)だと[object]としか表示されない、、)
と思って読み進めていくと、
「objIE.document.All(添え字).プロパティ/メソッド」とか
「objIE.document.All(添え字).innerHTML」
と書いてある。
どうやらプロパティ名だけで完結するものと、
プロパティ名だけだとまだ複数の情報をもったオブジェクト扱いになっていて、
その後ろにさらにプロパティ名みたいなものを「.」を付けて指定しないと
いけないものがあるようだ。
きっとHTMLドキュメント内に複数のinnerHTMLなるものが
入っていて、1つ目を見るなら
print(doc.all(0).innerHTML)
で見れるはずである、、、、見れた!
ついに、、ついにHTMLのテキストを
pythonで他ソフトの「Internet Explorer_Server」クラスの子ウインドウから
取得したぞーーー
そして中には「ログイン」ボタンについても書いてある。
よし。
※ちなみにこれらのプロパティ操作で思ったことがある。
ん、、、、
パスワードのテキストボックス内の
●●●●●●
と非表示になっているパスワードまで取得できてしまうぞ。
僕はなんて深淵まで来てしまったんだ、、、、
(webの仕事をしている人からしたら超ド素人が表層の表層をこちょこちょ
遊んでいるだけなのだろうが、、、、)
少しびっくり。
これからはできるだけログイン画面のパスワードを
「次回から自動」とか「PCに保存」にしないようにしょう。
話をもとにもどして
たしかVBAの本にはDOMでは取得したオブジェクトは
複数のタグで構成されていて、
.タグ(タグ番号)でタグを取得し、
.タグ(タグ番号).プロパティで名前や値を取得する、、、ようなこと
があった気がする。
innerHTMLで「ログイン」ボタンは
INPUTというタグに挟まれていた。
google検索してみると下記のサイトを見つけた。
>ken3memo (三流君) Set objINPUT = objIE.Document.all.tags("INPUT") で
>タグを集めてみたものの...使いにくかった(笑)
>http://d.hatena.ne.jp/ken3memo/20101003/1286108874
「Set objINPUT = objIE.Document.all.tags("INPUT")」とか
「objINPUT(0).Value = "0000"」とか書いてある。
ということは
print(doc.all.tags(u"INPUT")(0).Value)
print(doc.all.tags(u"INPUT")(1).Value)
print(doc.all.tags(u"INPUT")(2).Value)
とすればよいのではないか。
ビンゴだ!
doc.all.tags(u"INPUT")(2).Valueで「ログイン」という文字列を
取得した。
ということは最初の参考サイトに戻って
doc.all.tags(u"INPUT")(2).click()
でログインボタンを押せるのでは、、、
押せたーーーー!!(感動)
結論としては、ほんとただボタン1個押すのに
どんだけ労力かけてんだよ、、と思うが、
パズルゲームのようで嫌いじゃない。
パソコンを使ってプログラムを書くという
常に頭に負荷をかけて解けなかったものを解きたい、、
という欲求みたいなものが少しあるのだろう。
数独が趣味の人と似ているのだろう。
そして一度解いたものは関数化して忘れる。
次から何も考えなくても一瞬。
下記は今回のソースコードである。
(パスやソフト名やクラス名、タイトルなどは伏せるため
適当な文字列にしてあるのであしからず)
海外のpythonユーザー等で「Internet Explorer_Server」クラスに
苦労している人もいるようなので参考になればいいなあ、と思います。
ちなみに次の課題としては
ログイン後のウインドウの中に
「Internet Explorer_Server」クラスの子ウインドウがあって
その中の「リスト」を操作したい。
リストにチェックを入れて、次に進むボタンを押す、
ということをやりたい。
リストのタグを探して何かするのだろう。
また時間のあるときに頭の体操として頑張ろう。
pywinautoでソフトを自動操作して
ボタンを押していく中で、
「Internet Explorer_Server」というクラスの子ウインドウ
の中にログインボタンがあるのだが、
子ウインドウに対してcontrol_identifiers
を使ってもボタンの情報が見当たらない。
どうやらHTMLのページがソフトのウインドウの中に埋め込まれているようだ。
そのHTMLの情報を取得しないと
ログインボタンは押せないと考えた。
で前回の記事では
下記の本を参考にVBAでinternet explorerの操作を勉強した。
>Excel VBAでIEを思いのままに操作できるプログラミング術 Excel
どうやらHTMLデータ全体であるHTMLドキュメントなるものを取得して
その中の色んなプロパティのうちの一つを指定することで
必要なデータを見れるようだ。
「DOM(Document Object Model)」という概念らしい。
他ソフトの中に組み込まれている「Internet Explorer_Server」クラスの子ウインドウから
HTMLドキュメントを取得し、ボタンの情報を取得しクリックするのが目標だ。
HTMLドキュメントを取得するところまでは
前回記事にも記載した下記のサイトが参考になる。
>Python : Automating Internet Explorer_Server
>http://stackoverflow.com/questions/35778771/python-automating-internet-explorer-server
HTMLドキュメントにどんなプロパティがあるかは
下記のサイトを見つけて知った。
>IHTMLDocument2 Object
>https://msdn.microsoft.com/ja-jp/library/office/aa219325(v=office.11).aspx
activeElement PropertyからvlinkColor Propertyまで
たくさんのプロパティがある。
取得したHTMLドキュメントを変数docに格納したとすると
print(doc.URL)でURLを確認できる。
※ちなみに全部print()で確認したが
fileCreatedDate Property〜parentWindow Property
はエラーで表示されなかった。
HTMLのテキストを見たかったが、
見れるプロパティは見つからなかった。おかしいなあ。
次の日、再度各プロパティ名を使ってgoogle検索してみると
下記のサイトを見つけた。
>DOM(Document Object Model)のouterTextとinnerTextの違いについて
>http://www.vba-ie.net/element/outer-innertext.html
「AllプロパティはHTMLドキュメント内の全ての要素オブジェクトを返すプロパティ」
と書いてある。
この中に絶対HTMLのテキスト情報が含まれているはずだ、、、
(でもprint(doc.all)だと[object]としか表示されない、、)
と思って読み進めていくと、
「objIE.document.All(添え字).プロパティ/メソッド」とか
「objIE.document.All(添え字).innerHTML」
と書いてある。
どうやらプロパティ名だけで完結するものと、
プロパティ名だけだとまだ複数の情報をもったオブジェクト扱いになっていて、
その後ろにさらにプロパティ名みたいなものを「.」を付けて指定しないと
いけないものがあるようだ。
きっとHTMLドキュメント内に複数のinnerHTMLなるものが
入っていて、1つ目を見るなら
print(doc.all(0).innerHTML)
で見れるはずである、、、、見れた!
ついに、、ついにHTMLのテキストを
pythonで他ソフトの「Internet Explorer_Server」クラスの子ウインドウから
取得したぞーーー
そして中には「ログイン」ボタンについても書いてある。
よし。
※ちなみにこれらのプロパティ操作で思ったことがある。
ん、、、、
パスワードのテキストボックス内の
●●●●●●
と非表示になっているパスワードまで取得できてしまうぞ。
僕はなんて深淵まで来てしまったんだ、、、、
(webの仕事をしている人からしたら超ド素人が表層の表層をこちょこちょ
遊んでいるだけなのだろうが、、、、)
少しびっくり。
これからはできるだけログイン画面のパスワードを
「次回から自動」とか「PCに保存」にしないようにしょう。
話をもとにもどして
たしかVBAの本にはDOMでは取得したオブジェクトは
複数のタグで構成されていて、
.タグ(タグ番号)でタグを取得し、
.タグ(タグ番号).プロパティで名前や値を取得する、、、ようなこと
があった気がする。
innerHTMLで「ログイン」ボタンは
INPUTというタグに挟まれていた。
google検索してみると下記のサイトを見つけた。
>ken3memo (三流君) Set objINPUT = objIE.Document.all.tags("INPUT") で
>タグを集めてみたものの...使いにくかった(笑)
>http://d.hatena.ne.jp/ken3memo/20101003/1286108874
「Set objINPUT = objIE.Document.all.tags("INPUT")」とか
「objINPUT(0).Value = "0000"」とか書いてある。
ということは
print(doc.all.tags(u"INPUT")(0).Value)
print(doc.all.tags(u"INPUT")(1).Value)
print(doc.all.tags(u"INPUT")(2).Value)
とすればよいのではないか。
ビンゴだ!
doc.all.tags(u"INPUT")(2).Valueで「ログイン」という文字列を
取得した。
ということは最初の参考サイトに戻って
doc.all.tags(u"INPUT")(2).click()
でログインボタンを押せるのでは、、、
押せたーーーー!!(感動)
結論としては、ほんとただボタン1個押すのに
どんだけ労力かけてんだよ、、と思うが、
パズルゲームのようで嫌いじゃない。
パソコンを使ってプログラムを書くという
常に頭に負荷をかけて解けなかったものを解きたい、、
という欲求みたいなものが少しあるのだろう。
数独が趣味の人と似ているのだろう。
そして一度解いたものは関数化して忘れる。
次から何も考えなくても一瞬。
下記は今回のソースコードである。
(パスやソフト名やクラス名、タイトルなどは伏せるため
適当な文字列にしてあるのであしからず)
海外のpythonユーザー等で「Internet Explorer_Server」クラスに
苦労している人もいるようなので参考になればいいなあ、と思います。
ちなみに次の課題としては
ログイン後のウインドウの中に
「Internet Explorer_Server」クラスの子ウインドウがあって
その中の「リスト」を操作したい。
リストにチェックを入れて、次に進むボタンを押す、
ということをやりたい。
リストのタグを探して何かするのだろう。
また時間のあるときに頭の体操として頑張ろう。
2016年12月24日
VBAでInternet Explorer自動操作の勉強
pythonのpywinautoでウインドウのユーザーインターフェースを
自動操作しようと思ってちょこちょこプログラミングの勉強をしていると
control_identifiersを実行して子ウインドウのクラスやらタイトルやらを
見たときに、「Internet Explorer_Server」なるクラスを発見する。
その子ウインドウの中に表やらボタンがあっても
その情報が取得できない。。。
そこでボタンの場合は
下記のような感じで
Typekeysでタブを一定回数送信して
Enterを送信することで
ボタンを押すことができた。
for i in range(0,19):
dialog1.TypeKeys("{TAB 1}")
time.sleep(0.01)
for i in range(0,2):
dialog1.TypeKeys("{ENTER}")
ただ、子ウインドウの中に表があったときは
お手上げである。
タブで行けないところは何もできない。
下記のサイトを参考にすると
その子ウインドウのURLまでは取得できる。
本当にInternet Explorerの子ウインドウ的なものらしい。
ただその先は何もできない。
>Python : Automating Internet Explorer_Server
>http://stackoverflow.com/questions/35778771/python-automating-internet-explorer-server
ということで
結果、あきらめた。
ただ、、、
VBAならできるのではないかと
思う。
こんな本もあることだし。
>Excel VBAでIEを思いのままに操作できるプログラミング術 Excel
VBAでできるようになったら
pythonに還元すればよい。
今は久しぶりにVBAをやろう。
で書いてみたのはこんな感じ。
yahooで日本語のキーワード複数で検索を
VBAで行う。
日本語のキーワードは
URLエンコードが必要である。
UTF-8に変換するために、
下記のサイトを参考にした。
>参考サイト:VBでURL エンコード
>http://www.geocities.co.jp/SilkRoad/4511/vb/sample/ue_utf8.txt
下記のように
エクセルシートの
A1〜A10にキーワードを
打って検索ボタンを押せばよいよう
マクロ登録しておく。
※最近見ていたドラマ「逃げ恥」が
最終回で視聴率20%超えを果たした
ことに敬意を表して、検索キーワードは
写真のような感じ。
ボタンを押すと
下記のように検索結果が表示される。
ほんとは起動済のinternet explorerに接続したい。
最終的にはInternet Explorer_Serverの自動操作へのヒントにしたいから。
さらに先の先のことを妄想すると
ほんとはgoogleを自動操作したいところである。
chromeを自動操作したいところである。
会社がそうだから。
ただ、まずは多少違っても実践が大事。
追々できるようになろう。