ユークリッドの互除法による最大公約数・最小公倍数

ユークリッドの互除法とは、2つの自然数の最大公約数を求める場合に 大きい方から小さい方を引き、さらに小さい方から引いてできた数を引く処理を繰り返して、 引く数と引かれる数が同じになったとき、それが最大公約数であるというものです。

これを使うと引き算だけで最大公約数を求めることができます。

具体的には次のようになります。

45 と 33 の 最大公約数を求める

45 - 33 = 12
     33 - 12 = 21
          21 - 12 = 9 ( 21 > 12 )
               12 - 9 = 3
                    9 - 3 = 6
                        6 - 3 = 3 ( 6 > 3 )
                            3 - 3 = 0 <---- 3 が最大公約数

これを JavaScript で書くと次のようになります。

function gcd(a, b) {
    return (a == b) ? a : gcd(Math.abs(a - b), (a > b) ? b : a);
}

ちなみに 上の例では何度も 3 を引いていますが 大きい方から小さい方を引くのではなく、 割った余りを求める方法だと もっと簡単になります。

次に最小公倍数ですが 最大公約数と最小公倍数には、下のような関係があります。

a × b = aとbの最大公約数 × aとbの最小公倍数

つまり最大公約数がわかれば最小公倍数は計算できるので 次のような JavaScript で最小公倍数が求められます。

function lcm(a, b) {
    return a * b / gcd(a, b);
}

gcd() は、先ほど作った最大公約数を求める関数です。

JavaScript などのように 標準で最大公約数・最小公倍数を求める関数を持っていない言語を 使うときに これを知ってるとちょっと便利です。

コマンドプロンプトのタイトルを変更する

Windows 2000/XP から コマンドプロンプトは TITLE コマンドで ウィンドウのタイトルを変えることができるようになりました。

@ECHO OFF

TITLE コマンドプロンプトで何をしているかわかりやすい!
PAUSE

これを実行すると 次のようになります。

時間のかかる処理のときなど コマンドプロンプトのタイトルを変えておけば 何の処理をしているかわかりやすくなります。

PostgreSQL の システムカタログ

PostgreSQL の システムカタログは Oracle の ディクショナリ に近いものです。

例えばテーブルの情報を取得するには次の pg_tables ビューを使います。

select schemaname, tablename from pg_tables;

他にも色々なシステムカタログがあります。 詳しくは PostgreSQL のサイトの情報を参照してください。

Firefox Add-ons: goo辞書

Firefox で goo辞書を便利に使うアドオンです。

国語辞典として goo辞書をよく使うのですが このアドオンを入れてから より手軽に使えるようになりました。

色々と機能はあるのですが、 オススメポイントは、単語を選択した右クリックメニューに 「国語辞書で"(選択した単語)"をしらべる」が 追加されることです。

※英和辞典と和英辞典は使わないので非表示にしています。

Firefox Add-ons: 中止ボタンがしいたけに見えて困る

お気に入りの Firefox アドオンです。

アドオンは、Firefox の大きな魅力ですが 一番最初に入れたのがこのアドオンでした。

ボタンの見た目が変わるだけなのですが そんなことが簡単に変更できてしまうことに “拡張”のすごさを感じました。

wget で プロキシを利用する

wget は、コマンドラインで HTTP や FTP の データを取得するコマンドです。 wget で プロキシを利用する場合の設定方法を メモとして書いておきます。

プロキシサーバのIPアドレスが 192.168.1.200、 ポート番号が 3128 の場合、 次のように環境変数 http_porxy を設定します。

$ export http_porxy=192.168.1.200:3128
$ wget http://www.yahoo.co.jp/

プロキシにユーザ認証が必要な場合、 次のように wget のオプションを指定します。

$ export http_porxy=192.168.1.200:3128
$ wget --proxy-user=username \
       --proxy-password=passwrod \
       http://www.yahoo.co.jp/

"\" (円マーク/バックスラッシュ)は、コマンドの途中で改行するための記号です。

Google Earth 3D 日本上陸

Google Earth が 日本の都市の 3D 表示を開始しました。 東京、京都、大阪、神戸からの対応で 徐々に広げていくそうです。

東京タワーも ニョキニョキしています。

