金曜日, 5月 11, 2012

MS SQL Server 2008 R2 Expressのインストールでつまづいた

Windows XP SP3 (32bit)での話。
事前に「.NET Framework 4」やら「Windowsインストーラ4.5」やら「Windows PowerShell 1.0」のインストールが必要。
管理ツール -> 「ローカルセキュリティポリシー」 -> 「ローカルポリシー」 -> 「ユーザ権利の割り当て」の「プログラムのデバッグ」に「NETWORK SERVICE」やら「LOCAL SERVICE」やらデータベース管理者を追加した。
また同じく「ローカルセキュリティポリシー」の「サービスとしてログオン」から古いバージョンのSQL Serverのユーザを削除した。
インストールが失敗した場合、再インストールの前に「プログラムの追加と削除」でインストールしたインスタンスを削除する必要あり。
厄介なこった。

(参考)
http://awoni.net/fc/sql-server-2008-express/
http://d.hatena.ne.jp/haradago/20100211/p1

MS SQL Server:他のマシンのバックアップを復元した際のログイン名変更

Management Studioにデータベース管理者で接続し、対象のデータベースに対してつぎのクエリを実行する。

EXEC sp_change_users_login 'Update_One', '変更前ログイン名', '変更後ログイン名'

金曜日, 4月 13, 2012

Android SDKのエミュレータ起動(Proxy経由) on Windows

Android SDKのインストールディレクトリ下の tools にパスが通っている前提。
AVD名が「hoge」として、コマンドプロンプトで

> emulator -avd hoge -http-proxy http://172.16.10.11:3128

のようにタイプする。

木曜日, 4月 12, 2012

IE + SSL + Flash (HTTPレスポンスヘッダーの怪)

Apacheの設定ファイルに

<LocationMatch "/var/www/html/private/.*\.(html|swf|gif|jpg|png)$">
  Header set Pragma no-cache
  Header set Cache-Control no-cache
  Header set Expires "Thu, 01 Dec 1994 16:00:00 GMT"
</LocationMatch>

とか書いて特定のディレクトリのファイルがキャッシュされないようにしている場合
IEでhttps接続するとFlashが再生されないことがある。
原因は

Header set Pragma no-cache

らしい。要注意。

水曜日, 4月 11, 2012

JavaScript: FlashPlayerバージョン確認

var flashPlayerVer = (function() {
  var flashVer = 0,
      plugin,
      verParts,
      flashOCX;
  if (navigator.plugins
      && navigator.mimeTypes['application/x-shockwave-flash']) {
    plugin = navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin;
    if (plugin) {
      verParts = plugin.description.split(" ");
      flashVer = verParts[2].replace('.', ',') + ',' + verParts[3].substring(1);
    }
  }
  else {
    flashOCX = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7").GetVariable("$version");
    if (flashOCX) {
      flashVer = (flashOCX.split(" "))[1];
    }
  }
  return flashVer;
})();

木曜日, 2月 23, 2012

Perl: Linux -> SQLServer 画像ファイル格納

LinuxマシンからWindowsマシンのSQL ServerにはFreeTDSとunixODBCで接続できるようになっている前提。
データベース接続にはDBIとDBD::ODBCを使う。
DBD::Sybaseではプレースホルダーが使えない(?)のでDBD::ODBCしかないが、動きが怪しい。
レコードが存在する場合にupdateしようとしたがうまくいかない。
そこで、レコードが存在する場合deleteしてinsertすることにしたが、これも同一接続内ではうまくいかない。
仕方ないので、select、deleteで一旦切断し、insert用に再度接続するようにした。
以下サンプル。

#!/usr/bin/perl --

use MIME::Parser;
use DBI;
use warnings;
use strict;

my $dbname  = 'hoge';
my $user_id = "";
my $item_id = '10';

my $parser = new MIME::Parser;
$parser->output_to_core(1);
my $entity;

eval {
    local $SIG{ALRM} = sub { die "timeout" };
    alarm 10;
    $entity = $parser->parse(\*STDIN) or die;
    alarm 0;
};
alarm 0;
if ($@) { exit; }

my $from = $entity->head->get('from');
if ($from =~ /<(.+?\@.+?)>/) {
    $from = $1;
}

$user_id = _check_from($dbname, $from);

if ($user_id ne "" and $entity->is_multipart) {
    _save_attached_file($entity, $dbname, $user_id, $item_id);
}

