オッサンはDesktopが好き

自作PCや機械学習、自転車のことを脈絡無く書きます

Super Cycle Enduro in 下総,チーム 1.5 h 3位入賞

 こんにちは.changです.

 Super Cycle Enduro in 下総にチームで参加しました. 結果は3位入賞🤣 嬉しいの一言で片が付くのですが,せっかくなので振り返りを書きます.

f:id:changlikesdesktop:20211201054557j:plain:w400
レース会場の下総運動公園

レース当日まで

 袖ヶ浦160 km*1の一週間後だったので,レースに向けて準備をするというよりも,疲れを抜いて体調を整えることに努めました.

 火曜日の回復走で,少なくとも身体の痛みはとれたと感じました. そこで,水曜日に少し強めのワークアウトをやりました. 結果,,,撃沈😖

f:id:changlikesdesktop:20211129202203j:plain:w400
水曜日には未だ疲れを引きずっていました

 袖ヶ浦160 kmは土曜日だったので,4日目に疲れが残っていた事になります. こんなに疲れを引きずったのは初めてかもです. やはりというか,160 kmは別次元でした.

 レース前に踏めない体験をすると,不安になります. 木曜に同じワークアウトをやって気持ちの切り替えを図りますが,体調が万全ではないことを肌で感じることにもなりました. 不調なわけではありません. 富士ヒルの時*2の様にピークが来ていない感じです. 乗鞍が中止になってから,レース向けの高強度トレーニングをサボってしまったからでしょう...

 前日に乗るかも迷いました. 今年はレース前日に軽めに走って結果が出てました. また,実走で少しでもポジティブな感触を得ておきたいという焦りもありました. で,走ったんですが,やはり調子は良くなかったです. おまけに,クリートを外すのにもたついて左脚の四頭筋を攣ってしまいます. 集中出来て無いと思い,早々に帰宅して寝ることにしました.

f:id:changlikesdesktop:20211202212354j:plain:w400
前日ライド.無駄に距離を走ったのは,不安の表れだったのでしょう

レース展開

 前日に不安を残してましたが,言い訳はできません. 特に今回はチーム戦です. 一応,現在チームのエースという事になっているみたいですし,誘ってくれた仲間に応えたい気持ちがあります.

 チームメートの車に便乗させてもらって,会話しながら会場入り出来たのが良かったです. タッグを組むチームメートが「調子が良い,キツかったら早めに代わって」と言ってくれて,肩の荷が少し降りました😭 一人で移動していたら,不安を引きずっていたと思います.

f:id:changlikesdesktop:20211201053710j:plain:w400
移動中の一枚.影が白線上を走っている様に見えて素敵です.運転しないのでリラックスしまくりwww

 今回は4人で,2名ずつのチームを組んで参加しました. 仮にAチーム,Bチームと呼びますが,僕はBチームの第1走者でした. スタート時にチームメートが居るのは心強いです. 僕が整列でモタついていた時もAチームの仲間がフォローしてくれて,良い位置からスタート出来ました.

 ローリングで追い越しOKと言われたので,スタート直後から集団の前方に上がります. リアルスタートと同時に加速をしかける選手がいたので,景気付けに付いていきます.

 明確な作戦があった訳ではありませんが,チャンスがあれば逃げに乗りたいと思っていました. 集団に対して先行してピットインすれば,後続のチームメートの集団復帰が楽になるからです. 他の選手のアタックに反応したり,自らもアタックを試みましたが,上手く強調出来ませんでした. 単純に,集団から抜け出るパワーも足りなかったです. 登りの長さが5倍あればなぁ...

 結局,集団に乗ったまま50 min程が過ぎてしまい,交代することにしました. Aチームと協力して,何とか集団の先頭まで上がってピットインしました. (ソロ参加の)周りの選手は,僕らがチーム参加なのを解っていなかったのだと思います. 見分けが難しいタイプのゼッケンで,自分達もどの選手をマークするべきか判わずに走っていました.

 2人同時にピットインした(=残りの2名が同時にコースインする)ので,計測チップを付けてくれる第三者人がいません. 走りながら外して手渡そうとしましたが,ピットに入る道が狭くて躊躇しました. 止まってから外そうとしましたが,チームメートが手際良くやってくれたので任せました. 「(付け外しを)自分でやる必要があるから」と,バイクを降りた状態で待機してくれていました.

 交代した2人で強調して先頭集団を追いかける展開になります. ところが,集団の人数が多くてタイム差を詰められません. 脚を止め,周回遅れで集団に合流する戦略を採りました. レース中にこの判断をしたのが若干中学3年生なので驚きです👏

 Aチーム,Bチーム共に先頭集団でゴールしました. この時点では順位が判りませんでした. 集団から抜け出したチームがいない様に見えたので,表彰圏内には入っていると予想していましたが... 気が早る中しばし待機して,Aチーム4位,Bチーム3位という結果が出ます🎖

イベントについて

 このイベント,昨年出た時に揉め事に遭って*3から避けていました. 実際,今回もサポートライダーや先導車がいなくて,多少の危険を感じました. 救急車が2台来たので,怪我人が出たことも事実です. ただ,低コストで10年も運用を続けられている,貴重なイベントなのでしょう. 初心者でも参加し易いというか,良い意味でのまったり感があります. 前回は少し感情的になりましたが,これからも続けて欲しいと思います.

 ちなみに,今年参加したレースのライダースミーティングの多くで「初心者に対してキツい事を言わないで」という旨の注意を受けました. アマチュアレースでは,レベル差や温度差の在るライダー達が一同に走ります. 他者を尊重する事が大切ですね🤔

むすび

 久しぶりにチームでレース参加できて楽しかったです😀 内輪話ですが,今回タッグを組んだチームメートは,前回の参加時には落車からのリハビリ中でした. 自身は出走できないのに,応援に駆けつけて下さったのです. あれから丁度1年. また一緒にレースを走れて,ついでに入賞もして,,, 流行病も収束傾向にあり,日常が戻ってきた感があります. とは言え,レースに出る以上は常に落車の危険がありますし,第6波も心配です. 気を緩めない様にですね.

 再来週,懲りずに袖ヶ浦4hに参加します. 今度こそシーズン最終戦ですwww できる限りの準備をして,悔いなく走ってこようと思います.

環境問題って宗教なんだけどね...

 こんにちは.changです.

 捻くれた内容の記事ばかり書きたくなるのは,欲求不満の表れなのかと心配になる今日この頃です. 偏屈で憂さを晴らさんとした記事にはしたく無いので,冷静に務めて書きます. 環境問題,特に地球温暖化についてです.