まだ箱だけのビルも沢山あります。 逆に、この状態が見れるのは今だけかもしれないので 面白いかもしれません。

コマンドの条件付き連続実行

コマンドは ";" (セミコロン) で並べて書くことができます。

$ echo 1; echo 2; echo 3
1
2
3

これは "|" (パイプ) のように出力を次のコマンドに渡したりは せず、単純に連続で実行します。

";" (セミコロン) ではなく "&&" (AND演算子) を使うと 前のコマンドが正常終了した場合のみ 次のコマンドを実行します。

$ echo 1 && false && echo 2
1

"false" は、必ず異常終了するコマンドです。 "false" で異常終了したため、 "echo 2" が実行されませんでした。

逆に前のコマンドが異常終了した場合のみ 次のコマンドを実行する "||" (OR演算子) もあります。

$ false || echo 1
1

コマンドが異常終了したときに 特別な処理をさせるなどできます。

あくまで前のコマンドの実行結果がどうか ということなので、次のように書いた場合 先頭から順に判定されます。

$ echo 1 && false || echo 2 && false || echo 3
1
2
3

Discover Shiretoko

Firefox3.5 と 知床 のコラボキャンペーン Discover Shiretoko のバナーを付けてみました。

Firefox3.5 のコードネームが Shiretoko なんだそうです。

VBS から CDO コンポーネントで簡単にメールを送信する

CDO コンポーネントを使用すると VBS や VBA から簡単にメールを送信することができます。

次の表の環境で CDO コンポーネントを利用することができます。

環境CDO利用SMTPサービス
Windows 2000 Professional ○(デフォルトOK)
Windows 2000 Server ○(デフォルトOK)
Windows XP Professional ○(デフォルトOK)
Windows XP Home Edition ×
Windows Server 2003 △(要マニュアル設定)

VBS の場合、次のように書きます。

Set objCdoMessage = CreateObject("CDO.Message")
With objCdoMessage
    .From = "送信元名 <xxxxx@example.com>"
    .To = "送信先名 <yyyyy@example.com>"
    .Subject = "件名"
    .TextBody = "メッセージ"
    .Send
End With
Set objCdoMessage = Nothing

たったこれだけでメールを送ることができます。

ただし、上の表で SMTP サービスが、×になっている Windows XP Home Edition は 次のサンプルのように 外部の SMTP サービスを指定する必要があります。

Const cdoSendUsing = _
    "http://schemas.microsoft.com/cdo/configuration/sendusing"
Const cdoSmtpServer = _
    "http://schemas.microsoft.com/cdo/configuration/smtpserver"
Const cdoSmtpServerPort = _
    "http://schemas.microsoft.com/cdo/configuration/smtpserverport"

Set objCdoMessage = CreateObject("CDO.Message")
With objCdoMessage
    .Configuration.Fields.Item(cdoSendUsing) = 2
    .Configuration.Fields.Item(cdoSmtpServer) = "mail.example.com"
    .Configuration.Fields.Item(cdoSmtpServerPort) = 25
    .Configuration.Fields.Update
    .From = "送信元名 <xxxxx@example.com>"
    .To = "送信先名 <yyyyy@example.com>"
    .Subject = "件名"
    .TextBody = "テストメッセージです"
    .Send
End With
Set objCdoMessage = Nothing

この例では mail.example.com の 25 番ポートを SMTP サーバとして指定しています。

ちなみに Const で定義している URL は アクセスするのではなく SMTP サーバを設定するための 識別子として利用されます。

シェルで位置パラメータのセット

シェルで変数に値をセットする場合は 次のようにします。

$ var1=KAME

$ echo $var1
KAME

コマンドの実行結果をセットする場合は 次のようにします。

$ var2=`echo KAME to USAGI`

$ echo $var2
KAME to USAGI

この例では、$var2 に "KAME to USAGI" とセットされてしまいますが 別々の変数にセットしたい場合があります。

そんなときには、set コマンドを使用します。

set コマンドは、次の例のように 引数を $n の位置パラメータにセットすることができます。

$ set KANI SARU KAKI

$ echo $1
KANI
$ echo $2
SARU
$ echo $3
KAKI

コマンドの結果をセットするには 次のように書きます。

