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ヶ月前に契約切れてるのに更新の契約書が来ないってどういうことだ・・・。なんか言うのもアホくさいし。金さえ振り込まれてればどうでもいいけどさ、今のとこ。
ハッ!もしや解雇されてる!?
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は必要ないと解っているにも関わらず。
でも欲しいと思った気持ちは本当なのでしょうがない。値段分の働きはしてもらおう。まずは携帯ゲーム機として・・・。
Illustratorのファイルからテキストを抽出する
Illustratorのファイルからテキストを抽出するWebアプリケーションを作ってみたので公開。
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)
まずは準備。
データベースの作成
スタートから「データベース・コンフィギュレーション・アシスタント」を起動してデータベースを作成。
- データベースの作成を選択。
- テンプレートは「汎用」を選択。
- グローバル・データベース名は「orcl.oracle.com」を入力。
- SIDは「orcl」
- サンプル・スキーマを選択。
- 合計物理メモリは200MBくらい割り当て。
- キャラクタセットはUnicodeを使用。
後はデフォルト。
リスナーの作成
スタートから「Net Configuration Assistant」を起動してリスナーを作成。
全部デフォルト。
サービスの確認
下記3つのサービスが登録されて起動していることを確認する。
- OracleServiceORCL
- OracleOraDb10g_home1TNSListener
- OracleDBConsoleorcl
上から、Oracle本体、リスナー、Database Console(EnterpriseManager)。
ちなみにリスナーはOracle本体に依存、DatabaseConsoleはリスナーに依存する。
そのため起動順も上から順番のほうが安全。たぶん。
EnterpriseManagerを使ってみる。
にアクセス。
まずは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のほうが使いやすい。(慣れてるから当然なんだが)
- psqlはテーブル名等を入力補完してくれるけど、sqlplusはしてくれない。(面倒)
- psqlはSQL以外の文の前に\がつくけど、sqlplusではつかない。(SQLとコマンドの区別がつきづらい)
- 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以上に魅力のある製品が見あたらない。
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));
}


_ Tom [(((( ;釈д゜)))アワワワワ その振込みは契約期間内のでは!今月末の振込みがあるのだろうか?藁]
_ hajime [確認したら「振込先が変わってなければ大丈夫」ですた。ヨカター]