Chromebook:gnuplot アップデートの試み(挫折中)

gnuplot の公式サイト経由で最新版の TAR ファイルをダウンロードした.

https://gnuplot.sourceforge.net/ReleaseNotes_6_0_2.html

それを Linux 用のディレクトリに移したあと,Linux のターミナルを開いて,うろ覚えの解凍コマンド

$ tar xvf gnuplot-6.0.2.tar.gz

で解凍する.それでできた gnuplot-6.0.2 フォルダ内に

$ cd gnuplot-6.0.2

と移り,

$ ./configure

と打つと,ターミナルに何やら経過がワーッと表示される.

 

次に make check や make install をしようとしたのだが,どうやら make コマンドがインストールされていないとのこと.

 

単にコマンドが入っているディレクトリにパスが通っていないだけという疑いがあるものの,覚えたての便利コマンド sudo apt install を試してみる.

 

> sudo apt install make

 

これで make がインストールされた.

 

それでもう一度 make install をしたのだが,なんとなくインストールが成功していないような気がする.

 

が,

$ gnuplot

と入れたら 6.0.2 が起動した.

 

だが,深刻な問題が一つ未解決のまま残された.

 

それは,sudo apt install で導入した古いバージョンの 5.4 では使えた Qt というグラフ表示用の gnuplot 用の terminal が 6.0.2 では

gnuplot> set terminal

というコマンドで表示される terminal 一覧に見当たらないことである.他の例えば x11 なども見当たらない.要するに Linux のターミナル画面とは別にグラフ表示用のウィンドウを開くタイプの terminal が 6.0.2 では使えない状態らしいのである.

 

公式サイトの解説を参考にして ./configure --with-qt も試してみたが全然ダメである.

 

そもそも make install 時のログの最後らへんを見ると qt no とか書いてある.

 

ログを少し遡ってみると,他のタイプの terminal を使えるようにするために C++コンパイルしようとしたけど C++ がこのシステムには見当たりません,みたいなエラーメッセージがあるようであった.

 

そこでまた sudo apt install で統合開発環境である GNU C コンパイラを入れる.

 

$ sudo apt install gcc

 

それは /usr/bin に入ったようだが,そこにはパスが通っていないらしいのでいったん自分で

$ export PATH=$PATH:/usr/bin

とパスをもともとのパスの末尾に追加する呪文を唱え,再チャレンジした.

 

が,まだ Qt は gnuplot 6.0.2 の set terminal で表示される一覧に出てこないままである.というか,何度か make install し直しているのだが,その一覧表は全く変化がないように見える.とりあえずお手上げである.

 

なお,./configure だったか make install だったかをしたときに,ログでどこかに新しくディレクトリを作ろうとしたら権限がなくてダメだった,みたいな報告が見受けられたので,

 

$ sudo make install

 

とか試してみているのだが,そもそも sudo コマンドの使い方として正しいのだろうか?

 

軽い気持ちであれこれ試みたのだが,らちがあかないので一旦撤退することにいたす.

105 分授業

立正大学では 1 コマの授業時間が 105 分だという話を小耳に挟んでびっくり仰天した.

今年度から授業時間を 1 コマ 90 分から 1 コマ 105 分へと変更したんだそうな.

 

私が教えに行っている大学では何年か前から 100 分授業へと切り替わった.90分でも長いと思うのに,それをさらに延長するというのが正直理解できないのだが,50分×2 という間隔で講義を組み立てるべきところなのであろう.もっと細かく 20〜30 分ごとに区切るべきという意見もあるようだ.

 

立正大のねらいは 105 分授業だと 90 分授業× 15 週に相当する授業時間を 13 週で実現できるところにあるらしい.なるほど,105 分だと 1 コマあたり 90 分授業よりも 15 分余分に授業をすることになるから,6 週で 90 分 1 コマ分になる.だから 12 週で 90 分授業の 14 週分になり,13 週目で 90 分授業の 15 週目を回収する算段である.

 

気がかりなのは昼休み時間の確保であるが,立正大とは縁がないのでそこまでは調べていない.105 分授業だと 5 時限の終了時刻がかなり遅くなるであろうが,授業週を短くする方を優先したのだろう.

 