$ set `echo KAME to USAGI`

$ echo $1
KAME
$ echo $2
to
$ echo $3
USAGI

コマンドと定数を混ぜて書くこともできます。

$ set KURI `echo KANI KAKI` ONIGIRI

$ echo $1,$2,$3,$4
KURI,KANI,KAKI,ONIGIRI

値の中に set のオプションとして理解されそうなものが ある場合は、"--" オプションを指定します。 "--" オプション以降は全て引数と判定されます。

$ set -- -x

$ echo $1
-x

位置パラメータをクリアするには、 "--" オプションだけを指定します。

$ set --

フォーム内の同名エレメントが単数/複数になる

新人さんから質問されたのでメモを書いておきます。

HTML の フォーム内に 同じ名前でエレメントが 1つだったり 複数だったりすることがあるそうです。 そんな場合は、次のような "document.FORM.ELEMENT" 指定だと if 文等で分岐させなくてはなりません。

if ( 1 つのとき ) {
    window.alert( document.FORM.ELEMENT.name );
} else {
    for ( var i = 0; i < document.FORM.ELEMENT.length; i++ ) {
        window.alert( document.FORM.ELEMENT[i].name );
    }
}

1 つの案として document.getElementsByName() を使う方法があります。

var objs = dicument.getElementsByName("element");
for ( obj in objs ) {
    window.alert( obj );
}

document.getElementsByName() は、エレメントが 1 つでも複数でも 配列で返してくれるため分岐が不要になるのです。

nkf で文字コード変換

Linux では、nkf というコマンドを使って、文字コードの変換ができます。

次の例は Shiht_JIS の input_file を UTF-8 に変換して output_file に 出力しています。

$ nkf -S -w -x -O input_file output_file

"-S" は、読込ファイルの文字コードが Shift_JIS という指定です。 付けなくても自動判定しますが、読込ファイルの文字コードが わかっているときは、付けておいた方が誤認識しなくて良いです。

"-w" は、出力の文字コードが UTF-8 という指定です。

"-O" は、最後に 出力ファイルを指定するオプションです。 このオプションを指定しないと標準出力に出力します。 データが多くなると、標準出力をファイルにリダイレクトするより このオプションで出力ファイルを指定する方が速度が出ます。

次の表は、文字コードのオプションです。

文字コード読込出力
Shift_JIS-S-s
JIS-J-j
EUC-JP-E-e
UTF-8/UTF-8N-W-w

VB6/VBS で、クラスのデフォルトプロパティを定義する

Java などでは、toString メソッドがあり オブジェクトを表現する文字列を返すことができます。

VB6 や VBS で、同じようにオブジェクトをメソッド無しで 指定した時に、オブジェクトの値を出力することができれば デバックなどに役に立ちそうです。

VB6 や VBS の場合、 次の例のように Default を指定して Get プロパティを作成します。 (名前は何でもOKです)

Class Test
    Public Default Property Get ToString()
         ToString = "Test Class"
    End Property
End Class

下のようにオブジェクトをメソッドなしで指定すれば、 「Test Class」と表示されます。

Dim t
Set t = New Test
Msgbox t

SELinux の状態変更

SELinux は、便利ですが、アクセスエラーなどの問題が発生したときに 処理が悪いのか SELinux が影響しているのか判断し難いときがあります。

そんなときは、SELinux を一時的に無効にして、 処理を確認するのが有効です。

まず、現在の状態を確認するには、次のコマンドを使います。

# getenforce

Enfocing や Permissive といった状態名が表示されます。 状態名の内容は次の表のようになります。

状態 機能 制御
Enfocing 有効 有効
Permissive 警告のみ 無効
Disabled 無効 無効

Enfocing は、SELinuxが 全て有効な状態です。

Permissive は、SELinuxが 警告を表示するだけで、制御はしない状態です。 原因が SELinux か判断できないときに、この状態に変更して確認します。

Disabled は、SELinuxが 全て無効な状態です。

次のコマンドで SELinux の状態を、 一時的に Permissive にすることができます。 再起動すると元に戻ります。

# setenforce 0

次のコマンドで SELinux の状態を、 一時的に Enfocing にすることができます。 こちらも再起動すると元に戻ります。 このコマンドで、状態を Disabled にすることはできません。

