ラベル プログラミング の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング の投稿を表示しています。 すべての投稿を表示

2022年10月27日木曜日

Intel Fortran

量子物理学の授業は,前期の復習モードが終わりつつある。1次元の有限井戸型ポテンシャル問題の解となるエネルギー固有値と固有関数を求めるというものだった。とりあえず,普通の教科書にあるような,$y=-\frac{x}{\tan x}$と,$x^2+y^2=r^2$のグラフを描いて交点からエネルギー固有値を求めようというお話で終るわけだ。

ところで,現代的な量子力学の教科書ではどうなっているのだろうか。サクライの教科書では,井戸型ポテンシャルは,付録のシュレーディンガー方程式の解の例のところで,結果だけがほんの1pにまとめられていた。堀田さんの教科書では,第11章の粒子の量子的挙動の演習問題にチョロッと顔を出しているだけだった。まあそういうことだ。

気分を変えて1次元ポテンシャルの一般的な数値解法がないかと探してみると,インテルのフォートランを使った解説ページが見つかった。インテルのフォートランは有償だと思っていたけれど,どうやら無償で使えるし,macOSにもかろうじて対応しているようだ。そこで参考サイトにしたがって,早速インストールしてみた。

(1) Intel OneAPI Toolkitsで,Intel oneAPI Base Toolkit とIntel oneAPI HPC Toolkit の2つのパッケージをダウンロードする。その際にユーザ登録が必要となるが無償である。
(2) それぞれのToolkitを展開する(ネットワークインストール版を使った)。
(3) 下記の場所にある環境設定スクリプトに誘導されるのでこれを実行する。
https://www.intel.com/content/www/us/en/develop/documentation/get-started-with-intel-oneapi-base-hpc-macos/top/before-you-begin.html?cid=oth&campid=iags_install&source=installer?cid=oth&campid=iags_install&source=installer

. /opt/intel/oneapi/setvars.sh

 (4) 簡単なプログラム a.f を作って実行してみた。

      implicit complex*16(a-h,o-z)

      write(*,*) "input a,b,c"

      read(*,*) a,b,c

      x1=(-b+sqrt(b**2-4*a*c))/2

      x2=(-b-sqrt(b**2-4*a*c))/2

      write(*,*) " x1= ",x1," x2= ",x2

      end


$ ifort a.f

$ ./a.out

 input a,b,c

$  1,1,1

$   x1=  (-0.500000000000000,0.866025403784439)  x2= 

 (-0.500000000000000,-0.866025403784439)


できた。


SIN基底とQUADPACKによる1次元時間依存しないシュレーディンガー方程式のページの例題も試してみる。調和振動子のエネルギー準位が再現できた。なお,行列の対角化ライブラリがはいっているインテル・マス・カーネルライブラリのオプション -mkl を -qmkl にせよとの警告がでていた。


$ ifort -qmkl quadpack.f90 main.f90

$ ls

a.out main.f90 quadpack.f90

$ ./a.out

           1  0.499999999999997     

           2   1.50000000000004     

           3   2.50000000000008     

           4   3.50000000000073     

           5   4.50000000003176     

           6   5.50000000018886     

           7   6.50000000502383     

           8   7.50000002123218     

           9   8.50000037227348     

          10   9.50000121353051   


2022年10月2日日曜日

理科情報演習

プログラミング教育(5)からの続き

手元に,手作りの理科情報演習のテキストが2冊ある。奥付を見ると,一つは1988年4月1日発行で,大阪教育大学理学科情報教育検討委員会,もう一つは1989年4月1日発行の改訂版だ。平成元年,新しい学習指導要領の告示年か。ゆとり教育のピークで,小学校低学年の理科が廃止され生活科が新設されたころだ。

はじめにには次のようにあった(iPhoneの音声入力は便利)

 この情報科学の発展と,コンピュータテクノロジーの発達にともなって急速に普及しだしたパーソナルコンピュータの高性能化と低価格化は,コンピューターの利用範囲の拡大に多大な影響をもたらした。パーソナルコンピューターを教育現場へ導入しようとする試みもその1つの例であり,教育現場においてパーソナルコンピュータをどのように活用するかについての研究もその進展が望まれるところである。

 最近各地で小・中・高等学校の先生などの教育関係者が中心となって,パーソナルコンピュータを教育機器として利用するための研究グループが作られ始めた,しかし,その規模は全国的に見ても十分ではない。このような時期にあたって,理学科の専門科目として「理科情報演習」を開講することは大きな意義を持つと言うことができる。情報処理を内容とした講義はすでに昭和61年度から理学科および第二部において開始されているが,この間の実践から得られた経験をもとにして「よりよいテキストを」という意図で本書は作成された。

 このテキストでは,コンピュータシステムに関する基本的な事柄が一通り学べるように心がけたつもりである。またプログラム言語としては,初学者用の汎用言語として開発されたBASICを取り上げている。利用する立場からみたコンピュータの働き,データの流れ,あるいは計算の手順などのコンピュータ利用に係わる基本的事柄は,BASICによっても十分理解し得ると考えたからである。

 さらに,目次は次のようになっていた。

第1章 コンピュータ入門・・・・・・・・・・・・・・・・・1
  第1節 コンピュータの歴史と発展
  第2節 コンピュータの現在
第2章 コンピュータの仕組み・・・・・・・・・・・・・・・13
  第1節 ハードウェアの構成
  第2節 コンピュータの取り扱うデータ
  第3節 パーソナルコンピュータにおけるデータの流れ
  第4節 ネットワークシステム
第3章 ソフトウェアの基礎・・・・・・・・・・・・・・・・35
  第1節 ソフトウェアの概念
  第2節 アプリケーションプログラムの分類
  第3節 言語処理プログラム
  第4節 パーソナルコンピュータのオペレーティングシステム
