未分類

徒然日記

疲れだけは一人前に感じるのでお昼ごろまで寝ていた。最近眠りの質があまりよろしくない。

ターゲット・メディア主義―雑誌礼讃を読む。10年前の本ではあるのだけど、それ以前の雑誌が捉えていたターゲットを時系列や会社別に整理されていて興味深い。今となっては状況そのままという話は少ないのだけど、技術の話と一緒でものすごい勢いでトレンドが変わっている業界なのだなと素朴に感じてしまった。

基本、自分が思うところとしては「人間は楽をしたがるものだ」というポリシーがあって、最終的には自ら動かずとも求める結果が得られるのが理想であるのだけど、その楽をするためには苦労をいとわないことをしていかないといけない。自然にそれができると良いのだが。

徒然日記

前日に飲み過ぎてしまい完全に調子を狂わせた。情けない。

汗まみれ宣伝論 – 徒然日記

ぼんやり午前中を過ごしていたら諸般用事があって午後から外出。待ち時間が多かったので最近読了した本を改めて読む時間にあてた。一度読み終わった本だが繰り返して読みたくなる感じがある。

この本の第五章に「汗まみれ宣伝論」という章があり、そこで書かれていた 宣伝とは仲間を増やすこと という一文があり、妙にその言葉が改めて自分の頭の中に残った。逆もしかりで仲間を増やすことがひいては宣伝になっていくのかもしれない。

ではその集まる場をどの様に作っていくといいのか。と、考えることが自分に足りてないことなのかもしれないなと思ふこの頃。

夕食に沖縄料理と泡盛頂いて終わり。

徒然日記

4月だからか通勤電車のいつも乗る場所の混み具合が普段と異なる感じがする。

電車の中では最近できるだけスマホを見ないで本を読む様にしている。

上の本は読み終えたので今度はこれにする。

3分間DNS基礎講座

一応職業柄、「仕組み」は理解してるつもりなのだけど恥ずかしながら細かい所の理解が薄いと最近思ったので今一度読みなおす。この本、パラッと読んでみたが良本な気がしているので読み通す。

徒然日記

昼間は外出。雲ひとつ無く青空がとても綺麗だった。

電車で移動したり待つことがあったので SAVE THE CATの法則 本当に売れる脚本術 を読む。

夜はチェーンの焼肉屋さんへ。久しぶりに食べた焼き肉。積極的に野菜を食べないと胃がもたれるお年頃なので積極的にチョレギサラダ食べる。

席の隣に海外の方が来られていたのだけど、とても上手に焼いた肉を箸で取られ、タレにつけた後、白米に一度着陸させてとても美味しそうにお肉とご飯を食べていて勝手にシンパシーを覚えた。マナー的に怒られるかもしれないけど、一度着陸させてしまう食べ方、自分もしてしまう。

2015年を振り返る

昨年に引き続き今年一年をブログに記した記事を中心に振り返りをしてみる。

1月

検索エンジン自作入門 ~手を動かしながら見渡す検索の舞台裏を読みながら実際に実装を試みた。node.jsで実装、redisで永続化という手段を取ってみたのだけど実際に手を動かしながらそして原理を理解しながら進められて得られるものが多かった。

実装例にも挙げていただいて光栄でした。

2月

自作のアグリゲータevacに機能追加を続けていた。

3月

毎年のことながら桜の写真を撮っている。
perceptual hash(phash)を利用して画像比較をしてみるというエントリを書いた所いくつか面白かったという返事をもらって素朴に嬉しかったのと、自分が曖昧になっていたところについてきちんと実装を追われた方のコメントを頂いて有り難いと思うと同時に自分もそこまで追わねばと多少反省。

hideack.hatenablog.com

4月

急遽帰省したりと慌ただしい一ヶ月間だったという印象。

5月

loopbackというNode.jsのAPIフレームワークに魅了されたのがこの月。今でもその魅力は(個人的に)衰えない。

hideack.hatenablog.com

hideack.hatenablog.com

6月

過去最大のはてブをもらったエントリーを書いたのはこの月。まさかgoogle docsネタでここまで火がつくとは....。