# setenforce 1

永続的に変更するには、次のファイルの SELINUX の値を変更して再起動します。

# vi /etc/sysconfig/selinux
SELINUX=disabled

Firefox 3.5 RC2 リリース

Firefox の 3.5 RC2 が、米国時間の6月19日(日本時間の6月20日)に一般公開されました。

正式版のリリースは30日だそうです。

リリースノートを見ても、あまり違いを実感できそうにないのですが お世話になっているので 人柱になっておこうと思います。

ファイルを 0 バイトにする

追記型でログファイルなどを作成していると ファイルを 0 バイトでクリアしたいときがあります。

次ようなコマンドで ファイルを 0 バイトにします。 (ファイルが存在しなければ、 0 バイトのファイルを作成します)

$ cat /dev/null > 0.txt

DOS の場合は、次のようにコマンドを打ちます。 null ではなく、nul なので注意してください。

C:\> type nul > 0.txt

オープンソースカンファレンス2009 Kansai !

今年も、オープンソースカンファレンス Kansai の季節がやってきました。 日程は、2009年07月10日(金),11日(土)です。

オープンソース好きが集まる オープンソースのためのお祭です。

毎年(金曜日は有休をとって)参加しているのですが 好きなことをやってる人の 好きなものへの熱い情熱を感じることができます。

行った後は「頑張ろう!」という気持ちになれます♪

tar コマンドで 不要なファイルは除外する

tar コマンドを使って固めるときに パスの指定の方法によっては 不要なファイルやディレクトリが混ざる場合があります。

必要なファイルのみを指定するのが難しい場合、 不要なファイルを除外する方法があります。

まずは何も指定しない場合です。

$ tar cvf test.tgz  test
test/
test/a/
test/a/aaa1.txt
test/a/aaa2.txt
test/c/
test/c/ccc1.txt
test/b/
test/b/bbb1.txt

test/a の配下が不要な場合 次のように "--exclude" オプションを使って 不要なパスのパターンを指定します。

$ tar cvf test.tgz --exclude 'test/a*'  test
test/
test/b/
test/b/bbb1.txt
test/c/
test/c/ccc1.txt

test/a を除外することができました。

ただし、test/a.txt のようなファイルも除外してしまうので パターンを指定する場合は注意してください。

Linux のサーバ間ファイル転送

複数台の Linux サーバを使って作業していると サーバからサーバにファイルを転送したいときがあります。

ssh を動かしていれば、簡単にファイルを転送することができます。

次の例は、scp コマンドを使って、 ローカル(ログインしているサーバ)の test.txt を 192.168.1.101 の /tmp/test.txt に転送しています。

$ scp test.txt username@192.168.1.101:/tmp/test.txt

次の例のように ssh コマンドを使って ディレクトリを固める→送る→展開する を パイプを使って 行うこともできます。

$ tar cf - test | ssh username@192.168.1.101 'cd /tmp;tar xf -'

パイプを使って転送すると 一時ファイルが不要なだけでなく コマンドを使いこなしてる! という感じがします。

OdinsDice 0.1.0b 公開

自作ツールに OdinsDice を掲載しました。

OdinsDice は、3Dのサイコロを振るだけのツールです。

OpenGLの勉強として作成しました。

Red Hat で vsftpd

Red Hat Enterprise Linux 5 の導入していたときの話ですが、 vsftpd の ftp サーバを入れて 接続しようとしたところ エラーで怒られてしまいました。

ftp 用のアカウントを作成して そのホームディレクトリ以下しか アクセスできないようにしたのですが、 ホームディレクトリのアクセスに対して SELinux が怒っているようでした。

# setsebool -P ftp_home_dir 1

そんな場合、上記の呪文で ftp_home_dir の値を active にします。

ちなみに "-P"オプションを付けないと、再起動後に元に戻ってしまいます。

OdinsTable 1.1.0b 公開

自作ツール OdinsClock を 1.1.0b に バージョンアップしました。

今回のバージョンアップは、 クリップボードのテキストから表を作成する機能の追加です。

メモ帳で、CSVデータをさっと作って、 それをコピー&ペーストして、テキスト表を作ることができます。

Google サイト内検索

Amazonアソシエイト