2009-11-07

関西オープンソース 2009 (11/6)

LPIC レベル 3 303 Security 技術解説無料セミナー

流れとしては公開鍵暗号方式と電子署名の仕組みをざっと解説し、Apache で SSL 通信を行う手順、OpenVPN を使う手順の解説という感じで期待していたモノとはちょっと違った感じ。

最初に気になったのは「HTTPS の 3つの役割」というところでタイトルからして気になった。このあたりを解説するにはやはりネットワーク上の脅威から解説をした方がいいのではないかなぁと思います。盗聴、改ざん、なりすましについてはあがっていましたが否認について触れられていなかったのが残念でした。

次に気になったのは「秘密鍵で署名」という言葉。これは現在一般的な RSA がたまたまこういった性質を持っているだけであって厳密には違います。高木浩光さんの日記のエントリ にも以下のようにあります。

最もひどく蔓延っていてしばらく消えそうにない間違い解説の典型例は次だ。


  • 「公開鍵で暗号化したものを秘密鍵で復号するのと同様に、秘密鍵で暗号化したものを公開鍵で復号できるようになっている。」
    • ... (略) ...
  • 「公開鍵暗号方式による署名は、メッセージダイジェストを秘密鍵で暗号化することで実現する。」
    • ... (略) ...

これらの解説は誤っている。これらは、RSAアルゴリズムを説明するものにはなり得ても、公開鍵暗号方式を説明するものになっていない。公開鍵と秘密鍵が「逆に使える」というのはRSAアルゴリズムがたまたま(まあまあ)そうなだけであって、そのような性質を持たない他の公開鍵暗号方式がたくさん存在する。


気になったついでに書いておきます。資料に何度も出てくる「復号化」という言葉。「暗号化」というので「復号化」と言いたくなる気持ちはわからないでもないけど、使われている文脈を考えると正しくは「復号」ですよね。

その後は Apache や OpenVPN の how-to というか手順の説明。

全体を通して LPIC レベル 3 Security というものから期待していたモノとは違ったので個人的にはイマイチなセミナーでした。

セキュアコーディングノススメ

参考になればいいなぁくらいの感じで聴きにいったのですが、思いの外良かったです。

JPCERT/CC の紹介から始まり、適宜事例紹介をしながらセキュアコーディングの必要性を説いたのち、プラクティスをざっと紹介し、JPCERT/CC の取り組みの紹介をして終わるという流れでした。

特に印象に残ったのが「言語仕様を理解せずにコーディングすることが脆弱性を埋め込む一因になる」という感じの言葉です。正確な言い回しは忘れましたがこんな意味合いでした。当たり前の人にとっては当たり前なんだろうけど、確かにそうですよね、と。

このコマではいくつかの有用なサイトの紹介もありましたので以下に挙げておきます。


リアルタイムレプリケーションソフト DRBD の概要と活用事例紹介

業務用途で必要な機能が充実してきたことと、業務での活用事例が聴けたことがまぁ良かったかなと。ちょうど日本語マニュアルも公開されたらしいですし、時間を作って DB のレプリケーションなどを色々試してみたいです。マニュアルは こちら です。

DRBD を使ってデータベースをレプリケーションした場合オーバヘッドによるパフォーマンスへの影響は 3 - 5% 程度とのことでした。

Ruby でソフトウェアづくりをアジャイルにするということについて

プレゼン自体はおもしろかったですが、Ruby 自体はあまりテーマに関係なかったことと、テーマが壮大すぎてやや焦点がぼやけてしまった感とが気になりました。念のため繰り返しておくとプレゼン自体はおもしろかったですよ。

強引にまとめると結論以下のような感じでしょうか。

  • プログラマはもっと力を持っていいし、持つようにならなければならない。また力を持ったらそれだけの責任を果たさなければならない
  • アジャイル開発は一番自然な形でのソフトウェア開発なのではないだろうか

特に 2つめの論点については興味深かったのでおすすめされていた以下の本を読んでみようと思います。

StringBuffer, StringBuilder の落とし穴?


  1. AyakoBaba
    AyakoBaba Sbにnullをappendすると"null"になる巧妙なわな
