ゆるりと立派な大人になるために

元組み込みソフトウェアエンジニア、あれこれを書いていこうと思います。TOEICは915点

PostgreSQLでのbytea型のビット演算

PostgreSQL ver 9 以上を前提としてお話をする。

 

 

OracleからPostgreSQLへ移行する時、困った事があった。

 

PostgreSQLでのビット演算だ。( and , or , xor)

 

OracleのRAW型はPostgreSQLでいうbytea型である。

 

 

OracleのRAW型はビット演算できるし、バイト単位のアクセスも可能。

UTL_RAWパッケージを使って。

 

 

UTL_RAW.BIT_AND(raw1, raw2)

UTL_RAW.BIT_OR(raw1, raw2)

UTL_RAW.SUBSTR(raw , 1 ,2)

 

でも、PostgreSQLになると途端に複雑になる。

PostgreSQLにはbytea型、bit型というものが存在する。それぞれの特徴は。

 

bytea型だと、バイト単位のアクセスは可能だが、ビット演算ができない。

bit型だと、バイト単位のアクセスは不可能だが、ビット演算ができる。

 

たいていの場合は、bytea型でデータベースに保存して、必要な時取り出してバイト単位でアクセスすれば問題ないでしょう。

ただ、保存してあるデータに何かのビット列とANDもしくはOR演算して、再びデータベースに戻すとケースもありうると思う。自分はそのケースだった。

 

ここで問題なのが、PostgreSQL に bytea <=> bit 変換の関数が用意されていないということだ。変換方法もマニュアルのどこにものっていない。

 

なので、Stackoverflowとかで調べないといけなくなる。

でも、また調べるのは面倒なので、bytea型同士のbit演算、bytea型<=>bit型の変換ができる関数をつくりました。

 

github.com

大抵の人は、データをとりだした後にスクリプト側(php,python,ruby etc..)で変換すると思うけど、こんなのデータベース側でやってほしいって人には役に立つかもしれないです。。

 

 

Windowsでlinuxコマンド使いたいなら、git bashで十分じゃないかな。

 

自分はWindowsユーザーです。

 

windowsユーザーのwebサービス開発者は一日に何度も、

Linuxwindowsを行き来しますよね。

 

そんな時、コマンドプロンプトでやってしまいがちなのは、

C:\Users\Hiroki>ls -la
'ls' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

 

 あっ。。。

 

linuxコマンドになれてしまうと、windowsでコマンドで操作するのが

とっても苦痛です。

 

そこでおすすめなのが、これ。

 

git-for-windows.github.io

 

windows上でgitが使えるようにするものですが、

一緒にインストールされるgit bashが優れものです。

 

もう、 ls も怖くない。

$ ls -la
total 2748
drwxr-xr-x    1 Hiroki   Administ    16384 Feb  4 23:43 .
dr-xr-xr-x    1 Hiroki   Administ     4096 Dec  6 19:30 ..
drwxr-xr-x    1 Hiroki   Administ     4096 Feb  5 22:36 .VirtualBox
drwxr-xr-x    1 Hiroki   Administ     4096 Oct 18  2014 .android
-rw-r--r--    1 Hiroki   Administ     2061 Feb  5 07:43 .bash_history
drwxr-xr-x    1 Hiroki   Administ        0 May  7  2015 .config
drwxr-xr-x    1 Hiroki   Administ        0 Aug 10  2014 .gem
drwxr-xr-x    1 Hiroki   Administ     8192 Aug 27 10:43 .gimp-2.8
-rw-r--r--    1 Hiroki   Administ      266 Sep  2 22:20 .gitconfig
-rw-r--r--    1 Hiroki   Administ       44 Jan 26 21:57 .lesshst
drwxr-xr-x    1 Hiroki   Administ     4096 Sep  1 17:58 .ssh

 

パイプもできちゃうし、grep もできちゃう。

 

$ ls -la | grep centos
drwxr-xr-x    1 Hiroki   Administ     4096 Jan 27 22:43 centos7
drwxr-xr-x    1 Hiroki   Administ     4096 Jan 30 03:44 centos72

 

 vi , cat, find もできちゃいます。

 

 

もう、dirに切り替えなくていいんです。

 

って事で、最近git bashwindowsを操作してますよ。

 

 

WindowsにVagrantいれてみる1

Vagrantという開発環境を気軽に構築できるツールがあるらしいので、

インストールして使ってみる。

 

実際の開発環境はVirtualBox上に作りますが、

その環境を簡単に作成、削除、コピーできるツールVagrantです。

 

まずは安定のドットインストール、

概要掴むのには一番手っ取り早いと思います。

Vagrant入門 (全13回) - プログラミングならドットインストール

 

Vagrantをインストール

Vagrant

 

VirtualBoxをインストール

Oracle VM VirtualBox

 

インストールし終わったら、まずはboxを追加します。

これはOSのイメージファイルみたいなもので、

A list of base boxes for Vagrant - Vagrantbox.es でいっぱい配布されてます。

 

追加コマンドは下記の通り。

 vagrant box add [title] [URL]

 

os一覧からcentosを選択してaddしてみる。

 vagrant box add centos7 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box

 

確認コマンドはlist

$ vagrant box list
centos7             (virtualbox, 0)
hashicorp/precise64 (virtualbox, 1.1.0)

 cetnos7がaddされている事が分かります。

 

後は、os毎に専用のフォルダを作って、

vagrant initで初期化し、

$ mkdir centos7
$ cd centos7
$ vagrant init centos7

 

vagrant upをして、OSを起動させる。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos7'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: centos72_default_1454082865789_75402
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...

 

centosにログインしたい場合は、

vagran sshでログインできる。

