tmytのらくがき

個人の日記レベルです

Aristeaのフィルタ式のところだけをライブラリにしました

Aristeaで使えるフィルタ式のパーサとかとかそのへんをライブラリにまとめなおしました。Freesiaといいます。

ごくごく一部のテスタのみなさまにはFreesia版でじっくりテストを進めているところです。ですので、現時点でストアに公開されているやつはまだFreesia版ではないです。 Freesiaが導入されると、フィルタ式にLambda式とLinq likeなメソッド呼び出しがサポートされるようになります。つまり、次のようなフィルタが書けるようになります。

// 動画を含むツイートだけをとりだし
extended_entities.media.any(x => x.type == 'video')

いままでだと、配列にたいするcontainsしか処理できなかったんですけど、これでLINQ的なのが呼べるので柔軟さがかなりあがりました。 たぶん、そのうちリリースするとおもいます。

ExtendedExecutionSessionでサスペンド延長中にリジュームしたときちゃんと面倒みないと運が悪いとアプリが死ぬ話

UWPでOnSuspendingでファイルを保存するとかどうしても長いことかかることをしたいときにExtendedExecutionSessionというのでサスペンド時間を延長できます。結構便利なので頭の隅に置いておくといいと思います。

で、表題の件ですが、ExtendedExecutionSessionでサスペンド時間を延長して、その中でながーーーい処理をしているときにアプリがリジュームしてきて、さらにExtendedExecutionSessionのRevokedイベントで何もせず、ずっと長い処理を実行し続けて15秒ぐらい経過するとOnResumeに失敗してアプリが死にます。

ちゃんとまとめます。

  • ExtendedExecutionSessionを使ってる
  • OnSuspendで長いことかかるかもしれないことをやってる
  • ExtendedExecutionSession.RevokedとかこないでしょHAHAHAとか思ってる

なぜなのか

GetDeferralしてからCompleteするまではOnResumeの実行がブロックされる。ようです。まぁいわれてみればその通りなんですが…。

どーすんの

OnResumeが来たときExtendedExecutionSessionのRevokedイベントが呼ばれます。なのでちゃんとOnResumeは検出できるわけです。 つまり、ここでいったんdeferralを終了してあげるとブロックされていたResume処理が実行されるのでアプリがりじゅーむできずに死ぬことはなくなります。が、サスペンド処理は適当にいい感じにする必要はあります。

こんなん

とりあえずこういう感じで実装してそれなりに動いているようですが、これでいいのかよ感はあります。

var completed = false;

extendedSession = new ExtendedExecutionSession();
extendedSession.Reason = ExtendedExecutionReason.SavingData;
extendedSession.Revoked = (o, args) =>
{
    lock (this)
    {
        if (completed) return;
        completed = true;
    }
    deferral.Complete();
    extendedSession?.Dispose();
    extendedSession = null;
});

United Airlinesの機内Wifiをであそんでます

いまGoogle I/O 2016に参加してその帰りの飛行機の中です。United Airlinesの機内Wifiがつかえたのでせっかくだからいろいろ試してみました。

このエントリを書いた時点でこのあたりにいます。

f:id:tmyt:20160522065248p:plain

まず、United_Wi-FiというSSIDに接続します。すると、172.19.248.0/23なIPが割り当てられます。まぁ乗客が300人程度なので512個あれば足りるはずですね。

とりあえずDNSひいてみたかんじ。

$ nslookup google.com
Non-authoritative answer:
Server:  ns.unitedwifi.com
Address:  172.19.248.1

DNS request timed out.
    timeout was 2 seconds.
Name:    google.com
Address:  172.217.3.14

$ nslookup twitter.com
Non-authoritative answer:
Server:  ns.unitedwifi.com
Address:  172.19.248.1

Name:    twitter.com
Addresses:  199.16.156.70
          199.16.156.6
          199.16.156.102
          199.16.156.230

正しい結果が得られるようです。なるほど。

Webページをリクエストしてみると、全部に対して302 foundが得られるみたいです。

