« 2006年11月 | メイン | 2007年01月 »

2006年12月 アーカイブ

2006年12月04日

固定IPアドレスの設定

本日やったので、メモ。

・環境
cent os 4.4

・修正したファイル
/etc/sysconfig/network-scripts/ifcfg-eth0

・ファイルの修正前(DHCPでIPアドレスを取得するようになっている)
---------------------------------------
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=****** ←ここはMACアドレスなので、一応伏せておく
ONBOOT=yes
TYPE=Ethernet/
---------------------------------------

・ファイル修正後(固定IPを設定する)
---------------------------------------
DEVICE=eth0
BOOTPROTO=static
BROADCAST=10.20.138.255
IPADDR=10.20.138.3
NETMASK=255.255.255.0
NETWORK=10.20.138.0
ONBOOT=yes
TYPE=Ethernet
---------------------------------------

・修正後、再起動

これで、10.20.138.3 でアクセスできるようになる。

postgres メモ

データベース作成メモ

createdb [データベースの名前] --encoding=[文字コード]

※文字コード名の例 utf8

2006年12月05日

SQL Injection(SQLインジェクション:SQLの挿入) 2回目

前回に引き続き、SQLインジェクション。メモ。

こんな、方法もある。

こちらを参考にした。

脆弱性の有無の確認。
---------------------------------------------------------
脆弱性の有無

(1) SJISを使ったクライアントでPHPのaddslashesを使った場合(あるいはmagic_quote_gpcがonの場合)に脆弱性がある。ほかの言語でも同様のことを行っていれば脆弱性がある。

 なお,8.1.4 et. al. Security Release FAQによれば,PEAR DBを使っている場合にも脆弱性の可能性があるようである。

(2) フロントエンドとバックエンドのエンコーディングが異なっている場合に脆弱性がある。

(3) prepared statementを使用していれば脆弱性の可能性はない。ただし,prepared statementのようなインタフェースでありながら,実際には内部でSQL文を合成するなど,本物のプロトコルレベルのprepared statementを使っていないケースもありそうなので注意が必要である。

逆に言えば,(1)と(2)に該当しない,あるいは(3)に該当すれば脆弱性はないことになる。
---------------------------------------------------------

検証していこう。
(1) ・・・文字コードはutf-8を使用しているし、magic_quotes_gpc はoffでかつ、pg_escape_stringを利用しているのでOK.
(2) ・・・ソースもDBもutf-8を使用しているのでOK.
(3) ・・・利用していないが、(1)と(2)がOKなので、OK.


結論から言うと、PHP,Postgresql で開発している場合は

------------------------------------------------
(1) PostgreSQL 8.1.4,8.0.8,7.4.13,7.3.15のいずれかにアップデートする。

(2) シングルクォートをバックスラッシュでエスケープしている場合は,シングルクォートを重ねるエスケープ方法に変更する。PHPで言えば, magic_quote_gpcをoffにし,かつaddslashes()ではなくpg_escape_string()を使うようにする。

(3) (2)が難しい場合には十分注意しながらbackslash_quoteを設定する
------------------------------------------------

検証する。

(1) ・・・ 今回利用しているバージョンは、7.3.15なのでOK.
(2) ・・・ magic_quote_gpcをoffにし,かつaddslashes()ではなくpg_escape_string() を利用している。
(3) ・・・ (2)が可能なのでOK.

PEAR::Mail

PEARを利用したメール送信。メモ。

コチラを参考にした。


○Package Information: Mail_Mime - 日本語化
Package Information: Mail_Mime

PHPでメール

前回はPearを利用しましたが、利用しない方法。

こちらを利用しました。

ソースだけ書くと。

mailsample.php
--------------------------------------------------
require("mail.php");

$MailFrom = "hogehoge@○○.jp";
$MailTo = "hoge@○○.jp";
$Subject = "メール送信テスト";
$Message = <<< __EOF__
メール送信テスト
(サンプル)
ヒアドキュメントで生成する場合は、このようになります。
__EOF__;

