タグ: nvda

  • アクセシビリティの祭典 2018 と NVDA チートシート

    2018年5月17日(木曜)に神戸で開催される「アクセシビリティの祭典 2018」に、NVDA 日本語チームとして出展を行い、また「視覚障害を持つ方の最新事情」セッションに登壇します。
    配布資料を準備していたのですが、もっと役に立つものを提供したいと思い、現在「NVDA Cheat Sheet」の制作をすすめています。


    当日、会場でお披露目する予定で、それまで内容は公開しません。
    基本的には視力のある人が NVDA の機能や操作体系をざっと把握できるような A4 サイズ1枚の資料です。
    昨年のオープンソースカンファレンス広島で名刺サイズのカードを作って、ほんの少しだけ配布したのですが、どうやら A4 サイズなら、いろいろな説明が盛り込めそうです。
    内容は、過去にまとめた 開発者のためのNVDA (2015) および 開発者のための NVDA (2017) の資料と、NVDA 日本語版ガイドブック で説明したことを踏まえて選びました。
    目標は時代工房さんの JIS X 8341-3:2016, WCAG 2.0 早見表 なのですが、今回のイベントで配布しながら実演や説明に使ってみて、改良点を見つけて、すこしずつバージョンアップしていきたいと考えています。
    セッションでは、18年前に「視覚障害者のためのキーボード練習ソフト」の開発を通じて知り合った 園 順一さんとひさしぶりにご一緒させていただきます。
    お話をするのが今から楽しみです。どうぞよろしくお願いします。

  • 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 さんの「社内じんわりアクセシビリティ普及活動報告」だそうです。お楽しみに。

  • JAC vol.1 & NVDAワールド 2017 & NVDA開発者会

    もんどさんのブログを読んで、私も書くことにしました。

    Japan Accessibility Conference

    Japan Accessibility Conference vol.1
    2017年11月11日(土曜)
    会場:ヤフー株式会社 紀尾井タワー セミナールーム
    にて「アクセシビリティ検証ツールとしてのNVDA入門」という講演をします。
    2015年に「Web製作者のためのNVDA入門」というイベントの講師をしたのですが、今回はハンズオンでもなく、時間も限られているので、いちおう下記のような予定です。

    視覚に障害があるユーザーがPCを使う上で不可欠なものがスクリーンリーダーです。
    無料で利用できる Windows 用スクリーンリーダー NVDA をご紹介します。

    • スクリーンリーダーとはどのようなものなのか、
    • スクリーンリーダーで Web ブラウザをどう操作するのか、
    • アクセシビリティ検証ツールとして NVDA をどう使えばよいか

    をご説明します。

    この講演は5月ごろから打診をいただいていたので、このイベントにあわせて NVDA 2017.3jp に導入した新機能もありますし、お馴染みの FocusHighlight アドオンも(RubyKaigi 2017で実演に使いましたが)新しいバージョンをリリースしたいと思っています。
    なので、11月11日に話を聞いてくださった人には、これまでよりもスムーズに「アクセシビリティ検証ツールとしてのNVDA」をお試しいただけると思います。
    (おわかりのとおり WordPress を使っているので、私のセッションの裏番組も気になります。。)

    NVDAワールド2017

    一方で、前述のイベントがこの日程になることがわかっていたため、11月1日から3日まで開催されるサイトワールドの翌日ではなく前日に開催することにした
    NVDAワールド2017
    2017年10月31日(火曜)
    会場:日本マイクロソフト
    (東京都港区港南2-16-3 品川グランドセントラルタワー)
    は参加申し込みの締め切り(10月23日)まであと2週間になりました。
    こちらの私のセッションは「ビジネスツールとしてのNVDA」というテーマにしました。
    前述のカンファレンスの発表と内容が重複しない、はずです。。

    概要:2013年に NV Access が視覚障害者コミュニティの支援で PowerPoint 対応を実現して以来、NVDA は視覚に障害がある人の就労手段としてグローバルに支持されています。
    本セッションではビジネスツールとしての NVDA の機能を紹介しつつ、最近の NV Access や開発コミュニティ、 NVDA 日本語チームの活動を報告します。

    NVDA の Microsoft Office 対応や Windows 10 対応の最新情報を、この機会にまとめてお伝えしたいと思います。

    NVDA開発者会

    最後に、NVDAワールド2017開催日の午前に行う予定の「NVDA 開発者会」について補足します。
    いま NVDA 本家の開発コミュニティではいろいろな新しい動きがあって、NVDA の開発に興味がある人に伝えるべきことはとても増えています。
    2017.4 で Windows XP/Vista 対応を打ち切ることが決まり、新しい動きは本格化しました。
    開発に使われている Visual Studio のバージョンを 2015 から 2017 に上げること、各種の依存パッケージを更新すること、そして NVDA を Python 2.7 から Python 3 に移行させる作業が、これから2019年ごろまでに行われます。
    今回の開発者会では、まず Windows 環境で Python 2.7 と Python 3.6 を共存させる方法をご紹介します。
    これから1年か2年くらいの間 NVDA に関わるために必要な知識だと思うからです。
    それから、おそらく当日までに本家の移行が完了しているはずなので、Visual Studio 2017 Community を使う前提で NVDA (本家版および日本語版)のソースコードからの実行方法やビルド方法を紹介する予定です。
    日本語に対応していないことが課題になっている eSpeak や libLouis など音声合成エンジンや点訳エンジンなどの現状、ソースコードからの実行やテストの方法、開発コミュニティの動向などの情報も、時間の制約はありますがお伝えしたいと思います。
    点字ディスプレイなどふだん私が検証できない機材は、その場に持参いただければ、不具合の調査などができると思います。
    開発者会には NVDAワールド 2017 の connpass 申し込みで「開発者枠」でお申し込みください。