tmytのらくがき

個人の日記レベルです

スマホ同期 あらため、電話リンク

WindowsAndroidを接続して通知とかが見られるようになる、スマホ同期(英語だとYour Phone)がWindows 11になってもうちょっと便利になったよ。というのは見ていたけど一回も使ったことなかったので使ってみたら結構おもしろいし便利だったし、実装も面白い感じだったのでまとめておきます。

そもそも何

WindowsからAndroidに接続して通知がみれる、SMSの送受信ができる。一部の機種では画面の転送とか電話の発着信もできる。

一部の機種というのは、ここに書いてあって、 Surface Duoシリーズと、Galaxyシリーズだけ。GalaxyなのはSamsungとがんばって作ってますよ、ということだから。

さらに、最新の機能を使うにはGalaxyの最近の機種か、Surface Duo 2じゃないとだめ。そうSurface Duo 2を買ったから試そうと思ったのでした。

画面転送

画面転送がアプリ単位でできます。これがわりと便利でおもしろい。

例えば、Panasonicのシーリングを操作してみたり f:id:tmyt:20220406221535p:plain

プリコネグランドマスターズをプレイしたり f:id:tmyt:20220406221723p:plain

ToDoを書き込んでおいたり

f:id:tmyt:20220406221801p:plain

というのが、Windows上から同時に起動できます

f:id:tmyt:20220406222127p:plain

Google Chat入れてないなってPlayストアからインストール中の図 f:id:tmyt:20220406222344p:plain

アプリはWindows側から起動できて、電話リンクにアプリ一覧が出てきます。

f:id:tmyt:20220406222722p:plain

ここから選ぶと、アプリが立ち上がって専用のウィンドウとして表示される。さらにこのアプリはスタートメニューとタスクバーに登録ができる(!!)

f:id:tmyt:20220406222824p:plain

タスクバーにもちゃんとAndroid側のアイコンで表示される(!!)めっちゃすごい…すごいがんばって実装されている…

f:id:tmyt:20220406222851p:plain

使ってみた感想

たくさん開くとだめらしいです。Surface Duo 2では7個?が上限らしい。

f:id:tmyt:20220406223400p:plain

ゲームが快適に遊べるほどのフレームレートでは転送されてこないです。プリグラぐらいなら遊べた。

気になるのがどうやって実装されているのかな。というところ。わかる範囲で挙動をみてみたところ、アプリごとのセカンダリディスプレイが起動しているようです。

display?.displayId?.toString() // とかすると、20以上の値がGetできる

なので、サポートされてる機種じゃないとアプリ単位での転送ができないってことらしいです。

アプリごとのディスプレイを作ってるので、Windows側から比較的柔軟に制御できるのかーかしこいなー、なんて。

メールがみれたりしてちょっと便利なのと、Androidでしか動かないアプリを起動できてちょっと便利なぐらいでたいていはWindowsでもできるので劇的にこれが便利!!!ってことはないかもしれない。ただ知っておくとたぶんすごく便利。

あと、接続中はすごい速度で電池が減っていくのでいらないときは通知パネルからOffにしておくとなおよし。

f:id:tmyt:20220406232551p:plain

スマホ同期 あらため、電話リンク

WindowsAndroidを接続して通知とかが見られるようになる、スマホ同期(英語だとYour Phone)がWindows 11になってもうちょっと便利になったよ。というのは見ていたけど一回も使ったことなかったので使ってみたら結構おもしろいし便利だったし、実装も面白い感じだったのでまとめておきます。

そもそも何

WindowsからAndroidに接続して通知がみれる、SMSの送受信ができる。一部の機種では画面の転送とか電話の発着信もできる。

一部の機種というのは、ここに書いてあって、 Surface Duoシリーズと、Galaxyシリーズだけ。GalaxyなのはSamsungとがんばって作ってますよ、ということだから。

さらに、最新の機能を使うにはGalaxyの最近の機種か、Surface Duo 2じゃないとだめ。そうSurface Duo 2を買ったから試そうと思ったのでした。

画面転送

画面転送がアプリ単位でできます。これがわりと便利でおもしろい。

例えば、Panasonicのシーリングを操作してみたり f:id:tmyt:20220406221535p:plain

