カテゴリー: ICT

  • 森友関係文章のPDFを文章にして比較する方法

    NHKがまとめページにて変更後と変更前PDFを公開した。

    https://www3.nhk.or.jp/news/special/moritomo_kakikae/

    北朝鮮関連とか、まとめページをつくってくれるようになった。NHKのWEBの中の人がんばってるよね。

     

    さて、森友関係については、いろいろ言いたいこともあるのだけど、まあ、いろいろな部分はおいておいて、無駄な労力をかける人たちが出る前に、ああ、既に一日経過しているので時遅しかもしれないけれども、変更前と変更後の文章の比較をおこなう方法を案内しておいたほうがよいように感じた。

     

     

    画像やPDFのテキスト化

    EvernoteやgoogleDriveを使えば自動でOCRしてくれるようになった。いい時代である。
    電子データを印刷して、わざわざ汚れたスキャナで取り込んで作ったようなデータでも、再電子テキスト化してくれるのである。

    やり方は簡単、ぶっこんで、開くだけである。一応やり方を書いておく。

    アップロードして右クリック、Googleドキュメントで開く。以上だ。

    こんな感じに上に画像。下にテキストが出る。

     

     

    くそ汚れた画像のテキスト化

    今回のような2ページ印刷されてたり、変なところに変な記号がはいっていたりすると、文字認識アルゴリズムがうまく動かないので、ページのスクリーンショットをとって画像にしてからOCRをかけることにする
    スクショは別に何使ってもいいけれども、winの場合はGreen shotをつかっているので一応案内しておく。

    http://www.vector.co.jp/soft/winnt/art/se505369.html

    問題文書。いきなり1つ目の文章がくそ汚い。
    汚すぎるのでPDFを拡大してから画像化する。

     

    ここまで汚れていると流出経路を特定するために、わざと汚しているのかもしれないけれども、酷いね。省庁って、もしかして、わら半紙にガリ版刷りなのかなと思う程度に酷い。

    ここまで汚いのは流石のgoogleさんも想定していないので、手前で画像的な加工が必要である。こういう汚れのときは画像編集ソフトでトーンカーブをつかおう。photoshopを使ってもいいが、うちみたいな貧乏人は無料のGIMPというフリーの画像編集ソフトもあるのでそれで案内する。photoshopでも編集方法は一緒ね。

     

    こういう汚れ系はトーンカーブを右上を上に、左下を下にすれば結構落とすことができる。線画とかからデジタル化したいときにつこーたらいいよ。ただ、今回みたいに文字の濃さと同じぐらい汚いと無理だね。ほんとなんだろうFAX?

     

    でも、ま、ひと手間でこれくらいにはなる。

    ちっとも読み取れなかったのが、まああとは文章修正ぐらいでなんとかなる程度には読み取れるようにはなった。

     

     

    変更部分比較

    あとはテキスト化した文章を比較すればいい。diffとかcompareって呼ばれる機能。んー。atomのコンペアのプラグイン入れてとかいうのは説明するのがしんどいので、懐かしのDFとかでどうだろう。

    https://www.vector.co.jp/soft/win95/util/se113286.html

     

    変更されている行を色違いで出力してくれる。

    ・・・。これじゃわかり難い?

     

    wordの変更履歴

    まあこんな事をしなくても、文章を作成した元の電子ファイルが残ってりゃ、変更履歴ボタンを押されていれば、いつ誰がどこを更新したかなんて残っているんだけどね。eガバメントってなんじゃったんだろうね。

     

    コード管理システム

    誰かがgithubにあげればいいじゃないと言っていたが、githubのようなコード管理システムをつかえば、今回のような誰が、いつ、なにを改変したんだかわからないようなことで混迷することもなかっただろう。プログラムはコードと呼ばれるが、法律もコードと呼ばれる。公文書はなんだかわからないけど。人間の法律はコンパイル通りそうもないよね。

     

    震災直後、写真に写り込んだ避難所の名簿を文字起こしするとかいう、ソーシャルな働きは価値があったと思う。今回も、PDFで公開された情報をgithubで市民団体とかが、登録したりして可読性を高めるとかいう動きはあってもいいかもしれない、が、そもそもが、無駄なことだと考えると残念でしかない。オープンデータとして提供されていれば、とか、もっといろいろできることもあろうに残念だ。

     

    ドイツ連邦の法律がGitHubで管理されるようになったってお話しは、もうずいぶんと昔のニュースであったように思う。gitとかで管理されていれば履歴を追うことも、どこが変更されているかも、誰が変更したかも追うことができる。

    https://github.com/bundestag/gesetze

    右上のコミットログに表示されるように文章のフィンガープリント(指紋の意味ね)もあるので、誰かが悪意をもって差し替えるには、ちと困難なようになっている。文章の内容をシードにMD5などで暗号化(ハッシュ化)をおこなった結果なので、内容を書き換えると結果の暗号化も変わってしまうわけだ。

    これらの暗号は文章を種に生成した不可逆なもので、暗号を複号しても文章にはできないが、同じ文章からは同じ暗号ができあがる。ま、言ってみれば、ある文章を15文字おきに拾い読みしたら同じ文章からは同じ文字列ができあがるよねみたいなもの。するってぇと、つまり、内容を秘匿にしたままフィンガープリントだけは公開しても、いいよねっていう運用ができる。

     

    ちなみにこのようなテクノロジーは15~6年も昔からある技術である。ハッシュ値をさらにシードにしてチェーン化すれば、内容の連続性担保できるし、さらにそれを公開台帳に記しておけばいいんじゃねというブロックチェーン技術は、こういうところに根ざしている。ブロックチェーンだって技術的には7~8年ぐらい前のお話しだ。

    話しがそれた。

    で、今の技術で何ができるか。

    電子化して誰かがつくった書類をわざわざ印刷して、押印して、さらに電子化するとかいうお役所仕事がなされている。で、なにかがおきたときにはどこにあるんだかわからないとか、俺の原本は108種類あるぞ!的なことがなされるわけだし、検証も労力がかかって無駄である。無駄である。無駄である。無駄である。無駄無駄無駄ァァアアァァアアアア!

     

    無用の用と呼ぶには、あまりにも。やらなくてもいい仕事をやって仕事を増やす。よくないよね。

    誰かの仕事がヘリますように。

  • 2017Resasハッカソン@電通大

    一年に一回ぐらいはハッカソンに参加しようとおもってはいます。できるかは別。
    Resasっていう政府統計のビジュアライゼーションをするサイトがあるのだけど、これに絡んだハッカソンに参加してきました。調布の電気通信大学での開催です。

     

    【内閣府主催】RESASハッカソン2017 in 東京 ~IoTで創る東京のミライ~
    RESASやIoT等による地域ビッグデータを利用して東京の「ミライ」のためのサービスを作ろう!
    https://connpass.com/event/67436/
    https://resas.go.jp/

     

    去年もこれに参加していて、地域の価値を大都市との物理距離と経済距離をぶつけて散布を書くみたいなめっちゃ統計に偏ったハックだったのだけれども、「去年は何したの」と聞かれて調べるまで、欠片も覚えてなかった。日記がわりのブログメモ大事。
    http://kuippa.com/blog/%E5%9C%B0%E6%96%B9%E5%89%B5%E7%94%9F%E3%81%A8resas-%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3/

     

    なので、今年もなにをやったかは書いておこう。

    今年は概念をハックとかふわっとしている感じで、言語化むずす、頭の中の整理必要かも。

     

    経緯

    チームビルド集まった面子四人で楽しくやろうやとなり、選択肢が複数でたときは、どうなるか想像できない難しいのをやろうというむちゃ指針が決まる。

     

    自由になりたいそうな。

    じゃぁ何に縛られてるのかとかいう話しになり、リストに「重力」などと書くものあり。重力からも自由になるという発想を得たことで、当たり前になりすぎたものはそれに束縛されているとも認識できないほど、縛られるものなのだね。では、常識やステレオタイプをぶっ壊すには何が必要だろうか?何を壊せばよいのだろうか?

     

    単位をぶっ壊そう。

    あたらしいモノサシを得ようという話しになった。度量衡を制覇しよう。

     

    昼飯を食いにエレベーターで移動するときに、エレベータの移動に必要なのは滑車を回すハムスター何匹分なんだろうねなどという談笑。すべての単位をハムスターで換算するかなど。どんな単位をぶっ壊せばいいかについて議論。システム開発のとき人の仕事を人月で表し、価格で評価するけれども、あいつの人月とこいつの人月はアウトプットがちがうのに同一尺度で評価している。だったらいっそハムスター何匹分とかで表しても一緒なでのはないか。

     

     

    まだ定量化されていないクリエイティブの単位をつくろう。

    クリエイティブの最小単位は何で計れるかについて考える。幼稚園児の紙粘土など。表現が固定されたもの。誰かしらの表現をみたものが、それらを見た人に与える影響などで計れるのではないか。心拍数や表情の変化、動歩行の変化など。

     

    あーじゃないこーじゃないというブレストを経て、実現可能なレベルにおとしこみ。

    タイトルは「重力からのクリ」もう、タイトルからしてようわからん。

    クリが10クリあつまれば、徳利で日本酒に変換できるなど。まあ、おふざけがほどよいハック。

     

    つくったもの

    クリエイティブだなと評価したときに「クリ」というポイントを譲渡できる仕組み。

    「クリ」が誰から誰にわたってきたかという記録がのこっているブロックチェーン(ボトルメール)のイメージ。

     

    「クリ」を得る仕組みは2系統あり、環境からえるものと誰かから譲渡されるもの。

    環境から得る仕組みは、ギャラリーやライブ会場にカメラを設置して、入場者が入ったときと出てったときで閲覧者の感情が変化していれば、表現者にクリを発行。これは、web camで表情認識(C#、Azure、コグニティブ、人感センサー、カメラ)で拾うことで実装された。(サーバー連携まではいけなかった)

     

    譲渡系は、自分のスマホにはいっている特定の「クリ」のQRコードを相手のスマホが覗くとその「クリ」が移動する仕組み。(iPhoneネイティブアプリ[言語なんだったんだろ?]、サーバー側:Cloud9、ruby sinatra)

     

    クリにはひとつひとつにユニークなIDが振られていて、ユーザにもIDが振られいてるので、それらの「クリ」が誰から誰に付与されて、どういう変遷を辿ったのか、どのユーザー間でやり取りが盛んなのか、どこで相互評価しあうクラスタができているのかなどをForce-directed graph(d3js)のちょい弄ったもので描画。また、クリの譲渡時にスマホから緯度経度をもっているので、移動状況を地図(google map)に表示。最後の表示系の担当。

     

    URL等でみせられるものはありません・・・。今回はスクショものこしてないやw

    コードも汚いやっつけで書いたので多分もう開いても追う気はおきないな。

     

    どんな風につかわれることを想定したのか

    Resasのような統計情報を利用したハックというよりは、これから定量化する情報を集めるための仕組み。
    例えば、街の通りなどにカメラを設置して、この通りはクリの集まりが低いね。高いねなどと、記録されていくことで、その他の統計値となんらかの相関が見えるようになるかもしれない。起業率や、過疎率などに生きてくるのではないか。

     

    また、だれがだれを評価したのかのような流れも追えるので、ハブとなるクリエイターがどこにいて、地域をどのように流入しているのか、もしくは転出しているのかもわかり、ここに効いてくる超精密ターゲッティング施策もできる。

    単に芸術的なクリエイティビティを推し量るだけじゃなくて、旅館のホスピタリティを評価することでその循環を追ったりできるようにんり、定量化が困難だったものが見えるようになるんじゃないかな。とか、まあ、審査員からは概念だねと言われた感じ。

     

    そのほか

    この、クリ値については、いろいろ思うところもあるし、審査員さんにはICOとかのことも教えてもらったし、これまでに考えてきた部分もあるので、ちゃんと考えてみたいね。

     

    このハッカソンの裏でエイベックスのハッカソンをやっていたらしく、なんか世間のハッカソン好きはそっちに流れて盛り上がってたみたいで羨ましい感じです。どこかのハッカソンイベントから2日目流れてきたひとが、こっちは地味だねとつぶやいていました。

    avex-xRハッカソン(VR/AR/MR)
    https://entertech.connpass.com/event/69545/

     

    電通大な感じの質実な感じのハッカソン。

    いくまえは内閣府と内閣官房の区別がついていなかったのだけれども、少しだけ賢くなりました。

    でもいまだにどっちがどっちだかはわからない。

  • macOS SierraでKarabinerが効かなくなったのでhammerspoon

    技術ブログを無くしたのでちょっと場違い感すごいけどここに書くね。

    USBでwindowsのキーボードを使っているのだけど、mac OSをSierraにあげたらKey Configの設定で使っていたKarabinerが効かなくなってしまったんだよ。

    どうしたらいいのかとプログラマーズカフェで訪ねたらhammerspoonつかえばいいよと教えてもらったので、ちょっとluaを書いてみることにしたんだよ。

    luaなんてラグナロクオンラインでホムンクルスのAIを書いて以来。さっぱり覚えてなくてどったんばったん大騒ぎ。

    ググればそのものが出てくるかとおもったらみんな[esc]に割り当ててたりキーボードのイベントハンドラーをつかってたりして、ハンドリングしたあとのいべんとキャンセルの仕方がわからなかったしてちょっと目的と違って。こまったねー。

     

    hs.hotkey.bindを使って書き直してみたので貼っておくね。homeキーとendキーのも挙動が嫌いなので書いておいたよ。

    hs.hotkey.bind({}, vk_home, keyStroke({"cmd"}, vk_Left), {}, {})

    みたいな書き方ができなくてちょっとまあ動けばいいか的になってるけどご愛嬌ね。

    hammerspoonは

    http://www.hammerspoon.org/

    ここからダウンロードできるよ。

    Preferencesをひらいてloginしたときに起動するようにしたら、config開いて、下記の内容に編集して、Reloadだよ。これなら内容がよくわからなくてもできるね!すごいね!

    一応ESCのキーコードも書いておいたのでバックスラッシュじゃないのがいいっていうフレンズはvk_escにおきかえるといいよ。こういうのを弄るのが得意なフレンズがいたらあとはよろしくおねがいね。

     

    local vk_jis_eisuu = 0x66
    local vk_jis_kana = 0x68
    local vk_backslash = 0x32
    local vk_esc = 0x35
    local vk_home = 0x73
    local vk_end = 0x77
    local vk_Right = 0x7c
    local vk_Left = 0x7b
    local isKanaMode = false
    
    local function keyStroke(modifiers, character)
        hs.eventtap.keyStroke(modifiers, character)
    end
    
    HomeKey = function()
        keyStroke({"cmd"}, vk_Left)
    end
    ShiftHomeKey = function()
        keyStroke({"shift","cmd"}, vk_Left)
    end
    EndKey = function()
        keyStroke({"cmd"}, vk_Right)
    end
    ShiftEndKey = function()
        keyStroke({"shift","cmd"}, vk_Right)
    end
    KanaKey = function()
        if isKanaMode then
            keyStroke({}, vk_jis_eisuu)
            isKanaMode = false
        else
            keyStroke({}, vk_jis_kana)
            isKanaMode = true
        end
    end
    hs.hotkey.bind({}, vk_backslash, KanaKey, {}, {})
    hs.hotkey.bind({}, vk_home, HomeKey, {}, {})
    hs.hotkey.bind({"shift"}, vk_home, ShiftHomeKey, {}, {})
    hs.hotkey.bind({}, vk_end, EndKey, {}, {})
    hs.hotkey.bind({"shift"}, vk_end, ShiftEndKey, {}, {})