2021年1月9日土曜日

パルスオキシメーター

ついこの間まで,パルスオキシメーターのことを「パルスオキシメーター」 とよぶのだと勘違いしたままだった。テレビのニュースで,ようやく誤った知識が訂正された。

パルスオキシメーターは光を使って血液の酸素飽和度を測る装置である。新型コロナウィルス感染症において,無症状の段階でもその兆候を捉えるために用いられるというニュースだったような気がする。

酸素飽和度(SaO2)は,血液中のヘモグロビンが酸素と結合している割合を表す量であり,ヘモグロビンをHbと書くと,[HbO2] = HbO2 / (HbO2+Hb)として,実際には,(HbO2) = [HbO2]/ [HbO2]max で与えられる。maxは最大酸素飽和度の場合の値を意味しているので,(HbO2)の最大値は100%になる。なお,酸素飽和度には,SvO2(静脈酸素飽和度),StO2(組織酸素飽和度),SpO2(末梢酸素飽和度)があって,パルスオキシメータで測定されるのはSpO2である。

パルスオキシメータの原理については,コニカミノルタのページが詳しい(1977年に世界で最初に商品化した)。Hbは赤色光をよく吸収するが,HbO2は赤い光を透過するので血液が赤く見える。一方,HbとHbO2はともに赤外光はあまり吸収しない。そこで,赤外光IRを基準とした赤色光Rの強度,R/IRがわかれば,HbO2/Hbがわかることになる。パルスオキシメータでは脈動する血液についてのR/IRの変化成分を測定するため動脈血を見ていることに対応する。

SpO2が95%以上であれば正常,90-95%で注意,90%未満ではなんらかの処置が必要となる。ただ,新型コロナウイルス感染症の低酸素症では,よくわからないことが起きているようだ。

なお,ヒトのヘモグロビンは,ヘムとよばれる鉄原子を中心とした錯体をかこむ4ユニットから成る分子量64500のタンパク質分子である。

2021年1月8日金曜日

合衆国憲法修正第25条

 アメリカ合衆国憲法修正第25条は,アメリカ合衆国大統領の承継方法や,大統領がその職務上の権限と義務を遂行することができない場合の対処法を規定している。


修正第25条[大統領の地位の継承] [1967 年成立]

第1項 大統領が免職され、死亡しまたは辞任した場合には、副大統領が大統領となる。

第2項 副大統領が欠けたときは、大統領が副大統領を指名し、指名された者は、連邦議会の両院の過半数の承認を経て、副大統領の職に就く。

第3項 大統領が、上院の臨時議長および下院の議長に対し、その職務上の権限および義務を遂行することができない旨を書面で通告したときは、その後大統領が権限および義務を遂行することができる旨を書面で通告するまで、副大統領が臨時大統領としてかかる権限および義務を遂行する。

第4項[1号] 副大統領、および行政各部の長または連邦議会が法律で定める他の機関の長のいずれかの過半数が、上院の臨時議長および下院議長に対し、大統領がその職務上の権限および義務を遂行できな い旨を書面で通告したときは、副大統領は、直ちに臨時大統領として、大統領職の権限および義務を遂行するものとする。

[2号]その後、大統領が上院の臨時議長および下院議長に対し、職務遂行不能状態は存在しない旨を書面で通告したときは、大統領はその職務上の権限および義務を回復する。但し、副大統領および行政各部の長または連邦議会が法律で定める他の機関の長のいずれかの過半数が、4 日以内に、上院の臨時議長と下院議長に対し、大統領がその職務上の権限および義務を遂行できない旨を書面で通告したときは、この限りでない。この場合には、連邦議会は、開会中でないときには48 時間以内にその目的のために集会し、問題を決定するものとする。連邦議会が、大統領が職務上の権限および義務を遂行することができない旨を通告する書面を受理してから21 日以内に、または、連邦議会が開会中でないときは、集会の要請があってから21 日以内に、両議院の3 分の2 の投票により、大統領はその職務上の権限および義務を遂行することができない旨を決議したときは、引き続き副大統領が臨時大統領としてかかる権限および義務を遂行する。 かかる決議がなされなかった場合には、大統領はその職務上の権限と義務を回復するものとする。

 

