[備忘録]XP Penが認識されない問題への対応:UEFIセットアップを経由した起動で解消

環境

  • Surface Pro 6 ( Windows 11 Home )
  • XP Pen Artist 12 3rd

結論

UEFIセットアップ画面を起動し、何も変更せずそのまま終了することで、外部ディスプレイを認識するようになった。 原因は不明なまま。

通常のシャットダウンや再起動との違いが何なのかはわかっていないが、過去にも同じ手順で解決しており、再現性は確認済み。

現象

XP Pen Artist 12 3rdをPC(Surface)に接続しても、ディスプレイとして認識されない。 接続した際は「接続された」「切断された」の通知音のみが鳴って、その後XPPen側でNo Signalと表示される。 通常であれば、ディスプレイを認識したことを示すアニメーションも発生するが、そのアニメーションも表示されない。

試したこと(すべてNG)

検索してすぐに出てくるような対処法は一通り試したが、いずれも効果はなかった。

  1. ドライバの再インストール
    アンインストール後にクリーンインストールしたが、効果なし
  2. HDMIポートの変更
    Surface Pro 6にはHDMIポートは1つしかないので、関係なし
  3. ケーブルの接続順序を変える
    効果なし
  4. 給電元を変更する(電力不足)
    効果なし

解決した方法

  1. PCをシャットダウンする
  2. 「音量を上げる(+)」ボタンを押しながら電源を押す(UEFIを起動する)
  3. 設定はなにも変えずに終了する(Exit)
  4. Windows起動、ログイン後、XP Pen アプリケーションの起動を待って、XP Pen を接続する

さいごに

根本原因は結局わからないまま。 XP Pen側の問題ではなく、Surface Pro 6、もしくはWindows11の問題である可能性もある(ほかのディスプレイでも発生するかもしれない)。

UEFI起動という発想に至ったのは、Redditのあるスレッドのおかげだったんだけども、見たのは数か月前であり、リンクも残していないので、どれだったかは思い出せない。 また見つけたら追記しようと思う。

VSCodeで動的スニペットを書く

議事録を書いていて*1日付とか時間とか、記号抜きでチャチャッと打ちたいな~と思って、動的なスニペットとかできんだろうかと調べてみたら、あった。

https://marketplace.visualstudio.com/items?itemName=draivin.hsnips

わーい

導入して、ドキュメントを読みながら下記を実装

global
function addWeekday(y,m,d) {
    y = y ?? new Date().getDay();
    if (isNaN(new Date(`${y}-${m}-${d}`).getTime())) {
        return ;
    }
    const wd = new Date(`${y}-${m}-${d}`).getDay();
    switch (wd) {
        case 0: return '(日)';
        case 1: return '(月)';
        case 2: return '(火)';
        case 3: return '(水)';
        case 4: return '(木)';
        case 5: return '(金)';
        case 6: return '(土)';
        default: return '';
    }
}
endglobal

snippet `(\d{4})(\d{2})(\d{2})` "date format with year" W
``rv = m[1] + '/' + m[2] + '/' + m[3] + addWeekday(m[1],m[2],m[3])``
endsnippet

snippet `d(\d{2})(\d{2})` "date format"
``rv = m[1] + '/' + m[2] + addWeekday(null,m[1],m[2])``
endsnippet

snippet `t(\d{2})(\d{2})` "time format"
``rv = m[1] + ':' + m[2] ``
endsnippet

これで、d100010/01(月)に、t150015:00にチャっと変換することが出来るようになった。
テンキーだけだと「:」が打ちにくいし、曜日も「はて、あの日は……」と考える時間がちょっと勿体ないので、ほんの少しだけど楽になるかなあ。
それにしても、色々考えてる人がいるんだなあ……。

あと、普段はJavaがメインなので、JavaScriptオーバーロードが出来ないことを初めて知った。 Maximum call stack size exceededというエラーが出て、調べてみたらそういうことらしい。 また一つ賢くなれたね(???)

*1:議事録の下書きくらいAIに書かせればいいのかもしれないが…