1. エコって何?

 この言葉,最近あまり使われなくなったかも知れないですね. 答えは,エコロジー(=生態系学)の略です.

 「生態系学」って言われると,何か重くてとっつき難い印象がしませんか? 一方「エコ」だと,ポップで,良い意味で実態が見えにくい感じがします. エコノミー(=経済学,家計に易しい)と掛け合わせることで,身近さを演出した言葉でもあります. 流行語みたいなものでしょう.

 環境問題とか,生態系という概念を僕が知ったのは,小学生の頃です. 実習形式の授業で,数人で組んだ班で特定のテーマについて調べ,発表しました. 酸性雨,オゾンホール,地球温暖化,海洋汚染の中から好きなテーマを選べ,と言われたと思います. 不思議と良く覚えています. 当時の僕はとても素直でwww,大人の言う事にも興味を持ったんですね.

 僕が居た班は海洋汚染を選びました. 「味噌汁一杯を魚が住める状態にするには,風呂桶一杯分の水で薄める必要がある」みたいな事を学びました. 他の班がどのトピックを選んでいたかは詳細に覚えてません. ただ,高々30年前の当時,温暖化が一番人気で無かったことは確かです.

 今でこそ,環境問題=温暖化みたいになりました. その他のトピック,つまり酸性雨やオゾンホールは何処にいったのでしょう? 高々30年の間に解決したのでしょうか... そんな訳ないですよね.

 話を小学生時代に戻します. 思えば,実習で参考にした書籍が良く出来ていました. 友人が持ってきた漫画雑誌だったと思います. あるキャラクターが「環境を破壊する人間を排除すればいいんじゃね?」みたいな発言をします. それに対して先生的なキャラクターが諭します. 「人間も生態系の一部.(人間を排除するかを含めて)決めるのは生態系だ」

※ 原本不明ですし,僕なりの意訳が含まれると思います.

2. 今日の天気予報が当たらないのに,何故,100年後の気温が判るの?

 僕は自転車乗りですので,天気予報に右往左往される事が多々あります. 今年の夏も,予想外に発生した雨雲に何度もずぶ濡れにされました. 科学技術はどんどん発展している筈ですが,天気予報の正確さは昔と変わらない気がします.

 天気予報って,どうやってするのでしょう. 簡単な例を挙げると,「現在ここにある雨雲は時速何 kmで北上している.だから,明日にはそこに到達して雨を降らすだろう」というやり方です. 小学生レベルの算数で答えが出せます. この様に,単純で唯一つの答えを導き出すことが出来る問題を線形問題といいます. 一方,「風が山にぶつかって上昇気流が発生し,雨雲が発生する」とか,「海上で暖められた水蒸気が上昇気流を発生し,台風が発生する」といった現象はより複雑です. 簡単には答えが出せない非線形問題です. 感覚を掴みにくいかと思いますが,非線形問題では唯一の答えを導き出すことが出来ません. 似たような条件をコンピュータの中に構築し,特定の条件下ではこうなるだろう,という予想をします. 世界中の研究者がスーパーコンピューターを使ってこれをやってますが,なかなか難しいのです.

 ※ 僕は気象予報士ではありませんし,流体力学の専門家でもありません. 不正確な事を言ってしまったならば,申し訳ありません.

 これまでの話を踏まえて,未来の地球の気温を予想してみましょう. 過去100年間で平均気温が1℃上昇したから,今後の100年も同様に上昇するだろうと予想をしたとします. これは線形問題です. 実際,温度計の発明から数百年程の実測データがある筈です. このデータに基き,直近の数百年と同様に気温が上昇し続けるだろう,と主張するのは紛れもなく正しいです. 一方,温室効果ガスの増加と地球全体の気温の上昇の関係は,複雑な非線形問題です. 温室効果ガスというのは,ニュースで二酸化炭素と呼ばれているものの総称で,気温を温める効果があります. 農家の方が使うビニールハウスの中が暖かい要因の一つが,この温室効果です. 地球温暖化というのは「大気中の温室効果ガスが増えているから地球全体の温度が上がる」という理屈なんですが,風とか海流の影響を含めた正確なところは誰にも解らないのです.

 正確でなくてもリスクがあるなら回避しよう,と行動するのは良いと思います. 実際,温暖化についてはこれだけ多くの研究者が賛同しているので,おそらく嘘ではないのでしょう. ただ,おそらく嘘ではないレベルのリスクなんて,他に幾らでもあります. 不謹慎ですが,今が戦争の渦中だったら誰も温暖化なんて気にしません. コロナ渦でエコバックの衛星を気にし始めた方もいらっしゃるのではないでしょうか? 50年もすると,誰も温暖化とか気にしなくなるかも知れないですね.

3. 科学技術

 多くの方が温暖化を正しいと感じる要因の一つが,「科学者が言っているから」だと思います. 僕は工学系ですが,一応,理系大学で学位を取った科学者の端くれです. 今この瞬間も論文を書いている訳ですが,,,自身の主張を絶対的に正しいとか,絶対的な正義として打ち立てよう等とは思っていません.

※ 随分前に査読を受けるのを止めてしまったので,僕の記事を論文と呼ぶのは不適切ですが.

 論文を書くというのは自己表現の一つです. 歌を歌ったり,歌詞を書いたり,楽器を奏でたり,小説を書いたりといった行為と同じです. 伝わる事もあれば,伝わらない事もあります. 自身の意図とは異なった解釈をされることもあります. 中身は同じなのに,複数の表現方法が在ったりします. 科学者は,自身の思いを伝える為のテクニックを日々磨いているのです.

 理の上では,科学技術研究に「自身の思い」は伴わない筈です. データには人の意志が介在せず,議論は客観的とされるからです. 大学に居た頃からずっと,僕は異なる感覚を持っています. 少しうがった言い方になりますが,科学技術の方法論の中にも一定の緩さというか,冗長性が存在します. 多くの研究者が温暖化を正当化するデータを採っていますが,逆に,温暖化を否定するデータを採ることもできるのです. この先,温暖化を否定するデータが世の中に溢れかえる状況だって生じ得ます. 常識から一線を画した研究にはお金が出ないことが多いので実際には難しいのですが,,,流行りなのです.

※ 捻くれた禅問答ですが,科学哲学という分野で実際に議論されています.

 中学の歴史の授業で,誇大化した教会勢力に対する抵抗として自然科学が大頭した,と教わりました. 今の教科書ではどうなのかな? いずれにしても,歴史はシーソーの如くです. 右に寄って,左に翻って,また右に戻るみないな... アメリカの選挙を見てもそうですね.

 日本人の多くは無宗教ですので,科学的に証明された事実が,哲学とか宗教よりも正しいと感じ易いでしょう. 一定に正しいと思いますし,一定に間違っていると思います. 歴史的には,科学技術は哲学の一派です. 科学的に証明された温暖化を信じるのは,一つの宗教を信じるのと同じなのです.

 COP26が閉幕しましたが,温暖化を共通正義にしようとする議論はある意味危険です. 一つの宗教を大多数に強制すると戦争が起きる事は,歴史が証明しています. 現代社会の一つのキーワードが「多様性」だと思いますが,誇大化・形式化する科学技術に対する抵抗なのかも知れないですね.