$ curl google.com -v
* Rebuilt URL to: google.com/
* timeout on name lookup is not supported
*   Trying 172.217.3.14...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0* Connected to google.com (172.217.3.14) port 80 (#0)
> GET / HTTP/1.1
> Host: google.com
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 302 Found
< Server: squid/3.4.6
< Mime-Version: 1.0
< Date: Sat, 21 May 2016 21:06:13 GMT
< Content-Type: text/html
< Content-Length: 0
< Location: http://www.unitedwifi.com
< X-Squid-Error: 403 Access Denied
< X-Cache: MISS from bc01
< Via: 1.1 bc01 (squid/3.4.6)
< Connection: close
<
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
* Closing connection 0

$ curl twitter.com -v
* Rebuilt URL to: twitter.com/
* timeout on name lookup is not supported
*   Trying 199.16.156.70...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0* Connected to twitter.com (199.16.156.70) port 80 (#0)
> GET / HTTP/1.1
> Host: twitter.com
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 302 Found
< Server: squid/3.4.6
< Mime-Version: 1.0
< Date: Sat, 21 May 2016 21:07:31 GMT
< Content-Type: text/html
< Content-Length: 0
< Location: http://www.unitedwifi.com
< X-Squid-Error: 403 Access Denied
< X-Cache: MISS from bc01
< Via: 1.1 bc01 (squid/3.4.6)
< Connection: close
<
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
* Closing connection 0

機内のゲートウェイまでのPINGはまぁふつうぐらい

C:\>ping 172.19.248.1

Pinging 172.19.248.1 with 32 bytes of data:
Reply from 172.19.248.1: bytes=32 time=8ms TTL=64
Reply from 172.19.248.1: bytes=32 time=12ms TTL=64
Reply from 172.19.248.1: bytes=32 time=6ms TTL=64
Reply from 172.19.248.1: bytes=32 time=16ms TTL=64

Ping statistics for 172.19.248.1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 6ms, Maximum = 16ms, Average = 10ms

302 Foundで示されているURLへアクセスすると20ドル払えといわれます。

まぁせっかくなので払うとすべてのURLに302 Foundを返すあれがなくなってこうなりました。

$ curl twitter.com -v
* Rebuilt URL to: twitter.com/
* timeout on name lookup is not supported
*   Trying 199.16.156.38...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:05 --:--:--     0* Connected to twitter.com (199.16.156.38) port 80 (#0)
> GET / HTTP/1.1
> Host: twitter.com
> User-Agent: curl/7.46.0
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< content-length: 0
< date: Sat, 21 May 2016 21:12:52 GMT
< location: https://twitter.com/
< server: tsa_b
< x-connection-hash: 8cf7ac5f78c055ca55106e70cb0b3426
< x-response-time: 3
< Connection: Keep-Alive
< Set-Cookie: guest_id=v1%3A146386517242165290; Domain=.twitter.com; Path=/; Expires=Mon, 21-May-2018 21:12:52 UTC
<
  0     0    0     0    0     0      0      0 --:--:--  0:00:06 --:--:--     0
* Connection #0 to host twitter.com left intact

衛星経由なのでPINGはかなり遅め。まぁしかたない。

>ping 8.8.8.8

Pinging 8.8.8.8 with 32 bytes of data:
Request timed out.
Reply from 8.8.8.8: bytes=32 time=745ms TTL=51
Reply from 8.8.8.8: bytes=32 time=799ms TTL=51
Reply from 8.8.8.8: bytes=32 time=921ms TTL=51

Ping statistics for 8.8.8.8:
    Packets: Sent = 4, Received = 3, Lost = 1 (25% loss),
Approximate round trip times in milli-seconds:
    Minimum = 745ms, Maximum = 921ms, Average = 821ms

速度は…まぁTwitterぐらいならできるんじゃないですかね

f:id:tmyt:20160522065122p:plain

IIJmioが国際ローミングできたので525円払った話

今、Google I/Oでアメリカに来てます。アメリカなんて近いもんで10時間ぐらい飛行機にのってたらぷらーっとこれます。楽ちんなもんです。

ところで、みなさんIIJmio使ってますか?私も使ってます。でもって、アメリカに来ました。でもって、昨年11月に買ったT-MobileのSIMがあったんでIIJmioのSIM刺した電話はほったらかしにしてたんです。ほったらかしに。

f:id:tmyt:20160517153825p:plain

そしたら突然電話かかってきたわけですよ。画面をみたら+81xxxxxxxx …えっ?っておもったけども見覚えのある番号だったのでとりあえず出ました。

*「Azure課金サポートの鈴木(仮名)です」

そして思ったわけです。あれこれやばい奴じゃないの。そこで、アメリカの番号に日本から国際電話でかけなおしてもらえないかお願いしたところ、快諾してもらえたのでとりあえずよかったのですが。

ふと気になったのでIIJmioのサポートを見てみました。

音声通話機能付きSIMカードでは、国際電話及び国際ローミングがご利用いただけます。 サービスの利用方法については、NTTドコモのホームページ(新しいウィンドウを開きます)をご確認ください。

海外で使うにはどうすればいいですか | IIJmio

ふむふむ。

音声通話(1分あたり) 175円

国名・都市名・機種から調べる | サービス・機能 | NTTドコモ

なるほど175円。

f:id:tmyt:20160517153921p:plain

なるほど2分50秒。つまるところ、切り上げて3分なので525円じゃな…?

IIJmioが国際ローミングで音声通話を発着信できるので、うっかりフリーダイヤルから着信するとフリーどころか着信課金で500円も持っていかれた話でした。

Hololensを触ってきたよ!

デザインと開発の会社silkeyfeelのみつばたんと、ソフトウェアの販売とかをやっているエクセルソフトの田淵さんの主催でHololensを触れる機会を作ってもらったので遊びに行ってきたよ!

f:id:tmyt:20160429140637j:plain

大きいのがHololens、小さいのがClickerって呼ばれてるクリックだけできるBluetoothデバイス。たぶんBLEじゃないかな

f:id:tmyt:20160429140743j:plain

DEVELOPMENT EDITION。かっこいい

f:id:tmyt:20160429140901j:plain 40万のゆたんぽという噂

f:id:tmyt:20160429141458j:plain f:id:tmyt:20160429141830j:plain すごくかっこいい、未来っぽい

f:id:tmyt:20160429141948j:plain f:id:tmyt:20160429141931j:plain 中から見るとこういう風にみえるみたい。液晶みたいなのが3枚くらいあるのがみえますね

f:id:tmyt:20160429143239j:plain 設定をみんなでみようって、Webカメラでスクリーンに出そう!ってやってるみたい。

f:id:tmyt:20160429150956j:plain

エクセルソフトの田淵さん、ホロレンズを被る図


Hololens思ったより軽くて、描画もすごくなめらかでした。Hololensを被ってる人たちみてると現実とは違う別の世界を見てる感じ。スマートフォンを通して違う世界をみていたIngressがもっとすごくなった感じ。

Kinectと同じ仕組みでHololens自体が世界を認識していて、バーチャルとリアルの境界面をしっかり処理しているという雰囲気。これでWindows 10が普通に動いてて、普通にアプリケーションが実行できるなんて すごい時代になったもんだなー。

赤外線でセンシングしているから直射日光とか、屋外とかはだめ(らしい。取説に書いてた。)けど、屋外でも使えるようになったら、すごい時代だよなー。普通の人が触れるようになるのは何年さきなのかしら。

とりあえずアプリデプロイしたいなー…

Continuum for Phone をStateTriggerで判別してみたよ

Windows 10時代のUWPは画面幅を中心にUIを考えろ。というガイドラインですが、やっぱ電話は片手で、PCは広い画面で。でもContinuum for PhoneしたときはPCみたいな広い画面で使いたいわけです。 でもって、Continuum for Phoneしてる時でもDeviceFamilyはMobileなのでそこんところを考慮していろいろやるとこういうXAMLができました。

Continuum for PhoneだとContinuum。電話で表示するとMobile。PCで広い画面だとWide。狭い画面だとNarrow。が表示されるXAMLです。

画面の広い、狭いはAdaptiveTriggerで。それ以外の2個はカスタムのStateTriggerを使ってます。それぞれの実装はこんな感じ。

条件の厳しいものから上にならべるとうまくいきます。実際はContinuumStateTriggerをちょっとカスタムして、Mobileで非Continuum状態というStateTriggerにしてMobileを判定。それ以外は画面幅にフォールバックとかがPCとContinuum for Phone で同じレイアウト、電話だけ違うレイアウトがやりやすいと思います。