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

2021年5月20日木曜日

MRSO

 MRSO(マーソ)は,防衛省・自衛隊による東京と大阪のコロナワクチンの大規模接種センターの予約システムのトラブルで話題の企業だ。7月中に65歳以上の高齢者3600万人の接種を完了させるという菅官邸のごり押し政策の象徴として,1日に1万人/5千人(東京/大阪)の集団接種を実施するセンターを設けるということで進められている。大阪では予約初日に25分で25,000人分の予約がいっぱいになってしまった。

この予約システムの不備が,朝日新聞出版アエラ,毎日新聞,日経クロステックなどによって検証報道された。東京会場の予約には,自治体番号,接種券番号(10桁),生年月日を入力して進むようになっているのだが,そのいずれもが出鱈目の番号で予約ができてしまうことや,対象期間外でも予約可能になっているという酷いシステムだったことが明らかになった。

これに対して,岸防衛相や兄の安倍元首相が,朝日新聞と毎日新聞に絞って非難する発言をしている。日経はいいのか。安倍のtwitterは岸の発言を引用しつつ「朝日、毎日は極めて悪質な妨害愉快犯と言える。防衛省の抗議に両社がどう答えるか注目」ときた。極めて悪質な国会審議妨害犯の言葉にあきれて口が塞がらない。

これに対してアエラは正当な反論をしている。一般論としてはセキュリティホールが見つかった場合にこれを報道する/しないの判断には慎重さが要求される。しかし,今回の事例はセキュリティホールですらなく,防衛省・自衛隊の発注仕様そのものが問題となっている。

MEROという小さな会社は竹中平蔵が経営顧問を務めているということで,これだけでもキナ臭い話だ。ただ,一月万冊の清水有高によれば,このベンチャー企業はこれまでも人間ドックやインフルエンザ予防接種システムを多くの自治体などに提供しており十分な実績があるところだった。

つまり,発注側の防衛省・自衛隊が,7月末という菅首相の無理難題な期限設定に合わせるために十分な検証なしにシステムを発注し納入させてしまったことが問題だった。こんないい加減な組織に日本の防衛を任せているという恐怖に慄く今日この頃である。

それにしても日本政府のシステム設計能力は低すぎる。厚生労働省の動きが悪いとみて西村経済再生相をコロナ対策にあて,さらに河野太郎をワクチン接種推進担当相とした。それでも不満で,総務省を使って地方自治体に圧力をかけて,7月中の高齢者接種が可能であると言わせた。その上で,たかだか全体の1%の寄与のために(1日100万件に対する1万件),従来のシステムと全く独立に防衛省・自衛隊を使うという有様だ。この状態でデジタル庁を作るととんでもない未来が待ち構えると予想されるのだった。

[1]「ワクチン予約システムに欠陥」~この報道は犯罪?不適切?~メディアへの抗議や批判を検証する(江川紹子,Yahoo News,2021.5.20)

[2]朝日新聞出版、毎日新聞の「架空予約」報道は「悪質な妨害愉快犯」なのか?(米山隆一,論座,2021.5.22)


2021年5月18日火曜日

MacBook Air M1(4)

 MacBook Air M1(3)からの続き

4月18日にMacBook Air M1 がやってきてからちょうど1ヶ月になる。このところCPU負荷がつねに30-40%を越えて,CPU温度が70-80℃となっていた。Apple シリコンのM1チップを搭載したMacは発熱が少ないのが特徴だったはずなのになぜだ。すべてのアプリを終了させてスリープした状態で一晩寝かせ,朝を迎えてもパームレスト部分が暖かいのである。

さすがにおかしいと思って,アクティビティモニタで調べてみると,なんとアンチウィルスのSophosが非常に大きなCPUタイム消費の原因だった。さっそくこれを取り除いた。ウィルス対策は,ClearnMyMacのアンチウィルス機能に頼ることにする。おかげで,CPU負荷は5%,温度は35℃前後まで下がった。やれやれ。

なお,MacBook Air M1(2)で書いていた「jupyterlabが動かない問題」はしばらく前に以下のようにして解決した。これで残ったのは pythonの機械学習ライブラリ scikit-learn が動かないことくらいである。

/opt/homebrew/opt/python@3.9/bin/python3.9 -m pip install --upgrade pip
pip3 install jupyterlab
jupyter lab -> error
jupyter lab build -> error
brew install node.js
jupyter lab build
jupyter lab

2021年4月26日月曜日

Processingをコマンドラインから

 プログラミング言語のProcessingはグラフックスの表現力が高いため,当初は芸術系などでも多用されていた。1.0が2008年,2.0が2013年,3.0が2015年,4.0が2021年以降(予定)のリリースだが,1.0の頃から使っていた。たぶん。マイクロプロセッサGainerの制御言語としても使われていたので,大阪教育大学大学院の理科教育専攻の授業でも取り上げたことがある。

