2018年 02月の投稿を表示しています

視認しにくいテキストを探す | その 2 puppeteer を使って任意の web サイト上のテキストに対して色差を計算する

前回は色差を計算する方法の簡単な紹介と chroma.js を使った計算について扱いました。
視認しにくいテキストを探す | その 1 chroma.js を使って色差を計算する | ごみばこいん Blog

今回は実践編として、特定の Web ページに対して色差を計算して「視認しにくいテキストを探す」ことをやります。

Web ページに対して色を確認するには、キャプチャしたものから気合で探すか、 CSS の結果を持って確認するか考えられそう。ここでは後者を puppeteer でやってみます。
puppeteer は以前紹介したとおり、 Headless Chrome を Node.js からお手軽に扱うためのものです。
Node.js から Headless Chrome を操作できる puppeteer を試す | ごみばこいん Blog

ページを読み込んで色差を計算するためにこんなコードを書きました。

// ブラウザの起動
const browser = await puppeteer.launch();
const page = await browser.newPage();
page.setViewport({
    width: 1600,
    height: 900,
})

// デバッグ用に console.log を nodejs 側に渡す
page.on('console', msg => console.log(msg.text()));

// サイトにアクセスする
await page.goto('https://gomiba.co.in/test/color_difference.html');

// 色差を計算するために chroma をページ内で読み込む
await page.addScriptTag({
    url: 'https://cdnjs.cloudflare.com/ajax/libs/chroma-js/1.3.6/chroma.min.js',
});

// 色差が一定以上のものを探す
await page.evaluate(() => {
    // 全要素を探索していく
    document.querySelectorAll('*').forEach((element) => {
        // テキストノード、または SVG を子に持っている要素を探す
        let foundChildNode = Array.prototype.filter.call(element.childNodes, (e) => {
            let status = false;
            status = status || (e.nodeType === Node.TEXT_NODE && e.textContent.trim().length > 0);
            status = status || e.nodeName.toLowerCase() === 'svg';
            return status;
        });
        if (foundChildNode.length === 0) {
            return;
        }

        // 計算されたスタイルから色を取得
        let elementStyle = window.getComputedStyle(element);
        let fontColor = elementStyle.color;
        let backgroundColor = elementStyle.backgroundColor;

        // 色差を計算する
        let colorDiff = chroma.deltaE(fontColor, backgroundColor);

        // 計算された色差に透明度の色差を加える(透明度の差分 * 0.5 * 100)
        colorDiff += (Math.abs(chroma(fontColor).alpha() - chroma(backgroundColor).alpha()) * 0.5) * 100;

        // 色差が大きいものは無視
        if (colorDiff > 40) {
            return;
        }

        // 色差が小さいものに色付けをする
        console.log(element.nodeName + " : " + colorDiff)
        element.style.cssText = element.style.cssText + 'border: 5px dashed red !important;';
    });
});


// スクリーンショットを撮ってみる
await page.screenshot({path: 'example.png'});


// ブラウザを終了する
await browser.close();

puppeteer の playground がオンラインで提供されているので、コピペで動作確認できるはず、お試しあれ。
Try Puppeteer

手元に Node.js の環境があるなら、こちらのリポジトリでも。コマンドライン引数で対象 URL とキャプチャの保存するファイル名を受け取って、マーカーが引かれたキャプチャ画像が出力されます。
sters/web-color-difference

たとえば medium でやってみるとこんな感じ。白背景の部分で、薄めグレーの箇所ががマークされている。

たとえば、ランダムに色を設定するページを用意して試してみるとこんな具合。

確かに見にくい!!!なものはマークされているようだけど、ちょっと怪しいライン。もうちょっと基準値を調整したり CIEDE2000 のロジックも試すかなどして詰めたほうがいいかも…?とりあえず、のところはこれでもいいんじゃなかろーか。
元々やりたかった「視認しにくいテキストを探す」は出来たとしておしまい。

…と思ったけど、視認しにくいテキストっていうと話題が広いな、小さすぎる文字とか他の要素と被っているとかそういうのもそうなんだよねきっと、うーん。

よく作るお弁当レシピの

以前、日頃のお弁当をどのようにして作っていっているかを書きました。
お弁当戦略 | ごみばこいん Blog

今回はその中でも、普段よく作るやつを紹介します。写真を併記したいところだけどそんなに頻繁にパシャコンしないので無しで。

冷凍コンテンツ

  • 前提として、お弁当を食べる直前にレンチンする必要があります
    • 解凍した状態では水分が出るものもあるので、朝解凍!は危険です

ほうれん草のおひたし

  1. ほうれん草を1袋用意します
  2. 洗います
    • ボウルに水をいれ、茎を持って、根本をジャバジャバします
    • 砂がよく出るので、様子を見ながら 2-3 回くらい繰り返す
  3. 土付きのものなら根本は切る
  4. 水を沸騰させた鍋、もしくはフライパンに突っ込んで、茹でる
    • 軽く塩振ってもいいですし、なくてもいいです
  5. 1分を目安に茹でたら、まな板に取り出す
  6. 広げて、ふーふーして、3-5cm ほどに切る
    • 人差し指の長さの 5-7割 くらいと考えたほうがいいかも
    • このサイズ感よく使う
  7. 手でギューーーっと握ってしぼり、ボウルに入れておく
  8. ボウルに 醤油 小さじ1~2 と 和風だし小さじ1~2 を入れる
  9. ボウルをぐるぐるかき混ぜる
  10. 適宜味見をして、好きな味になれば出来上がり

アレンジ:ボウルを使いたくない

  1. しぼるところまで同じ
  2. しぼったらシリコンカップに詰める
  3. ほうれん草の全体にしみる用に、少量のめんつゆを上からかける
  4. 上に少量のかつおぶしをふりかける
  5. 完成

アレンジ:ごま和えの味付け

  1. しぼるところまで同じ
  2. 醤油と和風だしの量を少し減らし、ごまを好きなだけ、ごま油を少量いれる
  3. ボウルでぐるぐる

アレンジ:他の葉っぱを使う

  • ほうれん草ではなく小松菜を利用することも
    • 食べ比べでもしないと、ぼくはそんなにわかんないです
  • 時期によっては春菊もあり
    • 葉っぱ感が増す
  • 試してないけど菜花とか水菜もよさそう

エリンギベーコン炒めペペロンチーノ風

  1. エリンギ、ベーコンを1パックずつ用意
  2. 3-5cm くらいに切る
    • エリンギは根本をちょっと切り捨ててる
    • やや細長めの面積ちょっと広めにきると食べやすい
  3. オリーブオイルをフライパンに入れて火をつける
    • 嫌いじゃなければにんにくのみじん切りを少量入れると良い
    • 嫌いじゃなければトウガラシをふりかけるか、鷹の爪のみじん切りを少量いれると良い
    • イメージはペペロンチーノ
  4. エリンギとベーコンをフライパンに入れ、炒める
  5. 塩をひとつまみしてふりかける
  6. ベーコンがちょっとカリカリしたら出来上がり

アレンジ:素材を変える

  • ベーコンではなくハムにする
  • シメジを加える
    • シイタケ、エノキあたりは避けたほうが無難かも?試してない

