タグ: python

  • PyCon mini Hiroshima 2018 参加者・発表者募集中 #pyconhiro

    2018年10月6日(土曜)に PyCon mini Hiroshima 2018 を開催します。

    概要

    PyCon mini Hiroshima 2018
    すごいPython 広島で流行らせよう!
    2018年10月6日(土曜)
    基調講演
    Pythonで遊ぼうコンピュータ将棋
    芝 世弐(岡山県立大学情報工学部)
    Pythonの10年と今、これから
    佐藤治夫(株式会社ビープラウド)
    会場
    広島大学東千田未来創生センター
    広島県広島市中区東千田町1-1-89
    参加費
    学生:無料
    一般:1000円
    事前の申し込みをお願いします)

    講演者募集

    Python に関するご講演を募集しております。
    講演申込 Google フォーム をご利用ください。
    またはメールでのお申し込みに関する説明を参照してください。
    申込締切は8月29日(水曜)です。

    西日本豪雨の影響

    以下、現時点での個人的な見通しです。

    • 当日の会場への新幹線(JR広島駅)や広島空港からの交通アクセス:問題なし
    • 広島市中心部から西側(宮島など)の観光スポット:問題ありませんが、JR在来線の運行区間に変更があり、運行本数も少なめです。時間に余裕をもって行動するとよいと思います。
    • 広島市中心部から東側(呉、東広島、尾道など)へのアクセス:JR在来線が被災し、10月の時点ではまだ全線復旧できていない見込みです。バスや車での移動は運休、不通区間、渋滞に注意が必要です。
    • 西条酒まつり:開催されます。ですが JR 在来線で広島市内から移動できない可能性があります。酒蔵ツアーについては8月中旬にご案内する予定です。
    • 追記(8月16日)PyCon mini Hiroshima 2018 Sake-Matsuri Tour 募集中です!当日はJR在来線で広島市内から移動できる見込みです。

    雑感

    私自身は、豪雨から3週間以上が過ぎた現在も、自宅地域が避難勧告の対象になっています。川沿いの道路がいたるところで陥没して、愛犬と散歩をする道がごくわずかになってしまいました。それでも、この地域にも多くのボランティアが来てくださって、砂ぼこりを巻き上げていた道路が少しずつきれいになり、通勤などでの不便は残っているものの、日常を取り戻しつつあります。
    こんな状況でしたが、7月22日に「PCNひろしま」のプログラミング教室を予定通りに開催して、改めて、自分の置かれた状況に配慮しながら、やってきたことをやり続けることの意味もあるような気がしました。


    PyCon mini Hiroshima でも、広島で今年起きたことを踏まえた取り組みを、なにか扱えるのでは、と思っています。先週の水曜日に開催した「すごい広島 with Python」でも、位置情報を扱うライブラリやオープンデータなどの情報交換をしたところです。
    「すごい広島 with Python」は1年以上毎月開催して、ここで Python を勉強しはじめた人が、東京で開催される PyCon JP のプロポーザルを出す(通ったかどうかはいずれ。。)という段階までたどり着きました。参加者としても今年も何人かが広島から PyCon JP に参加することになりそうです。
    Python を広島で使い始めている人に、ちゃんと広島にコミュニティがあって、全国的なコミュニティとつながっている、ということを知っていただくために、もうしばらくこのイベントを続けたい、という気持ちで準備を進めています。
    現在受付中の講演募集ですが、30分、15分に加えて、持ち時間5分のライトニングトーク(LT)も選択可能にしています。 Python に関するいろいろなアイディアやノウハウをお持ちの方は、お気軽にお申込みください。
    よろしくお願いします。
    追記
    講演申込締切を8月29日(水曜)に変更しました。(8月15日)

  • NVDA 行く年くる年

    この記事は Web Accessibility Advent Calender 2017 の10日目の記事です。
    オープンソースの Windows 用スクリーンリーダー NVDA に関するこの1年の活動を振り返るポエムで乗り切ろうと思ったのですが、ゆうべ広島フロントエンド勉強会で喋ったら気が変わってしまいました。
    11月11日 JAC Vol.1 の講演「アクセシビリティ検証ツールとしてのNVDA入門」での失敗をフォローします。
    決済サイト試作の入力バリデーション画面例

    アクセシブルな決済システムの試作

    アクセシビリティで難しそう、めんどくさそう、スクリーンリーダーで実際に検証しないと不安なポイントはやっぱりセキュリティだろう。
    試してみたくなったのがクレジット決済 API を使うサイトの開発だった。
    11月11日に見せようとした試作サイトは、以下のような方針で開発した。

    決済サービスの選択

    • テストモード、つまり、ダミーのカード情報を送信して実際にWebアプリのテストができること
    • カード情報を Web アプリが保存しなくてよい、できれば受け取る必要すらないこと(情報漏洩のリスクを回避)
    • Python から簡単に使えること(個人的な好みです)

    実際に使った決済サービスの仕様

    • JavaScript ライブラリがあり、ブラウザが決済APIサーバと直接通信を行い、カードと紐付いたトークン情報だけが返ってくる
    • そのトークン情報を Web アプリが受け取って、実際の課金を行うことが(Python ライブラリから)できる

    つまり、ブラウザの中で「ユーザーにカード情報を入力させて、決済サーバに送って、カードのトークンを受け取る」という処理を、画面遷移せずに完結させたい、ということになる。
    これは、セキュリティのために「動的なコンテンツを作らざるを得ない」ということで、アクセシビリティの題材としてはよさそうだと思った。

    11月11日の前に作っていたもの

    コードの抜粋はこちら
    環境は Google App Engine for Python + Flask
    (1) ログインする前の画面
    ログインしてください、という表示になり、ログインのリンクがある。
    実際にログインで使っているのは Google アカウント認証。
    これが使いたかったので GAE を選んだ。本人確認されたユーザーのメールアドレスを取得。Google のログイン画面はスクリーンリーダーでちゃんと使えるはず。
    ログインする前とログインしたあとの画面は Jinja2 (Python のテンプレートエンジン)で分岐している。
    (2) ログインした直後の画面
    ログインすると最初の画面が入力フォームになっている。
    上から順に、以下のものがある。

    • テキスト「カード情報を入力して「確認」を押してください」
    • 4個の入力フィールド:カード番号、有効期限(年)、有効期限(月)、CVC番号
    • 「確認」ボタン(有効状態)
    • 「購入」ボタン(無効状態)
    • 「キャンセル」ボタン(無効状態)

    ただし、デモなので、入力フィールドには決済サービスのテスト用カード番号があらかじめ入れてある。
    確認ボタンを押すと URL が遷移するのではなく、JavaScript の処理が実行されて、コンテンツが動的に変化する。
    (3) カード情報が正しくない場合の「確認」結果
    「カード番号が正しくありません」などが表示され、入力フィールドの修正と「確認」ボタンしか有効にならない。
    何が正しくないかというメッセージはテキスト( aria-live=”assertive” 属性の div )として表示され、スクリーンリーダーで読み上げられる。
    つまり動的コンテンツだがバリデーション結果をアクセシブルに提示できる。
    (4) カード情報が受理された場合の「確認」結果
    「カード情報が確認できました。「購入する」を押すと***円のお支払いが完了します。」
    のように表示され、「購入」ボタンと「キャンセル」ボタンが有効になり、入力フィールドと「確認」ボタンが無効になる。
    購入ボタンを押すとカードのトークンが submit されて URL が遷移する。Python アプリで決済 API をたたいて結果を取得、次のページに「購入完了」みたいな表示を出す。
    「キャンセル」を押すと、入力フィールドの値がふたたび変更可能になる。

    本番でやったドジなこと

    確認ボタンを押して入力フィールドが無効になった状態で、「じゃあ今度は値をわざと変更して正しくない入力内容にしてみましょう」とか言いながら、無効になっている入力フィールドのテキストを書き換えようとしてうまくいかず、デモを中断してしまった。

    そのあとで考えたこと

    aria-live=”assertive” とか、フォーカスの制御とか、invalid とか、いろいろ盛り込んだのだが。。
    そもそも「自分がうっかり間違えるような UI 設計がよくない」と考え直した。

    最近作り直したもの

    (1) ログインする前の画面
    ログインしてください、という表示になり、ログインのリンクがある。
    (2) ログインした直後の画面
    ログインすると最初の画面が入力フォームになっている。
    上から順に、以下のものがある。

    • テキストA「カード情報を入力して「確認」を押してください」
    • 4個の入力フィールド:カード番号、有効期限(年)、有効期限(月)、CVC番号
    • 「確認」ボタン(有効状態)

    (3) カード情報が正しくない場合の「確認」結果
    テキストA「カード番号が正しくありません」などが表示され、入力フィールドの修正と「確認」ボタンが使える状態のまま
    (4) カード情報が受理された場合の「確認」結果

    • テキストB「カード情報が確認できました。「購入する」を押すと***円のお支払いが完了します。」
    • 「購入」ボタン
    • 「キャンセル」ボタン

    その他のものは非表示になる。
    「キャンセル」を押すと、テキストAと入力フィールドだけの表示に戻る。

    振り返って思うこと

    なんのことはない、これはひとつの HTML ファイルにダイアログAとダイアログBがあって、交互に表示・非表示になる、一種のモーダルである。
    たぶん最初の「非表示・無効」だらけの画面を作っていたときには、「この操作を実際に行うと、次にどういう段階に進むのか」みたいな見通しを伝えたかった。
    だから、あとから有効になるけどいま無効なものをたくさん作ってしまった。
    その流れで「さっきは有効だったけどいまは無効になった」ものも、たくさん残してしまった。
    だが、けっきょくのところ「ひとつひとつの段階で迷わせない」「無関係なものを見せない」ということのほうが大事だったと思われる。
    カード情報が確認できたときに、もういちどカード番号を表示する、みたいなことは、本当はやった方がいいのか、やっぱり不要なのか。。

    こまかいこと

    今回のデモでは invalid の判定には2種類ある。
    (1) HTML の required と pattern を使う処理
    (2) 決済APIサーバーのエラーメッセージに基づく処理
    後者の場合には、JavaScript のコールバックで

    <div id="input_guide" class="alert alert-primary" role="status" aria-live="assertive"></div>
    
    <div class="col-12">
      <label for="card_number">カード番号</label>
      <input type="text" id="card_number" class="form-control" aria-describedby="card_number_help" value="5555555555554444" required aria-required="true" pattern="[0-9]{13,16}" />
      <small id="card_number_help" class="form-text text-muted">半角数字 <span aria-hidden="true">省略できません</span></small>
    </div>
    
    if (response.error.code === 'invalid_number') {
      $('#card_number').attr('aria-invalid', true).focus();
      $('#input_guide').text('カード番号が正しくありません').addClass('alert-warning').removeClass('alert-success');
    }
    

    みたいなことをする(jQuery を使っている)。
    JavaScript 2行目の最後の .focus() がなければライブリージョンの「カード番号が正しくありません」が読み上げられる。
    一方で、この .focus() をつけてしまうと card_number 要素の読み上げしか聞くことができない。
    NVDA 2018.1jp-beta-171206x + Firefox ESR 52.5.2 でスピーチビューアを使って確認すると:

    ブラウズモード
    カード番号が正しくありません
    カード番号  エディット  正しくない入力内容  必須  オートコンプリート  半角数字 省略できません
    55555555555544 選択
    フォーカスモード
    

    つまり、ライブリージョンの読み上げの直後にフォーカス位置の読み上げイベントが発生して、直前の読み上げを止めてしまうのだ。
    (「フォーカスモードとブラウズモードの切り替えを音で報告」はチェックなし。後述の追記2を参照のこと)
    実は最初のバージョンはこれが気に入らなくて(だって live region のデモにならないから)フォーカスを移動しなかったのだが、考えてみるとライブリージョンを読むことよりもフォーカスをエラー箇所に移動してあげることのほうがずっと親切で、ユニバーサルな気がする。
    さらに、フォーカスを読み上げるときに「正しくない入力内容」もちゃんと読み上げているのだ。
    本当にスクリーンリーダーで検証するべき「アクセシビリティのディティール」というのはこういうことなんだろうな、と思っている。

    ここから追記

    追記:NVDA の live region の実装がおかしいのではないか、と言われそうな気もするので(そうかも知れないけど)ちゃんと制御できるケースも紹介しておく。

    $('#card_number').attr('aria-invalid', true);
    $('#get_token_btn').focus();
    $('#input_guide').text('カード番号が正しくありません').addClass('alert-warning').removeClass('alert-success');
    

    こんなふうにボタンにフォーカスを移動して、直後に live region の内容を更新すれば、「カード番号が正しくありません」をちゃんと聞くことができる。
    (このテクニックは最初のバージョンで使っていた)
    追記2:さらに調べたら、NVDA の「フォーカスの変化を追跡する自動フォーカスモード」をチェックなしにすると、エディットにフォーカスが移動したときに live region を最後まで読み上げて、それからフォーカスを読み上げるようになった。
    ボタンとエディットで挙動が違うのだから、もしやと思ったら、やっぱりそういうことだったか。。

    おことわり

    勘のいい人は shop.nishimotz.net というサイトを見つけたかも知れませんが、このサイトは「本当に何かを販売して決済を行うサイト」に作り替える予定の場所です。
    明日は tosssaurus さんの「社内じんわりアクセシビリティ普及活動報告」だそうです。お楽しみに。

  • MicroPython の雑誌記事を執筆した話

    広島版IoT縛りの勉強会! IoTLT広島 Vol.7 で「MicroPython の雑誌記事を執筆した話」をしました。
    2017年11月25日発売 CQ出版 Interface(インターフェース) 2018年1月号
    「第4部 マイコンPython無線センシング実験室」



    元ネタとして蓄積してきた情報はこちら。
    発売されてすぐにブログを書こうと思ったのに、すっかり遅れてしまいました。
    記事のフォローアップはスライドを見てください。編集部に送るのが遅くなってしまい、紙面で触れられてませんが、ダウンロードできるソースコードも公開されています。
    技術の検証は一段落したので、集めた素材を使っていろいろ面白いものを作りたいと思っています。