C++ ときどき ごはん、わりとてぃーぶれいく☆

Wonder Rabbit Projectのなかのひとのブログ。主にC++。

あるマシンの GPG 鍵ペアを別のあるマシンでも使いたい場合にすること、手順のメモ。Git, GitHub, VSCode 関連のおまけ付き

さいきんは多くの作業は WSL / Ubuntu でしているのだけど、 WSL の親になってる Windows でも VSCodeVisual Studio で作業する機会が増えてきました。git のコミットだけ WSL で /mnt/c/... へ辿ってやったりすればいいのだけど、事実上同じ(だけど論理的には別になってる)マシンなので同じ GPG 鍵ペアーを使えるようにしようかなって思ったので、その手順のメモ。

環境

メモの例に somebody@example.com を ID にします。あるWSL環境をマシンA、そのWSL環境をホストしている親のWindows環境をマシンBのように模した例。

# マシンA 側の WSL / Ubuntu の Git のバージョン
git version 2.17.1
# マシンB 側の Git for Windows のバージョン
git version 2.21.0.windows.1
# マシンAのWSL環境およびそのホストのマシンBのWindowのバージョン
Microsoft Windows [Version 10.0.7763.437]

1. マシンAでGPG鍵ペアーを作る

WSL ならその中の任意のシェル、環境で。

# つくる
gpg --gen-key
# 作った鍵の確認
gpg --list-keys

あとは Git や GitHub 用のおまけ。

# Git で GPG 署名を標準で有効に設定
git config --global commit.gpgsign true
# 未設定だったり必要なら email とか signingkey の設定とか
git config --global user.email somebody@example.com
## 実際は X じゃなくて作成時のログや gpg --list-keys で公開鍵を確認して設定
git config --global user.signingkey XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# GitHub に登録したりする用の公開鍵のテキストのエクスポート
gpg --armor --export somebody@example.com

2. マシンAでGPG鍵ペアーをエクスポート

# 公開鍵をカレントディレクトリーの public.key ファイルへ
gpg -o public.key --export somebody@example.com
# 秘密鍵をカレントディレクトリーの secret.key ファイルへ
gpg -o secret.key --export-secret-keys somebody@example.com

3. マシンBでGPG鍵ペアーをインポート

WSLをホストしている親のWindows環境での Git での使用なら Git for Windows を入れて Git Bash から。

# カレントディレクトリーの public.key から公開鍵をインポート
gpg --import public.key
# カレントディレクトリーの secret.key から秘密鍵をインポート
gpg --import --allow-secret-key-import secret.key
# インポートした公開鍵は信用(trust)値が不明(unknown)になっているので自分で作った場合の ultimate 信用にしておく
# gpg の対話モードで sign コマンドから 5 = I trust ultimately する
gpg --edit-key somebody@example.com
gpg> sign

このあと、マシンA同様に Git で使用可能に git config を必要に応じて叩いておく。

おまけ、適当に Git の repos を作って動作確認。

mkdir hoge
cd hoge
echo hoge > hoge.txt
git init
# Git の設定が足りてなかったり GPG 鍵ペアーをちゃんとインポートできてないと失敗するかもしれない
git commit -m hoge
# 期待動作できていれば GPG 署名に関するメッセージが追加されてコミット・ログが出力される
git log --show-signature

おまけ、 cmd で叩かれる git がどこの git か確認したいとき:

# Linux 一般で `which git` に相当する Windows の cmd での操作
where git

おまけ、ここまでやった上で VSCode の Git 統合機能でも GPG 署名を有効化する設定(Preferences):

"git.enableCommitSigning": true

f:id:USAGI-WRP:20190414123757p:plain

設定したら動作試験用の repos に VSCode からもコミットして、署名が付いているか確認する。確認は VSCode では素ではできないので、拡張なり、 Git Bash なり、何かしらでログを見て行う。

期待動作していれば Git Bash ではこんなログを見られる(このスクリーンショットは somebody@example.com じゃなくて実際にわたしの公開鍵がついている例だけど):

f:id:USAGI-WRP:20190414125325p:plain

参考

  1. GnuPGのコマンド

人生ポエムの記録、ルアード化、神の認識と定義と信仰、現実世界への帰還

まえおき

今回の記事は「心の技術」かもしれないけれど、このブログでふだん書いている類の技術についてではまったく無いし、この現実世界の宗教としての神に関してでも無いし、表現はともかく私自身のこころの話であり、すなわちポエムというのが適当そうな何か。人生、たまに自己認識のために気付いた思考を、この世界へ自身を存在たらしめる明確な楔として打ち込んで置くのが自分自身にとって善い気がする事がある。そういうもの。たぶん、こういう事は10年か、15年か、あるいはもっと、または今後実質永遠に、書かない程度の事かもしれない。今はなんとなく書いておきたい気分になったのでポエムとして書き残しておく事にした。

言いたいことは3つ(と思ったんだけどね😋)

  1. ルアード化
    • わたしは根絶の錬金術に陥っていたのかもしれない
  2. 神の認識と定義と信仰
    • 現実世界を受け入れよう
  3. 現実世界への帰還
    • 生きる事を忘れていたが、生きてから死ぬだけの、生きたい理由を思い出せた

1. ルアード化

ルアードとは近年遊ばせて貰ってたいへん感銘を受けたゲームの1つ、通称アトリエシリーズの不思議シリーズに登場する人物。彼は世界を壊す事を厭わず、世界の未来を継続する資源性を完全に意図してまで考慮から除外し、彼が今を生きるためだけに消費して生きる選択をした。もっとも、このゲームではシリーズを通して、ルアードは500年前にそのような事をこのゲームの世界の中で行ったがゲームシリーズの他の主要人物たちの優しさや諦めない願いの力に"当然"負けて、このゲームの世界の中での仕組みとして500年生きた上で結果的には極めて純粋に世界に希望の存在を強く願う優しい人物になり、その長い人生の中で、短い人としての人生を送る事になるのだけど。"ルアード"はそんな彼が過去にやらかしモードに染まってしまっていた頃の名前、そして彼の昔の名前。その時の彼の力、というか知識、そして行動結果としての資源の使い方が作中では"根絶の錬金術"として描かれている。