第4章 コンピュータを動かす・・・・・・・・・・・・・・・61
  第1節 FM16πを起動する
  第2節 PC−98LTを起動する
  第3節 キーボードをそっと叩く
第5章 プログラミングの基礎・・・・・・・・・・・・・・・80
  第1節 基本文法
  第2節 基本コマンド
  第3節 グラフィック
  第4節 データの型
  第5節 入出力命令
  第6節 基本演算
  第7節 基本文型
  第8節 サブルーチン
  第9節 デバッグの概念と方法
  第10節 ファイル処理
第6章 プログラムの構成・・・・・・・・・・・・・・・・109
  第1節 アルゴリズム
  第2節 プログラムの構造化
  第3節 プログラムの解析
第7章 コンピュータの可能性・・・・・・・・・・・・・・123
  第1節 教育・研究・産業とコンピュータ
  第2節 コンピュータ利用の問題点
  第3節 コンピュータの未来
練習問題・・・・・・・・・・・・・・・・・・・・・・・・129
参考文献・・・・・・・・・・・・・・・・・・・・・・・・149

自分が担当したのは,第3章ソフトウェアの基礎の26ページだった。スーパーコンピュータとしてベクトル計算機がとりあげられ,第五世代コンピュータ開発プロジェクトがまだポシャっておらず,未来のコンピュータは光子計算機だと語られていた時代。



写真:理科情報演習テキスト1989年度版

2022年10月1日土曜日

プログラミング教育(4)

プログラミング教育(1)からの続き

一昨年に文部科学省が出した「小学校プログラミング教育の手引き(第3版)」をもう一度確認する。
はじめに ~ なぜ小学校にプログラミング教育を導入するのか ~

 今日、コンピュータは人々の生活の様々な場面で活用されています。家電や自動車をはじめ身近なものの多くにもコンピュータが内蔵され、人々の生活を便利で豊かなものにしています。誰にとっても、職業生活をはじめ、学校での学習や生涯学習、家庭生活や余暇生活など、あらゆる活動において、 コンピュータなどの情報機器やサービスとそれによってもたらされる情報とを適切に選択・活用して問題を解決していくことが不可欠な社会が到来しつつあります。 
 コンピュータをより適切、効果的に活用していくためには、その仕組みを知ることが重要です。コンピュータは人が命令を与えることによって動作します。端的に言えば、この命令が「プログラム」であり、命令を与えることが「プログラミング」です。プログラミングによって、コンピュータに自分が求める動作をさせることができるとともに、コンピュータの仕組みの一端をうかがい知ることができるので、コンピュータが「魔法の箱」ではなくなり、より主体的に活用することにつながります。 
 プログラミング教育は子供たちの可能性を広げることにもつながります。プログラミングの能力を開花させ、創造力を発揮して、起業する若者や特許を取得する子供も現れています。子供が秘めている可能性を発掘し、将来の社会で活躍できるきっかけとなることも期待できるのです。 
 このように、コンピュータを理解し上手に活用していく力を身に付けることは、あらゆる活動においてコンピュータ等を活用することが求められるこれからの社会を生きていく子供たちにとって、将来どのような職業に就くとしても、極めて重要なこととなっています。諸外国においても、初等教育の段階からプログラミング教育を導入する動きが見られます。 
 こうしたことから、このたびの学習指導要領改訂において、小・中・高等学校を通じてプログラミング教育を充実することとし、2020 年度から小学校においてもプログラミング教育を導入することとなりました。 
1980年代半ば,大学の研究室にPC-8801やPC-9801やSHARP MZ-2000系などが入りはじめた頃,これからの学校教育にはコンピュータが絶対必要になるということで,大阪教育大学の理学科をあげての取り組みが始まった。データステーション(後の情報処理センター)にあって全学共通に使えるパソコンはほんの数台しかなかったので,理科の教員が研究費を持ち寄って2人に一台のラップトップPCを整備することになった。

最初は,CP-M/86が搭載されたFM-16π が2人に1台+教員用の計21台,やがてMS-DOSPC-98LTが1人1台に置き換わっていった。これが物理教室の並びにある階段教室のロッカーに設置されることになる。理科情報演習という授業名を冠したテキストは,山口先生,家野先生と自分が編集作業を担当した。休日まで集まって各教員からの分担原稿を整理していた。

あるとき,このプロジェクトの音頭をとっていた,X線実験を専門とする高木義人先生が,小中学校教員向けの公開講座でコンピュータの使い方=プログラミングをやってはどうかと発案した。理科の教員に呼びかけたのだが,必ずしもよい返事が得られなかった。結局,物理教室のメンバー=加藤先生・仲田先生(高木研究室の助手)・自分だけでやろうということになった。もしかすると,山口先生や家野先生も参加していたいたかもしれない。

反対意見の代表的なものとして,福江先生の意見があった。「これからはコンピュータが当たり前のように学校にはいって活用される時代はくることは確かだ。しかし,その段階で,教員が自分でプログラミングによって授業で活用できる教材をつくるとか,データ処理をBASICで行うということはなく,様々なソフトウェアを活用したり組み合わせることが中心になるはずだ」。

いや,まったくそのとおりなのだが,その当時,学校の先生にコンピュータを体験してもらう場合,実質的には内蔵されているBASICインタープリタを使うしかなかったのである。もちろん,マルチプラン,松,jx-word太郎,dBASEなどのアプリケーションソフトは登場していたが,1本数万なので,とても台数分賄う予算はなかったのである。

そんなわけで,じりじりと太陽が照りつける夏休みの天王寺キャンパスの旧校舎の,冷房もない階段教室で汗だくになりながら,よくわからない学校の先生を相手に,BASICプログラミングを懇切丁寧に指導する3日間というのを数年続けたのだった。

それが40年近く前の話である。やがて,インターネットへの接続がはじまり,大学は柏原キャンパスに統合移転し,キャンパスネットが整備され,コンピュータ実習室も複数室もうけられ,キャンパス全域に無線LANアクセスポイントができたら,全学生BYODの時代になってしまい,学校現場でもGIGAスクール=一人一台の環境整備が進んでいる。

