富山人が信用できない理由

富山市に越してから二年が経った。こういうご時世なので呑み歩いたりレストラン巡りは出来ない。他人と接する機会が少ないが、それでもまあ余所の人と話をしたり、業務上の連絡をしたりする。で、少ないサンプル数ながら私が至った結論は「富山人は信用できない」だ。

 

その場しのぎの嘘をつく人が多いのだ。そんなクソみたいな人間がいるとは思っていなかった私はころっとヤラれていた。後から考えると辻褄がつかないぞ、と気付いて腹が立つわけだ。何度かこういう事が在ったので何故なんだと考えてみたわけだ。

 

ジェネリック薬品会社の不祥事*1

薬都富山などと喧伝しているが不祥事だらけ。日医工北日本製薬、日新製薬と軒並み富山の事業者が摘発されている。理由は明らかだ、こいつらにはそもそも薬を製造する能力が無いんだ。

 

昔のお殿様が支那人から製造法を教わり生産・販売を初めたのが事の起こりだとか。藩は薬品の販売に力を入れ、人材を育成するための学校を作ったりした。全国に販売網を広げ、置き薬という決済方法なども取り入れ、大成功し今に至る。っつうのが富山人が語るお故郷自慢だが、この話に既に答えが含まれている。細かく見てみよう。

 

  • 薬の製法は教わったものであって、考案したものではない。
  • レシピがあれば当時の薬は生産するのは難しくはない。自慢することではない。
  • 学校で教えていたのは読み書きそろばんと販売に必要な薬の知識であって、製薬や創薬ではない。販売員を育てていただけで、薬学部といより商学部であろう。

 

つまり、薬の富山と言ってはいるがこれは半分嘘で、本当は「売薬の富山」なのだ。国立大薬学部(笑)などと言うが、商学部程度の教育しかしてなかった学校を祀り上げてうまいこと駅弁大学に喰わせただけ。そんな成り立ちなので教育者も学生も程度は知れている。こんなとこに県外から来るスキモノが居るのか知らないし、無意味。おおむね地元富山の雑魚い人間にさらに磨きを掛けてるんでしょう。

 

どうやって売薬で成功したのか

なんとか拵えた薬を背中に担いで売りに行くわけだ。だが余所の藩で商売するには許認可が必要だ。当時からクズいと評判の薩摩藩は認可の代償として売薬して旅する商人にスパイ行為をさせることを強いたのだ。更には支那への抜け荷のカムフラージュとして富山の昆布商船も利用した。

 

富山の商人は副業で隠密を行い、富山の商船は密輸の片棒を担いでいた。利益の為なら人を欺くことを厭わない、お上の決めた法律も関係ない。トンデモナイな。富山人が薬だ昆布だと言い出したらこの話をして黙らせましょう。

 

人を騙してでも法を犯してでも金が欲しいのが富山人。刻まれ継承されたたスパイ・密輸のDNAは現代も健在だ。人様の口に入るもの、しかも薬効を期待させ高価で売りつけるものを積極的に損なっていく姿は正に土人いや土人以下だ。

 

不祥事を起こしたのがジェネリックというのも興味深い。薬を売っては来たけど、創薬なぞもってのほか、なのでジェネリック薬品ということなんだが。その製薬もままならないので不祥事を出してしまう馬鹿っぷり。こいつら本当に日本人かな。嘆かわしい。

 

信用・信頼に値しない

富山市内・県内のみならず、県外に出た富山人にも警戒すべきだ。こいつらは「バックスタブ上等。ハシゴ外し当たり前」という富山ルールで行動している。おー怖っ。上司や同僚、部下に富山人が居ないか確認しておきましょう。

 

ま、全ての富山人がクズだとは言ってません。そういう傾向なんじゃないかなという個人的な意見。もひとつ、富山人の女性は気の利かない田舎モンというだけでクズ率はやや低い。男性は圧倒的にクズいし雑魚い、しかもオトコブス。一旦東京などで大学生活を送り還ってきた旦那衆などはマシなんでしょうが、そこら辺の大学生だのニーチャンだのオッサンだのはほぼ全て雑魚という認識からお付き合いを始めた方が良い。

*1:ADRが正式発表となった5/13に部長級以下10名ほどで居酒屋で祝杯揚げていたのを目撃した。要するに、裁判沙汰にならなくてバンザイ、イエーつうわけだ。世の中舐めてんのか、死んでくれ。

