なんか書いていこうぜー .com

Let's write something good

Ruby の Curses::Window#refresh と Curses::Window#noutrefresh の違い

2020-10-12
  • Share on Facebook
  • Tweet
  • Add to Pocket

最近 Ruby の curses を使って遊ぶことがあり、その中で Curses::Window#refreshCurses::Window#noutrefresh の違いがよくわからなかったので、ドキュメントを探していた。

日本語で探すと るりま が検索にかかるが、最新とは内容が離れているのでメモemoji-memoとして残しておく。

Ruby の curses のドキュメント

curses は Ruby 2.1.0 から標準ライブラリから切り出されて独立した gem になっている。see: https://github.com/ruby/curses#description

切り出されたことにより、curses のるりまは 1.8.7 の library curses でなくなって?おり、ruby/curses の README の Documentation にあるように www.rubydoc.info にあるものが最新を追随している公式ドキュメントになっている。

1.8.7 標準添付の curses から 現在の v1.3.2 までの間に API も増えているため、残念ながら 1.8.7 の情報では現在の curses を扱うのは難しい。

physical screen と virtual screen

Python の curses のドキュメント https://docs.python.org/3.5/library/curses.html はより詳細に説明が記載されており、physical screen と virtual screen という語を使って説明されていた。日本語版もあるが、単語が明確に分けて使われている英語のほうのドキュメントがおすすめである。

実際に私たちに見えるのは physical screen で、見えていないが変更内容を保持しているのが virtual screen である。virtual screen に対して変更したものを physical screen に同期するようなかたちで更新し、physical screen に反映して表示する仕組みとなっている模様だ。

尚、Curses.doupdate というメソッドが用意されており、これにより強制的に physical screen を更新することができる。

Curses::Window#refresh と Curses::Window#noutrefresh の違い

さて、本題である。

https://www.rubydoc.info/gems/curses/Curses/Window をみると、どちらも Curses::Window に設定した内容を更新するメソッドで、両メソッドの説明には Refresh the windows and lines. とある。

Curses::Window#noutrefresh は加えて、Curses::Window.noutrefresh allows multiple updates with more efficiency than Curses::Window.refresh alone. と書いてあるので、複数 Window がある場合に効率的に処理できるらしい。

Curses::Window#refresh

Curses::Window#refresh は、指定された Curses::Window の設定内容を virtual screen、physical screen の両方に反映するようだ。つまり、実行されると更新されたものが私たちに見えるようになる。

Curses::Window#noutrefresh

一方で、Curses::Window#noutrefresh は指定された Curses::Window に設定した内容を virtual screen にのみ反映するようだ。この段階では私たちに変更は見えない。 これを physical screen に反映するには Curses.doupdate を呼び出す必要がある。こうすることで、virtual screen の内容が physical screen に反映される。

先に書かれている “効率的” というのは、Curses.doupdate が存在する Curses::Window すべての virtual screen の内容を physical screen に反映するためだ。Curses::Window#refresh は 1 つの Curses::Window に対して Curses::Window#noutrefreshCurses.doupdate を実行しているようなものなので、こちらを使ったほうが確かに効率的だ。

まとめ

Python のドキュメントのちからを借りつつ、Curses::Window#refreshCurses::Window#noutrefresh の違いを確認した。

  • Curses::Window#refresh
    • 1 つの Curses::Window に対して、virtual screen, physical screen 両方を更新する
  • Curses::Window#noutrefresh
    • 1 つの Curses::Window に対して、virtual screen のみを更新する
    • physical screen を更新するには Curses.doupdate を呼ぶ必要がある
    • Curses.doupdate はすべての virtual screen を physical screen に反映するので複数 window がある場合はこちらを使うのが効率的である

ruby/curses のメンテをしている shugo さんの作っている Textbringer の window クラス が同様の使い方をしているので合っているはず。

Ruby の curses のドキュメント

2020-10-12
  • Share on Facebook
  • Tweet
  • Add to Pocket

最近 Ruby の curses を使って遊ぶことがあり、その中で Curses::Window#refreshCurses::Window#noutrefresh の違いがよくわからなかったので、ドキュメントを探していた。

日本語で探すと るりま が検索にかかるが、最新とは内容が離れているのでメモとして残しておく。

Ruby の curses のドキュメント

curses は Ruby 2.1.0 から標準ライブラリから切り出されて独立した gem になっている。see: https://github.com/ruby/curses#description