アメリカ合衆国憲法

第2章[執行部]

第1条[大統領と副大統領、選出方法]

[第6項]大統領が罷免され、死亡し、辞職し、またはその職権および義務を遂行する能力を失ったときは、副大統領が、大統領の職務を行う。連邦議会は、大統領と副大統領がともに罷免され、死亡し、辞職し、または執務不能に陥った場合について、法律により、いかなる官吏に大統領の職務を行わせるかを定めることができる。この官吏は、執務不能の状態が解消される時または大統領が選出される時まで、大統領の職務を行う。



2021年1月7日木曜日

逆順と平方(3)

逆順と平方(2)からの続き

9桁までの範囲で考えるとしても,3億個のデータのうち条件を満足するのが高々7000個なので,ほとんど無駄な計算をしていることになる。そこで,プログラムは汚くとも,もう少し計算を簡略化できないかと考えた結果,12桁までの計算が数分程度で可能になった。2〜3桁分をまとめてループをまわしているが,この範囲でよいという証明はしたわけではなく,直感に頼っているのだった。


function reverse(n,m)
  nun=zeros(Int,m)
  nre=0
  for k in 1:m
    nun[k] = n % 10
    nre = nre + nun[k]*10^(m-k)
    n = div(n - nun[k],10)
  end
  return nre
end

function counter(n)
  a = [0 1 2 3 10 11 12 13 20 21 22 23 30 31 100 101 102 103 110 111 112 113 120 121 122 123 130 131 200 201 202 203 210 211 212 213 220 221 222 223 230 231 300 301 302 303 310 311 312 313]
  b = [50 4 14]
  c = [10^3 10 10^2]
  cnt=1
  kk = c[n%3+1]
  k1max = b[n%3+1]
  k2max = 1 + div(n+10,14)*49
  k3max = 1 + div(n+10,17)*49
  k4max = 1 + div(n+10,20)*49
  for k1 in 1:k1max
    for k2 in 1:k2max
      for k3 in 1:k3max
        for k4 in 1:k4max
          k=a[k1]+a[k2]*kk+a[k3]*kk*10^3+a[k4]*kk*10^6
          if(k!=0)
            m=Int(ceil(log10(k)+10^(-9)))
            kj=BigInt(k)^2
            mj=Int(ceil(log10(kj)+10^(-9)))
            kr=reverse(k,m)
            krj=BigInt(kr)^2
            if(reverse(kj,mj)==krj)
# println(k,":",kr,":",kr^2,":",reverse(k^2,mj))
              cnt=cnt+1
            end
          end
        end
      end
    end
  end
  return cnt
end

for i in 1:12
  @time println(i," : ",counter(i))
end


1 : 4
0.000491 seconds (176 allocations: 6.000 KiB)
2 : 13
0.000551 seconds (765 allocations: 22.258 KiB)
3 : 37
0.002469 seconds (3.68 k allocations: 96.281 KiB)
4 : 100
0.005823 seconds (18.99 k allocations: 466.195 KiB)
5 : 253
0.021409 seconds (81.69 k allocations: 1.886 MiB)
6 : 615
0.091992 seconds (346.74 k allocations: 7.780 MiB)
7 : 1434
0.441439 seconds (1.61 M allocations: 35.324 MiB, 11.21% gc time)
8 : 3244
1.616126 seconds (6.39 M allocations: 138.140 MiB, 11.31% gc time)
9 : 7116
6.780644 seconds (25.58 M allocations: 546.322 MiB, 13.04% gc time)
10 : 15200
28.310428 seconds (113.32 M allocations: 2.337 GiB, 13.25% gc time)
11 : 23284
108.389549 seconds (437.13 M allocations: 8.934 GiB, 13.71% gc time)
12 : 31368
417.966111 seconds (1.71 G allocations: 34.604 GiB, 14.30% gc time)

2021年1月6日水曜日

逆順と平方(2)

逆順と平方(1)からの続き

中嶋慧さんのpythonによる逆順関数がスマートだったので Juliaでも試してみた。数値を文字列に変換して,逆順にしたものをもういちど数値に戻すというものだ。プログラムとしてはスッキリしたけれど,実行時間が倍になってしまった。