もちろん、私はこのルアード様のように世界をどうこうできてしまうほどの力と資源の操作は到底できない。つまり、さっそく例えが大層過ぎるとは私自身も思うのだけど、そこは一人の人間が心にビビッと来てポエム化しているので大目に見て欲しいところ。

ここからは私の話。

私はローティーンの頃には自作のアプリが雑誌に掲載されたり(今では黒歴史であり、つまり、しょぼ過ぎて恥ずかしい程度ものではあるが)、ちょっとしたツールアプリを作っては専門家たちが使うツールを紹介する記事で触れてもらったりもしていて、そういう、いわゆるソフトウェア開発や電算機を扱う能力についてひとよりも"チョットデキル"ような気になっていた。

と、同時に、幼少の頃からの科学的な探究心に傾倒(おとなの"いま"の認識の表現いえば)していった結果として、いわゆる世間一般でいうところの"理系さん"になり、特に化学は私のお気に入りの"スキル"になっていた(数学的な知識前提が乏しくてもこの世界の仕組み、理が分かった気になれる程度の高校生向けの資料で概念を定性的に解説し"理解しているつもり"へと導いてくれたから)。

かくかくしかじか、私はハイティーンの頃になると勉強はそこそこデキルマン、科学と電算機のスキルが世間一般を比較対象とするとかなり高いが、身体的な運動能力は並以下(であることを自らの性格付けとして妥協し身体の鍛錬を怠った結果、でしかないのだが)という人物になった。同時に、ちょっとずつ理詰めメンドクサイマンと周囲に認識される事も増えていた。(この頃の私の脳が認識できている世界観では、科学≈化学、ついでに物理、おまけで生物と地学。物理は人間の観測し認識を確認しやすいレベルの現実世界の存在性や理由を当時の私には与えられないが化学はその意味でわかりやすく確認できている気になれた事、そして難しい数学の知識は食後のデザート程度で良さそうに勝手に思えていた事、そもそも中学生の頃に固定化されたこの世界の科学=物理+化学+生物+地学というお粗末な事などが化学が中心スキルになった理由だった。大学で本当の化学を学ぶ機会を経て、そして本当の科学と科学という視点によるこの世界の見方の一端に気付かせて貰うまでは。)

(ここまで書いていて、括弧が多くて長くて困った文章だと私自身悩める気持ちが高まっているが、心のポエムなのでこのままの流れでご勘弁を。ああ、これもまた括弧だ!)

それから私は大学で紆余曲折(結果的な人生、現時点までの数十年の時間で見た人物性にとっては些細で小さな、かもしれないが)も経ながら、強いC++erたちとTwitterはじめひょんな事から遭遇したりオンラインの付き合いなりには仲良くなったりしながら、結果的に情報工学と化学の分野ではそれなりに強い、一応の専門家(の端くれ)になるかと思いきや、そうはならなかった(少なくとも大学に残るという意味での"そう"は)。

"紆余曲折"については今回の記事とこの節"ルアード化"では省略。

で、ルアード化していた最近(といってもここ10年?15年?くらい)の私の話へ(あれ…もしかして25年くらい?)。

この節で触れている架空の人物像"ゲームの世界のルアードさん"は、幼馴染みにして善きライバルとの実力の伸び代とプライドのようなものに苛まれた事(というより世界に潜むネガティブな可能性に蝕まれてしまった、と言うのもよいかも)から、世界の継続性(現実世界でいうと長期的な視野における資源的な継続性に相当)をアウトオブ眼中した人生観と行動へとモードチェンジしてしまう。このモードチェンジの結果、過去の善きライバルだった人物すらも含めて、ただの我が人生を邪魔する"我が世界には要らないもの" へと認識を悲しくも錯誤させられる事になる。

私は彼"ルアード"と比べるのは大層過ぎると先に書いた程度のただの一般人物ではあるものの、私も一人の個人としてはそなりには多くの人から認めて貰える程度には高レベルの"スキル"を持ちつつも、現実世界を生きる意味は実質的に喪失し、現実世界を、ただ、いま、"わたしの存在"をゆるやかに生かしておくための道具としてしかほとんど認識していない状態になっていた。(どうしてそうなっていたかは"かくかくしかじか"と"紆余曲折"に続いての"それからそれから"、という話になるのだけど、今回はその話ではないのでそれも省略)

"近年"の"私にとっての現実世界"は、私を生かすために必要最小限の影響で、効率良く"わたし"への恩恵(というか生きながらえる程度の餌)を取り出す、そういった希薄なビジネスの対象というだけの存在、認識になってしまっていた。そんな認識でいる私と世界の接続理由はメタ的にはかなり希薄で、そうなると、次第に現実世界に興味がなさ過ぎて、それがなんであるのか、なんであったのか、どうでもよいような気がしてくる。しばらくはそれもある種の世界への"悟り"かもしれないと思っていた事もあった。

さすがに物語で描かれたルアード様のように世界の根本的なエネルギー(世界の存在性に関わるほどの資源)を搾取したりはしない(できない)が、本質的に"思考"はほとんど一緒の状態。

つまり、私は近年、私が興味を失ってしまっていた現実世界(と思っていたし、そうなるように行動するよう思考を設定してもいた)に対して、"願い"や"希望"をほとんど持たず(これもまたルアード様の世界でのそれに通じるところがある)、結果、"根絶の錬金術モードのルアード様"のように、持っていると思っていた"スキル"で世界の資源を自分が存在するために(程度の違いこそあれ)消費するだけの存在になっていた(そんな気がする)。

もう少し現実的に具体的な事象について触れてみよう。

