Hello World / plɹoM ollǝH

Programmers Live in Vain

読み取り専用にできるチェックボックスを作る

class MyCheckBox(QCheckBox):
    def __init__(self, in_text=None):
        super().__init__(in_text)
        self._readOnly = False

    def isReadOnly(self) -> bool:
        return self._readOnly

    def setReadOnly(self, readonly: bool):
        self._readOnly = readonly

    def mousePressEvent(self, event):
        if self.isReadOnly():
            event.accept()
        else:
            super().mousePressEvent(event)

    def mouseMoveEvent(self, event):
        if self.isReadOnly():
            event.accept()
        else:
            super().mouseMoveEvent(event)

    def mouseReleaseEvent(self, event):
        if self.isReadOnly():
            event.accept()
        else:
            super().mouseReleaseEvent(event)

    def keyPressEvent(self, event):
        if self.isReadOnly():
            event.accept()
        else:
            super().keyPressEvent(event)

意外と悪くない Surface Go 2

インフルエンサーによる Surface Go 2 レビュー

Surface Go 2 を買った理由

Windowsノートが必要になった

週2日程度、自宅以外でプログラム書く必要が出てきたので、持ち運べるノートPCが必要になりました。他のノートPCは売ったり、壊れかけて自宅サーバーと化していました。

性能ほどほどでよかった

今趣味で書いてるプログラムが2Dゲームだったので、ハイエンドなものは特に求めていませんでした。3Dゲームとかは自宅のデスクトップでやれば良いですし。

2 in 1 のほうが都合が良かった

制作中のものを友人に遊んでもらいたいと思ったり、展示会や即売会に参加したいという意思があるのですが、そういったとき遊んでもらう分には「画面+USBゲームパッド」だけのほうが見た目がすっきりしていて良いなと思いました。とはいえ、タブレットPCは値段も割高で汎用的な作業に支障も出そうでしたので、選択肢としては180度以上画面が回転するノートか 2 in 1 でそこそこしっかりしてるものを買いたいと思っていました。

たまたま Surface Go 2 が発表されてすぐのタイミングだった

このような事態になったのが、たまたま Surface Go 2 が発表されてすぐの時期で、 Surface シリーズはまだ試したことがないので試したくなり購入に至りました。

f:id:dungeonneko:20201028115951j:plain
結論から言えば、買って良かったです

良くない点

値段

この製品で一番問題なのはたぶんこれ。

公式サイトから「【Microsoft Store 限定】Surface Go 2 お得なまとめ買い」で、M3モデルを購入しましたが、本体、タイプカバーキーボード、タッチペン、マウスを付けて12万円弱。 5年(60ヶ月)使うとしても月々2000円の出費です。

購入を考えている人は「月々2000円払ってでも、Surface Go 2 を使いたいか?」を基準に考えると良いかもしれません。

性能基準で選べばもっとコスパの良い製品はいくらでもあります。

あと、正直「ペンは要らねぇな」って思いました。 キーボード+マウス派の人はペン買わない選択をお勧めします。1万円程度安く済みますので。

ディスプレイがグレア液晶

Pixel Senseディスプレイはとても綺麗なのですが、映り込みが激しいです。昼間の屋外、移動中のバス、電車、タクシーの中では使えないです。GOと行っても「お外へGO!」ではなく、あくまで「リモートオフィス、会議室、移動教室へGO!」のようです。どうしても気になる人はノングレアの保護シートを買えば良いと思いますが。

スリープ復帰+Windows Hello

スリープから復帰したときの、カメラの立ち上がりが遅いです。最悪カメラが起動しなくてWindows Helloでログインできないことがあります。iPhoneで言うとこのTouch ID的なイライラ感があります。このあたりはWindowsアップデートで解消されたりするかもしれません。

Windows10 のタブレットモード

私が原始人なのが原因かもしれませんが、単純に使いづらいです。

もっとコルタナさんや手書き入力を活用したほうが良いのでしょうか?

誰かタブレットモードを徹底的に使いこなしている人がいたら教えてほしいですね。

