tmytのらくがき

個人の日記レベルです

TaskCompletionSource<T>が覚えられない

.NETのSystem.Threading.Tasks空間に、TaskCompletionSource<T>っていうのがあります。

TaskCompletionSource(TResult) クラス (System.Threading.Tasks)

これを使うと、こういうコードが書けます。

public Task Sleep(int milliseconds)
{
    var source = new TaskCompletionSource<bool>();
    var timer = new Timer(_ =>
    {
        source.SetResult(true);
    }, null, milliseconds, Timeout.Infinite);
    return source.Task;
}

このコードは、実際はTask.Delayと書けばいいので特に意味はないですが、外からTaskをCompleteできる便利なやつです。

最近のECMAScriptだとこう書けるあれです。

function sleep(millis)
{
    return new Promise(done => {
      setTimeout(done, millis);
    });
}

普段使わないけど、1年に1回ぐらい使うことがあって思い出せないのでメモです。

Chrome TimelineのFirefox版を作っておきました

Chrome Timelineを見たひとが、Firefox版ほしいって言ってるを見かけたのでとりあえず作ってみました。

本当は、名前も”Firefox Timeline”にしようと思ったんです。そしたらデベロッパーポリシーに"Firefoxという名前をアドオンに含める場合は「** for Firefox」という表現を使用すること”とあったので、”Timeline for Firefox”になっていますが、中身は一緒です。

最近はChrome Extensionが標準化されてWeb Extensionとして動作するのでほとんどコード修正せずに動くのは楽ちんですね。

Timeline for Firefox – Firefox 向けアドオン

WSLで32bitなELFが動いた(ただしQEMU)

TL;DR

  • binfmtとQEMUで32bitなELFを実行する
  • WSLのbinfmtはOCフラグがサポートされてない
  • sudo update-binfmts --install qemu-i386 /usr/bin/qemu-i386-static --magic '\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'

背景

はぁ…WSLにbinfmt_miscなんで実装されないんだろ…と思いながらUserVoiceを眺めていたところ、よくよく調べたらWSL空間からWin32のバイナリを呼び出す仕組みを実現するためにRS2の時点で実装されていたのでした。なんと1年以上前…当時Win32 PEを実行するのにMZヘッダが見つかったら/initに実行を委譲するよ。みたいな記事を読んだはずなのにすっかり忘れていた。

binfmtが使えるならi386 ELFのmaskを設定してやれば動くんじゃないの…と思ったのが6時前。思い立ってしまったら気になって眠れなくなったのでやってみました。

手順

  1. qemu-user-staticをインストール
  2. update-binfmtsでハンドラを登録

まずqemu-user-staticをインストール。

$ sudo apt-get install qemu-user-static

qemu-user-static用のbinfmtが自動登録されるけど、これにi386はない*1のでハンドラ手動登録。

$ sudo update-binfmts --install qemu-i386 /usr/bin/qemu-i386-static --magic '\x7f\x45\x4c\x46\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x03\x00' --mask '\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff'

うじゃうじゃたくさん書いてあるのはELFのヘッダを検出するマジックとマスク。ELFの仕様ともともとあったqemu-user-staticのマジックを眺めながらいい感じにしたらこうなりました。

なぜかこうするとうまく動くようになるんですが、どうやらWSLのbinfmt_miscはOCフラグというのに対応していないらしい。こうやってやるといい感じに動くらしい*2

動作確認

せっかくなので32bit ELFなバイナリを作って実行してみる。

$ sudo apt-get install build-essential libc6-dev-i386
$ vi test.c
#include<stdio.h>

int main(){
  puts("Hello World");
  return 0;
}
$ gcc -m32 test.c
$ file a.out
a.out: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=1e13e8c9bba4368d713095984853243c85b65768, not stripped
$ ./a.out
Hello World

ちなみにupdate-binfmtsしない場合はこうなる。

$ ./a.out
-bash: ./a.out: cannot execute binary file: Exec format error

おまけ

WSLのインスタンスが全部終了するとbinfmtのエントリが消し飛ぶので何らかの方法で復元してください

*1:普通のx86_64ならi386バイナルが直接実行できるので登録する意味がない

*2:https://github.com/Microsoft/WSL/issues/2620#issuecomment-374490404

ChromeからWindows Timelineにアクティビティを登録するアドオンを公開しました

とくになんの下調べもせず、作ったら面白そうなのでつくっただけです。 もしかしたらすでにもっと出来がいいやつがあるかも。

Windows TimelineってのはApril 2018 Updateで追加された新機能で赤丸のところをクリックすると下のほうに出てくるこれです。

f:id:tmyt:20180524234316p:plain

Edge使ってるとここに表示したWebページが追加されていくんですけど、Chromeとかだと当然そういう機能はないので試しに作ってみました。

検索ヒットしないのでURLからどうぞ。

Aristea 2.0.1

新規ダウンロード提供を停止しました。といった次の日に言うのもなんですが、新規ダウンロード終了記念ということでAristea 2.0、本当のUWP版をリリースしました。

さっきGitのログを確認したところ、UWP版プロジェクトがスタートしたのは2015年10月だったので、リリースまで約2年半かかっていることになります。 Windows 10自体のバグとかいろいろあって伸び伸びになっていたわけですね…

UWPになった、また機能強化でいくつか新機能が増えています。

  • ウィンドウへ画像のドラッグドロップ
  • 左のアカウントが並んでいるところの並び替え
  • カラムごとのサムネイル表示非表示
  • 1行表示
  • ペイント画面を独立したウィンドウに変更
  • UWPになって若干のパフォーマンス向上
  • プッシュ通知 (テスト中)のテスト中が外れた*1

これ以外に不具合もちょこちょこ修正しています。 UWPになったことで、ちょこちょこバグと思わしき現象を確認しているのでそれはおいおい修正していきます。

現時点で計画されているアップデートは、8月中頃のUserStream終了に合わせたUserStream機能とイベントカラム、プッシュ通知の削除です。 それ以外の機能追加、不具合修正はこれに限らず随時リリースされる予定です。たぶん。

Aristeaは新規ダウンロードは終了しましたが、8月までは全機能が完全に使用できるままです。その間まではぜひご利用ください。

*1:このままだと最後までテスト中のままな気がしたのでせっかくだから外しました

DellのXPS 13(9370)のBIOSアップデート

2月ごろにXPS 13(9370)を買っていたのですが、キーボードを高速に*1入力すると文字を取りこぼす。という現象に遭遇してました。

もしかしたら単純にタイプミスなのかもしれないけど…と思いつつサポートメールを送信したら、

ゆっくり入力してください

って言われてしまい、Twitterサポートに泣きついたところ、本国の開発部門へエスカしてもらえたようで本日BIOSアップデートが公開されました。

Fixes:
- Skips keys when typing fast
Dell XPS 13 9370 System BIOS | Dell 日本

とあるように、このアップデートをインストールするとキーの取りこぼしが全くなくなりました。見違えるようです。

わけのわからないクレームを本国までエスカしてくださったサポート担当の方に感謝です。

*1:といっても7key/secなのでそんなに早くないです