Word で画像の圧縮

Word に画像を貼り付けると 元の画像のサイズよりも小さくなることがあります。 さらに手動で画像を圧縮することもできます。

まず元のになる Word ファイルを作ります。
「こんにちは」とだけ書いて 24KB です。 (Word 2003)

WRITE_0xxx_01

1407KB の bmp ファイルを挿入して保存すると 378 KB になりました。 元の画像サイズよりも Word ファイルは小さくなりました。

WRITE_0xxx_02

ここでさらに画像を右クリックして、メニューから 「図の書式設定」を開きます。 「図」タブの左下にある「圧縮」ボタンを押します。

WRITE_0xxx_03

「図の圧縮」ダイアログが表示されます。

WRITE_0xxx_04

「設定の対象」で「ドキュメント内すべての図」を選択すると 一括で圧縮することができます。

「解像度の選択」ではデフォルトが「印刷」になっています。 画像を貼り付けたときに自動で「印刷」になるようです(どこかに設定があるのかもしれません)。 今回は「 Web/ 画面」を選択します。

Word のサイズが 93 KB になりました。
当然、画像や大きさに影響されますが、「少しファイルサイズが多きいかな」と思ったときは 画像を見比べながら圧縮してみると良いと思います。

また、「図の圧縮」ダイアログでは、図のトリミング部分を削除することもできます。

WRITE_0xxx_05

通常トリミングした部分も広げなおせば表示されるようにデータは持っているのですが 完全に不要な場合は、この「図のトリミング部分の削除する」を実行しておけば不要なデータが無くなり ファイルのサイズを小さくすることができます。

第2回 HTML5など勉強会 に行ってきました

9/24 の土曜日に大阪の中崎町で HTML5-WEST.jp 主催の 「第2回 HTML5 など勉強会」が 開催されたので行ってきました。

[参考]
第2回「HTML5など勉強会」を開催いたします - HTML5-WEST.jp

「HTML5 など勉強会」は HTML5 やそれに関連技術を発表し合い HTML5 に関心のある方々の技術の向上 情報交換を行い 関西の技術者を盛り上げていこう、という勉強会です。

今回は、LT を予定していた人が体調不良とのことで プレゼン 3 本+代理の村岡さんの発表でした。

weiner でのモバイル Web アプリのリモートデバッグについて
スマートフォンやテレビのブラウザなど、実機でのデバッグが難しい環境が 増える中、JavaScript などのリモートデバッグをするためのツール weiner の紹介でした。
Node.js のフレームワーク SocketStrem について
SocketStrem という WebSocket や Socket.IO を使った Node.js の フレームワークの紹介でしたがその中で使われている CoffeeScript の方に 質問が集中していました。
モバイルブラウザからのカメラ操作について
Web アプリの場合 OS の機能をあまり使えないのが弱みなんですが Andoroid の Opera Mobile のテストビルドでカメラを JavaScript から 操作できるものがあり、それを使って未来を夢見ながらのサンプルアプリの紹介でした。

村岡さんのデモが動かなかったのがちょっと残念でしたが モチベーションを高められた良い勉強会でした。

Word のアンカー

Word に次のように図や図形などのオブジェクトを入れた場合、 オブジェクトはどこかの段落に属することになります。

WRITE_0449_01

オブジェクトが属している段落を削除すると オブジェクトも一緒に削除されます。

どこの段落に属しているかを表示するには 「段落」メニューにある「編集記号の表示」を ON にします。

WRITE_0449_02

「編集記号の表示」が ON の状態でオブジェクトを選択すると オブジェクトが属している段落の左側にイカリのマーク(アンカー)が表示されます。

WRITE_0449_03

アンカーをドラック&ドロップで別の段落に移動させると オブジェクトが属する段落を変更することができます。

次のようにオブジェクトと離れた場所にある段落に アンカーを設定することもできます。

WRITE_0449_04

離れた場所でも段落を削除すればオブジェクトも削除されます。 アンカーの付いた段落を複写するとオブジェクトも複写されます。

Word でいろいろクリアするショートカット

Word にはスタイルなどを クリアするショートカットが いろいろあるので 覚えておくと作業が 結構スムーズになります。