で,いま再びプログラミング教育というわけだ。どう考えても上の第2段落にあるプログラミングでコンピュータの仕組みを知ることが主体的活用につながるというのが正しい考えであるとは思えない一方,前回述べたように,コンピュータを創造的ツールとして使うという観点でみれば,それはそれでありうるのかとも思われる。


図:プログラミングからのパラダイム転換(人工知能研究の新潮流から引用)

2022年9月3日土曜日

UML

中学生もUML(Unified Modeling Language,統一モデリング言語)を学ぶ時代だというのであわてて追いかけてみる。なんだか統一ばやりの今日この頃。

UMLは,1997年ごろからOMGによって管理されるようになったモデリング言語である。プログラミングの手前で,問題とする対象や過程の構造や処理フローなどを整理して可視化する機能を持っている。何種類かのダイアグラムに分類されているが,そのうちのアクティビティ図が従来のフローチャートに概ね対応する。

いろいろツールはあるようだが,PlantUMLというテキストベースでダイアグラムを作成するツールが便利そうだ。brew install graphviz と brew install plantuml で必要なソフトをインストールする。hoge.umlというUMLファイルをつくって。plantuml hoge.uml とすれば hoge.png というUML図が得られる。よくある見本は次のようなものだ。


図:UMLのシーケンス図のサンプル

最近のバージョンでは,モノトーン表示になっているが,skin rose とすると以前のカラリングで表示することができる。 この図を出力するためのumlファイルは次のようなものだ。

@startuml

skin rose

title PC入出力シーケンス
header テストシーケンス
footer ページ %page% / %lastpage%

actor ユーザ
box PC
participant USB
participant CPU
participant ディスプレイアダプタ
end box

alt キーボード
ユーザ -> USB : キー入力
else マウス
ユーザ -> USB : マウス入力
end
USB -> CPU : 入力データ
activate CPU
note over CPU : 処理中
CPU -> ディスプレイアダプタ : 表示データ
deactivate CPU

participant ディスプレイ
ディスプレイアダプタ -> ディスプレイ : 表示データ
ディスプレイ -> ユーザ : 表示

@enduml
[1]PlantUML概要

2022年9月2日金曜日

プログラミング教育(3)

プログラミング教育(2)からの続き

高等学校に情報という教科が新設されたのは,平成10年(1998年)告示の学習指導要領からだった。これを受けて2003年度から高等学校での必履修科目の情報の授業が始まった。

そのころ,まだ大阪教育大学に在籍していた田中博之さんに誘われて,日本文教出版の教科情報の教科書編集に参画することになった。関西大学総合情報学部の水越敏行先生をトップに,新潟大学の生田孝至先生,水越先生の弟子の黒上晴夫さん(阪大オケでチェロをやっていた)などにひきいられた20名ほどのチームだった。慶応義塾幼稚舎の田邊則彦さんの引きで,看板には村井純さんも据えられた。

田中博之さんは,その後いろいろあって編集チームをやめ,大阪教育大学から早稲田大学の教職大学院に移った。1998年指導要領では,情報A(入門),情報B(理系),情報C(文系)の3つの選択科目が設定されており,関西大学の江澤義典先生,富山大学の黒田卓さんら数名による情報Bチームに配属された。情報Bチームは次の学習指導要領改訂で情報の科学チームに再編され,辰己丈夫さんなども加わって Javascript 路線を進むことになる。なお,自分も本業が忙しくなったので,2012年ごろには水越先生にお願いして抜けさせてもらった。

全く新しい科目が立ち上げられたということで,手探りで教科書づくりがすすんでいくのだが,プログラミングは教科「情報」の中心に据えないというのが共通了解事項であった。当時の大学では,コンピュータ教育=プログラミング教育という暗黙の刷り込みがあったので,なかなか大きな発想の転換であり,メディア教育を専門とする水越先生はこの点を強調していた。

そしていま,再びプログラミング教育に重点が移ってきたのだが,高等学校の学習指導要領では小学校や中学校のようなことはなく,これまでとあまり変わらないようなニュアンスになっている。2020年学習指導要領の必履修科目の情報Iと選択科目の情報IIと解説編では次の程度である。小学生,中学生,高校生に渡るプログラミング教育の積み上げについて検討された雰囲気があまり感じられないのはなぜ。
情報Ⅰ
(3)コンピュータとプログラミング
ア(イ)アルゴリズムを表現する手段,プログラミングによって
コンピュータや情報通信ネットワークを活用する方法について
理解し技能を身に付けること。
イ(イ)目的に応じたアルゴリズムを考え適切な方法で表現し,
プログラミングによりコンピュータや情報通信ネットワークを
活用するとともに,その過程を評価し改善すること。

情報Ⅱ
(4)情報システムとプログラミング
ア(ウ)情報システムを構成するプログラムを制作する方法について
理解し技能を身に付けること。
イ(ウ)情報システムを構成するプログラムを制作し,その過程を
評価し改善すること。

例えば,グループで掲示板システムを構成するプログラムを制作する学習を
取り上げ,サーバ側のプログラムについて適切なプログラミング言語の選択,
設計段階で作成した設計書に基づくプログラムの制作を扱う。その際,
自分が制作したプログラムと他のメンバーが制作したプログラムの統合,
テスト,デバッグ,制作の過程を含めた評価と改善について扱う。なお,
プログラムを制作しやすくするために組み込み関数やあらかじめ用意した
関数などを示し,これらを利用するようにすることも考えられる。

[1]高等学校学習指導要領解説 情報編(平成30年告示,文部科学省)
[2]高等学校情報科に関する特設ページ(文部科学省)
[3]プログラミング教育実践ガイド(文部科学省)
[4]高等学校普通科の教科「情報」の変遷と課題(川瀬綾子,北克一)
[5]高等学校共通教科情報科の知識体系に関する一考察(電気通信大学 赤澤紀子他)