最近、頼られる事が減ったような気がしていた。(昔の私は"何かと頼られる"し、"世話を焼くお人好し"だったと自認している。もっとも、それ故に疲れたり、人の裏切りを過学習して"近年の人生"へモードチェンジする事になった、というのが"それからそれから"の省略の部分なのだが。)

"近年の人生"においてのしばらく、私はその理由が、私が世界を"私なりに正しく"認識し、諦め、徐々に世界から私が隠遁する事で私自身のささやかな心の平穏を確保できると願い、生きてきた効果だと考えていた。しかし、恐らくそうではなかったのだろう。

ある程度、私が勝手に悟ったつもりと雰囲気で生きるうちに、単純に"私が社会から必要とされる理由が薄れてしまった"だけの事ではないか。与える必要も理由も薄れた私は求められる"スキル"をさほど補充したり探求したり勉強しなくなってしまっていたし。当然。

私は過去に私が世界へ影響しても恩恵がトントン未満にしか還ってこない事、期待を裏切られる事に"不正な因果応報"のような感覚を感じ、強めて、そうしてやがて、私の方から現実世界との関わりを積極的に消極化してきたのだから。世界も私をそれなりに認識しなくなり、私の需要ももちろん減る。ゆっくりであれ、知識は人々に共有され理解は広がり、新しい知識や着想も一般化したり、辞書引きしやすくもなる。どうせ世界が私へ"正当な対価の因果応報"を働かないのなら、それでいい、そのようになってほそぼそと適当に生きて、それで私という個体は死んでゆけばいい、そう思って計画し、実際そのようになるよう "変えた" 生き方だった、はずだった。だから、当然。(のはずだった)

この、"はずだった"、という事に、偶然もあり、あるいはそもそもそういう理由だから偶然などでもないのだが、ともかく、人との関わりが随分と減ってしまったので正確に再認識できる程度に気付けた、のかもしれない。

もともと、私はなにも、現実世界との関わりを絶つ、あるいは最小化し、契約的なビジネス化して損をしないで生きる事はそもそもは目的ではないし、寧ろ私は今でも現実世界の発展、人類の繁栄、文化の広がり、科学技術と叡智の発達をかなり純粋にこころより願っている(ほんね)。いやぁ、すっかり忘れていた(てへ)。

そもそも、"現実世界との関わりを絶つ、あるいは最小化し、契約的なビジネス化して損をしないで生きる事"は、それによって自身の心理的な因果応報のバランスの成立としての正義(てんびん)を、選択的("神"よ、もうしわけない)に、少なくとも自身に不利になり過ぎる事が心の負担となって疲弊しすぎないよう、というよりこれ以上こころが壊れてしまわずに、それによって誰も幸せにできないどころか不幸をばら撒くだけの迷惑な魔人にでもなってしまわないように、と、その保護として、保険の緩衝材や箱のつもりで、用意しただけのものだった。(うん、そういう理由、真実があった事をすっかり忘れていた)

もともとは、この現実世界で、少なくとも、最低限、巧く壊れずに生きるために考えた生き方へと接近するための方法、のつもりだったんだけど。いつのまにか、それに完全に飲まれて、その用意した緩衝材や箱そのものの存在しか認識せず、それをゆるやかに、理由もなく守る事だけしか見えていない、思考できていない、そんな人生になってしまっていた。(実に悲しく、そして勿体無い)

それゆえ、私は私が人生でやりたかった事をいくつも"忘れる"という封印、あるいは"未熟な思考と計画で保護具をトリアエズで作って装備してしまった事による呪い"のようなものを受けてしまい、現実世界に表面上の興味を失い過ぎ、"わたしを生かしておく"ためだけに、ほどほどに、私本来の優しいこころ(と私は認識しているもの)が傷つかないように慎重に考え抜いたような、そんな因果応報のバランスのとれる確実性の見込みの高い、あるいは保証付きの"契約"、取り引きだけを選択して生きるようになっていた。

結果、やがて私は世界からも、自分自身からすらも、自明な事すら見えない、認識できない、ただ、ゆるやかにできるだけ損失、損傷を受けずに"とりあえずわたしを生かす"事だけが目的として残り、"世界というものをそのためにしか認識できていない"状態となり、つまり、実質的にほとんど死にかけていた(というよりこのメタ思考においての"わたし"はつまり死んでいたのかもしれない)。

ゲームの世界のルアード様と違って、私を500年も封印したり、叩き起こして"ほんとうに望んだこと"を思い出させてくれるほどのお人好しに恵まれる環境や、そもそもそんなシチュエーションになれるほど大層な事をやらかせる人物ではなかったが、幸い(からい、ではない)、最近の虚無的な思考と日常の消費、トレードオフの正義のバランス(これは世間一般にはこれは公正世界仮説と呼ばれる思考、概念に近い何かへの、私による1つの側面的な捉え方と結果とも言えるかもしれない)が悪い意味で成立しない業務の取引先(まあ、悪意があってのことじゃないだろうけどね、ただ愚かなだけだろう。その愚かさを選択的に因果応報としてバランスするために私が意識的に行動しても結果的に私にそれ以上の"業"のようなものが蓄積して呪われるだけだ…と気付いたが)、そして近年じわりじわりと楽しませて貰っていた不思議シリーズのアトリエから、それとそもそもの私自身の本来の思考能力のまだ残っていた片鱗とお腹の調子とトイレでの暇やベッドでの善き夢見によって、気付きを得て、人生の方針を再設定できるだけの認識の回復を得て、ついでにこのポエムを書くに至れた。尊い作品を私がプレイ可能な状況に提供してくれた現実世界のすべてアクターとそれらの存在を確定したメタレベルの世界に感謝したい。尊い🙏

(ちなみに…"公正世界仮説"は愚かだと認識しているつもりでいたし、それよりも1つ高いメタレベルで思考して「公正世界仮説認知バイアスの幻想に過ぎない、それゆえ私は公正世界仮説を必要とせずとも公正な因果応報の対価を得られると見込める条件、保証を契約的に運命として選択する」という考え方を"近年"の"わたしの呪われた防具"の1つとして纏っていた。さすがに公正世界仮説をそのままのメタレベルで信じ込んでいたり、そうあるべきと考えていたわけではない…はずだった。しかし、つまるところ、これもまた所詮は公正世界仮説に取り込まれた認知バイアスに基づいた思考にほかならなかったのだ…。)

