タグ: hiroshima

  • NVDA 2013.2jp の公開と OSC 広島(10月6日)など

    8月17日の「NVDAワールド2013横浜」を終えて、あっという間に1か月が過ぎました。
    開催の記録ページから録画などをご覧になれます。
    NVDA日本語チームのWebサイトでは写真を公開しています。
    NVDA日本語チームが行ってきたSkype会議は9月からSkype交流会として運営方法を改めました。
    9月13日にNVDA日本語版2013.2jpを公開しました。
    ダウンロードは i.nvda.jp から可能です。詳しくは NVDA 日本語版のサイト をご覧ください。
    10月6日(日曜)には広島市中区のサテライトキャンパス広島(広島県民文化センター)で開催されるオープンソースカンファレンス2013Hiroshimaに、「NVDAユーザ会広島」として参加します。
    13時00分からセミナーで登壇します。
    事前申し込み受付中です。
    ブースでの紹介もさせていただきます。(展示は16時終了です)
    8月のイベントでもお話しましたが、NVDA本家版はこれから1年間に4回のリリースを確実に行っていこうとして、システムがいろいろ見直されました。
    このバージョンアップに、日本語チームが継続的に参加することは、日本語独自版を継続してリリースする土台を作るために、大事なことです。
    去年から海外のNVDA関係者といろいろ交流してきましたが、多くの国や言語で、私のような晴眼者ではなく、NVDAを必要としているユーザーたちが、NVDAの発展を支えています。
    日本で NVDA ユーザー自身が NVDA の翻訳を担当してくださる状態を作ることは、日本のNVDAコミュニティを世界の常識に合わせる(本当は「戻す」なのですが)ためにも、私が次のステップの活動に専念するためにも、必要と思っています。
    他の国では、ひとつの言語について翻訳チームの担当者が2人か3人いて、ユーザーインターフェースの po ファイルを翻訳する人、ユーザーガイドを担当する人、新機能 (changes) を担当する人、といった感じで分担をすることが多いようです。
    このように分担ができれば、1年に4回バージョンアップしても、1人の負担は小さくなります。
    そのような体制をつくるために人材の育成が必要と思いはじめました。
    いわば「NVDA 翻訳者養成塾」を開くことを考えています。
    日本のNVDAユーザーに「英語」「バージョン管理ツール」「テキストエディタと poedit の操作」のスキルを持っていただくために何ができるのか、具体的に考え始めています。
    10月6日の OSC 広島は、この「NVDA 翻訳者養成塾」についてお話をする最初の機会だと思い、出展内容のキーワードを「デスクトップ」「翻訳」「教育」にしました。
    皆様のご来場をお待ちしています。よろしくお願いします。

  • すごい広島 #4 で Twitter API の勉強

    すごい広島とは 広島のエンジニアやウェブデザイナーが毎週集まって、 もくもくしたり Hackしたり 読書したり する場所です。
    ということで、今週は第4回でした。
    NVDA の作業をしようかと思ったのですが、たまたま Twitter API 1.0 が今日終了したということで、あちこちでソフトやサービスが動かなくなったという話を聞き、久しぶりに Twitter API の勉強をしました。
    よく考えたら、Twitter API はなんどか使ったことがあるのでした。最初に勉強したのは Twitter4r という Ruby のライブラリでした。。
    まずは Apigee で Twitter API 1.1 を叩いてみます。OAuth 認証もやってくれて、JSON で情報が返ってきます。簡単ですね。。簡単すぎてつまらない。。
    The Qube というスクリーンリーダー対応の Twitter クライアントは Python で書かれていて Tweepy というライブラリに依存しているという話。
    なにかライブラリを試してみようか、ということで、調べたら Tweepy の他に Python Twitter というものが見つかりました。
    せっかくなので使ってみました
    が、タイムラインが取れて、ツイートができることは確認できたものの、GetFollowers などを使うと

    twitter.TwitterError: [{u’message’: u’Rate limit exceeded’, u’code’: 88}]

    になってしまい、うまくいかず。。
    そもそも Twitter で何をしたいのか深く考えてなかったので、久しぶりに音声対話アプリを書いてみました。
    書いたのはこんなコードです。
    Windows 8 でこのプログラムを起動して、「今日はWindowsで音声認識を使うプログラムを作りました」「コンピューターいまのをツイートして」といえば、Windows 内蔵の日本語音声認識と日本語音声合成で、下記のようにツイートができました。


    「コンピューターツイッターを読んで」といえばタイムラインを読んでくれます。
    Python でこういうライブラリを使うと HTTP も JSON も文字コード変換もほとんどお任せでいいから便利ですね。。
    静かな「もくもく作業の場」でひとりコンピューターに向かってしゃべり続けてしまい、すみませんでした。今度から突発的に音声認識アプリが書きたくなったときに備えて、常にヘッドセットを持参しようと思います。。
    最近は Mac OS X や Chrome ブラウザにも音声認識機能がついてたりしますが、Windows 8 はクラウドでなくコンピューターの中で音声認識と音声合成をしています。でも作ったものが Twitter アプリだから、やっぱりネットワークにつながってなくてはならないわけで、違いをアピールしにくいです。。
    今日は使いませんでしたが dragonfly – Python-based speech recognition framework – Google Project Hosting は SAPI と Dragon の音声認識APIラッパーらしいです。アプリケーションごとの音声コマンドのライブラリが充実している印象ですが、フレームワークがここまでやるとローカライズが大変かも。。
    ところで、今週土曜日にはNVDA広島勉強会を行います。よろしくお願いします。
    追記(6月14日)
    Twitter クライアントの Qube は無事に API 1.1 対応したそうです:

  • AngularJS と NVDA

    <htmlday> 2013 ということで AngularJS で遊ぼう という勉強会に参加しました。
    AngularJS は Web アプリケーション開発のフレームワークということで、簡潔に書けて保守性が高いのが特長、らしいです。
    しかし、生産性の高い開発手法という話を聞くと「それってアクセシビリティは大丈夫なの?」とつい思ってしまいます。
    そこで、angularjs.org のトップページのビデオで紹介されていた TODO アプリケーションのサンプルをスクリーンリーダー NVDA 日本語版 と Firefox の組み合わせで確認しました。
    書かれたマークアップは内部で標準的なHTMLに変換されているので、フォーカス移動などはちゃんとできるのですが、チェックボックスにフォーカスしたときに、その右側にある項目名を読み上げないので、何の操作をするチェックボックスなのかわかりません。
    ふと aria-labelledby でやればいいんじゃない? と思ったので、下記のように直したところ、うまくチェックボックスの項目名を読み上げるようになりました。
    最初は id をつけるために todos モデルに通し番号のプロパティを追加したのですが、後で $index という特殊プロパティがあることを教わったので、todo.js 側のコントローラーとモデルは書き換えないで実装できました。アクセシビリティのための処理が View だけで完結するのは素晴らしい。AngularJS なかなかよさそうなのでもうちょっと勉強してみたいと思います。
    <htmlday>とは、日本全国でWeb制作者/開発者向けのイベントを同日に開催することで、日本のWebを一層盛り上げようという「お祭り」だったそうで、私も貢献できればと思いブログを書きました。
    ちなみに広島市中心部は「とうかさん」というお祭りの季節です。。
    以下のソースでは bootstrap.cssUnderscore.js を使っています:

    <!doctype html>
    <html ng-app>
      <head>
        <script src="angular.js"></script>
        <script src="underscore.js"></script>
        <script src="todo.js"></script>
        <link rel="stylesheet" href="bootstrap/css/bootstrap.css">
        <link rel="stylesheet" href="todo.css">
      </head>
      <body>
        <h2>Todo</h2>
        <div ng-controller="TodoCtrl">
          <span>{{remaining()}} of {{todos.length}} remaining</span>
          [ <a href="" ng-click="archive()">archive</a> ]
          <ul>
            <li ng-repeat="todo in todos">
              <input aria-labelledby="label{{$index}}" type="checkbox" ng-model="todo.done">
              <span id="label{{$index}}">{{todo.text}}</span>
            </li>
          </ul>
          <form>
            <input type="text" ng-model="todoText"  size="30"
                   placeholder="add new todo here">
            <button ng-click="addTodo()"><i></i>Add</button>
          </form>
          <button ng-click="clearCompleted()"><i></i>Clear Completed</button>
        </div>
      </body>
    </html>
    // todo.js
    function TodoCtrl($scope) {
        $scope.todos = [
    	{text:'learn angular', done:true},
    	{text:'build an angular app', done:false}];
        $scope.addTodo = function() {
    	$scope.todos.push({text:$scope.todoText, done:false});
    	$scope.todoText = '';
        };
        $scope.remaining = function() {
    	var count = 0;
    	angular.forEach($scope.todos, function(todo) {
    	    count += todo.done ? 0 : 1;
    	});
    	return count;
        };
        $scope.archive = function() {
    	var oldTodos = $scope.todos;
    	$scope.todos = [];
    	angular.forEach(oldTodos, function(todo) {
    	    if (!todo.done) $scope.todos.push(todo);
    	});
        };
        $scope.clearCompleted = function() {
    	$scope.todos = _.filter($scope.todos, function(todo) {
    	    return !todo.done;
    	})
        };
    }