あらきけいすけのメモ帳

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

GCC Developer Lite (GDL)を64bitのWindows 10にインストールし hello world プログラムを作成する

GCC Developer Lite (GDL) を使って自分のPCで hello world プログラムと、マイコン(ここではH8-3664F)用プログラムをC言語で作成できるようになるまでの覚書。

GCC Developer Lite のインストール

  1. まずBesttechnology社のサイト https://www.besttechnology.co.jp/modules/knowledge/?GCC%20Developer%20Lite からインストーラ (2020.7.1現在 GDLFull2.5.1.0.exe)をダウンロードして実行する。
  2. まずインストールする言語の選択。日本語で[OK]をクリック
    f:id:arakik10:20200701074734j:plain
  3. インストーラが起動するので[次へ(N)]をクリック
    f:id:arakik10:20200701075045j:plain
  4. [使用許諾契約書の同意]が現れるので[同意する(A)]を選択して[次へ(N)]をクリック
    f:id:arakik10:20200701075228j:plain
  5. [情報]が現れるので[次へ(N)]をクリック
    f:id:arakik10:20200701075842j:plain
  6. [インストール先の指定]が現れるので、ここは C:\Program Files (x86)\BestTech のままで、[次へ(N)]をクリック
    f:id:arakik10:20200701075424j:plain
  7. [コンポーネントの選択]が現れる。*1
    1. [H8-3664Fでのみ使用]を選択するとマイコンH8-3664のプログラミングに必要なコンポーネントだけにチェックが入る。(後でWindows用を追加することも可能)f:id:arakik10:20200701080951j:plainFLASH WRITER, H8GCC などにチェックが入るf:id:arakik10:20200701082434j:plain
    2. 下から3個目の[Windows(x64)でのみ使用]*2を選択するとWindowsプログラミングに必要なコンポーネントだけにチェックが入る。(後でH8-3664用を追加することも可能)f:id:arakik10:20200701083257j:plainf:id:arakik10:20200701083413j:plain
    3. たとえば[H8-3664Fでのみ使用]の後で[Windows(x64)でのみ使用]をインストールすると[既存のコンポーネント]が現れるので[はい(Y)]をクリックf:id:arakik10:20200701090454j:plain
  8. [プログラムグループの指定]が現れるので[次へ(N)]をクリック
    f:id:arakik10:20200701085155j:plain
  9. [追加タスクの選択]が現れるので[次へ(N)]をクリック
    f:id:arakik10:20200701085336j:plain
  10. [インストール準備完了]が現れるので[インストール(I)]をクリック
    f:id:arakik10:20200701085556j:plain
    すると[インストール状況]の画面が現れるf:id:arakik10:20200701085858j:plain
  11. [GCC Developer Lite セットアップウィザードの完了]が現れるので[完了(F)]をクリックf:id:arakik10:20200701090950j:plain

以上でGDLのインストールは終了。H8-3664FとWindows(x64)の両方をインストールする場合には、この作業を2回行う(このとき先にインストールされたものが消されることはない)。

C言語プログラミングとプログラムの実行