この節から得られるまとめ、教訓は主に3つ。

  1. アトリエシリーズの不思議シリーズは尊い🙏
  2. ゲームの中の単純化されたおとぎ話になるようなわかりやすい教訓すらも人は時として盲目に陥り、手段と目的が本質すら遮蔽する事にも気付けずに人生に自ら罠と呪いを敷設してしまう事がある。
  3. 短い人生、本質を思い出したなら、因果応報の正義だのメタレベルでの世界の調和だのは"世界"に運用を任せて自らの生きる本質を生きよ。

まあ、ポエムだよね。願わくば、本質としての願いを思い出せたゲームの中のルアードのように、私も私の生きる本質を見失わずにこの世界に生きて、それから死にたい。

ちなみに、私の生きる本質的な願いは、たまたま、偶然、まあそうでもないだろうけど、"人を幸せにしたい" そんなような事だったんだよね。もう結果的に20年くらい忘れてた気がするけど。そのための手段として私は"スキル"を発展させ、"人類の叡智と科学技術の発展" に少しでも寄与し、それでもって"人を幸せに"したかった。ちょうど、"科学"は私なりの"錬金術"だったわけだね。(そういうメタメタなレベルでの接続性もあって、不思議シリーズの"物語"は私に随分と善く効くところがあったんだろうな。尊い🙏)

まあ、せいぜい残された人生ではダメージを受けそうな事は器用に受け流したり回避したりしつつも、"人が幸せになる"ことに寄与したいものです。

2. と 3. とあったけど

この続きのはずの2つの節はこの節で書いた事の補足みたいなもの。ここまで長く書いてしまったので 1. 2. 3. を振り返ると、

  1. ルアード化
    • わたしは根絶の錬金術に陥っていたのかもしれない
  2. 神の認識と定義と信仰
    • 現実世界を受け入れよう
  3. 現実世界への帰還
    • 生きる事を忘れていたが、生きてから死ぬだけの、生きたい理由を思い出せた

と冒頭で書いていた。

まあ、おまけのようなものだね。

2. 神の認識と定義と信仰

この節は、次の 3. の帰還へ至り 1. のポエムのまとめへ導いた中間思考の1つ。

トイレでふと思ったんだよね、私も現実世界を生きる上で疲れないように"神を認識し定義しよう"って。実際のところは、何度目のひらめきか、ベッドの夢見で忘れた事かもしれないけれど。今回はポエムに書き留めるに至った。

もちろん、私はいわゆる現実の世界に現存する宗教の神々やその多くで伝承のためキャラクター的に扱われ"存在"している神を現実世界で認識したり定義したりしようとはまったく思っていない。そうした宗教家になる"趣味"は無い。

ちょうど、今朝みた専門外過ぎて(興味のわりに不勉強過ぎて)なんでかワカランの事に、イベント・ホライズン・テレスコープによるブラックホールと周囲のプラズマから発生する電磁波の軌跡の模式図への疑問があって、

f:id:USAGI-WRP:20190411234141p:plain

正確な事は論文を読んだり、そもそもブラックホールの科学や仮説について勉強する必要があるのだろうけれど、横着な私はトイレの暇に自分の脳内だけでとりあえず勝手に思考していた。

で、まあ、紫の矢印は科学的疑問ではなくて、単に解説記事の解釈や意図や背景の理論の精査で答えが得られるだろうって事はほぼ確信しているので、それはとりあえず置いておいて、重力と質量についてふわっと思ったメタ的な思考が湧いてきたんだ。

"ところで、メタファーとして、重力とは質量の密度の観測結果だろうか。"

なーんて。で、その着想も本節としてはどうでもよくて、それで考えると、考える間もないくらいに1つの結論(としておきたい何か)に遭遇する。

つまり神。

質量とは何か、重力とは何か。もちろん人類が既に可能な観測結果と理論、素粒子、仮定がある程度その答えに接近できている事は知っているけれど、科学は科学ゆえに科学的に思考する限り、"神に相当する何か"が残り続けるような気がするんだよね。究極的には定義はなぜ定義として存在できるのか、次元とは、とか。それってこの世界のなかの私達には解析や思考の対象にはできても、なぜかはわからないかもしれない(わからないと断言もできないけど)。

だから、それを、私はそのようなものを神として認識し、神はそのようなものと定義してしまって生きようかなって。なんだか25年位前にもそんな思考はしていた気がするけれど、前述のようにすっかり忘れて "この世界には神などいない" とか言うばかりの、その面では時折たぶんつまらないだけの人間になってしまっていた。

さて、それで信仰とは、という事なんだけど、私はわたし自身の思考の結果生じた呪いによって神の存在を私の思考と世界の認識の知識テーブルのなかで存在そのものから N/A としてきた。それを止める。私の中ではわたしなりに確固たる神様は居るし、それは同時に科学ですらある。自信を持ってこの定義の神を信仰する事を明確に意識する事で、生きる力に信念が形骸化した表現としてではなく、実質として加わったような気がした。

こんな日常の思考のぶっ飛びの偶発にも助けられ、この後も思考はトイレやベッドでのぶっ飛びも経て、今回は 1. で既に全部書いちゃってるような気付きから、ポエムを書くに至った。たまにはぶっ飛びの途中の思考も今後またもし呪いを受けた際に自分自身を思い出す、あるいは呪いを受けないための楔の1つとしておまけ程度に書いてみた。

まとめ…。

  1. 自分の中の神を定義し認識し信仰する事で、世界を生きる信念が得られる。信念があれば思考は正しく接続される。

適当にかっこよくまとめたが本文でそんな事は解説していない。ポエムなので気にしなくてよい。

3. 現実世界への帰還