切り出されたことにより、curses のるりまは 1.8.7 の library curses でなくなって?おり、ruby/curses の README の Documentation にあるように www.rubydoc.info にあるものが最新を追随している公式ドキュメントになっている。

1.8.7 標準添付の curses から 現在の v1.3.2 までの間に API も増えているため、残念ながら 1.8.7 の情報では現在の curses を扱うのは難しい。

physical screen と virtual screen

Python の curses のドキュメント https://docs.python.org/3.5/library/curses.html にはより詳細に説明が記載されており、physical screen と virtual screen という語を使って説明されていた。単語が明確に分けて使われている英語のほうのドキュメントがおすすめです。

実際に私たちに見えるのは physical screen で、見えていないが変更内容を保持しているのが virtual screen で、virtual screen に対して変更したものを physical screen に同期するようなかたちで更新し、physical screen に反映して表示する仕組みな模様。

Curses::Window#refresh と Curses::Window#noutrefresh の違い

https://www.rubydoc.info/gems/curses/Curses/Window をみると、どちらも Curses::Window に設定した内容を更新するメソッドで、両メソッドの説明には Refresh the windows and lines. とある。

Curses::Window#noutrefresh は加えて、Curses::Window.noutrefresh allows multiple updates with more efficiency than Curses::Window.refresh alone. と書いてあるので、複数 Window がある場合に効率的に処理できるらしい。

#refresh は以下のように動くようだ。

  1. 仮想スクリーンに設定された内容を物理スクリーンに反映する
  2. 仮想スクリーンを

https://github.com/shugo/textbringer/blob/main/lib/textbringer/window.rb

Kanazawa.rb #96 に参加した

2020-08-23
  • Share on Facebook
  • Tweet
  • Add to Pocket

LT 大会ということで 2 本準備して発表した。

一本目は、ActiveRecord インスタンスのメモリ使用量について。 二本目は、最近思いつきではじめた自作 PC の話をした。

自作 PC はまだ全然落ち着いてなくて、配線の見直しや空気の流れ、ファンの音等気になるところはいろいろあって、気になったところには何かしら手を入れている。場所をとらない程度に小さな散財が続いている。

懇親会だか本編だったか覚えていないが、Udemy への言及があり、みたらなんか安かったので安いものの中から興味ありそうなものをいくつか購入した。

トータルでみると結構長いので、倍速で聴いてる。さらっと知らないことが語られていることがあるので聴かざるをえないけど、合わない動画が厳しい(けど、知らないこと語ってるので頑張って聴いてる。)

初めて PC を組み立てた その後

2020-07-30
  • Share on Facebook
  • Tweet
  • Add to Pocket

初めて PC を組み立てた で今後の課題を書いたが、対応してみたので、その後を書く。

1. ディスプレイとキーボードをどう共有するか

電源不要の HDMI 切替機 https://www.amazon.co.jp/gp/product/B07LFRVQR2/ を、それぞれのディスプレイに接続した HDMI ケーブルに接続し、分岐させて、ボタン押して切り替えている。

ディスプレイ毎に切替機の色を変えて、それとなくわかりやすくしている。1 個がそれほど高くないので、ダメで元々できたらいいやくらいでやったらうまく動いたので、これでいった。

既存の切替器自体を接続数の多いものに置き換える、でもよかったけど、相性問題で苦労したくなかったので、安く済ませてしまった。

キーボードは USB ハブのケーブルが元々長かったので、単純に “挿し替える” で解決するようにした。

2. バックアップ用 HDD の設定

外付けだと、手元の裸族のお立ち台を使うことになるのだが、ケースの上に置くとちょっと高さが出てしまうのでケース内に設置することにした。

ケースに 3.5 インチ HDD 用のマウンタが用意されていたので、3.5 インチ HDD と SATA ケーブルを追加で買って電源ケーブルをかき分けてがんばってケース内に設置した。

ディスクをフォーマットして、timeshift と cronie を導入し、/home に対して定期バックアップを設定した。/home はパーティションわけずに、壊れたらバックアップから戻すスタイルにしている。

3. HDMI を DisplayPort に変換して接続する

ケーブルのない変換口だけのもの https://www.amazon.co.jp/gp/product/B01M1KJ7UP/ を買って、背面のグラボにある DisplayPort に挿してその口に HDMI ケーブルを挿す。切替は 1 でも使っている切替器を利用している。