100 分授業の場合は 14 週が文科省的なマストになり,それだと 90 分× 15 週に比べて 50 分もの超過が発生する.授業回数をさらに 1 回減らした上に超過分を 15 分に抑えると考えると 105 分授業の方がより合理的であるように感じて魅力的である.昼休み以外の時限間の休み時間を 5 分にするという選択肢もあるように思う.そうすると教室の移動時間などを見込むと,授業中のリフレッシュ休憩と移動を見込んだ 5 分ほど余裕を持って授業を早めに終わることになるだろうから,実質的に 100 分程度の授業となりそうである.

 

この取り組みが今後の日本の大学の主流となっていくのかどうか,大いに興味のあるところである.

Chromebook で gnuplot

【今回のお題】Fourier 級数の最初の何項かの和のグラフを描きたい.

 

私がかろうじて使えるプログラミング言語は十進 BASIC であるが,それを用いてお題に簡単に応えることができる.

 

もっと手っ取り早い方法はいろいろあるだろうが,例えば Wolfram|Alpha などを使えば Fourier 級数を求める段階から答えを教えてくれるであろう.

 

Fourier 係数を手計算ですでに求めてあるということならば,グラフ描画ソフトの利用が考えられる.

 

私がそこそこ使えるのは gnuplot と desmos くらいである.どちらを用いてもほとんど同じようにして目的を達成できる.

 

ところで,新学期が始まって依頼,確か 2 年前に買ったんだったような気がする,そのときすでに型落ちな感じだった Chromebook を引っ張り出して持ち歩いている.Wi-Fi に接続できる環境でないとほとんど役に立たないうえ,Wi-Fi 接続がちょいちょい勝手に切れるという大変 stressfullness なマシンなのだが,なんだかんだ言ってお世話になっているのは紛れもない事実であり,認めなければなるまいて.

 

んで,Chromebook にどうやって gnuplot を導入すればいいんかな,と,そこが悩みのタネだったのだが,解決に一日かかった.しかしソリューションはとても簡単だった.

 

Chromebook では設定をいじると Linux 端末が使えるようになる.そのため,Linux システムへの gnuplot の導入方法を調べてそれを真似すればよい.

 

んで,ネットでそんな感じで調べたところ,

 

> sudo apt install gnuplot

 

とすれば良いらしかった.ので,そうした.端末に表示されたメッセージはちんぷんかんぷんだったけど,とりあえず [Y/n] と聞かれたので Y と答えた.数分後にインストールが完了した.そこで早速

 

> gnuplot

 

と打ち込むと,その Linux ターミナル上で gnuplot が起動した.だがしかし,バージョンは 5.4.0 と,古い.公式サイトで確認したところ,2025 年 4 月現在での最新の安定版は 6.0.2 である.そちらにアップデートする方法は気が向いたら調べるかもしれないが,今回の目標は Fourier 級数の部分和のグラフを視認することだけなので,最新版にはこだわらないこととする.どこぞの OS は最新版にアップデートするとシステムが起動しなくなったり,作業の途中でブルースクリーンになったりと,stressfullness な恐怖体験を味わわせてくれるユーザビリティの鑑のようなサービス精神を旺盛に発揮してくれるほどに,最新 ≠ 最良という不等式は少なくとも IT 業界では常識なのだから.

 

さて,ネットから得た知識だが,gnuplot や desmos では自前の関数を定義できるうえ,関数の和も関数として扱えるそうな.

 

真面目に Fourier 係数を計算していないのだが,逆に Fourier 級数が (1/i)sin(i*x) みたいな感じになると想定し,そっちだけを描いてみる.

 

まず,gnuplot では pi という文字列が円周率という定数を表す.また,積は必ず演算子 * を記さなければならない.さらに大事なポイントとして,1/i は i が整数のとき 1 を i で割った整数値の商になるため,このままでは 2 以上の整数 i に対して 1/i は定数値 0 となってしまう.そこで,1/i という分数の値を実数値で返してもらうために,分子を 1.0 と記して実数型の係数であることを gnuplot のシステムにアピールする必要がある.他にもっとスマートな方法があるのかもしれないが,昔 gnuplot を使ったときに学んだ杵柄はこんな対処法であった.

 

わざわざ Fourier 級数の各項を f(x,i) として定義し,さらにこれらの第 n 項までの和を g(x,n) という名で定義するという分割スタイルを採用した場合は次のようになる.

 

gnuplot> f(x,i)=(1.0/pi)*sin(i*x)

gnuplot> g(x,n)=sum[i=1:n]f(x,i)

 