プリコネグランドマスターズをプレイしたり f:id:tmyt:20220406221723p:plain

ToDoを書き込んでおいたり

f:id:tmyt:20220406221801p:plain

というのが、Windows上から同時に起動できます

f:id:tmyt:20220406222127p:plain

Google Chat入れてないなってPlayストアからインストール中の図 f:id:tmyt:20220406222344p:plain

アプリはWindows側から起動できて、電話リンクにアプリ一覧が出てきます。

f:id:tmyt:20220406222722p:plain

ここから選ぶと、アプリが立ち上がって専用のウィンドウとして表示される。さらにこのアプリはスタートメニューとタスクバーに登録ができる(!!)

f:id:tmyt:20220406222824p:plain

タスクバーにもちゃんとAndroid側のアイコンで表示される(!!)めっちゃすごい…すごいがんばって実装されている…

f:id:tmyt:20220406222851p:plain

使ってみた感想

たくさん開くとだめらしいです。Surface Duo 2では7個?が上限らしい。

f:id:tmyt:20220406223400p:plain

ゲームが快適に遊べるほどのフレームレートでは転送されてこないです。プリグラぐらいなら遊べた。

気になるのがどうやって実装されているのかな。というところ。わかる範囲で挙動をみてみたところ、アプリごとのセカンダリディスプレイが起動しているようです。

display?.displayId?.toString() // とかすると、20以上の値がGetできる

なので、サポートされてる機種じゃないとアプリ単位での転送ができないってことらしいです。

アプリごとのディスプレイを作ってるので、Windows側から比較的柔軟に制御できるのかーかしこいなー、なんて。

Surface Duo 2を買いました

Surface Duo 2が日本国内で発売が始まって2か月半ぐらいが経ちました。突然思い立ってSurface Duo 2を買ったのでした。

初代Surface Duoと比べるとこんな感じ。左が2、右が1。

上下ベゼルが少し狭くなって画面の縦幅が少し大きくなりました。ヒンジ側のベゼルも少し小さくなってますね。全体的によくなったと思います。

f:id:tmyt:20220330141722p:plain

初代と比べて

よくなったところ

  • ディスプレイが90Hzになった
  • 指紋センサが電源ボタンと統合された
  • フラッシュライトが背面に移設された
  • NFCがついた
  • 背面にカメラがついた
  • 工作精度があがった
  • SD888速い
  • 開け閉めのフィーリングがよくなった
  • 閉じたときに若干楔形になるようになって保護シート貼ってもちゃんと閉まるようになった(気がする)
  • 5Gは…まぁあればうれしいかな…

いまいちなところ

  • カメラがダサい…
  • ちょっと高い

まとめ

よくなったところは書いてある通りで、とてもよくなりました。ディスプレイは滑らかだし、電源と指紋センサの位置がバラバラでいまいちとか思わなくなったし*1

NFC搭載はVISAタッチがGoogle Payで使えるようになったので*2、ついにSurface Duoだけでも決済できるようになったか!というインパクトがありとてもいいです。実際に何回かコンビニで使ってますが、画面を開かなくても電源ボタンを押して指紋認証だけ通してしまえば決済できるのでとても便利でした。

フラッシュライトが外側についたので、誤ってフラッシュライトをONにして目つぶしを食らわなくなったのも大きいです。

一方で、外側にカメラが付いたのはまぁいい感じなんですが、3眼のそこそこなカメラが付いたので見た目がやばいですね…開いて裏返すとこんな感じに…

f:id:tmyt:20220330142718p:plain

Surface Duo 2って結構薄い*3のでディスプレイモジュールの裏にさらにカメラモジュール載せるとこの厚さ*4にしかならなかったんだよ。と言われればそうかもしれない。けどおさめてほしかったなぁという気持ち。

カメラ部分が上部だけなので、完全に開いたときに下側に空間があるのでちょっと力をかけると曲がってしまう、もしかしたら割れるんじゃないかみたいな怖さがあります。

Duo 1のころは、画面を外に折り返したままポケットに突っ込むみたいなこともしばしばあったのですが、さすがにこの状態だと不意に力がかかって画面われそう…となるのでちゃんと閉めるようになりました。もしSurface Duo 3が出るのであればぜひカメラは収まるようにしていただきたいですね。

