あらきけいすけのメモ帳

あらきけいすけの雑記帳2

JavaScript/Google Apps Script/Excel/Spreadsheet 覚え

GASでフォルダ名, ファイル名を指定して, Excel ファイルをスプレッドシートに変換する

Google Drive 上の excel と spreadsheet を Google Application Script で操作する練習

function testConvertExcel2Spreadsheet() {
  nameFolder= '[folder name]'
  nameExcel= '[file name].xlsx'
  idSpreadsheet= convertExcel2Spreadsheet( nameFolder, nameExcel )
  Browser.msgBox(idSpreadsheet)
}

function convertExcel2Spreadsheet( nameFolder, nameExcel ) {
  // {String} nameFolder で最初に見つかったフォルダの
  // {String} nameExcel で最初に見つかった Excel ファイルを
  // Google スプレッドシートに変換して、
  // そのスプレッドシートの id を戻す。
  if ( ! nameExcel.match(/.xls/) ) return 0
  idFolder= DriveApp.getFoldersByName(nameFolder).next().getId()
  idExcel= DriveApp.getFolderById(idFolder).getFilesByName(nameExcel).next().getId()
  fileExcel= DriveApp.getFileById(idExcel)
  idSpreadsheet= Drive.Files.insert(
    options = {
      title: fileExcel.getName()
     ,mimeType: MimeType.GOOGLE_SHEETS
     ,parents: [{id: idFolder}]
    }
    ,fileExcel.getBlob()
  ).id
  return idSpreadsheet
}

参考にしたサイト
GAS入門 - DriveAppクラスリファレンス - Qiita
【GAS】GoogleDrive上のExcelをGoogleスプレッドシートに一括変換 - logicoffee プログラミング勉強日記

2019年7月28日3時31分頃, M6.5, 三重県南東沖, 深さ420km, プレート境界に沿って揺れてる

震源三重県沖だが、震度分布がプレート境界に沿って連なっていて、震源から遠い関東から東北の太平洋側が大きく揺れているのが、とても興味深かったのでメモしておく。Hi-netはM6.3, depth:400kmとなっていた。「三重県南東沖でM6.5の深発地震 津波の心配なし 宮城県で震度4「異常震域」」との記事を見たので調べた。震源域はしょっちゅう深いところで地震が帯状に起きているところなので、地球規模では「平常運転」ではある。今回も「大地震」である*1
weathernews.jp

2019年7月28日3時31分頃 M6.5 深さ420km
気象庁のデータ
2019年7月28日3時31分頃 M6.3 深さ400km
防災科学技術研究所のデータ

Excel VBA でマクロの引数にマクロ名を渡す、あるいは実行しているマクロ名を表示させたい

自分用の覚書。Application.Run(マクロ名〔,引数1〔,引数2〔,...〕〕〕) を使うと、呼び出すマクロ名を文字列で扱うことができ、呼び出すマクロの切り替えを呼出側で変数の値として切り替えできる。fortran や C より簡単(fortran でサブルーチンの引数にサブルーチンを渡す - あらきけいすけの雑記帳

Option Explicit

Sub test000()
    Dim s As String, v As Variant, v0 As Variant
    s = "マクロ1" ' 呼び出すマクロの名前
    v = 10
    v0 = Application.Run(s, v)
    MsgBox "test000 calls " & s & "(" & v & ")->" & v0
End Sub

Function マクロ0(v As Variant) As Variant
    MsgBox "マクロ0(" & v & ")"
    マクロ0 = v
    If IsNumeric(v) Then: マクロ0 = v + 1
End Function

Function マクロ1(v As Variant) As Variant
    MsgBox "マクロ1(" & v & ")"
    マクロ1 = v
    If IsNumeric(v) Then: マクロ1 = v - 1
End Function

2019年7月12日9時58分頃, M5.8, 奄美大島西, 深さ250km, プレート境界に沿って揺れてる

震度分布がプレート境界に沿って細長く連なっていて、面的な広がりが無いのが、とても興味深かったのでメモしておく。Hi-netはM6.1, depth:210kmとなっていた。この地域の震源として見ても、例外的に深い。「児島で震度2 震源は鹿児島・奄美大島沖」との記事を見たので大地震が起きたのかとビックリして調べた。M6程度なので「大地震」ではある。
www.sanyonews.jp

2019年7月13日9時58分頃 M5.9 深さ250km
気象庁のデータ
2019年7月13日9時58分頃 M6.1 深さ210km
防災科学技術研究所のデータ

Q:高等学校までの勉強でなぜ分母の有理化を強制されるのか?

A:コンピュータがここまで発達しているのに、陋習に囚われた「紙と鉛筆」脳の教師ばかりだから*1

解説

高校までの数学や理科の勉強で「分母の有理化」をやらせるけれども、有理化する理由は

「筆算で」「有効数字3~4桁程度までの値から」「同じく有効数字3~4桁程度までの値を」求める場合に、丸め誤差*2、桁落ち*3による誤差を最小限に抑えるためには、除算の操作で除数がなるべく少ない桁の整数である方が圧倒的にベターだから*4
ということをきちんと書いている教科書、受験参考書は全くない…多分。知らんけど…。
つまり「有効数字3~4桁程度」の「筆算」という前提が崩れたら、有理化をする意味はとてもとてもとても希薄になると思う。関数電卓スプレッドシートMicrosoft ExcelGoogle Docsスプレッドシート)で力任せに計算して問題が無いし*5\displaystyle\cos\frac\pi4=\frac{1}{\sqrt2}でいいじゃない。
しかし、残念ながら日本の高校生の諸君は、大学側が計算の能力、技巧に関して「紙と鉛筆」以外の選抜手段を持たないので、これからも有理化の練習をさせられ続けるであろう。

