投稿者「kitzz」のアーカイブ

仕事机を新調した その2

仕事机を新調した のつづき

というワケで、Fully という海外のサイトで電動昇降デスクを買うことにしました。
買うのは完成品ではなく、天板のないデスクフレームのみ。
そしてオプションでキャスターを追加。

完成品にしなかったのは好みの大きさの天板にしたかったのと、海外通販なので送料やら関税やらを抑えるため。
天板は大きくて重い。そして絶対に部材と天板とで荷物が二個口になるので、きっと送料も関税もかさむ。
天板は日本のサイトで購入することにした。

さてこの Fully というサイト、日本への発送はやってません。。。
でどうするかというと、海外への転送をやってくれるMyUSというサービスのお世話になります。
この辺を語り出すとただでさえダラダラと長いこの話しがまたさらに長くなるので割愛。
MyUSを経由した初めての海外通販でちょっとドキドキでしたが割とすんなりと品物が到着しました。

さて次に天板です。
天板は MARUTOKU SHOP で購入。
ホワイトオークで 920mm x 550mm x 30mm 、クリア塗装でオーダー。
そして届いたのがこちら。


すばらしいです。

エルゴトロンのアンダーデスクキーボードアームとモニターアームはすでに購入済み。あとは組み立てるだけ。

なのですが、このデスクフレーム、きちんと組み立てようとするとキーボードアームと干渉する。。。

でどうするかというと、デスクフレームの左右の部材をつなぐ真ん中のレールを取り去ってしまいます^^;..