うん、これも、もう 1. で書ききっちゃってたね(てへ)。

このポエムを書いてみて思った。某有名宗教の聖書とか最初はこういうノリのポエム的に書いたり言ったりしたものを徐々に集めて編集して整えて、意図を伝えられるようにしつつも、ある程度まとまった段階で神聖化され過ぎて編集できなくなって歴史と宗教になって残ったものなのかな、って。知らんけどね。

架空の物語、小説を書いたりする時でいうとプロットに相当する未満の状態で思いつき脳内メモリーをダンプしてみましたー、みたいな。我ながらひどいポエムを書いたものだ。これを読んで疲れてしまって不幸になる人が居ないとよいが、そんな"運命"まで私は気にしない事にした😋 まあ、居たらスマン。

???

近年はできるだけっパブリックに宣言したりは控えて、やりたいことなどは付箋に書いて自分には長い時間見えているデスクトップの隅に付箋をつけて忘れないようにしつつ、少しはできてから「実はやってました」「できました」って言う人になろうかなって思ってやっていたのだけど、それでもたまにうっかり、"脳内の静止した時間"と"現実の時間"の著しい認識の差をすっかり忘れて「こういうの思いついたー」「これやるー」といった宣言をしてしまっている事がしばしば自分でも観測と反省の対象になっています。しょんぼり。

でもまあ、25年振りに、体裁や自己の生存戦略としての上辺ではなく"人を幸せにしたいんだった" と思い出したのは、私の人生イベントとしては大きいかなーって思うのでポエムりました。まあ、私の優しい心もなぜだか忘れてしまうほどに保護したり、公正世界仮説的な認知バイアスに呪われた不正な因果応報を回避しようとしてまさに呪われてしまうような契約的生存戦術をとったり、スキルポイントのトリッキーな割り当てをして漂っているだけの人生など作らなくても、正面から戦える程度には人生の経験値でレベルアップしていると嬉しいですね。

ところで、公正世界仮説による認知バイアスとそうではない本来の世界の真実の姿みたいな事を考えると、メタレベルで混沌と秩序性について、素粒子レベルを含んだ物理学による物質と世界と時間と運命についてなんとなく本質的に同じ概念に目覚めそうな気がしてきます。まあ、わかんないからそこは私のなかでは"神"でいっかーって事にして寝ようと思うけど。楽しい夢の原因こうした混沌と秩序性を考えると、つまり私の中では"神"だから、夢は神様の啓示と捉えられるね、もちろん私の中だけでは、ね。

…同じ事を2000年とか4000年くらい前に考える脳があったら、宗教として残そうとかしたのかな。そうそう、私が思うに宗教や文化的風習や伝承として現代に残っている、あるいは伝わっている何かしらのいくつかは当時の社会や文化において一般的に理解や許容されにくい科学的な思考や哲学上のサムシングに気付いてしまった人が、それをたとえ話やトリックによる奇跡や時には嘘を流布してでもなんとか人々へ方便としてでも、あるいは後世へ伝え残る形で伝えようとし始まったものが…zzz(なお私は思考がパライソするような妙なオクスリとかは使っていませんzzz)

.net の System.Xml.Linq の XDocument/XElement で Element/Elements メソッドの挙動が意図せず null になったり空になったり、あるいはそもそも名前空間を与えたつもりの実装で例外が飛んだりした時に思い出すため、のメモ

<?xml version="1.0" encoding="utf-8"?>
<A
  xmlns:bbbbb="http://example.com/bbbbb"
  xmlns="http://example.com/aaaaa"
>
  <bbbbb:Z>z-value</bbbbb:Z>
  <B>b-value-0</B>
  <B>b-value-1</B>
  <B>b-value-2</B>
</A>

とかなんとか適当に XML があって、 System.Xml.Linq.XDocument / System.Xml.Linq.XElementElement / Elements を使おうとしたら…

1. bbbbb:ZElement しようとしたら System.Exception 例外が "The ':' character, hexadecimal value 0x3A, cannot be included in a name." とか Message に入って飛んだ場合

例外の Message に書いてあるままなんだけど、要素名 bbbbb:ZXElement へアクセスしようと以下のようなコードを書くと発生する:

void f( XDocument x )
{
  // 例外はいてしぬ
  var z = x.Element( "bbbbb:Z" );
}

名前空間を付けた要素名を与えたい場合は:

void f( XDocument x )
{
  // string => XNamespace は暗黙変換される
  XNamespace ns_bbbbb = "http://example.com/bbbbb";
  // ( XNamespace + string ) => XName は operator が定義されている
  XName name_bbbbb_z = ns_bbbbb + "Z";
  // Element の1引数版は XName を引数にしている(先の例では string => XName が暗黙変換されていた)
  var z = x.Element( name_bbbbb_z );
}

こうすると死なない。というか、こうしないとならない仕組み。実際問題でいうとめんどくさいけどまあそれはこの際オイトイテ💁

2. BElements しようとしたら1個も取れないし Element したら null だった場合

void f( XDocument x )
{
  // bs は要素が空の列挙になる
  var bs = x.Elements( "B" );
  // b0 は null になる
  var b0 = x.Element( "B" );
  // ところがこうして要素名を指定せずに列挙すると B も取り出せてしまう"怪奇現象"かのような事が起こる(実際は仕様であって怪奇現象ではない)
  foreach ( var e in x.Elements() )
    System.Console.Error.WriteLine( e.Value );
}

冒頭の今回扱っている例示の XML では xmlns によりデフォルトの名前空間"http://example.com/aaaaa" と定義している。これを System.Xml.Linq でも明示的に実装しないと↑のように空になったり null になったりする。

void f( XDocument x )
{
  // デフォルトの名前空間を明示的に与えるためのデフォルトなので見えない名前空間をきっちり定義してあげる
  XNamespace ns_default = "http://example.com/aaaaa";
  // 意図通り要素を今回の例なら3つ取れる
  var bs = x.Elements( ns_default + "B" );
  // 意図通り先頭の要素を取れる
  var b0 = x.Element( ns_default + "B" );
}