2022年9月1日木曜日

プログラミング教育(2)

プログラミング教育(1)からの続き

IT革命第1波が来ていた1998年告示の学習指導要領では,中学校の技術・家庭の技術分野の内容が,A 技術とものづくりとB 情報とコンピュータの2項目に整理された。つまり内容の50%がICTということだ。ところが,2007年告示では,揺り戻しが起こり,A 材料と加工に関する技術,B エネルギー変換に関する技術,C 生物育成に関する技術,D 情報に関する技術,になった。情報とコンピュータの内容は30%程度になってしまった。2016年告示の学習指導要領にもこれが引き継がれたままだ。

その直近の中学校技術・家庭学習指導要領の解説編をみると,プログラミングに関しては次の記述がある。とっても高度な内容になっている。

D 情報の技術

(2)生活や社会における問題を,ネットワークを利用した双方向性のあるコンテンツのプログラミングによって解決する活動を通して,次の事項を身に付けることができるよう指導する。

(3)生活や社会における問題を,計測・制御のプログラミングによって解決する活動を通して,次の事項を身に付けることができるよう指導する。

計測・制御の方はこれまでもあったが,ネットワークを利用した双方向性のあるコンテンツのプログラミングってどうするのだろうか。しかも,次の補足説明が入っている。

なお,課題の解決策を構想する際には,自分の考えを整理し,よりよい発想を 生み出せるよう,アクティビティ図のような統一モデリング言語等を適切に用い ることについて指導する。

えーっ,中学生からUMLをやるんですか・・・もうフローチャートの時代は終ったのか。

具体的にはどんなプログラム言語で実施するのかを調べてみたら,ここにあった[1]。基本は,小学校でも使われているScratchだ。Scratch 1.4では,Meshというネットワーク上の端末間の情報交換の機能があるので,ネットワークを利用した双方向という条件を満たせる。後はよくわからないマイナーなプログラム言語や環境がわさわさと湧いていた。

[1]中学校技術・家庭科(技術分野)内容「D 情報の技術」研修用教材(文部科学省)
[2]PIC GUI Programming Environment(鳴門教育大学 菊池章)
[3]Studuino(Artec)
[4]Scratch1.4(MIT,Meshが使える)
[5]ねそプロ岩手県一関市立花泉中学校 奥田昌夫)
[6]なでしこ(kujirahand)
[7]Leaflet(埼玉大学 谷謙二,Javascript Web地図サービスライブラリ)
[9]拡張AIブロック(TECH PARK)
[10]ピョンキー(Scratch互換,Mesh対応)
[11]ドリトルではじめるプログラミング(大阪電気通信大学兼宗研究室)
[16]中学校プログラミング教育の実態調査(日本産業技術教育学会)


2022年8月31日水曜日

プログラミング教育(1)

これまでも小学校におけるプログラミング教育への違和感を述べてきた。

  コンピューテーショナル・シンキング(4)

特に,小学校学習指導要領の解説編にある下記の「プログラミング的思考」がどうにも気持ち悪いのだ。

また,子供たちが将来どのような職業に就くとしても時代を越えて普遍的に求められる「プログラミング的思考」(自分が意図する一連の活動を実現するために,どのような動きの組合せが必要であり,一つ一つの動きに対応した記号を,どのように組み合わせたらいいのか,記号の組合せをどのように改善していけば,より意図した活動に近づくのか,といったことを論理的に考えていく力)を育むため,小学校においては,児童がプログラミングを体験しながら,コンピュータに意図した処理を行わせるために必要な論理的思考力を身に付けるための学習活動を計画的に実施することとしている。その際,小学校段階において学習活動としてプログラミングに取り組むねらいは,プログラミング言語を覚えたり,プログラミングの技能を習得したりといったことではなく,論理的思考力を育むとともに,プログラムの働きやよさ,情報社会がコンピュータをはじめとする情報技術によって支えられていることなどに気付き,身近な問題の解決に主体的に取り組む態度やコンピュータ等を上手に活用してよりよい社会を築いていこうとする態度などを育むこと,さらに,教科等で学ぶ知識及び技能等をより確実に身に付けさせることにある。
いろいろな論点はあるけれど,AI応用アプリケーションがICT環境活用の中心になろうという時代に,(1) 手続き型プログラミングの想定が透けて見える「プログラミング的思考」という怪しい概念を振りかざしていること,(2) たぶんこのプログラミング教育では身につかない「論理的思考力」をゴールとすること,等への拒否反応が先にきてしまうのだ。

そこで,久しぶりに小学校のプログラミング教育でよく用いられているScratchをのぞいて見た。なんだがすごく進化していた。プログラム開発環境画面の左下のボタンを押すと,拡張機能が選択される。その項目は,音楽,ペン,ビデオモーション,音声合成,翻訳,Makey Makey,micro:bit,LEGO MINDSTROMS EV3,KEGO BOOST,LEGO Education WeDo 2.0,Go Direct Force & Accelerationというもので,おもわずワクワクしてくる。

小学校プログラミング教育をバカにしていてごめんなさい。これを学習指導要領のように捉えてはいけなかった。コンピュータを単なる情報受像機定型業務処理機としてではなく,IoTを含む情報創造機として使うための第1歩だった。プログラミング思考なんて実はどうでもよかったのだ。

そして,大規模言語モデル+ディープラーニングを背景とした新しいAIのトレンドは,この情報創造の意味合いそれ自身を大きく変えてしまうことになるかもしれない。


2022年6月5日日曜日

NDC Predictor

国立国会図書館NDLラボが提供している実験的サービスの一つに,NDC Predictorがある。これは,機械学習による日本十進分類の推測アプリであり,テキストエリアに貼り付けられた書誌情報から日本十進分類(NDC9版)を推測する。