たったこれだけで準備は整った.なお,x の範囲は [-π,π] にしておくと見やすかろう.

 

gnuplot> set xrange [-pi:pi]

 

これで,

 

gnuplot> plot g(x,100)

 

などと入力すれば Fourier 級数の第 1 項から第 100 項までの和のグラフを描画してくれる.

 

私の Chromebook では,初めてグラフを描画させた際,別ウィンドウで開いたグラフ表示ウィンドウがじわじわとディスプレイの右側に広がり続けるという気色の悪い挙動をしたため,耐えきれず全画面表示に切り替えて落ち着かせる必要があった.

 

これで目的は達成されたが,そもそもこれはどんな関数の Fourier 級数なのだろうか?

 

Fourier 部分和のグラフを眺めてだいたいのあたりをつける.1 次関数のグラフが原点でブチッと切れた不連続な関数なのが困ったところである.そのようなタイプのノコギリ波は arctan(tan(x)) をスケーリングすれば得られそうであるが,あえて一周周期分だけを再現する関数を絶対値関数を利用して作ることとする.

 

理論的には実数 x の符号を取り出す関数 sgn は x/|x| とすれば作り出せる.ただし,x=0 のとき出力値は 0 というふうに別枠で定めておく必要がある.

 

この sgn 関数は gnuplot に備わっていたので,それをそのまま使う.

 

一方,max 関数はデフォルトで備わっていないらしい噂がネットの検索結果で伺われたため,絶対値関数 abs(x) を用いて,正の数ならば x を,0 以下ならば 0 を出力する関数 max_plus を自分で次のように定義しておく.

 

gnuplot> max_plus(x)=(x+abs(x))/2

 

これを用いると,我々の Fourier 級数のもとの関数は gnuplot 表記では (pi/2)*sgn(x)*max_plus(1-abs(x)/pi) となるようである.実際,

 

gnuplot> plot (pi/2)*sgn(x)*max_plus(1-abs(x)/pi), g(x,100)

 

とコマンドを入力すると,下図のようなグラフが表示されて,もとの関数の不連続点 x=0 の近傍で Fourier 級数の和の値が超過する Gibbs 現象を見せてくれる.

Fourier級数の部分和

Desmos を用いた場合も関数定義や関数の和の記法は gnuplot のときとほとんど同じように入力すればよい.

www.desmos.com

goo blog サービス終了・・・(泣)

2007年から20年近くお世話になった goo blog がサービス終了とは寂しい限りである.

都営バスも運行本数がかなり削られた印象があるし,これも時代の趨勢であろう.

Amebaはてなに移行できるらしいのだが,はてさて,数式が使いやすいのはどちらだろうか?

MathJax や KaTex みたいな,ブラウザできれいな数式を高速でレンダリングできるサービスの,Typst 版とかあったらすごく便利なんだけどなぁ.Typst から HTML へのエクスポート機能が正式に実装されたら,それがほぼそういうサービスに他ならないわけだが.

現在の LaTex や Typst は用紙サイズ固定の PDF ファイルを作成するツールなので,PC やタブレットスマートフォンといった表示デバイスに応じた体裁で文書を表示してくれるのは HTML/CSS の大きな魅力である.それがブログという形態で数学メモを作り続けていきたいと考える理由である.

ぶっちゃけ,全く「読者」といった対象を想定していない,単なる独り言の書き殴りに過ぎない記事ばかり書いているが,この広い世の中のことだから,私と同じようなことを考え,解決できずに困っている人がいたとして,その人にとってのなんらかのヒントになることを提供できるかもしれない,といったことを夢見てもいる.

というわけで,記事の投稿頻度は非常に低いままではあるが,今のところブログは続けていこうと考えている.

Typst: 解答の表示と非表示を切り替える

Typst には hide という関数があるが,その挙動は LaTeX でいうところの phantom と同様である.つまり,ある文字列を表示しないが,その文字列分の領域を確保する機能がある.

だが,hide 関数はシンプルで,表示の ON/OFF を切り替えられるわけではない.

それに対し,LaTeX では if コマンドを利用して,例えば自分で設定した if 変数が true ならば表示し,false ならば表示しないという切り替えができる.ただし,それは false ならばコメントアウト扱いで,非表示の際にその文字列分の領域が確保されるわけではない.