function rev(n)
  b = string(n)
  c = b[end:-1:1]
  d = parse(Int,c)
  return d
end

function counter(m,j)
  cnt = 1
  kmax = Int(ceil(10^(m-1)*sqrt(10)))
  for k in 10^(m-1)+1:kmax
    kr = rev(k)
# kj = BigInt(k)^j
# krj = BigInt(kr)^j
    kj = k*k
    krj = kr*kr
    if(rev(kj)==krj)
# if(2000<=k<=2299)
# println(k,":",kr,":",kr^j,":",rev(k^j))
# end
      cnt = cnt + 1
    end
  end
  return cnt
end

function list(l,j)
  sum=1
  for i in 1:l
    @time sum = sum + counter(i,j)
    println(i," **",j," = ",sum)
  end
end


list(9,2)
0.000010 seconds (36 allocations: 1.781 KiB)
1 **2 = 4
0.000015 seconds (264 allocations: 13.062 KiB)
2 **2 = 13
0.000138 seconds (2.60 k allocations: 128.844 KiB)
3 **2 = 37
0.001734 seconds (25.96 k allocations: 1.254 MiB)
4 **2 = 100
0.016847 seconds (259.48 k allocations: 12.538 MiB)
5 **2 = 253
0.224788 seconds (2.59 M allocations: 125.376 MiB, 12.69% gc time)
6 **2 = 615
2.393325 seconds (25.95 M allocations: 1.224 GiB, 12.89% gc time)
7 **2 = 1434
26.113517 seconds (259.47 M allocations: 12.244 GiB, 11.55% gc time)
8 **2 = 3244
284.531202 seconds (2.59 G allocations: 128.882 GiB, 11.40% gc time)
9 **2 = 7116

2021年1月5日火曜日

逆順と平方(1)

 中嶋慧さんが,次のようなプログラムについての話題を提供していた。ある数nの逆順に並べた数をrev(n)とする。例えば,rev(123)は321である。このとき,rev(n^2)=rev(n)^2を満たすm桁の数nは,何個あるかという問題だ。pythonでは時間がかかるので,juliaにするとよいのではないかという提案だったが,残念ながら,工夫に乏しい10^8個の計算はやたら時間を食うだけだった(追伸:条件が rev(rev(k)^2) = k^2 であると誤解していたので,その後訂正したところ,中嶋さんの結果と一致した)。


function reverse(n,m)
  nun = zeros(Int,m)
  nre = 0
  for k in 1:m
    nun[k] = n % 10
    nre = nre + nun[k]*10^(m-k)
    n = div(n - nun[k],10)
  end
  return nre
end

function counter(m)
  cnt = 1
  kmax = Int64(ceil(10^(m-1)*sqrt(10)))
  for k in 10^(m-1)+1:kmax
    kr = reverse(k,m)
    m2 = Int(ceil(log10(k*k)))
    if(reverse(k*k,m2)==kr*kr)
# if(2000<=k<=2299)
# println(k,":",kr,":",kr^2,":",reverse(kr^2,m2),":",k^2)
# end
      cnt = cnt+1
    end
  end
  return cnt
end

function list(l)
  sum = 0
  for i in 1:l
    @time sum = sum + counter(i)
    println(i," : ",sum)
  end
end

list(9)
0.000003 seconds (6 allocations: 576 bytes)
1 : 4
0.000009 seconds (44 allocations: 4.469 KiB)
2 : 13
0.000097 seconds (434 allocations: 50.859 KiB)
3 : 37
0.000901 seconds (4.33 k allocations: 540.750 KiB)
4 : 100
0.011719 seconds (43.25 k allocations: 5.939 MiB)
5 : 253
0.145435 seconds (432.46 k allocations: 62.688 MiB, 12.05% gc time)
6 : 615
1.100731 seconds (4.32 M allocations: 692.869 MiB, 17.40% gc time)
7 : 1434
11.497505 seconds (43.25 M allocations: 7.088 GiB, 16.11% gc time)
8 : 3244
132.445766 seconds (432.46 M allocations: 77.329 GiB, 16.48% gc time)
9 : 7116

2021年1月4日月曜日

2021年1月2日土曜日

2020年12月31日木曜日

2020年12月30日水曜日

2020年12月29日火曜日

