自分用の覚書。卒論で「自分の製作したものを記述する」という作業を指導しながら考えたこと。
「ことば」と「もの」の対応は、例えば「素朴実在論」対「言語ゲーム論」みたいな文脈で哲学的/形而上学的に語られるけれども、「一つのもの」には「名前」が2個以上あって、例えば「釘(利用目的の文脈)」と「鉄(素材の文脈)」みたいに、名前が注目の文脈に依存してしまい、「目の前に素朴に実在するもの」に対して一意に決まらないということを考察した形而上学/言語哲学って見たことない。
実在物とそのアフォーダンスに対して言葉がどのような役割を果たしているのかについての研究ってあるのかな?
Excelのシート間移動を楽にするために[CapsLock]⇔[Ctrl(左)], [変換]⇒[PageUp], [カタカナ/ひらがな]⇒[PageDown]を入れ替えた
自分用の覚書。
- 複数のワークシートを持つExcelブックで、隣のシートに移動するためのWindowsショートカットキーは[Ctrl]+[PageUp], [Ctrl]+[PageDown]である。
- ぼくが日頃、使っているキーボードはWindows用の日本語配列のコンパクトキーボードであり、[PageUp][PageDown]が[Fn]と同時押しなので、1の操作で3個のキーを押すことになり面倒。
- [CapsLock]⇔[Ctrl(左)], [変換]⇒[PageUp], [カタカナ/ひらがな]⇒[PageDown]に切り替えれば、キー入力のホームポジションの姿勢をほとんど変えずにシート移動[Ctrl]+[PageUp], [Ctrl]+[PageDown]ができる。
というわけで scancodeMap.reg のキー入れ替えの部分:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] "Scancode Map"=hex:00,00,00,00,00,00,00,00,06,00,00,00,1d,00,3a,00,\ 3a,00,1d,00,01,00,7b,00,49,e0,79,00,51,e0,70,00,00,00,00,00
- [1d,00,3a,00,]が[CapsLock]に[Ctrl(左)]
- [3a,00,1d,00,]が[Ctrl(左)]に[CapsLock]
- [01,00,7b,00,]が[無変換]に[Esc]*1
- [49,e0,79,00,]が[変換]に[PageUp]
- [51,e0,70,00,]が[カタカナ/ひらがな]に[PageDown]
参照したページ
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout - Google 検索
Windowsのキーマップを入れ替える
Windows/TIPS/レジストリを修正してCAPSLOCKの割り当て変更 - yanor.net/wiki
Runge-Kutta-Gill法のPythonコード
4段4次のルンゲ=クッタ法で記憶領域の量が少ないRunge-Kutta-Gill法*1のコードをPythonで書いてみたのでメモ*2。関数rk4()のインターフェースは古典的ルンゲ=クッタ法のPythonプログラムをWikiPediaの記述と同じ変数名で書いてみた - あらきけいすけのメモ帳に合わせてある。解いている微分方程式は, すなわち, 初期条件は, 解は.
import numpy def rk4 ( y, t, h, f ): # Gill's low strage method is implemented. p= numpy.zeros_like(y); q= numpy.zeros_like(y) p=f(t,y); p=p*h*(1./2.); rt2=2**-.5; y+=p; q=p*2 p=f(t,y); p=p*h*(1-rt2) - q*(1-rt2); y+=p; q=p*2 + q*rt2 p=f(t,y); p=p*h*(1+rt2) - q*(1+rt2); y+=p; q=p*2 - q*rt2 p=f(t,y); p=p*h*(1./6.) - q*(2./6.); y+=p; return y, t+h def RHS(t,y): return numpy.array([y[1],-y[0]]) y=numpy.array([1.0,0.0]); t=0; h=0.001 for i in range(100): y, t =rk4( y, t, h, RHS ) print(y[0]-numpy.cos(t))
*1:ストレージは3個(このコードでは y, p, q)で、典型的なRunge-Kutta法より係数がちょっと複雑。[参考]ルンゲ・クッタ・ギル法
4次の公式の最小ストレージは2個らしい: David I.Ketcheson, "Runge–Kutta methods with minimum storage implementations", J. Comput. Phys. Vol. 229, Issue 5, 1 March 2010, Pages 1763-1773 https://doi.org/10.1016/j.jcp.2009.11.006 http://www.davidketcheson.info/assets/papers/2010_LSRK_postprint.pdf.
*2:意外にPythonでのチートシート的なページが無い。fortranなどの他言語に移植することを少しだけ意識した書き方にしたつもり。
Raspberry Pi の初回起動でやっておくべきこと
授業のための覚書
ラズパイ(3B, 3B+, zero w, 4B を想定)のGPIOを使って外付けのA/DコンバータやRCサーボモータを動かすことを主目的としている。初回起動ではどうしても本体にキーボード、マウス、ディスプレイの接続をしてOSの設定をしなくてはいけないので「次からはLAN経由でPCから操作するための最小限の設定」のつもり*1。
- [Raspberry Piの設定]→[インターフェース]で[カメラ]から[リモートGPIO]まで一応、全部、[有効]にしておく。とくに[SSH]と[VNC]はリモートログインに必要。*2
- [Raspberry Piの設定]→[システム]の[解像度](RPi4では[設定]→[Screen Configuration]→[ウィザードのウィンドウ部分で右クリック])を1024x768以上にしておく。さもないとリモートからVNCでデスクトップ環境を表示したときに、[Raspberry Pi の設定]のウィザードが画面からはみ出して、非常に操作しづらくなる。(学生にGUIで設定を指導するときに面倒になる)
- (Raspberry Pi Zero W Rev 1.1) sudo raspi-config → 7 Advanced Options → A5 Resolution
- Raspberry Pi Zero W/4 B の場合にはUSBガジェット機能を有効にする*3
- /boot/config.txt の最後尾に "dtoverlay=dwc2" と書かれた行を追加する。
- /boot/cmdline.txt の "rootwait" と "quiet" の間に " modules-load=dwc2,g_ether" を書き加える。
- 母艦のWindows機側の設定はRaspberry Pi Zero W(RPi4BもOK)をUSBガジェットにしてUSBケーブル1本でWindows 10マシンから操作する - あらきけいすけのメモ帳
- 次の起動でWiFi経由でリモートログインしたい場合には、WiFiへの接続(ネットワークキーの入力)を済ませる。*4
古典的ルンゲ=クッタ法のPythonプログラムをWikiPediaの記述と同じ変数名で書いてみた
教育用の覚書
Python だと汎用の Runge-Kutta 法のルーチンが6行で書けてしまう*1。以下のコードではルンゲクッタ法ルーチン rk4() を書き換えることなく、1階, 2階, 3階の常微分方程式(ordinary differential equation(s), ODE)を解いている*2*3。関数 rk4() で使っている変数名はRunge–Kutta methods - Wikipediaに揃えた。C言語*4で数値計算をコーディング/教育する気力が一気に失われてしまったwwwwww
次のコンプリートコードは次の微分方程式を積分して、あらかじめ求めておいた解の関数の値と比較している*5:
- class getExpt():
[1階] (比較する解:); - class getSint():
[2階] (比較する解:);
[1階連立ODE] - class getExptSint():
[3階]
(比較する解:);
[1階連立ODE] - class spring():
[2階]単振動(調和振動子)の問題 , すなわち
位置:, 速度:, 加速度: より
(比較する解:, );
[1階連立ODE]
初期条件は比較する解に t=0 を代入して作っている。
import numpy # classical 4-th order Runge-Kutta method subroutine # variables letters are the same as those in # https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods def rk4 ( y, t, h, f ): k1 = h * f( t, y ) k2 = h * f( t + h/2, y + k1/2 ) k3 = h * f( t + h/2, y + k2/2 ) k4 = h * f( t + h, y + k3 ) return y + ( k1 + 2*k2 + 2*k3 + k4 )/6, t + h # each of the following four classes has # __init__(): constructor, # rhsODE(t,y): f(t,y) of the 1st order ODE dy/dx=f(t,y), # ref(t): a reference solution to the ODE. class getExpt(): def __init__ (self): print(self.__class__,' y(t)=exp(t)') def rhsODE ( self, t, y ): return y def ref ( self, t ): return numpy.exp(t) class getSint(): def __init__ (self): print(self.__class__,' y(t)=sin(t)') def rhsODE ( self, t, y ): return numpy.array([y[1],-y[0]]) def ref ( self, t ): return numpy.array([numpy.sin(t),numpy.cos(t)]) class getExptSint(): def __init__ (self): print(self.__class__,' y(t)=exp(-t)+sin(t)') def rhsODE ( self, t, y ): return numpy.array([y[1],y[2],-y[0]-y[1]-y[2]]) def ref ( self, t ): et=numpy.exp(-t); st=numpy.sin(t); return numpy.array([et+st,-et+numpy.cos(t),et-st]) class spring(): def __init__ (self,mass=1,springConstant=1): self.mass= mass self.springConstant= springConstant m= mass k= springConstant self.angularFrequency= (k/m)**0.5 print(self.__class__,' linear spring motion m=',m,' k=',k) def rhsODE ( self, t, y ): k= self.springConstant m= self.mass x= y[0] v= y[1] a= -(k/m)*x return numpy.array([v,a]) def ref ( self, t ): w= self.angularFrequency x= numpy.sin(w*t) v= w*numpy.cos(w*t) return numpy.array([x,v]) if __name__=="__main__": # choose class to e[x]ecute #x= getExpt(); #x= getSint(); #x= getExptSint(); x= spring(mass=2,springConstant=3); # set [ref]erence [sol]ution function # and [f]unction appears in the [r]ight [h]and [s]ide of # [O]rdinary [D]ifferential [E]quation sol= x.ref; f= x.rhsODE; # set parameters h = 0.01; # step-size t = 0; # initial time y = sol(t); # initial condition (y[,dy/dt[,d^2y/dt^2]])_t=0 tEnd = 0.1; # terminal time print(t,y,sol(t),y-sol(t)) # integration and comparison to reference solution while t < tEnd: y, t = rk4( y, t, h, f ) print(t,y,sol(t),y-sol(t))
*1:ルンゲクッタ python - Google 検索で検索すると上位に上がるページに意外と汎用性のあるコードが無い。
*2:ルンゲクッタ法は1階の連立常微分方程式を解く計算スキームなので、n階の微分方程式はn個の関数 に対する連立方程式に書き換える。
*3:Pythonなので関数 rk4() には識別子さえ渡せばいいので、任意サイズの配列 y で計算ができる。例えば3次元流体をスペクトル法で解くとか(配列のメモリアロケーションどうなっとるか知らんけどwwwwww)。
*4:C言語だと構造体へのポインタ
str *rk4( str *y, double t, double h, (str*)f(double,*str) ) { str *k1, *k2, *k3, *k4; ...; return k?; }
で宣言すればいいのかな?
*5:上掲のプログラムは[4]の調和振動子を解いている。[1][2][3]の方程式を解くためには x= の行を適宜、書き換えればよい。
GCC Developer Lite (GDL)をインストールした 64bit Windows 10 PC 上で gcc をコマンドプロンプトから使うための設定方法
授業用の書きかけの覚書
GDL(バージョン2.5)インストール記事はこちら*1H8などのマイコンのプログラミングツールとして GCC Developer lite を 64bit Win10 PC にフルインストールしてしまった場合に、ふつーの Windows x64 (Windows 64bit)プログラミング(C, C++, fortran95*2)もできちゃうので、使うためのセットアップを記す;↓新記述[2022.9.23]
GCC Developer Lite (GDL)を64bitのWindows 10にインストールし hello world プログラムを作成する - あらきけいすけのメモ帳
メモ帳などのテキストエディタを使って、コマンド↓旧記述set PATHC2=\PROGRA~2\BestTech\GCCDEV~1\GCC\x64\bin set PATHC3=\PROGRA~3\BestTech\GCCDEV~1\GCC\x64\bin set PATH=%PATHC2%;%PATHC3%;%PATH% gcc -std=c99 -Wall -lm %~n1.cをコピペして build.bat というファイル名で保存し、C言語のプログラムのソースコードファイル [なんとか].c を build.bat にドラッグアンドドロップする。*3
GCC Developer Lite 内の GCC へのパスと、コマンドプロンプトを起動して、命令 gcc hello.c で実行ファイル a.exe を作ってくれる。GDLの[ツール(T)]⇒[コンパイルオプション(O)]⇒[設定リスト]の[x64 (Windows)]をいちいち設定するより簡単。C:\Program Files (x86)\BestTech\GCC Developer Lite\GCC\x64\binを環境変数 Path に書き加える*4
環境変数 Path の設定方法
- [スタート(窓マーク)]⇒(スタートメニューが開く)
- ⇒[設定(メニューの左端下の歯車マーク)]⇒([Windowsの設定]ウィンドウが開く)
- ⇒[設定の検索]枠に「環境変数」と入力⇒(検索結果が現れる)
- ⇒[環境変数を編集]を選択⇒([環境変数]のウィザードが現れる)
- ⇒[[Username]のユーザー環境変数(U)]内の[Path]を選び、[編集(E)...]をクリックする⇒([環境変数名の編集]ウィザードが開く)
- ⇒[新規(N)]をクリック⇒(環境変数の最後の行の下に入力用の枠が現れる)
- ⇒その枠に"C:\Program Files (x86)\BestTech\GCC Developer Lite\GCC\x64\bin"と書き込み*5⇒[環境変数名の編集]ウィザードの[OK]をクリック⇒[環境変数]ウィザードの[OK]をクリック
*1:2020.7.1に追記
*2:GCC, the GNU Compiler Collection - GNU Project
*3:PATH2 はGDL 2.5以前のパス、PATH3 は GDL 2.7 のパス。GDL 2.6 は短命だったので、知らない。
*4:新記述:パス名を8.3形式で書けばよい。GDLの吐いたバッチファイルを読めば一目瞭然であった。(2022.9.23)
旧記述→参考:組込みエンジニアのブログ gcc: error: CreateProcess:No such file or directory の対処法 にも書いてあるように、バッチファイルに Path を追加して書いても 、ファイルをコンパイルするときに gcc: error: CreateProcess: No such file or directory が出てしまう。どうもディレクトリ名の " (x86)"の部分が悪さをしているようである。
*5:"C:\Program Files (x86)\"は GCC Developer Lite を64bit Windows PC にインストールしたときのディレクトリ名。32bit OS の場合は""C:\Program Files\"である。
JavaScript/Google Apps Script/Excel/Spreadsheet 覚え
- JavaScript リファレンス - JavaScript | MDN
- Reference overview | Apps Script | Google Developers
- GAS ビギナーが GAS を使いこなすために知るべきこと 10 選 - Qiita
- Google Sheets Button: Run Apps Script With A Single Click
- GASでフォルダ名, ファイル名を指定して, Excel ファイルをスプレッドシートに変換する - あらきけいすけのメモ帳
- 1つのGASを複数のスプレッドシートで利用する方法(新エディタ版) | 非IT企業に勤める中年サラリーマンのIT日記
- Google Apps Scriptライブラリの作り方 - Qiita
- Google Apps - 通知メールを飛ばさずにGoogle Driveフォルダに権限追加する方法 - Qiita
[2022.5.9現在]ここに書いてある手順は「クラシック エディタ」での操作になっている。 - [GAS] [実践]Excel ファイルからフィルターを消した上で Google Drive にアップロードする
[背景] Google Drive に Excel をアップロードして、Google Apps Script で Spreadsheet に変換したときに、Sheet 内にフィルターが設置されていると、フィルターの設置された列のフィルターより下の行に含まれる結合セルの結合が解除されてしまうようだ。元 Excel のセルの結合情報を利用するときに情報が変わる。