$Kekka = MailSender($MailFrom, $MailTo, $Subject, $Message);
?>
--------------------------------------------------

mail.php
--------------------------------------------------
function MailSender($MailFrom, $MailTo, $Subject, $Message)
{
$xSubject = mb_convert_encoding($Subject, "JIS", "auto");
$xSubject = base64_encode($xSubject);
$xSubject = "=?iso-2022-jp?B?".$xSubject."?=";

$xMessage = htmlspecialchars($Message);
$xMessage = str_replace("&", "&", $xMessage);
if (get_magic_quotes_gpc()) $xMessage = stripslashes($xMessage);
$xMessage = str_replace("\r\n", "\r", $xMessage);
$xMessage = str_replace("\r", "\n", $xMessage);
$xMessage = mb_convert_encoding($xMessage, "JIS", "auto");

$GMT = date("Z");
$GMT_ABS = abs($GMT);
$GMT_HOUR = floor($GMT_ABS / 3600);
$GMT_MIN = floor(($GMT_ABS - $GMT_HOUR * 3600) / 60);
if ($GMT >= 0) $GMT_FLG = "+"; else $GMT_FLG = "-";
$GMT_RFC = date("D, d M Y H:i:s ").sprintf($GMT_FLG."%02d%02d", $GMT_HOUR, $GMT_MIN);

$Headers = "Date: ".$GMT_RFC."\n";
$Headers .= "From: $MailFrom\n";
$Headers .= "Subject: $xSubject\n";
$Headers .= "MIME-Version: 1.0\n";
$Headers .= "X-Mailer: PHP/".phpversion()."\n";
$Headers .= "Content-type: text/plain; charset=ISO-2022-JP\n";
$Headers .= "Content-Transfer-Encoding: 7bit";

if(mail($MailTo, $xSubject, $xMessage, $Headers)) return true;
return false;
}
?>
--------------------------------------------------

※mail関数、mbstring関連関数を使用できない場合は動作しません。

2006年12月06日

MySQLメモ

○文字コードを指定してデータベースを作成 例)utf8の場合
create database [データベース名] default character set utf8;

○データベースの確認
show databases;

○テーブルの確認
show tables;

○カラムの確認
show fields from [テーブル名];

2006年12月08日

ipconfigメモ

こちらに、なかなか良い一覧あり。

http://www.atmarkit.co.jp/fnetwork/netcom/ipconfig/ipconfig.html

2006年12月11日

boot時に立ち上げるメモ(Linux)

※boot時に立ち上げる(再起動のときに立ち上げる)
chkconfig --level 3 httpd on
chkconfig --level 5 httpd on
chkconfig --level 3 postgresql on
chkconfig --level 5 postgresql on

2006年12月12日

Linux コマンドメモ

ポートの確認

netstat

2006年12月13日

各ディレクトリの役割を知ろう(ルートディレクトリ編)

Linuxのディレクトの役割についてメモ

/   ルートディレクトリ
├ /bin 基本コマンド
├ /boot 起動に必要なファイル
├ /dev デバイスファイル
├ /etc 設定ファイル
├ /home(オプション) ユーザーのホームディレクトリ
├ /lib 共有ライブラリ
├ /lib(オプション)  
├ /mnt 一時的なマウントポイント
├ /opt 追加アプリケーション
├ /proc(Linux固有) プロセス情報など
├ /root(オプション) root用ホームディレクトリ
├ /sbin システム管理用コマンドなど
├ /tmp 一時的なファイル
├ /usr 各種プログラムなど
└ /var 変更されるデータ


参考 : http://www.atmarkit.co.jp/flinux/rensai/theory02/theory02a.html

2006年12月15日

runlevel 変更について

実際に起動する際に、どのランレベルが使用されるかは、
 
/etc/inittab
 
の中に記載されている、設定値により決定されます。
inittab中には、
  
id:5:initdefault:
 
等の設定がされています。
この場合、runlevel:5が設定されている事となります。
起動する際のデフォルトのrunlevelを変更したい場合は、5と設定されている値を上記のrunlevelの何れかの値とします。
 