2020年12月28日月曜日

2020年12月27日日曜日

鉄犬ヘテロトピア文学賞

日経朝刊の文化欄に管啓次郎さんが,「遠吠えする鉄犬文学」として,鉄犬ヘテロトピア文学賞の話題を書いていた。まったく読んだことにない作品ばかりだった。かろうじて,第2回の候補作の「加藤直樹『九月、東京の路上で』(ころから)」だけは読んでいた。

第1回鉄犬ヘテロトピア文学賞
第2回鉄犬ヘテロトピア文学賞
第3回鉄犬ヘテロトピア文学賞
第4回鉄犬ヘテロトピア文学賞
第5回鉄犬ヘテロトピア文学賞
第6回鉄犬ヘテロトピア文学賞
第7回鉄犬ヘテロトピア文学賞


写真:鉄犬ヘテロトピア文学賞(読書人WEBから引用)


2020年12月26日土曜日

レゴ(2)

レゴ(1)からの続き

LEGO組み立て説明書」アプリをダウンロードすると(アプリ名称が「の遊び方」になるのはなぜだ),これまでの製品の詳細がわかる。また,製品についているマニュアルのpdf版もあるので便利かもしれない。

LEGO Classic 11717 1504 (2020) ブロックブロックプレート
LEGO Classic 11911 1500 (2020) アイデアパーツ〈動物セット〉
LEGO Classic 10717 1500 (2018) ブロックブロックブロック
LEGO Classic 10697 1500 (2015) アイデアパーツ〈XXL〉
LEGO Classic 10705 1000 (2016) アイデアパーツ〈XL〉
LEGO Classic 10704 900 (2017) アイデアパーツ〈スペシャルセット〉
LEGO Classic 11002 900 (2019) 作ってあそぼう
LEGO Classic 10698 790 (2015) 黄色のアイデアボックス〈スペシャル〉
LEGO Classic 10705 583 (2016) アイデアパーツ〈エクストラセット〉
LEGO Classic 10695 580 (2015) アイデアパーツ〈スペシャルセット〉
LEGO Classic 10703 502 (2017) アイデアパーツ〈建物セット〉
LEGO Classic 10698 484 (2015) 黄色のアイデアボックス〈プラス〉
LEGO Classic 11004 450 (2019) 創造力の窓
LEGO Classic 11003 451 (2019) アイデアパーツ〈目のパーツ入〉
LEGO Classic 10715 442 (2018) アイデアパーツ〈タイヤセット〉
LEGO Classic 11009 441 (2020) アイデアパーツ〈ライトセット〉
LEGO Classic 11008 270 (2020) アイデアパーツ〈お家セット〉
LEGO Classic 10712 244 (2018) アイデアパーツ〈歯車セット〉

2020年12月25日金曜日

WHOのCOVID-19データ(3)

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