適当なJava Depeloper Kitを用いることでMacBook Air M1にも導入することができた。これはこれで良いのだが,Processingというアプリを立ち上げた環境の中でしか実行できないのがちょっと気になる。調べてみると,UNIXのコマンドラインからでも実行できそうだ。早速,試してみた。

(1) Processingを起動して,適当なスケッチファイルを開く(空でも良い)。

(2) Processingのコマンドバーのメニューからツールを選び 「"processing-java"をインストール」を実行する。これで processing-java というコマンドライン命令がインストールされる。

(3) ユーザ名を koshi として,pdeファイルの場所を /Users/koshi/sample とする。sampleというフォルダの中には,sample.pde という processing ファイルが格納されている。

(4) processing-java --sketch=/Users/koshi/sample --output=/Users/koshi/sample --run とすればコマンドラインから実行できる。

(5)  processing-java --sketch=/Users/koshi/sample --output=/Users/koshi/sample --build とすれば sample.class が生成される。のだが,その先へは進めなかった。


2021年4月22日木曜日

WHOのCOVID-19データ(4)

 WHOのCOVID-19データ(3)からの続き

WHOのCOVID-19統計のjsonデータの構造が変わったようで,scriptの出力に不具合が生じている。プログラミングが面倒である。これまでは,国・地域別のブロックの中に一連の時系列データが含まれていたところ,このたびは,時系列ブロックの中に一連の国・地域別データが並んでいる。前回よりもプログラムの構造が汚くなってしまった。日時データが通常の形式になっていたので,unix time を経由しなくても良いかと思ったが,そうは問屋が下さなかった。(注 \$ は $と読み替え)


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#!/usr/bin/perl
# 4/24/2021 K. Koshigiri
# usage: json.pl 2021/04/24 3
# extract 3 day data from 2021/04/24
# original data = https://covid19.who.int/page-data/table/page-data.json

use Time::Local 'timelocal';

$tmp = "tmpx";
$in = "whox";
$out = "who-dat.csv";
$jsn = "https://covid19.who.int/page-data/table/page-data.json";
($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 \$jsn | fsp -u > \$tmp");

open(OUT, ">\$in");
open(IN, "<\$tmp");
while(
) {
  s/],/],\n/g;
  print OUT;
}
close(IN);
close(OUT);

open(OUT,">\$out");
print OUT "Date, Country Code, Region Code, Deaths, Cumulative Deaths, Deaths Last 7 Days, Deaths Last 7 Days Change, Deaths Per 100k, Confirmed, Cumulative Confirmed, Cases Last 7 Days,Cases Last 7 Days Change, Cases Per 100k, WkCasePop, WkDeathPop\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";
  $sw=0;
  open(IN, "<$in");
    while(
) {
      s/\]//g;
      s/\[//g;
      s/"rows"://g;
      if(/"totals":/) {
        if(/$dt/) {
          $sw=1;
        } else {
          $sw=0;
        }
      }
      if($sw==1 && /"[A-Z][A-Z]","[A-Z]{4,5}"/ ) {
        print OUT "$dt,";
        print OUT;
      } elsif($sw==1 && /" ","[A-Z]{4,5}"/) {
        print OUT "$dt,";
        print OUT;
      }
    }
  close(IN);
}
close(OUT);


2021年3月12日金曜日

TikZの円弧

 TikZの円弧の描画方法が微妙だったので,まとめておく。

昨日のレンズの作図で苦労したのであった。\draw circle で,中心と半径を指定した状態ではは開始角度と終了角度の指定ができない。\draw arcを使うことになるが,このときは,中心座標$(x_0,\ y_0)$ではなく,開始点座標 $(x_i,\ y_i)$をいれることになる。中心座標はこれから,次式で計算される位置になる。一般的な楕円に拡張して半径を$(a,\ b)$とすると,

\begin{equation} \begin{aligned} x_0 &= x_i - a \cos \theta_i \\ y_0 &= y_i - b \sin \theta_i \end{aligned}\end{equation}

これが簡単な場合もあるだろうが,始点や終点や中心を決めたい場合は面倒ではないのか。