きのこ煮

  1. マイタケ、シメジ、エノキを1パックずつ用意
  2. 石づきを切り落とし、細かくわける
  3. 鍋に全て入れる、中火くらい
  4. 鍋に 料理酒 大さじ2 、 醤油 大さじ1 、みりん大さじ1 、 和風だし小さじ1 を入れる
    • ぶっちゃけ分量は適当でも、入れすぎなければいい
    • 味見しつつ濃くするのがオススメ
  5. 水分感がなくなるくらいまで、しばらくグツグツし続ける
    • 調味料の水分感→きのこ成分のぬめり感→水分感がなくなってくる、みたいな流れ
  6. 味見しつつ、好きなタイミングで出来上がり

アレンジ:いろいろなきのこ

  • シイタケ、エリンギもあり
    • エリンギは肉感があるが、サイズが違うので切ろう
  • 他のきのこはそもそもあまり買ってないのでわからん

れんこんきんぴら

  1. レンコンを用意
  2. レンコンをあらう
  3. レンコンの皮を切る
  4. レンコンを適当に切る(2-3mmくらいの薄さ、円を上下左右に4分するといい)
    • 切ったレンコンは水に小さじ1くらいの酢を入れたものにつけるといい(アク抜きらしい)
  5. ごま油をフライパンにちょっと引いて炒める
  6. レンコンがちょっと透ける感じでてきたら醤油を小さじ1くらい入れる
  7. 白ごまを振る
  8. 味見して好きなタイミングで出来上がり

アレンジ:ゴボウでも。

  • 全く同じ作り方でゴボウでも美味しい
    • ゴボウはアルミホイルを巻いてガッシガッシ洗うといい

ちくわマヨ一味

  1. ちくわとマヨネーズ、一味唐辛子を用意
  2. ちくわを 3-5mm くらいに切る
  3. 油をひかないで、ちくわを炒める
  4. 焼き目がちょっと付いてきたらマヨネーズを絡めて混ぜる
  5. マヨネーズが絡んだら一味唐辛子を振る
  6. 味見しながら好きなタイミングで出来上がり

アレンジ:マヨ一味多重化

  • マヨ→一味→マヨ→一味→…
    • ちくわの周りにマヨ一味層が出来る

アレンジ:七味

  • 一味ではなく七味を使うと風味感アップ
  • 一味は辛味が強めなので、多重化ミックスも良し

卵焼き

  1. 卵、和風だし、醤油、砂糖、片栗粉、マヨネーズを用意
  2. 卵をかき混ぜる
    • 先に白身を切るようにする→白身が切れてきたら黄身も合わせてグルグル
  3. 和風だしを小さじ1、醤油を小さじ1、砂糖を小さじ1くらい入れる
  4. 片栗粉を小さじ1、マヨネーズを小さじ1入れる
    • 卵は2,3個の時。
    • 片栗粉とマヨネーズは冷凍しても美味しく食べられる用にするため
  5. たまご焼き用フライパンにサラダ油をひいて温める
  6. 弱火にする
  7. 卵液がうすーく全体に行き渡るくらい入れる
  8. 奥から手前にくるくる巻いていく
  9. 手前まで巻いたら奥に持っていって、卵液を追加する
    • 焼けた卵の下にも卵液を入れること
  10. 適当な大きさまで繰り返したら出来上がり

アレンジ:卵焼きの中に何かを入れる

  • カニカマ、きゅうり、桜えび…。
  • ぼくは卵焼きを食べたいので、何かを入れるってのはちょっと分からないですね…

ナス・ピーマン

  1. なす、ピーマン、味噌
  2. ナスを適当に切る、水に付けておく
  3. ピーマンを同じくらいの大きさで切る、種は除く
  4. 味噌を少量の料理酒で溶いて、おいておく
  5. フライパンにサラダ油をひく
  6. なすとピーマンを炒める
  7. 味噌料理酒を入れて混ぜる
  8. 水分が飛んだら出来上がり

アレンジ:素材を変える

  • ズッキーニがめちゃオススメで美味しい

アレンジ:味付けを変える

  • 塩 → シンプルイズベスト
  • 醤油 → 味噌にあきてきたなあ
  • シャンタン、ウェイパー → ザ・中華

にんじんグラッセ

  1. にんじん、バター
  2. にんじんを適当なサイズに切る
  3. 様子を見ながらレンチン 600W で 5-10分。
  4. フライパンににんじんを移す
  5. バターを小さじ1~を投入
  6. 塩、砂糖を入れて出来上がり
    • ちょっと甘めにするのがオススメ
  7. 余談だけどシリコンカップがバター成分でデロデロするので洗いにくいと不評

いもマッシュ

  1. 皮をむく
  2. レンチン
  3. マッシュ
  4. さつまいも系、じゃがいも系は経験済み
    • さつまいもは砂糖をちょっと入れると良い
  5. 長いも系、煮物系コンテンツにすると良さそう
    • 和風だしがよく似合う

ハンバーグ

  1. 鳥豚牛の好きなひき肉を用意
    • オススメは鶏胸肉をフードプロセッサーにかけたやつ
  2. 好みに応じて以下を追加して混ぜる
    • 玉ねぎ、豆腐、パン粉、牛乳、卵
    • ハンバーグ自体にちょっと味付けがあるといい:塩コショウ or 醤油 or 味噌
  3. フライパンに油をひいてあっためる
  4. フライパンを弱火に。
  5. スプーンを駆使して1口大くらいの小判型にして、フライパンに投下
  6. どんどんフライパンに投下しながら、焼けてきたものはひっくり返して両面焼く
  7. 出来上がり
    • 味付けが薄めならケチャップ+お好みソースでハンバーグソースを作ってかける

アレンジ:ナゲット風

  • 鶏肉系を利用する(むね肉推奨)
  • 小麦粉を加える
  • 少し多めの油で、揚げるようなイメージで焼く
  • 肉に塩コショウだけで良い味でる

アレンジ:和風肉団子

  • 肉をこねこねするところまで同じ
    • 肉以外の具材としてはネギくらいかなあ
    • レンコンとかもいいかも
  • 鍋でお湯を沸かして、丸めて茹でる

アレンジ:ミートボール

  • 鶏肉系を利用する(むね肉推奨)
  • 丸めて茹でる
  • ケチャップ + お好みソース + 砂糖 + 醤油 + 片栗粉 を煮詰めてソースを作る

その他:とりあえず炒めてみようぜ

  • レシピとか何も考えずにざっくりと適当に炒めてみるときもある。
  • 肉+玉ねぎ
    • 豚丼、牛丼の上みたいなイメージ
    • 醤油、砂糖、和風だし
  • 肉+きのこ
    • きのこの旨味がしゅごいので塩でもいい
    • シイタケかシメジがオススメ
  • おさかなソーセージ
    • ごま油と塩がいい
  • ベーコン+夏野菜系
    • 普通にウマイでしょ
    • 塩でも醤油でもイケるが味噌はちょっと微妙
  • にんじん+たまご
    • にんじんしりしりみたいなやつ
    • シーチキンを足したらにんじんしりしり
    • 塩か醤油で

冷凍しないコンテンツ