4. 子供をダシにしないで

 最後に,わざわざこんな記事を書いた理由を述べます.

 きっかけは,国営ニュースがスウェーデンの少女を神聖化するのを不愉快に思ったことです. 彼女の信念や活動については何の文句もありません. 素晴らしい人格と表現力を持った人物だと思います.

 だからこそ,政治利用されて欲しく無いと考えます. 彼女はキリストでもジャンヌダルクでも無いのですから.

サイクルジャンボリー袖ヶ浦160 km: 25位

 こんにちは.changです.

 サイクルジャンボリー袖ヶ浦の160 kmチャレンジに出走しました. 結果は25位(出走43人). 自分の課題が改めて浮き彫りになりました😓

f:id:changlikesdesktop:20211123100936j:plain:w400
袖ヶ浦フォレストレースウェイ.その名の通り,森で囲まれたサーキットでした

1. 出場の経緯

 先日の伊豆イチ*1でシーズンを終わると書きましたが,チームメートが下総クリテリウムに誘ってくれたのがきっかけで思い直しました. せっかくレースがあるのに,わざわざ出ない手はありません.

 下総について調べていたら,前週にこのイベントがあることを知りました. やっぱりというか,富士チャレ140 kmを走れなかったことは心残りでした. 同じレンジの160 kmに興味が湧きました.

 僕がそれまでにレースで走った最長距離は100 kmでした. 午前と午後の2 hずつのエンデューロで約150 kmというのは何度かありますが,勝手がかなり異なります. 大袈裟ですが,未知への挑戦でした. 「来年こそは沖縄!」という想いが常に胸の内にあります. 丁度良いテストだと思い,先頭集団で走り切ることを目標にエントリーしました.

2. 前日までの準備

 エントリーしたのが10/28だったので,この数日前には出場を決めていたと思います. 伊豆イチに向けたトレーニングで身体は仕上がってましたが,レースで必要な高強度に対する耐性は落ちていました. 慌てて切り替えに入ります.

f:id:changlikesdesktop:20211123092224j:plain:w400
10/27の平日練.久しぶりに高強度のワークアウトをやってヘロヘロでした

 春の富士チャレに出た際には,速度の変化に対応するためにL5のトレーニングを*2を重視していました. 一方,今回はそもそも160 kmを走りきれるのかという不安がありました. また,YouTubeのレース動画で大会側のペーサーが一定速度を保つ展開を見て,あまりレースっぽくないイベントなのかと予想していました. DISTANCE CHALLENGEと言う位ですし... このため,どちらかというとL4をキープするヒルクライム寄りのトレーニングをしました.

 レース1週間前にはヤビツ峠の自己ベストを大幅に更新していました. 調子は良かったですし,トレーニングの成果も出ていたのです. ただ,結果的にはトレーニングプランを誤っていました.

f:id:changlikesdesktop:20211123092910j:plain:w400
1週間前のヤビツ練.自己ベストが出たのは一緒に走って下さった方が強力に引いて下さったからです

3. レース会場

 袖ヶ浦フォレストレースウェイを走るのは初めてで,わからないことだらけです.

 先ず,駐車場は有料駐車場を選んだ方が良いです. 無料を選んだ所為で,そこそこの距離の砂利道を徒歩で移動することになりました😮‍💨 自転車以外の荷物がポンプだけだったので何とかなりましたが,ローラーがあったらキツかったです.

 ピットは割り振りが決まっていないため,手前から埋まっていきます. ただ,レース中のピットインが無ければ,奥になっても不都合はありませんでした.

 試走は多めにしました. 特に気になっていたのは,第4コーナーと第9コーナです*3. 記事にしてませんが,春に出場したひたちなかでコーナー恐怖症になっていました. ヘアピンから抜けるときに未だバイクが倒れている状態で踏み込んでしまい,ペダルを地面にぶつけるミスを何度もしました. 去年から乗っているIzalco max disc*4は,以前に乗っていたIzalcoリムに比べてBBが低いのです. バイクが起きてから踏む,或いはバイクを倒さずに曲がる感覚を,未だ身につけられていませんでした.

f:id:changlikesdesktop:20211123093714p:plain:w400
袖ヶ浦のフルコース.降り口調から高速で通過する第4コーナーと第9コーナーがポイントになります
 

 事前にチェックしたYouTubeでは,カーブが割りとなだらかで高速で抜けられる為にリスクが低いと予想していました. 実際走ってみてそうだったんですが,リスクはむしろ逆で,降りで上がった速度をどれだけ維持して曲がれるかが問われる難所でした. 特に第9コーナーが難しかったです. 漕げるか焦げないか,ブレーキを掛けるか掛けないかがギリギリです. ビビリにはキツい...😖

 ちなみに,アップダウンもそこそあります. 第1コーナーの先,第4コーナーの先,第9コーナーの先が登っています. ただ,クライマーに有利になる程には長さも斜度もありません. パワー系のライダーが圧倒的に有利です.

 服装も難しかったです. 寒暖差が激しい季節ですよね🤔 レース開始時は10℃位で寒さを感じましたが,終盤には20℃弱まで上る予報でした. 寒さは我慢できますが,尿意は我慢できません. 「お手洗いで止まる位なら,暑くても冬ジャージの方がマシか?」と,出走直前まで迷っていました. 最後は周りに倣って半袖ジャージにしました.

f:id:changlikesdesktop:20211123095242j:plain:w400
出走直前.半袖ジャージ,冬インナー,レッグウォーマー,簡易シューズカバー,指有りグローブで丁度良かったです

4. レース展開

 緊張の中スタートします. チームからは一人で参加したのですが,前述のヤビツ練でご一緒させて頂いたチーム ロードロの方と出走前やレース中にお話する機会がありました. 大変,心強かったです😭

 レースが始まってみると,やはりというかコーナで中切れしかけます. 脚を使いながらも,何とか付いていきます. コーナーの後の登りで集団のペースが落ちるため,多少離れても追いつけるのです.

 1h位走った頃にはコースにも慣れ,ブレーキをかけずにコーナーを曲がれる様になってきました. 集団のペースも落ち着き,補給を摂る余裕がありました.

 ところが,60 km過ぎで突然集団から千切れてしまいます. 何が起きたか,レース中には解りませんでした.

 今改めて分析すると:

  • 集団のペースが上がった
  • 第9コーナーで横風が吹いていた

 レース中にこれに気付けていなかった事が,未熟以外の何者でもありません😫