授業資料として演習問題のプリントを作成する際,それにこちらが用意している模範解答も記入することで解答欄の領域を確保しつつ,解答を非表示にしたバージョンを学生に提供できるようなら便利であろう.

これは Typst ならば次のような実現方法がある.解答の文字列だけをページの背景と同じ色にしてしまえばよい.

背景が白であれば,解答も白い文字で表示するわけである.

背景がなんらかの画像であるとか,複雑な模様になっているオシャレなデザインのときにどうすればよいかまでは私にはわからない.それはそれで別の工夫をすることで目的を達成することができるかもしれないし,不可能かもしれない.

今回は

#let ans(it) = text(fill: white)[#it]

という関数 ans() を自作する.

問題の解答を #ans(...) のように記述すればよい.数式モード中では ( ) 内の文字列は数式モード中の記法をそのまま書き込めば良い.本文中では文字列と認識させるために #ans("文字列") もしくは #ans([文字列]) のようにしないとエラーが出る.

ans() の定義式の右辺の色指定を black に修正すれば,解答が黒字で表示される.もちろん色はそれ以外のものを好きに指定すれば良い.

実際の使い方としては,色を black にした状態で解答を含めて資料を作成した後,最後に忘れずに black の部分を white に書き直して解答を非表示にする,といったものを想定している.

ちなみに,white にして見えなくした状態で PDF 形式でエクスポートしたものを PDF ビューワで開いた際,空欄の箇所を選択してみたが,私が使用したビューワでは白い文字が反転表示されることはなかった.つまり,そこに白い文字で何かが書かれていると認識されなかったということである.PDF の中身がわからないため,どんなビューワでも非表示の部分をうまく覗き見できないのかどうか判断できないので,この方法で作成した解答非表示の PDF ファイルを,解答を知らせたくない場合に学生に配布してしまって大丈夫なのかどうかは自信がない.

HTML だと,バックグラウンドと同じ色の文字を書いた際,ブラウザ上でその部分を選択すると文字色が反転されて読めるようになることは経験上知っているのだが,Typst が生成する PDF ファイルにそういう白文字の情報が含まれているのかどうかが私にはさっぱりわからない.

※ PDF ビューワで表示したものにおいて範囲を選択してテキスト情報をクリップボードにコピーし,テキストエディタに貼り付けたところ,範囲指定がぐちゃぐちゃになったため支離滅裂な文字の並びにはなったものの,伏せておきたかった i×j=k などの右辺の解答がバッチリ表示されてしまっていた.したがって,そのような裏技を心得ている学生相手にここで示した方法は通用しない.改善案としては,解答の部分を box もしくは rect などで真っ白に塗りつぶす検閲方式が思い浮かぶが,それはまだ試していない.そのように「物理的に」塗りつぶしてしまえば PDF 上でのテキストコピペを封じられるのではないかと期待してはいるのだが.

参考までに 3 次元基本ベクトルのベクトル積の総当り表(「ベクトル積九九」)のビフォー・アフターの画像を貼っておく.

※ 「これは解答が見えないよね?」という文の『解答が』の部分にはわざと box 関数を用いて silver の背景色を付けている.非表示の際に白い文字が出力されているのがそれとなく見て取れるのではないだろうか.

なお,設問ごとに解答の表示/非表示を切り替えたければ,原始的な方法ではあるが,設問ごとに ans() を定義する let 文を付しておき,それぞれで black/white を設定する対処法が考えられる.

<white で非表示>
<black に書き換えて表示>

Typst: 別行立て数式を左寄せにする fleqn の実装

Typst の数式モードはブラックボックスである.

が,math.equation という名の関数としてある程度設定をいじることが可能である.

例えば数式モードにおけるフォントを自分の好みに設定したいとき,

#show math.equation: set text(font: "TeX Gyle Schola Math")

という記述を,表示したい数式よりも前に本文中に認(したた)めておけばよい.

ちなみに,デフォルトの Libertinus は中文フォントもカバーしているようで,Typst 公式サイトのエディタなどでデフォルトの設定のまま日本語で文章を書くと句読点が左下ではなく,たとえば「・」のように中央に表示される.そして漢字やひらがなのフォントが微妙に思っていたのとチガウ.

文字種ごとにフォントを指定することも可能らしいが,私には未だにひらがな+カタカナ+日本風の漢字+全角コンマ+全角ピリオド,そしてそれら以外の約物(カッコ類,引用符など)すべてを過不足なく網羅した Unicode の範囲がイマイチ理解できていないのと,それらを調べる気力がないのとで,ひとまず Typst が提供してくれている latin-in-cjk をうまく利用することにしている.