日本十進分類法の最新版は,2014年に改訂された新訂10版である。書籍で2分冊800pからなるが,ネット上の関連資料としては,日本図書館協会NDC10による分類記号順標目表や国立国会図書館 の「日本十進分類法(NDC)新訂 10 版」 分類基準がある。

実際の分類には熟練の技が必要かもしれないので,タイトルや著者や出版者などのざっくりした書誌情報で他のテキストが混ざっていても,第一から第三候補まで推測してくれるのであれば,それはそれで有難そうだ。

さっそく,試してみるが,書名と著者名で検索したところ,「統計力学 著者」は,第一候補が90%以上の確率で421/理論物理学,第二候補が1%以内の確率で426/熱力学となった。各著者の第一候補の確率は,久保亮五が99.9%,鈴木増雄99.8%,田崎晴明99.5%,長岡洋介99.2%,北原和夫・杉山忠男98.8%,湯川諭92.3%となった。稲葉肇の統計力学の形成は,91.9%だった。

REST-APIもオープンになっているので,PCからコマンド入力によって結果を機械可読な形式で取り出すこともできる。早速試してみる。APIというとHTTP-APIのGETしか使ったことがない。4回生の2009年の卒業研究でGoogleMap-APIを使って,自然観察の理科ノートを地図上に貼り付けて時空間の変化を調べようというものだった。

今回は,HTTP-POSTを使うので普通のブラウザではアクセスできない。どうするのかと思ったら,curl コマンドを使えばよいということがわかった。具体的には次のようにする。

curl -XPOST "https://lab.ndl.go.jp/ndc/api/predict" --data "bib=統計力学 久保亮五" 

予測に使う文字列は,1000文字以内であり,bib=の後にいれればよい。出力は,JSON形式となり,[ { "value":"推測されたNDCの値, "label":"推測されたNDCのラベル", "score":"推測の確信度(0-1)" }, {第二候補}, {第三候補} ],のようになる。上の例ではつぎのとおり。

[{"value":"421","label":"理論物理学","score":0.9997790320037916},{"value":"426","label":"熱学","score":2.3498150212228626E-4},{"value":"429","label":"原子物理学","score":1.2803195946766326E-5}]

lynxコマンドでも大丈夫かを確かめたところ,標準入力からデータと終了記号をいれてOK。

lynx https://lab.ndl.go.jp/ndc/api/predict -post_data
bib=統計力学 久保亮五
---

[1]開発者のための日本十進分類法

[2]NDCデータ(日本図書館協会)

2022年5月29日日曜日

RICTYフォント

東北大学の清野舜さんによる「試行回数の増やし方2021年度版」というスライドをみていた。

成功回数 = 試行回数 ×  成功率の公式から,成功率なんてあがらないので,成功するには試行回数を増やせ。試行回数を増やすためには,1回の試行時間を如何に短縮するかということで,プログラム開発における重要な考え方やツールの実践的な紹介をしている。こんなアドバイスを身近にしながら研究できる大学院生がうらやましい。

そこで,プログラミング用のフォントの話を見つけた。1(イチ)とl(エル)とI(アイ)や,O(オー)とo(オー)と0(ゼロ)など区別が困難なフォントがある。それを避けるべくデザインされたのが RICTY フォントだ。等幅フォントであり,半角と全角の幅が1:2になっている。

Macでのインストールは,古い資料ではうまくいかなかったが,新しいものでは次のようにして簡単に導入できた。

$ brew tap sanemat/font

$ brew install ricty

$ cp -f /opt/homebrew/opt/ricty/share/fonts/Ricty*.ttf ~/Library/Fonts/

$ fc-cache -vf

結果は次のようになっている。



図:RICTYフォントの見本

2022年4月11日月曜日

Wordle(8)

Wordle(7)からの続き

Wordle支援プログラム word.py を改良して,出現しない文字を含む単語をとり除く処理を1行加えた。第3引数に出現しない文字を連結して並べたものを与える。

# usage: warp.py w.txt a.b.c def

import sys
import re

f = open(sys.argv[1], 'r')
datalist = f.readlines()
arg1 = sys.argv[2]
arg2 = sys.argv[3]

for data in datalist:
  if(re.search(r'\d* '+arg1, data) != None):
    if(re.search('['+arg2+']', data) == None):
      print(data, end="")

f.close()

2022年4月10日日曜日

Wordle(7)

Wordle(6)からの続き

wiki-5.txtは,WIkipediaデータセットのWikiText-103 word から5文字単語を取り出したものだった。これに対して,n-gramの出現頻度を,1-gram, 2-gram, 3-gramに対して求めるpythonプログラム ngrm.py を作る。1-gramはアルファベット1文字,2-gramは連続するアルファベット2文字,3-gramは連続するアルファベット3文字を表している。

ngrm.pyの出力結果は , を区切り文字として,出現回数とn-gramパターンの組なので,sort で区切り文字を , 数値として解釈した逆順をリダイレクトして適当なファイルに格納すると,1-gramから3-gramまで混ぜた出現頻度順のファイルが出来上がる。
# usage: ngrm.py wiki-5.txt | sort -n -r -t , >! alphabet 
import sys

a=[0 for i in range(26)]
b=[[0 for i in range(26)] for j in range(26)]
c=[[[0 for i in range(26)] for j in range(26)] for k in range(26)]

def n_gram(target, n):
  return [ target[idx:idx + n] for idx in range(len(target) -n + 1) ]

f = open(sys.argv[1], 'r')
datalist = f.readlines()

for data in datalist:
  for l in range(5):
    x = data[l]
    i = ord(x) - 97
    a[i] = a[i] + 1
    if l in range(4):
      y = data[l+1]
      j = ord(y) - 97
      b[i][j] = b[i][j] + 1
      if l in range(3):
        z = data[l+2]
        k = ord(z) -97
        c[i][j][k] = c[i][j][k] + 1

for i in range(26):
  if a[i] > 49:
    print(a[i],",",chr(i + 97))

for l in range(26*26):
  i = l // 26
  j = l % 26
  if b[i][j] > 49:
    print(b[i][j],",",chr(i+97)+chr(j+97))

for l in range(26*26*26):
  i = l // (26*26)
  j = (l // 26) % 26
  k = l % 26
  if c[i][j][k] > 49:
    print(c[i][j][k],",",chr(i+97)+chr(j+97)+chr(k+97))

f.close()
wiki-5.txtにおけるベスト50は次のとおりであった(数字は出現数)。

5730707 , e

4092848 , r

3965317 , a

3759319 , t

3424032 , s

3108801 , o

3068296 , i

2603632 , h

2600893 , l

2398537 , n

1734820 , d

1574948 , c

1501211 , u

1291809 , w

1195832 , m

1086248 , g

1076779 , er

964115 , f

962898 , th

882193 , b

801081 , p

746024 , te

729576 , y

674447 , he

651813 , ou

636278 , st

604734 , ar

563176 , hi

559096 , re

556926 , v

556020 , or

533535 , in

521374 , k

521197 , es

519713 , ch

518219 , ir

514744 , al

514410 , wh

493762 , the

473288 , ea

427832 , le

417701 , ic

412433 , whi

412193 , an

409812 , il

384013 , la

372098 , at

369592 , se

364056 , ed

362684 , ter


2022年4月9日土曜日

Wordle(6)

 Wordle(5)からの続き   

Wordleを解くための支援プログラムを次のようなものとする。「5文字単語のデータベースを用意して,ワイルドカードを含む与えられた候補にマッチする単語を全て選び出して表示する」。perlでプログラムを組みたいところだったが,pythonの練習をすることにした。

5文字単語データベースとしては,前回示した WikiText-103 word Level からwords.shで処理したものを用いる。その後は,久々の python プログラミングなので,よちよち歩きながら試行錯誤する。

(1) コマンドラインの引数は,sysモジュールをimportすれば,sys.argv[n]でアクセスできる。sys.argv[0]はpythonスクリプト名,sys.argv[1] 以下で複数の引数を受け渡す。
(2) ファイルのオープンとクローズの方法は記載の通り。第1引数は先に求めてある5文字単語データファイル名である。
(3) テキストファイルを1行づつ分割して読み込むには,datalist=f.readlines() などとするとその結果のリストが 得られる。
(4) perlのようにdatalistから1行づつ取り出して処理をするのが,for data in datalist: である。
(5) 正規表現によるマッチングには,re モジュールをimportしたうえで,re.search(r'正規表現' , 原データ) という形式による。これが Noneでなければマッチしていることになる。
(6) 第2引数で入力する5文字のワイルドカードをピリオド(. )にしておけばそのまま正規表現として使えてるので便利である。
(7) データファイルは,wc -l で生成しているので,頭に頻度を表した数桁の数字が空白を区切りに付加されているため,'\d* '+arg としている。文字列の結合には,プラス(+)演算子を用いる。
(8) print文で余分の改行を削除するには,end="" をつければよい。
# usage: word.py w.txt a.b.c
import sys
import re

f = open(sys.argv[1], 'r')
datalist = f.readlines()
arg = sys.argv[2]

for data in datalist:
# print(arg, data, re.search(r'\d* '+arg, data))
  if(re.search(r'\d* '+arg, data) != None):
    print(data, end="")

f.close()

2022年3月30日水曜日

Wordle(4)

Wordle(3)からの続き

Wordleをやっていると,そもそも英語の文章で出てくる単語のうち5文字である確率はどんなものか,また,最もよく出現するのは何文字の単語なのか,などなどが気になるようになった。

これを調べるために,与えられたテキストファイルやpdfファイルから単語を切り出して,その文字数の分布を調べるためのシェルスクリプトを作ってみた。

case \$3 in
"txt")
echo "txt";
;;
"pdf")
echo "pdf";
pdftotext \$2.pdf;
;;
*)
echo "undefined";
;;
esac