浅漬け

  1. 小さいポリ袋を用意
  2. 白菜、キャベツ、きゅうりなどそのあたりの野菜を好きなだけ用意
  3. 適当な大きさに切る
  4. ポリ袋に入れる
  5. きゅうり1本分で、塩、和風だしを小さじ1入れる
    • ※薄味気味にしてあとで足すほうが良い
  6. ポリ袋をぎゅーーーとキツめに縛る
    • 野菜が圧縮されるような感じ
  7. 数時間~2日くらいで好きな時間寝かせれば出来上がり

ポテサラ

  1. じゃがいも系の何か、混ぜたいもの、マヨネーズを用意
  2. じゃがいもは皮を向いて、適当にざっくりと切って、ボウルに入れて、ちょっと水いれて、レップしてレンチン
    • 600W で様子を見ながら 5分~10分
  3. ホクホクしたらフォークやマッシャーを使って好きな状態まで崩す
  4. マヨネーズを好きなだけ入れる
    • 酢をちょっと入れるとサラダ感アップ
    • ごま油をちょっと入れると酒のツマミにも行ける
  5. 混ぜたい具材を入れる
  6. まぜまぜして出来上がり

アレンジ:ジャーマンポテト

  • じゃがいもがホクホクしたタイミングでフライパンで炒める
    • サラダ油をひく。
  • 塩コショウして出来上がり

アレンジ:マッシュポテト

  • じゃがいもがホクホクしたタイミングで、マッシャーを使ってトコトン潰す
  • 牛乳をちょっとずつ足しながら混ぜる
  • 好きなねっとり感になったら塩コショウして出来上がり
  • マッシュポテトは冷凍可

かぼちゃ煮

  1. かぼちゃを1口大くらいに切る
  2. ボウルに和風だし小さじ1、醤油大さじ1、料理酒大さじ1くらいいれる
    • かぼちゃ 1/2 個くらい
  3. かぼちゃを入れる
  4. クッキングシートなどで落し蓋をしておく
  5. 300W で 10 分とか、5,600W でやるならちょっとずつ様子を見てレンチン
  6. 箸でぶっ刺しでホクホクしてたら出来上がり

カレー

  1. じゃがいも、にんじんは皮を剥いてレンチン
  2. 豚バラ肉は薄切りで(好みによるので適当に)
  3. 玉ねぎは皮を剥いて、適当に切る
  4. シャトルシェフ(※)に突っ込む
  5. カレールーの分量の 2/3 くらいの水を入れる
  6. ひと煮立ちしたら、アクを取ってから、容器にしまう
  7. 数時間放置したら出して、カレールーを溶かして出来上がり

※シャトルシェフ = めっちゃ保温する鍋、放置できるのでむっちゃ便利

シャトルシェフのしくみ・使い方・メリット | サーモス 魔法びんのパイオニア

アレンジ:キーマカレー

  • 肉をひき肉にする
  • 水の量をめっちゃ少なくする
  • 「炒め煮」なイメージ(炒めるけど水分多くてさ、みたいな)
  • スパイスを追加するなどするとキーマ感出て良い

アレンジ:シチュー

  • 肉は鶏もも肉にすると良い
  • 水は分量の半分くらい
  • ルーを溶かしたあとに牛乳を入れる

アレンジ:肉じゃが

  • じゃがいもは大きめに切り、しらたきを追加すると良い
  • 水は全体が浸かるくらい。あるいは 7-8 割浸からせて落し蓋
  • 適当にお砂糖醤油和風だしを入れる(大さじ1ずつくらい)
  • ひと煮立ちしたら、アクを取り、容器にしまう
  • 好きなだけ放置したら出来上がり
    • 味見して、好みに応じて色々追加
      • 塩気が欲しければ醤油
      • 甘みが欲しければみりん
      • コク、深みが足りなければ和風だしor料理酒
      • わからなかったら料理酒をちょっと

アレンジ:筑前煮

  • じゃがいもを里芋に、豚肉を鶏肉に、玉ねぎは無し
  • ごぼう、こんにゃく、しいたけを追加
  • あとは肉じゃがと同じ流れで OK

他のレシピをやるようになったらまた書こうと思う。

視認しにくいテキストを探す | その 1 chroma.js を使って色差を計算する

SEO が云々でも色被ってるの良くないよねっていうけど、いや普通にユーザビリティ悪いやん、適当に色選ぶと見にくいこと往々にしてあるやん、って思ったので、そういう何かがあるのかなあって思って調べたら、 Wikipedia 先生にそのまんまの項目が記載されていた。ので、これをまとめつつ、ライブラリがあったのでそれを使ってみる話。

数式、もといロジックをざっくり読んでみる編

前提として Wikipedia のものをガンガン鵜呑みにしていく。
数式とかなんでそうなの?みたいな理解はせず、そういうものがあるんだなーくらいに留める。

色差を計算するには?

Wikiepedia に色差というページがあって、もうこれ。英語版と微妙に内容が違うけど、それは後で触れる。

色差 - Wikipedia

色差を計算するには単純に距離を計算しては、人間の感覚とはだいぶずれてしまってだめ。どうやら CIEDE2000 というものを使うとよいらしい。 CIE は国際照明委員会のことで DE は Delta E だ。2000 は年代。1976 、 1994 と研究され数式が更新されている。で、この CIEDE2000 を計算するには Lab 色空間を使う必要がある。
ただ、ぼくらが普段生きている世界では RGB とか CMYK とか HSV とか HSL とかなので、そこから変換をしてあげないといけない。いや、デザイナーさんとかその手のグラフィック関連に詳しい人なら Lab の世界でも生きているのかもしれない。

(参考)
カラーネーム/RGB/HSL ウェブでのカラー指定いろいろ | アライドアーキテクツのクリエイターブログ

Lab 色空間に生きたい

Lab 色空間も Wikipedia 上にページがある。

Lab色空間 - Wikipedia

単に Lab というと Hunter と CIE の 2 種類があるが CIE の方を最近では指すらしいので、これを使ったらいいみたい。これまた国際照明委員会が決めたもので、明度( L )と、いい感じの色 a と b を使って示し、人間の目で見える全ての色を記述できて機器固有の基準として使えるようにしたものだそうだ。

RGB からどうやって Lab に変換するんだろうねっていうと、 RGB は機器固有の部分があるので、一発変換!とはできず、 RGB を XYZ 色空間 に変換する必要がある。

RGB の世界から XYZ の世界へ移動する

これまた Wikipedia 上にページがある。

CIE 1931 色空間 - Wikipedia

すげーざっくりの理解では「研究成果の結果、 RGB に対する人の感覚を重み付けしたもの」。

ここまでをまとめると?

RGB → XYZ → Lab → 色差が計算できる!

後に回した英語との差分って?

色差の英語版のページを見てみる。
Color difference - Wikipedia

すると「 CMC l:c (1984) 」という日本語にはない数式が出ている。なんか良いやつなんじゃないかな、きっと。色っぽい単語で調べてたらその手の調査したよって論文もでてきた。

DDCPにおける色域外特色近似再現のための色差式評価

優位性とか書いてあるので気になった時に読むとよさそうな気がする。

ライブラリの出番です chroma.js