眠気覚ましに『文章を書こう』と思い立ってChatGPTに相談した

※正確にはChatGPTではなくClaude.ai。

眠気覚ましのために、何か文章を書くのがよい、というのを見た。
文章を考えたり、何かを書くことは嫌いではない(上手くはない)のだけど、「何を書こう」というところを考えるスキルが無い。
基本的にテーマとか考えるのは苦手だけど、書き出したら質はともかくある程度の量を書き溜めることは出来そうなので、一番大変なところを生成AIに頼むことにした。

教えてClaude

そんなたいそうな生活は送っていないので、私生活で生成AIを使う場面なんてないのだが、それでも一応メインではAnthropic社のClaude.aiを使用している。今回もそうした。

眠気覚ましのためには、とにかく文字を書く(=文章を書く)ことがよいと聞きました。
ただ、突然「文章を書け」と言われてもすぐにはテーマや内容が浮かんできません。
何か文章を書くにあたって、ちょうどいいお題を出してもらえませんか。
ビジネス向け、20案程度。
## プロフィール
xx歳、男、既婚、共働き
生家はyy県zz市。出身校はAA大学大学院。※学歴詐称。リコール。
職業はプログラマ(システムエンジニア)、JavaとOutSystemsのWebアプリ設計・開発・運用・保守が主な業務。趣味ではJavaScriptをやりたいが、なかなかできていない。
趣味は楽器演奏(18年以上)。昔は本も読んでいたが、最近は読む時間がない。
その一方で、洋裁と製菓が新たな趣味に加わりそう。
通勤は自転車で、日々の移動は自動車で。

自分の頭の中に出てきたものをさっと書きたいので、自分の属性を書いておく。
本当は箇条書きの方がいいんだろうけど、変に書くのも面倒くさかったので、とりあえず思いつく限り書いたつもり。

これだけ書いて送ってみると、次のような回答が返ってきた。

眠気覚ましに文章を書くのは良いアイデアですね。あなたのプロフィールを参考に、ビジネス向けの文章のお題を20個ご提案します:

## システム開発・技術関連
1. **「レガシーシステムをモダン化する際の課題と解決策」** - 実務経験を活かした具体的な提案
2. **「OutSystemsとJavaの使い分けについて考える」** - それぞれの特徴と適用場面
3. **「プログラマが知っておくべきユーザビリティの基本原則」** - 開発者視点でのUI/UX
4. **「システム運用・保守で重要な3つのポイント」** - 長期的な視点での品質管理
5. **「チーム開発における効率的なコードレビューの進め方」** - 協働の質を上げる方法

## 働き方・キャリア
6. **「地方出身エンジニアが感じる東京IT業界のメリット・デメリット」** - yy出身の視点で
7. **「xx歳エンジニアが考える今後のキャリア戦略」** - 年齢と経験を踏まえた展望
8. **「共働き夫婦における効率的な家事分担システム」** - システム思考を日常に応用
9. **「AA出身者が IT業界で活かせる強みとは」** - 独自の教育背景から得た視点
10. **「リモートワークとオフィスワークの最適なバランス」** - 働き方の選択について

## 趣味・ライフスタイル
11. **「楽器演奏18年で学んだ継続の技術をビジネスに応用する」** - 長期継続の秘訣
12. **「エンジニアが新しい趣味(洋裁・製菓)を始める理由と効果」** - 創造性と仕事への影響
13. **「自転車通勤のメリットと持続可能な交通手段について」** - 環境と健康の両面から
14. **「忙しい社会人が読書時間を確保する工夫」** - 時間管理のテクニック

## ビジネス・社会課題
15. **「デジタル化が地方経済に与える影響と可能性」** - 出身地の視点を交えて
16. **「中小企業におけるDX推進の現実的なアプローチ」** - 実務経験からの提案
17. **「夫婦共働きが当たり前になった時代の企業制度」** - 働き方改革への提言
18. **「技術者が考える持続可能な社会とIT技術の役割」** - 環境問題と技術の関係
19. **「地方と都市部の人材格差を埋めるリモートワーク活用法」** - 地域活性化の観点
20. **「xx代で始める新しいスキル習得のための時間投資戦略」** - 効率的な学習方法

