20171112 「豊田市IT勉強会 第3会 もくもく会」へ行ってきた

この記事はScrapboxのページのスナップショットです1


豊田市IT勉強会 第3回 もくもく会 - connpass

会場
  • http://mg-toyota.com/
  • マイカフェなの?マイカフェではないの?
  • 静かだった
  • ビジター 9:00-17:00 1000円 飲みものあり
  • 自宅から車で1時間かからないくらいで行けた
    • 道路工事で片側交互通行が2箇所とイケア渋滞があった
  • 駐車場はすぐ近くに1日打ち切り1000円ぐらいのが一つだけあったが満車だった
    • 打ち切りなしの駐車場が周囲にたくさんある 30分150円 (8h 2400円)
    • 愛知環状鉄道の高架下が一日打ち切り1000円くらいである
      • 隣り合った同じブランドのパーキングで駅から遠い方は少し安い 800円
他の人がやってたこと
  • プレゼン点数判定
    • 言い淀み認識
    • 行動力って大事だなと思った
  • ゼロから作るDeep Learning ISBN 978-4873117584
    • 自分も同じ本を読んで意見を聞いたりできるかも
      • 一人で読むと細かい表現に悩むことが多いので
  • ChromeExtension
  • java?web?入門本
    • 本の通りにならないと言っていた
      • 一緒に読んでみるのを提案してもよかったかも
        • javaはわからなくても本に書かれていること読むことはできるから
  • 形態素解析
    • 行動力って大事だなと思った