「デフォルトとは…」みたいなお気持ちになるけど System.Xml.Linq はそういう仕様なのでこれもめんどくさいけどわざわざ明示的にデフォルトの名前空間の要素名 ( XName ) を扱うよう実装を書いてあげないと期待動作しないのでした。

めんどくさいなぁ…と思いながら、また数カ月後とかに使う機会があったときに「なんでだっけ…🤔」とかなりそうな予感がしたのでメモ。

Reference

ProMicro が Unknown USB Device (Device Descriptor Request Failed) になってしまった!?と思ったけど問題はケーブルだった話

f:id:USAGI-WRP:20190308193802p:plain

ぎゃー💁

と、昨晩なったんだ。本当に手元の ProMicro が全滅していたらこれはしんどい。でもまあ、そんなわけないよねー😃

f:id:USAGI-WRP:20190308201351j:plain

↑最小構成のデモ用にちょっと持ち出せて、でも、あくまでも仮組み、はんだレス。そんな感じで小型ブレッドボードに組んでみているところ。(ふだんはこの作業マットの上ではだかのProMicroにスルーホールテストワイヤーを直接ぐさぐさしてます😇)OLEDを付けると、スイッチは4つアシだと1つしかこのサイズのブレッドボードにはさせないけれど、2つアシなら2キーさせるかも。DIPなら4キーさせるけど…。

なんてことを遊んでいたところ、オシゴトで一端外していたものを翌日つけたら Unknown USB Device (Device Descriptor Request Failed) ですよ!😂

「壊しちゃった?でもなんで??」

と、思いつつ、予備(というか積みキ用に用意してある)の3つも試してみたら全部同じ状況発生でダメ!しょんぼりしたよ。

f:id:USAGI-WRP:20190308202239j:plain

↑で、こっちが問題が解決した状態の絵。何が違うか気づいて貰えるだろうか…。少なくとも夜な夜なオネムの私の脳はこの間違い探しには気づけなかった😂

こたえ:繋いでるケーブルが180°回っている。

ProMicro は USB Micro B なのでコネクターにケーブルが回転するなんて事はふつーは起こらないのですが、私が使っているこのケーブルは自キ界隈では広く恐れられている「もげマイクロ」現象への対策として マグネット式のアダプターを追加するタイプのケーブル を使っていたのです。

で、このマグネット式のケーブル、USB の最小限の4ピンはきちんと持っているのですが、180°回した状態でも接続できるのです。できる…いや、できないのですが、できるのです。機械的には。

ところが、誤った回転で接続すると、 ProMicro は Unknown USB Device (Device Descriptor Request Failed) となり COM ポートも見えません。壊れないだけいいけど…、いやはや、なんてこったいでした😅

"見せ電子部品"とか"輝き"が好きなので実験のほか、わたし設計の自キでは ProMicro も"見せ"る向きになる予定でした。このケーブルも接続状態に応じて緑や青に輝くところが密かなお気に入りポイントだったのですが…そこは背面にしないとならない事に気づいてしまいました。悲しい😂

…光るケーブル作ればいいって、思ったでしょ…。

ちょっと、考えてる。

Lian Li のこういうの とか😇

Metasequoia と RenderMan とカラープロファイル。 It で暗く出力されちゃって途方に暮れないための手順メモ

Metasequoia + RenderMan の連携機能で遊んだら出力画像が暗くなってしまって「なんでーー😂」ってなった。そうならない方法がわかったのでメモ。

問題の現象

f:id:USAGI-WRP:20190304215513p:plain

悲しい😥

何が起きているのか?

MetasequoiaRenderMan 連携機能でデフォルトになっている出力方式の Itレンダリングし、 It で出力結果画像を Export File すると PNG でも JPEG でも TIFF でも色味が暗くなってしまう。

原因はカラープロファイルで、 It ではデフォルト状態でレンダリング結果の LinearsRGB へ変換して表示してくれている。これは It のメニューの View から設定を変更できるので、切り替えて表示を確認してみると Export File で発生した暗くなる問題の原因がこの問題に起因するものという事はわかる。

わかるのだけど、どうやら It では PNG, JPEG, TIFF での出力にカラープロファイルを埋め込んでくれたり、 sRGB へ変換した上で保存してくれたりする機能はなさそう😥

EXR ( OpenEXR )形式で Export File すれば Linear の全域をそのまま出力できるので、 Krita などで開いて PNG など最終的な出力を得れば…と、思ったのだけど、

f:id:USAGI-WRP:20190304221003p:plain

とりあえず開いてみたら真っ白でしょんぼり。レイヤーを見ると "a" の名称で真っ白なレイヤーがあり、その下に "Ci" の名称で階層化された "000", "001", "002" の3つのレイヤーがあった。

f:id:USAGI-WRP:20190304221134p:plain

どうやら Alpha, Red, Green, Blue をレイヤーとして分離出力したファイル…として認識されたらしい。他の EXR 形式対応のアプリで開いても同様だったところで EXR 形式の仕様を思い出してみてなんとなく納得した。つまり、 EXR で出力して、それを既存の一般的なラスターイメージ向けのアプリで変換するというのはめんどくさい…。できない事は無いが…😥 もちろんプログラマーさん的には変換アプリを作る事は EXR のライブラリーを使えばそんなに難しくはない…が…「既にそこにあるはずの絵」のためになぜ…という思いが…。つまりめんどくさい😥

この時点で思い付いたもっとも簡単ななんちゃって解決方法としては、「 ItPNG 出力して、画像編集アプリのレベル補正、ガンマ補正的な機能でぐいっと適当に調整する」というのもあるけれど、どうも既にできている出力画像を変換作業を手でやるめんどくささ+せっかく大域照明レンダリングしておいて情報損失しちゃうの勿体無い…というお気持ちでもんにょり。

そもそもの解決方法

