1.11.2012

Oracle: How to find out the usage of tablespaces

Oracle: 表領域使用率の取得

dba_data_files と dba_free_space を結合して、表領域全体のサイズと空き容量(いずれもMB単位)を得る
SQLスクリプトの例。

出力は表領域名、全体の容量、空き容量の3項目。
ヘッダーは敢えて表示しない。

   1: set linesize     1000
   2: set pagesize     0
   3: set heading      off
   4: set feedback     off
   5: set serveroutput on
   6:  
   7: SELECT a,
   8:        to_char(nvl(x / 1024 / 1024, 0), '999999990.00'),
   9:        to_char(nvl(y / 1024 / 1024, 0), '999999990.00')
  10: FROM   ( SELECT tablespace_name a, sum(bytes) x FROM dba_data_files
  11:          GROUP BY tablespace_name ),
  12:        ( SELECT tablespace_name b, sum(bytes) y FROM dba_free_space
  13:          GROUP BY tablespace_name )
  14: WHERE  a = b(+)
  15: ORDER  BY a;
  16:  
  17: exit

Effects of the environment variables 'GZIP' and 'BZIP2'

UNIX: GZIP/BZIP2 環境変数の罠

環境変数 GZIP / BZIP2 には特別な効果があり、定義するとそれぞれ gzip / bzip2 コマンドを実行したときに
デフォルトのパラメータとして評価されるようになる。

これを知らずにこのようなシェルを書いてしまうと・・・

GZIP=/usr/bin/gzip
$GZIP foo.txt
実際にはこのようなコマンドを実行したのと同じである。
/usr/bin/gzip /usr/bin/gzip foo.txt
図らずも、gzip プログラム本体の圧縮が試みられる結果となる。

参考:
http://www.gnu.org/software/gzip/manual/gzip.html#Environment

1.09.2012

Perl: How to verify 'system()' function on Windows

Perl: Windows環境における system() 組み込み関数のエラー検証について

Perl ベストプラクティス本では、システムエラーの検証について以下のようにするのではなく

system $cmd
    and croak "Couldn't run: $cmd ($OS_ERROR)";

このようにすべしとある。

use POSIX qw( WIFEXITED );

WIFEXITED(system $cmd)
    and croak "Couldn't run: $cmd ($OS_ERROR)";

しかし、後者のコードを Windows 環境で実行するとこのようなエラーが通知される。

POSIX::WIFEXITED not implemented on this architecture at ...

まだPOSIXモジュールのソースを読み込んではいないが、結局前者の方法を取るしかないのか……

尚、Perl 6 では戻りのブール値が逆になり、ステータスコードが 0 の場合に true が返ってくるそうだ。

1.07.2012

How to get full path to the script in HTA, etc..

HTA、他: 自分自身のフルパスを取得する方法

スクリプトファイルの自分自身のパスと、その親ディレクトリを取得する方法の一覧。
実現方法はいずれも一例である。

・HTA (HTML Applications) – VBScript

path = unescape(window.location.pathname)
If window.location.host <> "" Then path = "\\" & window.location.host & path
dir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(path)

 パスに空白が含まれている場合、unescape を行わないと「%20」のように
 パーセントエンコーディングされたままである可能性がある。
 <script>タグの間では、window. を省略可能。
 ※2012/06/16 追記: location.host を参照し、UNCパスに対応

・VBScript

path = WScript.ScriptFullName
dir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(path)
WScript.Echo path & vbCrLf & dir

・Bourne Shell

path=`(cd \`dirname $0\` && pwd)`/`basename $0`
dir=`dirname $path`
echo "${path}\n${dir}"
 2011/12/21 の記事の再掲。

・Perl

use File::Basename;
use File::Spec;
$path = File::Spec->rel2abs(__FILE__);
$dir = dirname $path;
print "$path\n$dir\n";
 __FILE__ に替えて $0 を使う方法もある。それらに直接フルパスが格納されるかは処理系依存の模様。
 Cwd モジュールなどを使った他のやり方も多く存在。
 
・Python
import os
path = os.path.abspath(__file__)
dir = os.path.dirname(path)
print '%s\n%s' % (path, dir)

 __file__ にフルパスが入るかは処理系依存の模様。
import sys を行なってから sys.argv[0] を参照する方法でも代替可能。

・Windows バッチファイル ※2012/04/01追記

@echo off
set full_path=%~f0
set dir=%~dp0
echo %full_path%
echo %dir%
ディレクトリには、末尾の '\' が付加されているので注意。
詳細情報は for /? で確認することもできる。

参考:
http://www.jazoka.info/index.php?db=so&id=84932

1.05.2012

Perl: Subroutines in a hash

Perl: ハッシュの中のサブルーチン

任意のキーによって処理内容自体を変えたい場合、if 文の連鎖よりもハッシュを使ったほうがエレガントだ。

単純な処理なら、無名サブルーチンでよい。

#!/usr/bin/env perl

use strict;
use warnings;