for ((i=1 ; i<=\$1 ; i++))
do
perl -nse 'while (/\b[a-z]{\$num}\b/ig) {print "\$&\n";}' -- -num=\$i \$2.txt | tr A-Z a-z > tmp.txt
cat tmp.txt | wc -l >> \$2-\s1.txt;
cat tmp.txt | sort | uniq | wc -l >> \$2-\s2.txt;
rm tmp.txt
done
昨日のスクリプトを少しだけ修正すればよかったが,ポイントは,シェルスクリプト中の反復の記述法である。繰り返し変数は$をつけて,perlのワンライナーに受け渡すことができた。あとはこれを使って実験してみれば良いのだが,それはまた次回のお楽しみ。

2022年3月29日火曜日

Wordle(3)

Wordle(2) からの続き

Wordleは英語の勉強になる。簡単な5文字の英単語でも知らないものがたくさんあって,自分の語彙力はやはり10歳並みだということが確かめられる。そのため,辞書の助けがないと5-6回で答えに辿り着くことは出来ない。

巷には,Wordle Word Finderなどというツールも登場しているが,これでは英語学習の役には立たない。それでも,5文字の英単語のリストを収集したいという目的のために,次のようなツールを作った。与えられたテキストファイルあるいはpdfやhtmlファイルをテキストに変換したものから,perlのワンライナーで n 文字の単語を切り出すものだ。

pandocは汎用の文書型変換ツールだけれど,pdfやhtmlからテキストを取り出すという想定がない。あくまでも整形された文書変換ツールだからだ。そこでテキストファイルの取り出しには,pdftotextやtextutilなどのコマンドに任せることにした。また,シェルスクリプトの引数はperlのワンライナーにそのまま送れないので, -- -perl_var=\$shell_varとして,perlの中で\$perl_varによって引用することになる。
#! /bin/zsh
# usage: word.sh 5 sample pdf (tst, txt, pdf, html)
# output sample-5.txt