注意:ここの説明は Windows(x64) がインストールしてあるものとして書かれている。

  1. デスクトップ上の[GCC Developer Lite]のアイコンをクリックしGDLを起動する
    f:id:arakik10:20200701093810j:plain
    GDLが起動する
    f:id:arakik10:20200701094344j:plain
  2. hello world 用の設定:コンソールプログラム(コマンドプロンプト上で動作するプログラム)作成用の設定
    1. [ツール(T)]→[コンパイルオプション(O)...]を選択
      f:id:arakik10:20200701095324j:plain
    2. [設定リスト]から[x64 (Console)]を選択
      f:id:arakik10:20200701100711j:plain
    3. [外部ツール連動]タブを開いて[コンパイル時に外部ツールを起動(D]のチェックボックスをオン、[外部ツール(P)]ボックスに C:\Windows\System32\cmd.exe を書き込み、[OK]をクリック
      f:id:arakik10:20200701130654j:plain
  3. hello world プログラムの作成
    GDLの青い部分に次のプログラム(ソースコード)を書く
#include <stdio.h>
int main (void) {
  printf("hello, world!");
  return 0;
}

f:id:arakik10:20200701101853j:plain

  1. プログラム(ソースコード)を保存する。今回はデスクトップに"C"というフォルダを作成する。

    1. [ファイル(F)]→[名前を付けて保存(A)...]
      f:id:arakik10:20200701105649j:plain
    2. [保存するソースファイル名の指定]の左側の[デスクトップ]をクリックする
      f:id:arakik10:20200701105555j:plain
      デスクトップのフォルダが表示される。
    3. [保存するソースファイル名の指定]の右上の[新しいフォルダーの作成](下図の右上の赤枠の中のアイコン)をクリック
      f:id:arakik10:20200701121543j:plain
      [新しいフォルダー]が作成される
      f:id:arakik10:20200701121754j:plain
    4. フォルダー名を"C"に書き換える。
      f:id:arakik10:20200701121937j:plain
      そのあと"C"フォルダーをクリックする。
    5. "hello.c"という名前で保存する:図の赤枠の部分に"hello.c"と書いて[保存(s)]をクリック。
      f:id:arakik10:20200701123055j:plain

  2. プログラム(ソースコード)をビルドして、プログラム(実行ファイル)を作成する

    1. [コンパイル(C)]→[ビルド(B) F9]をクリックする。
      f:id:arakik10:20200701123900j:plain
    2. プログラムが正しいならば、[コンパイラ動作ログ](青い部分の下の空欄)に「コンパイル<成功>」が表示される
      f:id:arakik10:20200701132428j:plain

  3. プログラム(実行ファイル)を実行する

    1. コンパイルに成功したら、[INFORMATION]が現れるので[OK]をクリック
      f:id:arakik10:20200701141720j:plain
    2. コマンドプロンプトが現れるので、"hello.exe"と入力して[enter]キーを押すと、"hello, world!"と表示される。
      f:id:arakik10:20200701142043j:plain


*1:PCに余裕があれば[フルインストール]の選択もあり。

*2:[x86]は32bitのプログラム, x64は64bitのプログラムを作成する:32bit 64bit プログラミング 違い - Google 検索

Pythonの組み込み関数pow()は複素数を代入できたり出力したりする

教育用の覚書。累乗根の計算をやらせていてビックリしたのでメモ。Python のドキュメント https://docs.python.org/ja/3/library/functions.html#pow のどこにも書いていないが、組み込み関数*1の指数関数 pow(), べき乗演算 ** は複素数の範囲で計算を実行できるようだ。pow(-1,0.5), (-1)**0.5 (すなわち\sqrt{-1}=i)は (6.123233995736766e-17+1j) を返す。pow(0+1j,0+1j), 0+1j**(0+1j) (すなわち\displaystyle i^i=\left(e^{\frac{\pi}{2}i}\right)^i=e^{-\frac{\pi}{2}}*2)は (0.20787957635076193+0j) を返す*3

*1:math, cmathライブラリではない。

*2:本当は \displaystyle i=e^{\frac{\pi}{2}i+2\pi n i}, n\in\mathbb{Z} なので値は無限個ある。

*3:math.exp(-math.pi/2) は 0.20787957635076193 を返す。

気になる

最近、槍穂高のあたりの群発地震*1とか、地震の話題が多かったので、久々に防災科学技術研究所 Hi-net 高感度地震観測網震源マップをのぞいてみる。30日間のイベント数が3万4千余と去年の7月ころの1万8千余*2に比べてかなり増えている。イベント数が3万超えは記憶にない。

Hi-net自動処理震源マップ 2020/04/21 07:30:00~ 2020/05/21 07:30:00
Hi-net自動処理震源マップ 2020/04/21 07:30:00~ 2020/05/21 07:30:00

COVID-19 覚書

自分用の覚書

  • 人類がCOVID-19に直面するのは初めてである
    • したがって、免疫がないから、感染拡大初期の感染者数の増加率は指数関数的である

    • しかし、感染者数の増加ペースは国ごとに異なっている。香港、シンガポール、日本が低い*1
    • しかし、指数関数的なので、遅かれ早かれ相当数まで感染拡大は必ず起こる
      • したがって、軽症例まで受け入れるとリソースが即座に枯渇する。リソース配分を重症者にシフトすること、病院での感染拡大が起きないようにすることが肝要
  • COVID-19に特効薬、ワクチンはまだない
    • したがって、罹ったら免疫ができるまでじっとしている他ない。
    • したがって、現況では集団免疫以外の収束シナリオが描けない
    • しかし無症状、軽症例もかなり多い。
      • したがって外出時は誰もがなるべくマスクをするべき(気付かないまま感染している場合の感染拡大をペースダウンするための咳エチケットとして)*2わたし自身も毎日、公共交通機関を往復で2時間程度は使って通勤しているので、岡山在住の人が高知で感染確認されたという報道以降、マスクを着用している。
    • 先ほどの論(「現時点ではマスクの効果は分からん」)では、私はネガティブでしたが、「感染者にマスクを装着させることは、周囲への感染を抑える効果がある」と証明されています。
       特にインフルエンザで文献やガイドラインが多く、ぱっと調べただけでも論文が存在します*)。WHOはそれを引用して2009年のインフルエンザ騒動のときにマスク着用を推奨しています。
      *)efferson T, Foxlee R, Del Mar C et al. Physical interventions to interrupt or reduce the spread of respiratory viruses: systematic review. BMJ 2008; 336;77-80.
       EUの感染予防対策機関であるECDC(European Centre for Disease Prevention and Control)でも、エビデンス付きでインフルエンザ患者のマスク着用が感染伝播阻止に有効と記載しています(参考)。アメリカのCDCでも、マスク着用を推奨しています。
      ある医師がエンジニアに寄せた“コロナにまつわる現場の本音” (3/10) - EE Times Japan
    • その一方で、高齢者、持病のある人には重篤になって死亡する場合もある
      • したがって、社会リソースは重篤な人に優先的に回すべき

