ユークリッドの互除法とは、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 の システムカタログは Oracle の ディクショナリ に近いものです。
例えばテーブルの情報を取得するには次の pg_tables ビューを使います。
select schemaname, tablename from pg_tables;
他にも色々なシステムカタログがあります。 詳しくは PostgreSQL のサイトの情報を参照してください。
Firefox で goo辞書を便利に使うアドオンです。
国語辞典として goo辞書をよく使うのですが このアドオンを入れてから より手軽に使えるようになりました。
色々と機能はあるのですが、 オススメポイントは、単語を選択した右クリックメニューに 「国語辞書で"(選択した単語)"をしらべる」が 追加されることです。
※英和辞典と和英辞典は使わないので非表示にしています。
お気に入りの Firefox アドオンです。
アドオンは、Firefox の大きな魅力ですが 一番最初に入れたのがこのアドオンでした。
ボタンの見た目が変わるだけなのですが そんなことが簡単に変更できてしまうことに “拡張”のすごさを感じました。
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 表示を開始しました。 東京、京都、大阪、神戸からの対応で 徐々に広げていくそうです。
東京タワーも ニョキニョキしています。
まだ箱だけのビルも沢山あります。 逆に、この状態が見れるのは今だけかもしれないので 面白いかもしれません。
コマンドは ";" (セミコロン) で並べて書くことができます。
$ 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
Firefox3.5 と 知床 のコラボキャンペーン Discover Shiretoko のバナーを付けてみました。
Firefox3.5 のコードネームが Shiretoko なんだそうです。
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 つでも複数でも 配列で返してくれるため分岐が不要になるのです。
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 |
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 を一時的に無効にして、 処理を確認するのが有効です。
まず、現在の状態を確認するには、次のコマンドを使います。
# 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 が、米国時間の6月19日(日本時間の6月20日)に一般公開されました。
正式版のリリースは30日だそうです。
リリースノートを見ても、あまり違いを実感できそうにないのですが お世話になっているので 人柱になっておこうと思います。
追記型でログファイルなどを作成していると ファイルを 0 バイトでクリアしたいときがあります。
次ようなコマンドで ファイルを 0 バイトにします。 (ファイルが存在しなければ、 0 バイトのファイルを作成します)
$ cat /dev/null > 0.txt
DOS の場合は、次のようにコマンドを打ちます。 null ではなく、nul なので注意してください。
C:\> type nul > 0.txt
今年も、オープンソースカンファレンス Kansai の季節がやってきました。 日程は、2009年07月10日(金),11日(土)です。
オープンソース好きが集まる オープンソースのためのお祭です。
毎年(金曜日は有休をとって)参加しているのですが 好きなことをやってる人の 好きなものへの熱い情熱を感じることができます。
行った後は「頑張ろう!」という気持ちになれます♪
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 サーバを使って作業していると サーバからサーバにファイルを転送したいときがあります。
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 -'
パイプを使って転送すると 一時ファイルが不要なだけでなく コマンドを使いこなしてる! という感じがします。
Red Hat Enterprise Linux 5 の導入していたときの話ですが、 vsftpd の ftp サーバを入れて 接続しようとしたところ エラーで怒られてしまいました。
ftp 用のアカウントを作成して そのホームディレクトリ以下しか アクセスできないようにしたのですが、 ホームディレクトリのアクセスに対して SELinux が怒っているようでした。
# setsebool -P ftp_home_dir 1
そんな場合、上記の呪文で ftp_home_dir の値を active にします。
ちなみに "-P"オプションを付けないと、再起動後に元に戻ってしまいます。
自作ツール OdinsClock を 1.1.0b に バージョンアップしました。
今回のバージョンアップは、 クリップボードのテキストから表を作成する機能の追加です。
メモ帳で、CSVデータをさっと作って、 それをコピー&ペーストして、テキスト表を作ることができます。