case \$3 in
"tst")
pwd;
ls -al \$1.txt;
ls -al \$2.*;
;;
"txt")
echo "txt";
perl -nse 'while (/\b[a-z]{\$num}\b/ig) {print "\$&\n";}' -- -num=\$1 \$2.txt | tr A-Z a-z > \$2-\$1.txt;
;;
"pdf")
echo "pdf";
pdftotext \$2.pdf;
perl -nse 'while (/\b[a-z]{\$num}\b/ig) {print "\$&\n";}' -- -num=\$1 \$2.txt | tr A-Z a-z > \$2-\$1.txt;
;;
"html")
echo "html";
textutil -convert txt \$2.html;
perl -nse 'while (/\b[a-z]{\$num}\b/ig) {print "\$&\n";}' -- -num=\$1 \$2.txt | tr A-Z a-z > \$2-\$1.txt;
;;
*)
echo "undefined"
;;
esac

2022年2月10日木曜日

WHOのデータ

 WHOによる,COVID-19における世界各国地域別の感染者・死者数日別データをjson形式で取り込んでいたが,形式が変わったのか読み込めなくなってしまった。jsonの形を再び分析する気にならなかったので,探してみるとWHO Coronavirus (COVID-19) DashboardにCSVデータが見つかった。

データ形式をころころ変えるのはやめてほしい。これが日本だと,URLごとデータが消えてしまうので,それよりはましかもしれない。これまでのコードを生かしながら,修正プログラムを作った。

#!/usr/bin/perl
# 02/10/2022 K. Koshigiri
# usage: covid.pl 2022/02/22 3
# extract 3 days' data from 2022/02/22
# original data = https://covid19.who.int/page-data/table/page-data.json
# data https://covid19.who.int/WHO-COVID-19-global-data.csv

use Time::Local 'timelocal';
\$in = "whox";
\$out = "who-dat.csv";
\$cvd = "https://covid19.who.int/WHO-COVID-19-global-data.csv";

(\$sec, \$min, \$hour) = (0,0,0);
(\$year, \$month, \$day) = split '/', \$ARGV[0];
\$epochtime = timelocal(\$sec, \$min, \$hour, \$day, \$month-1, \$year-1900)+32400;

system("lynx -source \$cvd > \$in");

open(OUT,">\$out");
  print OUT "Date, Country Code, Country, Region Code, Confirmed, Cumulative Confirmed, Deaths, Cumulative Deaths \n";

  for (\$i=0; \$i<\$ARGV[1]; \$i++) {
    \$ut=\$epochtime+86400*\$i;
    {\$sec, \$min, \$hour, \$day, \$month, \$year) = gmtime(\$ut);
    \$year += 1900;
    \$month += 1;
    if(\$month < 10) {
      \$ym = "\$year-0\$month";
    } else {
      \$ym = "\$year-\$month";
    }
    if(\$day < 10) {
      \$dt = "\$ym-0\$day";
    } else {
      \$dt = "\$ym-\$day";
    }
    print "\$dt\n";

    open(IN, "<\$in");
    while() {
        if(/\$dt/) {
          print OUT;
       }
     }
    close(IN);
  }
close(OUT);


2022年2月3日木曜日

機械判読可能データ

 令和2年12月なのでデジタル庁ができる前のこと。統計表における機械判読可能なデータの表記方法の統一ルールが策定されていた。この積み重ねがデジタル化された社会を作るわけだが,そもそもデータを改竄することになんのためらいもない政府だとどうなのか。

総務省が,政府統計の総合窓口(e-Stat)に掲載する各省庁の統計表における機械判読可能なデータの表記方法の統一ルールを策定した。e-Statは,日本の政府統計関係情報のワンストップサービスを実現するため2008年から本運用を開始した政府統計のポータルサイトだ。総務省統計局が整備し,独立行政法人統計センターが運用管理している。

統計表における機械判読可能なデータ 作成に関する表記方法」として,Excel形式のデータ表の場合について,作成ガイドラインが示されている。

1-1 ファイル形式はExcelかCSVとなっているか
1-2 1セル1データとなっているか
1-3 数値データは数値属性とし,文字列を含まないこと
1-4 セルの結合をしていないか
1-5 スペースや改行等で体裁を整えていないか
1-6 項目名等を省略していないか
1-7 数式を使用している場合は,数値データに修正しているか
1-8 オブジェクトを使用していないか
1-9 データの単位を記載しているか
1-10 機種依存文字を使用していないか
1-11 e-Stat の時間軸コードの表記,⻄暦表記又は和暦に⻄暦の併記が されているか
1-12 地域コード又は地域名称が表記されているか
1-13 数値データの同一列内に特殊記号(秘匿等)が含まれる場合
2-1 データが分断されていないか
2-2 1シートに複数の表が掲載されていないか
ガイドラインは,それぞれの項目について悪い例と改善した例が具体的に示されていて,たいへんわかりやすい。この項目がそのままでチェックシートとなっていて,実践的に利用できる。

高等学校の必履修科目である教科「情報」では,これを取り上げればよいのに。プログラミング言語はperlにして・・・というかプログラミング言語はなんでもよいので,データストリームを処理するアルゴリズムを中心にする。htmlファイルやCSVファイルから必要な情報を取り出して加工し,最終的なデータ処理やプレゼンテーションに結びつけるとかいうテーマの演習を積み重ねたら,日本の情報化が一段と進むものと思われる。


2021年11月14日日曜日

ゆきだるさん

 「ゆきだるさん」で検索しても,その語源や出典が判然としない。ワンピースに「雪だるさん」が出てきているようだが,これなのか。自分が子供のころはなかったので,最近発明されたような気もする。

プログラミングの練習として,「ゆきだるさん」を描画するProcessingのコードが落ちていたので,写経してみた。

size(600, 600);
background(200, 200, 200);