my %comp = (
    'eq' => sub{ return $_[0] == $_[1] },  # equality
    'lt' => sub{ return $_[0] <  $_[1] },  # less than
    'le' => sub{ return $_[0] <= $_[1] },  # less than or equal to
);

for my $op ('eq', 'lt', 'le') {
    for my $x (1 .. 3) {
        print "$x $op 2: ", $comp{$op}($x, 2) ? 'YES' : 'NO', "\n";
    }
}

・出力

1 eq 2: NO
2 eq 2: YES
3 eq 2: NO
1 lt 2: YES
2 lt 2: NO
3 lt 2: NO
1 le 2: YES
2 le 2: YES
3 le 2: NO

ちなみに、6行目を次のように書いてしまうとコンパイルエラーとなる。
無名ハッシュの参照をとると、その戻り値は 1個だけであり、ハッシュ初期化のための要素が奇数になってしまうためだ。

my %comp = {
    'eq' => sub{ return $_[0] == $_[1] },  # equality
    'lt' => sub{ return $_[0] <  $_[1] },  # less than
    'le' => sub{ return $_[0] <= $_[1] },  # less than or equal to
};

エラーメッセージは以下のとおり。

Reference found where even-sized list expected at ... line 10.
Use of uninitialized value in subroutine entry at ... line 14.
Can't use string ("") as a subroutine ref while "strict refs" in use at ... line 14.

1.03.2012

How to copy text to the clipboard in Python

Python: クリップボードへ文字列を貼り付け

下記サイトより転記。Windows/Mac/Linux に対応。
http://www.pasteall.org/14794/python

# Code from
# http://blenderscripts.googlecode.com/svn-history/r41/trunk/scripts/sketch_export.py
def copy_to_clipboard(text):
    """
   Copy text to the clipboard
   Returns True if successful. False otherwise.
   """
   
    # =============================================================================
    # win32 (Windows)
    try:
        import win32clipboard
        win32clipboard.OpenClipboard()
        win32clipboard.EmptyClipboard()
        win32clipboard.SetClipboardText(text)
        win32clipboard.CloseClipboard()
        return True
    except:
        pass
   
    # =============================================================================
    # clip (Windows)
    try:
        import subprocess
        p = subprocess.Popen(['clip'], stdin=subprocess.PIPE)
        p.stdin.write(text)
        p.stdin.close()
        retcode = p.wait()
        return True
    except:
        pass
       
    # =============================================================================
    # pbcopy (Mac OS X)
    try:
        import subprocess
        p = subprocess.Popen(['pbcopy'], stdin=subprocess.PIPE)
        p.stdin.write(text)
        p.stdin.close()
        retcode = p.wait()
        return True
    except:
        pass
       
    # =============================================================================
    # xclip (Linux)
    try:
        import subprocess
        p = subprocess.Popen(['xclip', '-selection', 'c'], stdin=subprocess.PIPE)
        p.stdin.write(text)
        p.stdin.close()
        retcode = p.wait()
        return True
    except:
        pass
       
    # =============================================================================
    # xsel (Linux)
    try:
        import subprocess
        p = subprocess.Popen(['xsel'], stdin=subprocess.PIPE)
        p.stdin.write(text)
        p.stdin.close()
        retcode = p.wait()
        return True
    except:
        pass
       
    # =============================================================================
    # pygtk
    try:
        # Code from
        # http://www.vector-seven.com/2007/06/27/passing-data-between-gtk-applications-with-gtkclipboard/
        import pygtk
        pygtk.require('2.0')
        import gtk
        # get the clipboard
        clipboard = gtk.clipboard_get()
        # set the clipboard text data
        clipboard.set_text(text)
        # make our data available to other applications
        clipboard.store()
        return True
    except:
        pass
       
    return False

1.02.2012

Refactoring punctuation variables in Perl

Perl: 句読点変数のリファクタリング

Perl には $!  $?  $@  $|  $"  $,  などのいわゆる句読点変数が多く定義されている。
これがコードの視認性の悪さにつながっているのは疑いの余地もない。

English モジュールを利用することで、以下のような名前付きの変数を使えるようになる。

・名前付き変数の例

組み込みグローバル変数 名前付き変数(English モジュール) 概要
$! $OS_ERROR    $ERRNO エラー番号またはエラーメッセージ
$? $CHILD_ERROR 最後に実行されたコマンドのステータス
$@ $EVAL_ERROR 直前の eval コマンドのエラーメッセージ
$| $OUTPUT_AUTOFLUSH 出力の自動フラッシュ
$" $LIST_SEPARATOR リストセパレータ
$, $OUTPUT_FIELD_SEPARATOR    $OFS 出力フィールドセパレータ

ただし、『Perl ベストプラクティス』 (O'REILLY) によれば、English モジュールの使い方は以下のようにすべしとある。

use English qw( -no_match_vars );

これは、マッチ変数を定義することによる弊害(正規表現の性能劣化)を防ぐためである。

参考:
『Perl ベストプラクティス』 (O'REILLY)
http://www.tutorialspoint.com/perl/perl_special_variables.htm