ぶっちゃけ,*strong* みたいに * で挟んだ際の太字も,通常の和文フォントを原ノ味明朝にしたとして,それに合わせて原ノ味ゴシックしたい場合も,自分で show ルールを使ってそのように設定しなければならないっぽい.まあ,それはそれで活字の濃さ (weight) もカスタマイズできるので,その設定のついでと思えば良いかもしれない.

愚痴をこぼせば,Typst の開発者がベルリン(大学?)出身の二人組であるため,どうしても欧文の文化を基盤とした組版システムにならざるを得ず,縦組みをはじめとする日本語の文書として満足のいく出来栄えを目指すには自分でどうにかするしかないといった不便さが拭えない.

フォントの指定の仕方の詳細については,これまであれこれ試してみたものの,実験結果をぜんぜんまとめていないので,その報告はするとしても別の機会としたい.

さて,今回の本題は LaTeX ならば,たいていファイルの一行目に書く document class のオプションにある,数式を左揃えで表示する fleqn(おそらく flushleft equations といった感じの語句の略称)を Typst で実現する方法を紹介することである.

まず,Typst の本文の冒頭あたりにでも

#show math.equation: set align(left)

というおまじないを入れておけば,それだけで別行立て数式がデフォルトで中央揃えだったのが左揃えに変更される!

ところが,である.

アキ,いうなればインデントの余地など全く無く,本当に完全に左端に寄ってしまうのである.

求メテ イタ ノハ ソレ ジャナイ・・・.

そこで,例えば2文字分のアキを左側に設定したければ,pad 関数を使えばよい.pad 関数で左に2文字分のインデントを入れることにしたい場合は,

#pad(x: 2em, contents)

のようにする.contents のところは実際の文章というか表示したい文字列を記入する部分である.

ところが,これを利用して

#show math.equation: it => pad(x: 2em, [#it])

のようにしてしまうと,何ということでしょう!文中に埋め込むインラインモードの数式が使えなくなってしまうのである.つまり,この show ルールを入れてしまうと,pad 関数が block レベルのコンテンツを吐き出すせいか,block 仕立ての数式,つまり別行立て (display) の数式としてしか表示されなくなってしまうのである.

それはそれで意図していない事態であって,どげんかせんといかん.

結論として,あまりエレガントな解決策とは言い難いが,自前の fleqn という関数を次のように定義することとする.

#let fleqn(it) = {show math.equation: set align(left)
pad(x: 2em, [#it])
}

こうすることで,デフォルトの別行立て数式表示の中央揃えの設定はそのまま残すことになり,数式のインライン表示も問題なく,自分好みの2文字分のインデントにぶら下がった左揃え数式を表示したければ,

#fleqn($ a (b+c) = a b + a c $)

のように書けばよい.ここで,引数は別行立て数式の書き方をそのまま使用することにだけ注意していただきたい.最初の $ の直後と,最後の $ の直前に半角スペースを入れなければならないのである.

※ では半角スペースを入れなければインライン表示になるか?というとそうはならない.pad は block を扱うため,半角スペースを入れ忘れても別行立ての表示で出力される.では何が違うかというと,別行立てのくせにインライン表示になるのである.例えば分数の表示が,文字が小さいバージョンになったりする.私は,個人的にインラインは $x/y$ で,別行立ては $$x/y$$ で書くような仕様の方が良かったのに,と思っている.スペースは数式を編集している途中ですぐ消えるからねぇ.案外煩わしいのれす.

ともかく,悲願の一つであった数式の左寄せが Typst でもちゃんと実現できることがわかったので朕は満足しておるぞよ.

小島順の数学教室

小島順先生の個人サイト『小島順の数学教室』が,レンタルサーバとの契約が更新されていないようで,アクセスできなくなってしまった.

archive.orgWayback Machine で探したところ,見つかったのでここに記しておく.


つい最近,昨年に瑞宝中綬章を受章された東京工業大学名誉教授の井上 淳(あつし)先生のホームページも Wayback Machine でめっけたので,そのときに培った検索スキルが活きた.

二か月にも渡る春季休業期間中のネットサーフに明け暮れただけの日々も,そう捨てたものではなかったようだ.