HTTP2でexpressを動かす
こんばんは、息子たちと奥さんが海外出張の為、実家に来ています。近所に住んでいる長男と同い年の従兄弟と三人で今回も元気に過ごしています。@kjunichiです。
背景
の記事にあるように、mruby-webcamで、大量に顔検出した息子たちデータがあり、mrubyで登録したbytea型の 画像データが意図した通り、PostgreSQLに登録されているかの確認も込めて、mruby以外の処理系での確認ということで、 node.js+expressでタイル表示させた。
そこで、大量のhttpアクセスにはHTTP/2.0が向いていることを思い出した。
node-spdyモジュールを知る
長いこと、node-http2モジュールしか知らなかったが、
のスレッドで、node-spdyがspdy以外にhttp2も扱えることを知った。 しかも、作者はnode-ffiでも以前、神対応されてる方なので、期待が高まる。
expressをnode-spdyで使う
オレオレ証明書
証明書買えないし、Let's encrypt使えそうな環境身近にないから、以下でオレオレ証明書を作る。node-http2やtrusterdやh2oと違い、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);
関連記事
- io.jsでmruby実装のhttp2サーバーのtrusterdを動かした
- http2 ハッカソン #5に行ってきた
- libtrusterdでHTTP/2でphpを動かして分かったこと
- libtrusterdでHTTP/2でphpを動かして分かったことのその後 #知見
- JulialangにHTTP2サーバーをさせたら
- ElectronはHTTP2が喋れないのか?
- mrubyのHTTP2サーバー(trusterd)をRack APIに対応させる その1
- mrubyのHTTP2サーバー(trusterd)をRack APIに対応させる その2
- mrubyのHTTP2サーバーでWebGLでGopherを出そうとした
11年前の記事
7年前の記事
5年前の記事
4年前の記事
まさかPostgreSQLを触って、IPv6の知識が増えるとは
おはようございます。最近長男は聞き分けがよくなってきて、助かってます。ちょっと我慢して、こちらのやってほしいことを先にやって、後で、自分のやりたかったことをすると言ったことが出来てきました。今出来ないけど、後から出来るということを理解できてきた様子です。@kjunichiです。
背景
なる記事を書いて、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でも待受けする。
関連記事
- mrubyでPostgres.appを使って、LOBも扱ってみた
- OSXで最速でOCamlでPostgresqlに接続するには
- npm install pgだけでは済まない件
- 64ビット版のVistaでPostgreSQLをODBC経由で使うには
- PostgreSQL 8.0 on XP
- PostgreSQLのVACUUME
- PostgreSQL on Mac OS X(Intel)
- PostgreSQLの困ったエラー
- postgresql-8.2-ja.msi
- PostgreSQLの謎
- PostgreSQL 8.4への移行で苦戦中
- PostgreSQL 9.0への移行~失敗編~
- 結局今回も
- WindowsでPostgreSQLをソースからビルドした
10年前の記事
4年前の記事
mrubyでPostgres.appを使って、LOBも扱ってみた
こんばんは、次男がようやく、トイレで大を出すようになってきたと思いっていたら、またここ数日次男がウンチをしてません。kjunichiです。
背景
Qiitaで
という記事を見かけて、Postgres.appでも、同様にライブラリのパスを指定しないと ビルドでこけるだろうなぁと思った。
そんな訳で、アイコンがなんともエキゾチックでお気に入りのPostgres.appを思い出した。
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に格納してしまえば良いのでは?とハタと気づいた!
PostgreSQLにJPEG画像を保存する
幸いmruby-webcamの画像フォーマットは現在JPEGなので、PostgreSQLに格納しても 他の画像形式よりかさばらない気がする。
まずは、PostgreSQLでバイナリを扱う方法を軽く調べた。
PostgreSQLでのLOBはbytea型らしい
俺調べで、PostgreSQLはbytea型を使う事で、バイナリデータを保存出来ることが判明。
以下の様に試しに画像を格納するテーブルを作成した。
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にパスを追加すれば、こちらのパスを優先的にリンクしてくれる模様。
関連記事
- OSXで最速でOCamlでPostgresqlに接続するには
- npm install pgだけでは済まない件
- 64ビット版のVistaでPostgreSQLをODBC経由で使うには
- PostgreSQLのVACUUME
- PostgreSQL on Mac OS X(Intel)
- PostgreSQLの困ったエラー
- PostgreSQLの謎
- PostgreSQL 8.4への移行で苦戦中
- PostgreSQL 9.0への移行~失敗編~
- 結局今回も