\ begin{tikzpicture}
\tikzstyle{every node}=[font = \large];
\draw (0,0) node[below left]{O};
\draw[->] (-4,0) -- (4,0) node[right]{$x$};
\draw[->] (0,-4) -- (0,4) node[above]{$y$};
\draw[step=1.0, dotted] (-4,-4) grid (4,4);
\draw (0,1) circle(1);
\draw (1,2) circle(1 and 2);
\draw (2,3) ellipse(2 and 1);
\filldraw[orange!50!white,semitransparent] (-2,-1) arc (135:-30:2);
\filldraw[cyan!50!white,semitransparent] (-2,-1) arc (135:210:2);
\filldraw[gray] (-0.59,-2.41) circle(1pt);
\filldraw (-2,-1) circle(1pt);
\draw[red, thick] (-3,-2) arc (135:-30:2 and 1);
\draw[blue, thick] (-3,-2) arc (135:210:2 and 1);
\filldraw[gray] (-1.59,-2.71) circle(1pt);
\filldraw (-3,-2) circle(1pt);
\node at (-2.5,3.5) {$x_0 = x_i - a \cos \theta_i$};
\node at (-2.5,2.5) {$y_0 = y_i - b \sin \theta_i$};
\ end{tikzpicture}


図 TikZでの円弧の描画方法


2021年2月7日日曜日

角運動量代数(1)

大学院への進学が決まって,森田正人先生に最初に宿題として出されたのが,Roseの「角運動量の基礎理論(みすず書房)」 を読んでおくことだった。「Clebsh-Gordan係数の一般式を導出する必要がありますか」という質問に対する答えは,「まあできれば・・・」というようなものだったので,できなくてもよいと勝手に解釈してそこはサボることにした。

当時のベータ崩壊やミューオン捕獲の角度相関係数の計算や軽い核の原子核殻模型の計算には,Racah係数やWinger Symbols(3-j係数,6-j係数,9-j係数)が不可避であり,毎日のように戯れていた。

Fortranで自作したプログラムは,整数の階乗や二項係数を予め配列に保存しておいて,COMMON文で必要な関数で呼び出すという古典的な手法を使っていた。弱い相互作用の低エネルギー過程では,原子核反応などと違って,中間状態を含めてもあまり大きな角運動量が登場しないので,それでなんとかなっていた。

1998年のL. Weiの論文,"New formula for 9-j symbols and their direct calculation" (Computers in Physics, Vol. 12, No. 6, 632-634)では,この9-j symbolを高速に計算するアルゴリズムがあるということで読んでみた。なんのことはない,自分が1980年代に作ったコードとまったく同じ方法でしかなかった。6-j symbolの積和の表式を二項係数にまで落とし込んだだけなのだ。

2021年1月30日土曜日

YouTube(5)

 YouTube(4)からの続き

ユーチュラのランキングからYouTuberの分析をするため,手動のデータスクレイパーをPerlで書いてみた。迷惑にならないように,1秒のsleepを入れながらHTMLファイルにアクセスしている。取得したデータを眺めてみた結果についてはもう少し考えてから報告する予定。

HTMLファイルから必要なデータだけ抜き出したCSVファイルを作るのだけれど,その後はExcelで解析する。面倒なのは,ExcelがUTF-8のCSVファイルを読んでくれないこと。ごちゃごちゃすれば回避できそうだが,それくらいなら事前にShift-JISに変換したほうが早い。

- - - - - - - - - - - - - - - - - - - -
#!/usr/local/bin/perl
# 1/30/2021 K. Koshigiri
# usage: yutura.pl 1 10
# extract data from p=1 to p=10
# original data = https://ytranking.net/ranking/?p=x

\$ytr = "https://ytranking.net/ranking/";

\$p1=$ARGV[0];
\$p2=$ARGV[1];
\$tmp="tmpy-\$p1-\$p2";
system("touch \$tmp");
\$out = "ytr-\$p1-\$p2.csv";

for(\$p=\$p1; \$p<=\$p2; \$p++) {
#  system("lynx -source \$ytr\?p=\$p | fsp -u >> \$tmp");
#  sleep 1;
print "\$p,\n";
}