f:id:changlikesdesktop:20211123102616p:plain:w400
走行データ.千切れたと思われる27周目にペースが上がっています

 千切れた後は只々辛かったです. 協調できそうな選手が全く見つかりませんでした. 大会側の規定(?)で,後方からスタートしていた100 kmカテゴリーの集団に乗れなかったのが辛かったです. 周回で追いついてきた160 & 200 km集団に何度か食らいつきましたが,気持ちが切れているので長くは付いていけません. 終盤になると腰の痛みで高出力が出せなくなった為,大会のペーサーが引く完走集団で走りました.

5. 改善点

 反省点だらけですが,毎回のレースで問題になるのは大凡一緒です.

 僕の弱点は:

  • コーナーが下手
  • 速度の変化(=高出力)に弱い

 するべきことは明らかです.

  • レースを走る
  • 速い人と練習する
  • ローラーでの短時間高強度を増やす
  • 下ハンダンシングでの高強度に慣れる

6. むすび

 何によせ,怪我なく走れて良かったです. やっぱりレースは楽しいですね.

 コースも丁度良い苦手感で,ステップアップにはもってこいだと感じます. 来月にもイベントあるのか...

 今週末はチームで下総クリテリルム1.5hを走ります. チームメートとレースに出るのは久々なので,とても楽しみです😀

ディープ・ラーニングは簡単すぎる

 こんにちは.changです. 久しぶりにディープ・ラーニングについて書きます. 特に一人で開発する場合の,差別化の難しさについてです.

1. ディープ・ラーニングを始めたきっかけ

 ディープ・ラーニングを始めたのはこのブログを開設した時期とほぼ同じです. 約2年前になります. きっかけは,,,会社の仕事に飽きた事ですね. 会社に貢献する程首が締まって,自分の将来につながらないと強く感じる様になりました. 「中途半端な協調性に甘んじていても仕方が無い.自身の技術力で独立していく必要がある」と思ったんです.

 勤め先を批判する様な事を言いましたが,サラリーマンあるあるでは無いでしょうか.

 で,元々アルゴリズム開発を得意にしていて,かつ趣味でLinuxをやっていた事から適性があると思って飛び付きました. 当時の自身の記事を読むと,随分とナイーブな事から始めたんですね. 良い事なのかは何ともですが,我慢強さは高いのだと思います.

 この記事の理解を深める為に紹介すると,僕は某有名私立大学で博士号を取っています. 世間一般的には,数学や理屈に強い部類の人間と言えるでしょう. 英語の論文などもそこそこ読めます. サイバネティクスをかじっていたので,ニューラル・ネットワーク関連の知識も多少ありました.

 プログラミングは独学ですが,メーカーでソフトウェア開発に携わってかれこれ8年程になります. ソースを書く仕事ばかりをしている訳ではないですが,設計をしたり,仕様書を作ったりする部分も含めて経験を積みました.

 出身で言えば僕は機械系です. 人工知能や計算機についての知見は,その分野を専門としている研究者には遠く及びません. また,僕よりも速くソースを書けるプログラマはごまんといます. ただ,理屈に強く,かつ製品レベルのソフトを作る総合力では,そこそこ世の中と戦えるレベルだと思っています.

2. 何故,ディープ・ラーニングは簡単なのか?

 先日の記事*1で座標変換について書きましたが,多くの方は数式が嫌いだと思います. 学校の授業で無理やり覚えさせられた屁理屈を大人になってまで使いたくないと言うか... そんな風に多くの方が嫌いで,難しいと感じる理屈についての耐性で,僕は飯を食っていると言えます.

 ディープ・ラーニングにはそういった意味での難しさが少ないのです. 理由は大きく二つあります.

(1) ニューラル・ネットワーク自体が数学的にシンプル

 ニューラル・ネットワークは,パーセプトロンの集合です. パーセプトロンは,閾値を超える刺激を受けたら発火するという非常にシンプルな要素です. ニューラル・ネットワーク研究のポイントは,単純な処理を大量に組み合わせ,コンピュータで処理させた事です.

 コンピュータが未だ拙かった時代は,難しい理論を考えたり,数式を書くことで技術が発展しました. 今は少し様変わりして,単純作業を大量にコンピュータにやらせた方が,多くの領域で効率が上がるようになりました. ニューラル・ネットワークは正にそれで,CPUの高速化と共に発達してきました. CNN(Convolutional neural network)等の発明も随所には在りますが,基本的には昔から在る技術で,この先も大きく変わりません.

 数学的にシンプルなので,ソースを書くのも簡単です. ニューラル.ネットワークをプログラミングする場合,難しいのは理論部分では無く,GPUを用いた高速化です. NVidiaのライブラリを使ったかなりrawなプログラミングになります(なるみたいです). 計算機の専門家では無い僕には,この技術がありません. なので,Googleのtensorflow-gpuを使っています. 皆が使っているのと同じライブラリを使っているので,当然,差は出せないですね.

(2) Google等の大手IT企業が難しいところを作ってしまっている

 tensorflow-gpuを使っているという話をしました. ディープ・ラーニングを作るとき,同様に大多数の方がGPU計算を丸投げにする為のフレームワークを使う事になります. この分野において,GoogleのtensorflowとFacebookのPyTorchが覇権を争っています. これに参入するのは中々大変です. Sonyがやってましたけど...

 Googleアルゴリズムの分野でもトップを走ってます. フレームワークが強くて,アルゴリズムも最強だと,闘いようがありません. ディープ・ラーニングを組みたいと思ったら,殆どの場合がGoogleのサンプル(或いはその派生)で事足りてしまいます. 僕自身も,(強化学習を含めて)論文から自分でプログラムを起こしたりはしていません.

 また,代表的なディープ・ラーニング(画像のセマンティック・セグメンテーションや分類,チャットボット等)は,GCPやAzure等のクラウドサービス上でコーディングレスで作れるようになっています. 以前に少しだけReNomを使いましたが*2,あれも同じです. 出来合いのソフトウェアで出来ちゃうんです. 僕は一応ソースから書いてますが,こんな無駄な事はやめようと日々思います. 国内大手企業がAIの成功事例みたいなことを言っているニュースを良く見ますが,殆どが出来合いのソフトウェアを使っていると思います. 噛みついた言い方をすると,Googleにダダ乗りの状態です. 差が付く筈が無いですね.

 怒られるかも知れませんが,AIはやらないと駄目だけど真面目にやりたくない素材になっています. 補助金目当てか,利益度外視の先進性アピールでやっているというのが,多くの方の本音だと思います.

