時間の掛る Webサーバ

ちょっと処理時間のかかる Webサーバとお付き合いしてて、手元でも確認したくて時間のかかるサーバを作る。過去記事でも TLS1.2 サーバ - hs9587’s diary とか "小さい"Rackアプリケーション - hs9587’s diary とか Webサーバあったよね。

require 'webrick/https'

proc = lambda do |req, res|
  puts start = Time.now
  sleep 10
  res['Content-Type'] = 'text/plain'
  res.body = "start: #{start}.\nstop : #{stop = Time.now}.\n"
  puts stop
end

srv = WEBrick::HTTPServer.new(
  Port: 3001,
#  DocumentRoot: './',
  SSLEnable: true,
  SSLCertName: [['CN', 'foobar']],
  )
#srv.ssl_context.ssl_version = :TLSv1_2

srv.mount_proc '', proc

trap('INT'){ srv.shutdown }
srv.start

やっぱり TLSしゃべった方がいいよね、その辺を WEBrick で指定し、ディレイのあるメソッドを class WEBrick::HTTPServer (Ruby 2.6.0)#mount_proc で割り当てる、 sleep の数字秒ディレイする。割り当てディレクトリ指定空文字列にしとくとなんででも来る、どんなので来てるかは req (class WEBrick::HTTPRequest (Ruby 2.6.0))にある。
こんな感じで ruby で実行する、INT 捕まえて Ctrl-C で終わるようにしてる。

Yahoo!ジオシティーズ サービス終了

ここの記述を遡るとジオシティーズに行き着くのだが

おしまいということである

案内に従ってFTPでファイルをダウンロードする。FTPクライアントWindowsコマンドラインでもいいのだけど、サブディレクトリたどって再帰的に取ってくるのは大変か、 WinSCP でも使おうか。

ローカルで確認すると、なかのリンク先や自分で作った画像のアドレスは原則相対アドレスなのでそのへんはリンク切れなさそう。ただ、ジオ提供の画像がそれなりにあるのはどうしようかな、ルートからの記述になってるので全部書き換えるのは大変、まあなくてもいいでしょう、alt の記述あるのも多い。

ローカルに保存するけど一応 Webにも置いとく、これも WinSCP でアップロード

特にジオの転送設定はしない。

データベース毎の容量、 pg_database_size と du -s #{datid}

PostgreSQL でのデータベース毎のディスク容量をみる

psql -tAF $'   \t' -c 'select pg_size_pretty(pg_database_size(datname)),datname from pg_database order by pg_database_size(datname) desc;' | less

外形的にOSからみた容量なら

(ruby -e 'dats=Hash[* `psql -tAF#{39.chr} #{39.chr} -c #{39.chr}select datid,datname from pg_stat_database order by datid;#{39.chr}`.split ]; Hash[* %x[du -sh #{dats.keys.map{ |id| "/var/lib/pgsql9/data/base/#{id}" }.join(" ")}].split ].map{ |size,dir|id=dir.split("/")[-1]; "#{size}\t#{dats[id]}  \t#{id}\n" }.join.display' ; du -sh /var/lib/pgsql9/ ) | sort -hr | less

たいした差は無いが後者の方が若干多いか。 '/var/lib/pgsql9/data/base/' はデータのある場所、Amazon Linux でのパッケージインストールの場合、そして postgresユーザ。バッククォートと %x が混じってるのに特に意味は無い、タブ文字の前の空白文字は自分の状況での表示の調整。

参考

TLS1.2 サーバ

ちょっと TLS1.2 での通信を確かめることになって、たしかに TLS1.2 でしゃべってる HTPPSサーバが欲しかった。

ruby -r webrick/https -e 'WEBrick::HTTPServer.new(:Port=>3001,:DocumentRoot=>"./",:SSLEnable=>true,:SSLCertName=>[["CN", "foobar"]]).tap{|s|s.ssl_context.ssl_version=:TLSv1_2}.start'

取敢えず簡便なものが欲しいのでワンライナーで。

Port 指定注意、無しだと 80番を取りに行って駄目ならエラーになる、駄目じゃないときはそれはそれで危ないときなので注意。大体ドキュメントルートとして実行場所のローカルファイルさらしてる訳で、ローカルだけで見るようにしましょう。

SSL/TLS 用なので webrick/https library webrick/https (Ruby 2.5.0) をリクワイアする、これで webrick 自体もリクワイアされる。/https なしでも SSLEnable 指定は通るが別に SSL/TLS にはならない、設定値のハッシュにそのキーが追加されるだけということだろう。

webrick/httpsクワイアして :SSLEnable=>true にすると最低限 :SSLCertName も指定しないとエラーになる、これは
class OpenSSL::X509::Name (Ruby 2.5.0) の指定になるので、配列の配列が必要、最低限の指定ならまあ ”CN” にしときましょう。