どのお題も500-1000字程度で書けば良い文章になりそうです。特に興味を持ったものがあれば、さらに具体的なアプローチもお教えできますよ。

カ、カッコイイ!

言うてる場合か。ちょっと真面目なテーマがほしいなという思いだけで「ビジネス向けで」と書いたら、意識高い系ビジネス誌のテーマにありそうなものがずらっと出てきてびっくりした。
こういうの書けたら書けたらかっこいいんですけどね。私にはちょっとハードルが高すぎるかな。

お手柔らかにお願いします

こんなかっこいいテーマでは雑に10分で書けるわけがない。
眠気覚ましのための適当な書き散らしなので、もっと肩の力を抜いていこう。

ぼく:> 思った以上に実用的でビジネス的な(雑に言うと「ガチ」な)案が出てきてびっくりしています。もっとフランクに、適当なブログに書きなぐれるようなテーマを下さい
あ、すみません!確かに真面目すぎましたね。もっと気軽に書けるフランクなお題を20個出し直しますね:

## 日常あるある系
1. **「プログラマあるある:変数名に悩む時間が実装時間より長い件」**
2. **「yy出身者が東京で『うどん論争』に巻き込まれた話」**
3. **「妻に『今日何食べる?』と聞かれて『何でもいい』と答えてはいけない理由」**
4. **「自転車通勤で遭遇する『あいつ今日もいるな』な人たち」**
5. **「楽器を18年続けてるのに未だに『何か弾いて』が苦手な話」**

## 趣味・プライベート系
6. **「yy歳男性が洋裁を始めると周りの反応はこうなる」**
7. **「お菓子作りにハマったエンジニアが『材料の分量』に異常にこだわる件」**
8. **「昔よく読んでた本を久々に開いたら全然覚えてなかった衝撃」**
9. **「AA時代の友達と久々に会うと必ず出る『あの先生元気かな』話」**
10. **「共働き夫婦の『今日疲れた』バトルの攻防戦」**

## 仕事ネタ(ゆるめ)
11. **「『JavaScriptやりたい』と言い続けて早○年、未だに手つかずな件」**
12. **「OutSystems使ってると言うと『それ何?』から始まる長い説明」**
13. **「システム障害が起きた時の『とりあえずリブート』の威力」**
14. **「『簡単な修正です』という言葉を信じてはいけない理由」**
15. **「リモート会議で『聞こえてますか?』から始まる儀式」**

## どうでもいいけど気になること系
16. **「コンビニの新商品を試したくなる心理を分析してみた」**
17. **「車の運転中に思いついたアイデアを忘れない方法を本気で考える」**
18. **「『最近運動不足だな』と思いながら今日もエレベーターに乗る」**
19. **「妻と二人暮らしなのに冷蔵庫の中身が謎に増えていく現象」**
20. **「『今度○○しよう』の『今度』は永遠に来ないという説」**

これくらいなら気軽にダラダラ書けそうでしょうか?

「ちょっと読んでみたいかも」という気持ちになりそうなテーマをいくつか出してくれた。
流石にダラダラ書くつもりはないんですけどね。

とは言え、テーマを決めるのが苦手、文章を書くのも得意ではない自分にとって、ここまで簡単にテーマ案が出せるのは本当に助かる。

中でも次の6個は、クスっときて「ちょっと読んでみたい」という気持ちにさせられた。なかなかうまいタイトルを考えるものである。私ではこうはならないね。

1. プログラマあるある:変数名に悩む時間が実装時間より長い件
2. 自転車通勤で遭遇する『あいつ今日もいるな』な人たち
3. OutSystems使ってると言うと『それ何?』から始まる長い説明
4. 『簡単な修正です』という言葉を信じてはいけない理由
5. リモート会議で『聞こえてますか?』から始まる儀式
6. 車の運転中に思いついたアイデアを忘れない方法を本気で考える