ACアダプタが厚く感じてしまう

本体がスマートなぶん、どうしてもACアダプタの厚さが気になってしまいますね。一番 GO したくなくなる原因がコイツ。

f:id:dungeonneko:20201028114807j:plain:w320
Chunky, Bacon!

キックスタンドが開きづらい

ヒンジが丈夫なのは良いのですが、手と本体の位置関係によってスムーズに開けられないこともあります。

f:id:dungeonneko:20201028124201g:plain
慣れれば解決する問題かもしれないが…

要経過観察

パフォーマンス

Surface Go 2 - LTEIntel Core M3、メモリ8GB、SSD128GB を買いました。

YouTubeではこのへん結構気にしてる方がいるようなのですが、プログラミング自体にはタスクの切り替えも発生しないし、CPUやGPUのパワーもいらないので。。。

Visual Studio入れましたが、C#で2Dゲームを作っている程度なので今のところスペック不足は感じていません。 普通にChromeYoutubeを見ながら作業しています。C++でビルドとかするようになったらヤバいかも。

目的がお絵描きだったり、本格的なアプリ開発とかだったら、このあたり気になってくるかもしれませんね。

バッテリー容量

買ったばかりですし、ディスプレイの問題で、外に出て長時間作業することがそもそも無いので判定できません。 このご時世ではリアルでセミナーなどに参加する機会もほぼ無いですし。

※11月28日追記:ネット無しでコーディング+デバッグして半日持つ程度でした。特に良くも悪くもないといったところ。

落としたらヤバそう

落としたらやばそうな重量感がギリギリあります。たぶんあと100gくらい軽かったら安心できるやつです。キックスタンドを開いたまま落としたら多分壊れます。本体の角も角ばっているので、落とした後も、ツルッではなくガリッといきそうな雰囲気です。

f:id:dungeonneko:20201028115557j:plain:w320
本体の四隅もタイプカバーが覆ってくれると良さそうなのだが

膝の上で作業できるのか問題

Surfaceが出てきた当時よく言われていたような気がするのですが。私は特に気になりませんでした。前述したディスプレイ問題で、ほぼ屋内使用なのもあるかもしれません。

キックスタンドが肉に食い込むとかでしょうか?

※11月28日追記:近所で初代Surfaceを使っている人に話を聞いたのですが、初代はキックスタンドが途中で止まらない(角度が固定される)ようでした。この点はちゃんと改善されているようですね。

良い点

持ったときの手に馴染む感覚

重さ、手触り、厚さ。タイプカバーキーボードを付けたときの持ち心地が、とても良いんですよね。これはかなり力を入れてきた点だと思います。

一度でも知ったら、また Surface 買いたくなってしまうような良さがあります。

ただ、前述の「落としたらヤバそう」感は否めないので、ヒヤヒヤしながら使ってます。

最初は別途購入した保護カバーを付けて使っていたのですが、裸で使った時の良さに使用を断念せざるを得なくなりました。それくらい手触り良いです。

f:id:dungeonneko:20201028121000g:plain
保護カバーなしで使いたくなってしまう丁度良さ!

充電端子がマグネット式

ようやくWindowsノートにも文明が到来しました。もうUSB充電には戻りたくないです。

f:id:dungeonneko:20201028120636g:plain
これでMacBookユーザーにも馬鹿にされないぞ!

※11月28日追記:初代Surfaceからこれでした。

スピーカー

画面左右からしっかりした音質で聞こえます。下手なイヤホンよりは全然臨場感あるので、ヘッドホンとかは持ち歩かなくていいなと思いました。

音が静か&熱くならない

他のPCと違うところがもう一つ。ファンレスなので駆動音がほぼないです。夏場になってからもう一度チェックする必要がありますが、今のところは本体がアツアツになることもなく、ウンウン唸る他のPCにジェネレーションギャップを感じてしまいます。

保護カバーについて

現在は裸で使っていますが、購入当初はサードパーティ製の保護カバーとペンホルダーを付けて使っていました。