exit;


sub _connect_db($$$$) {
    my $db_host   = shift;
    my $db_name   = shift;
    my $db_user   = shift;
    my $db_passwd = shift;

    my $data_source = "dbi:ODBC:"
                    . "server=" . $db_host . ";"
                    . "database=" . $db_name;
    my $dbh = DBI->connect($data_source, $db_user, $db_passwd)
                  or die $DBI::errstr;
    $dbh->{AutoCommit} = 0;
    $dbh->{RaiseError} = 1;

    return $dbh;
}

sub _check_from($$) {
    my $dbname  = shift;
    my $from    = shift;
    my $user_id = "";

    my $db_server = 'windows-db';
    my $db_name   = $dbname;
    my $db_user   = 'foo';
    my $db_passwd = 'bar';
    my $dbh
        = _connect_db($db_server, $db_name, $db_user, $db_passwd);
    my $stmt = "SELECT user_id"
             . " FROM users WITH (NOLOCK)"
             . " WHERE email = '$from'";
    my $sth = $dbh->prepare($stmt)
              or die $dbh->errstr;
    $sth->execute or die $dbh->errstr;
    while (my $row = $sth->fetchrow_arrayref) {
        ($user_id) = @$row;
    }
    $sth->finish;
    $dbh->disconnect;

    return $user_id;
}

sub _save_attached_file($$$$) {
    my $entity  = shift;
    my $dbname  = shift;
    my $user_id = shift;
    my $item_id = shift;

    my $parts_count = $entity->parts;
    for (my $i = 1; $i < $parts_count; $i++) {
        my $part_entity = $entity->parts($i) ?
                          $entity->parts($i) :
                          $entity->parts($i)->parts($i);
        my $content_type = $part_entity->head->mime_type;

        if ($content_type =~ /\/(html|plain|alternative)/) {
            next;
        }

        my $attachment = $part_entity->bodyhandle->as_string;
        my $filename   = $part_entity->head->recommended_filename;

        my $db_server = 'earth-db';
        my $db_name   = $dbname;
        my $db_user   = 'foo';
        my $db_passwd = 'bar';
        my $dbh
            = _connect_db($db_server, $db_name, $db_user, $db_passwd);
        my $stmt = "SELECT user_id FROM files WITH(NOLOCK)"
                 . " WHERE user_id = '$user_id'"
                 . " AND item_id = '$item_id'";
        my $sth = $dbh->prepare($stmt) or die $dbh->errstr;
        $sth->execute or die $dbh->errstr;
        my $result_user_id = "";
        while (my $row = $sth->fetchrow_arrayref) {
            ($result_user_id) = @$row;
        }
        $sth->finish;
        if ($result_user_id) {
            $stmt = "DELETE FROM files"
              . " WHERE user_id = '$user_id'"
              . " AND item_id = '$item_id'";
            $sth = $dbh->prepare($stmt) or die $dbh->errstr;
            eval {
                $sth->execute;
                $dbh->commit;
            };
            if ($@) {
                $dbh->rollback or die $dbh->errstr;
            }
        }
        $dbh->disconnect;

        $dbh = _connect_db($db_server, $db_name, $db_user, $db_passwd);
        $stmt = "INSERT INTO files ("
              . "user_id,"
              . "item_id,"
              . "content_type,"
              . "content,"
              . "filename,"
              . "date"
              . ") VALUES ("
              . "'$user_id',"
              . "'$item_id',"
              . "'$content_type',"
              . "?,"
              . "'$filename',"
              . "GETDATE()"
              . ")";
        $sth = $dbh->prepare($stmt) or die $dbh->errstr;
        $sth->bind_param( 1, $attachment, DBI::SQL_LONGVARBINARY );
        eval {
            $sth->execute;
            $dbh->commit;
        };
        if ($@) {
            $dbh->rollback or die $dbh->errstr;
        }
        $dbh->disconnect;

        last;
    }
}

__END__

水曜日, 1月 04, 2012

Red Hat Enterprise Linux 6 で後からXをインストール

スーパーユーザで

# yum groupinstall "X Window System" Desktop

を実行。

月曜日, 9月 26, 2011

MS SQL Serverでtext型カラムの文字列を置換

テーブルitemのカラムitem_valueがtext型の場合で実際の値が8000バイト以下なら