open(OUT, ">\$out");
open(IN, "<\$tmp");
while(
) {

  if(/\t<p class="title">(.*)<\/p>\t<aside>/
) {

2020年12月22日火曜日

JSON

 JSONは, Javascript Ibject Notation の略であり,JavaScript(ECMAScript)のデータ定義文をベースとした簡易データ定義言語である。共通データ定義言語として,XMLにかわってJSONが利用されるようになった。以下にJSONの形式をまとめる。

オブジェクト:" "で囲まれた"キー"(文字列型)と"値"の対をコロンで結び,カンマで区切って並べたものを{}で包んだもの,階層構造が可能なので,値には,オブジェクト,配列,数値,文字列,真偽値,ヌル値がくる {"name":"koshix", "age":67}

配列:ゼロ個以上の"" で囲まれた"値"をカンマで区切って並べたものを[]で包んだもの,オブジェクトの値がすべて値として取れるので,オブジェクトや配列の配列も可能["seiryu","suzaku","byakko","genbu"]

数値:10進法整数,10進法浮動小数点(1.0e-10も可)

文字列:" "で囲まれたUnicode文字列,\" (ダブルクォーテーション) \\ (バックスラッシュ) \/ (スラッシュ) \b (バックスペース) \f (フォームフィード) \n (ラインフィード) \r (キャリッジリターン)\t (タブ) \uxxxx (Unicode文字)

真偽値:true, false(真偽を示す,必ず小文字で)

ヌル値:null(値がないことを示す,必ず小文字で)

[1]Juliaでのjsonの利用

2020年12月21日月曜日

python3の入出力

python3の入出力周りをまとめた。


(1)標準入出力( test1.py < a > b )
#!/usr/local/bin/python3
import sys
a = []
for l in sys.stdin:
    a.append(l)
    print(l.rstrip())
print(a)

(2)ファイル入出力 (test2.py )
#!/usr/local/bin/python3
with open('kajitu.txt','w',encoding='utf-8') as f:
    with open('fruits.txt',encoding='utf-8') as inf:
        for row in inf:
            columns = row.rstrip()
            print(columns)
            f.write(columns) 

(3) コマンドライン引数 (test3.py x y )
#!/usr/local/bin/python3
import sys
print('sys.argv : ', sys.argv)
print('type(sys.argv) : ', type(sys.argv))
print('len(sys.argv) : ', len(sys.argv))
print('sys.argv[0] : ', sys.argv[0])
print('sys.argv[1] : ', sys.argv[1])
print('sys.argv[2] : ', sys.argv[2])

2020年12月13日日曜日

素数の計算(2)

素数の計算(1)の続き

Juliaの素数計算が遅い原因を絞り込みたい。python3とJuliaを比べると,素数判定のisprimeや範囲指定素数のprimerangeやprimesではともに高速であるが,順序指定素数のprimeにおいて,juliaはpythonの200倍程度時間がかかっている。しかし,同じ範囲の素数は,素数判定や範囲指定素数では高速に計算できているので,juliaのprimeのコードがややこしいことになっているのが問題だと思われる。

python3では, 
- - - - - - - - - - 
from sympy import *
import time
start_time=time.time()
n=179424673
m=10**7
for p in range(n,n+50):
    if isprime(p)==1:
        print(p)
lap1_time=time.time()
print(list(primerange(n, n+50)))
lap2_time=time.time()
for i in range(m,m+4):
    print(prime(i))
end_time=time.time()
print(lap1_time-start_time)
print(lap2_time-lap1_time)
print(end_time-lap2_time)

- - - - - - - - - - 
179424673
179424691
179424697
179424719
[179424673, 179424691, 179424697, 179424719]
179424673
179424691
179424697
179424719
0.0050160884857177734
0.002671957015991211
0.5041019916534424

julia1.5.1では 
- - - - - - - - - - 
using Primes

function test1(n)
  for p in n:n+50
    if(isprime(p))
      println(p)
    end
  end
end

function test2(n)
  println(primes(n,n+50))
end

function test3(n)
  for p in n:n+3
    println(prime(p))
  end
end

@time test1(179424673)
@time test2(179424673)
@time test3(10^7)

- - - - - - - - - - 
179424673
179424691
179424697
179424719
0.000310 seconds (146 allocations: 3.500 KiB)
[179424673, 179424691, 179424697, 179424719]
0.000521 seconds (207 allocations: 8.109 KiB)
179424673
179424691
179424697
179424719
128.789228 seconds (117.41 M allocations: 1.750 GiB, 0.34% gc time)


2020年12月10日木曜日

WHOのCOVID-19データ(2)

WHOのCOVID-19データ(1)からの続き

 少し改良してみた。あいかわらず,汚いプログラムではある。


#!/usr/local/bin/perl
# 12/10/2020 K. Koshigiri
# usage: json.pl 2020/12/05 5
# extract 5 day data from 2020/12/05
# original data = https://covid19.who.int/page-data/table/page-data.json

use Time::Local 'timelocal';
\$tmp = "tmpx";
\$in = "whox";
\$out = "who-dat.csv";
\$jsn = "https://covid19.who.int/page-data/table/page-data.json";

(\$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 \$jsn | fsp -u > \$tmp");

open(OUT, ">\$in");
open(IN, "<\$tmp");
while() {
  s/],/],\n/g;
  print OUT;
}
close(IN);
close(OUT);

open(OUT,">\$out");
print OUT "Date, Country Code, Unix Time, Region, Deaths, Cumulative Deaths, Deaths Last 7 Days, Deaths Last 7 Days Change, Deaths Per Million, Confirmed, Cumulative Confirmed, Cases Last 7 Days,Cases Last 7 Days Change, Cases Per Million\n";

for (\$i=0; \$i<\$ARGV[1]; \$i++) {
  \$ut=\$epochtime+86400*\$i;
  (\$sec, \$min, \$hour, \$mday, \$mon, \$year) = gmtime(\$ut);
  \$year += 1900;
  \$mon += 1;
  print "\$ut\n";
  open(IN, "<\$in");
  while() {
    s/\]//g;
    s/\[//g;
    if(/Country.*"value":"(.*?)"/) {
      $ct=$1;
      print OUT "$year-$mon-$mday,$ct,";
    }
    if(/$ut/) {
      print OUT;
    }
  }
  close(IN);
}
close(OUT);

2020年12月9日水曜日

WHOのCOVID-19データ(1)

WHOがまとめている,COVID-19についての各地域の感染者数や死亡者数の経時データは以前はダッシュボードのCSVファイルとしてアクセスできたが,今は,一日分のCSVファイルしか提供されていない。経時データはグラフの形で見ることができる。しかし,JSON形式の経時データにはアクセスできるので,これから必要な情報を取り出すperlスクリプトを作った。

古いperlの知識しかないので,動作が思ったとおりではないけれど,とりあえず第1段階の結果が出た。引き続きプログラムを精査していきたいが・・・。

#!/usr/local/bin/perl
# 12/10/2020 K. Koshigiri
# usage: json.pl 2020/12/05 5
# above sample extracts 5 day data from 2020/12/05
# original data = https://covid19.who.int/page-data/table/page-data.json

use Time::Local 'timelocal';
\$tmp = "tmpx";
\$in = "whox";
\$out = "who-dat.csv";
\$jsn = "https://covid19.who.int/page-data/table/page-data.json";
(\$sec, \$min, \$hour) = (0,0,0);
(\$year, \$month, \$day) = split '/', \$ARGV[0];
\$epochtime = timelocal(\$sec, \$min, \$hour, \$day, \$month-1, \$year-1900)+32400;

open(IN, "<\$tmp");
system("lynx -source \$jsn | fsp -u > \$tmp");
open(OUT, ">\$in");
while(
) {
  s/],/],\n/g;
  print OUT;
}
close(OUT);
close(IN);