-- this quote was brought to you by quoteurl
というつぶやきを見て気になったので自分自身でも検証コードを書いて試してみた。
public class SbTest {
    public static void main(String[] args) {
        String foo = "foo";
        String bar = null;
        String baz = "baz";

        StringBuilder sb1 = new StringBuilder();
        sb1.append(foo);
        sb1.append(bar);
        sb1.append(baz);
        System.out.println(sb1.toString());

        StringBuffer sb2 = new StringBuffer();
        sb2.append(foo);
        sb2.append(bar);
        sb2.append(baz);
        System.out.println(sb2.toString());
    }
}
これを実行すると…
foonullbaz
foonullbaz
ほんとだ。

それぞれの append() メソッドのソースを見てみると以下のようになっています。
    public synchronized StringBuffer append(String str) {
        super.append(str);
        return this;
    }
    public StringBuilder append(String str) {
        super.append(str);
        return this;
    }
で、super.append(str) で呼び出されるメソッドのソースはというと…
    public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
null の場合は null という文字列として扱うとなってます。このあたりは思い込みで何も追加されないと思っている人も少なくないと思うので注意が必要ですね。

2009-08-04

APR を使って Tomcat で Comet

Tomcat で Comet を実装するには NIO か APR コネクタを使う必要があります。NIO を用いる方法はいろんなところで説明されているのでここでは APR コネクタを使う方法についてだけ書きます。Tomcat のバージョンは 6.0.20、APR の開発ライブラリは Debian (Lenny) の libapr1-dev バージョン 1.2.12-5 を使っています。


# aptitude install libapr1-dev
# su - tomcat
$ cd ${CATALINA_HOME}/bin
$ tar zxf tomcat-native.tar.gz
$ cd tomcat-native-1.1.16-src/jni/native
$ ./configure --prefix=${CATALINA_HOME}/apr --with-apr=/usr/bin/apr-config --with-ssl=yes
$ make
$ make install

インストールが終わると以下のようなメッセージが表示されます。