問題は「 It または It から先でどうするか」だとばかり思ってしばらく悲しんでいたのだけど、「 It より前」に解決方法があった😃

f:id:USAGI-WRP:20190304222019p:plain

  • MetasequoiaRenderMan 連携機能のツールウィンドウの出力を It ではなく ファイル にする。

それだけの事だった😂

そうするとレンダリング途中経過の画像表示は行われないし、保存可能なファイル形式も BMP, PNG, JPEG, TIFF に変わるのだけど、 LinearsRGBレンダリング段階で既に完了した状態での出力となるのでカラープロファイル問題が起こらなくなる。

f:id:USAGI-WRP:20190304222338p:plain

意図した色味できれいな PNG ファイルを直接出力できました😃

KiCad 向けオレオレ 3Dモデリング Pro Micro 編、後半。


昨晩の 「Pro Micro の KiCad 向け 3Dモデル を作ってみるはなし。 Metasequoia の画像計測を使ったり 3DCG 方面の人っぽいアプローチでやってみるよ💁」 の続きです😃

仕上げにソケット&ピンをはめた状態にする前に、 KiCad ではテクスチャーを扱えないらしいので穴くらいはきちんとあけておくかーって思ったんです。 Metasequoia にもブーリアンは搭載されているので、基板にシリンダーで差ブーリアンするだけのはずーって思ったんです。

f:id:USAGI-WRP:20190228221639p:plain

思ったんです。

f:id:USAGI-WRP:20190228221648p:plain

ぎゃー💁

試しに1つだけ穴を開けるようにオブジェクトを調整してみても同様でした。なんてこったい…😂

再現性を確認するため、

  1. MQO を1つ別ウィンドウで起動
  2. 失敗した Pro Micro を作っている MQO から板とシリンダーをそれぞれコピーして検証用の別ウィンドウの MQO へ貼り付け(これができるところも MQO のべんりポイント💁)
  3. ブーリアン!!…同様に失敗💀
  4. シリンダーを1つだけにしてブーリアン!!…失敗💀

🤔…

原因を特定するため、

  1. 検証用の方で新たに板を作ってコピペしてきたシリンダーでブーリアン … 失敗💀
  2. 検証用の方で新たにシリンダーを作ってブーリアン … 成功😅 … ナゼダ…

f:id:USAGI-WRP:20190301110507p:plain

まー、できたからいっかー💁 昨晩は Fusion 360 へ移行するしかないかなーって諦めつつオネンネしいていたのでちょっと嬉しい。(CAD系3Dアプリの操作感はあんまり慣れないので😅)

f:id:USAGI-WRP:20190301114110p:plain

KiCad では 3Dモデル へテクスチャーは読めないらしーのでこれじゃあちょっと寂しいかなー…。

ホールの pad 乗せてみようかなー💁

f:id:USAGI-WRP:20190301140640p:plain

テクスチャー付けなくてもけっこーそれっぽく見えるようになった気がする😃

… SMD の pad も乗せてみようかなー💁

f:id:USAGI-WRP:20190301142915p:plain

だいぶそれっぽい!😃

シルクスクリーンのガイドも乗せてみようかなー💁

f:id:USAGI-WRP:20190301163422p:plain

もう Pro Micro にしか見えなくなってきた😃

… シルクの文字も乗せちゃおうかなー💁

f:id:USAGI-WRP:20190301171649p:plain

どうみても Pro Micro !!😃

…チップのレーザー刻印も付けちゃおうかなー…💁

f:id:USAGI-WRP:20190301201206p:plain

…裏面もちょっとだけシルク乗せちゃおー…💁

f:id:USAGI-WRP:20190301201328p:plain

できた、できた。もう誰がどうみてもパターンとはんだは無いけど ProMicro でしょー😃

いざ KiCad へ!

f:id:USAGI-WRP:20190301203938p:plain

…なんでやねーん😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂😂

期待動作していない点は、

  1. 基板の色が「赤」のはずが灰色
  2. 基板のポリゴンが壊れてる(↓図)
  3. 基板から R っぽいポリゴンがにょっきしてる(↓↓図)

f:id:USAGI-WRP:20190301205305p:plain

f:id:USAGI-WRP:20190301205634p:plain

先ず、色からなんとかする。

f:id:USAGI-WRP:20190301220612p:plain

MQO のレンダリングを基準に Material を作ったけれど、 KiCad で読むと shininess は金属部品を除きほぼ 0 にしないと diffuse が出ないみたい。 shininess1.0 くらいでもかなーり彩度が失われて灰色化してしまうと実験的にわかり、金属部品を除き基本的に shininess0 にしました😃

すると今度は LED が不透明な事に気付く。 KiCad 公式の LED の 3Dモデル は半透明になっていたはず…↓

f:id:USAGI-WRP:20190301221455p:plain