主張

「筆算で」「90分程度以内で解ける」ような問題しか出せない「受験数学」「受験理科」への対応にチューニングをかけた授業や、その延長のような(まるで「数学IV」とでも呼びたくなるような)大学教養程度の教科書や授業では、この視点はおそらく出てこない。

*1:この辺のメンタリティは、いわゆる「神エクセル」に通じるものがあると思える。この合理的思考の欠如は「プログラマ」や「AI技術者」を量産できるような体制ではないことを示していると思える。

*2:Round-off error - Wikipedia 日本語版は無い。

*3:Loss of significance - Wikipedia 日本語版は無い。

*4:複素数の分母の実数化はこれとは異なる。複素数z=x+iyは2次元のベクトルだから、分数のままでは不明瞭なx座標とy座標の値を出すという役割がある。

*5:これに関連して、むかしむかし有効数字をスプレッドシートで求める方法を書いた:有効数字の求め方の例題:パチンコ玉の直径をノギスで1回だけ測って体積を求める - あらきけいすけの雑記帳

Dirichlet 積分 ∫_0^∞ sin(x)/x dx = π/2 が条件収束であることについて

\small\displaystyle\int_0^\infty\frac{\sin x}{x}dx=\frac\pi2が条件収束だ*1ということを示すことにちょっとてこずったのでラフなメモを残す。細かいところでミスがあるかもしれない。
方針:\small\displaystyle I_n:=\int_{n\pi}^{(n+1)\pi}\frac{|\sin x|}{x}dxを評価する。
まず\small\displaystyle\int_{n\pi}^{(n+1)\pi}\frac{|\sin x|}{x}dx=\int_{0}^{\pi}\frac{\sin t}{t+n\pi}dtである。ここで\small\displaystyle\frac{\sin t}{(n+1)\pi}\lt\frac{\sin t}{t+n\pi}\lt\frac{\sin t}{n\pi}より\small\displaystyle\frac{2}{(n+1)\pi}\lt I_n\lt\frac{2}{n\pi}\small n=0のときは上限は\small\displaystyle0<\frac{\sin x}{x}<1より\small1\times\pi=\pi)である。
ここで\small\displaystyle\int_0^\infty\frac{\left|\sin x\right|}{x}dx=\sum_{n=0}^\infty I_nを下から評価すると、\small\displaystyle\sum_{n=0}^\infty I_n \gt \small\displaystyle\frac{2}{\pi} \sum_{n=0}^\infty \frac{1}{n+1} \gt \small\displaystyle\frac{2}{\pi}\int_1^\infty\frac{dt}{t}なので、発散すること、すなわち絶対収束しないことが分かる。
次に隣接する部分の和:\small\displaystyle\int_{2m\pi}^{2(m+1)\pi}\frac{\sin x}{x}dx=I_{2m}-I_{2m+1}を評価すると\small\displaystyle \frac{2}{(2m+1)\pi} \lt 
 I_{2m}\lt\frac{2}{2m\pi}, \small\displaystyle-\frac{2}{(2m+1)\pi}\lt -I_{2m+1}\lt-\frac{2}{(2m+2)\pi}であるから、\small\displaystyle0\lt I_{2m}-I_{2m+1}\lt\underbrace{\frac{2}{2m\pi}-\frac{2}{(2m+2)\pi}}_{\frac{4}{2m(2m+2)\pi}=\frac{1}{m(m+1)\pi}}となって、両サイドをmの-2次で抑えられるので、「\small\displaystyle0\lt I_{2m}-I_{2m+1}より\small\displaystyle\sum(I_{2m}-I_{2m+1})は単調増加列である」「\small\displaystyle\sum_{m=1}^\infty(I_{2m}-I_{2m+1}) \lt \small\displaystyle\frac{1}{\pi}\sum\frac{1}{m^2} \lt \small\displaystyle\frac{1}{\pi}\left(1+\int_1^\infty\frac{dt}{t^2}\right)=\frac2\piより、上に有界である」という条件を満たすので、収束する*2

*1:ディリクレ積分 - Wikipedia Dirichlet integral - Wikipedia どちらも値が\small\displaystyle\frac\pi2であることの計算は書いてあるが、条件収束であることは示していない。

*2:単調収束定理 - Wikipedia