----------------------------------------------------------------------
Libraries have been installed in:
   ${CATALINA_HOME}/apr/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the `LD_RUN_PATH' environment variable
     during linking
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

メッセージではいくつかの方法がありますが、最初に挙げられている LD_LIBRARY_PATH 環境変数に APR ライブラリのディレクトリを追加する方針にしました。APR コネクタを使うか使わないかは setenv.sh に追加した行をコメントアウトする・しないで切り替えることができます。


$ cd ${CATALINA_HOME}
$ bin/shutdown.sh  # Tomcat が動作している場合のみ
$ echo "export LD_LIBRARY_PATH=${CATALINA_HOME}/apr/lib:\${LD_LIBRARY_PATH}" >> bin/setenv.sh
$ bin/startup.sh


catalina.out に出力される起動ログを見比べてみると…

変更前

2009/08/04 15:36:06 org.apache.catalina.core.AprLifecycleListener init
情報: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/local/java/jdk1.6.0_14/jre/lib/amd64/server:/usr/local/java/jdk1.6.0_14/jre/lib/amd64:/usr/local/java/jdk1.6.0_14/jre/../lib/amd64:/usr/java/packages/lib/amd64:/lib:/usr/lib
2009/08/04 15:36:06 org.apache.coyote.http11.Http11Protocol init
情報: Coyote HTTP/1.1を http-8080 で初期化します
2009/08/04 15:36:06 org.apache.catalina.startup.Catalina load
情報: Initialization processed in 471 ms
--- (snip) ---
2009/08/04 15:36:08 org.apache.coyote.http11.Http11Protocol start
情報: Coyote HTTP/1.1を http-8080 で起動します
2009/08/04 15:36:08 org.apache.jk.common.ChannelSocket init
情報: JK: ajp13 listening on /0.0.0.0:8009
2009/08/04 15:36:08 org.apache.jk.server.JkMain start
情報: Jk running ID=0 time=0/14  config=null
2009/08/04 15:36:08 org.apache.catalina.startup.Catalina start


変更後

2009/08/04 16:00:28 org.apache.catalina.core.AprLifecycleListener init
情報: Loaded APR based Apache Tomcat Native library 1.1.16.
2009/08/04 16:00:28 org.apache.catalina.core.AprLifecycleListener init
情報: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2009/08/04 16:00:28 org.apache.coyote.http11.Http11AprProtocol init
情報: Coyote HTTP/1.1を http-8080 で初期化します
2009/08/04 16:00:28 org.apache.coyote.ajp.AjpAprProtocol init
情報: Initializing Coyote AJP/1.3 on ajp-8009
2009/08/04 16:00:28 org.apache.catalina.startup.Catalina load
情報: Initialization processed in 562 ms
--- (snip) ---
2009/08/04 16:01:02 org.apache.coyote.http11.Http11AprProtocol start
情報: Coyote HTTP/1.1を http-8080 で起動します
2009/08/04 16:01:02 org.apache.coyote.ajp.AjpAprProtocol start
情報: Starting Coyote AJP/1.3 on ajp-8009
2009/08/04 16:01:02 org.apache.catalina.startup.Catalina start


APR コネクタが使われていることがわかります。

Tomcat の examples の中にある org.apache.catalina.CometProcessor を実装している ChatServlet にアクセスしてみるときちんと (?) 動作していることがわかります。って、この ChatServlet はまだ実装途中? あんまりきちんとは動いてなさそうです…。

2009-07-22

超交流会 2009

京大の OB ではないのですが京大情報学同窓会である 超交流会 2009 に行ってきました。堀場さんのお話もまぁおもしろかったですが、勝屋久さんのテンションがすごかったです。勝屋さんが話されていた内容としては 自分の小さな「箱」から脱出する方法 という本の内容に通じるところが多かったように思います。

  • 相手を変えようとするのではなく自分を変える

  • 相手は自分の鏡

  • などなど…


これらはほんとにそうだと思うので、自然にできる人になりたいものです。最初は意識して努力することが必要ですね。

そんな勝屋さんが最後に紹介されていた本の 1つが以下のものです。機会を作って読んでみようと思います。


アンビシャス 1分間スピーチというタイトルにはやられました。ライトニングトークのようなものを想像して、1分程度になるよう内容を構成し練習していったのですが 1分という縛りはないに等しかったです。でもまぁ良い経験でした。あのような場にもなるべく参加するようにしたほうが良いなぁと思う今日この頃です。

2009-07-02

PostgreSQL 8.4 の新モニタリング機能

PostgreSQL 8.4 の新機能 である pg_stat_statements と auto_explain を試してみましたのでまとめておきます。

まずは pg_stat_statements です。pg_stat_statements は簡単に言うと SQL のプロファイリングを行う機能で、SQL ごとに総実行回数や総実行時間などを取得できるものです。pg_stat_statements は PostgreSQL のソースの tar ボールを展開したディレクトリの contrib/pg_stat_statements にあります。まずはそのディレクトリに移動して make します。次に make してできた pg_stat_statements.so を PostgreSQL のインストールディレクトリにある lib ディレクトリにコピーします。pg_stat_statements.sql もあとで使いますのでどこか適当なディレクトリに移動しておくと良いと思います。

次いで postgresql.conf を以下のように編集します。
shared_preload_libraries = 'pg_stat_statements'

custom_variable_classes = 'pg_stat_statements'
pg_stat_statements.max = 10000
pg_stat_statements.track = all

個別に設定できる値は以下の通りです。

pg_stat_statements.max

記録するステートメントの最大値を指定します。デフォルト値は 1000 です。

pg_stat_statements.track

カウントするステートメントの種類を指定します。指定できる値は top, all, none の 3種類です。all はクエリ内の関数から呼び出される (ネストした) ステートメントもカウントします。top は all でカウントされるようなネストしたクエリはカウントされず、top-level のステートメントのみカウントします。none を指定するとこの昨日自体を無効化します。デフォルト値は top です。

pg_stat_statements.save

サーバ停止時にステートメントの統計値を保持・維持しておくかどうかを指定します。off を指定するとサーバ再起動時にはステートメントの統計値はリセットされます。デフォルト値は on です。


postgresql.conf を編集できたら PostgreSQL を再起動します。

再起動したら、動作確認用のデータベースを作成します。
$ createdb --encoding=UTF8 test
$ psql -l
List of databases
Name | Owner | Encoding | Collation | Ctype | Access privileges
-----------+----------+----------+-----------+-------+-----------------------
test | postgres | UTF8 | C | C |

今回は pgbench で動作確認をしますので pgbench 用の環境を用意します。
$ pgbench -i test
NOTICE: table "pgbench_branches" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_history" does not exist, skipping
creating tables...
10000 tuples done.
20000 tuples done.
30000 tuples done.
40000 tuples done.
50000 tuples done.
60000 tuples done.
70000 tuples done.
80000 tuples done.
90000 tuples done.
100000 tuples done.
set primary key...
NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "pgbench_branches_pkey" for table "pgbench_branches"
NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "pgbench_tellers_pkey" for table "pgbench_tellers"
NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "pgbench_accounts_pkey" for table "pgbench_accounts"
vacuum...done.

そして、pg_stat_statements.sql を流し込みます。
$ psql -f pg_stat_statements.sql test
SET
CREATE FUNCTION
CREATE FUNCTION
CREATE VIEW
GRANT
REVOKE

この SQL を実行すると pg_stat_statements_reset(), pg_stat_statements() という関数と、pg_stat_statements という VIEW が作成されます。作成されたら念のため最初にステートメントの統計情報を初期化しておきます。
$ psql -c "SELECT pg_stat_statements_reset();" test
pg_stat_statements_reset
--------------------------

(1 row)

pgbench を実行し、ステートメントの統計情報を見てます。
$ pgbench -c10 -t300 -M prepared test
starting vacuum...end.
transaction type: TPC-B (sort of)
scaling factor: 1
query mode: prepared
number of clients: 10
number of transactions per client: 300
number of transactions actually processed: 3000/3000
tps = 567.416343 (including connections establishing)
tps = 569.828493 (excluding connections establishing)
$ psql test
psql (8.4.0)
Type "help" for help.

test=# \x
Expanded display is on.
test=# SELECT * FROM pg_stat_statements ORDER BY total_time DESC LIMIT 3;
-[ RECORD 1 ]--------------------------------------------------------------------
userid | 10
dbid | 40966
query | UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2;
calls | 3000
total_time | 22.7689049999999
rows | 3000
-[ RECORD 2 ]--------------------------------------------------------------------
userid | 10
dbid | 40966
query | UPDATE pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2;
calls | 3000
total_time | 18.8488639999999
rows | 3000
-[ RECORD 3 ]--------------------------------------------------------------------
userid | 10
dbid | 40966
query | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2;
calls | 3000
total_time | 0.273943
rows | 3000


次に auto_explain です。auto_explain はスロークエリの実行計画をログに出力するという機能です。pg_stat_statements 同様 contrib/auto_explain ディレクトリに移動し make します。make してできた auto_explain.so をこれも同様に lib ディレクトリにコピーします。

postgresql.conf も同様に編集します。shared_preload_libraries で複数のライブラリをロードする場合の参考にもなるので、先ほどの pg_stat_statements の設定はあえて残し、auto_explain の設定を追記する形で示します。
shared_preload_libraries = 'pg_stat_statements, auto_explain'

custom_variable_classes = 'pg_stat_statements, auto_explain'
pg_stat_statements.max = 10000
pg_stat_statements.track = all
auto_explain.log_min_duration = '0'

個別に設定できる値は以下の通りです。

auto_explain.log_min_duration

ロギング対象とするステートメントの実行時間をミリ秒単位で指定します。ゼロを指定するとすべてのステートメントがロギング対象となり、マイナスの値を指定するとロギングを無効化します。他の設定値と同様 1秒 (1000) を 1s などと指定することもできます。

auto_explain.log_analyze

単なる EXPLAIN ではなく EXPLAIN ANALYZE の結果を出力するかどうかを指定します。デフォルトは off です。場合によってはパフォーマンスに悪影響が出るので注意が必要です。

auto_explain.log_verbose

単なる EXPLAIN ではなく EXPLAIN VERBOSE の結果を出力するかどうかを指定します。デフォルトは off です。

auto_explain.log_nested_statements

関数内で実行されるステートメントのようにネストされたステートメントをロギング対象に含めるかどうかを指定します。デフォルトは off です。


ここでは動作確認のため auto_explain.log_min_duration を 0 にし、すべてのステートメントがロギング対象となるようにしています。編集が完了したら PostgreSQL を再起動します。

起動したら適当なクエリを投げてみます。
$ psql -c "SELECT count(*) FROM pg_class, pg_index WHERE oid = indrelid AND indisunique;" test

ログを見てみると…
LOG:  duration: 0.240 ms  plan:
Aggregate (cost=21.79..21.80 rows=1 width=0)
-> Hash Join (cost=15.27..21.46 rows=129 width=0)
Hash Cond: (pg_index.indrelid = pg_class.oid)
-> Seq Scan on pg_index (cost=0.00..4.42 rows=129 width=4)
Filter: indisunique
-> Hash (cost=11.23..11.23 rows=323 width=4)
-> Seq Scan on pg_class (cost=0.00..11.23 rows=323 width=4)
STATEMENT: SELECT count(*) FROM pg_class, pg_index WHERE oid = indrelid AND indisunique;

ちゃんとロギングされています。

いずれの機能も DB 運用担当者には嬉しい機能ですね。

そのほか 8.4 の新機能についてわかりやすくまとまっているページのリンクを張っておきます。個別詳細に踏み込んではいませんが、ざっと眺めるには良いページです。ちなみに著者は pg_stat_statements, auto_explain の作者の方のようです。

2009-06-29

VirtualBox on Mac OS X

色々気軽に試せる環境を作ろうと、ローカル仮想環境に VirtualBox を導入しました。一つ目の仮想環境は Debian GNU/Linux です。

VirtualBox を立ち上げて新規仮想環境を作成し、Debian のインストール、起動までは快調。次にホストである Mac からゲストの Debian に SSH でログインしようと思ったときにはたと止まりました。

ネットワークの設定をした覚えはないけど、Debian から外には出られている。一体どういう設定がされたのだ?

Debian 上でネットワーク設定を確認。

$ /sbin/ifconfig
eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0


Mac は 192.168.0.0/24 のセグメントにいるのでどうやら NAT されているらしい。設定を開いて見てみるもそれらしい箇所はないので、ググってみるとそれらしいものを発見。ポートフォワーディングでいけるとのこと。見つけたコマンドは以下の通り。

$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" TCP
$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 22
$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" 10022


VBoxManage の 2つめの引数には新規仮想マシン作成時につけた仮想マシン名を指定します。設定を有効にするため仮想マシンを再起動します。

……、立ち上がりません。

仮想マシン"debian"の起動に失敗しました。

Configuration error: Failed to get the "MAC" value (VERR_CFGM_VALUE_NOT_FOUND).

Unknown error creating VM (VERR_CFGM_VALUE_NOT_FOUND).


インストール後に仮想マシンの設定でいじったのはポートフォワーディングのところだけなので、ポートフォワーディングの設定が怪しいですが断言はできません。一旦設定を削除して起動するかどうかを確認。

$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol"
$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort"
$ VBoxManage setextradata "debian" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort"


設定を消したところで起動してみると、起動します。ポートフォワーディングの設定を間違えているのは間違いありません。VirtualBox をインストールするときにマニュアルらしきものがあったような気がするので dmg ファイルをマウントして中を見てみると、ありました。"6.4.1 Configuring port forwarding with NAT" を読んでいると以下のような記述が

An example of how to set up incoming NAT connections to an ssh server on the guest requires the following three commands:

VBoxManage setextradata "Linux Guest" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" TCP
VBoxManage setextradata "Linux Guest" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 22
VBoxManage setextradata "Linux Guest" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" 2222


The above example assumes a PCNet virtual network card; if you have configured the guest to use the Intel PRO/1000, replace “pcnet” with “e1000” in the above commands.


ネットワークカードは Intel だった気がします。VirtualBox の仮想マシン詳細画面にもネットワークの情報が記載されていた気がするので確認。Intel PRO/1000 MT Desktop (NAT) でした。コマンドを以下のように書き換えて実行します。

$ VBoxManage setextradata "debian" "VBoxInternal/Devices/e1000/0/LUN#0/Config/guestssh/Protocol" TCP
$ VBoxManage setextradata "debian" "VBoxInternal/Devices/e1000/0/LUN#0/Config/guestssh/GuestPort" 22
$ VBoxManage setextradata "debian" "VBoxInternal/Devices/e1000/0/LUN#0/Config/guestssh/HostPort" 10022


設定後、起動ボタンをクリックすると今度は無事に立ち上がりました。SSH ログインもできることを確認し無事解決です。

2009-06-23

Firefox の起動が遅くなったら

以前 ここ を見てスクリプトを作成したので今更かもしれませんがご紹介。sqlite3 コマンドがあるならアドオン入れて一つずつやるより早いです。

#!/bin/sh

find . -name '*.sqlite' | while read f; do
ls -l "$f" | awk '{ printf("%d -> ", $5) }';
sqlite3 "$f" vacuum && sqlite3 "$f" reindex;
ls -l "$f" | awk '{ printf("%d: ", $5) }';
echo "$f";
done


ls や echo は処理前後でどのような変化があったのかを表示するだけなので削除してもかまいません。また Mac では動作を確認していますが Linux などでは確認していません (もし動かなくても微調整で動くとは思いますが)。

このスクリプトをホームディレクトリで実行すると Firefox だけでなく Thunderbird のファイルも最適化されます。

2009-06-16

Java for Mac OS X 10.5 Update 4

ソフトウェア・アップデートで Java for Mac OS X 10.5 Update 4 のアップデート通知があったのでいつものようにアップデートしてみました。と、その前に現状のバージョンを確認。
atropos% java -version
java version "1.5.0_16"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_16-b06-284)
Java HotSpot(TM) Client VM (build 1.5.0_16-133, mixed mode, sharing)

次いで [インストール] ボタンをクリックしてインストールを進めるがエラー発生。エラーと出るだけで何がダメなのか一切わからない…。Web ブラウザを立ち上げていたのがまずかったのかと思い Web ブラウザをすべて終了させてもう一度チャレンジ。やっぱりエラー。コンソール.app でログも確認してみましたが特に怪しいところはありません。

何かほかにできることは…。

Apple のサイトからディスクイメージをダウンロードしてインストールすることを思いついたので試してみます。Apple Japan のダウンロードページ を探すものの見つからない…。本家 に行ってみるとあっさり見つかりました。ダウンロードしていつものようにインストールすると、エラーなしで正常終了。バージョンを確認します。
atropos% java -version
java version "1.5.0_19"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_19-b02-304)
Java HotSpot(TM) Client VM (build 1.5.0_19-137, mixed mode)

ちゃんとバージョンアップできました。

2009-06-15

SEO 対策基礎の基礎

先日コーポレイトサイトを立ち上げたのですが、これまでまともに SEO (Search Engine Optimization) というものをしたことがなかったので、検索エンジンで会社名や URL そのものを検索してもかすりもしませんでした…。冷静に考えると馬鹿なことを考えていたものですが、サイトを立ち上げさえすればクローラが勝手にやって来て indexing してくれるだろうと思っていたんです。どこからもリンクされていないサイトをクローラが見つけてくれるなんてことはありませんよね。

ということで、主要検索エンジンに indexing されるよう URL を登録しました。

Google

Yahoo! Japan
Bing / MSN


各サービスにはそれぞれサイト管理者向けのヘルプも用意されているのでそれらにも目を通しておくと良いと思います。

2009-06-11

思いそして願い

これまで技術的な問題で行き詰まったときに先人が残してくれた情報に助けられたことは数え切れないくらいありました。このブログにも日々の作業内容や得た知見などを記録していくことで、自分自身の学習のためだけでなく誰かの役に立つ情報が一つでも多く残せればよいと思っています。そして役に立ってくれることを願います。