3. AIの性能を競うには?

 ディープ・ラーニングを真面目に作って,その性能で戦うにはどうするのでしょう? 答えは一つで,質の良いデータを集める事です. アルゴリズムを改善する道も在る事はあります. 実際,研究者達が新しいアルゴリズムを次々と発表しています. ただ,アルゴリズムの差はデータの差に比べると微々たるものです. 専門的な言い方をすると,ネットワークの中にdrop outやbatch normalizationを入れるよりも,ラベルを丁寧に付けた方が精度が上がります. 研究者達はAIの実用性を競ってはいません. 同一のデータ・セットを使って数パーセントの検出性能の違いを議論する,内向的な争いをしています. 数字マジックみたいなものなんです.

 データを集めるには,インターネット産業にいるとか,古くからセンシングデータを貯めている等のシチュエーションが必要です. 個人レベルではどうしても難しいです.

 ラベル付けについても同じです. 大量データにラベルを付けようと思ったら,日雇いバイトとかに精巧に作られたマニュアルを渡すのでしょう. ウェブ上で内職できる仕組みを作るのも良いですね. これは,組織力とか管理能力の問題です. ちゃんとラベルが付けられたかをチェックするAIが必要が欲しくなりますね💦

 結局,AIを作る能力って良くわからないんです. GCPやAzureの使い方とかPythonの書き方は学校で教えてくれるみたいです. 人材は集められるでしょう. でも,それだけでは実用的で競争力のあるAIを生み出す事が出来ません.

 逆に,AI作れますって,何を持って宣言するのでしょう? 突貫整備された専門学校とか資格やらがありますが...🤔 実態を知らないので何ともですが,正直お薦めできないですね. AI作れますって言って会社に入ると,凄くブラックな仕事をやらされると思います. IT系の仕事のブラックさは,日経ビジネスの極言暴論*3でしばしば紹介されています.

4. 結局何で勝負するか?

 日々,考えております... その辺の葛藤も,近々紹介しようと思います.

伊豆一やりました!

 こんにちは.changです. 今回はロードバイクで伊豆一に挑戦しました.

0. アタックの経緯

 アタックした日は,富士チャレンジカップの開催予定日でした.

 仕方の無い事ですが,Covid 19の影響で,今年の目標としていた乗鞍ヒルクライムツールド沖縄が中止になりました. 来年へのステップアップと思って駆け込みでエントリーした富士チャレンジカップ140 kmも結局中止😱. このままではシーズンを終われないと思いました.

 代わりに何をやろうか考え,伊豆一にしました. 前々からチーム内で話題に上がってましたし,有名ユーチューバーさんの挑戦動画も観ていました. サイクルボール*1でも話題になりましたね.

 僕自身は伊豆を走った経験が少ないですが,隣の県に住んでいるので比較的楽にアプローチ出来ます. 去年の富士一で200 kmを走りましたが*2,同等以上の難易度です. シーズンの締めくくりに持って来いだと考え,アタックを決めました.

1. ルート

 伊豆一をやるとき,先ず選ぶことになるのが1日で走りきるか,2日に分けて走るかです. コースにも依りますが,200 km & 3000 mアップを1日で走り切るのは大変です. ナイトランになってしまうと,危険も伴います.

 アレコレ考え,,,ませんでした. 僕のスタイルでは,1日で走るの一択です. リュックを背負ったり,思い荷物をつけて自転車に乗るのが僕は嫌いです. ライド中の観光とかも,特にボッチで行くときには殆どしません. なので,1日で,かつ陽が高い時間帯で走り切れるコースを組むことにしました.

 組んだコースです. 所謂,左回りです. 箱根近辺の大きな登りを前半にこなした方が楽なのと,サイクルトレイン*3を利用できる東伊豆を後半に持って来た方がリスクが低いという理由で選びました. また,コース全長を200 km程度に抑える為に,伊東駅からのスタートにしました.

f:id:changlikesdesktop:20211024174344j:plain:w400
今回のコース.Ride with GPSの獲得標高がバグるのはお約束です😀

2. 機材

 既に書いたように軽装で走るのが好きなので,特別な装備はしませんでした. ただ,一応ライトだけ整えました. 普段使っているものだと,明るさとバッテリー切れが心配だったので.

f:id:changlikesdesktop:20211024175004j:plain:w400
CATEYE AMPP500.800ルーメンにするか迷いましたが,軽さ重視でこっちにしました.結果的には全く使いませんでした

f:id:changlikesdesktop:20211024175329j:plain:w400
CROPSのテールライト.長距離のライドではトンネル内だけで光らせてバッテリーを節約したくて,買いました.振動で吹っ飛びやすいので,本番では補強しました

 この他に,モバイルバッテリーを入れる為のトップチューブバックを買ったのですが,当日は使いませんでした. 立ち漕ぎ時の膝への干渉が気になったからです. ぶつかるだけなら良かったのですが,マジックテープがジャージに擦れてボロボロになる感じで...

 当日の機材です. 結局,普段と殆ど変えませんでした. モバイルバッテリーと,(携帯ポンプとは別途で)CO2ボンベを持った位ですね.

f:id:changlikesdesktop:20211024180604j:plain:w400
当日の機材.伊豆一用としては,軽装だと思います

3. 当日までの準備

 富士チャレに向けてトレーニングしていたので,フィットネスは上がっていました. 遡ってみると,アタックを決めた9/28の時点でCTLが93でした.

f:id:changlikesdesktop:20211024180410j:plain:w400
伊豆一アタックを決めたのが9/28.この時,CTL 93でした

 シミュレーションで走ったロングでも,175 kmを8hで走れていました. この時が練習機材だったので,+1hの9hで200 kmを走り切れると思っていました. 当日の日照は6-17時の11hなので,かなりの余裕を持って走れる見込みになります.

f:id:changlikesdesktop:20211024182622j:plain:w400
シミュレーションで走ったロング.175 kmを8hでまずまずでした

 誤算だったのが,ワクチン接種です. アタックの2週間前に一回目を受けたのですが,後遺症を引きずって1週間トレーニングできませんでした.

f:id:changlikesdesktop:20211024181534j:plain:w400
アタック一週間前からトレーニング再開.CTLは80まで落ちていました

 レースをする訳では無いので,フィットネスは問題ではないと諦めることにしました. 中止も多少考えましたが,アタック前の一週間は回復してトレーニング出来たので,決行することにしました.