小さめの天板で厚みも十分にあるので真ん中のレールがなくても強度的に問題ありません。(たぶん
あとは電ドリで下穴あけてがんがん木ネジ打ち込んで固定。固定は木ネジとネジとボルトのみ。

そしてできあがったのがコチラ。

昇降はこんな具合


marutoku shopでは、作成する木材に好きな大きさの穴を任意の位置にあけてもらうことができます。中央に設置したモニタアームのすぐ脇になる位置にケーブルを落とす穴をあけてもらいました。このピッタリ感はカスタム天板ならではです。

キャスターです。

机の大きさを必要十分に抑え、キャスター付けて動かしやすいようにしました。

なぜ動かす必要があるかというと、在宅勤務で仕事机の前に1日中いるので、必然的にその周りが散らかり放題になるので。。。 ちらかったらとりあえず移動して、それから片付けよう。。 という魂胆なのだが、はてさてうまくいくだろうか^^;..

さて、これでおいくらかかったでしょうか。
純粋に机の部分のみで、モニタアームやキーボードアーム、デスクライトなどなどは除外。

デスクフレーム(フレームのみ、キャスター付)
 FullyでPaypal経由で購入した額
     56,521円
 MyUSに支払った額
     32,464円
 後からフェデラルエクスプレスに払った輸入関税
     4,700円

天板
 marutoku shopで購入
     25,180円

計    118,865円

うん。日本で既成の電動昇降デスク買うよりは安くなったかな。
しかもカスタムな天板で。
かなりよろしいんじゃないでしょうか^o^

仕事机を新調した

今まで仕事に使ってた机が微妙に体に合わなくて肩凝りなどの原因になってるように思い、仕事机を新調することにした。

そんで、いろいろ悩んでいろいろやって出来上がった仕事机がコチラ。

とても気に入っている。
電動で昇降し、高さを4つまでメモリーできる。
いま流行りのスタンディングデスクになるのだ。

以下、この仕事机が完成するまでのあれこれを備忘録として記録しときます。

当初はスタンディングデスクとして使うことは全く目論んでなかったりする。

単にキーボードとモニタの高さをミリ単位で調節できるようにしたいという要求から始まった。正しい姿勢でまっすぐディスプレイを見て、肩肘に力の入らない適切な手の位置でキーを打つために。

モニタはモニタアームで調節できるとして問題はキーボード。キーボードトレイを付けるにしてもその高さをぴったりの位置に調節したい。また机の上にノートパソコンを置いたりした時もやはりぴったりの高さにしたい。すると、無段階で高さの調節できる机じゃないとダメだよね?、と思ってネットで調べてもちょうどいいのはなかなかなくて、医療用か、もしくはスタンディングできる昇降デスクか、という選択肢になるのであった。

デスクを新調するにあたり、キーボードの置き場所としてこれを使うことを決めていた。

エルゴトロンのアンダーデスクキーボードアーム。机の下にしまえて高さも調節できる。
ところがこれ、キーボードトレイを机の下にスライドできる構造なのでそのレールを設置するために机の裏側に奥行き40数センチほどの平らな空間が必要になるのだ。
これがかなり曲者で、机の裏側はたいていフレームが横切ってたりして、40センチもの平らな奥行きを確保できるものは稀だったりする。
また、ネットで売ってる机のほとんどは天板裏側がどうなってるかの情報がまったくない。。。。
フレームが横切ってたりして平らな面を確保できない場合は角材をかましてそれらを回避するという手もなくもないが、せっかくの新調デスクがカッコ悪くなるのでやりたくない。

ネットでいろいろと机を物色したものの、このキーボードトレイがきちんと付く確証がないのでほとんどが脱落。

最終的に、以下のふたつの候補が残った

エルゴトロン WorkFit-D
エルゴトロンの昇降ワーキングデスク。エルゴトロンの机なので当然ながらエルゴトロンのキーボードアームが付く。
電動ではなくガス圧昇降式。電動だと高さの変更にちょいと時間がかかるが、ガス圧で少ない力加減でさっと希望の高さに変更できることをウリにしているようだ。
そして天板耐荷重30kg。
海外通販の電動昇降スタンディングデスク

具体的にはココ。 https://www.fully.com/jarvis-reclaimed-wood-standing-desk.html
日本でも岡村やサンワダイレクトなどいくつか電動昇降デスクを出してるところがあるのだが、少々値が張るのと少々大きすぎる。そして前述の通りアンダーデスクキーボードアームが直に設置できるかどうかわからない。
また、海外通販せずとも同じようなものを並行輸入業者と思しきところが楽天で販売しているのだが、直接海外通販すると細かいオプションとか選択できるのでそっちを利用することにする。

さて、それでかなり悩んだ末に、後者の海外通販を行うことにした。
 エルゴトロンの WorkFit-D でもよかったのだが耐荷重が30kgというのが気になった。もちろんそれが支障となる使い方はほぼ間違いなくしないのではあるが。。。 あとガス昇降ということで上に載ってる重さによって昇降の力加減が変わる可能性があることも気になった。
 一方海外通販の方はまずもって海外通販というのが面倒くさい。ただし、キーボードアームが付けられる算段は付いててしかも天板なしで電動昇降のフレームのみの販売もやってる、そしてオプションでキャスターを付けられる。いろいろカスタムできそうというのが決めてになった。また机の高さをメモリーできて、1クリックで指定の高さにできるのもポイント。
 結果的に、この選択をしたことに十分満足してる。でもまあエルゴトロンのデスクを選択したとしてもそれはそれで満足して使ってたとは思いますが^^;..

長くなったので その2

COM と WRL::ComPtr

これまで中途半端にOpenGLESとMetalを使ったことがあるくらいでDirect3Dはまったくいじったことのないオッサンが「まあMetalとそんな変わらんだろう」といきなりDirect3D12に挑戦して四苦八苦してます。ロートルオジサンにはつらい。。。

で表題の件ですがDirectXのオブジェクトは基本COM。Direct3D12になってもCOM。
D3D12からは言語はC++しかサポートせず、そしてオブジェクトの保持や破棄は全てプログラマが責任持って管理するようになったのにCOMを使う利点って何だろう。。。
もうValkanのようにイチから設計し直して欲しかったがそれならValkanをどうぞということだろうか。

それでCOMですが、アラフィフになってえっCOMって何? なロートルおっさんなので勉強しました。

  • 参照カウント方式。AddRefしたらReleaseする。カウンタがゼロになったら解放される
  • 戻り値や引数でCOMを返却する関数は関数側でAddRefして返す。関数から受け取った側は必要なくなったらReleaseする。

MRC時代のObjective-Cの参照カウンタと似たかんじで、これはOK。

次に WRL::ComPtr。 参照カウンタの面倒を自動化してくれる。すばらしい。

ただ、参照カウンタをどう扱うかのポリシーみたいなやつのドキュメントが見当たらない。どう使っていいのかいまいちピンとこない。しかたないのでComPtrのヘッダをみてみる。

WRL::ComPtrはコンストラクタや代入でCOMオブジェクトを受け取る時に必ずAddRefし、管理しなくなる時に必ずReleaseする。
これは徹底している。参照カウンタが元に戻ることが保証される。
右辺値参照にも対応し、moveする場合は参照カウンタは増えない。

これはなかなか良い。

だけども、Create系関数から返却されたオブジェクトをComPtrで扱おうとするとあれっとなる。
Create系関数から返却されたオブジェクトはすでにAddRefされた状態で返ってくるので、こいつはAddRefせずにReleaseだけ行う。
だけどコンストラクタや代入でWRL::ComPtrに渡すとAddRefしてしまう!!

で、どうするんだろうとサンプルコードなどをみると、ComPtrでCOMオブジェクトを受けるのはこんなカンジになってる

ファッ!?? ってなりますよね。 なりますよね?

&deviceって何??
なんでComPtrのアドレスを直にD3D12CreateDeviceの引数にぶっこんでるの??

と思ってComPtrのヘッダをみると、単項 & 演算子がオーバーロードされていた。こいつがDetails::ComPtrRef<ComPtr<T>>を返す。さらに Details::ComPtrRefの operator InterfaceType**() が呼ばれて、元のComPtrのReleaseAndGetAddressOf()を呼ぶ。。。。 つまり、上記のCreateDeviceのところは

と書くのと同じである。

これでようやく、ああ、ComPtr内部で持ってるオブジェクトのポインタのアドレスを渡して直接オブジェクトを得るんだな。この時AddRefはされないんだな。そしてComPtrのデストラクタで無事Releaseされるんだな。というのが理解できた。

これくらいのことをヘッダ辿って調べるのは一般的なC++erだったらきっと至極当然のことなのであろう。だからWRL::ComPtrのこの辺の挙動を疑問に思うエントリがぐぐっても出てこないんだ。たぶん。
でもロートルおじさんはこの辺の挙動を理解するのに苦労したのでこうして書き留めるよ。

しかしこれ、 &device って書くよりも device.ReleaseAndGetAddressOf() って書く方が圧倒的にわかりやすいよねえ。。。