無事に解像度が落ちることもなく接続できているので、これでいく。以前変換できないものがあったので、あまり期待してなかったが、無駄にならなくてよかった。

グラボのファン

ディスプレイを 2 つ接続したらグラボのファンが回りました。グラボのファンがもしかしたら一番音が大きいかも。直径が一番小さいので仕方ない。

グラボはチップセットにしか注目してなかったため、メーカーごとの特徴についてはノーチェックだった。メーカーでどれくらい変わるのか試したい気持ちがあるが、グラボは高いねん。。。

初めて PC を組み立てた

2020-07-26
  • Share on Facebook
  • Tweet
  • Add to Pocket

ノート PC が壊れたことをきっかけに自作 PC に対する関心が高まったので、行動に移してみた。

今回組み立てた部品リストと購入品

用意したパーツは以下のとおり。 購入サイトで CPU を選択したときにおすすめされたパーツを基本として、ケースはなんか検索でひっかかった大きいやつ。大きいもの(ATX)を選んだのは、単純に配置しやすいかなと思っただけ。

パーツ メーカー 型番 備考
CPU AMD Ryzen 9 3900X 100-100000023BOX
メモリ CFD W4U3200CM-16G
ケース NZXT H710 CA-H710B-B1
CPU水冷クーラー CORSAIR H150i RGB PRO XT
グラフィックボード GIGABYTE GV-R56XTWF2OC-6GD RADEON RX 5600 XT 内蔵
電源 CORSAIR RM850x White 2018 黒がなかったので
SSD Western Degital WD Blue 3D NAND SATA WDS500G2B0A Windows 用
M2.SSD Intel SSD 660p Series SSDPEKNW512G8XT Linux 用
マザーボード ASUS ROG STRIX X570-F GAMING
グリス 親和産業 SMZ-01R /OC Master
工具 Ainex TL-020

自作PCバイブル2020-2021 というムック本を参考に、初めての組み立てを進めてみた。

付属の説明書と、ムック本と、同じメーカーのケースを使った組み立て動画を参考に組み立てた。 孤独のグルメシーズン8 を流しながらの作業で、シーズン終わるまでには OS インストールまで進んだ。

苦しんだ・時間がかかったポイント

組み立て自体が初見なのにかなり大きい CPU クーラーを用意したため、ケースの特性、CPUクーラーのケース内での配置、配線どれもわからずに一旦心が折れたemoji-cryので、代わりに一時しのぎでリテールクーラーを設置するという遠回りをしたため時間がかかった。

Ryzen 9 3900X は GPU 機能を内蔵していないため、マザーボードにくっついている HDMI や DisplayPort コネクタが機能しない、という点に気がつくのにも時間がかかった。この HDMI に接続、PC 起動して、マザーボードの警告ランプがつきっぱなしになったので焦ったが、マザーボードの設置レポート等ググって気がついた。

つけたグラボは機能しているがファンが回らないので「大丈夫か?」となったが、負荷がかからないと回らないらしいので静観している。

あるといいなと思ったもの

照明位置emoji-bulbの関係で作業する際手元が暗かった。スマホのライト機能を使っていたが、初心者なので静電気防止手袋して作業しているものだから、手袋しているとスマホが操作できない。「あ”ー」ってなって手袋外す、というのを何回かやったので、手元を照らすライトemoji-flashlightがあるとよかったなと思った。

組み立てての感想

思ったより静か。今のところ快適。

ケース重要。もうちょっとわかりやすい単純なケースにしてもよかったかも。

CPU に GPU 内蔵しているかどうかは確認しておこう。グラボ一緒に買っておいて助かった。

配線には魔物が棲んでいる。ケースに付いているファン、クーラーのファンが多ければ多いほど追加の配線が増えるので複雑度が増す。

今後の課題

  1. ディスプレイやキーボードをどう他の PC と共有するか。電源不要の HDMI 切替器を利用しようと考えている。USB ハブでまとめて、ハブは差し替えるかぁ…というところ。
  2. バックアップ用の HDD を、ケース内のマウンタに HDD 入れて管理するか、USB で外からつないで管理するか。SATAケーブル取り回すの面倒だから今のところ、外付けが優勢。
  3. 2 枚目の外部ディスプレイを DisplayPort で接続する必要があるが、HDMI to DisplayPort がうまく動くか試す。