intel fortranを利用する

以下記事の二番煎じになってしまうのですが、手順に従って intel fortran が使えるようになりましたという話です。環境は Debian11 bullseye です。WSLでも出来ました。ただしインストールする際に数十GBのディスク容量が必要になるので注意してください。ifort はgfortran に比べてやっぱり速いですね。
qiita.com
aquabreath.jp

findで検索した結果を整形する(gawk -F/ '{print $NF}')

先月くらいに下書き保存していた記事を公開していなかったので公開しますかね。

$ find ./ -mtime -3 -name "*.pdf" | sort
./202302141554.pdf
./202302150342.pdf
./202302151540.pdf
./202302160357.pdf
./202302161544.pdf
./202302170340.pdf
./kaisetsu_tanki_latest.pdf

find の結果に./が残ってしまうので、これを gawk を用いて処理します。-F//を区切り文字とするオプション、'{print $NF}'で最後のフィールドを示すため、この場合、/で区切られた末尾が返ってきます。

$ find ./ -mtime -3 -name "*.pdf" | gawk -F/ '{print $NF}' | sort
202302141554.pdf
202302150342.pdf
202302151540.pdf
202302160357.pdf
202302161544.pdf
202302170340.pdf
kaisetsu_tanki_latest.pdf

shinya131-note.hatenablog.jp

加入してから2年も経過したのかいな

2年ほど前にこんな記事を書いておりました。はてなブログProに加入し課金した分、ブログを継続していきますと宣言した回だったわけですが。
matsubi0526.hatenablog.com
実際のところは投稿頻度は微妙な感じで、投稿の方針もふらふらしており「なんだかなあ」とげんなりしております。なんで昔の記事に気付いたかというと、「はてなブログProが自動更新されました」というメールが届いたからで、「あーそういえば課金していたなあ」と思い出したわけです。
ということで、今後どういう記事を書いていくのかはまだはっきりと決めたわけではないですが、ちょくちょく頑張って書いていくようにしたいと思います。

np.meshgrid と ndarray.reshape の挙動

ちょっとしたことから挙動を確かめる必要があったので、簡単なコードで試してみた。 以下ではランダムな1次元配列 x, y を用意し、np.meshgrid で2次元配列にする。それを一旦 flatten というか reshape(nx*ny) で 1次元配列にしたあと、再び reshape(ny, nx) で元に戻るかどうかを検証した。np.allclose は 2つの配列のすべての要素が近い(許容範囲)か判定する。

$ ipython3
Python 3.9.2 (default, Feb 28 2021, 17:03:44)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.20.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import numpy as np

In [2]: nx = 10; ny = 20

In [3]: x = np.random.rand(nx)

In [4]: y = np.random.rand(ny)

In [5]: xx, yy = np.meshgrid(x,y)

In [6]: xx.shape
Out[6]: (20, 10)

In [7]: xx2 = xx.reshape(nx*ny).reshape(ny,nx)

In [8]: np.allclose(xx,xx2)
Out[8]: True

(追記)要素が等しいかどうかを判定するには np.array_equal というのもあるようだ。この場合でも、True が返ってきた。

GNOME Shellのウィンドウに「最大化」「最小化」ボタンを追加する

以下リンク先に書かれている内容の再掲になるので、情報としては新規性はありません。

GNOME Shellに「最大化・最小化」のボタンがないので、表示させるにはどうしたらいいか、という内容です。上記リンク先に書かれているように、ターミナルで以下のように入力するだけでOKです。

gsettings set org.gnome.desktop.wm.preferences button-layout 'appmenu:minimize,maximize,close'

以下はターミナルの例ですが、ターミナル右上の部分に、最小化と最大化のボタンが表示されるようになっています。

学コン7月号大問4(その1)