hideack.hatenablog.com

7月

dockerでWordPressを動かしたりしていた。諸般あってWordPressを今年からよく触り始めたけど便利だ。

8月

nil *1

9月

大分何かに疲れていた様でひたすら海を眺めるなどしていた。

hideack.hatenablog.com

10月

個人的にやっているプロジェクトのnpmのアップデートにgreenkeeper.ioを使い始めたりした。本当にこれは便利なので使ったことがない人にはお薦めしたい。

hideack.hatenablog.com

11月

年間通じてevacには自分のものを入れ続けていた。twitterのタイムラインを入力として扱える様にしたのはこの時期。

hideack.hatenablog.com

12月

会社で携わっているサービスでイベントを開催。大勢の方の協力の元、実現することができました。

この様なエンジニアリング的なところとは少し遠いことにも携わる様になってきたのだけど、エンジニアリング的発想は活かせたのではないかと自負している。このあたりはまた別の機会に書きたい。


昨年末のエントリでも「来年は公私ともにいろいろ変化する年になりそうなので、肩に力入れない様にしつつも、必死に食らいついて行こう」と書いたのですがまさにその通りとなった感はあったのですが、更にそれを加速させできる様にもっと精進していきたいと思います。

ただ、気づくと自分もいい年になっていたので一層その辺りは意識していきたいし、あまり悠長にかまえていられないという感覚はより一層感じています。

*1:恐らく夏休み等々であっという間に時間が過ぎたのだと思う

npm-check-updates でpackage.jsonに記載されたnode moduleの更新状況を確認する

タイトル長い。

Node.jsではアプリケーションで利用するnpmモジュールを package.json に定義しておく訳ですが、こちらで定義されたそれぞれのモジュールのアップデート状況を確認したり併せてpackage.jsonを更新する方法が知りたかったのでその際調べたメモ。

npmコマンドで npm outdated とすることでpackakge.jsonに定義された各パッケージの現在インストールされているバージョン、package.jsonで定義されているバージョン、npmで管理されている最新のバージョンを列挙することはできるのだけど、実際に手元にあるpackage.jsonの更新までは行ってくれません。

そこでnpm-check-updatesを利用します。

まず、npm-check-updatesをインストール

$ npm install -g npm-check-updates

そうするとコマンドとして npm-check-updates がインストールされるのでpackage.jsonが置かれているパスで実行します。

$ npm-check-updates
"compression" can be updated from ^1.5.0 to ^1.5.1 (Installed: 1.5.0, Latest: 1.5.1)
"errorhandler" can be updated from ^1.4.0 to ^1.4.1 (Installed: 1.4.0, Latest: 1.4.1)
"loopback" can be updated from ^2.18.0 to ^2.19.0 (Installed: 2.18.0, Latest: 2.19.0)
"loopback-datasource-juggler" can be updated from ^2.32.0 to ^2.33.1 (Installed: 2.32.0, Latest: 2.33.1)
"youtube-api" can be updated from ^1.0.0 to ^1.0.1 (Installed: 1.0.0, Latest: 1.0.1)

更新可能なパッケージが確認できますね。

この更新を package.json に反映させたい場合は、 -u オプションを付けて実行します。

$ npm-check-updates -u

これでpackage.jsonが更新されるので実際に、 node_modules の中身を更新します。

$ npm update
compression@1.5.1 node_modules/compression
├── bytes@2.1.0
├── on-headers@1.0.0
(snip)
└── strong-remoting@2.20.0 (eventemitter2@0.4.14, qs@2.4.2, js2xmlparser@0.1.9, traverse@0.6.6, sse@0.0.6, request@2.58.0, mux-demux@3.7.9, jayson@1.2.0, xml2js@0.4.9)

これでpackage.jsonで定義されている全てのnode moduleを更新することができました。

perceptual hash(phash)を利用して画像比較をしてみる

突然ですが画像がたくさんあってそれを人の目で分類するのって大変ですよね。

自動でこういったものを分類できないか興味があったので調べてみました。


perceptual hashとは