この↑ kicad-footprints:LED_D3.0mm 用の 3Dモデル のソースを眺めてみる。 VRML はテキストフォーマットなので GitHub でそのまま読める💁

                        DEF o2 Group {
                          children 
                            Shape {
                              appearance 
                              Appearance {
                                material 
                                Material {
                                  diffuseColor 1 0 0
                                  ambientIntensity 0.086274512
                                  specularColor 1 1 1
                                  shininess 1
                                  transparency 0.5

                                }

ambientIntensity が怪しいような、あるいはそもそも VRML 2.0 形式じゃないと透過処理してくれない実装なのか…。 MQO では VRML 1.0 しか吐けないし、これはまたそのうちの対応としよう…💀

さて、続いて致命的なポリゴンが壊れる問題へ。この問題は四角ポリゴンが原因かもしれない。

f:id:USAGI-WRP:20190301205820p:plain

この手の3Dモデルデータのアプリ間交換ではよくあるぱたーんの1つ。MQO で全てのオブジェクトを選択して 面を三角形化 を行ってみる。

f:id:USAGI-WRP:20190301232358p:plain

うむ、良い感じ😃

とはいえ、 SMD 風に実装する事はまず無いので「下駄」とセットの絵にしないとちょっとうさんくさい。自キ界隈でよくつかわれているように見えるスプリングピンヘッダー、コンスルーと呼ばれる工夫されたピンヘッダーを作って穿かせる事にしました。

f:id:USAGI-WRP:20190302060850p:plain

ほいできたっと♥

これを…穿かせて…

f:id:USAGI-WRP:20190302061106p:plain

KiCad で読み込んで…

f:id:USAGI-WRP:20190302061234p:plain

f:id:USAGI-WRP:20190302061349p:plain

オモテ、ヨシ😃

f:id:USAGI-WRP:20190302061442p:plain

ウラもヨシ😃

KiCad ProMicro オレオレ 3Dモデル できました!

https://github.com/usagi/usagi.kicad も更新。

f:id:USAGI-WRP:20190302063847p:plain

高さ違いのバリエーションも用意してみました。游舎工房お取り扱いはH=2.5mm、スイッチサイエンスお取り扱いはH=2.mm 。他の H については マックエイトカタログページ の PDF リンクのデータシート部分を参照して作成しました。10mm も下駄を穿かせるなら中にリセットスイッチとか実装しちゃうと名刺サイズとか小さなプラットフォームでは役に立つこともある…かな💁

f:id:USAGI-WRP:20190302064549p:plain

ProMicro のフットプリントなんだけど3Dモデルはスプリングピンヘッダーだけ立てる版も用意してみました。スプリングピンヘッダーだと ProMicro は着脱可能だしね!

f:id:USAGI-WRP:20190302073520p:plain

それとスプリングピンヘッダー単体も。

この後は「下駄」のバリエーションとしてピンヘッダー&ピンソケットを増やしたら、 MX Switch のKiCad用オレオレ3Dモデルを作ろうかなーって思います💁

それではおやすみなさーい💤

Pro Micro の KiCad 向け 3Dモデル を作ってみるはなし。 Metasequoia の画像計測を使ったり 3DCG 方面の人っぽいアプローチでやってみるよ💁

自分で作ったものを自分で使いたいお気持ちのホビーとして作ってみました。

先ず、ノギスで主要な図りやすい部分の長さを測って記録して…、それから、今回は表面に箱をたくさん生やす必用がある上にノギスでは図りにくい極小部品もあるので画像計測することにしました。

写真をトリマス。

f:id:USAGI-WRP:20190228135011p:plain

撮影時にピチピチに水平や画角を調整しておく手もありますが、今回はてきとーに撮っててきとーに補正しててきとーに測るてきとー方式で💁

f:id:USAGI-WRP:20190228134550p:plain

InkScape にノギスで測った Pro Micro の基板本体部分の外形の枠をレイヤーで用意します。枠はストロークを基板と被らないキョーレツな色(今回は緑)、フィルを基板と枠と被らない適当な色を不透明度を落として(今回は青のα=32)で用意すると作業しやすいと思います。

f:id:USAGI-WRP:20190228135449p:plain

てきとーに撮影した画像を貼り付けて、おーよその大きさを併せます。

f:id:USAGI-WRP:20190228141245p:plain

画像を移動&変形して枠の四隅に基板の四隅を合わせます。基板で画像がちょうどぴったりきれているわけではないので、回転は使わずに移動と剪断変形でてきとーに調整すると楽かもしれません。

f:id:USAGI-WRP:20190228143227p:plain

基板ピッタリサイズにページ設定をして、枠のレイヤーを非表示にして Export すると、きれいな正射影もどきの"テクスチャー"のできあがり。

f:id:USAGI-WRP:20190228143314p:plain

さて、それで画像計測はどこでするの?というと Metasequoia でてきとーにしちゃう。てきとーてきとー💁

f:id:USAGI-WRP:20190228143539p:plain

マテリアルにテクスチャーをがーんと乗せたやつを作る。編集作業中に確実にくっきりはっきり見たい用途ではマテリアルのパラメーターを「自己照明」= 1.00 で拡散、反射、周囲光を 0.00 にしてしまうのは Metasequoia のちょっとしたコツかもしれない。

f:id:USAGI-WRP:20190228143654p:plain

基板の外形を立方体で作って、天板だけこのテクスチャーのマテリアルを設定するとこうなる。

画像計測はいつになったらするのかというと、

f:id:USAGI-WRP:20190228144427p:plain

はいこの通り💁 Metasequoia 4 Ex にはこういう使い方する人に便利な「計測」ツールが狭義の CAD アプリに比べればおまけ程度ではあるんだけどしっかりついてる。べんり。

f:id:USAGI-WRP:20190228162317p:plain

と、いうわけで、ノギスで測っておいた数値と画像計測からそれっぽい数値をとってマテリアルで適当に色付けした直方体を置いていきます。

今回は MEGA32U4 と足から。この部品は 45° 傾いていているのだけど、 Metasequoia には部品ごとローカル座標系で編集したりする機能はないので、思い切ってすべてのオブジェクトを選択して側面ビューから回転ハンドルで 45° 傾けた状態で作ってしまいます。作り終わったらまた全てのオブジェクトを 45° 回して戻す。回転を行う際は、3面図ビューなどで必ず真横や真上からハンドルを操作します。そうしないと気づいたらオブジェクトが妙な角度に捻れてしまい悲しみの CTRL Z 連打をする事になるので注意…していてもたまにやってしまう😂

f:id:USAGI-WRP:20190228211204p:plain

f:id:USAGI-WRP:20190228212128p:plain

Pro Micro の USB Micro B コネクター、保護してない在庫が無かったのでコネクター以外の外形はフィーリングで作ったらわりと違っていて修正に手間取った上にちょっと違う感じになってしまったのが悔やまれる。気が向いたらコネクターだけ作り直したいな。

ピンヘッダー&ピンソケット版、コンスルー版を用意して KiCad で実用時の見た目に近くなるようにしたら https://github.com/usagi/usagi.kicad に追加しようと思います。今日は疲れたのでここまで💁