誘導付きで極限を求める問題。はさみうちの原理で求める(4)はうまく誘導に乗れずに解けなかった。(4)の解説は次回以降にするとして、今回はまず(2)の極限を解説にしたがって復習することにしよう。求める極限  \alphaは次である。
\begin{align}
\alpha = \lim_{n \rightarrow \infty} \left( \frac{a^{\frac{1}{n}}+b^{\frac{1}{n}}}{2} \right)^{n}
\end{align}本問には誘導が付いており、関数 f(x) = \log{\left( a^{x}+b^{x} \right)}微分を求めよとの小問があるが、これは合成関数の微分により、
\begin{align}
f^{\prime}(x) = \frac{a^{x} \log{a} + b^{x} \log{b}}{a^{x}+b^{x}}
\end{align}と得られる。さて、問題の極限を求めていくわけだが、
\begin{align}
\lim_{n \rightarrow \infty} \log{\left( \frac{a^{\frac{1}{n}}+b^{\frac{1}{n}}}{2} \right)^{n}} = \lim_{n \rightarrow \infty} n \log{\frac{a^{\frac{1}{n}}+b^{\frac{1}{n}}}{2}}
\end{align}を求めることを考える。
ここで、 \displaystyle \lim_{x \rightarrow 0}  \frac{1}{x} \log{\dfrac{a^{x}+b^{x}}{2}} = \alphaならば、 \displaystyle \lim_{n \rightarrow \infty}  n \log{\dfrac{a^{\frac{1}{n}}+b^{\frac{1}{n}}}{2}} = \alpha であるので、
\begin{align}
\lim_{x \rightarrow 0} \frac{1}{x} \log{\dfrac{a^{x}+b^{x}}{2}}
&= \lim_{x \rightarrow 0} \frac{1}{x} \left\{
\log{ \left( a^{x} +b^{x} \right)} - \log{2} \right\} \\
&= \lim_{x \rightarrow 0} \frac{f(x)-f(0)}{x} \\
&= f^{\prime}(0) \\
&= \frac{\log{a}+\log{b}}{2} = \log{\sqrt{ab}}
\end{align}よって、 \displaystyle \lim_{n \rightarrow \infty}  n \log{\dfrac{a^{\frac{1}{n}}+b^{\frac{1}{n}}}{2}} = \log{\sqrt{ab}} が得られたので、
\begin{align}
\lim_{n \rightarrow \infty} \left( \frac{a^{\frac{1}{n}}+b^{\frac{1}{n}}}{2} \right)^{n} = \sqrt{ab}
\end{align}となる。解説を見ればなるほどと分かってしまうものだが、数学の問題を解くときに大事なのは、どういう手法で最終的な解を導き出すかを思いつけるかどうかだと思う。

学コン

月刊大学への数学の「学コン」に毎月挑戦しています。昨年の2月号くらいから継続して応募しており、基本的にはAコースで申し込んでいましたが、今年の4月号では初めてBコースで応募しました。しかし、その後は答案を作るのに十分な時間が取れなくなったので、再びAコースに逆戻り。加えて以前はTeXで一度答案の下書きを作ってから手書きの清書をしていました(このときにケアレスミスはだいぶ撲滅させた)が、TeXで答案書く余裕もないので、一発本番で計算ノートから清書するせいか、ケアレスミスによる減点もしばしば。高校数学の範囲なんだから解けるのが当たり前だと思っているのですが、世間的にはそうでもない?

gnuplotで背景に色を付ける

時系列データの品質管理をするときに特定の範囲内に収まっているかどうかを視覚的に分かりやすくできないかと思って調べたときのメモ。実際には別の人が実装してくださったので、ここで紹介する方法は実行されなかったわけだが、サンプルとしてスクリプトを残しておく。以下のスクリプトをたとえば sample.plt として保存する。

set multiplot layout 3,1
set sample 1000
set xrange [-10:10]
set yrange [-2:2]
set title "test of gnuplot script"

# --- Figure.1 --- #
set object 1 rect from -5,-0.5 to 5,0.5 back fillcolor rgb 'green' fillstyle solid 0.3 noborder
plot sin(x) lt rgb 'red'

# --- Figure.2 --- #
set object 1 rect from graph 0, first -0.5 to graph 1, first 0.5 back fillcolor rgb 'green' fillstyle solid 0.3 noborder
plot cos(x) lt rgb 'blue'

# --- Figure.3 --- #
set object 1 rect from -5,-2.5 to 5,2.5 back fillcolor rgb 'green' fillstyle solid 0.3 noborder
plot sin(5*x)+sin(x) lt rgb 'black'
unset multiplot
pause -1

ターミナル上で、

$ gnuplot sample.plt

として実行してもらえれば、以下の画像のような結果が得られる。

なお、相対座標 (graph x, graph y) と絶対座標 (first x, first y) は混在して表記することができるので、そのような例も記載している。x/y軸の最大、最小がわからないときに端まで塗りつぶす際に使えるかと思う。Figure. 3の例では、set yrange [-2:2] としている中で矩形の領域指定をはみ出した場合でも、枠内にきちんと収まることを確認している。なお、実行環境(gnuplotのバージョン)は以下のとおり。

$ gnuplot -V
gnuplot 5.2 patchlevel 6

コーディングルール

可読性があって汎用性の高いコーディングってどうやったらできるんでしょうね。結構、変数を定義するところとか難しいと思うんですよね。あとは関数というか Fortran で言うところの subroutine の使いどころとかね。RubyPython といったスクリプト言語でのクラスの使い方とかまだまだ不勉強な部分がたくさんあるので、勉強しないといけないと思いつつ、手が付けられていないのが現状です。時間はないわけではないはずなんだけどなあ。