*1:最初指紋センサだった場所に触って動かんな。みたいなのをよくやりました

*2:https://www.smbc-card.com/brand/googlepay_visa/index.html

*3:5.5mm

*4:カメラが楔形になってるので最薄部で約8mm

Cloudflare WorkersでTwitter通知を作った

いままでIFTTTを使ってTwitterからDiscordへ通知していたのだけれど、Discordへの反映がとても遅い。最大1時間遅れでやってくる。しかも最近は3個までしか登録させてくれない。

そんな時にCloudflareを眺めていたらWorkersはスケジュール実行できますよ、と書いていたのでささっと通知するスクリプトを書いてみた。

gist.github.com

  • 環境変数のAPP_TOKENにTwitterのBearerトークンを入れる。
  • KeyValueを作って、KVという名前で登録する。
  • KyeValueに3つの値を入れる
キー
SID_{screenname} 0
UID_{screenname} ユーザの数値ID
WEBHOOK_{screenname} DiscrodのWebhookURL

これを設定してCronで1分にしておけばOK。毎分Twitterをクロールして更新があったらDiscordに素早く通知がくるようになりました。

Cloudflare Workers

こんな使い方をしていても今のところ無料。無料枠だと、1日に10万リクエストしか使えない。ということになっているのだけれど、どうやらこれはHTTPハンドラが呼び出された回数しかカウントされていないみたい。

今回みたいにスケジュール実行しか使ってないとカウントもされていなさそう*1だし、1回の実行が10ms*2を超えなければ何やっても大丈夫*3。AzureとかGCPとか使うより確実に安いし早いし楽だしこれはいい…

*1:少なくともリクエスト回数見てる限りそういうカウントがされていそう

*2:ただしこの10msにはI/Oをawaitしている時間は含まれていないので実際のところ案外長く実行できる

*3:たぶん

どうやらこれは自作キーボードというカテゴリらしい

自作キーボードというほどではないのだけど、yonkeyというのをちょっと前に作った。テンキーの右下をちぎったのでyonkey。

f:id:tmyt:20210624040704p:plain

テンキーの 0 と Enterが欲しかっただけで、後の2個はおまけ。何に使うのかというと、FF14のタイトル画面でテンキーの0を連打するためにある*1

スイッチもそれぞれがGPIOに直結されている素朴な実装。自作キーボードというにはおこがましいこのyonkeyは、コントローラはSeeeduino Xiaoで、ファームウェアArduinoで手書き。

そんなyonkeyを作って満足してたところでこんなん作ろうよーって言われたのでとりあえず作ってみようの会

ふむなるほど、なるほど…ってKiCad起動して回路図書いて、ちょこちょこ配線して、ときどきFreeroutingでさぼって…シリコンハウスで売ってる部品からフットプリント選んで…寝て起きて見直したらダイオードの向き逆なことに気付いて…FusionPCBで製造して…そんなこんなでできたのがこれ!!名前はtarteletteっていうそうです。

f:id:tmyt:20210624042346p:plain

コントローラはSeeeduino Xiao、Kailhのソケットでスイッチを接続、SK6812MINI-Eが7個乗せられる感じに仕上がりました。それではさっそく部品を実装して…

f:id:tmyt:20210624042814p:plain

事前に準備していたアクリル板を合体させてスイッチをはめて…ファームを書いてできたのがこれ!

f:id:tmyt:20210624042914p:plain

めっちゃ光る!!!!

f:id:tmyt:20210624042933p:plain

まだ6枚も残ってるけど使い道はもうない…

f:id:tmyt:20210624043643p:plain

*1:テンキーの0がOKボタン

GitHubからAzureにCDするのが一瞬でできて感動したというだけの話

GitHubからASP.NET CoreなアプリケーションをAzure Web Appにデプロイするのにビルドとか面倒だなと思っていたら、Azure Portalから一瞬で設定ができて感動した。

  1. 左のメニューから”デプロイ センター”を選ぶ
  2. 右の画面から”設定”を開く
  3. ソースを ”GitHub”にする
  4. ”承認”みたいなボタンが出るので、押してGitHubでログインする
  5. 組織、リポジトリ、ブランチを順番にたどってデプロイしたいリポジトリを選ぶ
  6. ビルドは各自いい感じにする
  7. ”保存”を押す