for (\$i=0; \$i<\$ARGV[1]; \$i++) {
  \$ut=\$epochtime+86400*\$i;
print "\$ut\n";
open(IN, "<\$in");
open(OUT,">\$out");
while(
) {
  s/\]//g;
  s/\[//g;
  if(/Country.*"value":"(.*?)"/) {
    $ct=$1;
    print OUT "$ct,";
  }
  if(/$ut/) {
    print OUT;
  }
}
close(OUT);

close(IN);
}


2020年12月5日土曜日

UNIX Time

WHOのCOVID-19のデータ形式が先月の途中から変更されてしまったので,対応に苦慮しているところ。とりあえず,perlで処理するための準備をする。

#!/usr/local/bin/perl

# usage: time.pl 1607100000

# usage: time.pl 2020/12/05 21:30:00

# conversion of UNIX time & local time


use strict;

use warnings;

use Time::Local 'timelocal';


if ( @ARGV == 1 ) {


my \$unix_time = \$ARGV[0];

my (\$sec, \$min, \$hour, \$mday, \$mon, \$year);


(\$sec, \$min, \$hour, \$mday, \$mon, \$year) = gmtime(\$unix_time);

\$year += 1900;

\$mon += 1;

printf("GMT:\t%04d/%02d/%02d %02d:%02d:%02d\n", \$year ,\$mon, \$mday, \$hour, \$min, \$sec);


(\$sec, \$min, \$hour, \$mday, \$mon, \$year) = gmtime(\$unix_time);

\$year += 1900;

\$mon += 1;

\$hour +=1;

printf("CET:\t%04d/%02d/%02d %02d:%02d:%02d\n", \$year ,\$mon, \$mday, \$hour, \$min, \$sec);


(\$sec, \$min, \$hour, \$mday, \$mon, \$year) = localtime(\$unix_time);

\$year += 1900;

\$mon += 1;

printf("LOCAL:\t%04d/%02d/%02d %02d:%02d:%02d\n", \$year ,\$mon, \$mday, \$hour, \$min, \$sec);


} elsif (@ARGV == 2) {


my (\$year, \$month, \$day) = split '/', \$ARGV[0];

my (\$hour, \$min  , \$sec) = split ':', \$ARGV[1];

my \$epochtime = timelocal(\$sec, \$min, \$hour, \$day, \$month-1, \$year-1900);

print \$epochtime."\n";


}


2020年11月30日月曜日

素数の計算(1)

 ソフィー・ジェルマン素数の続き

件の記事の中には,「p=999671で 2p+1=1999343,が約数となる。 2^p−1=2^99671−1 は10進法で300932桁となったが,開発用等ではないスペックのかなり低いパソコンでも2~3分で計算してくれた」とあったので追試しようとして,はまってしまった。