Ctrl+Shift+N
スタイルを「標準」に戻します。
Ctrl+Space
文字書式だけをクリアします。
Ctrl+Q
配置だけをクリアします。

次のようになります。

WRITE_0448_01

PHP で外部のデータを取得する

PHP はファイルの中身を丸ごと取得する file_get_contents() という関数があります。 この関数は http や ftp などのプロトコルを通して 外部にあるファイルも取得できるようです。

allow_url_fopen という設定が On になっていることが 前提ですが 5.3 のデフォルトでは On になっています。

allow_url_fopen という名前からもわかりますが fopen() 関数も同じ機能があります。 (というより file_get_contents() が fopen() の機能を使用しているのだと思います)

あとは次のように ファイル名の代わりに URI を指定します。

echo file_get_contents('http://www.yahoo.co.jp/'); 

http や ftp の他にも色々なプロトコルをサポートしています。

[参考]
PHP: サポートするプロトコル/ラッパー - Manual

Word で逆順に印刷する

家のプリンターなどで印刷しているとページ順に重なってしまい 印刷後に入れ替えなくてはならないときがあります。

こんなときに 『逆順に印刷する』機能が Word には準備されています。

Word 2007 であれば 下図のように Word のオプションの「印刷」にある 「ページの印刷順序を逆にする」にチェックを入れます。

WRITE_0446_01

これで OK です。

自分が「う〜ん」と思うことは 他の人も思うことで、 解決策は用意されてることが多いですね。

HTML5開発の導入ポイント in 大阪 に行ってきました