4. 当日

 当日は朝4時に出発して,伊東駅の近くのコインパークに車を留めます. 6時の夜明けと共に出発です‼️

 本来,ここからを詳細にお伝えすべきですが,,,止まらずに走り続けたので写真が全くないのです😅 前述のように9hで走り切るために,休憩は中間地点の1回だけと決めていたからです.

 結果としては,予定していたコンビニと,自販機1回,公衆トイレ数回で走り切れました. 9.25h位だったと思います. まずまずですね😀

 文字だけになってしまいますが💦今回感じた伊豆一の魅力を書いておきます.

  • 景色が良い
  • 信号が少ない
  • 移動費が安い(居住地に依ります)
  • 駐車場が安い(駅近に1日留めて400円でした.物価が安いのでしょう)
  • そこそこコンビニがある
  • 公衆トイレが頻繁にある
  • 個人的には富士一よりも良かった!

f:id:changlikesdesktop:20211024185503j:plain:w400
唯一の風景写真.中間地点の松崎で撮りました.駿河湾の先に見える富士山が最高でした🥰

5.むすび

 レースが無い中,新たな挑戦が出来て良かったです. 安全にルートを引いた所為もありますが,正直,今回は楽勝でした. もう少し難易度を上げて,またアタックしようと思います.

Roval Rapide CLXを半年ほど使って

 こんにちは.changです. 今回はホイールのインプレを書きます. 以前*1にも少し紹介したRoval Rapide CLXです.

0. ホイール遍歴

 正直,僕には偉そうにインプレを書くほどの技術も経験もありません. 今回の記事もあくまで素人の感想ですが,一応,比較対象となるであろう過去のホイール遍歴を挙げておきます. 完成車に付属していたホイールは外してあります.

SHIMANO Ultegra WH-6800

 1台目に買ったAnchor RA5のホイールを壊した時に買いました. 当時,完成車からのグレードアップ用として定番でした. 7万円位だったと思います.

f:id:changlikesdesktop:20211011193805j:plain:w400
SHIMANO Ultegra.1台目のリム車から愛用しています

 今もリム車の練習用として使ってますが,普通に走ります. 特にハブの回りが気持ち良いです. 上位グレードのホイールと遜色無く感じます.

Mavic Cosmic Pro Carbon SL

 2台目に買ったIzalco Maxをパワーアップしたくて導入しました. 登りだけの自分から脱却してオールラウンダーになりたい!という思いで買ったのを覚えています,

f:id:changlikesdesktop:20211011194232j:plain:w400
Mavic Cosmic Carbon SL.強烈に真っ直ぐ進みます

 このホイールでカーボン & ディープリムホイールの魅力に憑かれました. スピードに乗ると踏む必要が無くなり(減り)ます. リムハイト40 mmは,最早ディープと呼ばれない程の定番ですよね. 今乗っても抜群の安定感です. カーボンホイールとしては特別軽い方ではありませんが,ダンシング時の剛性感が気持ち良く,ヒルクライムでも使っています.

Roval Rapide CLX

 今回の主題です. 昨年,Izalco Max Discを組んだ際に選びました.

f:id:changlikesdesktop:20211011194606j:plain:w400
Roval Rapide CLX.ディスクロードで使っています

 以上です...少なっっっ😅. 書いてて笑ってしまいました. インプレとか明らかに無謀だなぁ...

1. 選定理由

 個人的には,ロードバイクの速度に関して最も重要なのがホイール選択だと思っています. フレームを5万円のものから50万円のものに替えたとしても,体感できる程には速度は変わりません. コンポに至っては,ギヤ比が同じで等しくメンテされていれば,UltegraからDura Aceになってもその差が判らないと思います. ホイールは違います. 3万円から30万円のホイールに替えると,1~2 km/h程の速度差を実感できます. たかだか2 km/hですが,レースを走っていて2 km/hぶん楽出来ると考えると,効果は絶大です.

 Izalco Discを買うとき,Spcializedを凄く意識しました. 国内外のプロ・アマを問わず,その実績は圧倒的だからです. ミーハー感を嫌ってTarmac SL7を諦めたとき,「ホイールだけはスペシャにしとくかな」というスケベ心が出ました. 個性派を徹底出来ないところがダサんですが🤫...譲れなかったです. Vengeが速いのはホイールの所為だと思っているのでね.

2. インプレ

 やっと本題です.

(1) 特徴

クリンチャー仕様

 昨年のPari Roubaixをクリンチャー仕様のRapde CLXが制したのは衝撃的でした. ある意味歴史的です.

 クリンチャー仕様を議論することは,チューブレスおよびチューブラーとの違いを語ることです.

 チューブレスに関して言うと,正直,面倒臭いからクリンチャーに戻そうと日常的に思っていました (Cosmicはチューブレスで運用しています). 確かに,チューブを無くすことで軽くなりますが,シーラントを沢山入れると相殺されてしまいます. 空気圧を下げられるのは,マウンテンバイクでは確かにメリットになります. しかし,綺麗な日本の道をロードバイクで走る場合,空気圧が高い方が速いし,曲がれると感じます.

 チューブラーについては,使ったことが無いので判りません. S-Works Turbo Cotton + ラテックスチューブの組み合わせで差が無くなる,というのがSpecializedの考えなのでしょう.

スポーク設定はガチガチ

 ホイールを軽くする為には,スポーク数を減らす必要があります. 完組ホイールでは,フリーボディ側のスポーク数を増やして反対側を減らすのが定番です. Rapide CLXは前輪も非対称になっています. ブレーキローター側が12本,反対側が半分の6本です. 徹底してますね.

 テンション調整を自分でしたりはしてませんが,ガチガチの設定になっているのは何となく判ります. お世話になっている店員さんが,調整するのが怖いとおっしゃってました.

リム形状

 前輪と後輪でリム形状が異なるのですが,特に前輪が特徴的です. ゴン太なんです! 風が真正面ではなく斜めから吹く場合に,この形状が有利だそうです. フロントフォークとのクリアランスを減らして,空力を向上するとも言われています.

f:id:changlikesdesktop:20211011203829j:plain:w400
写真からは判り難いですが,前輪が太くて浅い,後輪が細くて深い設計になっています

(2) 良いところ

速い

 これに尽きます. Izalco DiscにRapideと同等グレードのホイールを履いた事が無いので比較は出来ませんが,最速の部類に入るバイクだと思っています. これで勝てなければ,100%脚の所為ですね😯

兎に角格好いい!!

 自分の中ではこれが大きいですね. 敢えて文字が白いモデルを選んだのですが,フレームとの相性も良くて最高に気に入っています. 有名YouTuberさんのレース動画に偶々自分が映ってたんですが,我ながらイケてると思いました👠

(3) 悪いところ