Mathematicaでは,このあたりのソフィー・ジェルマン素数を次のように一瞬で計算した。
In[1]:= Timing[ Do[p = Prime[2^16 + i];  If[Mod[p, 4] == 3 && PrimeQ[2*p + 1],  Print[p, " : ", Mod[2^p - 1, 2*p + 1]]], {i, 12900, 13000}]]
999611 : 0
999623 : 0
999671 : 0
1000151 : 0
1000211 : 0
1000403 : 0
Out[1]= {0.007209, Null}

In[2]:= Timing[Print[p = Prime[10^8], " ", PrimeQ[p]]]
2038074743 True
Out[2]= {0.000185, Null}
そこで,10^8番目の素数をpython3で計算して判定すると,
from sympy import *
import time
start_time=time.time()
p=prime(10**8)
end_time=time.time()
print(p,isprime(p),end_time-start_time)

2038074743 True 2.994921922683716

同様に,10^8番目の素数をjulia 1.5で計算して判定すると, 

using Primes
n=10^8
function sgp(n)
  p=prime(n)
  println(isprime(p)," ",p)
end

@time sgp(n)
true 2038074743
420.535971 seconds (333.45 M allocations: 4.970 GiB, 0.24% gc time)

なお,p=999671は,prime(78476)であり,この計算時間はjuliaでも0.153秒だった。それにしてもこの遅さはいったい何ということでしょう・・・? 

2020年10月28日水曜日

IPSJ MOOC

2022年度から実施される高等学校の必履修科目「情報I」にプログラミングが導入されることから,情報処理学会が教員研修や授業で利用できる動画教材(IPSJ MOOC)を順次公開している。文部科学省が「高等学校情報科「情報Ⅰ」教員研修用教材」を公開していて,この第3章,第4章に準拠しているようだ。

教育用のプログラミング言語としてはpythonを用いている。50年前のFORTRAN,BASICから始まり,CやPascalを経由してJavaやJavascriptをかすめながらここに至っている。自分のgoogleアカウントでGmailにログインした後,Google Colaboratory で学習することになっている。

2020年9月9日水曜日

首相動静(2)

 昨日に引き続いて時事通信サイトの首相動静ページのダウンロードプログラムを整える。過去月分は数年前まで同じフォーマットで保存されているようだ。当月分だけが別のURLに置かれている。いずれにせよ,月ごとにまとめて取り出すほうがよろしいので次のようにする。

(1) 与えるのは年yと月mのデータ (2) これからy−m.txtという保存用のファイルを指定する。 (3) perlのTime::Piece モジュールを用いて当月の最終日を得る。(4) これを使うと,時事通信のURL名を指定できる。ファイル名は 202008_01 が8月31日 202008_31が8月1日と逆順になっていることに注意が必要。(5) 1桁の日付は0を補完する必要がある。(6) ファイルへのアクセスはlynx -source を用いるが,これを日付について繰り返えす。結果はコード変換した後にテンポラリファイルに保存しておく。(7) これから,首相動静の内容コンテンツを取り出す。同じものが三重に存在するので1つ目だけを残して,さきほどの保存用ファイルにアペンドしていく。

なお,漢字コードはEUCを仮定しているため,このプログラム自身もEUCで書いてある。結果をmacのデスクトップ上のJEditで読むと漢字コードが毎回おかしいといわれる。なにか変なコードが混じってくるのかもしれない。EUCに指定した上で,UTF-16で保存してみた。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#!/usr/local/bin/perl
#<!- -------------------------------------- -->
# shusho dousei from jiji dot com news
# 09/09/2020 K. Koshigiri
# % ./shusho.pl year month -> year-month.txt
# date = 01...31 etc. (dates of month) - d
# get data from https://www.jiji.com/
#<!- -------------------------------------- -->

use Time::Piece;
\$tmp="tmpx";
\$r="https://www.jiji.com/jc/v2?id=ssds";
\$y=@ARGV[0];
\$m=@ARGV[1];
\$g=\$y."-".\$m;
open(OUT, ">> \$g");

\$t = Time::Piece->strptime(\$g."-01",'%Y-%m-%d');
\$mld = \$t->month_last_day;
print "今月末日は$mld日\n";

for(
\$k = 1;\$k <= \$mld;\$k++) {
\$tmpk = \$tmp.\$k;

\$kd = \$mld - \$k + 1;
if( \$kd < 10) {
 \$jd="0".\$kd;
};
else {
 \$jd = \$kd;
}
\$f=\$r.\$y.\$m."_".\$jd;
print "\$y年\$m月\$k日 \$f \n";

open(HP, \$tmp);
system("lynx -source \$f | fsp -u | nkf -e > \$tmp");
close(HP);

\$i=0;
open(IN, \$tmp);
print OUT "\n \$y年\$m月\$k日 (\$f) \n";
while(<IN>){
 \$a="";
 if(/br/ && /午/ && !/href/) {
  if(/(<p>.*)/) {
   \$i++;\$a=\$1;
   if(\$i eq 1) {
    print OUT "\$a \n";
   }
  }
 }
}
close(IN);
}
close(OUT);
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

