トップ «前の日(03-04) 最新 次の日(03-06)»

PC関係のメモ


FTPのユーザをシステムユーザとは別に管理する / ProFTPDの設定(2) / [work] 契約切れ

FTPのユーザをシステムユーザとは別に管理する

ProFTPDの場合、AuthUserFileディレクティブ(日本語ドキュメント)を使い、FTPユーザ専用のパスワードファイルを使って認証させることができる。

  • FTPを使うだけのユーザをシステムに追加しなくても済む
  • 別のユーザで、同じユーザ権限(UID)を使うとかもできそう
  • DefaultRootでルートディレクトリを切ってるときに便利。

昨日のproftpd.confを一部修正。、AuthUserFileとAuthGroupFileでファイルの場所を指定する。AuthOrderで他の認証させないようにした(これを指定しないと通常の認証で通ってしまった)。

ProFTPDは最新版の1.2.9を使用。古いバージョンだとAuthOrderの指定は不要かも。古いバージョン使ってる方のツッコミ歓迎。

# PAM認証を使用しない
#AuthPAMAuthoritative		on
#AuthPAMConfig			ftp

# パスワードファイルとグループファイルの場所を指定
AuthUserFile			/etc/ftpd.passwd
AuthGroupFile			/etc/ftpd.group
# 認証モジュールをファイル認証だけにする
AuthOrder			mod_auth_file.c
# /etc/ftpusers の制限は必要ない
UseFtpUsers			off
# 有効なシェルでなくてもかまわないのでオフにする
RequireValidShell		off

パスワードファイルとグループファイルを作成する。ftpasswdはソースからインストールした場合はソースのcontrib/にある。Debianの場合はproftpdをAPTインストールしたときに入っていた。

ftpasswd --passwd --file=/etc/ftpd.passwd \
 --name=ユーザ名 --uid=ユーザID --gid=グループID \
 --home=ユーザディレクトリ --shell=/bin/false
touch /etc/ftpd.group
chown root.root /etc/ftpd.*
chmod 644 /etc/ftpd.*

さしあたって、Apacheのログを取得するためだけのユーザlogをuserdelして

ftpasswd --passwd --file=/etc/ftpd.passwd \
 --name=log --uid=99 --gid=99 \
 --home=/var/log/www --shell=/bin/false

としてuidが99のユーザ(nobody)に割り当てた。

参考サイト



ProFTPDの設定(2)

AuthUserFileの認証にした後。

# /usr/local/etc/proftpd.conf
ServerName                      "ftp.mylab.jp"
ServerType                      inetd
DefaultServer                   on
Port                            21
Umask                           022
MaxInstances                    30

User                            nobody
Group                           nobody

ListOptions                     "-a"
TimesGMT                        off
UseReverseDNS                   off
IdentLookups                    off
RequireValidShell               off
UseFtpUsers                     off

AuthOrder                       mod_auth_file.c
AuthUserFile                    /etc/ftpd.passwd
AuthGroupFile                   /etc/ftpd.group

DefaultRoot                     ~

<Directory />
        AllowOverwrite          on
</Directory>

契約切れ

1ヶ月前に契約切れてるのに更新の契約書が来ないってどういうことだ・・・。なんか言うのもアホくさいし。金さえ振り込まれてればどうでもいいけどさ、今のとこ。

ハッ!もしや解雇されてる!?

Tags: work
最終更新時刻: 2008年04月04日
コメント(2) [コメントを投稿する]