タイヤが嵌めにくい

 Rapide CLXがクリンチャー専用なのは既に述べました. それにも関わらず,何故か(Specializedの特徴でもあるのですが)チューブレスのリム形状を採用しています. なので,タイヤを嵌めるのがメチャクチャ大変です. 購入時はコンチネンタルGP5000を履いていたのですが,パンクした時にタイヤの付け外しを自分で出来ませんでした. 元プロレーサー & ショップ店長の友人が一緒だったので助かりましたが,一人では怖くて使えないという印象を植え付けられました.

 邪道を恐れずにタイヤレバーを使えば...と思ったのですが,そもそもビードが落とせないので何も出来ません. ちなみに,僕の握力は左右とも30 kg位だと思います. 僕が非力なのは事実ですが,正直,女性の方には高確率で出来ないと思います.

 今はGP5000を諦めてCorsaに替えることで何とか運用できています. それでも,Rapide CLXではクリンチャータイヤの手軽さの恩恵は受けられ無いと思った方が良いでしょう.

気楽に乗れない

 正直この子,フレームよりも目立ちます😳. Izalcoを盗もうとする人は少ない気がしますが,Rovalを盗みたがる人は五万といる気がします. 飲食店の軒先に止めるのには抵抗感があります.

 壊れそうという恐怖感も強いです. 価格的にはリム車で使っていたCosmicと大きく変わらないのですが,何故かナイーブ感を強く持ちます. 細くて少ないスポークが,今にも壊れそうな雰囲気を出すのかな? 前述したゴン太のリム形状でタイヤよりもホイールの方が外に突き出す構造になっていて,傷が付きやすいのも要因かも知れません. 傷が付く位ならまだしも,割れてしまうと笑えません.

3. むすび

 一言で言えば,究極のレーシング機材です. レースを走らない方には間違いなくお勧めしません. また,出来ればレース用の決戦ホイールとして使いたいので,複数のホイールを所有できる財力も必要になるかと思います.

 練習用にMavicを買おうとずっと思っているのですが,踏み切れずにいます. Kysriumで十分なのですが,Discロードにアルミホイールを履くのをナンセンスに感じてしまいます. かといって,ミドルグレードのカーボンは中途半端なんです. 難しいなぁ😮‍💨

 ちなみに今月末に伊豆一をやりますが,現状他に選択肢がないのでRapideで走ります.

2つのベクトルを一致させる座標変換をクォータニオンを使って作る

 こんにちは.changです. 非常にマニアックでほぼ自分用のメモですが,ふとした感動があったので書いておきます. クォータニオンです‼️

0. 問題

f:id:changlikesdesktop:20211011140059p:plain:w300
下図のベクトルaをベクトルb(z軸)に一致させる座標変換を求めよ

 こんなプログラムを真面目に書いている人なんているのでしょうか? ちなみに,僕の仕事はこんなのばかりです😮‍💨

 話を簡単にする為に,2つのベクトルは共に単位行列で,起点が原点にあることとします. また,ターゲット(回転先)はz軸とします.

 オイラー( Eular)角って何?*1クォータニオン(Quaternion)って何?*2って話は省略します.