9/17 の土曜日に大阪の梅田阪急ビルで 『スマートフォンアプリ開発の事例 〜 HTML5 開発の導入ポイント in 大阪』 というセミナがあったので行ってきました。 (#rag_tech0917)

講師は HTML5-WEST.jp 代表の村岡さんでした。

メーリングリストで紹介されてたので 行ってみたのですが、リクルートエージェントが主催のセミナでした。

リクルートエージェントといえば「転職」ですが 話を聞いてみると 今まで『今、転職する気がある人』のみを相手に仕事をしてきたのを 『今は転職する気のない人』にも知ってもらうために このようなセミナを始めたそうです。
大阪は今回が初めてで、これからもやっていくとのことでした。
セミナの中では定型のアンケート以外は 変な勧誘もありませんでした(そこは逆にそう取られないように苦心されているようでした)。

セミナですが、技術寄りの話ではなく 「 HTML5 についてちょっとちゃんと考えてみて」というような内容でした。

体験を交えた話で 技術者も営業も技術で商売する人は 技術に浮足立ってはダメだ、という風に感じました。

他の人の実感のこもった話を聴けるのはありがたいですね。

オマケ?として紹介されていたサイトを上げておきます。

ついでに(希望者が多かったので)「 ie6 をやめる勇気をもとう」というような話も していただきました。 その時に紹介された JavaScript を上げておきます。

名刺が切れてしまって途中から交換できなくなったのと 次の予定があったので最後まで残れなかったのが残念でした。

正規表現 行末の $ と終端

正規表現で $ は終端ではなく行末を意味します。

たとえば次のような正規表現があります。

if (preg_match('/^abcdef$/', $value) ....

この場合、"abcdef" だけでなく "abcdef + 改行" もマッチしてしまいます。

ですので、次のような処理を書いて英小文字だけを期待しても

$input = $_GET['data'];
if (preg_match('/^[a-z]+$/', $input) ....

xxxxx.php?data=abcde とかだけでなく
xxxxx.php?data=abcde%0A もマッチしてしまうわけです。 (%0A は改行)

このようなときは次のように書くそうです。

$input = $_GET['data'];
if (preg_match('/\\A[a-z]+\\z/', $input) ....

[参考]
もし『よくわかるPHPの教科書』の著者が徳丸浩の『安全なWebアプリケーションの作り方』を読んだら - ockeghem(徳丸浩)の日記

PHP の header() 関数と HTTP レスポンスコード

ちょっとハマったのでメモを残しておきます。

PHP の header() 関数では 第 3 引数で HTTP レスポンスコードを指定することができます。

ところが次のように第 1 引数に NULL や空文字を指定すると HTTP レスポンスコードが設定されませんでした。

header(NULL, TRUE, 404); 
header('', TRUE, 404); 

次のようなレスポンスが返ります。

HTTP/1.1 200 OK
Date: Sun, 11 Sep 2011 02:58:13 GMT
Server: Apache/2.2.14 (Ubuntu) 

404 を期待しているのに 200 になってしまいます。

次のように、何か文字列を指定すれば 404 を返してくれます。

header('xxxx', TRUE, 404); 
HTTP/1.1 404 Not Found
Date: Sun, 11 Sep 2011 02:59:47 GMT 
Server: Apache/2.2.14 (Ubuntu) 

PHP のバージョンを出力しないようにする

PHP 5.3 のデフォルトでは expose_php という設定項目が On になっています。 この項目が On の場合、HTTP レスポンスヘッダに PHP のバージョンを出力します。

HTTP/1.1 200 OK
Date: Sat, 03 Sep 2011 04:24:15 GMT
Server: Apache/2.2.14 (Ubuntu)
X-Powered-By: PHP/5.3.2-1ubuntu4.9
Vary: Accept-Encoding
Content-Length: 1703
Connection: close
Content-Type: text/html

expose_php を Off にします。

HTTP/1.1 200 OK
Date: Sat, 03 Sep 2011 04:26:20 GMT
Server: Apache/2.2.14 (Ubuntu)
Vary: Accept-Encoding
Content-Length: 1703
Connection: close
Content-Type: text/html

X-Powered-By の行が消えました。

Apache の設定で ServerSignature も Off にします。

HTTP/1.1 200 OK
Date: Sat, 03 Sep 2011 04:28:18 GMT
Server: Apache
Vary: Accept-Encoding
Connection: close
Content-Type: text/html 

Apache のバージョンも消えました。
サーバを公開する場合、情報は少ないほうが良いですね。

exim4 の再設定

Ubuntu は標準のメールサーバとして exim4 を入れることができます。 この exim4 は次のファイルに 設定内容を格納しています。

/etc/exim4/update-exim4.conf.conf (typo じゃないです)
/etc/mailname

/etc/exim4/update-exim4.conf.conf には exim4 の設定内容が、 /etc/mailname には メール送信時に送信者の @ の後ろに付けるドメイン名が入ります。

$ cat /etc/mailname

example.com

ファイルの内容を修正した場合 dpkg-reconfigure を実行する以外に update-exim4.conf というスクリプトの実行で再設定することができます。

$ sudo update-exim4.conf

末尾に .conf と付いていますがスクリプトファイルです。 exim4 の設定を更新するので update-exim4.conf で その設定ファイルなので update-exim4.conf.conf なんだと思います。

Excel の判定ワークシート関数

Excel には次のような判定用の関数があります。

WRITE_0440_01

ISBLANK() や ISNA() は セルの未入力や VLOOKUP で値がとれない場合の #N/A を判定できるので 使用頻度は高いですね。

また、エラーには、#DIV/0 (0 除算) など色々ありますが 細かく分類するには ERROR.TYPE() という関数を使います。

エラーERROR.TYPE() の結果
#NULL!1
#DIV/0!2
#VALUE!3
#REF!4
#NAME?5
#NUM!6
#N/A7
その他#N/A

php5-xdebug の var_dump のオーバーロード

php5-xdebug を入れているのに 最近使っている環境では var_dump の表示が綺麗にならず(オーバーロードされず) 原因がわからなかったのですが、下記のサイトに書いてありました。

[参考]
php/インストール - zaininnari - livedoor Wiki(ウィキ)

xdebug で var_dump をオーバーロードさせるには html_errors が On になっていないとダメなようです。

html_errors は PHP_INI_ALL なので ini_set() します。

ini_set('html_errors', 1);

var_dump(array(1, 2, 3));

これで var_dump がオーバーロードされました。

PHP の定数

PHP には最初から定義されている定数が色々あります。

たとえば実行環境にあわせた行末文字の PHP_EOL 。

echo "Hello!" . PHP_EOL;

こういうのは意外と助かりますね。

PHP のバージョンを返す PHP_VERSION とかもあります。 古いバージョンに無い関数を使うときなどに判定に使えます。

if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
    ......
}

他にも TRUE, FALSE, NULL や、E_ALL などのエラー用の定数とかがあります。 定数で用意されているものは、定数を使いましょう。

[参考]
PHP: 定義済みの定数 - Manual

Apache の設定ファイルに PHP の設定を記述する

PHP を Apache のモジュールとして実行していて 設定項目が PHP_INI_ALL か PHP_INI_PERDIR の場合 Apache の設定ファイル (httpd.conf, apache2.conf) や .htaccess に PHP の設定を記述できます。

詳しくは次の表を参照。

モード php.ini Apache
設定ファイル
.htaccess スクリプト内
ini_set()
PHP_INI_ALL
PHP_INI_SYSTEM
PHP_INI_PERDIR
PHP_INI_USER

.htaccess に記述する場合 php_value と php_flag の 2 つのディレクティブを使うことができます。 php_value は論理値以外の値用で php_flag は論理値に使用します。

php_value default_charset UTF-8
php_flag html_errors on

Apache の設定ファイルに記述する場合 さらに php_admin_value と php_admin_flag の 2 つのディレクティブを使うことができます。

こちらのディレクティブで設定した場合 .htaccess や ini_set() では変更できないようになります。 PHP の設定ファイルである php.ini に記述した設定では そのようなことができないので 個々のユーザに変更されたくない サーバ全体の固い設定を作るときに良いですね。

PostgreSQL の PRIMARY KEY を削除する SQL

PostgreSQL の PRIMARY KEY を削除する SQL が Oracle と違っていたのでメモ。

PRIMARY KEY の作成は PostgreSQL, Oracle, MySQL, SQLServer も同じで 次のようになります。

ALTER TABLE "テーブル名" ADD PRIMARY KEY ("キー名"...)

削除の場合は違います。 PostgreSQL と SQLServer では次のようになります。

ALTER TABLE "テーブル名" DROP CONSTRAINT "primary key 制約名"

PRIMARY KEY の作成でできた制約を削除することで PRIMARY KEY を削除します。

Oracle, MySQL は次のようになります。

ALTER TABLE "テーブル名" DROP PRIMARY KEY

こちらの方がシンプルですね。

[参考]
テーブル定義の変更(列の追加、変更、削除) - オラクル・Oracle SQL 入門
MySQLクイック・リファレンス
開発でのメモ:SQL Serverで主キーを追加するには? - livedoor Blog(ブログ)

Windows でパスが通ってないのに実行できるワケ

WindowsPC に Excel が入っている場合 「ファイル名を指定して実行」に excel と入れるだけで Excel を起動することができます。

コマンドプロンプトで次のように打っても Excel が起動します。

C:\> start excel

excel.exe にパスは通っていなくても起動できる理由は レジストリに登録されているからです。

HKEY_LOCAL_MACHINE
  \SOFTWARE
    \Microsoft
      \Windows
        \CurrentVersion
          \App Paths
            \excel.exe

このように excel.exe が登録されています。

手動で App Paths にキーを追加して 値に実行パスを設定すれば パスが通っていなくても実行できるようになります。

Ubuntu11.10 に入る nginx のパッケージ比較

nginx はコンパイル時にモジュールを指定しなくてはならないので パッケージで入れているとちょっと不便かと思ったのですが PPA で追加した場合や oneiric (Ubuntu11.10) では nginx はモジュールの組み合わせで いくつかのパッケージに分かれているようです。

nginx
nginx-light
nginx-full
nginx-extras

nginx というパッケージを入れた場合 nginx-full になるようです。

パッケージごとのモジュールを比較してみました。

分類モジュール名LightFullExtras
Standard HTTPCore
Access
Auth Basic
Auto Index
Browser-
Charset
Empty GIF
FastCGI
Geo-
Gzip
Headers
Index
Limit Requests-
Limit Zone-
Log
Map-
Memcached-
Proxy
Referer-
Rewrite
SCGI-
Split Clients
SSI-
Upstream
User ID
UWSGI-
Optional HTTPDebug-
WebDAV-
Flash Streaming Video--
GeoIP-
Gzip Precompression
Image Filter-
RealIP-
Stub Status-
XSLT-
IPv6
Embedded Perl--
Secure Link--
Random Index--
Addition-
MailMail Core-
POP3-
IMAP-
SMTP-
SSL-
Third PartyUpstream Fair Queue-
Echo
Embedded Lua--
Nginx Development Kit--
OtherFile AIO--

とりあえずメモ。

PHP の 1 行コメント

PHP の 1 行コメントには # と // の 2 種類があります。

#  どちらもコメント
// こちらもコメント

Perl などで # のコメントに馴染んでいたり PHP でバッチ処理を作ったときに Bash などと同様に # で コメントアウトできるのはありがたいですね。

ファイルのステータスを表示するコマンド

Linux には ファイルのステータスを表示する stat というコマンドがあります。

$ stat /var/log/user.log

  File: `/var/log/user.log'
  Size: 0               Blocks: 0          IO Block: 4096   regular empty file
Device: fc01h/64513d    Inode: 157223      Links: 1
Access: (0640/-rw-r-----)  Uid: (  101/  syslog)   Gid: (    4/     adm)
Access: 2011-02-03 10:18:03.000000000 +0900
Modify: 2011-02-03 10:18:03.000000000 +0900
Change: 2011-06-28 18:30:39.000000000 +0900

ファイルの最終アクセス日時まで取得できます。

ちなみに Access が最終アクセス日時、 Modify が最終変更日時、 Change が権限などの最終変更日時です。

ファイルの情報を取得するコマンドに file というのもありますが こちらはファイルタイプを表示します。

$ file /var/log/boot

/var/log/boot: ASCII text

$ file /usr/sbin/apache2

/usr/sbin/apache2: symbolic link to `../lib/apache2/mpm-prefork/apache2'

$ file /usr/lib/apache2/mpm-prefork/apache2

/usr/lib/apache2/mpm-prefork/apache2: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

$ file /etc/init.d/apache2

/etc/init.d/apache2: POSIX shell script text executable

sudo のタイムアウトまでの時間を長くする

Ubuntu では root を使わずに sudo することになるのですが デフォルトでは 1 度 sudo してから 5 分 sudo しないと 再度パスワードの入力を求められます。

通常はそれで良いのですが まとまった作業をしているときなどは もう少し長くしたいときがあります。

sudo の設定は /etc/sudoers を visudo コマンドで編集するのですが Ubuntu10.04 だとエディタは nano が起動するので env で環境変数を変えて vi にします。
(これは私が nano を使えないからです・・・)

$ sudo env EDITOR=/usr/bin/vi visudo

元々ある Defaults の下辺りに追加します。

Defaults        env_reset                ←既存
Defaults        timestamp_timeout = 20   ←追加

これでタイムアウトまでの時間が 20 分になりました。

Defaults はカンマで区切って 1 行で書いても OK です。

Defaults        env_reset, timestamp_timeout = 20

nginx を Ubuntu10.04 に入れたときの configure の内容 (2)

前に PPA を使って nginx (1.0.5) を Ubuntu10.04 に入れたときの configure の内容を 書きましたが、 PPA を使わない nginx 0.7.65 の内容も書いておきます。

$ nginx -V

nginx version: nginx/0.7.65
TLS SNI support enabled
configure arguments:
    --conf-path=/etc/nginx/nginx.conf
    --error-log-path=/var/log/nginx/error.log
    --pid-path=/var/run/nginx.pid
    --lock-path=/var/lock/nginx.lock
    --http-log-path=/var/log/nginx/access.log
    --http-client-body-temp-path=/var/lib/nginx/body
    --http-proxy-temp-path=/var/lib/nginx/proxy
    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi
    --with-debug
    --with-http_stub_status_module
    --with-http_flv_module
    --with-http_ssl_module
    --with-http_dav_module
    --with-http_gzip_static_module
    --with-http_realip_module
    --with-mail
    --with-mail_ssl_module
    --with-ipv6
    --add-module=/build/buildd/nginx-0.7.65/modules/nginx-upstream-fair

こちらもメモ。

PostgreSQL の SEQUENCE の CACHE の動き

PostgreSQL の SEQUENCE には CACHE という設定があります。 (Oracle などにもあります)

この機能は高速化のためのもので、事前に SEQUENCE をまとめて 取得しておき、大量に SEQUENCE を発行するときに 何度も SEQUENCE を更新しないようします。

実際の動きを見てみます。

db=# CREATE SEQUENCE test_seq CACHE 3;

CACHE のみ設定して(他はデフォルトで)作成しました。
下のように設定されています。

db=# SELECT last_value, cache_value FROM test_seq;

-[ RECORD 1 ]--
last_value  | 1
cache_value | 3

nextval() で値を取得します。

db=# SELECT nextval('test_seq'); → 1 が返る

SEQUENCE は次のようになります。

db=# SELECT last_value, cache_value FROM test_seq;

-[ RECORD 1 ]--
last_value  | 3
cache_value | 3

1 回しか nextval() していませんが last_value は 3 になっています。 これは 1 を取得したときに 2, 3 をキャッシュとして取得しているためです。

もちろん nextval() を続ければ 2, 3 を取得できます。

db=# SELECT nextval('test_seq'); → 2 が返る
db=# SELECT nextval('test_seq'); → 3 が返る

これでキャッシュした分を使い切ってしまったのですが さらに nextval() してみます。

db=# SELECT nextval('test_seq'); → 4 が返る

この状態で SEQUENCE は次のようになります。

db=# SELECT last_value, cache_value FROM test_seq;

-[ RECORD 1 ]--
last_value  | 6
cache_value | 3

このように、キャッシュを使い切ると新しくキャッシュを取得しなおします。 デフォルトでは CACHE が 1 なので取得するごとにキャッシュを使い切っているわけです。

キャッシュはセッション内でのみ有効です。 この状態は、このセッション以外からは 6 まで使用済みとして扱うため 別のセッションで nextval() すると次のように 7 が返ります。

[別セッション]
db=# SELECT nextval('test_seq'); → 7 が返る

[このセッション]
db=# SELECT nextval('test_seq'); → 5 が返る

そのためキャッシュを使用すると SEQUENCE の値が時系列に 並ばないことがあるので注意が必要です。

Bash の 変数展開

Bash の 変数展開には結構種類があります。

よく使うのは次の「文字列の末尾から最短マッチさせて削除」で 「ファイルの拡張子」の削除です。

$ ls *.txt | while read FILE
> do
>     echo ${FILE%.txt}
> done

"${FILE%.txt}" の部分が変数展開です。 これで ls コマンドで .txt のファイルだけを取得して ファイル名から .txt を削除した部分を出力することができます。

変数展開には次のようなものがあります。

${変数:+文字列} 変数が存在し空でなければその文字列、それ以外なら空
${変数:-文字列} 変数が存在し空でなければその値、それ以外なら文字列
${変数:=文字列} 変数が存在し空でなければその値、それ以外なら変数に文字列を設定
${変数:?文字列} 変数が存在し空でなければその値、それ以外なら文字列を出力して終了
${変数:位置} 位置から末尾までの部分文字列
${変数:位置:長さ} 位置から長さ分の部分文字列
${変数#パターン} 変数の先頭がパターンマッチした場合、最短マッチ部分を削除
${変数##パターン} 変数の先頭がパターンマッチした場合、最長マッチ部分を削除
${変数%パターン} 変数の末尾がパターンマッチした場合、最短マッチ部分を削除
${変数%%パターン} 変数の末尾がパターンマッチした場合、最長マッチ部分を削除
${変数/パターン/文字列} 最初にパターンマッチした部分を文字列で置換
${変数//パターン/文字列} パターンマッチしたすべての部分を文字列で置換

Bash だけでも色々なことができます。

nginx を Ubuntu10.04 に入れたときの configure の内容

nginx (1.0.5) を Ubuntu10.04 に入れたときの configure の内容です。

nginx は動的にモジュールの設定ができず configure で指定するしかないそうなので パッケージで入れる場合 どういう設定になっているかは重要ですね。

"-V" オプションで詳細を見ることができます。

$ nginx -V

nginx: nginx version: nginx/1.0.5
nginx: TLS SNI support enabled
nginx: configure arguments:
    --prefix=/etc/nginx
    --conf-path=/etc/nginx/nginx.conf
    --error-log-path=/var/log/nginx/error.log
    --http-client-body-temp-path=/var/lib/nginx/body
    --http-fastcgi-temp-path=/var/lib/nginx/fastcgi
    --http-log-path=/var/log/nginx/access.log
    --http-proxy-temp-path=/var/lib/nginx/proxy
    --http-scgi-temp-path=/var/lib/nginx/scgi
    --http-uwsgi-temp-path=/var/lib/nginx/uwsgi
    --lock-path=/var/lock/nginx.lock
    --pid-path=/var/run/nginx.pid
    --with-debug
    --with-http_addition_module
    --with-http_dav_module
    --with-http_geoip_module
    --with-http_gzip_static_module
    --with-http_image_filter_module
    --with-http_realip_module
    --with-http_stub_status_module
    --with-http_ssl_module
    --with-http_sub_module
    --with-http_xslt_module
    --with-ipv6
    --with-sha1=/usr/include/openssl
    --with-md5=/usr/include/openssl
    --with-mail
    --with-mail_ssl_module
    --add-module=/build/buildd/nginx-1.0.5/debian/modules/nginx-echo
    --add-module=/build/buildd/nginx-1.0.5/debian/modules/nginx-upstream-fair

とりあえずメモ。

PostgreSQL の SEQUENCE に値を設定する

PostgreSQL の SEQUENCE に値を設定するには ALTER SEQUENCE と setval() の 2 つの方法があります。

さらに setval() には 引数が 2 つのものと 3 つのものがあります。 それぞれの実行結果を見ていきます。

まず ALTER SEQUENCE 。

db=# ALTER SEQUENCE test_sequence RESTART WITH 1;

このとき、内部の値は次のようになっています。

db=# SELECT last_value, is_called FROM test_sequence;

-[ RECORD 1 ]--
last_value  | 1
is_called   | f

last_value が RESTART WITH で設定した 1 になり、 is_called が f (偽) になります。

is_called というのは last_value が既に呼ばれたかどうかのフラグで is_called が偽であれば まだ呼ばれていないので nextval() したときに last_value の 1 を返します。

次に 引数が 2 つの setval() です。

db=# SELECT setval('test_sequence', 1);

このとき、内部の値は次のようになっています。

db=# SELECT last_value, is_called FROM test_sequence;

-[ RECORD 1 ]--
last_value  | 1
is_called   | t

引数が 2 つの setval() では last_value は同じですが is_called が t (真) になりました。 last_value の 1 は既に呼ばれているという内容なので この場合 nextval() したときに 1 + increment_by (デフォルト 1) を返します。

同じように 1 を設定しても ALTER SEQUENCE と 引数が 2 つの setval() では 次に返す値が変わってしまいます。

そこで 引数が 3 つの setval() の出番になります。

db=# SELECT setval('test_sequence', 1, false);

上のように 引数が 3 つの setval() では 第三引数で is_called の値を指定することができます。

これで ALTER SEQUENCE したときと同じになります。

db=# SELECT last_value, is_called FROM test_sequence;

-[ RECORD 1 ]--
last_value  | 1
is_called   | f

SEQUENCE はデータの一意性を守ってくれる大事な機能なので 移行時などにずれてしまわないよう注意が必要です。

nginx を Ubuntu10.04 にインストールする

nginx という Web サーバが かなりキてるということなので さっそくインストールしてみました。

[参考]
NginxJa - nginx

ちなみに「エンジンエックス」と読むそうです。

Ubuntu にはパッケージが用意されているので 普通に apt-get でインストールすることができます。

$ sudo apt-get install nginx

11/08/22 時点では ver 0.7.65 が入りました。

上記サイトを参考に もっと新しいバージョンを入れてみます。 以下のコマンドで lucid 版の PPA を追加してインストールします。

$ sudo sh -c "echo deb http://ppa.launchpad.net/nginx/stable/ubuntu lucid main > /etc/apt/sources.list.d/nginx-stable-lucid.list"
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C300EE8C
$ sudo apt-get update
$ sudo apt-get install nginx

11/09/01 時点では ver 1.0.5 が入りました。

Google サイト内検索

Amazonアソシエイト