_ Tom [(((( ;釈д゜)))アワワワワ その振込みは契約期間内のでは!今月末の振込みがあるのだろうか?藁]

_ hajime [確認したら「振込先が変わってなければ大丈夫」ですた。ヨカター]


Visual Basic 5 パワフルテクニック大全集 クライアント/サーバー編 / [book]Windows98 プログラミングバイブル / 部屋の整理 / [buy]東芝 GENIO e750

Visual Basic 5 パワフルテクニック大全集 クライアント/サーバー編

もらい物。

Windows98 プログラミングバイブル

これまたもらい物。

部屋の整理

そろそろ要らないものが多くなって部屋が汚くなってきたので押入れの中のVHSテープ等を捨てる。また、並べるスペースがないためやむなく押入れにしまわれている本を並べるため本棚を購入する予定。

買うモノ

  • 本棚
  • 椅子

捨てるモノ

  • サーバラックとして使ってる木製TVラック
  • 大量のVHSテープ

購入する本棚は通販生活にも載っている(最近通販生活モノ多いな)、丸伸のスライド本棚。69800円也。家には既に親が使っているやつが1台ある、スライドが非常にスムーズでよい品だ。これなら今の本棚に比べて収納冊数が1.5倍ほどになる・・・って冷静に考えると焼け石に水のような・・・もうちょっと考えよう。

それから、VHSなどという前時代的な遺物は捨てる。必要なデータはPSX経由でDVDにしよう。S-VHSのテープが多いな、勿体無い。D-VHSでないだけマシか。

そうなると押入れが空くので、そこにサーバ類を移動する。よって現在サーバを設置しているラックは破棄予定。捨てられるところを引き取ってサーバラックとして使用していたが、本来TVラックなのでサーバの熱に対しての対策が無い。

椅子はもし余裕があれば。アーロンチェアよりお値打ちなリープHDチェアにしようかな。

東芝 GENIO e750

椅子を買ってる余裕は無くなったかもしれない。

先日PDAの使い道を考えたときはゲームか、Windows CEの動作環境としてくらいしか思いつかず、買うまでもないと考えていたにもかかわらず購入してしまった。

そもそも、CASSIOPEIA、CLIEと使ってきて、自分にPDAは必要ないと解っているにも関わらず。

でも欲しいと思った気持ちは本当なのでしょうがない。値段分の働きはしてもらおう。まずは携帯ゲーム機として・・・。

http://genio-e.com/pda/e750/index_j.htm

Tags: buy
最終更新時刻: 2008年11月09日

Illustratorのファイルからテキストを抽出する

Illustratorのファイルからテキストを抽出するWebアプリケーションを作ってみたので公開。

http://www.mylab.jp/app/ai2text/

最終更新時刻: 2008年09月03日
コメント(5) [コメントを投稿する]

Before...

_ one [ありがとうございます(^^) お待ちしております。]

_ one [復旧して下さったんですね 有難うございます(^^) ]

_ hajime [どういたしまして、遅くなってごめんない。 不具合、ご要望等ありましたら、またお知らせ下さい。]


Oracle 10g Release2 for Windowsをインストール / Oracle 10gの勉強(1) / Oracleの勉強(2) / PostgreSQLとOracleの使い方比較 / [buy]ThinkPad X31のメモリを増設

Oracle 10g Release2 for Windowsをインストール

Oracle 10gのバイナリはoracle.comから無料でダウンロードできるので誰でも勉強を始められる。

バイナリ的には製品版と同じだと思うが、リリース後の細かいアップデートやサポート情報はライセンスを買わないと受けることができないし、もちろん商用利用もできない。詳しくはライセンスを参照。

自分がダウンロードしたのは「10201_database_win32.zip」というファイル。

これを解凍して「setup.exe」を実行。

  • 標準インストール
  • 「初期データベースの作成」のチェックを外す

上記の設定でインストール。

インストールユーザに対して「バッチジョブとしてログオン」する権限を付与するため以下の設定を行う。

  • [管理ツール]-[ローカルセキュリティ設定]を開く。
  • [ローカルポリシー]-[ユーザー権利の割り当て]で[バッチジョブとしてログオン]を選択。
  • インストールユーザを追加する。

上記セキュリティの設定をしないと、Enterprise Manager上でホストログインできない。20080303#p04

Oracle 10gの勉強(1)

まずは準備。

データベースの作成

スタートから「データベース・コンフィギュレーション・アシスタント」を起動してデータベースを作成。

  1. データベースの作成を選択。
  2. テンプレートは「汎用」を選択。
  3. グローバル・データベース名は「orcl.oracle.com」を入力。
  4. SIDは「orcl」
  5. サンプル・スキーマを選択。
  6. 合計物理メモリは200MBくらい割り当て。
  7. キャラクタセットはUnicodeを使用。

後はデフォルト。

リスナーの作成

スタートから「Net Configuration Assistant」を起動してリスナーを作成。

全部デフォルト。

サービスの確認

下記3つのサービスが登録されて起動していることを確認する。

  • OracleServiceORCL
  • OracleOraDb10g_home1TNSListener
  • OracleDBConsoleorcl

上から、Oracle本体、リスナー、Database Console(EnterpriseManager)。

ちなみにリスナーはOracle本体に依存、DatabaseConsoleはリスナーに依存する。

そのため起動順も上から順番のほうが安全。たぶん。

EnterpriseManagerを使ってみる。

http://localhost:1158/em/

にアクセス。

まずはsysユーザ、インストール時に設定したパスワード、sysdba権限でログイン。

ここで運が良ければ「ステータス」が「稼働中」でグラフとかアラートとかが表示される画面が出るが、一発で出た試しはない。

リスナーより先にDatabase Consoleが起動していたりとか、リスナーがデータベースを自動認識(10gからの機能らしい)するまでのタイムラグだったりとかするんじゃないだろうか。

確認方法として下記のようなコマンドも有効。

emctl status dbconsole
lsnrctl status
tnsping localhost

後は下記コマンドでリスナー/エンタープライズマネージャを再起動してみるとか。(順番はリスナー→EM)

lsnrctl stop
lsnrctl start
emctl stop
emctl start

Oracleの勉強(2)

SQL*Plusを使ってみる

コマンドラインで下記コマンドを実行。

sqlplus / as sysdba

本来は下記のようにユーザ(ex.sys)とパスワード(ex.sysdba)を指定するが、上記のように省略するとOS認証になるらしい。(インストールユーザで実行すればSYSDBA権限になる)

sqlplus sys/oracle as sysdba

今後の勉強用に一般ユーザを使いたい。既に存在するhrユーザを使いたいが、セキュリティのためロックされている。下記コマンドでアンロックする。

ALTER USER hr IDENTIFIED BY hr ACCOUNT UNLOCK;

パスワードを「hr」にしてアンロックした。

改めて別のユーザでログインするには下記コマンド。

CONNECT hr/hr

現在ログインしているユーザは下記コマンドで確認できる

SHOW USER

有名(?)なemployees表を参照する権限がある。

SELECT * FROM employees;

今後、勉強用に使うテーブルを上記表を基に作っておく。

CREATE TABLE test AS SELECT * FROM employees;

この構文ってPostgreSQLでも使えるんだっけ?((-リファレンス見たら使えた。「Oracleの機能を元に設計されました」とのこと。-))

PostgreSQLとOracleの使い方比較

パフォーマンスじゃなく使い方とか機能の違い。

psql(PostgreSQL)/sqlplus(Oracle)

今のところpsqlのほうが使いやすい。(慣れてるから当然なんだが)

  1. psqlはテーブル名等を入力補完してくれるけど、sqlplusはしてくれない。(面倒)
  2. psqlはSQL以外の文の前に\がつくけど、sqlplusではつかない。(SQLとコマンドの区別がつきづらい)
  3. psqlは問い合わせ結果の列幅をデータ内容に応じて自動伸縮してくれるが、sqlplusではしてくれない。(見づらい)

1.についてはpsqlだと

SELECT * FROM empl

まで入力してタブを押すとbash等みたく

SELECT * FROM employees

のように補完してくれるがsqlplusは補完してくれないということ。

2.については例えばテーブルの定義を調べるときpsqlだとこう。

\d employees

sqlplusだとこう。(DESCはDESCRIPTIONの省略形)

DESC employees

psqlを終了するとき

\q

sqlplusを終了するとき

QUIT

3.については実行結果を見れば一目瞭然。

sqlplusでも見やすいようにするためにまずは行幅を適当に増やす。(デフォルトでは80文字で折り返しが入る)

SET linesize 1000

列幅をデータに応じて設定する。(固定幅)

COLUMN first_name FORMAT A10

employeesテーブルのfirst_nameカラムの列幅を10文字に設定した。

SQL

Oracleだと下記が通らなかった。

SELECT salary, * FROM employees;

PostgreSQLだと同様の構文は通る。

Oracleの場合、下記のようにすると通る。

SELECT salary, employees.* FROM employees;

別にいいけど。

あとよく使うDML/DDLの違いは

  • PostgreSQLにはMERGEがない

まだMERGEがなんなのかkwsk知らないけどINSERTとかUPDATEで代用可能なモノっぽいので困らない。

ThinkPad X31のメモリを増設

BUFFALO DDR メモリモジュール DN333-A512MZ

Firefoxを使い始め、さらにOracleをインストールしたことでThinkPad X31のメモリ使用量がきつくなってきた。そこでメモリを増設することにした。

768MB(512MB+256MB)だったが、512MBのメモリを購入して1024MB(512MB+512MB)に。

購入したのはBuffaroのDN333-A512MZ。本当は1GB増設して1.5GBにしたかったが、X31の上限が1024MBのため断念。

正直きびしいのはメモリ容量だけでなくCPU負荷もなんだけど、買い換える予算がないのと、X31以上に魅力のある製品が見あたらない。

Tags: buy
最終更新時刻: 2008年11月08日

RDスタイルからWikiスタイルに変換 / タイ写真

RDスタイルからWikiスタイルに変換

過去の日記データはRDスタイルで書いていた。Wikiスタイルに統一するために変換スクリプトを書いた。

やっつけ仕事。もし使うなら自己責任で。

<?php

define('STATE_HEADER', 	     0);
define('STATE_BODY',  	     1);
define('STATE_BLOCKQUOTE',   2);

function inline($buf)
{
    $state = INLINE_STATE_NONE;

    $wiki = '';

    $len = strlen($buf);
    for($i = 0; $i < $len; $i++){

        // TODO: 毎回substrなので効率悪い

        if(preg_match('/^\(\(<(.+?)>\)\)/', substr($buf, $i) , $m)){
            // link
            $i += strlen($m[0]) - 1;
            $link = str_replace('|URL:', '|', $m[1]);
            $link = preg_replace('/^URL:/', '', $link);
            $link = preg_replace('/^"/', '', $link);
            $link = preg_replace('/"\|/', '|', $link);
            $wiki .= '[[' . $link . ']]';
        }else if(preg_match('/^\(\(%(.+?)%\)\)/', substr($buf, $i), $m)){
            // plugin
            $i += strlen($m[0]) - 1;
            $wiki .= '{{' . $m[1] . '}}';
        }else if(preg_match('/^\(\(\*(.+?)\*\)\)/', substr($buf, $i), $m)){
            // bold
            $i += strlen($m[0]) - 1;
            $wiki .= "''" . $m[1] . "''";
        }else{
            $wiki .= $buf[$i];
        }
    }

    return $wiki;
}

function block($buf)
{
    $wiki = '';

    if(preg_match('/^(=+)(.*)/is', $buf, $m)){
        // 見出し
        for($i = 0; $i < strlen($m[1]); $i++){
            $wiki .= '!';
        }

        $wiki .= inline($m[2]);
    }else if(preg_match('/^\*(.*)/s', $buf, $m)){
        // 箇条書き1
        $wiki = '*' . inline($m[1]);
    }else if(preg_match('/^  \*(.*)/s', $buf, $m)){
        // 箇条書き2
        $wiki = '**' . inline($m[1]);
    }else if(preg_match('/^    \*(.*)/s', $buf, $m)){
        // 箇条書き3
        $wiki = '***' . inline($m[1]);
    }else if(preg_match('/^\\([0-9]+\)(.*)/s', $buf, $m)){
        // 番号付リスト1
        $wiki = '#' . inline($m[1]);
    }else if(preg_match('/^  \([0-9]+\)(.*)/s', $buf, $m)){
        // 番号付リスト2
        $wiki = '##' . inline($m[1]);
    }else if(preg_match('/^    \([0-9]+\)(.*)/s', $buf, $m)){
        // 番号付リスト3
        $wiki = '###' . inline($m[1]);
    }else if(preg_match('/^ (.*)/s', $buf, $m)){
        // 整形済みテキスト
        $wiki = $buf;

    }else{
        $wiki = inline($buf);
    }

    return $wiki;
}

$filename = $argv[1];

$fp = fopen($filename, 'rb');
if($fp === false){
    echo "file not found\n";
    exit;
}

$state = STATE_HEADER;
$is_rd = false;

while(!feof($fp)){
    $buf = $wiki = fgets($fp);

    if($state == STATE_HEADER){
        if($buf == "\n"){
            $state = STATE_BODY;
        }else if(preg_match('/^format: *([a-zA-Z]+)/is', $buf, $m)){
            if($m[1] == 'RD'){
                $is_rd = true;
                $wiki = "Format: Wiki\n";
            }else{
                $is_rd = false;
            }
        }
    }else if($state == STATE_BODY){
        if($buf == ".\n"){
            $state = STATE_HEADER;
            $is_rd = false;
        }else if($is_rd === false){
            // RDでないときは何もしない
        }else if(preg_match('/^--- *<blockquote>/is', $buf)){
            // 引用
            $state = STATE_BLOCKQUOTE;
            $wiki = '';
        }else{
            // その他
            $wiki = block($buf);
        }

    }else if($state == STATE_BLOCKQUOTE){
        if(preg_match('/^--- *<\/blockquote>/is', $buf)){
            $state = STATE_BODY;
            $wiki = '';
        }else{
            // その他
            $wiki = '"" ' . block($buf);
        }
    }

    echo $wiki;
}

ディレクトリ内のtd2を全部変換するときはこんな感じのスクリプトを別途用意。

<?php

$files = glob(dirname(__FILE__) . '/*.td2');

foreach($files as $file)
{
    system('php rd2wiki.php ' . basename($file) . ' > wiki/' . basename($file));
}

タイ写真

最終更新時刻: 2010年03月06日