2020年9月8日火曜日

首相動静(1)

 時事通信のページから首相動静を取り出すためにperlプログラムを組んだら,日本語でつまづいた。EUCのままでよかったのだけれどあれこれもがいたため。macの標準ターミナルの漢字コードも,大学のサーバーへのアクセスの都合上EUCコードにしてある。jcode.plは結局不要だった。

lynxで時事通信のJIJI.COMからソースをダウンロードしてfspで改行コードを変換し,nkfでEUCに変換したものを作業ファイルとして保存しておく。作業ファイルから1行づつ取り出して,条件を満たした行にその日の首相動静が格納されているはず。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
#!/usr/local/bin/perl
#<!- -------------------------------------- -->
# shusho dousei from jiji dot com news
# 09/09/2020 K. Koshigiri
# % ./shusho.pl month date outfile 
# date = 01...31 etc. (dates of month) - d
# get data from https://www.jiji.com/jc/
#<!- -------------------------------------- -->
\$y="https://www.jiji.com/jc/v2?id=ssds2020";
\$m=@ARGV[0];
\$d=@ARGV[1];
\$f=$y.\$m."_".\$d;
print "\$f \n";

\$out=@ARGV[2];
\$tmp="tmpx.txt";
\$i=0;

open(HP, \$tmp);
system("lynx -source \$f | fsp -u | nkf -e >> \$tmp");
close(HP);

open(IN, \$tmp);
open(OUT, "> \$out");
while(){ $i++; \$a="";
  if(/br/ && /午/ && !/href/) {
    if(/(.*)/) {
      \$a=\$1;
      if(\$i eq 1) { print OUT "\$a \n";}
    }
  }
}
close(OUT);
close(IN);
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

2020年5月2日土曜日

WHOのSituation reports

WHOがCOVID-19の特設ページで毎日掲載しているSituation reportsの様式が,5月1日版から模様替えした。なんでもいいからCSVで出してほしい。日本の厚生労働省とかわらないのか。

これまでは,もとのpdfファイルから,pdftotext(コマンドラインツール)でテキストにしたものと, PDFelement6 Pro(無料版)でエクセル化したものとを組み合わせて,国・地域別データを整理した日次統計テキストファイルをつくっていた。

新しい様式ではpdftotextの出力がちょっとましな感じだったので,perlプログラミング1発+若干の手作業による修正で,上記の日次統計テキストファイルまでたどり着くことができそうだ。

いや,Johns Hopkins 大学のCSVデータを使えという話もあるかもしれないが,いちおうそこはほれ,WHOを支持しているので。

あいかわらず正規表現もまともに習得していないので泥臭いperlプログラムになった。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# /usr/local/bin/perl
# 05/02/2020 K. Koshigiri 
# 05/07/2020 K. Koshigiri -> revised version
# extract data from WHO covid-19 reports
# https://www.who.int/emergencies/diseases/
# novel-coronavirus-2019/situation-reports/
# usage:: ./who.pl < pdf-in.txt > out.txt