なお、/etc/inittabにデフォルト値が設定されているが、起動時に、runlevelを変更したい場合は、
 
PC起動後の下記のメッセージが表示されたときに、

LILO boot:linux 1

とします(大文字のところを入力する)。
ここで、何も値の設定をしない場合は、先の説明通り/etc/inittabで設定されている値での起動となります。
 
また、O/S起動後に、runlevelの値を変更したい場合は、ルート権限(root)にてログオンし直し、telinit [runlevel]とコマンドを入力します。


参考:http://claris.hp.infoseek.co.jp/basic/runlevel_1.html

2006年12月18日

Can't connect to local MySQL server through socket '/tmp/mysqld.sock' (2)

Can't connect to local MySQL server through socket '/tmp/mysqld.sock' (2)

のエラーについて。

http://dev.mysql.com/doc/refman/4.1/ja/can-not-connect-to-server.html
↑こちらを参照。

結果的には、 /tmp/mysqld.sock ファイルがなく、 /etc/init.d/mysql restart をして、/tmp/mysqld.sock を作成したらmysqlが使えるようになった。

うーん。なんで再起動すると、削除されてしまうのだろう。
cronに書かれているわけでもないのにな。
/tmpの下においてあるから悪いのかな。と思って場所を変えたけど、ダメだった。

検証しよう。

2006年12月25日

Linuxにどの様にパーティションが区切られていて、どれ位使われているのかを調べる

例:

#df -h
ファイルシステム サイズ 使用中 空き 使用% マウント場所
/dev/hda2 18G 748M 16G 5% /
/dev/hda1 45M 13M 30M 30% /boot
使用しているLinuxのパーティションが表示されます。
HDDのサイズ、使用量、マウント場所など分かって便利。

参考:http://www.miloweb.net/partition.html

2006年12月27日

Ruby on Rails 各ディレクトリの役割

最近 Ruby on Railsから離れていたので、復習。

○各フォルダの役割

・app
アプリケーション本体、モデル・コントローラー・ビューなどを入れる。
app/models -> モデルのファイルを入れる
app/controllers -> コントローラーのファイルを入れる
app/views -> ビューのファイルを入れる
app/helpers -> ビューで使うヘルパーを入れる

・components
モデル、コントローラー、ビューをセットにしたコンポーネントと呼ばれるパーツを入れるディレクトリ

・config
設定ファイルを入れるディレクトリ。Ruby on Railsの環境設定、データベースの設定、URIとアプリケーションのマッピングの設定を行う。

・db
データベースの構造を記述するファイルを入れるディレクトリ。

・lib
アプリケーションで使うライブラリ

・public
HTTPサーバーのルートディレクトリにあたるディレクトリ。スタイルシート、JavaScript、画像ファイルなどの静的ファイルや、CGIを起動するためのファイルを置く。

・script
アプリケーションの作成支援するスクリプト群があるディレクトリ。

・test
テストの為のファイルを入れるディレクトリ。

・vendor
Ruby on Rails 自身のライブラリやプラグインなどを収めるディレクトリ。

・doc
ドキュメント

・log
ログファイル

データベース作成 と テーブル作成(migrate)

Ruby on Rails 復習。

○データベースの作成(例:MySQL)
create database [データベース名] default character set utf8;

[なんか名前]_development
[なんか名前]_test
[なんか名前]_production
↑この3つのデータベースを作る。

※ユーザー権限設定が必要であれば行う。
例:
grant all privileges on *.* to user_name@localhost identified by 'passwd' with grant option;

○migration -> データベースにテーブルを作成できる。データベース構造のバージョン管理もできる。
具体的に出来ること
* テーブルの作成・削除
* カラムの追加・削除・変更
* インデックスの追加・削除

○対応しているデータベース
* MySQL
* PostgreSQL
* Oracle
* SQLite

・ファイルの場所
db/migrate/○○.rb