今でも旅行に行くときなどには保護カバー装着してリュックにいれています。購入したカバーが使いづらかったというわけではなく、裸の手触りには敵わないと感じてしまってから、なんとなく付ける気にならないのです。ペンも出番ないですし。保護カバーの製品自体には満足しています。

f:id:dungeonneko:20201028121320j:plain:w320
購入していたカバーとペンホルダー

f:id:dungeonneko:20201028121603j:plain:w320
内側はしっかり衝撃吸収してくれそうな感じ

f:id:dungeonneko:20201028121654j:plain:w320
傾きもこれ位までならいける

f:id:dungeonneko:20201028121743j:plain:w320
カメラに影が映りこむかと不安だったが問題なかった。そりゃそうか。

f:id:dungeonneko:20201028121840j:plain:w320
裸と比べるとどうしても野暮ったくなってしまう

f:id:dungeonneko:20201028121923j:plain:w320
こんな感じでペンとカバーを使っていく予定でした

まとめ

月々2000円を払って そんなにハイスペックじゃない Windows ノート でやりたいことがあるなら買ってもいいんじゃないかと。 使う目的がはっきりしていて、Surfaceシリーズ未体験ユーザーであれば、きっと気に入ると思います。

補足として

  • あくまで屋内使用が良さそう
  • キーボード+マウス派はペン要らない
  • わからんけど、タブレットとしては期待しないほうが良いんじゃないかなぁ
  • 保護カバー最初は欲しくなるけど、すぐ裸で使いたくなると思います
  • とはいえ裸でお外にGOはちょっと恐いので、今ならスリーブケースを買うかな

という感じです。購入検討している方の参考になれば幸いです。

QListWidgetItemの位置やサイズを調べる

QListWidget::visualItemRectを使う。 例えばキーボードでコンテキストメニューを出したいとき等に使える。

class MyList(QListWidget):
    def __init__(self):
        super().__init__()

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Backspace:
            item = self.currentItem()
            if item:
                rect = self.visualItemRect(item)
                self.customContextMenuRequested.emit(
                    QPoint(rect.x() + rect.width() / 2, rect.y() + rect.height() / 2))
        return super().keyPressEvent(event)

なんだかんだ 10ヵ月間使っている Insta360 GO 簡易レビュー

購入後すぐレビューした記事はこちら dungeonneko.hatenablog.com

このカメラで最近撮影した映像↓

良いところ

お出かけ先で気軽に身に付けて撮影できる

これがほぼ全てなのですが、とにかく荷物が少ないです。

充電ケースをベルトやリュックに付けて、カメラ本体は服に着けていることが多いです。

後述しますが、撮影と言っても狙ったものが撮れるわけじゃないです。

f:id:dungeonneko:20201021225710j:plain
単三電池は大きさ比較用

スマホだけで動画編集してエクスポートできる

公式アプリの動画編集がまぁまぁ良くできています。

音楽をつけて、タイミングに合わせてカット編集するくらいなら十分です。というか、面倒なのでそれくらいしかやりません。

そのままエクスポートして、Google DriveにアップしたりLINEで送ったりします。

f:id:dungeonneko:20201021231147p:plain
意外と充実している編集機能

画質はそんなに悪くない

広角レンズで撮影解像度は3040x3040pxで、エクスポート後に幅2560pxになります。手振れと角度の補正分余計に撮っているのだと思います。

PC全画面で見るとさすがに他のカメラとの差が気になってしまいますが、スマホの小さい画面で見たりする分には全く気になりません。

手振れ補正もソフトウェア的に処理しているような気がしますが、とても優秀です。

カメラを意識されずに自然な映像が撮れる

私の友人知人家族は、みんなカメラを向けた瞬間に笑顔が引きつったり、求めていない演技を始めたりするので助かっています。

エチケットとして、人が多い場所やお店の中では身に付けないようにしていますが、そもそもこのカメラ「自分が何をしているか」のほうが大事で「何か」を撮っても面白い映像にならないと、個人的には思います。

良くないところ

広角すぎるので撮影範囲をコントロールできない