20世紀の遺跡を訪れる

前世紀の遺物、といってもQuake IIIのソースコードの一部。単位ベクトルを計算するのに必要な  1 / \sqrt{x} の計算量が馬鹿にならない。なんとかならないかと先人が工夫した結果がこれだ。

float Q_rsqrt( float number )
{
	long i;
	float x2, y;
	const float threehalfs = 1.5F;

	x2 = number * 0.5F;
	y  = number;
	i  = * ( long * ) &y;                       // evil floating point bit level hacking
	i  = 0x5f3759df - ( i >> 1 );               // what the fuck? 
	y  = * ( float * ) &i;
	y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
//	y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed

	return y;
}

なんのこっちゃ判らないので、説明してくれてる動画をどうぞ。

www.youtube.com

この動画見てなるほどって言える人は情報系の学校行った人なんかだと思われます。ソフォモアまでの数学と計算機科学と英語の単位が必須です。これだけでは何なので、普通の人でも分かった気になれそうな説明をしてみます。暇ならどうぞ。

なにはともあれ、IEEE754

突然ですが、浮動小数点を計算機で扱うときの規格を理解するのが結果的に早道かと。浮動小数点つうのは、

 \displaystyle
1.38064852 \times 10^{-23}

みたいな表記法で、小数の表現に便利。で、計算機内には 4バイト = 32ビット を使って、この小数が格納されており、そのための規則が IEEE754 つうわけ。詳しくはWikipediaでも見てもらうとして、大事なのは、MSBから、正負の符号 1ビット、指数部 8ビット、残りLSBまで仮数部 23ビットの、合計32ビットということだ。

  • 符号 (Sign)は、0がプラス、1がマイナスを示す。
  • 指数部 (Exponent)は 8ビットなので、[0 .. 255] の整数を表現できるが、規格では 127 を引いて、[-127 .. 128] に対応させる。
  • 仮数部 (Mantissa)は 23ビットで、これを全て小数点以下に当てると 0 ≦ M < 1 を表現するが、規格ではこれに 1 を足したものを仮数としている。つまり、1 ≦ M < 2 となる。

例えば、1.75E-1 を例に取ると、1.75 から1を引いて 0.75、これを二進数にすると1100 0000...。仮数の-1 に127を足して126、二進数で0111 1110 となり、ビットは、0 0111 1110 1100 0000 0000 0000 0000 000 となる。

ひとつめのトリック

なぜ長々と浮動小数点の二進表記まで説明したのか。このトリックの説明にどうしても必要だから。先ずはさっき例に出した 1.75E-1 の内部表現を見てほしい。

0 0111 1110 1100 0000 0000 0000 0000 000

やっぱりなんのことだが分からないよね。それで良いんだ。計算機内部に保存されてるデータそのものに意味はなくて、意味を付けているのは使用している人間の方なんだ。だからこの01の並びをIEEE754に従って浮動小数と解釈するのも、整数と解釈するのもこちらの勝手なのだ。先程の浮動小数点の指数部を  E仮数部を  M として、

 \displaystyle
x \equiv ( 1 + \frac {M}{2^{23}}) \times 2 ^{E - 127}

が表現される小数だ。逆に、上の内部表現を無理やり整数として読み取るとこんな感じになる。

 \displaystyle
M + E \times 2^{23}

そうなんだ勝手なのよ。この2のべき乗は桁を左右にずらす意味だよ。んじゃ、さっきの小数を xとして、 \log xを考える。ここで言う \logは底が2なので、例えば、 \log (8) = 3 となる。

 \displaystyle
\log ( ( 1 + \frac {M}{2^{23}}) \times 2 ^{E - 127} )
= \log ( 1 + \frac {M}{2^{23}}) + E - 127

 \log ( 1 + \frac {M}{2^{23}}) は、 0 \leq \frac {M}{2 ^ {23}} \lt 1 であることから、  \log ( 1 + \frac {M}{2^{23}}) \approx \frac {M}{2 ^ {23}} + \delta と近似できる*1 \deltaは補正定数、後で説明する。よって、


 

\begin{eqnarray}
\log ( 1 + \frac {M}{2^{23}}) + E - 127
& \approx & \frac {M}{2 ^ {23}} + \delta + E - 127 \\
& = & \frac {1}{2 ^ {23}} (M + E \times 2^{23}) + \delta -127 \\
\end{eqnarray}

