BlogもどきのWeblog

備忘録と日々の呟きとメモとCGIの実験場とされる何か。
プロフィール

GLANSHE
絵描き担当らしい

Total: 14257
Today: 9
Yesterday: 74
最新の記事

コンテンツ

最新のコメント

最新のトラックバック

カテゴリー

リンク

ニコ動MyListLink

Perl + DBI + oracleで詰まった話
LOBというデータ型があるのですが、これを普通に取得しようとすると失敗する事が多いです。

DBD::Oracle::st fetchrow_hashref failed: ERROR fetching field 3 of 5. LOB value truncated from 829 to 80. DBI attribute LongReadLen too small and/or LongTruncOk not set [for Statement "select * from test_table"]

何を言ってるかというと、LOB型のデータ829バイトを80バイトに切り詰めようとして失敗してるそうです。
DBIの属性である「LongReadLen」の値が小さすぎ、もしくは「LongTrunkOk」が未設定である事が原因だそうです。

何で切り詰めようとしてるのかは、大して調べなかったのでわからないのですが、とにかく切り詰めるのをやめさせればよさそうです。

切り詰めるサイズは、データベースハンドルのLongReadLen属性に入っているので、これを大きくしてやればいいっぽいです。

# バイト数で指定
$dbh->{LongReadLen} = 1024 * 100;

参考
DBIではBLOBデータをどのように扱えばよいのですか?
DBD::Oracle


time stamp:2010/03/31 22:41:15
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

らくがき
SOメンテ中なので手の動くままに。


なんかさらさらしたのを描きたくて描いた


time stamp:2010/03/30 16:06:04
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

最近の音ゲー事情
ちょっと前に、Jubeatの新曲が出て、楽しく遊んでました。

つい最近、ドラムマニア・ギターフリークスのXGがリリースされて、パッドが増えてすげーとか思いつつ少し叩いてみたりしてるわけです。

そう思ってたらギタドラV7も出て新作ラッシュでこれはすごいなーとか思ってました。

新作はとてもいい事なんですが、ゲーセンに居られなくなりました。




料金高ぇ。




最初自分がゲーセンに通ってたのは、DDRをやるためだったんです。
1プレイ50円で運動不足解消出来て上達してウマーとか思ってたんですが、去年の夏ごろ撤去されました…


しょうがないのでJubeat始めました。
1プレイ100円だけど4曲遊べて上達してウマーとか思ってたんです。



新曲追加されただけなのに1プレイ3曲になりました…


ふざけんなVer上がった訳じゃないだろうが畜生
滞在時間が3/4になりました。