自分が何を撮っているのか、ほぼ制御不能です。

服に着けて撮影している場合は特にそうです。

たとえば「胸のあたりにカメラを着けて、料理を食べているところを撮ろうと思ったら、料理は画面の端っこに映っていた」というような事がよくあります。

「自分の体が向いているほう」くらいでしか合わせられません。

「ちょっとアップにしよっかな~」とか考えて手で持つと、指が映り込んで使えない映像が撮れたりします。

その場で自撮り棒とかに付け替えるくらいなら、スマホで撮ったほうが良いですし。

スマホケースつけたままデータ転送できない

購入後のレビューにも書きましたが、カメラの充電ケースは完全に設計ミスです。

dungeonneko.hatenablog.com

基本的には一日服につけたまま動画ちょいちょい撮って、家に帰ってからスマホケースを外して動画転送…的な流れでやってます。

なので、一日が終わるまでどんな映像が撮れてるかは、まったくわかりません。その場でリテイクとか凝ったことをできるカメラではないです。

保護ケース等を買わないと使いづらい

公式の付属品が全体的にクソです。

本体も脆く、広角レンズも飛び出てるので、ケチらないでサードパーティの保護ケースも一緒に買ったほうが良いです。

購入後のレビューも参考にしてください(しつこい)。

dungeonneko.hatenablog.com

まとめ

Insta360 GO は何を与えてくれたのか。

それは、現実世界での一人称視点共有体験だと思います。

自分が何かをしているとき、スマホをポケットから取り出して、カメラを起動して、ボタンを押して、手で持って撮影する?そんなことはできない。

日常の中で、アクションカメラを身に付けてウロウロ?それもできない。

「でも今、私はこんなに楽しい体験をしてるんだ!みんなにも知ってほしい!」

Insta360 GOはそういう希望を叶えてくれるデバイスでした。

まだまだ、完璧には程遠いですが。

休日出掛けたくなる。新しい事を試したくなる。他人に共有したくなる。 というのが Insta360 GO の本当の魅力じゃないでしょうか。

そういえば、ウェアラブルの塚本教授って最近テレビで見ないなぁ。

現時点での結論:興味があったら買って、いらなくなったら売ればいいじゃない

★★★★☆

QLineEditでEnter(Return)押したとき、フォーカスが勝手に移動してしまうのを防ぐ

何故かデフォルトの挙動ではフォーカスが他の場所に移動してしまう現象が発生したため、ラップして解決。

class MyLineEdit(QLineEdit):
    def __init__(self):
        super().__init__()

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Return:
            self.editFinished.emit()  # 編集終了シグナルを読んでおいたほうが良い
            return QWidget.keyPressEvent(self, event)  # widgetのkeyPressEventを呼ぶことにする
        return super().keyPressEvent(event)

QLineEditのCtrl+Zを無効化する

eventFilterをいれれば解決できるようだが、eventLoopで毎回呼ばれるのか、パフォーマンスプロファイラ―などを使って調べてみるとこいつが上位に来るようになってしまう。必要なときだけ呼ばれるeventFilterようなものがあれば良いが、現在調査中。

class MyLineEdit(QLineEdit):
    def __init__(self):
        super().__init__()
        self.installEventFilter(self)

    def eventFilter(self, watched, event) -> bool:
        if event.type() == QEvent.ShortcutOverride:
            if event.key() == Qt.Key_Z:
                return True
        return False

QDialogを継承したダイアログ作成

QDialogButtonBoxを使うようにするとAccept, Rejectを使って直感的にDialogクラスとやりとりできるし、キーを押したときの挙動も統一できる(Enter押すとAcceptとか)。

class MyDialog(QDialog):
  def __init__():
    super().__init__()
    buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
    buttons.accepted.connect(self.accept)
    buttons.rejected.connect(self.reject)
    lo = QVboxLayout()
    lo.addWidget(buttons)
    self.setLayout(lo)

diag = MyDialog()
diag.exec_()
if diag.result() == QDialog.Accepted:
  print('ok')
else:
  print('cancel')