そしてプロトコルを TLS1.2 に限りたいので
class OpenSSL::SSL::SSLContext (Ruby 2.5.0) #ssl_version= で指定する、選択肢は
constant OpenSSL::SSL::SSLContext::METHODS (Ruby 2.5.0) にある。このリストに :TLSv1_2 がない環境だとちょっと悲しい。ここで
instance method Object#tap (Ruby 2.5.0) を使ってる、HTTPServer.new の引数でなんとかならないかと思ったけど難しい、ここではハッシュ引数にしてるが、
constant WEBrick::Config::HTTP (Ruby 2.5.0) を渡してもいい、そのときは WEBrick::HTTPServer.new(WEBrick::Config::HTTP.tap{|c|c[:Port],c[:SSLEnable],c[:SSLCertName]=3001,true,\[\["CN","foobar"\]\]}) とでもするのだろうか、それで #ssl_context(OpenSSL::SSL::SSLContext) に触れないか。

最初のワンライナーに戻る。これを実行して適宜ブラウザからアクセスすると確かに TLS1.2 をしゃべってる、ほかのプロトコルではしゃべらない。ブラウザ表示ページのプロパティや、ブラウザの設定で使うプロトコルを調整したりで確かめた、 ssl_version=:TLSv1_2 のところも :TLSv1_1 やさらに下位にしてみたり。

あと、この辺のスクリプトはそこそこ古い Ruby でも動く、なのでハッシュ引数は古い記法で書いてる、まあそんな環境ではプロトコルの選択肢に :TLSv1_2 が出てこない訳だ。

ぶろぐ移行続き、というかこちらの編集画面をひらくまでのあいだ。はてなブログの管理画面つづき

 

「インポート設定」画面


インポート設定 画面
Rubyとか Illustratorとか SFとか折紙とか  hs9587’s diary ? 
投稿数 370
コメント数 85

3ステップでかんたんインポート

STEP1 記事のインポート
「確認画面へ進む」釦押下、

このはてなダイアリーをインポートします。よろしいですか?
「インポートする」釦押下

インポートしています... 画面

プログレスバーの進行は結構ゆっくり、みてるあいだはすすまない、20分くらいしてみたら終ってた


STEP2 はてなブックマークの移行
はてなブックマークを移行する」釦押下
「… 本当によろしいいですか?」ダイアローグ「OK」
 これはわりと一瞬、まあブックマーク殆どないしね


STEP3 記事のリダイレクト
「リダイレクト設定する」釦押下
「… よろしいいですか?」ダイアローグ「OK」

「おめでとうございます! インポートが完了しました!」

はてなブログ

はてなブログ へ移行しようか、はてなダイアリーからのインポート(ブログの移行) - はてなブログ ヘルプ

ええと、まず  ブログを作成 - はてなブログ で移行先 hs9587’s diary を作成、すべての人に公開 でいいや。「まだ記事がありません」と。

はてなブログ画面右上の「hs9587’s diary」リンクから「設定」で管理画面、左辺メニューの「インポート」を選ぶ、インポートもとのタブで「一般のブログ」「はてなダイアリー 」とあるの「はてなダイアリー 」を選ぶ、所要の「Rubyとか Illustratorとか SFとか折紙とか」が(だけ)でてくるので「インポート設定」釦、「インポート設定」画面になる、この辺でこの記事は保存してそっちの画面での操作を続ける

S3 で JavaScript の s3.copyObject() のパラメータ

AWS の Lambda の Node.js の JavaScript で S3 のオブジェクトをコピーする copyObject() メソッドのパラメータ指定でちょっとはまった。
S3においてあるファイル(オブジェクト)を S3内で(自分のアカウントの許す中で)コピーするのに、JavaScriptで、下記とでもするのだけど

s3.copyObject(params, (err, data) => {
  if (err) {       // an error occurred
    console.log(err, err.stack);
    callback(err);
  } else {         // successful response
    console.log(data);
    callback(null, data.ETag);           
  };
});

この params の指定、要するに下記、

var params = {
  CopySource: "<コピー元バケット名>/<コピー元のバケットの続きのキー名>(バケット名先頭に「/」はいらない一方キー名と繋げる「/」は忘れずに)",
  Bucket: "<コピー先バケット名>(前後に「/」はいらない)",
  Key: "<コピー先のバケットの続きのキー名>(先頭に「/」はいらない)"
};

CopySource はコピー元をバケット名から、Bucket はコピー先バケット名、Key はコピー先のその続きの記述、コピー元とコピー先で設定の対称が崩れてるの注意。

勿論他にもいろいろ指定できる、Class: AWS.S3 — AWS SDK for JavaScript

はまったのは、このマニュアルにもあるが、まず必須項目が Bucket, CopySource, Key と並んでて、はじめ Bucket はコピー元のバケットかと誤解してしまった。多分必須項目をアルファベット順に並べてるだけなんだと思う。まあ、S3 のはなしをずっとしてると、Bucket と Key でそのとき注目するファイル(オブジェクト)を指定するのは確かにそうなんだけど、ここではそれがコピー先のことのみとは、コピー元のバケットとか関係ないとは、はじめ思い及ばなかった。

で、CopySource がちゃんとしてないと(バケットのあたりがないとか)、「[AllAccessDisabled: All access to this object has been disabled]」とかいわれて、アクセス権限の指定とか確かめに行ってしまい、ちょっと(少し、もっと)回り道した。

それから、 copyObject() は個々のファイル(オブジェクト)のコピーで、フォルダまとめてのコピーは出来ないみたい、そんなメソッドもなさそうで、そういうときは苦労します。