そしてXGが出たので少し遊んでみました。
…200円で3曲はきつくね?
一日数回しか遊べません(´・ω・`)
まぁこれは新筐体だから仕方ないよね。

しょうがないので練習を兼ねて、1プレイ50円で5曲のギタドラV5やってました。
V6も同時稼動してたのですが、100円で4曲だったから…




V7が出ました。




おいふざけんななんでV5とV6両方V7に入れ替わってんだしかも両方100円3曲設定とか練習も何もできないじゃねーか。


家でちまちまネトゲやるしかないのかなぁ…


time stamp:2010/03/29 20:37:00
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

DBI.pmのconnectの使い方(DBD::Oracle)
引数はこう。

$dbh = DBI->connect($dsn, $user, $pass, $attr, $old_driver);

■説明
・$dsn

$dsn ||= $ENV{DBI_DSN} || $ENV{DBI_DBNAME} || '' unless $old_driver;

$old_driverが引数として渡されていない場合、
$dsn、$ENV{DBI_DNS}、$ENV{DBI_DBNAME} の順に評価して、全部偽の場合は空文字が$dsnに入る。

$dsnの書式

dbi:ドライバ名(.*?):その他

最初のdbiは大文字小文字関係なし

ドライバ名は、DBD::mysqlとか、DBD::Oracleを使う場合、
mysql、Oracleというように、モジュール名を大文字小文字をきちんと合わせて指定する。

・$user
DBのユーザ名

・$pass
DBのパスワード

・$attr
ハッシュで指定する。

%attributes = (
  PrintError => 1,
  AutoCommit => 1,
  ref $attr ? %$attr : (),
  # attributes in DSN take precedence over \%attr connect parameter
  $driver_attrib_spec ? (split /\s*=>?\s*|\s*,\s*/, $driver_attrib_spec, -1) : (),
);

$driver_attrib_specにはドライバ名(.*?)の、「.*?」の部分が入っている。
何に使っているのか不明。

こんな風に設定されて、ドライバの接続メソッドに引数として渡される。

$attr = {AutoCommit => 0};
とか書いておくと最初からオートコミットがオフになる。

・$old_driver
多分内部呼び出し用。
外部から呼び出す時は基本的に使ってはいけない…と思う。

ドライバに対しての接続要求が通ると、その戻り値の$dbhが返る。
その際の引数は、($dsn, $user, $pass, $attr)
このとき、$dsnは "dbi:ドライバ名(.*):"より後の文字列。つまり、「その他」

DBD::Oracleの場合
「その他」の書式
$dbname = 「その他」;

$dbnameを何も記述しない場合
接続先はlocalhostになる?
アクセスするDB名をユーザ名の後ろに@を付けて書く必要がある。

$user = "dbuser@SID";

$dbname = $1 if !$dbname && $user && $user =~ s/\@(.*)//s;
こうなってるので後ろじゃなくてもいいのかも…


$dbnameにアクセスするDB名を書く場合
特に何も考えなくていい。接続先はlocalhostとなる?メソッドの記述箇所がわかんえ…
$dsn = "dbi:Oracle:SID";


$dbnameに接続先情報を色々書く場合
「;」をセパレータとして記述する。こんな感じ?

$dsn = "dbi:Oracle:HOST=example.co.jp;SID=SID;PORT=1521;INSTANCE_NAME=INSTANCE"

SERVER、SERVICE_NAMEとかも指定オプションとしてあるけどこれどう使うんだっけ…

外部に接続する場合はこの記述方法でないとだめ。
その際にHOSTは必須となる。
と言うか、「その他」の情報に「;」を書いた時点でHOSTが必須になる…。

こんなところかな。

■警告
ただし未検証。(苦笑)

参考
DBD::Oracle - DBIモジュールのためのOracleデータベース・ドライバ
DBI - Perl用データベース独立インターフェース


time stamp:2010/03/29 00:48:49
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

DBD::Oracle
PerlからOracleに接続するためのモジュールDBD::Oracleの話。

PerlからDBに接続するためには、基本的にDBIモジュールを使います。
接続するDBによって、 DBD::mysql とか、 DBD::pg とか DBD::DB2 とかがありますが、当然 DBD::Oracle なんてのもあるわけです。

今回、フリーの Oracle 10g Express Edition をインストールしてPerlから接続しようと、DBD::Oracleモジュールをインストールしようとしてまたハマりました。


とりあえずやったこと
# cpan

cpan[1]> install DBI

問題なく終了

cpan[2]> install DBD::Oracle

Trying to find an ORACLE_HOME
Your LD_LIBRARY_PATH env var is set to ''

ORACLE_HOMEが設定されていないと怒られる。
oracle関連の環境変数が設定されてないと駄目らしい。

仕方がないので、環境変数を設定する。

# export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
# export ORACLE_SID=XE
# export NLS_LANG=JAPANESE_JAPAN.AL32UTF8

# env
NLS_LANG=JAPANESE_JAPAN.AL32UTF8
ORACLE_SID=XE
ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
他省略

再度インストール
cpan[1]> install DBD::Oracle

Using Oracle in /usr/lib/oracle/xe/app/oracle/product/10.2.0/server
DEFINE _SQLPLUS_RELEASE = "1002000100" (CHAR)
Oracle version 10.2.0.1 (10.2)

Unable to locate an oracle.mk, proc.mk or other suitable *.mk
file in your Oracle installation. (I looked in
/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/rdbms/demo/demo_rdbms32.mk /usr/share/oracle/xe/app/oracle/product/10.2.0/server/demo.mk /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/precomp/demo/proc/proc.mk /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/precomp/demo/proc/demo_proc.mk /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/proc/lib/proc.mk /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/proc16/lib/proc16.mk /usr/share/oracle/10.2/client/demo.mk /usr/share/oracle/10.2/client64/demo.mk under /usr/lib/oracle/xe/app/oracle/product/10.2.0/server)

The oracle.mk (or demo_rdbms.mk) file is part of the Oracle
RDBMS product. The proc.mk (or demo_proc.mk) file is part of
the Oracle Pro*C product. You need to build DBD::Oracle on a
system which has one of these Oracle components installed.
(Other *.mk files such as the env_*.mk files will not work.)
Alternatively you can use Oracle Instant Client.

こんな感じでまた怒られた。
どうやら、demo*.mkとかいうファイルを探しに行って見つからないらしい。

よくわからないけど、最初に探しに行ってる場所の

/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/rdbms/demo/demo_rdbms32.mk

このファイルと同じディレクトリに、

demo_xe.mk

ってファイルがあったので、試しにdemo_rdbms32.mkと言う名前でコピーしてみる。

# cd /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/rdbms/demo/
# cp demo_xe.mk demo_rdbms32.mk

再度インストール

cpan[1]> install DBD::Oracle

make -- OK

Warningがいっぱい出たけどmakeが通ったっぽい

Warning (usually harmless): 'YAML' not installed, will not store persistent state
Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/01base................# Test loading DBI, DBD::Oracle and version
t/01base................ok
t/10general.............DBI connect('','scott/tiger',...) failed: ORA-01034: ORACLE not available
ORA-27121: unable to determine size of shared memory segment
Linux Error: 13: Permission denied (DBD ERROR: OCISessionBegin) at t/10general.t line 22
FAILED--Further testing stopped: Unable to connect to Oracle (ORA-01034: ORACLE not available
make: *** [test_dynamic] Error 9
PYTHIAN/DBD-Oracle-1.24a.tar.gz
make test -- NOT OK
//hint// to see the cpan-testers results for installing this module, try:
reports PYTHIAN/DBD-Oracle-1.24a.tar.gz
Warning (usually harmless): 'YAML' not installed, will not store persistent state
Running make install
make test had returned bad status, won't install without force
Failed during this command:
PYTHIAN/DBD-Oracle-1.24a.tar.gz : make_test NO

でもmake_testが失敗。

notest install DBD::Oracle でも問題ないみたいな事をどこかで見たのでそうやってみる

cpan[2]> notest install DBD::Oracle
Running install for module 'DBD::Oracle'
Running make for P/PY/PYTHIAN/DBD-Oracle-1.24a.tar.gz
Has already been unwrapped into directory /root/.cpan/build/DBD-Oracle-1.24-SI0Gyg
Has already been made
Skipping test because of notest pragma
Running make install
make test had returned bad status, won't install without force

まだだめっぽい。
よくわからないけど force でやればいいの?
もうだんだんどうでもよくなってきたのでforceでインストールしてみる

cpan[3]> force install DBD::Oracle

Writing /usr/local/lib/perl/5.10.0/auto/DBD/Oracle/.packlist
Appending installation info to /usr/local/lib/perl/5.10.0/perllocal.pod
PYTHIAN/DBD-Oracle-1.24a.tar.gz
make install -- OK
Warning (usually harmless): 'YAML' not installed, will not store persistent state
Failed during this command:
PYTHIAN/DBD-Oracle-1.24a.tar.gz : make_test FAILED but failure ignored because 'force' in effect

通った…のか?

テストしてみる

[test.pl]
#!/usr/bin/perl

use DBI;

print "Content-type: text/html\n\n";

$ENV{'ORACLE_HOME'} = "/usr/lib/oracle/xe/app/oracle/product/10.2.0/server";
$ENV{'ORACLE_SID'} = "XE";
$ENV{'NLS_LANG'} = "JAPANESE_JAPAN.JA16EUC";

my $dbh = DBI->connect("dbi:Oracle:XE", "user", "pass") or die $@;

$sth = $dbh->prepare("select * from dual");
$nRes = $sth->execute;

while($raRes = $sth->fetchrow_arrayref) {
  print join(", ", @$raRes), "\n";
}

$sth->finish;
$dbh->disconnect;

exit;

出力結果
X

出たー。


■まとめ

DBD::Oracleをインストールする時は、oracle関連の環境変数を設定してからインストールする必要がある。

demo_rdbms32.mk が必要らしい。
あれば問題ないが、ない場合はエラーとなる。
Oracle 10g Express Edition を使用している場合は、

/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/rdbms/demo/demo_xe.mk

で代用できる(っぽい)ので、名前を demo_rdbms32.mk としてコピーする。

まだテストでエラーが起こるので、 force でインストールする。

■警告
Warning読んでないので、何かおかしな事が起こっているかもしれません。

インストールのログを見たい人はこちら


time stamp:2010/03/28 22:02:48
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Oracle Database 10g Express Edition
フリーで使えるoracleがあると言うので、その使い方とか制限について調べたメモ

■制限

1. 記憶域
ユーザーデータを格納する記憶域が4GBまでに制限されている。
4G以上データを使うようであれば、シェアウェアの方を使う必要がある。
個人で使うようなシステムで、テキストしか格納しないとかいうなら4Gバイトで十分だと思う。

2. メモリー
利用できるメモリーは最大で1GBに制限されている。
SGAとPGAのサイズを指定することは可能だが、SGAの最大サイズとPGAの合計が、1GBを超えることはできない。

以下引用
SGAはオラクルインスタンスに含まれ、
データベースバッファキャッシュや、 REDOログバッファ、共有プールなどから構成されているメモリ領域のこと。
すなわち、オラクル(インスタンス)を起動した際に確保される領域。
それに対して、PGAは、
ユーザプロセスがDBに接続した際、各サーバプロセス毎に割り当てられるクライアント/サーバ間の処理のためのメモリ領域となる。
すなわち、各ユーザプロセスの接続により確保される領域

・引用元
ORACLE(DB)関連/SGAとPGA

3. CPU
マルチCPUのサーバーでもデータベース・プロセスは1CPUしか使えない。
コアをたくさん乗せてパフォーマンスを上げているマシンでは使いにくい。
しかし、そもそもシングルCPUで動いているマシンならば制限はあってないようなもの。
でも、最近はデュアルコアとかクアッドコアとかが主流だから、影響を受けるのかな。

4. インスタンス
データベース・インスタンスは1つのシステム上で1つのみ。
多数起動してインスタンスをいくつも作ることはできない。
データベースの識別で使われるSIDが「XE」に固定されている。

5. プラットフォーム
Windows、Linuxのみ。ともに32ビット。64ビットは非対応。
…と思ったら出来るらしい?
64ビットでインストール?

6. サポート
当然だが無償なのでサポートは受けられない。

■使い方
Ubuntuにインストールする場合の話

・インストール
/etc/apt/sources.list に、オラクル系のリポジトリを追加

# vi /etc/apt/sources.list

末尾辺りに以下を追加

deb http://oss.oracle.com/debian unstable main non-free

# aptitude update
何か証明書がうんたらとか言われて怒られた。

# aptitude install oracle-xe-universal
途中で信用するかどうかの選択が出たので、Yesと入力した。

とりあえずクライアントも入れてみることに
# aptitude install oracle-xe-client


・設定
# /etc/init.d/oracle-xe configure

Specify the HTTP port that will be used for Oracle Application Express [8080]:
データベース管理を行うアプリケーションのHTTPポート番号
Specify a port that will be used for the database listener [1521]:
データベースリスナーのポート番号

Specify a password to be used for database accounts. Note that the same
password will be used for SYS and SYSTEM. Oracle recommends the use of
different passwords for each database account. This can be done after
initial configuration:
システムが使うパスワードの設定

Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:
oracleを自動起動するか否か


・接続
# su - oracle

$ . /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/bin/oracle_env.sh
$ sqlplus system/(パスワード)@XE

SQL> select * from dual;

とかとか。SQL文の最後に「;」を付けないと、

SQL> select * from dual
  2

とか表示されて意味不明なことになるので注意。


・Web管理画面を外から見えるように

SQL> EXEC DBMS_XDB.SETLISTENERLOCALACCESS(FALSE);

を実行する。

後で接続先のポート番号を変更する場合
Oracle Application Express (APEX) - ポート番号の変更


・インストール時のログ
root@horn:/# aptitude install oracle-xe-universal
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
Reading extended state information
Initializing package states... 完了
The following NEW packages will be installed:
bc{a} oracle-xe-universal
0 packages upgraded, 2 newly installed, 0 to remove and 7 not upgraded.
Need to get 263MB of archives. After unpacking 451MB will be used.
Do you want to continue? [Y/n/?]
WARNING: untrusted versions of the following packages will be installed!

Untrusted packages could compromise your system's security.
You should only proceed with the installation if you are certain that
this is what you want to do.

oracle-xe-universal

Do you want to ignore this warning and proceed anyway?
To continue, enter "Yes"; to abort, enter "No":
Unrecognized input. Enter either "Yes" or "No".
Do you want to ignore this warning and proceed anyway?
To continue, enter "Yes"; to abort, enter "No": Yes
Writing extended state information... 完了
Get:1 http://jp.archive.ubuntu.com intrepid/main bc 1.06.94-3ubuntu1 [73.1kB]
Get:2 http://oss.oracle.com unstable/non-free oracle-xe-universal 10.2.0.1-1.1 [262MB]
Fetched 263MB in 33s (7937kB/s)
未選択パッケージ bc を選択しています。
(データベースを読み込んでいます ... 現在 27097 個のファイルとディレクトリがインストールされています。)
(.../bc_1.06.94-3ubuntu1_i386.deb から) bc を展開しています...
未選択パッケージ oracle-xe-universal を選択しています。
(.../oracle-xe-universal_10.2.0.1-1.1_i386.deb から) oracle-xe-universal を展開しています...
Processing triggers for man-db ...
bc (1.06.94-3ubuntu1) を設定しています ...

oracle-xe-universal (10.2.0.1-1.1) を設定しています ...
update-rc.d: warning: /etc/init.d/oracle-xe missing LSB style header
Executing Post-install steps...

-e You must run '/etc/init.d/oracle-xe configure' as the root user to configure the database.


パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
Reading extended state information
Initializing package states... 完了
Writing extended state information... 完了

root@horn:/# aptitude install oracle-xe-client
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
Reading extended state information
Initializing package states... 完了
The following NEW packages will be installed:
oracle-xe-client
0 packages upgraded, 1 newly installed, 0 to remove and 7 not upgraded.
Need to get 25.9MB of archives. After unpacking 70.8MB will be used.
WARNING: untrusted versions of the following packages will be installed!

Untrusted packages could compromise your system's security.
You should only proceed with the installation if you are certain that
this is what you want to do.

oracle-xe-client

Do you want to ignore this warning and proceed anyway?
To continue, enter "Yes"; to abort, enter "No": Yes
Writing extended state information... 完了
Get:1 http://oss.oracle.com unstable/non-free oracle-xe-client 10.2.0.1-1.2 [25.9MB]
Fetched 25.9MB in 11s (2339kB/s)
未選択パッケージ oracle-xe-client を選択しています。
(データベースを読み込んでいます ... 現在 29710 個のファイルとディレクトリがインストールされています。)
(.../oracle-xe-client_10.2.0.1-1.2_i386.deb から) oracle-xe-client を展開しています...
Processing triggers for man-db ...
oracle-xe-client (10.2.0.1-1.2) を設定しています ...
Executing Post-install steps..........


パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
Reading extended state information
Initializing package states... 完了
Writing extended state information... 完了
root@horn:/# /etc/init.d/oracle-xe configure

Oracle Database 10g Express Edition Configuration
-------------------------------------------------
This will configure on-boot properties of Oracle Database 10g Express
Edition. The following questions will determine whether the database should
be starting upon system boot, the ports it will use, and the passwords that
will be used for database accounts. Press to accept the defaults.
Ctrl-C will abort.

Specify the HTTP port that will be used for Oracle Application Express [8080]:8080

Specify a port that will be used for the database listener [1521]:1521

Specify a password to be used for database accounts. Note that the same
password will be used for SYS and SYSTEM. Oracle recommends the use of
different passwords for each database account. This can be done after
initial configuration:
Confirm the password:

Do you want Oracle Database 10g Express Edition to be started on boot (y/n) [y]:

Starting Oracle Net Listener...Done
Configuring Database...Done
Starting Oracle Database 10g Express Edition Instance...Done
Installation Completed Successfully.
To access the Database Home Page go to "http://127.0.0.1:8080/apex"


time stamp:2010/03/28 17:18:48
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

[Perl]モジュールの動的ロードの方法メモ
Perlでモジュールの動的ロードをする話。

$modName = "Test::Module";
require $modName;

これが通らない。いや通らないのは別にいい。
本来の使い方が違うだけなのだから。
と言う訳でその方法を調べてみた。


他の人はどうやってモジュールの動的ロードを行っているのかと思って色々調べていると、次のような方法があるらしい。

1. evalに文字列としてスクリプトを与え、文字列展開を行ってモジュールをロードする方法

requireの仕様として

require Test::Module;

というように直接モジュール名を指定した場合は、ライブラリにあるTest/Module.pmをロードしてくれる。
但し、

require $modName;

とした場合は、$modNameを文字列そのものとして扱うため、ライブラリにあるTest::Moduleファイルを探しに行ってしまう。
当然、そんなファイルはある訳がないので、

Can't locate Test::Module in @INC (@INC contains: ./lib /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .)

こんな感じのエラーが出る訳だ。

そのため、

eval "require $modName";

とすることで、文字列展開したスクリプトをevalで実行することで、うまくモジュールをロードしてもらおうと言うのがこの方法。

しかし、この方法は遅いらしいし(未検証)、$modNameにPerlスクリプトが書いてあった場合、それも実行してしまうため、$modNameが自由に書き換えられる状態ではセキュリティ的にも危ないので、あまり使い方としてはよくないらしい。(人から聞いた話)

2. Test/Module.pmを直接requireする方法

use './lib';

とかをして、自分でモジュール用のファイルディレクトリを掘ってその中のモジュールファイルをrequireしたい場合などに使える方法

既に言ったが、

require $modName;

では、$modNameを文字列そのものとして扱うため、この中にモジュールファイルを指すパスを指定してやれば、正しく動く。

大昔のjcode.plのロードと同じ使い方。

require './jcode.pl';
require './lib/Test/Module.pm'

但し、これはモジュールが存在している場所を開発者が知らない場合は使えない。
モジュールとして既にインストールされている場合、モジュールファイル自体はシステムのディレクトリの方にあるため、自分でそれを拾いに行くのは難しい。
もしくは、許可されていない可能性もある。
自分の場合はここに入っていた
/usr/local/share/perl/5.10.0


上記は間違いでした。
require "Test/Module.pm";
で、Perlのライブラリとして登録されている場所を探索し、存在した場合それを読み込むようです。

3. UNIVERSAL::requireを使う方法

今はこれがモダンな方法らしい?具体的な意味はよく知らない。

use UNIVERSAL::require;

$modName = "Test::Module";
$modName->require;

のように書けば、指定したモジュールをロードしてくれる。

これを使おうとしてやってみたところ、UNIVERSALとか書いてあるくせに標準で入ってなかった…

use UNIVERSAL::require;

$modName = "Test::Module";
$modName->require;

結果
Can't locate UNIVERSAL/require.pm in @INC (@INC contains: ./lib /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .)

しかもUNIVERSALであるので勝手にロードされてると思い込んで使おうとしたら、ロードされてなかった…
明示的にUNIVERSAL::requireをuseしてやる必要があるらしい

#use UNIVERSAL::require;

$modName = "Test::Module";
$modName->require;

結果
Can't locate object method "require" via package "Test::Module" (perhaps you forgot to load "Test::Module"?)

但し、このUNIVERSAL::requireは、結局内部的に

my $file = $module . '.pm';
$file =~ s{::}{/}g;

return eval { 1 } if $INC{$file};

my $return = eval qq{
  CORE::require(\$file);
};

こーいう事をしてるらしい。
安全性は高くなったものの、ロード時間に関しては1の方法と大して変わらないのかも(未検証)。

参考
UNIVERSAL::requireによるモジュールの動的ロード
Perl::Critic / UNIVERSAL::require


time stamp:2010/03/27 11:07:13
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

リファレンスを適当にまとめたもの
モジュールを作っているうちに、参照渡しと値渡しがわけがわからなくなってきたのでまとめておいてみる。

Perlは基本的に値渡しを行っている。
参照渡しをする場合は明示的にリファレンスを渡す必要がある。
渡された側でも、リファレンスを扱っているという認識で処理を行う必要がある。


■参照渡しをしない場合

my $v1 = 10;
my $v2 = 20;

my $result = &test($v1, $v2);

print $v1 . "\n";
print $v2 . "\n"
print $result . "\n";

sub test{
  my ($val1, $val2) = @_;
  $val1 *= 2;
  return $val1 + $val2;
}
__END__

出力結果
10
20
40


■参照渡しをする場合

my $v1 = 10;
my $v2 = 20;

my $result = &test(\$v1, \$v2);

print $v1 . "\n";
print $v2 . "\n"
print $result . "\n";

sub test{
  my ($val1, $val2) = @_;
  $$val1 *= 2;
  return $$val1 + $$val2;
}
__END__

出力結果
20
20
40


以上のように呼び出し先で、参照している値を弄ることができる。

ただし、以下のようにやると無意味。

■参照渡しの意味がない状態

my $v1 = 10;
my $v2 = 20;

my $result = &test(\$v1, \$v2);

print $v1 . "\n";
print $v2 . "\n"
print $result . "\n";

sub test{
  my ($ref1, $ref2) = @_;
  $val1 = $$ref1;
  $val2 = $$ref2;
  $val1 *= 2;
  return $val1 + $val2;
}
__END__

出力結果
10
20
40

当たり前のことなのだが、呼び出したサブルーチンで、リファレンスをデリファレンスしているため、参照先の値は変わらない。


配列やハッシュの場合は以下のようになる。

my @arr = (10, 20, 30);

&test(\@arr);

foreach my $val (@arr){
  print $_ . "\n";
}

sub test{
  my ($arrRef)= @_;
  my $i;
  for($i = 0; $i < scalar(@$arrRef); $i++){
    $$arrRef[$i] += 5;
  }
}
__END__

出力結果
15
25
35

my %hash = {
  'a' => 10,
  'b' => 20,
  'c' => 30
};

&test(\%hash);

while(my($key, $val) = each(%hash)){
  print $key . ": " . $val . "\n";
}

sub test{
  my ($hashRef) = @_;
  my @hashKeys = keys %$hashRef;
  my $i;
  foreach my $key (@hashKeys){
    $$hashRef{$key} += 7;
  }
}
__END__

出力結果
17
27
37

その他メモ
配列のリファレンスの要素数

@arr = (10, 20, 30);
$arrRef = \@arr;
print $#$arrRef;

出力結果
2

よしこれで再帰関数作れる。


time stamp:2010/03/25 12:19:06
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

CGI::Session
ここんところ、PerlでJavaServletみたいな事をしようと色々遊んでいるところなのだけども、sessionの取得で予想外の事が起こった。

# セッションIDの取得
$sessionId = $self->getSessionId($cookieData, $formData);
$logger->debug("Before Session ID[" . $sessionId . "]");

# セッションの取得
$session = new CGI::Session($driver, $sessionId, {'Directory' => $dataSource});

# セッションIDは取得できたが、IDとしては無効である場合、新規セッションで作り直す
if(defined($sessionId) && $sessionId ne $session->id()){
  $logger->warn("This Session ID is Invalid");

  $session->close;
  $session->delete;
  $session = new CGI::Session($driver, undef, {'Directory' => $dataSource});

  $logger->warn("Create Other New Session ID[" . $session->id() . "]");
}else{
  if(!defined($sessionId)){
    $logger->info("Create New Session ID[" . $session->id() . "]");
  }else{
    $logger->info("Get Session ID[" . $session->id() . "]");
  }
}
# 有効期限を設定
$session->expire($expire . "s");

こんな感じでCGI::Sessionを使って取得してるんだけど、sessionを取得するのに妙に時間がかかる。

ログ
[2010-03-22 20:28:40.763][DEBUG][SessionManager:231] Before Session ID[f977f2da04ecc84d3e74df0f17885ecd]
[2010-03-22 20:28:40.819][INFO][SessionManager:249] Get Session ID[f977f2da04ecc84d3e74df0f17885ecd]

819 - 763 = 56

56msもかかっている。何故だ。

ファイルでセッション管理してから多少遅いのはわかるけど、そこまで時間かかるものかなー
SessionIdの暗号化とかデコードに時間かかってるのかなー

モジュールは使えるものは使っておいた方がいいのか、
速くする為に自分で作った方がいいのか。

そもそもCGI.pm使ってない時点で便利なもの使ってないんだからSessionも自分で作り直した方がいいのかなー

--------
[2010-03-23 15:01:12]
追記

CGI::Sessionを継承して色々と時間を計った結果、ドライバモジュールのロードで時間がかかっていました。

CGI::Session(Ver. 4.35)では、780行目で

$self->_load_pluggables();

で、ドライバで指定されたモジュールのロードを行っているため、時間がかかっているように見えます。

sub _load_pluggables では指定したモジュールをrequireでロードしているため、実行に時間がかかっているようです。

でも、そもそもモジュールのロードは use しても行われているため、CGIとして動作している場合は特に実行時間に差はありません。

mod_perlとかでモジュールをキャッシュしている場合は、CGI:Sessionを使用するとセッションを取得するたびにrequireされるため、余計な処理が増えていることになります。(キャッシュされているため、実際にロードされるわけではないが…)


time stamp:2010/03/23 00:43:22
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ DHCPサーバ
# aptitude install dhcp3-server

DHCPサーバを立てるインターフェースを限定する
# vi /etc/default/dhcp3-server

INTERFACES=""

INTERFACES="eth0"

DHCPで割り振られるアドレスは192.168.1.150〜200とする。
# vi /etc/dhcp3/dhcpd.conf

option domain-name "example.com";
option domain-name-servers ns1.example.com, ns2.example.com;
↑DNSサーバを指定?よくわかっていない。

defalut-lease-time 600;
max-lease-time 7200;

subnet 192.168.1.1 netmask 255.255.255.0 {
raige 192.168.1.150 192.168.1.200;
option domain-name-servers ns1.example.com, ns2.example.com;
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.1.255;
default-lease-time 600;
max-lease-time 7200;
}

再起動
/etc/init.d/dhcp3-server restart

ローカルPCで192.168.1.150アドレスが取得できたのでOK


time stamp:2010/03/22 14:31:32
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ 仮想メールボックス
postfix + courierで仮想メールボックスを利用する。
メールアドレスはいくつか発行したいけどその分linuxユーザ作るのは何か違うと思うので、仮想メールボックスを使ってメールアドレスだけ発行できるようにする。

とりあえず以下を参考にして設定を進めた
http://www.geocities.jp/gokuraccoon/virtual.html


■仮想メールアドレス用のユーザを追加する。

作ったユーザを使用して仮想メールアドレスが配信される。

# adduser --uid=3000 vmail
/home/vmail
ができる


■仮想メールアドレスのユーザディレクトリを作る

# mkdir /home/vmail/[virtual_mail_user]
# maildirname /home/vmail/[virtual_mail_user]/Maildir
# chown -R vmail:vmail /home/vmail/[virtual_mail_user]/Maildir


■postfixの設定

# vi /etc/postfix/main.cf

virtual_transport = virtual
virtual_mailbox_base = /home/vmail
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_uid_maps = static:3000
virtual_gid_maps = static:3000
fallback_transport = virtual
local_recipient_maps =

を追加。

■上記説明

virtual_fallback_transport = virtual
ローカルに存在しないアドレスをvirtualに処理させる。

local_revipient_maps =
このを書いてないと上の設定が有効にならない。
これで数時間はまってた…

実ドメインのみの運用なので
virtual_mailbox_domainsは書かない。


■配送先の設定

virtual_mailbox_mapsで指定したファイルを作る。
# vi /etc/postfix/virtual_user

仮想メールアドレスのユーザ名と、その配送先(virtual_mailbox_baseからの相対アドレス)を書く。

[virtual_mail_user] [virtual_mail_user]/Maildir/

書いたら、hash形式のデータベースに変換する

# postmap /etc/postfix/virtual_user

virtual_user.dbが生成される。


■smtpサーバの認証設定に仮想メールアドレスのユーザを追加する

# saslpasswd2 -c -u example.co.jp [virtual_mail_user]


■POPとかIMAPでメールが受信できるようにする。

courier-popとかcourier-imapを使用している場合の話。

# cd /etc/courier/
# userdb [virtual_mail_user] set home=/home/vmail/[virtual_mail_user] uid=3000 gid=3000
# userdbpw -hmac-md5 | userdb [virtual_mail_user] set hmac-md5pw

userdbを更新
# makeuserdb


関連するものを全部再起動
# /etc/init.d/postfix restart
# /etc/init.d/courier-imap restart
# /etc/init.d/courier-pop restart
# /etc/init.d/courier-authdaemon restart
# /etc/init.d/saslauthd restart

メール送信、配送、受信まで実アドレス、仮想アドレス共に全部できたので問題なし。


■参考

virtual
virtual 配送エージェントと local 配送エージェント
ヽ( ・∀・)ノくまくまー(2006-10-25)
メールサーバの設定(バーチャルメールボックス編)
PostfixのFAQ


time stamp:2010/03/22 14:28:34
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ courier-pop | imap
・courier-pop(POPサーバ)
# aptitude install courier-pop

webベース管理のためにディレクトリを作成しますか?とか聞かれたので
面白そうなのでYesにしてみた。
でも大した設定項目はなかった。
と言うかこれをいじるためにapacheの設定を頑張ったのに結構無駄になってしょんぼり。

結局設定ファイルを手動で弄ることに。

CRAM-MD5で認証を通すことにする。

# vi /etc/courier/pop3d

POP3AUTH=""

POP3AUTH="CRAM-MD5 CRAM-SHA1"

・courier-imap(IMAPサーバ)
# aptitude install courier-imap

CRAM-MD5で認証を通すことにする。

# vi /etc/courier/imapd

IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE"

IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 IDLE"

POPとIMAPサーバはこれだけ。

・courier-authdaemon(認証用デーモン)
# aptitude install courier-authdaemon

POPとIMAPサーバで認証するためのデーモンを追加する。
これによってシステムパスワードとは別のメールパスワードが作れる。

# vi /etc/courier/authdaemonrc

パスワードを別途用意するために次を変更
authmodulelist="authpam"

authmodulelist="authuserdb"

ユーザ認証用DBを生成する。
# userdb [username] set home=/home/[username] uid=xxxx gid=xxxx
# chmod 600 /etc/courier/userdb

パスワードを設定する。
# userdbpw -hmac-md5 | userdb [username] set hmac-md5pw

# makeuserdb
userdb.dat、userdb.lock、userdbshadow.dat、.lock.userdbが生成される。

再起動する。
/etc/init.d/courier-imap restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-authdaemon restart

ちゃんとIMAPもPOPも認証通ってメール見れたので問題なし。


time stamp:2010/03/22 14:21:18
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ postfix
# aptitude install postfix
↓を見てほぼそのまま設定
http://www.geocities.jp/gokuraccoon/smtp.html

ハードリンクできないので
# cp -a /etc/sasldb2 /var/spool/postfix/etc/
で誤魔化す。

telnetでlocalhost:25に接続してsmtpしゃべったら
gmailにメールが届かないので調査

http://blog.fkoji.com/2008/12291614.html
を発見

設定箇所
/etc/postfix/main.cf

myhostname = xxxx.ocn.ne.jp
relay_domains = $mydestination
relayhost = [smtp.xxxx.ocn.ne.jp]

のみでpostfix再起動→gmailにメール届きました。

thunderbirdで認証通らないので試行錯誤
やったこと
# chgrp postfix /var/spool/postfix/etc/sasldb2
# vi /etc/default/saslauthd

START=no

START=yes

# /etc/init.d/saslauthd restart

上記の何してもメールのログが変わらなかった。
解決した方法

# vi /etc/postfix/main.cf

mydomain = xxxxx.jp
myhostname = xxxx.ocn.ne.jp

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
permit_sasl_authenticated,
reject_unauth_destination
smtpd_sasl_security_options = noanonymous, noplaintext

smtpd_sasl_local_domainが、$myhostnameになってたのを
smtpd_sasl_local_domain = $myhostname

smtpd_sasl_local_domain = $mydomain
に変更。
gmailにメール飛ばす設定でmyhostnameを変えていたので、これが多分
認証用のsasldb2の設定で間違ってたんだと思う。

調べた先がService Temporarily Unavailableで見れなくてキャッシュから見た情報なので
一応こっちにもメモしておく

以下引用
>sendmail + sasl とかで CRAM-MD5 で SMTPAUTH してたときは、-u につけるドメイン(realm?)はたいした意味を持っていなかった (たとえば saslpasswd -u hoge ryuta とかやったときは user を "ryuta@hoge" とやれば良かった) ような気がするんですが、 Postfix + SASL の場合は /etc/postfix/main.cf の smtpd_sasl_local_domain と同じにしないと
>
>warning: SASL authentication failure: no secret in database
>
>と怒られました.

■引用元
つながらない…

メールが配送されるディレクトリを/home/[username]/Maildirに変更する。
デフォルト設定だと、メールが届くと/var/mail/[username]にファイルが作られて、
そこに全部受信メールが詰められる。(mailbox形式)
それによって/varが圧迫されるのが嫌なので、各ユーザの個人ディレクトリに置くようにする。

# vi /etc/postfix/main.cf

home_mailbox = Maildir/

を追加する。

再起動
# /etc/init.d/postfix restart


time stamp:2010/03/22 14:14:01
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ apache
# aptitude install apache2
前設定した時に大変なことになったので、
設定を弄る前に中身を固めてオリジナルをバックアップ。

何か入れるだけ入れて、一晩寝てからapacheを再起動したら
apache.confが意味不明なバイナリファイルになっていた。
courier-webadmin入れたから?原因不明。
一晩寝かせると動かなくなるプログラムがこれに該当するのではないか。

とりあえずバックアップしてたファイルから復帰。
バックアップ大事。

courier-webadmin入れてみたのでsslでhttpsで繋げるようにする。
次のサイトの通りにやってみた
http://d.hatena.ne.jp/toguni/20090312/1236823206

# vi /etc/apache2/sites-available/httpd-ssl.conf

下の方に/cgi-bin/ディレクトリの設定があったので流用した。

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride All
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>

とした。

apache再起動
# /etc/init.d/apache2 restart

起動時にエラーが出て直したんだけど確か文法エラーばっかりだったので
特に問題はなかった気がする。


■CGI動作設定

# vi /etc/apache2/sites-enabled/000-default

<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Options ExecCGI FollowSymLinks
Order allow,deny
allow from all
</Directory>

Options ExecCGI FollowSymLinks
を追加

# vi /etc/apache2/mods-enabled/mime.conf

AddHandler cgi-script .cgi

コメントを外す。適宜 .pl とかも増やしたり。

apache再起動
# /etc/init.d/apache2 restart

動いたので終了。


■ユーザディレクトリのpublic_htmlディレクトリの中身をwebに公開できるようにする。

/etc/apache2/mods-enabledにuserdirを追加する
# cd /etc/apache2/mods-enabled
# ln -s /etc/apache2/mods-available/userdir.conf /etc/apache2/mods-enabled/
# ln -s /etc/apache2/mods-available/userdir.load /etc/apache2/mods-enabled/

CGIを使えるようにする
# vi /etc/apache2/mods-enabled/userdir.conf

Options MultiViews Indexes SymLinsIfOwnerMatch IncludesNoExec

Options MultiViews Indexes SymLinsIfOwnerMatch IncludesNoExec ExecCGI ForrowSymLinks

apache再起動
# /etc/init.d/apache2 restart


■Perlモジュールとかを入れる

Image::Magicを使うのでインストール

perlのみで使う場合はperlmagickをインストールすればいい。
# aptitude install perlmagick

Ubuntu自体で使わないなら間違ってimagemagickをインストールしないように。

Jcode.pmを使うのでインストール

# perl -MCPAN -e shell

cpan[1]> install Jcode

怒られた。
Could not read '/root/.cpan/build/Jcode-2.07-ghXxdQ/META.yml'. Falling back to other methods to determine prerequisites
Can't exec "make": No such file or directory at /usr/share/perl/5.10/CPAN.pm line 7698.
DANKOGAI/Jcode-2.07.tar.gz
make -- NOT OK

調べたら何かが足りないらしい。何が足りてなかったのかはよくわからない。
# aptitude install build-essential

再度
# perl -MCPAN -e shell
cpan[1]> install Jcode

Could not read '/root/.cpan/build/Jcode-2.07-ghXxdQ/META.yml'. Falling back to other methods to determine prerequisites
cp Jcode/Nihongo.pod blib/lib/Jcode/Nihongo.pod
cp Jcode.pm blib/lib/Jcode.pm
Manifying blib/man3/Jcode::Nihongo.3pm
Manifying blib/man3/Jcode.3pm
DANKOGAI/Jcode-2.07.tar.gz
make -- OK
Warning (usually harmless): 'YAML' not installed, will not store persistent state
Running make test
PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib', 'blib/arch')" t/*.t
t/append.....ok
t/convert....ok
t/getcode....ok
t/h2z........ok
t/jfold......ok
t/length.....ok
t/mime.......ok
t/new........ok
t/perl581....ok
t/regex......ok
t/tr.........ok
All tests successful.
Files=11, Tests=244, 3 wallclock secs ( 3.12 cusr + 0.24 csys = 3.36 CPU)
DANKOGAI/Jcode-2.07.tar.gz
make test -- OK

今度は大丈夫だったみたい。

Digest::SHA1を使うのでインストール

cpan[2]> install Digest::SHA1

All tests successful.
Files=3, Tests=17, 0 wallclock secs ( 0.14 cusr + 0.01 csys = 0.15 CPU)
GAAS/Digest-SHA1-2.12.tar.gz
make test -- OK

問題なし

CGI::Sessionを使うのでインストール
先にCGIをインストール

cpan[3]> install CGI

途中でどこかのサーバへアクセス失敗してリトライしまくってるけど
Ctr+C押したらリトライ終了した。

一応、ちゃんと終了したけど問題なのか?

cpan[4]> install CGI::Session

問題なし

Tie::IxHashを使うのでインストール

cpan[5]> install Tie::IxHash

問題なし


time stamp:2010/03/22 14:09:09
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ samba
# aptitude install samba
sambaユーザの設定をする

# smbpasswd -a アカウント名
パスワード入力でsamba用のアカウント作成。

設定はバックアップしたファイルをそのまま使った。

設定方法はこの辺を参照


time stamp:2010/03/22 14:05:27
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ SSH
# aptitude install openssh-server
とりあえずインストール

クライアントからの接続をプレインテキストでの認証にしておくと辞書攻撃とかが怖いのでdsaで鍵を作ってその鍵を持ってないと認証できないようにする。

作業を行っている途中でログイン不可能になるのを防ぐため、必ず接続状態のウインドウを開いた状態で作業を行う。


■鍵の作成

$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/silvia/.ssh/id_dsa):

ここでエンター押すとディレクトリが作成される

Created directory '/home/silvia/.ssh'.

パスワード入れる
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

~/.ssh/以下に
id_dsa
id_dsa.pub
というファイルができる。
id_dsaが秘密鍵、id_dsa.pubが公開鍵

公開鍵をauthorized_keysに書き写す
これを鍵束として用いる(らしい。DSA以外の認証にも使用?)
$ cat id_dsa.pub >> authorized_keys


■Windows側の設定

UTF-8 Teraterm Proの使用を前提とする。

作った秘密鍵id_dsaをWindowsに持ってくる。
適当なディレクトリに配置。MyDocumentは怖いからだめだとか。

Teraterm起動する
メニューの設定→SSH認証を選択

「RSA/DSA鍵を使う」にチェック入れて、持ってきた秘密鍵を指定する。


■SSHサーバの設定

# vi /etc/ssh/sshd_config

ルートでのログイン禁止
PermitRootLogin no

公開鍵の格納ディレクトリを指定する
コメント取る
#AuthorizedKeysFile %h/.ssh/authorized_keys

AuthorizedKeysFile %h/.ssh/authorized_keys

もっとセキュリティを上げたい場合、ログインできるユーザを限定
AllowUsers [ssh_user]

再起動
# /etc/init.d/ssh restart

Teraterm起動してサーバに接続、パスフレーズが通ればOK


パスが通ったので、プレインテキストでの認証を不許可にする。

# vi /etc/ssh/sshd_config

プレインテキストのパスワードでのログインを禁止
PasswordAuthentication no

再起動
# /etc/init.d/ssh restart

プレインテキストでログインできなくて、DSA鍵でのログインができればOK


time stamp:2010/03/22 13:55:23
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

Ubuntuメモ インストール
■CDからインストール。

前構築した環境はルートパーティションが小さすぎてアップグレードが出来なくなったりしたので、その教訓からルートパーティションを大きめに取る。
/boot 1G
/ 2G
/home 200G
/usr 10G
/var 10G
/opt 10G
残り適当

前システムから、interface、iptables、sambaの設定ファイルをバックアップしておいた。


■ネットワーク

/etc/network/interfaceを編集
LANに接続出来るようにする。
ネットワークカードが逆になってる可能性があるので注意。

インターネットへの繋ぎ方をすっかり忘れていた。

# pppoeconf

コマンドで設定を行う。英語ばっかで読めないけど勘で設定

LANで繋いだPCからサーバ通してインターネットに繋ぐ設定をする
# vi /etc/sysctl.conf

#net.ipv4.ip_forward=1
がコメントアウトされてるのでコメント除去

バックアップしたiptablesの設定を叩けば多分接続インターネットに接続出来るはず。

iptablesの設定が自動で動作するようにする

設定ファイルが
/etc/ppp/set_iptables.sh
にあるとする

# ln -s /etc/ppp/set_iptables.sh /etc/network/if-pre-up.d/set_iptables
if-pre-up.dからシンボリックリンクを張ってやれば、ネットワークの設定時に自動的にiptablesが設定される。


■ユーザの追加

adduserを使うと対話的に作成できる

# adduser linux_user


■その他

ホームディレクトリ配下の
.bashrcファイルにコマンドのエイリアスとかがあるのでそこでllとかが開放できる。

sudoが面倒な場合は無効化する。
先にパスワード設定をしないと入れなくなるので注意

HDDを自動マウントする。
起動時に認識するHDDの順番によってsdaとsdbが入れ替わったりして面倒なので。というか前、それで操作ミスをして/root配下を全部消したとかいう問題を起こした…
そこでマウントするデバイスのUUIDを指定してやると確実。
システムディレクトリがそうなってるので真似した。

# blkid /dev/sda1
/dev/sda1: UUID="2cd2016b-3de6-46a1-81e4-471f9b5cd62b" TYPE="ext3"

とか出るので、

# vi /etc/fstab

UUID=2cd2016b-3de6-46a1-81e4-471f9b5cd62b /mnt/samba ext3 relatime 0 2

みたいに設定する。


■参考
nabeの雑記帳
パスワード用ランダム文字列生成用スクリプト


time stamp:2010/03/22 12:46:55
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

最近の深夜
寝なきゃいけないんだけど、寝る気になれない。
休日にやれと言う話なんだけど、休日はすぐ眠くなって寝たくなる。
やりたい事も多いけど、手を付ける気になれない。
すごい頑張って積んだゲームは片付いたけど、終わったら終わったで妙な寂寥感が…


ところで今日からJubeatに新曲が入ったそうで、ちょっと触ってきました。
全体的に曲の難易度が自分にとって丁度いい感じで、初プレイでSを逃すくらいの難易度は個人的に満足。
レベル5くらいのやつになるともう初プレイでSSSとかフルコンボとか結構出るようになってきたなぁ…
9とか10は相変わらず手がまともに動かなくてA〜Cとか出たりするけど…
つか何度やっても「凛として咲く花の如く」がSS出ません。
発狂というか、16分音符の部分が全然できないよ!
そして「恋のメリーゴーランド」もSSでない…
Evansは前クリアできたのに今日やったら失敗したお!だめp


time stamp:2010/03/19 04:26:15
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

PerlでLogger
PerlでJavaのLog4jみたいに動作するモジュール作ってみた。
超楽しい。
ソースはたぶんとんでもなく汚くて非効率なのでまだ出せないけど。

hoge@huga:/www/logs$ tail -f test20100318.log
[2010-03-18 00:00:07.405][ERROR][Util::Exception: 46] Util::Exception: File[] open failed!
        catch Util::Exception
        Util::File lib/Util/File.pm 63 Util::Exception::new 1 1   1794
        Util::FormData lib/Util/FormData.pm 212 Util::File::open 1    1538
        Util::FormData lib/Util/FormData.pm 211 (eval) 0    1794
        Util::FormData lib/Util/FormData.pm 132 Util::FormData::multipartQueryGetInfo 1 1   1794
        Util::FormData lib/Util/FormData.pm 44 Util::FormData::multipartQuery 1 1   1794
        Util::FormData lib/Util/FormData.pm 20 Util::FormData::_getQuery 1    1794
        main /www/index.cgi 15 Util::FormData::new 1 0   0
[2010-03-18 00:00:07.405][DEBUG][Util::TempFile: 22] call destroy
[2010-03-18 00:00:22.479][ERROR][Util::Exception: 46] Util::Exception: File[] open failed!
        catch Util::Exception
        Util::File lib/Util/File.pm 63 Util::Exception::new 1 1   1794
        Util::FormData lib/Util/FormData.pm 212 Util::File::open 1    1538
        Util::FormData lib/Util/FormData.pm 211 (eval) 0    1794
        Util::FormData lib/Util/FormData.pm 132 Util::FormData::multipartQueryGetInfo 1 1   1794
        Util::FormData lib/Util/FormData.pm 44 Util::FormData::multipartQuery 1 1   1794
        Util::FormData lib/Util/FormData.pm 20 Util::FormData::_getQuery 1    1794
        main /www/index.cgi 15 Util::FormData::new 1 0   0
[2010-03-18 00:00:22.479][DEBUG][Util::TempFile: 22] call destroy
[2010-03-18 00:02:18.913][INFO][Util::FormData: 58] ********** form data start **********
[2010-03-18 00:02:18.913][INFO][Util::FormData: 63] text: test2Value
[2010-03-18 00:02:18.914][INFO][Util::FormData: 60] file: ./tmp/20100318000218907__detailurac5034.jpg
[2010-03-18 00:02:18.914][INFO][Util::FormData: 66] *********** form data end ***********
[2010-03-18 00:03:02.196][INFO][Util::FormData: 58] ********** form data start **********
[2010-03-18 00:03:02.197][INFO][Util::FormData: 63] text: test2Value
[2010-03-18 00:03:02.197][INFO][Util::FormData: 60] file: ./tmp/20100318000302191__detailurac5034.jpg
[2010-03-18 00:03:02.197][INFO][Util::FormData: 66] *********** form data end ***********
[2010-03-18 00:07:06.083][INFO][Util::FormData: 58] ********** form data start **********
[2010-03-18 00:07:06.083][INFO][Util::FormData: 63] text: test2Value
[2010-03-18 00:07:06.084][INFO][Util::FormData: 60] file: ./tmp/20100318000706078__detailurac5034.jpg
[2010-03-18 00:07:06.084][INFO][Util::FormData: 66] *********** form data end ***********

絶対似たような事してる人居ると思うけど。


time stamp:2010/03/18 00:25:32
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

やる気
やる気というのは出そうと思って出るものではないが、
出たと思ったら予想を突き抜けて遥か遠くまで行ってしまったり、
もしくは勢いだけは凄まじいまま、あさっての方向へ
飛んでいってしまったりすることがよくある。


数日前の自分がまさにそうで、去年の10月くらいから自分の家のメールサーバが設定を弄って動かなくなったままずっと「直さなきゃー」と思っていたのだが、面倒でずっと手をつけていなかった。
最近、家の外から自分の家に接続出来る機会を得て、ちょっと弄って直して面白くなってきたーと感じたと思ったら、

いつの間にかHDD買ってきてサーバを1から再構築していた。

去年に初めて環境を構築したときは10日くらいかかったのに、今回は3日くらいで全て終わってしまった。
いやーよくやったなぁ自分。

という話。


time stamp:2010/03/16 21:48:05
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

帰ってきたら一時
今日はバグ対応で前のプロジェクトの場所に行っていました。
対応は割と簡単だと思っていたのですが、排他制御がきっちり出来なかったせいであれよあれよという間に23時半とかいう時間になって慌てて終電で帰りました。
しかも結局終わってないし。明日もかー。

んで、帰り道真夜中なのに妙に暖かくて何かいい感じになって何故かテンションが上がって自転車を全力でこぎながら自宅の近くのコンビニでジャンプ立ち読みして外出たら雨が降っててテンション超下がった。

お願いなので明日の朝には雨上がっててください。


time stamp:2010/03/16 02:21:22
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

ぽすたー


と言う訳で届きました。
とりあえず記録的な意味で記事を書いておこう。

・ぽすたー


・蜜桃まむさんのサイン


・同梱されてたメッセージ


・神野さんのサイン


当たったのはすごく嬉しいんだけど、前も言った通り扱いに困ります。
友人には「貼れww」とか言われたけど貼る場所ないしなぁ。


time stamp:2010/03/11 20:50:01
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

物理的に積んでたゲームがほぼ終わったので
そろそろオンラインゲームに戻ろうと思っていたところ



何か発見したので久しぶりにSO行こうかな


time stamp:2010/03/09 20:15:41
トラックバック(0)|コメント(2)
コメントを書く
この記事のトラックバックURL:

久々の当選通知
久しぶりにメールが来ました。
数撃ちゃ当たるって言うけど、本当だなぁ。
バナー貼り始めてからかれこれ5,6回は当たってる気が。



しかし当たったのはポスター…ちょっと扱いに困るなぁ


time stamp:2010/03/05 13:12:41
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:

メールアドレスの画像化
メールアドレスをホームページに載せる際に、検索で引っかからないように画像で表示してるページをよく見かけますが、掲示板の入力欄にメールアドレスがある場合は結構昔からある通り、mailtoのリンクで出される事がまだまだ結構な頻度であります。(たぶん

んで、今日もぼーっとサイト廻りしてて、掲示板でMAILの文字がリンクになってたので、一体どんな奴が無駄にメールなんか入力するんだ。
とか思ってクリックしてみたところ、予想外のウインドウが開いたので思わずSS撮ってしまいました。



最近はこんなサービスが出来てきたのか…


time stamp:2010/03/01 23:15:22
トラックバック(0)|コメント(0)
コメントを書く
この記事のトラックバックURL:
何かしら