while($line = <STDIN>) {
  chomp($line);
  if($line =~ /([A-Z].*)/) {
    $a=$1;
    $a =~ s/\(.*//;
    $flg='a';
  } elsif($flg eq 'a' && $line =~ /([\d\h]+)/) {
    $b=$1;
    $b =~ s/\h//;
    $flg='b';
  } elsif($flg eq 'b' && $line =~ /([\d\h]+)/) {
    $c=$1;
    $c =~ s/\h//;
    $flg='c';
  } elsif($flg eq 'c' && $line =~ /([\d\h]+)/) {
    $d=$1;
    $d =~ s/\h//;
    $flg='d';
  } elsif($flg eq 'd' && $line =~ /([\d\h]+)/) {
    $e=$1;
    $e =~ s/\h//;
    $flg='';
    print("$a\n$b\n$c\n$d\n$e\n");
  }
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
※WHOのデータ形式が変わったので,若干修正した(2020.5.7)。

2020年3月18日水曜日

久々のPerl

久しぶりにPerlのプログラムを書いた。20年ぶりとか13年ぶりとか8年ぶりとかの感じ。目的はWHOの "Coronavirus disease (COVID-2019) situation reports" から各国別のConfirmedとDeathsの継時データを取り出すことである。一応形が整ったのであるが,WHOはpdfファイル中の表のデータ構造をコロナウィルスのようにどんどん変化させているので何だかすっきり行かない。結局,一部の古いものについては年度ごとにpdfから取り出したテキストデータ側を手動で調整する必要がある(これらすべてに対応させるほうが面倒なのだ)。

なお,pdfからのテキストファイルの取出にはpdftotextを使った。
(例)$ pdftotext -f 3 -l 6 20200312-sitrep-52-covid-19.pdf 52.txt

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#!/usr/bin/perl
# /usr/local/bin/perl
# 03/17/2020 K. Koshigiri
# extract data from WHO covid-19 reports
# https://www.who.int/emergencies/diseases/
# novel-coronavirus-2019/situation-reports/
# usage:: ./corona.pl Japan ??.txt

$country = shift(@ARGV);
print("$country:\n");

foreach $file (@ARGV) {
  open(IN, \$file) || die "\$file: ";
  $file =~ /^([0-9]+).txt/;
  \$no=\$1;
  print($no,',');

  while($line = <IN>) {
    chomp($line);
    if(\$line =~ /\$country\$/) {
      $flg='y';
    } elsif(\$flg eq 'y' && \$line =~ /([0-9]+)/) {
      print("$1,");      
    } else {
      $flg='n';
    }
  }
  print("\n");

}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

手元のMacBook Proの Catalina(10.15.3)に附属のperlは2013年バージョン5.18.4(This is perl 5, version 18, subversion 4 (v5.18.4) built for darwin-thread-multi-2level)だった。最新は,5.30.2のようで,Perl6はどうなっているのかと思えば,そうそう楽土になっていた。

2020年2月29日土曜日

昭和のプログラミング教育(4)

昭和のプログラミング教育(3)からの続き

金沢泉丘高校理数科の2年になって,カシオのAL-1000の次に取り組んだのがアナログ計算機である。

野田中学校3年のときの技術の先生が黒丸の眼鏡をかけた辻先生といって,やんちゃな生徒まで含めて全員が恐れるたいへん怖い先生だった。電気や電子回路が専門のようで,技術準備室には分解・組立中のテレビなどが山積していた。電気の授業では,電気工事士の実技試験のような設定で,木の板に碍子を固定して電線を貼るというものがあって,クラスから2名選ばれた。ドライバーなどの工具を与えられ持ち時間10分くらいで取り組んだ。もう一人は誰だったかはっきりしないが,なんと自分も選ばれてしまったのだ。練習も何もなしで「始め」といわれてもウロウロするだけで碍子一つ取り付けれずに終了した。チーン。もう一人は途中までできていたが,自分はあまりにも不器用だった。

3年の技術の授業の後半にはいよいよ真空管式ラジオの回路図が登場した。五球スーパーか何かのキットを買ってもらって真空管式ラジオを実際に組み立てたのは高校生になってからだったが,それまでも,はやくから電子工作のおもちゃは家にあり,ハンダごてを使ってトランシーバーのキットに挑戦したりと,小学生の時の鉱石ラジオから始まった電子回路への興味はとても大きかった。授業にも真剣に取り組み(ラジオの実習はなかったと思う),試験前には教科書の回路図を完全に記憶していた。試験では微分回路と積分回路が出て,そこだけが間違っていた。採点の方が誤りだったので,恐る恐る先生に申し出たところ,無事に訂正してもらえてよくできたと褒められた。

話が長くなったが,その積分回路と微分回路を使うと,高校数学で出てくるような微分方程式(当時は高等学校の数学でも簡単な微分方程式を扱っていた)を解くことができる。この原理を利用したのがアナログ計算機であり高専などでも使われていた。20年ほど前に,インターネットで探してみると神戸高専のホームページに丁度自分たちが高校時代に使っていたものの写真が見つかった。それからしばらくするとそのページも無くなってしまい,今では完全に過去の遺物となってしまった。


図1 理数科で使ったアナログ計算機(引用:神戸高専の古いウェブサイトより)


北國新聞の記事にある楠先生の収集資料の中には,昭和48年9月に全国理数科高等学校長会によって発行された理数科紀要の第1集があり,その一部のデータを送っていただいた。当時,非常にがんばってこのアナログ計算機の実験に取り組んでレポートを書いたので,楠先生に取り上げられて,あちこちの発表に利用されたようだ。同級生の北原さんと連名になっているが,ほとんど私の作品だ。昔はよく勉強していたことがわかる。

図2 理数科紀要の中で報告された当時の私のレポート

アナログ計算機は理科の準備室かどこかに設置されていて,放課後一人で残って黙々と楽しい作業を続けた。微分方程式を解いた計算結果は振動や過渡現象のグラフになって出力される。あるとき,配線を間違えてスイッチをいれると警告ブザーが鳴り響き,学校に1台しかない高価な機械を壊してしまったかと肝を冷やした。アナログ計算機は無事だった。なお,図2のレポートをワープロで書いたのは楠先生だ。自分が書いたレポートは手書きであり,ちゃんと返却してもらったのだが,50年のうちに紛失してしまった。