『自転車通勤で遭遇する『あいつ今日もいるな』な人たち』これ、書く人によっては相当面白そう。通勤中にいつも見かける人なんてそうそういないんですけどね。
次眠くなったら、この中のどれかをテーマにして何か書いてみようかな。

おしまい

書けそうです。
上記のテーマは適度に使わせていただきます。
その上で例えば、今回のチャットで「眠気覚ましで文章を書きたかった」ことで書こうと思ったら、どんなテーマが面白そうですか
今回のやり取りを元にしたテーマなら、こんな感じはどうでしょう:
メタ的な面白さがあるもの

1. 「眠気覚ましに『文章を書こう』と思い立ったxx歳エンジニアがChatGPTに相談した結果」
(略)

個人的には1番目の「AIに相談した結果」が一番書きやすそうかなと思います。実際の体験談だし、「最初真面目すぎて『もっとフランクに!』って言い直した」という展開も面白いオチになりそうです。
リアルタイムで起きてることを題材にするのって、意外と書きやすいんですよね。

そうだね、うまいオチはつけられなかったけどね。

DBeaverからRenderのPostgreSQLに接続

ちょっと悩んだのでメモ。

結論

接続情報のURLは「PostgreSQL JDBCのURLの形式に合わせて、外部接続用のURLをいじりましょう」ということ(だと思った)。
素直なコピペじゃダメらしいですね。

経緯

ちょっと遊んでみようと思って、RenderのフリープランでPostgreSQLサーバを立てた。
クライアントソフトはDBeaverがお気に入りなので、それを使って操作が出来るようにしておこうと思った。

しかしPostgreSQLの名前くらいしか知らなかった私は、ただ接続するだけのところで躓いたのであった。

やったこと

RenderのPostgreSQLに外部から接続する場合、External Database URLでつなぐ必要があるらしい。 このURLの形式は、Renderのドキュメントによるとpostgres://USER:PASSWORD@EXTERNAL_HOST:PORT/DATABASEとのこと。

素直なので、接続設定のところにそのままコピペ。

すると、JDBCのURLが正しくないと怒られた(画像は例)

エラーメッセージで素直に検索をすると、PostgreSQLプログラマガイドが出てきたので、そこの記述に従う。 www.postgresql.jp

JDBC を使用する場合、データベースは URL(Uniform Resource Locator)で表されます。Postgres では、これは下の形式のどれか1つになります。
- jdbc:postgresql:database
- jdbc:postgresql://host/database
- jdbc:postgresql://host:port/database

この形式に合わせて、先ほどコピペしていたURLを加工する。

jdbc:postgresql://EXTERNAL_HOST:PORT/DATABASE

ユーザー名とパスワードがURLから消えたものの、すぐ下に入力する欄があるので多分問題なし。

入力したら、テスト接続を押して

問題ないみたいなので「OK」


無事設定完了。

寮食bot不具合:GASトリガー無限発火編

Google Apps ScriptとGoogleスプレッドシートを使って、毎日の献立をツイートするBotを細々と運用中。

2023年第一稼働日の1/10に、予定していたツイートが投稿されないという問題が発生。 色々調べた結果、以下が引き金となったことを確認した。

  1. Googleスプレッドシートにおいて、MM/dd形式の日付は暗黙的にその年のyyyy/MM/ddとなる
  2. トリガーに過去日が設定されていた場合、登録後すぐに実行される
  3. ツイートの実行有無にかかわらず、トリガーを再登録するプログラム

上記1.を解消させることで、とりあえず想定していた動作には戻った。
が、年は毎年明けるので、急ぎではないものの、以下恒久対応も考えておく。

  1. 献立日付欄の書式を、明示的に「yyyy/MM/dd」に変更する(執筆時点で済)
  2. 過去日でトリガーを作らないように制御する
    何らかのエラーやメッセージなど、自分あてにDMを送って気づきやすくするのも考えておく
  3. トリガーの実行時に、同名でのトリガーを削除する処理を追加する
    「トリガーが多すぎます」エラーの回避策。
    無限発火編が始まると止まらないので、慎重に考慮する。

== 以後は詳細 ==

MM/dd形式のルールによるもの

