non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

HTTP2でexpressを動かす

こんばんは、息子たちと奥さんが海外出張の為、実家に来ています。近所に住んでいる長男と同い年の従兄弟と三人で今回も元気に過ごしています。@kjunichiです。

背景

abrakatabura.hatenablog.com

の記事にあるように、mruby-webcamで、大量に顔検出した息子たちデータがあり、mrubyで登録したbytea型の 画像データが意図した通り、PostgreSQLに登録されているかの確認も込めて、mruby以外の処理系での確認ということで、 node.js+expressでタイル表示させた。

そこで、大量のhttpアクセスにはHTTP/2.0が向いていることを思い出した。

node-spdyモジュールを知る

長いこと、node-http2モジュールしか知らなかったが、

github.com

のスレッドで、node-spdyがspdy以外にhttp2も扱えることを知った。 しかも、作者はnode-ffiでも以前、神対応されてる方なので、期待が高まる。

expressをnode-spdyで使う

オレオレ証明書

証明書買えないし、Let's encrypt使えそうな環境身近にないから、以下でオレオレ証明書を作る。node-http2trusterdh2oと違い、node-spdyはca.pemなる ファイルも必要だった。

以下の様にして、用意できた。

mkdir keys
cd keys
openssl genrsa -des3 -out spdy-key.pem 2048
openssl req -new -key spdy-key.pem -out spdy-ca.pem
openssl x509 -days 365 -req -signkey spdy-key.pem < spdy-ca.pem >spdy-cert.pem
openssl rsa -in spdy-key.pem -out spdy-key.pem
cd ..

expressのコード

express-generatorで生成したコードの場合、bin/wwwを以下の様に編集して、対応出来た。

const spdy = require('spdy');
const fs = require('fs');

const options = {
    key: fs.readFileSync(__dirname + '/../keys/spdy-key.pem'),
    cert: fs.readFileSync(__dirname + '/../keys/spdy-cert.pem'),
    ca: fs.readFileSync(__dirname + '/../keys/spdy-ca.pem')
};

const server = spdy.createServer(options, app);

関連記事

11年前の記事

7年前の記事

5年前の記事

4年前の記事

まさかPostgreSQLを触って、IPv6の知識が増えるとは

おはようございます。最近長男は聞き分けがよくなってきて、助かってます。ちょっと我慢して、こちらのやってほしいことを先にやって、後で、自分のやりたかったことをすると言ったことが出来てきました。今出来ないけど、後から出来るということを理解できてきた様子です。@kjunichiです。

背景

abrakatabura.hatenablog.com

なる記事を書いて、Postgres.appを久しぶりに触り出した。 WWDC2016で新しいMacBook Proが残念ながら発表なかったので、相変わらず、大事に使っている MacBook ProからMac mini2014上のPostgres.appのPostgreSQLサーバーにアクセスを試みた。

当然ながら、pg_hba.conf等の設定がデフォルトではされていないので、この設定を変更して、 LAN内からのアクセスを許可した。

設定の変更はPostgres.appの公式ページに書いてあった。

しかし、以下のようなpsqlコマンドで接続を試みると

psql -h macmini.local -U kjunichi kjunichi
FATAL: no pg_hba.conf entry for host "fe80::c81c:????:XXXX:????%20", user "kjunichi", database "kjunichi", SSL off 

と、IPv6のアドレスでアクセスしていることが判明。

IPv6の192.168.0.0/24的な指定するには

IPv6ではローカルネットワークでのみ通信可能なIPアドレスとして、

fe80::で始まるアドレスが使われることが分かった。

が、192.168.0.0/24的な指定が分からず、途方に暮れ、IPv6での待受けを行わない、 「*」の代わりに「0.0.0.0」を指定するという極めて後ろ向きな対応しか無さそうで 諦めかけていたが、

マルチキャストDNS, IPv6, PostgreSQL - ブログ - ワルブリックス株式会社

を発見。こちらの記事の指定をpg_hba.confにしたところ、無事接続できました。 ありがとうございました。