PythonでGSM予報値を読む(降水量の注意点)

つい先日、MSM予報値の降水量を読んだときに、FTに関する注意点を述べました。
matsubi0526.hatenablog.com
今日職場で別のデータを見ていたときにちょっと挙動が引っかかったので、GSMの降水量を見てみたら「やっぱりか」って挙動を示したので、ここで紹介しておきます。インタラクティブに操作するために ipython3 で次のコマンドを打つと、

import pygrib
f = 'Z__C_RJTD_20220719000000_GSM_GPV_Rjp_Lsurf_FD0000-0312_grib2.bin'
grbs = pygrib.open(f)
grb = grbs.select(parameterName='Total precipitation',forecastTime=0)

最後の grb を表示すると、なんと list型で返ってきて、

[21:Total precipitation:kg m-2 (accum):regular_ll:surface:level 0:fcst time 0-1 hrs (accum):from 202207190000,
 33:Total precipitation:kg m-2 (accum):regular_ll:surface:level 0:fcst time 0-2 hrs (accum):from 202207190000,
 45:Total precipitation:kg m-2 (accum):regular_ll:surface:level 0:fcst time 0-3 hrs (accum):from 202207190000,
・・・中略・・・
 993:Total precipitation:kg m-2 (accum):regular_ll:surface:level 0:fcst time 0-82 hrs (accum):from 202207190000,
 1005:Total precipitation:kg m-2 (accum):regular_ll:surface:level 0:fcst time 0-83 hrs (accum):from 202207190000,
 1017:Total precipitation:kg m-2 (accum):regular_ll:surface:level 0:fcst time 0-84 hrs (accum):from 202207190000]

という結果になってしまいます。初期時刻から ft までの積算降水量が知りたければ、このリストの ft-1 番目を指定すればいいのか。つまり、FT=6(6時間降水量)が知りたければ grb[5] とすればよいと。分かってしまえばなんてことはないのかもしれないが、嵌りそうな予感がする挙動なのでした。もっとうまいやり方ありそうな気もするけど。GRIB2形式のデータをPythonで読むときに、そもそも pygrib を使わないとか、ね。wgrib2 で NetCDF に変換したほうが早い?

顕著な大雨に関する気象情報(7/18 15:09長崎県)

長崎県で「顕著な大雨に関する気象情報」が出たので、7/18 09時から18時(日本時間)における降水のアニメーションを作成してみました。現在の気象庁のHPからでは画像形式で取得するのは難しいのですが、軽量版のほうだと、なんとか画像取得でき、地図や海岸線を重ねることで作成することができました。

7/18 09時から18時までの降水のアニメーション

PythonでMSM予報値を読む(降水量の注意点)

pygribというライブラリを用いて、GRIB2形式のMSM予報値を読んでみようという話です。本当はmatplotlibやbasemapを用いて描画するところを先に解説しようと思っていたのですが、記事にするにはちょっとまだ未完成なところがあるので公開できていません。で、今回、その記事を作成するにあたり降水量を描画した結果を載せようかと思っていたのですが、pygribで読むときにちょっと癖があることがわかりましたので、今回の記事を書きます。
配信資料に関する仕様を読んでいただくとわかりますが、GSM、LFMは降水量が初期時刻からの積算雨量でデータが格納されているのに対し、MSMではなぜか前1時間の降水量が格納されていることがわかりました。で、さらに、pygribで読むときに、通常、FT=12の降水量と言われると、FT=12における前1時間降水量(FT=11〜12における1時間降水量)を想像するのですが、以下のコードを実行すると分かるように、ft=12で指定すると、FT=12〜13における1時間降水量がどうやら返ってくるようです。これは要注意ですね。検証していませんが、GSMやLFMでも同様のことが起きるのかもしれません。

import pygrib
f = 'Z__C_RJTD_20220717000000_MSM_GPV_Rjp_Lsurf_FH00-15_grib2.bin'
ft = 12
grbs = pygrib.open(f)
grb = grbs.select(parameterName='Total precipitation',forecastTime=ft)[0]
print(grb)

上記のスクリプトを実行すると以下の結果が返ってきます。

165:Total precipitation:kg m-2 (accum):regular_ll:surface:level 0:fcst time 12-13 hrs (accum):from 202207170000

fcst time 12-13 hrs (accum) とメッセージが出ますので、FT=12〜13における1時間降水量を示しているようですね。
参考URL:

Debian11 な Let's Note (CF-SZ6) で画面輝度調整

 Debian11 bullseye を中古の Let’s Note にインストールして使っているのですが、輝度調整が Fnキーで出来ないことがここ半年ほどの悩みの種でした。今般その問題が解決できたので、メモしておくことにします。なお、本件の解決にあたっては Youhei SASAKI (@uwabami) / Twitter さんに助言いただきました。この場を借りて御礼申し上げます。

 まず自分の環境です。

  • OS: Debian11 bullseye
  • PC: Panasonic CF-SZ6(Let's Note)
  • GNOME3デスクトップ環境: GNOME 3.38.5

 ひとつ前の世代の Let's Note で輝度調整が同じく出来なかった方のブログを見つけました。この方は輝度調整が無事に出来るようになったようですが、自分の場合、同じようにやっても症状は改善しませんでした。自分の環境では、以下のようなコマンドを打つと輝度が変わるので、上記の投稿者と似たような症状ではあるのですけれども。

sudo echo 80 > /sys/class/backlight/intel_backlight/brightness

www.yukkuriikouze.com

 さて、助言をいただいてやったことは、/etc/modprobe.d/blacklist-local.conf というファイルを用意して、中身に blacklist panasonic_laptop とだけ書いた後、再起動しました。この時点で Fnキーで輝度調整が出来るようになりました。ただ、周囲の画面の明るさに応じて明るさが自動で変わるようになってしまいました。それを解消するために iio-sensor-proxy を私の場合パッケージごと削除しました。最初 disable にしようとしたのですが、自動で変わる症状が改善しませんでした。デバイスによっては画面回転とかに追従するそうなので便利なこともあるようですが、Let's Noteでは画面回転は必要ないので今回は削除の選択でよさそうです。
unix.stackexchange.com

Rubyで特定の時間刻みの配列を取得する

%Y%m%d%H%M形式の日付を与えて、開始日時と終了日時の間を特定の時間刻みで区切った配列を返すスクリプトRubyで書きました。while文は滅多に使わないのでちょっと新鮮です。今回は10分刻みを例として書いてみました。もちろん、5分刻みとかもできます。それも引数で与えられるようにしてやればよいのかもしれませんが、今はハードコーディングでご容赦。

require 'time'
module Define
  module_function
  def getlist(sdate,edate)
    dfmt = "%Y%m%d%H%M"
    st = Time.strptime(sdate,dfmt)
    et = Time.strptime(edate,dfmt)
    tt = st
    ary = Array.new
    ary.push(st.strftime(dfmt))
    while(tt < et) do
      tt = st+10*60
      ary.push(tt.strftime(dfmt))
      st = tt
    end
    return ary
  end
end
if __FILE__ == $0 then
  sdate = "202207132100"
  edate = "202207132200"
  tlist = Define::getlist(sdate,edate)
  for date in tlist
    puts date
  end
end

これを実行すると以下のように返ってきます。

$ ruby main.rb
202207132100
202207132110
202207132120
202207132130
202207132140
202207132150
202207132200

Rubyのバージョンは以下のとおり。

$ ruby -v
ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux-gnu]

Pythonでグラフを描く

 Pythonでグラフを描く練習です。TeXで数式を入れる方法も少しだけ勉強。題材は某メーリングリストに流れてきた問題で、実数  x に対して、 \cos{(\sin{x})} > \sin{(\cos{x})} を示せ、という問題。 -2\pi \le x \le 2\pi の範囲で描画しています。確かに不等式が成り立っているようですね。

f(x) = cos(sin x)-sin(cos x) のグラフ

 描画に使ったスクリプトは以下のとおりです。グラフを再現するのに使ってみてください。エラーが吐かれるようでしたら、エラーメッセージにしたがって、パッケージを追加するなりして対処してみてください。自分の場合は dvipng がないと言われたので、

sudo apt install -y dvipng

で追加しました。

(追記)
別の環境でこのスクリプトを動かしたところ、

! LaTeX Error: File `type1ec.sty' not found.

と言われてしまったので、パッケージを追加して対処しました。

sudo apt install -y cm-super

使用したスクリプト

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
rc('text', usetex=True)
x = np.linspace(-2*np.pi,2*np.pi,1000)
y = np.cos(np.sin(x))-np.sin(np.cos(x))
plt.ylim(0,2)
plt.xlabel(r'$x$')
plt.ylabel(r'$f(x)$')
plt.plot(x,y,'r',label=r'$f(x)=\cos{(\sin{x})}-\sin{(\cos{x})}$')
plt.legend(loc='upper right')
plt.title(r'$y = f(x) \;\;\; (-2\pi \le x \le 2\pi)$')
plt.savefig("test-2.png",dpi=300)
plt.close