strokeWeight(4);
stroke(60, 60, 60);
ellipse(300, 200, 150, 150);
ellipse(300, 380, 240, 240);
rect(-10, 480, 610, 480);

fill(0, 0, 0);
arc(270, 200, 20, 30, -0.6, 5);
arc(330, 200, 20, 30, -0.6, 5);

fill(255, 0, 0);
quad(280, 130, 370, 170, 390, 90, 320, 60);

strokeWeight(10);
stroke(144, 64, 36);
line(220, 330, 160, 240);
line(380, 330, 450, 240);


図:Processingによる「ゆきだるさん」

2021年11月4日木曜日

TikZの反復と分岐

数理的なモデルと関連した 図を書くのにPowerPointはちょっと使いにくい。MathematicaJuliaでも表現力の自由度が足りない。そこで,PGF/TikZの登場となる。その機能を十分に生かそうとすると,TikZ環境でのプログラミングが必要であり,変数の処理や反復・分岐などが求められる。

PGF/TikZについては,Tantauの1300pを超えるマニュアルがあるのだけれど,これがまた詳しすぎて読みにくい。そんなわけで,日本語の適当な解説書を探すのだけれどこれがまたないのだった。そんなわけで,ボルツマン分布の概念図を作図しようとしていきなりつまづいた。

反復の方は\foreachを使うというところまではいいのだが,これに条件分岐を入れるとなんだかやヤコしい。しかも,堪え性のない老人は,最近の大学生のように真面目に調べずにネット情報を漁ってつまみ食いしようとするものだから,訳がわからない状態になるのであった。

小学生からのプログラミング教育は,いっそのことLaTeX+PGF/TikZにしたらいいのではないかとしみじみ思う今日この頃です。Pictogrammingと合体できないものか。まあグダグダ言いながらなんとか,解決方法の1つが見つかった。

/begin{tikzpicture}
\draw[step=2, dotted] (0,0) grid (13,2);
\foreach \x [count=\i]in {1,3,...,13}
{
\draw (\x,-0.5) node{\$(n_\i,u_\i)\$};
\foreach \y in {1,...,8}
\pgfmathsetmacro{\col}{ifthenelse(rnd*8 > \y,"white",ifthenelse(rnd*8 <\y,"gray","white"))}
\draw[fill,\col] (\x+rnd*1.6-0.8, rnd*1.6+0.2) circle(0.05);
}
\end{tikzpicture}

少し違うタイプの問題が出ても対応できる自信はまったくない,勉強不足なのであった。


図:TikZの例,\foreachとifthenelseとrndを組み合わせたもの


2021年9月13日月曜日

クローラ

 クローラ(Crawler)とは「ウェブ上の文書や画像などを周期的に取得し,自動的にデータベース化するプログラムである」。ボット(bot)・スパイダー・ロボットなどとも呼ばれるが,google検索ではロボットと表現されている。

25年ほど前から数年間,学校のホームページ宛の管理者宛てにアンケート調査を繰り返していたことがある。ホームページのURLは目視と手動で集めるたものだ。これに対して,perlのプログラムで(wgetを使って)何階層かのページを取得したうえで,メールアドレスを取り出すという操作をしていた。いまだと(当時でも)ほとんど危ない技だ。

さて,google検索において立て続けに類似パターンの検索をすると,googleから「おまえロボットちゃうか」と叱られるのである。そのとき出てくる警告ページを図に示す。なんのことはない,CAPTCHAのロボットチェックをクリアすればよいだけである。

図:google検索における警告メッセージ

今回,これが現れたのは,ひらがな回文タイプの「なか○かな」の○部分にあ〜んまでを順にいれて調べようとしたからだ。なぜかというと,TikToker/YouTuberのなかねかなの「モテすぎて草,誘ってて森」が流行っていたのだ。

「TikTokでよくみるイケメンが カメラ目線で 音に乗せて にこにこしている動画 あれいつも 思うけど めちゃくちゃ私のこと 誘ってて草 完全に私のこと 好きで森・・・(作詞 かなねかな)」のフレーズが耳から離れない。

なかかな(かな先生)といえば,バイオリンはじめチャンネルだったので,もしかしてこのパターンのアカウントが沢山あるのかと調べてみたところ,TwitterやInstagramやYouTubeで「なか○かな」のユーザがぞろぞろ見つかった。

「かな」が人名を表すと同時に俳句の句末の切れ字になっているのでよく出てくるのかも。

2021年9月9日木曜日

バグの日

今日,9月9日は重陽じゃなくてバグの日である。重陽の節句は旧暦にあてはめなければ菊の香りがただよってこない。 上巳端午七夕も同様。

残念ながら,日本のソフトウェア会社が8月9日をバグの日として語呂合わせで登録してしまったので,話が面倒なことになっている。パクチーの日と野球の日と鍼・灸・マッサージの日とパーク(駐車場)の日と薬草の日だけでもおなかがいっぱいなのに,国際的に通用しないものを。

1947年の9月9日に,コンピュータ科学者のグレース・ホッパーハーバード・マークIIというコンピュータの不具合を調べているときに,本物の虫がリレーに挟まっているのを記録として貼り付けたことに由来して,コンピュータ(ソフトウェア)おけるバグという表現が定着していく。


写真:Harvard MarkIIのログブックのバグ(Wikipedikaから引用)

昨日から,これまで機嫌よく動いていたWHOの新型コロナウィルス感染症に関するjsonデータ処理プログラムが動かなくなってしまった。最初は自作のフィルタfspのせいかと思ったが,よく調べてみると,jsonデータを取得するlynxのところが原因で引っかかっている。

lynx -source としているのにもかかわらずダウンロードされるのが11MBのバイナリファイル。wget でも同様だった。ところが直接URLをブラウザ(lynxでもOK)でたたいてからテキストが表示された後にダウンロードすれば,適切な40MB程度のテキストファイルが取得できた。うーん,どうしてだろうか,面倒なことだ。