自分がやったこと
  • docs.microsoft.com/en-usと /ja-jpを行ったり来たりするブックマークレットを作ろうと思った
  • 最近jsよくわかってないです。jQuery登場以前にフロントエンドを仕事で少し触った程度の経験
    • ブックマークレット アドレスjavascript:に書いたjsを実行させるやつ
      • chromeを常用。とりあえずスクリプトの長さは気にしなくてもよさそうな雰囲気をインターネットから察知した。
    • とりあえずchromeデベロッパーツールのコンソールで素朴にページ遷移させるコードを書いてみる
    • 開発者向けのWeb技術 | MDNを参照しながら
      • まず、ブラウザjsにはwindowというのがグローバルオブジェクトとして定義されている、なのでwindowと書かずにwindowのプロパティにアクセスできる
      • window.locationプロパティがある。
        • getは不変のLocationオブジェクト、setは文字列かLocationオブジェクト
      • Location.replaceメソッドを使えば履歴が増えないから進む戻るに影響を与えない
      • string.replaceで正規表現を使った置換
      • javascript
        • location.replace(location.href.replace("/en-us/", "/ja-jp"))
      • これだと片道。行ったり来たりしたい
        • ["/en-us/", "/js-jp/"]
        • MDNもjaen-USがある
    • というか対応する2つのページが同じドメインでないかもしれない、同じパス位置の変更で対応できないかもしれない
      • こんな感じかなのコードを考えた。長いのでページ末尾に置いた。
      • そもそも、ブラウザのタブを2つ切り替えればいいんじゃないか
      • chrome Extensionだ
        • appというのは過去あったけどそれとは別のもの
        • plugin、addon、addinはchrome用語には無いっぽい
        • デベロッパーモード、パッケージ化されていない拡張を読み込む
        • manifest.json
      • V.S.Codeでtypescript
        • 補完とリアルタイムのコンパイルエラー表示があるといいな
        • ショートカットキーの`Ctrl+``がwindowsの言語選択が強くて使えない
        • npmでのプロジェクト管理
        • gitignoreをgithub gitignoreからダウンロード
        • 雑に調べてコピペして実行
          • これが行動力か
    • なんかついでにWSLで諸コマンド使えるようにしとこうと思った
      • 使うのはubuntu。Store版をインストール済み
        • >wslでセッションに入ってコマンドをうつ
          • wsl.exeではcurrentDirectoryでセッションが開始される。たしか以前は、ubuntu.exeとかアプリ名で開始しないとcurrentDirectoryにならない挙動だったはず。また挙動が変更されるかもね
        • >wsl コマンドで都度wslにコマンドを実行させてもいい
        • nmpもwslのものを使おうとおもった
          • インストールから手探り。雑に調べてコピペして実行。バージョンが新しくない。雑に調べてコピペして実行。なんだかよくわかってないままにnodeとnmpが最新版になった
            • これが行動力か
    • ここまでやってgithubリポジトリ作った
思ったこと、連想したこと、ぼんやり浮んだイメージ
  • google検索 「音声認識 言い淀み」
  • DeepLearningは機械学習の手法の一つなの?
    • パターンを発見する = 概念を作る = 抽象化 と言うことは可能か?
      • ちゃんと調べておくこと
  • もくもく会の参加者ステータスがモニターできると楽しそう
    • その人の様子は見ればわかるけど、PCの中でどんな様子かまでは分かりづらい
    • 明示的にアテンションを求めなくても周囲にPCでの作業内容の雰囲気が伝わるとコミュニケーションのきっかけになるのでは
    • グループチャットでそれぞれ自分の文脈で独り言
    • ヒートマップ
      • スクリーンキャスト
        • 画像認識。画面上の文字を認識するのではなくて、PCと人との対話の雰囲気を可視化
      • アイトラッキング
      • キーボード、マウス操作の熱さ
      • PCのネットワークアクセス傾向
      • 黒い画面のコマンドの成否
      • イスの座面圧力、足と床の圧力
        • 立った座った、足を組みかえた、前のめりになった、のけぞった、足踏みした
  • 画像認識するとして妄想したこと
    • カーテンモード
    • ネットーワークに流すのは忌避感を持つのではないか
      • HDMI端子に挿す装置
      • 画像を統計情報に変換する
    • 自分のものでない装置への信頼性
      • シールされたハードウェア
        • 信頼できる誰かによって作られ手元にとどくまでに変えられていないか
      • インストールされたソフトウェア
        • ソフトウェア自体に悪意が含まれていないか
        • インストールされたものが本物か
  • 今日知った言葉
    • 正真性 :integrity 完全性
    • 真正性 :authenticity

疑似コード

//変換関数を適用するかの判定
delegate bool Match(Location);
delegate UrlString Transformer(Location);

// docs.microsoftとかMDNみたいなパターンのルールを作る
(Match, Transformer) MakeBasicRule(string urlPrefix, string pathSegment1, string pathSegment2)
{
    // urlの先頭から一致
    var match = location => location.href.StartsWith(urlPrefix);
 
    // パスの同じ位置で入れ替え
    var transformer = location => {
        var url = location.href.replace(pathSegment1, pathSegment2);
        if( url != location.href){
            return url
        }
        return location.href.replace(pathSegment2, pathSegment1);
    };

    return (match, transformer);
}

basicRule = [
    ["https://docs.microsoft.com/", "/en-us/", "/js-jp"],
    ["https://developer.mozilla.org/", "/en-US/", "/ja/"]
];
 
string Toggle(Location location){
    var ruleSet = basicRule.Select( rule => MakeBasicRule(rule[0], rule[1], rule[2])).ToArray();
 
    // matchするルールがなければnull
    return ruleSet.FirstOrDefault( rule => rule.Item1(location))Select(rule => rule.Item2(location));
}

  1. daiiz/ScrapboxコンテンツをMarkdownに変換するBookmarkletを使った後に手動で体裁を修正して掲載しています。

VisualStudioでWebApp開発中にCtrl+F5を押して素のChromeを起動させる

f:id:azechi_n:20171109150238p:plain
デバッグの開始、デバッグなしで開始
Visual Studio 2017でデバッガをアタッチせずにWebアプリケーションを実行するにはCtrl+F5(「デバッグの開始」のショートカットキー)を押す。すると、ブラウザが開いてアプリケーションのアドレスにアクセスする。何も設定していない状態だとWindowsの既定のブラウザが対象になる。既定のブラウザをchromeにしているので普段使っている状態のchromeが開く。

これで別に不都合はないのだけれど、「デバッグの開始」をした場合はchromeがブックマークとかプロファイルとか無いプレーンな状態で開く。どうせなら「デバッグなしで開始」のときにもプレーンなchromeが立ち上がって欲しい。

f:id:azechi_n:20171109150239p:plain
素のchrome

デバッグの開始」のときのchromeの起動オプションをchorome://versionで調べた。

f:id:azechi_n:20171109150941p:plain
chrome起動時のコマンドライン

--user-data-dirを指定して別のユーザーデータで起動すればいいらしい。フォルダが存在しない場合は起動時に作られる。

f:id:azechi_n:20171109150235p:plain
ブラウザーの選択

ブラウザーの選択」からブラウザーの追加ができるので--user-data-dirを引数にしたchromeを追加する。

AWS LambdaでAWSサービスのロングポーリングAPIを呼ぶときには使用するSDKの設定を確認するといい

既定の設定ではロングポーリングAPIでクライアントがタイムアウトしたうえに自動で再試行する。1回のAPI呼び出しでタイムアウトまで待機してさらに間隔を延しながら5回リトライするから数分に渡って制御が返ってこない状態になる。AWS Lambdaなどでは課金がだだ漏れになってしまう。

具体的には、boto3(Python)でAWS Step Functions(SFN)のGetActivityTaskを呼び出したら遭遇した。Step FunctionsのGetActivityTaskは呼び出すと最大で60秒間サーバーが接続を保持して待機(ロングポーリング)する。このAPIはサーバーの待機時間を指定できない。

各言語向けのAWS SDKは自動再試行を実装している。AWS SDK for Pythonのboto3にもbotocoreパッケージで自動再試行が実装されている。なお、AWS CLIもbotocoreパッケージを使用しているのでbotocoreの設定ファイルはboto3と共有する。

再試行の条件と回数、間隔は設定ファイルとしてbotocoreパッケージに含まれる。パッケージレベルの設定ファイルはbotocore/model/retry.json。パッケージレベルの設定はAWS_SDK_PATHにretry.jsonを置いて上書きすることができる。再試行設定はサービス、APIごとに設定できる。S3などには用途に合せた設定があらかじめ用意されている。Step Functionsについてはいまのところ用意されていないので既定の設定が適用される。既定の再試行設定はエクスポネンシャルバックオフ(指数関数的後退)アルゴリズム(失敗するごとに再試行の間隔が長くなる)で最大5回。

qiita.com

そもそも再試行が行なわれるのは、リクエストがタイムアウトで終了するから。ロングポーリングでサーバーが接続を保持したまま待機している間にクライアントの接続がタイムアウトで終了してReadTimeout例外が発生する。boto3の既定の設定は、ReadTimeout例外で再試行する。

クライアント接続のタイムアウト設定は2つ。connect_timeoutとread_timeout。connect_timeoutはサーバーに接続するまでの時間、read_timeoutは接続してから応答まで(応答完了までか?)の時間。どちらも秒単位で設定する。ロングポーリングAPIを呼び出すにはread_timeoutがサーバーの待機時間より大きくしなければならない。read_timeoutの既定は60。

qiita.com

Step FunctionsのGetActivityTaskのドキュメントによるとクライアントの接続タイムアウト設定は、サーバーの待機時間60秒に5秒以上足した65秒以上を設定することとある。

ちゃんと設定するなら、GetActiviTaskを呼ぶときはread_timeoutを65秒にして、ReadTimeoutの場合はリトライをしない、とするべきだろう。

へんなことをするとへんなとこではまる

Windows10。「ダウンロード」とか「ビデオ」とかのフォルダはShell Folderというらしい。 Shell Folderの場所を他のShell Folderと同じフォルダに重ねて指定するとなぜかエクスプローラーからアイコンが消えていく。

「デスクトップ」以外のフォルダを一つにまとめていた。ところが、PowerShellでProfile.ps1ファイルがExecutionPolicyをRemoteSignedにしても実行できない。Shell Folderのどれかがセキュリティ的な特別扱いをされてるっぽい。

重ねたShell Folderは、Explorerのプロパティで「場所」を指定しても、重なったすべてのShell Folderが移動してしまう。レジストリーを直接書き換える必要がある。

従来のASP.NETアプリケーションの認証チケットを外部のアプリケーションで復号する

これでできる。 AspNetCore.LegacyAuthCookieCompat

従来のASP.NETでは認証クッキーには認証チケットSystem.Web.Security.FormsAuthenticationTicketシリアライズして暗号化したものが入っている。復号は、System.Web.Security.FormsAuthenticationクラスのDecryptメソッドでする。

System.Web.Security.FormsAuthenticationSystem.Web.dllにある。 System.Web.dllは、.NET Frameworkにあり、.NET Coreには含まれない。AWS Lambdaなどの.NET Frameworkが無い環境では使えない。

自分に必要な部分だけを小さくまとめてみた。 複合化とデシリアライズするだけなので、チケットのsliding expirationなどには関知しない。

  • 方式が固定のときIVのサイズも固定なのだったら不要なコードがあるけどまだよくわからなかった
  • Read7BitEncodedIntのところがなぜそうなっているのかわからなかった
  • 切り貼りして少し体裁を変えたコードをPublic Gistとして公開してよいのかが不安

今日のデスクトップ