学んだこと

  • Bonjour使うとIPv6なアドレスでアクセスするのかも
  • postgresql.confのlisten_addressで「*」を指定するとIPv6でも待受けする。

関連記事

10年前の記事

4年前の記事

mrubyでPostgres.appを使って、LOBも扱ってみた

こんばんは、次男がようやく、トイレで大を出すようになってきたと思いっていたら、またここ数日次男がウンチをしてません。kjunichiです。

背景

Qiitaで

qiita.com

という記事を見かけて、Postgres.appでも、同様にライブラリのパスを指定しないと ビルドでこけるだろうなぁと思った。

そんな訳で、アイコンがなんともエキゾチックでお気に入りのPostgres.appを思い出した。

f:id:kjw_junichi:20160614225225j:plain

mruby-pgをPostgres.appでビルドする

mruby-pgをcloneしてリンクのパスを以下の様に指定。

spec.linker.library_paths << `pg_config --libdir`.chomp

Postgres.appのpg_configを以下の様にパスに追加

export PATH=$PATH:/Applications/Postgres.app/Contents/Versions/latest/bin

他のPostgresに浮気している場合は、パスの先頭に追加する。

mruby-pgの応用編

折角、Postgres.appを使ってmruby-pgが出来たので、何かやらねばということで、 応用編にチャレンジした。

先日、顔検出や、笑顔検出に対応して、一気に機能強化したmruby-webcamで 検出した画像をネット越しに転送できないものかとあれこれ考えていたところ、 PostgreSQLのDBに格納してしまえば良いのでは?とハタと気づいた!

PostgreSQLJPEG画像を保存する

幸いmruby-webcamの画像フォーマットは現在JPEGなので、PostgreSQLに格納しても 他の画像形式よりかさばらない気がする。

まずは、PostgreSQLでバイナリを扱う方法を軽く調べた。

PostgreSQLでのLOBはbytea型らしい

俺調べで、PostgreSQLbytea型を使う事で、バイナリデータを保存出来ることが判明。

以下の様に試しに画像を格納するテーブルを作成した。

CREATE TABLE image_test
(
  id serial,
  data bytea,
  lastupdate timestamp without time zone
) 

mruby-pgってLOBに対応してるのか

以下の様なコードで出来た。

# Establish connectoin
@conn = PG::Connection.new(port: 5432, dbname: "junichi")
#
# sugoi.jpgがmruby-webcamで取得した画像と仮定
data = `cat $HOME/work/sugoi.jpg`

# 画像データの保存
@conn.exec("INSERT INTO image_test(data) VALUES($1::bytea)", [{:value => data, :format => 1}])

def hex2bin(hhh)
  # 初めの2文字(00)を飛ばす。
  hhh.slice!(0,2)
  [hhh].pack "H*"
  #hhh.scan(/../).map{ |b| b.to_i(16) }.pack('C*')
  #hhh.chars.each_slice(2).map { |x| x.join.to_i(16).chr }.join
end

@conn.exec( "SELECT data::bytea FROM image_test LIMIT 1") do |res|
  # 取得したレコードは16進数の文字列で格納されている模様。
  img= hex2bin(res['data'])

  File.open("from_psql.jpg","wb") {
    |f| f.write img
  }
end

学んだこと

pg_configコマンドを知る

pkg-configのPostgreSQLの特化版といったところ。インクルードファイルのディレクトリや、 今回使ったライブラリディレクトリ等を取得できる。

cmpコマンドでバイナリファイルの比較ができる

hex2bin内の処理で先頭の2バイトを削除して対応できたのは、このコマンドのお蔭。

当初は、なぜか、DBからのレコード取得した内容をファイルに落とすと、元の画像より、1バイトサイズが 大きく、fileコマンドでは、dataファイル扱いとなってしまう謎の現象に見舞われたのですが、 このcmpコマンドと、od -cやheadコマンドで、無事、この問題を解決できました。 

mrbgemでライブラリのパスを指定する方法

spec.linker.library_pathsにパスを追加すれば、こちらのパスを優先的にリンクしてくれる模様。

関連記事

8年前の記事

1年前の記事