gitosis で新しいリポジトリを push する時

はい。相変らず不定期更新です。
今回は gitosis で新リポジトリを作って、そこに push する時に怒られた場合の対処です。

エラーメッセージはこんな感じです。

No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as ‘master’.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to ‘gitosis:repo.git’

で、結論としては「git push -u origin master」で OK です。
(もちろん、origin と master は各自で変更してください)

今回は検索でひっかかった次のサイトを参照しました。
サルでもわかる Git 入門:トラブルシューティング

postgresql のストアドプロシージャを移行する

postgreSQL のデータをスキーマ間で移行する作業の時に調べ回ることになったのでメモ。

プロシージャ(かトリガのどちらか)の一覧は「\df」で取得できる所までは、まあ大丈夫とする。
実際のソースは「SELECT prcsrc FROM pg_proc WHERE prcname = 'procedure_name'」で取得できる。

とは言え、これではソースのみであり、完全な CREATE FUNCTION 文ではない。
そこで pg_dump を利用する。

スキーマをダンプする時にオブジェクトを一緒にダンプするように、次の SQL 文を使う。
pg_dump --schema-only --oids -Fp db_name > filename」(必要なら -h、-U、-p 等も使う)
これで希望の CREATE FUNCTION 文を入手できる。後はエディタでちゃっちゃと編集すればいい。

もしかすると、適当な空のテーブルを作っておいて「-t tablename」を指定すると、余計なスキーマ情報が入らないかもしれない。…と思って試してみたら駄目だった。

あとは psql で入って「\i filename」で読み込めば OK となる。

debian の preseed.cfg で躓いた所

昨日に引き続き仮想マシン関連で、インストールを自動化しようと Debian の preseed.cfg をいじった記録。

一番大きな問題は apt のプロキシ設定で、ホスト名だけかと思ったらフル URL を入れる必要があったという話。
具体的には「d-i mirror/http/proxy string http://host:port/」と入れなきゃダメ。(port は apt-cacher-ng なら 3142)

あとはまあ、以下を変更するくらい。

  • d-i debian-installer/locale string ja_JP.UTF-8
  • d-i mirror/http/hostname string ftp.jp.debian.org
  • d-i time/zone string Asia/Tokyo
  • d-i clock-setup/ntp-server string jp.pool.ntp.org
  • d-i base-installer/kernel/image string linux-image-amd64
  • tasksel tasksel/first multiselect standard
  • d-i pkgsel/include string openssh-server

気分と趣味によっては以下も。

  • d-i netcfg/choose_interface select eth0
  • d-i netcfg/get_hostname string preseed-test
  • d-i netcfg/get_domain string vagrant.com
  • d-i apt-setup/non-free boolean true
  • d-i apt-setup/contrib boolean true

それから、「d-i keyboard-configuration/xkb-keymap select us」になっていても再起動後のキーボード設定は日本語になっており、なぜか「loadkeys us」も効かないようなので /etc/default/keyboard で「XKB_LAYOUT=”en”」にして再起動すると直る模様。ちなみに PuTTY とかで SSH 接続した場合は、設定してなくても問題無く英語キーボードで使える。

debian 7.6 に docker をインストール

docker がブームらしいという事で、仮想マシンの debian 7.6 にインストールしようとしたら躓いたのでメモ。

探してみた手順では以下のようになっていた。
$ sudo apt-get install -qqy ca-certificates
$ sudo apt-get install apt-transport-https
$ sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
$ sudo sh -c "echo 'deb https://get.docker.io/ubuntu docker main' | tee /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update && sudo apt-get install -qqy lxc-docker

ところが、この手順で apt-get update したところ、docker リポジトリが取得エラーになってしまった。メインマシンから https で対象サイトにアクセスすると、ちゃんと Packages が取得できてたので悩んだ。

色々試してみたところ、結局 docker.list の中身を次のように書いたら動いてくれた。
deb http://get.docker.com/ubuntu docker main
(サイトの「io」を「com」に、「https」を「http」に変更した)

wget では https でも取得できてるので、何故こうしないと動かないのかは不明。

追記:よく見たら関連リンクに 7.6 用の手順があった…

on lisp 用のユニットテストで困った件

買ってから放置してあった「On Lisp」を読み始めたんですが、どうせだからサンプルソース用のユニットテストを書いてみようと思ったのが、この話の始まりです。

とりあえずユニットテストフレームワークについて調べ回って、FiveAM がいいんじゃないかという事になりました。
最初の方は大した問題も無く、すらすらと(←一部誇張あり)テストを書けました。
で、コンソールとの入出力を行うユーティリティの章まで進んだところで壁(たぶん Lisper には路肩の段差程度)にぶつかったのです。
続きを読む

MySQL の varchar 最大文字数について

掲題の件でちょっと引っかかってしまったので、忘れないようにメモしておきます。

MySQL のリファレンスを見ると、「10.5 データタイプが必要とする記憶容量」ページに 『varchar 型カラムの有効最大長は 65532 まで』と書いてあったので、素直に「varchar(65532)」で使おうとしたら怒られました。
というか、勝手に mediumtext に変更されてしまいました。

仕方無いので色々試していたところ、なぜか「varchar(20000)」だと通ったので、その後に alter table でカラム長を varchar(25000) に増やそうとしたところで 「最大 21845 までしか使えへんで(意訳)」というお叱りを受け、そういえば UTF-8 が最大3バイト食うんだっけと思い出して 3 × 21845 を計算してみたら、ぴったり 65535 だったというお話でした。

つまり varchar のサイズ指定は、最大でも「65535 ÷ 文字のバイト数」までしか使えないという教訓を得たのでした。
あと、text系のカラムでも「長さ=文字数×文字のバイト数」で計算されるようです。上の例で text よりも長い型である mediumtext (2^16(=65536) < L < 2^32) に変換されていた事から気付きました。