1. 解答1: arccos 2回 + オイラー角で解く

 多くの方(?)が,僕らの時代で言うところの数学2Bの範囲で解こうとすると思います. ベクトルaを2次元に投影するやり方です. 例えば,先ずz軸回りに回転させてベクトルをxz平面内に移動し,次にy軸回りに回転します.

 箇条書きにするとこんな感じ:

  1. ベクトルaをxy平面に投影し,ベクトルaをx軸に一致させる為のz軸回転をarccosで求める
  2. 1.で求めたz軸回転をベクトルaにかける(=ベクトルa')
  3. ベクトルa'をz軸に一致させるためのy軸回転をarccosを使って求める
  4. ↑で求めたy軸回転をベクトルa'にかける

f:id:changlikesdesktop:20211011140634p:plain:w300
解答1.直感的な様で直感的ではないですね

 数学2Bの範囲を超えてしまいますが,問題に沿って”座標変換を求める”とこんな感じです.

手順1のz軸回転:

 Rot_{z} = \begin{bmatrix}
cos(z) & -sin(z) & 0 \\
sin(z) & cos(z) & 0 \\
0 & 0 & 1
\end{bmatrix}

手順3のy軸回転:

 Rot_{y} = \begin{bmatrix}
cos(y) & 0 & -sin(z) \\
0 & 1 & 0 \\
sin(y) & 0 & cos(z)
\end{bmatrix}

求めたい座標変換は:

 M = Rot_{y} \cdot Rot_{z}

 結構面倒ですね. ちなみに,僕の出身高校では理系に進まない生徒も数学2Bまでは強制的に履修されられました. 4大や短大に進んだ多くの方が,解答1の予備知識をお持ちかと思います.

 実はこの方法,間違いでは無いもののいくつか問題があります.

  • 2回回転するので,答えが一杯ある
  • arccosを2回使うので処理に時間が掛かる
  • 今回はターゲットがz軸なので簡単だが,一般ベクトル2つで解こうとすると凄く大変
  • 数学的に美しくない

 恥ずかしい話ですが,僕は仕事で解答1を何度も書きました🤫. 例えば初音ミクを動かすライブラリ等は間違い無くこんな書き方はしていないと思います.

2. 解答2: arccos 1回 + オイラー角で解く

 解答1の問題点の一つに,答えが一杯あることを挙げました. これ,場合によっては致命的です. 今回は座標変換を求めることが目的なので構いませんが,回転角度を求めることが目的の場合には非常に気持ち悪いです. 2つのベクトルを最短でつなぐ,唯一の回転を求めたいところです.

 角度の大きさ自体は,内積で簡単に求まります.

 \theta = arccos(\frac{a \cdot b}{|a||b|})

 困ったことに,オイラー角はxyz軸の周りにしか回せません. このため,ベクトルaとターゲットを回転軸に合わせて座標変換する必要があります.

手順としては:

  1. 内積を使って回転角  \thetaを求める
  2. ベクトルaとターゲットの外積(cross 1と呼ぶ)を求める.
  3. 2.の外積と,ベクトルaの外積(cross 2と呼ぶ)を求める
  4. ベクトルaをx軸,cross 2をy軸,cross 1をz軸とする座標変換を作る
  5. 4.で求めた座標変換をベクトルaとターゲットにかける
  6. 1.で求めた回転角だけz軸回りに回す
  7. 4.の逆変換を掛ける

f:id:changlikesdesktop:20211011141828p:plain:w300
解答2,絵が解りにくくてすみません

 解答2は,僕自身がここ何年か採用していたやり方です. 正直これで満足していました. 先日「クォータニオンでもっと簡単に解けるじゃん!」と気づいたのが,この記事を書いたきっかけです.

3. 解答3: arccos1回 + クォータニオンで解く

 やっと本題です. クォータニオンは,解答2の手順1で求めた外積cross 1と,手順2で求めた角度 \thetaから直接求めらます.

 q = 
\begin{bmatrix}
cross_x \cdot sin(\frac{\theta}{2}) \\
cross_y \cdot sin(\frac{\theta}{2}) \\ 
cross_z \cdot sin(\frac{\theta}{2}) \\
cos(\frac{\theta}{2})
\end{bmatrix}

f:id:changlikesdesktop:20211011142132p:plain:w300
解答3

クォータニオンを回転行列に変換:

 M = 
\begin{bmatrix}
q_{0}q_{0} - q_{1}q_{1} - q_{2}q_{2} + q_{3}q_{3} & 2q_{0}q_{1} - 2q_{3}q_{2} & 2q_{0}q_{2} + 2q_{3}q_{1} \\
2q_{0}q_{1} + 2q_{3}q_{2} & - q_{0}q_{0} + q_{1}q_{1} - q_{2}q_{2} + q_{3}q_{3} & 2q_{1}q_{2} - 2q_{3}q_{0} \\
2q_{0}q_{2} - 2q_{3}q_{1}  & 2q_{1}q_{2} + 2q_{3}q_{0} & - q_{0}q_{0} - q_{1}q_{1} + q_{2}q_{2} + q_{3}q_{3}
\end{bmatrix}

 美しいですね. ちなみに,下記のPythonソースで解答2と解答3の速度比較を行ったところ,解答3は解答2の半分の処理時間で済みました.

import numpy as np
import random
import time

from numpy import sqrt, sin, cos, arccos, arctan2

def vec2zaxis(vec):
    matrix = np.zeros([3, 3])
    matrix[0, 0] = 0.0
    matrix[0, 1] = 0.0
    matrix[0, 2] = 1.0
    matrix[2, 0] = vec[1]*matrix[0, 2] - vec[2]*matrix[0, 1]
    matrix[2, 1] = vec[2]*matrix[0, 0] - vec[0]*matrix[0, 2]
    matrix[2, 2] = vec[0]*matrix[0, 1] - vec[1]*matrix[0, 0]
    norm = sqrt(matrix[2, 0]*matrix[2, 0] + matrix[2, 1]*matrix[2, 1] + matrix[2, 2]*matrix[2, 2])
    matrix[2, 0] /= norm
    matrix[2, 1] /= norm
    matrix[2, 2] /= norm
    matrix[1, 0] = matrix[2, 1]*matrix[0, 2] - matrix[2, 2]*matrix[0, 1]
    matrix[1, 1] = matrix[2, 2]*matrix[0, 0] - matrix[2, 0]*matrix[0, 2]
    matrix[1, 2] = matrix[2, 0]*matrix[0, 1] - matrix[2, 1]*matrix[0, 0]

    temp = np.dot(matrix, vec)
    # print(temp)
    # temp = np.dot(matrix, [0, 0, 1])
    # print(temp)

    ang = arctan2(temp[1], temp[0])
    # print("ang = ")
    # print(ang)
    rot = np.zeros([3, 3])
    rot[0, 0] = cos(-ang)
    rot[0, 1] = -sin(-ang)
    rot[0, 2] = 0.0
    rot[1, 0] = sin(-ang)
    rot[1, 1] = cos(-ang)
    rot[1, 2] = 0.0
    rot[2, 0] = 0.0
    rot[2, 1] = 0.0
    rot[2, 2] = 1.0

    temp2 = np.dot(rot, matrix)
    ans = np.dot(np.transpose(matrix), temp2)

    # print("ans = ")
    # print(ans)
    # temp3 = np.dot(ans, vec)
    # print(temp3)

    return ans

def vec2zaxis_Quat(vec):
    target = [0.0, 0.0, 1.0]
    cross = np.zeros(3)
    cross[0] = vec[1]*target[2] - vec[2]*target[1]
    cross[1] = vec[2]*target[0] - vec[0]*target[2]
    cross[2] = vec[0]*target[1] - vec[1]*target[0]
    norm = sqrt(cross[0]*cross[0] + cross[1]*cross[1] + cross[2]*cross[2])
    cross[0] /= norm
    cross[1] /= norm
    cross[2] /= norm

    dot = vec[0]*target[0] + vec[1]*target[1] + vec[2]*target[2]
    ang = arccos(dot)

    q = [cross[0]*sin(ang/2.0), cross[1]*sin(ang/2.0), cross[2]*sin(ang/2.0), cos(ang/2.0)]
    rot = np.zeros([3, 3])
    rot[0, 0] = q[0]*q[0] - q[1]*q[1] - q[2]*q[2] + q[3]*q[3]
    rot[0, 1] = 2.0*q[0]*q[1] - 2.0*q[3]*q[2]
    rot[0, 2] = 2.0*q[0]*q[2] + 2.0*q[3]*q[1]
    rot[1, 0] = 2.0*q[0]*q[1] + 2.0*q[3]*q[2]
    rot[1, 1] = - q[0]*q[0] + q[1]*q[1] - q[2]*q[2] + q[3]*q[3]
    rot[1, 2] = 2.0*q[1]*q[2] - 2.0*q[3]*q[0]
    rot[2, 0] = 2.0*q[0]*q[2] - 2.0*q[3]*q[1]
    rot[2, 1] = 2.0*q[1]*q[2] + 2.0*q[3]*q[0]
    rot[2, 2] = - q[0]*q[0] - q[1]*q[1] + q[2]*q[2] + q[3]*q[3]

    return rot

if __name__ == "__main__":
    x = random.uniform(-1.0, 1.0)
    y = random.uniform(-1.0, 1.0)
    z = random.uniform(-1.0, 1.0)
    norm = np.sqrt(x*x + y*y + z*z)
    x = x/norm
    y = y/norm
    z = z/norm
    vec = [x, y, z]

    start = time.time()
    mat = vec2zaxis(vec)
    elapsed_time = time.time() - start
    print(vec)
    print(np.dot(mat, vec))
    print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")

    start = time.time()
    mat = vec2zaxis_Quat(vec)
    elapsed_time = time.time() - start
    print(vec)
    print(np.dot(mat, vec))
    print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")

4. むすび

 学生時代を含めるとかれこれ10年以上座標変換を書いていますが,,,自分の勉強不足を実感させられました. 言い訳になりますが,仕事という観点で言えば,答えが正しく出て,プログラムが滞り無く動けばそれで良いのですよ🙄. 「処理時間を短くしたいな」とか,「ソースをダイエットしたいな」とかって思ったときに,調べて見識を広げたり,感動を味わったりすることが,楽しく仕事を続ける支えになると信じています. もっと速く,エレガントに解く方法があるかも知れないと思うと,ワクワクしますね😀

 本編と関係ないのですが,10年ぶりにTexで数式を書いたら吐き気がしました🤢