f:id:tmyt:20210210054209p:plain

これでおわり。自動でGitHub Actionsの設定がリポジトリにコミットされて、自動でビルドからデプロイまでが実行される。

f:id:tmyt:20210210053845p:plain

一瞬で設定できてすごいね。というだけの話。

Surface PenのボタンでSurface Duoのスクリーンショットを撮る

Surface PenはSurface Duoからはキーボードに見えていて、短押しと長押しでそれぞれ特定のスキャンコードを出力するので、Surface Penに設定されているキーレイアウトをカスタムしてPrintScreen*1に割り当てましょう。という話です。

スキャンコードに対応するキーコードを入れ替える

今回は短推しで出力されるキーコード"291"を"SYSRQ"に入れ替えることを目標にします。

Androidに接続されているキーボードは、設定の物理キーボードのレイアウト設定*2で変更できます。しかも、ここのレイアウトはAPKで後から追加できます。じゃぁ作るしかない。

キーボードレイアウトを追加するAPKは、キーキャラクタマップ(KCM)をはじめとしていくつかのファイルが必要です。といっても大したことはないのでAndroidのソースツリーにあるやつをコピペして使うのでほぼ問題ないです。

具体的には、キャラクタマップ、キーレイアウトXML、BroadcastReceiverと、AndroidManifestです。ほかはローカライズで使ってたりするだけなので不要。しいて言えばアイコンぐらいはいるかもしれない。

キャラクタマップの書き方がわからない

書き方は、SDKドキュメントに書いてます。

書いてますがたいして参考になりません。今回みたいな文字を出力しないキーのことはさっぱりわからないのでこのファイルを解釈しているソースを読みます。

このファイルを読んでいくとパーサーの実装が見つかります。

String8 keywordToken = mTokenizer->nextToken(WHITESPACE);
if (keywordToken == "type") {
    mTokenizer->skipDelimiters(WHITESPACE);
    status_t status = parseType();
    if (status) return status;
} else if (keywordToken == "map") {
    mTokenizer->skipDelimiters(WHITESPACE);
    status_t status = parseMap();
    if (status) return status;
} else if (keywordToken == "key") {
    mTokenizer->skipDelimiters(WHITESPACE);
    status_t status = parseKey();
    if (status) return status;
} else {

行頭に現れる値は type, map, key の3種類だそうです。typeの引数は次の6種類があるようです。

  • NUMERIC
  • PREDICTIVE
  • ALPHA
  • FULL
  • SPECIAL_FUNCTION
  • OVERLAY

このtypeOVERLAYにしておくのがいいらしいです。

次に、map。これは次のような構文らしいです。

map key usage {usage code} {key code}
map key {scan code} {key code}

usageが付くパターンは、HIDのUsageを指定するそうですがよくわかりません。ここに

上位の 16 ビットで HID 使用状況ページを、下位の 16 ビットで HID 使用状況 ID を示します。

と書いてあるけれどもそれがどう動くのかはよくわからんやつです。

今回やりたいのはusageが付かない2個目のほう。これを使うと任意のスキャンコードを任意のキーコードに書き換えられます。 たとえばCapslockを左Ctrlに置き換えるとかもこれでできますね。

一番後ろのkey codeはキーコードの名前を指定するとよさそうです。この時指定できる名前は、InputEventLabels.hに定義されてます。

ここを見れば一覧が書いてます。KEYCODE_ってつかないタイプのキーの名前を書けばいい感じですね。

残った、key、これはドキュメントに書いてあるので読んでください。

キャラクタマップを書く

書き方さえわかれば後は簡単。

type OVERLAY
map key 190 SYSRQ

これでおわり。あとはXMLとか用意してAPKにすれば、Surface Penの後ろのボタンでスクリーンショットが取れます。ただ30秒で切断されて反応しなくなるのであんまり役には立たないですね。

今回のソースコードはこちら。

*1:内部的にはSYSRQ

*2:場所は端末によってまちまち、だいたい言語設定の近く