となる。で、 M + E \times 2^{23} の部分に注目すると、これは、計算機の内部表現を無理やり整数として解釈したものと同じだ。やっやこしいが、こういうことだ。浮動小数の内部表現を無理やり整数として解釈したもの、それを 2^ {23} で割って、 \delta 足して、127引くと、 \log (x) が求められる。衝撃だよね、ダマサれた感あるね。引用した説明動画のコメントにsloppy math とblack magic の中間だ、と表現したものがあったけど、そのとおりだね。

マジックナンバー

平方根の逆数じゃなくって \logのはなしばかりでしたが、いよいよ本題に入ります。 \Gamma \equiv \frac {1}{\sqrt {x}} として、 \log (\Gamma)を考えます。

 

\begin{eqnarray}
\log (\Gamma) & = & \log (\frac {1}{\sqrt {x}}) \\
& = & \log (x ^ {- \frac {1}{2}}) \\
& = & - \frac {1}{2} \log (x)
\end{eqnarray}

 \Gamma x仮数部、指数部をそれぞれ、 M_\Gamma,  E_\Gamma,  M_x,  E_x として、上の等式を書き換える。 \log (x) =  \frac {1}{2 ^ {23}} (M + E \times 2^{23}) + \delta -127 であったので、

 

\begin{eqnarray}
\frac {1}{2 ^ {23}} (M_\Gamma + E_\Gamma \times 2^{23}) + \delta -127 & = & - \frac {1}{2} ( \frac {1}{2 ^ {23}} (M_x + E_x \times 2^{23}) + \delta -127 ) \\
\frac {1}{2 ^ {23}} (M_\Gamma + E_\Gamma \times 2^{23}) + (\delta -127) & = & - \frac {1}{2} (\delta -127) - \frac {1}{2} ( \frac {1}{2 ^ {23}} (M_x + E_x \times 2^{23} ) \\
M_\Gamma + E_\Gamma \times 2^{23} & = & - \frac {3}{2} 2 ^ {23} (\delta -127) - \frac {1}{2} (M_x + E_x \times 2^{23})

\end{eqnarray}

 

\begin{eqnarray}
なんらかの整数 & = & マジックナンバー - \frac{1}{2} \times 小数xを無理に整数で解釈したもの
\end{eqnarray}

となります。ここがソースコード

	i  = 0x5f3759df - ( i >> 1 );               // what the fuck? 

の部分です。二分の一倍はビットシフトで書き換えてますね*2

小数の内部表現を無理に整数で解釈するというのが、この部分。

i  = * ( long * ) &y;                       // evil floating point bit level hacking

その逆、整数の内部表現を無理に小数で解釈するというのが、これ。

	y  = * ( float * ) &i;

ポインタのキャストのデリファレンス?で良いのか?よくわからんが確かにevil だ。現代風に、コンパイラが文句言わないようにunion とかで置き換えて理解するのが良いかも。

このマジックナンバー、ソースでは 0x5f3759df と記されています。仮に \delta = 0 とすると、0x5F400000 となりますから、何らかの味付けがされているようです。逆算すると \delta = 0.045... となります。作者は数学的なアプローチではなくトライアンドエラーで決定したとも伝えられています。また、このマジックナンバーについての学術論文もあるようです。

仕上げも念入りに

狐にダマサれたまま \frac {1}{\sqrt{x}} の近似値が出てしまいました。この近似値はなかなかイイ線いってて、こんな感じです。

f:id:rikipoco:20210820181949j:plain

赤線が近似値、黒線が計算値です。全体的に下ぶれしてます。これを補おうというのが \delta だった訳です。しかし、ここで手を抜いてるようでは一流とは言えません。さらに仕上げの一発をぶっ込んできます。ニュートン法です。関数の解を繰り返しの数値演算で求めるものです。ソースのこの部分がそうです。

	y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration

 f(y) \equiv \frac {1}{y^2} - x とすると、 f^\prime (y) = - \frac {2}{y^3} となるので、

 

\begin{eqnarray}
y_{n + 1} & = & y_n - \frac {f (y)}{f^\prime (y)} \\
& = & y_n - \frac {1 / y_n^2 - x}{- 2 / y_n^3} \\
& = & y_n + \frac {y_n - xy_n^3}{2} \\
& = & \frac {3}{2} y_n  - \frac {xy_n^3}{2} \\
& = & y_n \times (\frac {3}{2} - \frac {x}{2} y_n^2)
\end{eqnarray}

となる。ソースコードでは二度目のニュートン法コメントアウトされてます。一回で充分なんす。

時は流れて

対数と浮動小数点の内部表現をつかったトリックは、数学者でもプログラマでもなく天才の閃きとしか言えない。さらに、ニュートン法でキッチリ落とし前をつける下りは見事、着地満点。しかし、1995年に発表されたIntelx86の命令セットのSSEによってこのコードは墓場行きとなりました。そうなんです、本当に前世紀の遺跡だったのです。Quake IIIの戦場が未来の遺跡に見えてきましたか?見えませんか、そうですか。

*1:テイラー展開すれば確認できる

*2:ふだんつかってる十進法で、桁を左に、つまり小数点を右にひと桁ずらすと数は十倍に、その逆なら十分の一になるように、二進法にも同様の演算が有ります。二進法では、桁を左に、つまり小数点を右にひと桁ずらすと数は二倍に、その逆なら二分の一になります。

Linuxで擬似サラウンドヘッドホン体験する

サラウンドっつうとあれですね、5.1とかDTSとかそういうやつ。AVアンプから左右、後方左右、センター、ウーファーと6本スピーカーつないで聞くヤーツ。で、最近良く見かけるのが擬似サラウンドヘッドホンつうやつ。ヘッドホンなのでスピーカーは左右二台だけなので「疑似」つうこと。

 

要するに音の位相や音量、エコーなんかを付加した音でそれっぽく聞こえるようにしてるだけなんだ。サラウンドヘッドホンつう物を買ったことがないけど、多分OS依存だとおもう。そんなん悔しいのでOSに依存しない、普通のヘッドホンを擬似サラウンドヘッドホンにでっち上げてみる。

 

疑似サラウンドの概論くらいは目を通してもらったほうが良いかも。

note.com

こういう専門家が惜しみもなく知識を分けてくれるのはありがたいですね。頭部伝達関数がキモなんですが、個人個人で耳の形も違うし、脳の作りも違うので、これと言った正解や決定版はない訳です。市販の疑似ヘッドホンは最大公約数的な、万人向けの頭部伝達関数なんじゃないかな、知らんけど。なので、自分に向いた伝達関数を見つける必要が有ります。

recherche.ircam.fr

ここに視聴用の音源が有ります。ftpサイトなのでブラウザによっては直接視聴できないかも。つか私も駄目でした。おとなしくwgetかなんかでまとめてダウンロードしました。ヘッドホン装着して視聴してみてください。頭の廻りを音源が周っているように聞こえるはずですが、音源によっては具合が違うはずです。私の場合、後ろに周っていく音は音源による相違は小さかったのですが、前方にあるべき音が頭頂から聴こえてくる音源が多かったです。

自分にあった音源と同じ名前のインパルス応答データをさっきと同じftpサイトからダウンロードして、Matlabスクリプト伝達関数を造ります。以下のサイトを参考にしました。

forum.endeavouros.com

これで完了です。疑似サラウンド初体験ですが、かなり良いです、ロハだし。半日くらい遊べました。

Raspberry Pi ZeroでBluetooth A2DP接続可能なFMトランスミッタを拵える、試み

- 購入品

こいつ買いました。ヒートシンクはケースを固定してから貼り付けたほうが良いでしょう。ネジ穴に遊びがあるので、先にヒートシンクを固定するとケースのネジが入らなくなることもあります。HDMIケーブルはMiniでした。

 

- 準備

Rasbian BusterのイメージをSDに焼いてブートします。GUIが立ち上げるのでマウスを接続して、またあるときはキーボードを接続してネットワークの設定を終えます。

メインメニューからRasbianの設定つうとこで、次回ブート以降はCUISSH有効としておいてからリブート。こっから先は全てSSH経由で行います。

 

- 注意

あちこちのサイトにGPIOに20cmの電線つなげと書いてますが、やっちゃ駄目です。久しぶりに太字にしたな。もう一度。やっちゃ駄目です。

野良FM局として認められる出力を簡単に超えちゃいます。アンテナは接続せず、受信側のラジオのアンテナを近づけてテストしましょう。

asliceofraspberrypi.blogspot.com

もうひとつ、テストが終わったらraspiはshutdownするかrebootしましょう。じゃないと搬送波が出力されっぱなしです。

私は最終的にFMトランスミッタとしての使用を諦めました。そうで無い方はバンドパスフィルタを入れたほうが安全でしょう。GPIOを矩形波で駆動しているので奇数次の高調波がモリモリ出てます。飽くまでも自分で何やってるか分かってる人が自己責任でやっちゃってつかあさい。人に迷惑をかける前にバカは帰ってください。

 

- 情報収集

お題目のようなことは誰かが何処かでもうやっちまってるんでパクりゃあええんです、パクりゃあ。

mickey-happygolucky.hatenablog.com

割と分かりやすかった。誰にでもわかるBluetooth A2DPの拵え方。PulseaudioでSinkを作ってます。で、ほぼこの通りにA2DPレシーバを設定して、pifmで飛ばしてみたのだが、あまり芳しくなかった。Pulseaudioのバッファリングに問題があるのだろうと予想するが、どもっちゃうんだ、吃音、stutter。

実際、/etc/pulse/daemon.confのrealtime-scheduling、resample-method、avoid-resampling、default-fragments、default-fragment-size-msecをいじくり回すとやや改善するんだが、数十秒に一度程度の頻度で吃音しよる。

Pulseaudioって便利に使ってるけど、造りが大仰な分レスポンス悪いイメージだよねえ。しかし、我々にはALSAがあるさ。しかーし、

stackoverflow.com

質問は2012年、回答が2014年、フォローが2017年というご長寿で且つ示唆に富むスレッド。回答の中にあったリンクが面白かったので読んでみよう。

From the desk of James - Powered by SJPPLOG

 読んだ?隔靴掻痒感がひっしひしと伝わってくる。ともかく、bluez4から5にバージョンアップした際にA2DPシンク対応は外されたらしい。んで、話にには続きがあって、

From the desk of James - Powered by SJPPLOG

/etc/bluetooth/audio.confのSocketってどういう意味だよ、ってんで分かんねえんだよ、資料は何処だよ、つって騒いでいる。bluezはそもそもIntel主導で開発が始まり、その後Nokiaに渡り、と出生がややこしい。んで、必要な資料さえままならない。

加えて、SourceとSinkの考えが混乱している。Sinkが欲しいのに、audio.confにはSourceと書かなきゃならない理由がはっきり書いてあった。頭おかしい。

で、時は流れて。bluealsa (かつてはbluez-alsa)が生まれた。

qiita.com

このとおりにやって上手く行く人は上手く行くでしょう。そうじゃない方は恐らく、bluetoothctl showとやってもSinkが列挙されていないのではないでしょうか。手持ちのスマートフォンからRaspiのbluetoothが見えていて、connectボタンを押せるのに、接続されたかと思うとすぐに切断される。bluealsaのサービスがデフォルトではSinkが有効になっていないんです〜、おー怖っ。/lib/systemd/system/bluealsa.serviceをさっさと書き換えましょう。

 

[Unit]
Description=BluezALSA proxy
Requires=bluetooth.service
After=bluetooth.service

[Service]
Type=simple
User=root
ExecStart=/usr/bin/bluealsa -p a2dp-sink

 

 - 使えるのか?

bluetooth A2DP経由でpifmへ流し込んでFM放送できます。でも使えません。pifmが音痴なんです。CPUに負荷が掛かるとdistortion、歪が耳障りなレベルで発生します。

Clock output & FM transmitter - Raspberry Pi Forums

pulseaudioの時は吃音がひどくて歪には気が回りませんでしたが、確認したら音痴でドモリでした。

音楽を聞かないのならありかも。

 

 

 


金属バットで殴られた

ええ歳こいてM1観てたんですわ、ええ。敗者復活戦からがっつり、ビール呑みながら。いやあビックリしたわ、金属バット。おもれーやん。

がっつり泉州よりの関西弁に斬新なツッコミ。「おらおらよいっしょー」で終わる漫才初めて観た。知らんかったわこんなん居ったって。関西に住んでればローカルの番組で見知る機会もあっただろうにと思うと悔やまれる。しかも堺出身ときてるし、知ってれば応援してただろうと思うとこれまた悔やまれる。

あき竹城とみちょぱイジりも最高に良かった。「ギャルのネエチャンなんか云うてくんなはれやー」だと。