開発に SQLite を使う時の注意点

皆さんは Web アプリの RDBMS には何を使っていますか?
巷では MySQL(MariaDB)、Oracle、PostgreSQL あたりが主流と聞きます。

しかし、これらを開発時に使うのはセットアップが面倒ですよね?
はい、そこ「Docker 使え」とか言わない。

面倒なので SQLite を使ってしまう時ありませんか?
え、使わない?ここは「使う」って言う所ですよ。空気読んでください。

というわけで(無理矢理ですが) SQLite で開発する時のトラップ注意点です。

一言で済みます。「データ型が INTEGER、REAL、TEXT、BLOB しかない!」のです。
つまり DATE とか TIME とか TIMESTAMP とかが無いのです。
まあ、他に DECIMAL とか BOOLEAN も使えませんが今回は見なかったことにします。

よって、SQL 文で日付形式や時間形式の演算および比較ができません。
…ええ、お察しの通り色々コード書いてから気付きましたとも。
指定日を含む期間を探す関数のテストを書いた時に判明しましたよ…
なまじ(文字列型としての)比較が期待通り動くものだから発覚が遅れました。

これから PostgreSQL を準備して再テスト&書き直しです。
Twelve factor app 10.開発/本番一致の意味が身に染みました。
願わくば、この記事が誰かの転ばぬ先の杖になると良いのですが。

gitprep の docker 化

前略
クラウド(ようやく)始めました。

「そうだ、Gitprep 入れてみよう!」
→ セットアップでエラー
→ いろいろ試してもエラー
…サーバ引っ越しの度にこんなエラー地獄では耐えられません。

「そうだ、Docker 使おう!」
→ perl イメージある
→ mojolicious イメージある
→ ソースコード足せば動く?

(3時間経過)

「や、やっと動いた…」
→ 他にも同じ苦労をする人がいるかも…(← いません)
→ 公開しなきゃ
→ ウェブログに投稿だ!

(1時間経過)

「記事書けたけど Dockerfile より短い…何故?」 ← 今ここ
作ったファイルはこちら

nodoka で右 Shift キーが効かなかった件

昨日に引き続きキーカスタマイズのネタです。

実は Windows で Emacs 似のキーバインドを使いたいために nodoka というユーティリティを使っているんです。
で、今まで気付いては忘れてた挙動に「右 Shift キーでは Shift されない」というのがありました。

今回よく調べてみたところ、nodoka を一時停止すると問題無く Shift されるので、設定が原因だろうと色々試しました。
調査とログのダイアログを駆使して探った結果、下のような設定で無事に動きました。


# 右 Shift のキー名を定義
def key E0RightShift E0RShift = E0-0x36
# 右 Shift を 左 Shift とみなす
def subst E0RShift = LShift
# 仮想キーの Shift が押されるように設定
keymap Global
mod shift += E0RShift
key *E0RShift = *LShift
# nodoka を使いたくないキーマップ(KeymapDefault)にも適用
keymap KeymapDefault
mod shift += E0RShift
key *E0RShift = *LShift

これはマニュアル(カスタマイズ詳細)中央あたりの次の部分を参考にしました。

なお、右シフトキーが使えないことは致命的なので、ホスト側の のどか設定ファイルでは、window RemoteDesktop /mstsc\.exe/ を記述し、ホスト側でのキー入れ替えは無いことにして、リモート側のどかの設定ファイルでは、下記のような設定をすると良いでしょう。

def key E0RightShift E0RShift = E0-0x36

mod shift += E0RShift

key *E0RShift = *LShift

カスタマイズまわりはハマると面倒ですね。

Putty 経由の Emacs で C-M-S-v が入らない件(未解決)

今回は Emacs です。
以前から使ってはいたのですが、ここを参考に設定しなおしてみようかと思いまして。

とりあえず Ubuntu Linux の仮想マシンを用意して Putty でログインして Emacs をいじっていました。
で、サンプルの通りにキーバインド「C-,」を割り当てて使ってみると動きません。
現在の割り当てを調べる「C-h c C-,」を使ったところ、どうも「C-,」が Linux に入っていないようでした。