$ vagrant ssh
[vagrant@localhost ~]$ pwd
/home/vagrant

 

わずか15分くらいで、centos環境を用意できちゃいます。

 

さらにos上でいろいろとインストールして、

その環境を配布したい場合は、vagrant packageでカスタマイズされたboxを作成できちゃいます。詳しくは下記にのってます。

 

Vagrantのboxに少しだけ手を加えたものをboxとして取っておきたい - Qiita

 

細かい使い方は、また紹介します。

 

jQueryメモ。 ゆっくり消すfadeout

 

jQueryを使ってある要素をゆっくり消したい場合、

 

$('#something').fadeOut('slow');

 

でゆっくり消せます。

 

ポイント1

fadeout ではなく、fadeOut

あたり前かもしれないけど、大文字小文字は区別されます。

 

ポイント2

数値でしていする場合は、''を外す。

これも当たり前ですが、fadeOut(2000);

とかでミリ秒数を指定して消せます。

数値なので、' '(シングルクォーテーション)や

" "(ダブルクォーテーション)はいりません。

 

fadeOut('2000')とか書いてるサイトがいくつかあって、

えっまじ!?って思ったけど、やっぱりできなかったです。

 

何はともあれ、公式をちゃんと確認します。

.fadeOut() | jQuery API Documentation

 

 

 

Jqueryメモ

最近よくjQueryを使うので、メモ的に残します。

 

・oneメソッド

one(type, [data], fn) - jQuery 日本語リファレンス

 

oneに指定されてるfunctionを一回実行すると、unbindしてくれて二度と実行しないようにしてくれる。一回だけボタンをクリックしたら、その後はクリック動作を受け付けないようにするのに便利。

 

・eachメソッド

 phpのforeach的に動作してくれるメソッド

each(callback) - jQuery 日本語リファレンス

セレクタで指定した要素が複数あった場合、eachを付けるだけで

グルグル回してくれるので、非常に便利。

 

・triggerメソッド

プログラム的に無理矢理イベントを発生させる事ができる。

trigger(type, [data]) - jQuery 日本語リファレンス

 

・まとめ

上記3つを合体させて、以下のようなプログラムが作れます。

 idがallimageの要素をクリックすると、idがresultTableの要素内にあるすべてのaタグ(detailクラス付き)のクリックアクションが1.2秒おきに発生します。

 

普段はphpばっかり書いてるけど、たまにはjqueryも楽しい。

 

 

(**) javascriptってsleepがないんですね。知らなかったよ。

ドトールは落ち着く

 

ドトールによく行く。

 

 

仕事の後のくいっっと一杯はうまいと言うけれど。

 

 

何かをやり遂げた後の、一杯のカフェラテは最高だ。

 

 

特に人が少ない時間帯、おひとり様で一人の時間を楽しんでる人が多い時間帯が、

僕はとっても落ちつく。 20:00~21:00くらいかな。

 

 

 

 

家とは別の場所に、休める空間を用意するのは

とっても良い事なんだろう。

 

 

今日、ジャーマンドックを頼んだらケチャップがついてきた。

かれこれ10年くらいは通い詰めてるけど、ケチャップがついてきたのは初めてだ。

 

f:id:simplestreet:20151230110649j:plain

 

 

指が写ってごめんなさい。

ケチャップもらえるみたいです。知らなかった。

 

 

 

 

とにかく、ジャーマンドックとカフェラテを頂き、

まぁ今日も頑張れそうな気がする。

 

 

 

Cloud vision apiを使ってみた。 part4 ~LOGO_DETECTION~

 

cloud vision apiを使ってみた。

 

今回で最後にします。

 

LOGO_DETECTION

文字通り、logoを検知するapi

 

画像①

f:id:simplestreet:20151224230226j:plain

 

    "logoAnnotations": [
        {
          "mid": "/m/01jtml",
          "description": "Adidas",
          "score": 0.65040034,
          "boundingPoly": {    

 Adidas。検知できてます。

 

 

 画像② マックダーーーナー。

f:id:simplestreet:20090722145052j:plain

 
"responses": [
    {}
  ]
}

 何もなし。

 

画像③

f:id:simplestreet:20151224230232p:plain

      "logoAnnotations": [
        {
          "mid": "/m/0lwkh",
          "description": "Nike",
          "score": 0.58140534,
          "boundingPoly": {

 Nike が返ってきてます。

 

 

いろいろと画像を試しましたが、文字が入ってるものは検知できました。

なので、ほぼTEXT_DETECTIONと変わりませんね。

 

Image Sentiment Analysis

Vision API can analyze emotional facial attributes of people in your images, like joy, sorrow and anger. Combine this with object detection and product logo detection, so you can assess how people feel about your logo.

 超訳)

 Vision APIは顔の表情から感情を解析します。object detection や logo detectionと合わせて、人々があなたのlogoをどのように感じているかわかります。

 

と、言っておりますが、

人がLOGOの付いたTシャツ着て、走ってる写真も試しましたが、

どれもうまく検知してくれませんでした。

LOGO_DETECTIONとはいうものの、TEXT_DETECTIONの域は越えられていないような気がします。

 

 

 

まとめ

いろんなDETECTIONを試しましたが、結局まともに利用できるのは

LABEL_DETECTIONだけかなっていう感じです。ただそのLABELでさえも、

想像の範囲内っていうか、”なんでこんなに検知できるんだーー”って感じる物ではありませんでした。

 

なんかオープンソースをささっと集めて来て、web apiとして使えるようにしただけって感じです。

 

スマホで利用している音声認識くらいの精度を期待していただけに、残念な結果になりました。

 

まぁ簡単にできるので、興味のある方は

 Cloud vision apiを使ってみた。 part1 に貼ってあるphpのプログラムで試してみてください。