・migration のヘルプの見方
 1.Railsアプリのあるディレクトリに移動する。
 2.ruby script/generate migration --help

・migration ファイルの作り方(Railsのトップディレクトリで)
ruby script/generate migration create_[テーブル名]

これで、 db/migrate/001_create_[テーブル名].rb というファイルができる。
テーブルひとつに対してひとつ。

- db/migrate/001_create_[テーブル名].rb - 修正前
{{{
class CreateBirthdayLists < ActiveRecord::Migration
def self.up
end

def self.down
end
end
]}}
- db/migrate/001_create_[テーブル名].rb - 修正後の例
{{{
class CreateBirthdayLists < ActiveRecord::Migration
def self.up
create_table(:birthday_lists) do |table|
table.column(:company_directory_no, :integer, :null => false)
table.column(:name, :string, :limit => '100', :null => false)
table.column(:birthday, :date)
end
end

def self.down
drop_table(:birthday_lists)
end
end
]}}

※idは自動的に作成される

・migration ファイルの説明
self.up : migration のバージョンがあがるときに実行される
sefl.down : migration のバージョンが下がるときに実行される

・rake db:migrate
migration ファイルを作成したら実行しましょう。テーブルが出来ます。


・参考
http://www.atmarkit.co.jp/im/carc/serial/proto04/proto04.html

subversion コマンドラインで使ってみよう

GUIでは良く使うけど、コマンドラインではあまり使わなかったので・・・。

参考:http://www.hyuki.com/techinfo/svninit.html

subversion ブランチ

○ブランチの基本的な概念

あなたの仕事が、何かのハンドブックを扱う企業の一部署で、ドキュメントの管理をすることだとします。ある日別の部署から同じハンドブックが必要なのだが、ある部分を「ちょっとだけ」変えたものがほしい、ほんの少しだけ業務形態に違いがあるから、といわれたとします。

この状況で、あなたはどうしなくてはならないでしょうか? 答えはあたりまえです: ドキュメントのコピーを作って二つのコピーを別々に管理することにします。それぞれの部署が小さな変更を依頼してくるたび、一方を修正したり、もう一方を修正したりします。

両方のコピーに同じ修正を加えたいこともよくあります。たとえば最初のコピーにスペルミスがあったとします。もう一方のコピーにもおそらく同じ間違いがあるでしょう。両方のドキュメントはほとんど同じなのですから。二つはほんの少し違っているだけです。

※ブランチは必ず、何かのコピーから始まり、枝分かれして、自分自身の歴史を持っていくようになります
※タグ/ブランチとはソースのある時点でのスナップショットです。


参考
http://subversion.bluegate.org/doc/ch04.html
http://www-aos.eps.s.u-tokyo.ac.jp/~takagi/SubversionMemo.html
http://terai.xrea.jp/Subversion.html
http://www.hyuki.com/techinfo/svninit.html
http://park1.wakwak.com/~ima/windows_subversion0001.html

Ruby on Rails 画面の雛形を作ろう

○scaffold 概要
scaffold(建築現場の足場) - あるテーブルを編集するためのモデル、ビュー、コントローラーの各雛形を作ってくれる。

○scaffold オプション
ruby script/generate scaffold --help
↑ヘルプで見ましょう

○scaffold 実行
例) ruby script/generate scaffold [モデル名]
※[モデル名]は大文字から始める。もし、テーブル名が report_lists だったら、モデル名は、Report_list です。

○scaffold で作成されるファイルの役割
app/models/report_list.rb  Report_list モデルを記述する。
app/views/report_lists/_form.rhtml  登録と編集で利用するビュー
app/views/report_lists/list.rhtml  一覧表示を行うビュー
app/views/report_lists/show.rhtml  詳細表示を行うビュー
app/views/report_lists/new.rhtml  登録画面のビュー
app/views/report_lists/edit.rhtml  編集画面のビュー
app/controllers/report_lists_controller.rb  コントローラ
test/functional/report_lists_contoroller_test.rb  コントローラのテストプログラム
app/helpers/report_lists_helper.rb  ヘルパープログラム
app/views/layouts/report_lists.rhtml  スケジュールコントローラのビューで利用する画面の共通部分のビュー
test/unit/report_list_test.rb  report_list モデルのテストプログラム
test/fixtures/report_lists.yml  report_list モデルのテストで使用するデータを記述するYAMLファイル
public/stylesheets/scaffold.css  スタイルシート