GoogleスプレッドシートExcelでも)のルールとして、MM/dd等で日付を入力した場合、現在の年の日付が自動でセットされる(周知のもの)。

献立表を登録する際、2022年12月のことだが、「1/10」と単純に登録してしまっていたものと考えられる。 その後の日付は、オートフィルでパパパっと作ってしまったため、「2022/01/10」に続く日付が入力されていた。

日付欄の書式が「短い日付」となっていて、気づきにくくなっていたため、書式を「yyyy/MM/dd」に指定することで、間違いに気づきやすくなるよう対応した。

トリガーに過去日が設定されていた場合、登録後すぐに実行される

Google Apps Scriptのトリガーの仕様だと思うが、時間指定型で過去日を指定した場合、登録された直後に実行されてしまう。

この仕様と、後述するプログラムの不具合によって、連続してトリガーが実行されるという結果になったのだと考えられる。

プログラムで「過去日の場合は設定しないようにする」など、過去日の場合を考慮した処理にする必要がある。

プログラムの不具合

不具合、というよりは、考慮不足?

献立を投稿するときのプログラムのフローはだいたいこんな感じになっている。

献立投稿機能のフロー

読み込んだ献立が過去日だった場合、献立ツイートをせずに、過去日で新しいトリガーをセットする、という流れになってしまっている。

このフローと過去日の設定にしていた結果、今回の現象が発生。GASの実行ログは下図のようになってしまっていた。

GAS 実行ログ

ちなみに、トリガーが一定数以上あると「トリガーの数が多すぎる。いい加減にしろ」と怒られるので、どこかしらでは止められる。

トリガーが多すぎる場合のエラー

Exception: このスクリプトに含まれているトリガーの数が多すぎます。さらに追加するには、スクリプトからトリガーを削除する必要があります。

JSF f:convertNumberの丸め処理

`f:convertnumber`は`pattern`属性で指定したフォーマットに従って数値を変換してくれるコンバータ。

value=127, pattern="0000" => 0127

ここでvalueに小数が含まれている場合、f:convertNumberは「偶数丸め(HALF_EVEN)」をする模様。

value=12.49, pattern="0000" => 0012
value=12.50, pattern="0000" => 0012
value=12.51, pattern="0000" => 0013

今回のケースでは「四捨五入」をしてほしかったが、標準のコンバータでは対応不可能らしい。
どうしてもコンバータで変換をかけたい場合は、カスタムコンバータを用意して対応するしかなさそうな印象。


今回はカスタムコンバータを作る時間は無く、そこまでやるような状況でもなかったのもあり、Bean/Valueでよしなに対応した。

冷凍豚肉で超雑に作る豚肉の生姜焼き

お昼休みにいつも作っているメニューの一つ。
備忘録として。

材料(1人分)

  • 冷凍豚小間 100gくらい
    普通の豚肉でも可。その日の気分で食べたいだけ入れてるので、分量は適当。
  • 玉ねぎ 1/4個
  • 調味料
    • 砂糖 小さじ1程度(※お好み)
    • みりん 大さじ1.5
    • 醤油 大さじ1
  • ショウガ 適量
    みじん切り、またはチューブのおろしショウガを使用する。
    個人の好みがあるので、ここも好きな量入れるとよい。

※砂糖を入れてもいいけれど、焦げやすくなるため注意が必要。

作り方

  1. 玉ねぎを薄切り(好み)にする
    くし切りなどでも可。各々のイメージで切り刻む。
  2. フライパンに冷凍豚肉と玉ねぎを入れ、塩こしょうを振って炒める
    普通の豚肉の場合はサラダ油など、環境に合わせて適宜追加する。
    evercookのフライパンは超優秀なので、油がいらない。
  3. 肉の色が変わったら調味料とショウガを入れる
    辛くないものから入れてなじませるといいらしい。醤油が最後。
  4. 玉ねぎがしんなりするまで炒める
    玉ねぎのしんなり度はお好みで。
  5. 好みの付け合わせとともにお皿に盛り付けて完成
    キャベツの千切りとかをお好みで。特に画像とかはない。