この問題については最終的にこのサイトを参考にして解決できました。

該当ページ中から「xterm風定義」リンクを辿ると他のキー一覧もあります。
その中でカンマを示す「VKey188」の行ですが、以下(4番目が \033[27;6;60~)が正しいのではないかと思います。
VKey188=\054,<,\033[27;5;44~,\033[27;6;60~,\033\054,\033<,\033[27;13;44~,\033[27;14;60~

引き続いて「C-M-v」の別ウィンドウスクロールの逆方向版を「C-M-S-v」(Shift を追加する)に割り当てようとしましたが、こちらは解決できませんでした。
「C-,」と同様に「VKey…」を追加すればいいかと思って下のように色々試したのですがダメでした。

試した内容

  • VKey86=,,,,,,,\033[27;14;118~
  • VKey86=,,,,,,,\033[27;14;86~
  • VKey86=,,,,,,,\033[27;14;v~
  • VKey86=,,,,,,,\033[27;14;V~
  • VKey86=,,,,,,,\033[27;5;118~
  • VKey86=,,,,,,,\033[27;5;86~
  • VKey86=,,,,,,,\033[27;5;v~
  • VKey86=,,,,,,,\033[27;5;V~

カンマ区切りのキーコード出力部の内容は 「\033[27;≪修飾コード≫;≪キーコード≫~」だろうと思っています。
この中にある「27」は多分 Escape キーの VKey コードでしょう。

どれも思うようにいかなかったので、現在はエスケープシーケンスの規則を調査中です。
参考サイトに書いてある気もしますが、英語を読むのが面倒なので Try&Error で頑張ります。

参考サイト

ちなみに「C-,」問題は nadoka で「key C-Comma = &SendText("\e[27;5;44~")」でも解決できましたが、対象文字列を入れる時に一文字ずつ(少しだけ)ウェイトがかかって微妙な気分になるので止めました…

コードのスタイルを統一するなら EditorConfig

複数の作業環境を渡り歩いてソースコードを編集することって結構ありますよね?
こんな時、新しく編集した部分だけインデント文字(タブかスペース)やオフセットが変わってしまって、手作業でスタイルを合わせる破目になった経験があるでしょう。
テキストエディタが同じなら作業前に設定ファイルをコピーすればなんとかなりますが、違うエディタだと設定に使った時間の方がコーディング時間より長くなったという悲劇(笑い話?)も聞きます。

そんな時に頼りになる最終兵器 EditorConfig を発見しました。
共通の設定ファイルを用意しておけば、エディタにプラグインを入れるだけで同じスタイルで書けるようにしてくれます。
設定できる項目はインデント文字、オフセット幅、改行文字、文字コード等です。
ディレクトリを遡りながら設定ファイルを探すので、スタイルがプロジェクトごとに違っていても対応できます。

興味がわいた方は、分かりやすい説明がここにあるので参照してみてください。

参考

  • 公式サイトはここ
  • Emacs 用プラグインは Github

パスワードの別メール送信は無意味

仕事でファイルをメールする時に、暗号化したファイルを添付したメールと、そのパスワードを書いたメールを別々に送信するケースをよく見かけます。

私はこれを無意味だと思っています。
なぜなら、暗号化ファイルのメールを入手できるならば、パスワードのメールも入手できると考えるのが妥当だからです。
暗号化ファイルとパスワードの両方が揃ってしまえば、元のファイルを(暗号化せずに)そのまま送ったのと同じ事になります。
むしろ『安全に送った』気になる分だけ逆に危険です。

安全な方法で一番簡単なのは『電話する』ことです。
次点としては『SMSで送る』(スマホや携帯で相手の電話番号を使ってメッセージを送る機能)でしょうか。
どちらの場合も『メールとは別の手段』を使って『メールアドレスとは別の方法』で指定した相手に伝わる点が重要です。

どうしてもメールする場合には、せめてパスワード文字列の一部分だけを伝えて、それの【前】と【後ろ】に事前に決めておいた文字列を追加するくらいの用心をすべきです。
例えば【前】には「mae_」を、【後ろ】には「_usiro」を付けると事前に決めておけば、メールで「pass」と送った場合の実際のパスワードは「mae_pass_usiro」になるわけです。
次の機会にパスワードとして「word」とメールしたら、実際のパスワードには「mae_word_usiro」を使えばいいわけです。
これならばメールにパスワード全文が記載されないので、多少はマシになります。
もちろん、前後に追加する文字列はメール以外の手段で伝えるのは言うまでもありません。

ちなみにパスワードの類似品として『パスフレーズ』というものが使える場合もあって、きちんと使えばこちらの方が強度が高いそうです。

以上、知らないと怖いパスワードの話でした。

暗号化とか署名とかハッシュとか

まずは、ざっくりとした一覧です。

こうしてまとめてみると、思っていたよりも色々ありますね。

特に Windows に certutil コマンドがあって、エンコードとハッシュ計算ができるのには驚きました。

それと、暗号化ファイルを元に戻す時には(大抵の場合)同じソフトが必要になります。 渡す相手には何のソフトで暗号化したか伝えておきましょう。

バッチの find | xargs では -r オプションを付けること > 未来の自分

今回は短いです。ライトニングな感じです。

xargs なんですが、結構 find と組み合わせて使いますね?
…使いますよね?
…ここは空気読んでウソでも「使う」って言う所ですよ?

で、パイプした find の出力が空だった場合でも xargs の部分が実行されてしまうんですよ。
衝撃の事実ですね。ええ、インパクトありますよ。rm -rf とか食わせてると特に…
まあ、今回はテストで echo 付けてあったので死なずに済みましたが。

というわけで、crontab とかのバッチ処理の時は xargs -r の使用を考慮しましょう。
こうすると、入力が空の時には xargs に食わせたコマンドが実行されません。
バッチ利用(大抵は cron)の時は付けた方がいいと思います。

common lisp で何か書いてみる(その2)

どうも。
最近の投稿ペースが速くて自分でも驚きながら書いています。

さて、引き続き caveman2 で何か書いてみようという話です。
が、今回もまた自前のコードを入力する機会は訪れませんでした…

とりあえず目次は以下の通りです。

  • Road to qlot:quickload
  • 穴居人が立ち上がる時

■Road to qlot:quickload

結論:行ってみた限りでは全部行き止まりでした。

や、色々試したんですよ、ホントに。

qlfile の中身を次のようにして、それぞれコメントアウトしながら全部試しました。

# qlfile

github caveman2 fukamachi/caveman
# git caveman2 https://github.com/fukamachi/caveman.git
# ql caveman2 :latest

インストールコマンドも色々やってみました。

  • プロジェクトディレクトリで
    • (qlot:install :myproj1)
    • (qlot:install)
    • (qlot:install :caveman2)
  • プロジェクトディレクトリの一つ上で
    • (qlot:install :myproj1)
    • (qlot:install)
    • (qlot:install :caveman2)

見付けた変数を変えてみたりもしました。

(setq ql-setup:*quicklisp-home* #P"~/myproj1/")
(qlot:quickload :caveman2)

上の色々な組み合わせも試しました。

最終的に挫折しました…(泣)

■穴居人が立ち上がる時

で、qlot を使わずに caveman2 だけでも動かしてみようと試行錯誤して、こちらは何とかサーバを立ち上げる事ができました。

前回で (ql:quickload :caveman2) は通るようになったので、github の README を読みながら進めていきます。

最初のプロジェクト作成は caveman2:make-project で問題無く終了です。

続いて、とりあえずテスト稼動が目的なので、ルーティングとかデータベース操作とかはどんどん飛ばして、サーバの立ち上げに入るわけです。

書いてある通り、おもむろに (myproj1:start :port 8080) を実行… 当然パッケージ myproj1 が無いと怒られます。
そして毎度の如く、苦闘の日々が始まるのです。

まあ、状況としては windows ユーザに linux の bash プロンプト使わせるようなものですね。
やりたい事は分かってるのに、どうやればいいのか分からないというジレンマに陥るわけです。

最終的に動くようになるまで

  • ファイルパスの指定方法
  • 読み込ませるファイル選択

で悩む事になりました。

パスの指定方法は make-project の引数にあったので、それでいけるはずです。
が、カレントディレクトリが何処なのかとか、うっかり #P を付けずに文字列で書いてしまったりとかで、なかなかうまく行きませんでした。

さらに、読み込むファイルが分からないという点が問題の複雑さに拍車をかけることになります。

コマンドの方は load か require あたりだろうと推測しましたが、ファイルに関しては見当もつかなかったので、考えていても仕方無いと割り切って総当たりして解答に辿り着きました。

誰かの役に立つかどうか怪しいところですが、いちおう最終形を載せておきます。

(ql:quickload :caveman2)
(caveman2:make-project #P"~/myproj1/" :author "myname") ; '#P' を付けないとエラー、ディレクトリは未作成でもよい

(load #P"~/myproj1/myproj1.asd") ; これと次は '#P' 無しでも動いたが、一応付けておく
(load #P"~/myproj1/app.lisp")
(myproj1:start :port 8080)

以上です。

VirtualBox のホストオンリーネットワークアダプタで困った件

ここ数日、いろいろ躓いてばかりな気がしますが、今度は VirtualBox のお話です。

毎回だらだらと長い文章になってしまうので、簡潔に書いてみます。

問題:ホストオンリーアダプタのネットワークでホストマシンだけ接続できない
結論:以前の設定が悪さをしてる場合があるので、未使用のサブネットアドレスを割り当ててみると改善される事がある

以上… では説明不足ですよね、はい。

まず VirtualBox の仮想マシンでホストオンリーネットワークアダプタを使っていました。
それで、ホストマシン(VirtualBox 自体を実行してる方ですね)をスリープしてから復帰すると、ホストだけが該当のネットワークで通信できない状態になっていました。
その間もゲストマシン(仮想マシンの方です)同士では問題無く通信できていました。

このような状況でも、最近までは仮想マシンを利用しての開発が無かったので特に問題ありませんでした。
ところが、ここ数日で やれDockerだ common lisp だと仮想マシンを使い倒すようになったため、この接続不良による再起動の嵐が非常に面倒になりました。

同じ問題で悩んでいる人がいるかと思い google 先生に検索してもらって幾つか事例を見て回ったのですが、現象が微妙に違っていたり、書いてある通りに試してみても効き目が無かったりと、うまくいきませんでした。
しかも、途中から「コントロールパネルのネットワークアダプタを無効にするとアイコンが消える」という新たな問題も発生したのです。

その後紆余曲折があり、最終的にはクリーンな状態になるよう

  1. 今あるホストオンリーアダプタを全部削除
  2. 再起動
  3. 今のバージョン(Ver 5.0.x)をアンインストール
  4. 再起動
  5. 以前のバージョン(ver 4.3.x)をインストール
  6. 再起動
  7. ホストオンリーアダプタを新規追加
  8. 再起動
  9. 仮想マシンのネットワークアダプタを新しいのに変更

という作業をして、接続を試しました。
ところがやっぱり駄目で、途方に暮れかけた時にゲスト側に不自然な点を発見したのです。
この時は VirtualBox の設定で DHCP サーバを OFF にしてあったのですが、何故かゲストが DHCP で IP アドレスを取得していました。
不思議に思って別のサブネットに変更してみたところ、それが大当りだったらしく嘘のように素直に仮想マシンと通信できるようになったのです。

それまでに散々いじったので、最後のサブネット変更が決定打だと言い切ることはできませんが、これが最も有力だと思います。
思い返してみると、確かに以前ホストオンリーアダプタを作成したまま virtualbox をアンインストールしたことがありました。
その後に新バージョンを入れ直した時にも、何故かインストール直後にアダプタが有り、気になった覚えもあります。

このような点から、最初に書いた結論が導きだされた次第です。
この記事が解決事例の一つとして、どなたかの参考になればいいなと思います。