*1:日本が低い理由を邪推すると、まず花粉症の季節と被ったのでマスク着用率が高く拡大のペースが抑えられている。PCR検査のリソースが少ないので、かなり症状の重い人とその周辺から検査するので、症状の重い人の感染拡大のペースは(どこの国でも)10%/日くらいなのかもしれない。(日本人だってヒトなので、軽症者込みで検査をすると見つかるレートは諸外国と同じになるはずだし、重症者の中から死者が出るので、死者の増えるペースが韓国と同程度なので、重症者の割合を重点的に見ているのだろう。)それに日本の社会人は多少の風邪では医者にかからない。感染が確認されると周囲の人々の活動までストップさせることになるので、なかなか言い出しにくいというのもあるかもしれない。

*2:マスクは感染「予防」には全く無力

Windows10上のLaTeXでUDフォントを使ってみた

自分用の覚書。LaTeXモリサワのUD書体を試しに使ってみた。プリアンブル部分に次の3行を試しに書き加えて、コンパイルしたらできた。

\usepackage{pxchfon}
\setminchofont{UDDIGIKYOKASHON-R.TTC} 
\setgothicfont{UDDIGIKYOKASHON-B.TTC} 

い~と~まきまき~考えるカラス:第6回:糸巻きのネタバレ

NHK Eテレ考えるカラス」第6回の「考える練習『糸巻き』」の問題はこちら


今日は、糸巻(ま)きを使った問題です。机(つくえ)の上に糸巻きをおきます。少し糸が出ています。ここからが問題。この糸を、水平に引っぱります。糸巻きはどう動くのでしょうか。1.うしろ向きに回転して手からはなれる。2.前向きに回転して引っぱった手に近づく。3.その場で空回りして動かない。*2
解答は…
考える練習「糸巻(ま)き」の答えです。1.手からはなれる。2.手に近づく。3.その場で空回りして動かない。やってみると…、糸巻きは引っぱった手の方向に転がってきます。答えは「2」でした。今度は小さな糸巻きでやってみます。糸を引っぱるとやっぱり手の方向に転がってきました。どうしてこうなるのでしょう。それは、この糸巻きの…。ここから先は、自分で考えよう。これからはみんなが、考えるカラス
…というわけで、「考えるカラス」には解説が無いけれど、Eテレのサイトには教育用の解説のビデオクリップがあって、全部ネタバレしている。
www2.nhk.or.jp
ひとつだけこの説明に「抜け」があるとすれば、「糸を引くと、必ず糸巻きの軸の円の接線の向きに引く」から、支点と作用点を繋いだ線と糸を引く力の向きの線の関係が説明のとおりになるということ。(…てゆーか、力の分解は中学理科なので、小学生向けの理科でやって、みんなついてこれるのかな?)

以下、自分用の覚書。Google検索の上位に意外とガチの答案がない。

運動方程式

大学で習う剛体の運動方程式*3。「ころがり」の条件で運動方程式を解いてみる。