こう研究された成果があるわけなので、まあきっと便利に使えるようにライブラリ作っている人とかいるんだろうなあ~~とか思っているとやっぱりある。

chroma.js api docs!

色関係の話題をいい感じに取り扱ってくれるライブラリだそうで、各種色空間の変換も任せろ、グラデーションも任せろ、な強いライブラリ。

chroma.js を使って色差を計算する

単純な距離、ユークリッド距離の計算をするには chroma.distance を使う。 mode パラメータで色空間の指定が出来るので、2つの色の間の位相をみたりなんかにもできそうだ。
色差を計算するには chroma.deltaE を使う。ご丁寧に deltaE という命名になっててわかりやすいぞ~。内部的には CMC を使っているらしい。 CIEDE じゃないんだ。

それを実際に試してみようってわけで、こんな HTML + JS を書いて様子を見てみる。

<script src="https://cdnjs.cloudflare.com/ajax/libs/chroma-js/1.3.6/chroma.min.js"></script>

<style>
.color-difference td {
    min-width: 15px;
    min-height: 15px;
    padding: 3px;
}
</style>

<table class="color-difference">
    <tr>
        <td></td>
        <td></td>
        <td>distance(RGB)</td>
        <td>deltaE</td>
    </tr>
</table>

<script>
let colors = [
    ['rgb(255,0,0)', 'rgb(0,255,0)'],
    ['rgb(255,0,0)', 'rgb(0,0,255)'],
    ['rgb(255,0,0)', 'rgb(255,255,0)'],
    ['rgb(255,0,0)', 'rgb(255,0,255)'],
    ['rgb(255,0,0)', 'rgb(0,255,255)'],
    ['rgb(255,0,0)', 'rgb(255,128,0)'],
    ['rgb(255,0,0)', 'rgb(255,0,128)'],
    ['rgb(255,0,0)', 'rgb(255,255,255)'],
    ['rgb(255,255,0)', 'rgb(255,0,255)'],
    ['rgb(255,255,0)', 'rgb(0,255,255)'],
    ['rgb(255,255,0)', 'rgb(255,255,255)'],
];

let table = document.querySelector('.color-difference');

colors.forEach((color) => {
    let tr = document.createElement('tr');
    tr.innerHTML = `
        <td style="background-color:${color[0]}"></td>
        <td style="background-color:${color[1]}"></td>
        <td>${chroma.distance(color[0], color[1], 'rgb')}</td>
        <td>${chroma.deltaE(color[0], color[1])}</td>
    `;
    table.appendChild(tr);
});
</script>

こんな出力が得られる。

  • 赤と緑、青よりは、黄ピンクのほうが気持ち近い。水色、距離は遠いんだけど色差はあまり変わらず
  • 赤とオレンジ、マゼンダな色はやっぱり色差が少ない
  • 赤と緑や青を比べるより、赤と白を比べたほうが色差がすくない(!)
  • 黄とマゼンダよりも、黄と水、黄と白のほうが色差がすくない(!)
  • 距離 = 色差 に直結せず、色によって微妙に重み付けがされているのを感じる

わりと見た感覚と近い気がするのと、数字として出るとさらに面白い。

その 2 を書いた。

https://gomiba.co.in/blog/archives/1841

Carbon を使って 開始日と終了日を指定した // 単位の日付データ列を生成する

日単位のデータがわっとあって、週とか月とかの単位で集計してーなー!みたいな、そういう事をやりたいときってあると思うんですよ。
そのための日付の範囲を一覧にしてくれるやつ、というイメージで。作ったらあとは SQL とかそれに準ずる何かにポイポイしたらいいと思う。