WHOのjsonデータの冒頭部分を取り出してみた。国別に,UNIX-timeの行と地域名の行の次に10項目の数値データが並んだ配列が格納されていた。10項目の内訳は,死亡数/日,死亡数累計,1週間の死亡数,1週間の死亡数の変化分,100万人あたりの死亡数,確定感染数/日,確定感染数累計,1週間の確定感染数,1週間の確定感染数の変化分,100万人あたりの確定感染数,となっていて,これを取り出していたのだった。

 {

"componentChunkName":"component---src-templates-table-tsx",

"path":"/table",

"result":

  {"pageContext":

    {"countryGroups":[


{

"dimension":{"name":"Country","type":"STRING","dataType":"STRING"},

"value":"US",

data":

{"metrics":

[

{"name":"Deaths",

 "type":"NUMBER",

 "dataType":"NUMERIC",

 "aggregateFunction":"SUM"}

,

{"name":"Cumulative Deaths",

 "type":"NUMBER",

 "dataType":"NUMERIC",

 "aggregateFunction":"SUM"}

,

{"name":"Deaths Last 7 Days",

 "type":"NUMBER",

 "dataType":"NUMERIC",

 "aggregateFunction":"SUM"}

,

{"name":"Deaths Last 7 Days Change",

 "type":"NUMBER",

 "dataType":"NUMERIC",

 "aggregateFunction":"SUM"}

,

{"name":"Deaths Per Million",

 "type":"NUMBER",

 "dataType":"NUMERIC",

 "aggregateFunction":"SUM"}

,

{"name":"Confirmed",

 "type":"NUMBER",

 "dataType":"NUMERIC",

 "aggregateFunction":"SUM"}

,

{"name":"Cumulative Confirmed",

 "type":"NUMBER",

 "dataType":"NUMERIC",

 "aggregateFunction":"SUM"}

,

{"name":"Cases Last 7 Days",

 "type":"NUMBER",

 "dataType":"NUMERIC",

 "aggregateFunction":"SUM"}

,

{"name":"Cases Last 7 Days Change",

 "type":"NUMBER",

 "dataType":"NUMERIC",

 "aggregateFunction":"SUM"}

,

{"name":"Cases Per Million",

 "type":"NUMBER",

 "dataType":"NUMERIC",

 "aggregateFunction":"SUM"}

],


"dimensions":

[

{“name":"day", "type":"TIMESTAMP", “dataType":"STRING"},

{“name":"Region", “type":"STRING", "dataType":"STRING"}

],


"rows":

[

[1578009600000,”AMRO",0,0,0,0,0,0,0,0,0,0],

[1608595200000,"AMRO",1570,315318,18478,9.16,952.61,197199,17712290,1671195,13.64,53511.02]

],


"totals":[315318,42488183,2153709,15832.590000000002,128361.91999999997,17712290,1494857008,118829648,32537.839999999975,4516148.239999997]

}

},


{"dimension":

    


2020年12月24日木曜日

Alfred(1)

 macOSのデスクトップツール(ランチャーアプリ)であるAlfredが超強力であるとの噂を聞きつけて,さっそくダウンロードしたものの,肝腎のメモ(Notes)が呼び出せないので速攻でアンインストールした。

しかし待てよと思い直して検索したところ,Spotlightの検索範囲に該当のファイルが存在しないと発見されないということだった。確かめてみると案の定,Spotlightからはアプリケーションフォルダが外されていた。普通はドキュメントだけ探したいからだった。

早速修正の上でAlfredを再インストールしたところ,OK。アマゾンだとかDeepLとか,いろいろと試して見る価値はあるかもしれないので,もう少し調べてみることにする。


[1]アルフレッドの使い方とおすすめワークフロー
[2]Alfred【概要・設定・使い方】〜Mac最強のランチャーアプリ
[3]Alfredアプリの設定・使い方まとめ完全版

2020年12月23日水曜日

OpenData API

 だいたい,日本のIT政策やシステムはほとんどダメダメのようにみえるけれど,オープンデータAPIポータルというのはちょっと良さげなので,登録してみた。すべての行政データをカバーするのかスゴイと思っていたら,新型コロナウィルス感染症関連情報だけなのか。ちょっと残念。早速ユーザ登録してみたが,英語のアナウンスというのはまあよいとして結構スマートに標準的なユーザ登録方法が実装されている。パスワードで特殊文字を要求されたのでハイフンを使ったが,違うような雰囲気だった。ハイフンは特殊文字ではないのだろうか。

札幌市,会津若松市,群馬県,東京都,神奈川県,横浜市,福井県,三重県,神戸市,福岡市が早速対応していた。もちろん大阪や奈良はないのであった。

著作権について記述されている,利用規約の第12条は以下の通り,まあいいんじゃないの。

本サイトに掲載されている各地方公共団体が著作権を有する著作物の利用(複製、公衆送信、翻訳・変形等の翻案等)については、クリエイティブ・コモンズ・ライセンス(以下「CCライセンス」という。)の著作権を有するもの(ロゴ、シンボルマーク等を除く。)は、クリエイティブ・コモンズ・ライセンス(以下「CCライセンス」といいます。)の表示4.0 国際(CC BY 4.0)((https://creativecommons.org/licenses/by/4.0/legalcode.ja)に規定される著作権利用許諾条件を指します。)により利用できます。なお、数値データ、簡単な表・グラフ等のデータは著作権の対象ではありませんので、ライセンス欄に「CC BY」の表記がある場合でも、当該データのうち、これらのデータについてはCCライセンスの適用はなく、 自由に利用できます。

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])