糸巻問題
\small\displaystyle
\left\{\begin{array}{lrcl}
回転 & I a & = & r F - R f 
\\ 上下 & 0 & = & F \sin\theta + N - M g 
\\ 左右 & - M R a & = & F \cos\theta - f
\end{array}\right.
I:重心回りの慣性モーメント、a:回転の角速度、r:軸の半径、F:糸を引く力、R:輪の半径、f:(ころがりだから)静止摩擦力、\theta:糸を引く角度(右向き水平を\theta=0にとる)、N:垂直抗力、M:糸巻の質量、g:重力加速度。

「ころがり」の物体の動き

「ころがる」という状態は、

  1. 接地点は「瞬間的に速度ゼロ」、それ以外の点は「瞬間的に接地点を中心として回転する向き」に動く(多分、ここが一番想像が難しいところかも)、
  2. だから、てこを使った説明では接地点が「てこの支点」になる、
  3. 計算では回転の角速度がa(反時計回りが正)のとき、糸巻の加速度は-Ra(反時計回りなら左へ進む)になる。
宙に浮かない条件

宙に浮かない条件*40\leqq N=Mg-F\sin\theta.

回転の角速度と摩擦力

回転、左右の式をa, fについて解くと
角加速度:\displaystyle a=\frac{ F ( r - R \cos\theta )}{ M R^2 + I }, 摩擦力:\displaystyle f = \frac{M R r + I \cos\theta}{ M R^2 + I}F

「ころがり」である条件

ころがる(すべらないで回る)*5条件は、fが最大静止摩擦力\mu Nより小:\displaystyle\frac{M R r + I \cos\theta}{ M R^2 + I}F\leqq \mu (Mg-F\sin\theta)

右へ行く条件

釣り合うのは角加速度a=0(時計回り)より、\cos\theta=r/Rだから、糸を引く向きの線(下図の赤線)を伸ばすと、どんぴしゃ接地点を通る。「魔法の手綱」の解説どおりの答えが出ている。

糸巻きの釣り合う角度と軸の太さの関係
糸巻きの釣り合う角度と軸の太さの関係
右へ行くのは角加速度a<0(時計回り)より、\cos\theta>r/R(角度\thetaが浅い方)。この答えを見た上で「考えるカラス」を見直すと、小さい糸巻きを引くときに、蒼井優さんはかなり慎重に水平に糸を引いているのがわかる。

掲示板のスレ

【悲報】 理系大学生、正答率9%の問題がコチラァ!wywywywywywywywywywywywywywywywywywywywywywywy
とあるまとめサイトでこのスレを見かけたのだが、スレに貼られていた問題の解説(理科教育関連の著書の写真;>>119に貼られている)を見ると、著者の説明が糸を斜めに引いたときに全く応用の利かない推論になっていて、こんなリクツで「応用ができない」とdisられたのでは学生たちはたまったものではないと思う。初等力学の剛体の運動に関する深い(「複雑な」ではなく「核心を突いた」)理解が必要である。これは「考えるカラス」が取り上げるくらいの「意外な答え」の問題である。


*1:画像出典: https://www.nhk.or.jp/das/image/D0005110/D0005110306_00000_C_006.jpg

*2:出典: #6 | 考えるカラス~科学の考え方~ | NHK for School

*3:かつて高校の「物理Ⅱ」に入っていた時期もあった。学習指導要領データベースインデックス 第4節 理科

*4:糸を斜め上に強く引くと、糸巻は宙に浮く…くらいは想像がつく。

*5:力学の教科書では「ころがり」とは接地点で「糸巻の接地点」の対地速度がゼロということ。よって静止摩擦力で計算しないといけない。

Raspberry Pi Zero W に GPIO Hammer header ピンソケット(ピンヘッダではなく)を付けると便利

ラズパイゼロとブレッドボードを使った簡単な電子工作をするなら、ピンヘッダのはんだ付けが済んでいるラズパイゼロWHではなく、ラズパイゼロW*1に GPIO Hammer header のメス(ピンソケット)*2を付けた方が、[1]Arduinoみたいに配線がオス-オスのジャンプワイヤだけで済む、[2]配線の作業中に誤って近隣のピンを触ってしまう(ラズパイゼロはこれでよく落ちる)ことがないので便利。GPIOハンマーヘッダーは、根元が少し膨らんだピンをラズパイゼロの基板のピンヘッダ用のスルーホールに押し込んで止めるだけなので、はんだ付けは不要である。

f:id:arakik10:20200213185805j:plain
Raspberry Pi Zero W + GPIO hammer header (female) + case cover
ラズパイゼロWにGPIO hammer header メスを装着
Raspberry Pi Zero W + GPIO hammer header (female) + case uncovered