Laravel の気持ちだったので Carbon だけど Chronos でも同じようにいけると思う。 startOfMonth とかで、自身の日付変わるところは結構驚いた、さすが Carbon やりますねぇ!(

<?php
require_once('vendor/autoload.php');

use Carbon\Carbon;

// 週の最初を日曜日、最後を土曜日に設定
Carbon::setWeekStartsAt(Carbon::SUNDAY); 
Carbon::setWeekEndsAt(Carbon::SATURDAY);

// $type = 1, 2, 3 // day, week, month
function dateRangeIterator($startDate, $endDate, $type=2) {
	$startDate = Carbon::parse($startDate)->startOfDay();
	$endDate = Carbon::parse($endDate)->endOfDay();

	while ($endDate > $startDate) {
		// "この" 始まりと終わりを取得する
		if ($type === 1) {
			$thisStartDay = $startDate->copy();
			$thisEndDay = $thisStartDay->copy()->endOfDay();
		} elseif ($type === 2) {
			$thisStartDay = $startDate->copy();
			$thisEndDay = $thisStartDay->copy()->endOfWeek();
		} elseif ($type === 3) {
			$thisStartDay = $startDate->copy();
			$thisEndDay = $thisStartDay->copy()->endOfMonth();
		}

		// 終わりが指定値を超えないように調整
		if ($thisEndDay > $endDate) {
			$thisEndDay = $endDate;
		}

		// ジェネレーター生成
		yield [$thisStartDay, $thisEndDay];

		// 次の日/週/月にいく
		if ($type === 1) {
			$startDate->startOfDay();
			$startDate->addDays(1);
		} elseif ($type === 2) {
			$startDate->startOfWeek();
			$startDate->addWeeks(1);
		} elseif ($type === 3) {
			$startDate->startOfMonth();
			$startDate->addMonths(1);
		}
	}
}


// 月単位 2/2 ~ 3/2 まで
foreach(dateRangeIterator('2018-02-02', '2018-03-02', 3) as $x) {
	echo "$x[0] - $x[1]\n";
}

echo "------\n";

// 週単位 2/3 ~ 2/18 まで
foreach(dateRangeIterator('2018-02-03', '2018-02-18') as $x) {
	echo "$x[0] - $x[1]\n";
}

echo "------\n";

// 月単位 2/2 ~ 10/12 まで
foreach(dateRangeIterator('2018-02-02', '2018-10-12', 3) as $x) {
	echo "$x[0] - $x[1]\n";
}

/**
$ php hoge.php
2018-02-02 00:00:00 - 2018-02-28 23:59:59
2018-03-01 00:00:00 - 2018-03-02 23:59:59
------
2018-02-03 00:00:00 - 2018-02-03 23:59:59
2018-02-04 00:00:00 - 2018-02-10 23:59:59
2018-02-11 00:00:00 - 2018-02-17 23:59:59
2018-02-18 00:00:00 - 2018-02-18 23:59:59
------
2018-02-02 00:00:00 - 2018-02-28 23:59:59
2018-03-01 00:00:00 - 2018-03-31 23:59:59
2018-04-01 00:00:00 - 2018-04-30 23:59:59
2018-05-01 00:00:00 - 2018-05-31 23:59:59
2018-06-01 00:00:00 - 2018-06-30 23:59:59
2018-07-01 00:00:00 - 2018-07-31 23:59:59
2018-08-01 00:00:00 - 2018-08-31 23:59:59
2018-09-01 00:00:00 - 2018-09-30 23:59:59
2018-10-01 00:00:00 - 2018-10-12 23:59:59
*/

時間とか分とか、単位をもっと細かくしたいんだよね~~ってなっても、同様にして細かい単位のものを実装したらいいと思う。

いじよ。

(翻訳)Chrome の広告ブロックが何をしているか

元記事はこちら。
Chromium Blog: Under the hood: How Chrome's ad filtering works

自分の理解のため読んだ記録に。
※翻訳者は中の人でもなければ、ガバガバ翻訳なの※


web 上の多くの広告はユーザエクスペリエンスを尊重している。が、ここのところ邪魔なんだけど!と聞いていて、昨年 6 月に発表した( Chromium Blog: Improving advertising on the web )けど Chrome で Better Ads Standards ( The Initial Better Ads Standards - Coalition for Better Ads )に従ってない広告を消すようにしたよ。

Chrome が守っている詳細は前に説明した( Building a better web for everyone )けど、このアプローチがリリースされる 2 月 15 日が近くなってきているので、今日はどうやって動いているかを説明するよ。

Better Ads Standards って何?

オンライン広告のユーザーエクスペリエンスを向上させるための、業界団体が定めるもの。4 万人以上の北米・ヨーロッパのユーザにアンケートを取って、様々な広告について評価をしたよ。
一番迷惑だと評価されたのは全画面広告( Ad Experience: Prestitial Ads [Mobile] - Coalition for Better Ads )とフラッシュアニメーション広告( Ad Experience: Flashing Animated Ads [Mobile] - Coalition for Better Ads )だったよ。

詳しくはこっち( The Research - Coalition for Better Ads )をみてね。

そんな Better Ads Standards に違反する広告のいくつかは、そもそも広告自体に問題があるけれど、ほとんどはサイトの所有者が制御しているよ。思うに、広告が密集していたり、カウントダウンするような広告だったり。

この Better Ads Standards の結果を受けて、多くの迷惑な広告からユーザを守るアプローチを Chrome でやるよ。Better Ads Standards に準拠しているか評価して、発生した問題をサイトに報告、問題に対処する機会を提供し、それでも継続していたら広告の削除を行なうよ。

違反サイトの評価

サイト上のページのサンプルを調査して評価するよ。見つかった Better Ads Standards の問題に応じて、サイトが合格、警告、失敗のステータスに評価するよ。

サイトの評価ステータスは Ad Experience Report API ( Introduction | Ad Experience Report API | Google Developers )を通してアクセスできるよ。

サイト所有者は詳細な結果を見るために、 Google Search Console の Ad Experience Report ( Web Tools - Web Tools )の中で確認できるよ。ここで、再審査をしたりもできるね。

ネットワークレベルでのサイトのフィルタリング

Chrome ユーザがページに移動すると、 Chrome の広告フィルタが、ページが Better Ads Standards に違反してないかを確認するよ。このとき、ネットワークリクエスト(JavaScript や 画像たち)は広告関連 URL と一致しているかチェックするんだ。マッチした場合、 Chrome はそのリクエストをブロックして、広告を表示されないようにするよ。

この広告関連 URL は EasyList フィルタルール( EasyList - Overview )に基づいていて、 Google プラットフォームの AdSense や DoubleClick も含まれるんだ。

Chrome でこれがどのように見えるのか?

ここまで紹介したアプローチで Chrome は広告を自動的にブロックするんだ。少なくとも 1 つの広告がブロックされると、 Chrome はユーザにブロックした旨を伝えるよ。広告を許可するオプションもあるよ。

デスクトップユーザなら Chrome のアドレスバーにでるポップアップブロッカーと似たような通知を出すよ。Android ユーザの場合は画面下の小さなインフォバーで表示されるね。

初期の結果ではユーザのために良い進歩

この操作の結果で Chrome ユーザは Better Ads Standards に準拠していない広告は見えないことになるが、私達のゴールは全ての広告を見せないことではなく web ユーザのエクスペリエンスを向上させることだよ。( The browser for a web worth protecting

2 月 12 日時点では Better Ads Standards に違反していたサイトのうち 42% は既に合格しているよ。これは私達の望んていることで、迷惑な広告体験を修正し、全ての web ユーザに恩恵をもたらすんだ。

違反に関する通知を受けてから 30 日たってもサイトが修正されなければ Chrome は広告をブロックするよ。

私達は迷惑な広告体験から以降する早期な結果を持って、業界と継続的にやり取りし、 Chrome の広告フィルタ機能が不要になる未来を目指しているんだ!

エンジニアリングマネージャーの Chris Bentzel さんが書きました。

docker の出すログファイルでディスクが 100% になった

まとめると?

  • タイトル通り。 docker の出すログファイルでディスクが 100% になった。
  • ログファイルの削除と daemon.json の設定をして完。

起きたこと

環境依存的に難しいので docker を使っているバッチスクリプトがあるのだが、このスクリプトがモリモリと標準出力に出している。や、本来は捨てられる前提のものなので、問題はあるけどない、みたいな状態。
docker は docker 内で動いているメインプロセスの標準出力のログを取っているっぽく、そのログが溜まりに溜まって、ホストマシンのディスクを埋め尽くしてしまった。

それをたまたま、同じホストマシン上の、まったく違う docker コンテナで動いている web アプリケーション上で、セッションがうまく動いていないっぽいという事象が発生したところから、調べてみると、ホストマシンのディスクがいっぱいだった、ということが判明した。

やったこと

何が容量を食っているのか確認した

du コマンドでチマチマ確認したのだが、もうちょっと効率のいい方法がしりたい。一発でバチコーンとわかるような何か。

# du -sh /* | sort -nr
...

# du -sh /var/lib/docker/* | sort -nr
436K    /var/lib/docker/containerd
104K    /var/lib/docker/network
72K     /var/lib/docker/volumes
37G     /var/lib/docker/containers
22M     /var/lib/docker/image
20K     /var/lib/docker/plugins
20K     /var/lib/docker/builder
8.1G    /var/lib/docker/overlay
4.0K    /var/lib/docker/trust
4.0K    /var/lib/docker/tmp
4.0K    /var/lib/docker/swarm
4.0K    /var/lib/docker/runtimes

# du -sh /var/lib/docker/containers/* | sort -nr
372K    /var/lib/docker/containers/df16f7083353204424150c80cb7c87dc9dda19627c7f09632e797a48d3bea2cf
372K    /var/lib/docker/containers/0d9b9a46c096f977921b682b40d7aa9de5dee443ea01a8d0b157f8f366bce764
288K    /var/lib/docker/containers/8d813f2238daa78186881017d1d6b675715f7602549cfb8285cbb08f5832f88d
252K    /var/lib/docker/containers/ce637310ed46de127cfc78813df94b1a269370a07a0f8ab24dc11f2c87bbadc8
228K    /var/lib/docker/containers/fd837df4343e6c54f5c145385bd93e23e8705114243f8a3d856458bf89c454a0
64K     /var/lib/docker/containers/bc4cdc66666f835980147bbc8105741a45db5018777ca883e35fdd3a072a7970
37G     /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80
36K     /var/lib/docker/containers/8d9bb861db601facac528d60ee855fd5b38a05dcdc2949fee72e9c3dcb4dd177

# du -sh /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80/* | sort -nr
37G     /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80-json.log
4.0K    /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80/resolv.conf.hash
4.0K    /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80/resolv.conf
4.0K    /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80/hosts
4.0K    /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80/hostname
4.0K    /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80/hostconfig.json
4.0K    /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80/config.v2.json
4.0K    /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80/checkpoints
0       /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80/shm

# tail /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80-json.log
....
// このログしってる!ぼくが標準出力に出すようにしたやつだ!

ログファイルの削除をした

中身を確認した上で、完全に不要なものだったので削除した。お手軽 echo 。

# echo > /var/lib/docker/containers/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80/4d81d71c1ea8eaea101cab745f2c16a2bcb096a2bba78f9aecd385f560e62e80-json.log

/etc/docker/daemon.json の設定をした

実際には次のような設定を書いている。これで docker 自体が勝手にログファイルの容量制限とローテートをしてくれるっぽい。べんりちゃん。

# cat /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {"max-size": "10m", "max-file": "3"}
}

容量制限とローテートされた様子。上で出したものと別コンテナだけど。

# du -sh /var/lib/docker/containers/61ffb4d88381cd2556a91f6944a2b2d2b57bb7837d8ad9a21ed772748f490b66/* | grep json.log
4.6M    /var/lib/docker/containers/61ffb4d88381cd2556a91f6944a2b2d2b57bb7837d8ad9a21ed772748f490b66/61ffb4d88381cd2556a91f6944a2b2d2b57bb7837d8ad9a21ed772748f490b66-json.log
9.6M    /var/lib/docker/containers/61ffb4d88381cd2556a91f6944a2b2d2b57bb7837d8ad9a21ed772748f490b66/61ffb4d88381cd2556a91f6944a2b2d2b57bb7837d8ad9a21ed772748f490b66-json.log.1
9.6M    /var/lib/docker/containers/61ffb4d88381cd2556a91f6944a2b2d2b57bb7837d8ad9a21ed772748f490b66/61ffb4d88381cd2556a91f6944a2b2d2b57bb7837d8ad9a21ed772748f490b66-json.log.2

公式ドキュメントを見ると他にも設定項目がいろいろあって、デーモン自体の設定なので、どんな権限で動かすか、とか、そういう…。あまり変更するような出番はないかも。
daemon — Docker-docs-ja 17.06.Beta ドキュメント

log-driver として json-file 以外にも fluentd や AWS CloudWatch なども指定できるので、もしかしたら何か活用できる…?具体的にどういう活用方法があるんだろう
Fluentd logging driver | Docker Documentation


docker 入れてる環境、事故防止のためにもログローテート系の設定はとりあえず入れると良いとおもった一件

せっかくだから STARMARIE の情報をまとめて紹介するよ

知人と共に STARMARIE のワンマンライブに参加してきた。

STARMARIE OFFICIAL WEB -2018年2月4日 中野サンプラザ単独公演-

知人に提供する目的で信頼できるソース(主に公式系)の URL を色々まとめてたんだけど、せっかくだからココにも書いておく。

特に代表のブログとか探そうとしないと見つからないのにいい話の塊みたいなものなのでぜひチェックしてほしい。むしろ代表推したい…


  • 今のところはメンバーカラーが特にない

  • 各メンバーの愛称、呼び名も上記の通り。
    • のんちゃん : 木下 望
    • しのはむ : 高森 紫乃
    • ひぃちゃん : 松崎 博香
    • もにゃ : 中根 もにゃ
    • かえちゃん : 渡辺 楓
  • mix、コール、掛け声、ライブの雰囲気など
    • 今は特にまとまったものはないっぽい(?)
      • ライブの様子を見る限りは、何曲か自発的にまとまったような掛け声があるっぽい
        • 実際何か言ってる
    • ライブでは振りコピするが多い
      • オタ芸している人もちらほら居たりはする
      • 人気曲なんかでサイリウム持ってると振りコピが整って見えてとても良さがある
      • もちろん振りコピをしないでサイリウム振っている人もいる
      • 各自の高まりたいように、応援したいようにやったらいいと思う!!!
        • ただし本人達はもちろん、周りの人にも厄介行為することだけはNG

DELL XPS 13 の Windows 10 を使っているが無線 LAN の電源管理オプションが表示されなくてちょっとこまった

会社では Windows 10 のノート PC 、というか DELL XPS 13 を使っている。
無線 LAN の親機の設定が変わったのか、こっちが変わったのかよくわからないが、ここ最近で無線 LAN がよく切れるようになってしまった。

特に電源ケーブルにつないでいない状態で、一部の SSID にまったく接続できなくなったのはかなり謎。元々は問題なく利用できていたので完全に親機の問題だと思う(設定かえたとか言ってたし…)
一向に対応される気配がないので、諦めて子機側でできることをやってみようと思った。

 

「無線 LAN 切れる Windows」とか「無線 LAN 不安定 Windows」などで調べると、おおむね「電源管理の設定を開いて最大パフォーマンスにしよう!」という内容が出てくる。たとえば…
Windows10のLAVIEでWi-Fiがすぐにつながらなくなるので省電力設定を直したぞ! | むねさだブログ

 

が!!!

「電源オプション」の中の「ワイヤレスアダプターの設定」が表示されていない。 DELL ありがてえ(ありがたくない)
「表示されない」、とかで調べるとてもドンピシャな内容がヒットせず。。

 

DELL サポートに連絡するのもアレなので、レジストリエディタからほげほげできないかなあと思いながら調べていると、まさしくな記事が見つかった。

Windowsの電源オプションで設定可能な項目を増やす - らどこの消費生活 続き

 

ワイヤレスアダプターの件について書かれてはいないのだが、同じようなあたりに設定値おるやろってことで順番に見ていくと wlansvc.dll と指定されているものいて、無線 LAN っぽい名前だしこれだろうな~~と。
ここの Attributes の値を、上記のブログに書かれていたように 2 にしたら設定項目がでてきましたとさ。

環境によって違うかもだけど、レジストリキーはこれ。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\19cbb8fa-5279-450e-9fac-8a3d5fedd0c1\12bbebe6-58d6-4636-95bb-3217ef867c1a

 

本題に戻ると、この設定で接続不安定なところは改善された。たまに瞬断も起きているっぽいが、まあまあ問題ない。というか親機…

 

OEM 的な目線(?)で考えれば、これって不用意にいじられてぶっ壊されたり、メーカーが想定している適切なパフォーマンスが発揮できない、みたいな減少を回避するために、意図的に項目を隠しているんじゃなかろーか、と思った。コンパネ的な設定項目だったら「エコにしよう!!!」とかですぐ弄れるけれど、レジストリなら弄れるには弄れるが、たまたまたどり着くことは難しいと思うので、それでいいんだと思う。

Apache 2.4 で WebSocket もリバースプロキシする

Apache 2.4 で WebSocket をプロキシしたい。以前書いた docker-compose のフロントとして Apache を立てると、バックエンドで WebSocket を使う場合にすこしの設定を足す必要がある。

docker-compose で LDAP 認証のリバースプロキシを設定する | ごみばこいん Blog

nginx 使えよって話、めっちゃわかる。そのうちやる…たぶん…

ちなみに Apache 2.2 だとパッチがいたりするそうなので、がんばって!って感じっぽい。

 

httpd.conf あるいはその手の Apache 設定ファイルで以下のような設定を足すと良い。

# ...略...

# WebSocket をプロキシするモジュールを読み込み
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so


# ...略...


# 例えば Jupyter の場合はこんなパスをプロキシしてあげる

# websocket
ProxyPass /api/kernels/ ws://${REVERSE_PROXY}/api/kernels/
ProxyPassReverse /api/kernels/ ws://${REVERSE_PROXY}/api/kernels/

ProxyPass /terminals/websocket/ ws://${REVERSE_PROXY}/terminals/websocket/
ProxyPassReverse /terminals/websocket/ ws://${REVERSE_PROXY}/terminals/websocket/

# http
ProxyPass / http://${REVERSE_PROXY}/
ProxyPassReverse / http://${REVERSE_PROXY}/

 

REVERSE_PROXY は環境変数で、バックエンド( Jupyter )のホスト(とポート)を指定する。ぼくの手元のやつは docker-compose を使ってるのでこんな感じに書いている。

version: "3"

services:
  jupyter:
    container_name: "${APP_NAME}_jupyter"
    build: ./docker-jupyter
    command: start-notebook.sh --NotebookApp.token=''
    volumes:
      - ./notebooks:/home/jovyan/work
    environment:
      GRANT_SUDO: 1
      NB_UID: ${NB_UID}
      NB_GID: ${NB_GID}
  proxy:
    container_name: "${APP_NAME}_proxy"
    build: ./docker-proxy
    ports:
      - "${HTTP_PORT}:80"
    links:
      - jupyter:jupyter
    environment:
      REVERSE_PROXY: jupyter:8888

httpd:alpine の Docker イメージを利用しても WebSocket のプロキシが出来るので、そんな感じ。
いじょ

THE AI 2018 というイベントに参加したメモ

先日、株式会社レッジが主催する THE AI 2018 というイベントに、色々が色々あって参加させてもらった。色々が色々でちゃんと見てなかったのだけどチケット 4 万円なのか…

THE AI 2018 | Ledge.ai

Ledge.ai たまにディープラーニング系のこと調べて辿りついたりするのだけど、元々が BITA デジマラボ、ビットエーだったとのこと、それはしらんかった。

Ledge.ai(レッジ) | AI:人工知能特化型メディア

ビットエー、AI特化型メディア「BITAデジマラボ」を「Ledge.ai(レッジエーアイ)」として全面刷新し、AI関連事業を「株式会社レッジ」として子会社化|株式会社ビットエーのプレスリリース

 

会場の雰囲気はこんな感じだった。オープニングがブチアゲ EDM で非常によかった(そこじゃない)

 

要するにイベントレポって話なわけで、気になったところだけメモしてたので、それを~~~。

  • 「未来ではなく、今のAIの話」「ビジネスに使えるAIの話」をするような場所。
  • 人間のスゴイところは変化はいろいろあるが、当たり前が変化することに適応していくところ
  • アスリートの学習の話
    • 自動化
      • 物事を反復するのは考えなくても出来るようにするため
      • 細部への意識ではなく全体の意識に変わる = チャンク化
      • 一度自動化したものを忘れることは難しい(英単語を日本語で考えるとか)
      • 上手くなることはその環境下で最適化すること
      • とはいえ完璧に最適化すると変化に対応できない
    • 集中
      • 集中は発想の連鎖を止めて没頭している状態
      • 上位でざっくり考えて全体が動いている(歩く時混乱しないよね)
      • 逆に下まで考えていることが降りてくると混乱する
      • 発想の連鎖を止めるために外部のモノ、テクノロジーも使う
      • 体験すると再現性が生まれる、フェアでなくなってしまうので、ドーピングはチートアイテム
    • イメージ
      • VRはある意味それ
      • トップアスリートにはデータや傾向がないのでイメージが大事
      • 他人の動きを見て推測、抽象化することが上手い人が多い
      • ただし推測は実態と違う、腕を動かそうと思っても肩を動かさないといけなかったり
      • 予測ができる範囲のことでは学習はできない
      • 計画できないものを計画できるような設計が学習には大事
    • 内製
      • アスリートは記憶を都合よく変える人が多い印象、自分を信じてやっていく
      • ビジョンを作る、10秒切るぞ!とか。それがないと10秒は何の意味もない
      • ビジョンとのギャップを考えて改善していく
      • 考えると頭のなかで失敗もできる
      • 頭のなかでシミュレーション、経験を積んで、深く考えていく
    • 欲求
      • 短期と長期の欲求をコントロールする
      • 今日は遊びたい、来年オリンピック出たい。練習したら遊ぼう!など
    • 長くスポーツを見ていて、勉強して100年前と同じという印象
      • 強い者でもなく、賢い者でもなく、適応した者が生き残っていく
      • 人の能力は必要で、AIが出来てもそれに合わせて適応し動いていく
  • MSさんの話
    • Azure、Trusted Cloudを意識している
      • セキュリティ、個人情報、コンプライアンス
      • そして透明性。公的機関から要請されたらすぐ情報を出せる
      • データセンターの紹介動画
    • AzureのCognitiveService
      • Vision, Language, Speech, Search, Knowledge
      • 中でもSearchは画像検索もできたりして面白い
      • Bingのデータを使ったりもしている
      • ビジネスで使えるよう、カスタムできるものも提供している
      • 活用例
        • レタス農家、コンバインとAIで雑草の仕分け
        • 北大eラーニング、字幕と翻訳の自動化
        • JFKの文章公開、OCRやテキスト起こし、検索で文章検索
        • 鳥の計測
        • 他にもいろいろあるよ
    • AzureのDataLake
      • SQLライクに書けるものを使ったBigData処理
      • そこにCognitiveServiceの一部の機能を組み合わせられうr
    • これまでデータは手入力していた
      • いかにしてデータの価値を上げていくか、自動化するか
      • 文字よりも写真のほうが情報量が多い、AIでそれもわかるようにんっってきた
      • IoTもデータ集めの自動化
    • AIはソフトウェアのエンジン
      • 正しく使わないと、正しく成果が出ない
      • Azureはドメインに限らず使えるように工夫している
      • なのでそのまま特化したドメインに適用しようとするとうまくいかない
      • ビジネスに使えない可能性も高いので、カスタムできるようにしている
        • データ収集~モデル構築~学習~運用
      • ルールベースの世界にちょっとのAIを足すことで今までより便利な世界になる
    • AIスクールも無料で見れるので活用してほしい
  • リクルートさんの話
    • テクノロジーズ、R&Dでビジネスへの活用をする
    • リクルート内では人のパターンを模倣するものとしてAIを定義
      • データとアルゴリズムで人のパターンを再現する
    • 社内でデータは多数いろいろあって何か使えないかなあというところでA3RTが誕生
      • A3RTでAIの構築が簡単になるので、ビジネス検討や要件、に注力できる
    • 事例
      • カーセンサーでCNN、写真から車名を当てられる。SNSでバズる
      • ゼクシィ、やりたい式の写真からキーワードを上げてくれる
      • ArGon、社内全体的に利用している校閲サービス。ルールベースと機械学習
        • Word2Vecやレーベンシュタイン距離、Bidictional LSTMを活用して誤字脱字、表記ゆれ、矛盾の解決
        • ルールはWeb上のUIを使って簡単に設定できるようになっている
      • 口コミ、CNN、AttensionNetで審査の自動化
    • AIは完璧でないので育てていく。学習しよう
      • AIは補助的なものである
      • AIを使って何をしたいか明確化する
      • 精度100%は無理、人がデータ入れたりロジック考えるんで
      • やりっぱなしじゃなくて、AIでどうなった、進化させていこう
    • AIの難しいところはAIだけ考えればいいわけでないところ
      • 運用するならアーキテクチャやインタフェースも考える必要がある
      • 新しいロジックや仕組みを使えば出来るわけでもない
      • チームで戦う。Pythonできますでは戦えない
    • 施策を継続していくために、問題を解決したり実際に使っていく
      • KPI、精度の目標は事前にすりあわせておく。見切り発車はあぶない
    • 逆にR&Dとして、テクノロジーを元にチャレンジする場も作っている
      • DQNを何かに使えないか?→UXやサイト改善?
      • 資料を作るのも時間が掛かるので、適切に判断するためにも上司は内容を理解するよう追いつけるよう務める
  • CAさんの話
    • AI Lab、産学連携なども駆使して、AI技術自体を良くしていこうとしている
    • たとえば阪大の石黒先生と一緒に社会実験をしている
      • 接客コミュニケーション
        • 音声、処理に時間が掛かる
        • テキスト、一問一答の精度は良いがやりとりが難しい
        • 選択式、現段階では最適か?ストーリーの折込もできる
    • アドテクでもAIを活用する
      • ブランド既存の回避、CV率上昇。テロや悲惨なニュースを避けたり
      • 文書の意味をアノテーションして推定、適切なマッチングへ
    • ロボットインタラクション、人とロボットのつながりを研究している
      • 近距離でのコミュニケーションは昔から変わっていない、これをテクノロジーしていきたい
  • ドコモさんの話
    • イノベーションを起こしていく、新規事業を作っていく部署がある
    • ecコンシェル。AIをビジネス、デジタルマーケティングに使った
      • ドコモはコミュニケーションの会社、webのコミュニケーションを良くしたい
      • 個人に特化したものを一部AIを入れてやっていく
    • Produt, Market Fit
      • ものと市場の合わせていく、マーケットにウケるものじゃないとどんなにいい出来でも売れない、難しい
    • バナーや施策は何があたるかわからない
      • 多腕バンディットアルゴリズムで色々出して解決するようなものやっている
      • 実際にはPKSHAと一緒に。
      • webの改善に強化学習を取り入れたりしている
    • AIDMA、それぞれのフェーズでコミュニケーションのやり方が違う
      • 行動心理学などの考え方もAIに取り入れつつ、適切なアクションを導き出す
      • ダッシュボードを用意して可視化
      • そもそもAIDMAのフェーズもAIで判定できるのでは?
  • ソニーさんの話
    • ディープラーニングは破壊的テクノロジー
      • 機械学習でできなかった可能性を実現できる
      • 色々な作業が自動化されていく、応用範囲、普及が広がっていく
    • ソニーでは機械学習は昔から。2010年くらいからディープラーニングもやっている
      • 事業がたくさんあるので、横断的にできるよう適切に開発できるようなツールを内製している、今回で三世代目
      • 社内で1000人以上使っている
      • コアとなるライブラリとGUIでネットワーク構築できるツール
    • 社内の事例
      • 不動産の予測、間取りや駅徒歩などの情報から金額を予測
      • Experia Ear、頭の動きセンサ、動きの判定
      • aibo、画像認識、各種センサで行動を分岐
    • 認識の基本は入力と出力のペア
      • 意識して業務を見つめると、きっと自動化できるものがある
      • その上でNNの設計が必要で、最後は回して学習していく
      • ディープラーニングのポテンシャルがあるので、発想と取り組み次第で利益へ
      • 一方で利用する人自身の認識が不足、応用できる技術者が少ない
      • そこで内製ツールを公開して盛り上げていきたい
    • ニューラルネットワークライブラリ
      • Tensorflowやchainerのように使える。LeNetも6行で書ける、GPU利用も1行で設定完了
      • C++で書いているのでエッジデバイスでも使える
      • インタフェースとしてはC++とPythonものを提供している
      • コア部分はプラグイン方式を取っているので自社デバイス、特殊な環境も使える
    • ニューラルネットワーククライアント
      • GUIでネットワーク構築が出来る
      • Windows向けアプリケーション、クラウド版もCPU版は公開、GPUはもうちょっと
      • AutoEncoderやRNN、GAN、半教師なども組める
      • テンプレ機能で難しいネットワークも1ボタンで組める
      • 最後の仕上げにネットワークの構成やパラメータを変えて最適化していく機能がある
      • 出来上がったネットワークはライブラリで利用できる形式で出力できる
    • みんな使ってね

 

ソニーさんのやつは見ていて面白そうだった。ディープラーニング出来る人が組んで試すという時代は通り過ぎ、知見がない人(プログラミングも)もとりあえず使うことが出来る時代になったのかもしれない。
「GANで画像が作れるんでしょ、でもなあ…」→ニューラルネットワークコンソールを使ったら簡単にできるよ!!

Neural Network Console

 

リクルートさんの A3RT も一部公開されている。無料で出来上がったモデルが使えるので、ディープラーニングのパワーを感じるのにはいいかもしれない。校正 API とかめっちゃ良さそうじゃないっすか。

A3RT

 

プレス席があったので、そのうちメディア系のところからちゃんとした(?)イベントレポがでると思うので、他のセッションどうなんよとかはそういうのを見るとよさそう。

 

参加していた人は役職も企業も様々で、だれもが AI に関心な感じだった。役職の部分だとエンジニアやデータサイエンティストな人もいれば、セールスな人、マネージャーな人、などなど。企業側は大手や小さい会社、web、リアル、などなど。
この一日、チケット代も含め、企業間の取引の話も進んでいるだろうし、数千万円とかもっと大きなお金がゴゴゴってなってるんだろうなあ。なるほど~

とやかくとかではまったく無いんだけど、この手のちゃんとしすぎているイベントは俺が作るんだ!な人は、得られる情報があまりない可能性もあるので、参加しないほうが良さそう。少なくともぼくの感覚としては、テックテック!な人じゃなくて、単純に懇親会ネットワーキングマンでビジネスするぞ!な人が一番価値ありそうだなあっておもいました!

 

逆に作る人は仕事で使えるようにこのインタビューに出てる本を読むと幸せ度があがるとおもいます。ぼくはちょっとだけしか読めてないんですが、サービスへの機械学習システムをどういう形で組み込むか、とか、機械学習を使わずに分析していく、とかって話はめっちゃ良いです。

【AI people:vol.7】『仕事ではじめる機械学習』著者座談会:前編 きっかけは「没原稿の供養プロジェクト」だった | blog - 人工知能(AI)/機械学習に特化した勉強会コミュニティ【Team AI】