UPDATE item SET item_value=REPLACE(CAST(item_value AS varchar(8000)),'foo','bar') WHERE item_id='1'

で「foo」を「bar」に置換できる。

火曜日, 8月 16, 2011

cpanmのインストール

$ su
Password:
# cd /usr/bin
# curl -k -LO http://xrl.us/cpanm
# chmod 755 cpanm

金曜日, 3月 25, 2011

ファイル内の文字列置換

カレントディレクトリ以下のファイル内のすべてのfooをbarに置換する。

$ find . -type f -print0 | xargs -0 perl -i.bak -pe 's/foo/bar/g'
$ find . -name "*.bak" -print0 | xargs -0 rm -f

も少しスマートにできんかね。

金曜日, 2月 25, 2011

Subversionに新規ファイルをまとめてコミット

ディレクトリhogeの下で新たに追加したファイルをまとめてSubversionにコミットするサンプル。

$ svn st -u hoge | perl -nle 'if ($_ =~ /^\?\s+(.+)$/) {system("svn", "add", $1);}'
$ svn commit -m 'comment' hoge

以上

木曜日, 11月 18, 2010

ファイルサイズの集計

カレントディレクトリ以下のファイルサイズの集計

$ find . -type f -printf "%s\n" | perl -nle 'BEGIN{my $sum = 0;} $sum += $_; END{print $sum;}'

awkで書くと

$ find . -type f -printf "%s\n" | awk '{ sum += $1; }; END { printf "%d\n", sum }'

木曜日, 9月 09, 2010

RootKit Hunterのインストール(CentOS)

CentOS 5.5にRootKit Hunterをインストールする。

rpmbuildコマンドがなければ、はじめにインストールする。

$ su
Password:
# yum install rpm-build

rkhunterのソースコードをダウンロードし、RPMパッケージを作成する。

# wget http://sourceforge.net/projects/rkhunter/files/rkhunter/1.3.6/rkhunter-1.3.6.tar.gz/download
# rpmbuild -ta rkhunter-1.3.6.tar.gz

作成されたRPMパッケージをインストールする。

# cd /usr/src/redhat/RPMS/noarch
# rpm -ivh rkhunter-1.3.6-1.noarch.rpm

rkhunterの使いかたは

# rkhunter -c

以上

月曜日, 9月 06, 2010

戻って来ました

今までメインで使っていたVoxが今月末でサービス終了だそうで。
戻って来ました。

セマフォがいっぱいでApacheが起動しない

2010/05/19perlfreak.vox.comより転載)
そんなときは

#!/bin/sh

for semid in `ipcs -s | grep apache | cut -d' ' -f2`; do
if ipcrm -s $semid; then
true
fi
done

を適当な名前で保存して実行権限をつけ、スーパーユーザで実行。

特定のプロセスをまとめてkill

2010/05/10perlfreak.vox.comより転載)
例えば、swatchのプロセスをまとめて強制終了したい場合

# ps ax | grep /usr/bin/swatch | awk '{print $1}' | xargs kill -KILL

Perlワンライナー:.batファイルでドラッグ&ドロップ

2010/04/30perlfreak.vox.comより転載)
例えばPerlがインストールされているWindowsでつぎの行を hoge.bat というファイル名で保存する。

for %%a in (%*) do perl -i.bak -ne "if (/^hoge_/) {print;}" %%a

hoge.bat に処理対象のテキストファイルをドラッグ&ドロップすると、処理前の内容は元ファイルに「.bak」がついたファイルにバックアップされ、元のファイルは行の先頭が「hoge_」の行のみ出力されたものになる。
便利。

OpenLDAPの検索

2010/04/02perlfreak.vox.comより転載)
slapdが動いているマシン上でスーパーユーザになり

# ldapsearch -x -b "dc=hoge,dc=co,dc=jp" -s sub "(cn=taro_yamada)"


のようにコマンドを実行する。

Postfixでキューの入れ直し

2010/04/20perlfreak.vox.comより転載)
main.cfを変更した場合等、キューが溜まったままになることがある。
その場合、キューに入れ直すとうまくいく可能性がある。
すべてのキューを入れ直す場合

# postsuper -r ALL


さらにキューに溜まったメールをすぐ処理させる場合

# postqueue -f

以上

yumなLinuxでRPMパッケージのダウンロード

2010/03/16perlfreak.vox.comより転載)
yum-utils というパッケージに含まれる yumdownloader というコマンドを使う。