2006年12月28日

Ruby on Rails 画面の雛形を作ろう 続き

復習。

Ruby on Rails の動作のようす。


1. http://127.0.0.0:3000/birthday_lists/list.rhtml にアクセス。
2. app/controllers/birthday_lists_controller.rb に書かれている BirthdayListsController クラスの中の list という名前のアクションメソッドが呼ばれる。
3. 特に指定しないときはアクションメソッドと同名のビュー (app/views/schedules/list.rhtml) を表示する。

テストの内容を解読しよう

○コード例
------------------------------------------------------------
# Re-raise errors caught by the controller.
class BirthdayListsController; def rescue_action(e) raise e end; end

class BirthdayListsControllerTest < Test::Unit::TestCase
fixtures :birthday_lists

(略)

def test_list
get :list

assert_response :success
assert_template 'list'

assert_not_nil assigns(:birthday_lists)
end

(略)



------------------------------------------------------------

○get :list
 BirthdayListsController の list というアクションにGETアクセスする。

○assert_response :success
 レスポンスが成功 (HTTP の リザルトコードが200) になることを確認する。

○assert_template 'list'
 app/views/birthday_lists/list.rhtml が表示されることを確認する。

○assert_not_nil assigns(:birthday_lists)
 表示する際に代入されている @birthday_lists というインスタンス変数が nil でないことを確認する。

便利な paginate

○例
------------------------------------------------------
def list
@birthday_list_pages, @birthday_lists = paginate( :birthday_lists, :per_page => 10, :order => 'date DESC')
end
------------------------------------------------------

paginateの第一引数にはモデルの名前*1、第二引数には以下のようなオプションを指定できる。

class_name
モデルのクラス名
per_page
一ページあたりの行数
conditions
where句
order_by
order by句
join
join句
parameter
ページ番号を指定するためのパラメータの名前

参考
http://shugo.net/jit/20050422.html

Ruby on Rails 画面の雛形を作ろう 3

<%= render :partial => 'form' %>


render というのは、別のテンプレートをERBで解釈して返すメソッド。
partial は一部と言う意味で、:parial => 'form' と指定すると _form.rhtml をテンプレートとして使う。

partial で使うテンプレートのファイル名は先頭に『_』というのも、Ruby on Rails の規約のひとつ。

テストの内容を解読しよう 2

○コード例
---------------------------------------------------------
== テストコード一部抜粋(functionalより) ==
def test_create
num_birthday_lists = BirthdayList.count

post :create, :birthday_list => {}

assert_response :redirect
assert_redirected_to :action => 'list'

assert_equal num_birthday_lists + 1, BirthdayList.count
end
---------------------------------------------------------

○num_birthday_lists = BirthdayList.count
BirthdayListモデルのオブジェクトの数を num_birthday_lists に代入しておく。

○post :create, :birthday_list => {}
BirthdayListsCntroller の create というアクションに、空の params[:birthday_list] で POST アクセスする。

○assert_response :redirect
レスポンスがリダイレクト( HTTPのリザルトコードが302 )になることを確認する。

○assert_redirected_to :action => 'list'
BirthdayListsCntroller の list というアクションにリダイレクトされることを確認する。

○assert_equal num_birthday_lists + 1, BirthdayList.count
BirthdayListモデルのオブジェクトの数は1増えていることを確認する。

2006年12月

Sun Mon Tue Wed Thu Fri Sat
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

Map

About 2006年12月

2006年12月にブログ「プログラマ 福重 伸太朗 ~基本へ帰ろう~」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2006年11月です。

次のアーカイブは2007年01月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。