perceptual hash というのは、ハッシュ関数の実装なのですがSHA1等のハッシュ関数とは違い、以下の様な特徴があります。

  • 得られるハッシュ値は64bit
  • 対象は静止画, 画像, 音声等のマルチメディアデータ
  • コンテンツ内容が類似しているケースでハッシュを得た場合、例えば静止画画像の拡大、縮小といった加工の場合ハッシュ値が全く同じになる
  • また、色調の修正やノイズが加わった場合も得られるハッシュ値間のハミング距離が近くなる
    • 64bitのハッシュ値なので最も遠いハミング距離は64 (=全くコンテンツが異なっている)
    • 逆にハミング距離が0であればperceptual hashで得られた結果上は同一コンテンツ

こういった特徴があるため具体的にWebアプリケーションでの用途を考えると

  • コンテンツの重複判定
  • 類似画像検索

などに使えそうというのは上の特徴でわかるのではないでしょうか。

具体的なアルゴリズムはperceptual hashのオープンソース実装のphashのドキュメントにも記載があるのですが、

  • 対象画像を縮小する
  • 画像の輝度情報に対してDCT(離散コサイン変換)をかける
  • 低周波成分を得て、この部分をハッシュとして扱う

という考え方の様です。DCTまでは理解できたのですが、低周波成分をどの様にハッシュとして扱っているのか理解が届かない...。*1

node.jsで利用する方法

先に書いた http://www.phash.org/ の実装があり、そのラッパーがいくつか公開されています。今回は同名の phash を利用してみます。

で、実際に利用する前には環境にphashとimagemagickがライブラリを入れる必要があるのでMacであれば先に入れておきます。

$ brew install phash imagemagick

で続けてnpmコマンドでインストール。

$ npm install phash

実際に試してみる

では、いくつか画像を用意してハッシュ値の取得と画像の比較を行ってみます。

画像処理ではおなじみのLena画像を利用して実験。その画像をそれぞれ以下の様な加工をしてみて、元画像で得られたハッシュ値とのハミング距離を求めてみます。

  • 画像の縮小 (No.1)
  • 画像のセピア加工 (No.2)
  • 画像のモザイク化 (No.3)
  • 画像上に文字を重ねあわせる(No.4, No.5)
  • 画像を反転させる (No.6)

先ほどインストールしたnpmライブラリを利用してハッシュ値を求めた上で元画像とのハミング距離での比較を行います。

以下が得られた結果です。

No 画像 ハッシュ値 No.0とのハミング距離
0 (元画像) c91cb262775a9800 -
1 (縮小) c91cb262775a9800 0
2 (セピア化) c914b262775a9800 2
3 (モザイク) c98cb022375ad800 8
4 (文字追加) c9acb866635a9800 8
5 (文字記号追加) cb8cba66535a9800 8
6 (反転) dc69f7330287e000 34

perceptual hashの利用例等を見るとハミング距離20前後を閾値としているケースが多かったので、反転させたケース以外は全て同一画像として判断できているといってよさそうです。

反転させるという処理は根本的に画像の作りを変える操作(画素の並びを変える) になるのでハッシュ値は全く異なってしまいますね。仮に類似コンテンツを抽出する目的でphashを利用する場合はこの辺りも配慮する必要がありそうです。

まとめ

  • perceptual hash についてそれとなく把握しました
  • phashという実装がありそれをラップしたnpmライブラリを使ってみました
  • 実際に画像をいくつか用意してハッシュを得てハミング距離を比較し、縮小やセピア加工、文字を上に重ねる等の加工であれば同一コンテンツとして検出できた

*1:詳しい人教えてください...

追記

- 2020/6/6 WordPress移設に伴ってソースコードが読みにくくなっていたのでgistに貼り直しました。

2014年を振り返る

このブログに書いた記事を眺めながら1年を振り返ってみました。
なんだかんだそれなりにアウトプットできた1年になったのでよかったと思えるので、質・量ともにもっと上げていける様にしたいと思います。

また来年は公私ともにいろいろ変化する年になりそうなので、肩に力入れない様にしつつも、必死に食らいついて行こうと思います。

今年の出来事

*1:仕事が忙しかった...