2008年7月26日土曜日

PHPでオブジェクトのメソッド一覧を取得する方法

JavaScriptではfor inで取れますが、PHPではget_class_methods関数を使うことでできます。ただしpublicメソッドのみ。ちなみにpublicプロパティを取得するにはget_object_vars関数を使います。

サンプルコードと結果

<?php
class Foo
{
   function __constructor () { return 0; }
   public function add( $a, $b )
   {
       return $a + $b;
   }

   
   private function _privateMethod()
   {
        return -1;
   }

   public static function isPostcode ( $postcode )
   {
       return preg_match( '/^\d{3}-\d{4}$/', $postcode ) ? true : false;
   }
}

$methods = get_class_methods( new Foo() );
foreach( $methods as $method_name ) {
    echo $method_name,"\n";
}
#結果
__constructor
add
isPostcode

こういうことする手間自体が無駄なので、PHP Docでクラスのマニュアルは作成しておくのがベストだと思います。

2008年7月21日月曜日

MySQLでユーザを作成と権限の設定

今回はmy_databaseの全てのテーブルの全ての権限をdopinにあげる例です。dopinのパスワードも設定します。
create database my_database;
grant all on my_database.*  to dopin@localhost identified by '[パスワード]';
現在サイト構築を手伝ってくれているzeroさんに教えていただきました。

VirtualHostでPHPを無効にする方法

RedmineのレポジトリブラウザでPHPのファイルだけnot found or unable to statのようなエラーが表示されて困っておりましたので、以下の部分をhttpd.confに追加したらうまく動くようになりました。
php_flag engine off

CentOS5でタイムゾーンを再設定

Slicehostでサーバを借りると、タイムゾーンが日本時間からして13時間遅れになってます。なので、東京時間(JST)に変えちゃいましょう。
cp -p /etc/localtime /etc/localtime.old #怖い方は昔のファイルを取っておきましょう
cp -p /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
dateコマンドで時刻を確認してみて下さい。

2008年7月19日土曜日

IEのTabキーのonkey(press|up)が取れない件

use MC_Hammer::You_cant_touch_this; # as BGM
use 有名人::DAIGO # to break the ice
確かに、tabで次の要素に行く時に変な時があった気がする・・・。サジェストとか作ってた時。 元記事はこちら bug 249 - you can't press Tab in IE and capture ie 実際に試せるので元記事を見てみて下さい。このブログは必須購読です!

2008年7月18日金曜日

Table mysql.host doesnt exist

Table 'mysql.host' doesn't exist

MySQLをインストールする際にこんなエラーが出ました。おそらく以前yumでインストールしてて、そのまま放置した後、最新版を落とせる別のレポジトリからmysqlをアップデートしたせいで、設定ファイルの競合が起きたようです。

yum remove mysql*
をした後でも/usr/bin/mysqlが残っていたので、/usr/bin/の下のmysqlで始まるファイルを全て削除してから、再度yumでmysqlをインストールし直したらうまくいくようになりました。

I encountered this error as installing MySQL5 via yum. I installed MySQL5 before and did nothing and after I added a new yum repository that you can get latest packages, I upgraded mysql with the repository but it made a conflict of my.cnf. So I did "yum remove mysql*" but /usr/bin/mysql was remained installed. I removed files which had name beginning with mysql in /usr/bin directory and reinstalled mysql via yum again. And finally, That made it! Hope everything works fine!!

CentOS5.2にMySQL5をインストール

バージョンはMySQL5.0.45です。
yum install mysql mysql-server mysql-devel php-mysql
起動
mysqld_safe &
または
/etc/init.d/mysqld start
この時エラーが起きる人は(mysql.hostが無いとか)、一旦yumからmysqlを消し、さらに/usr/bin/mysqlなどが残っていないか調べ、それも消してから再度インストールするとうまく行くようです。ここではまったw 設定
mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!


In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): #mysql rootのパスワードを入力
#何も設定していなければそのままEnter

OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] Y #rootパスワードを設定する Y=はい n=いいえ Enter!
New password: #mysql rootユーザのパスワードを設定

Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MySQL installation has an anonymous user, allowing anyone
to log into MySQL without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

#匿名ユーザの削除
Remove anonymous users? [Y/n] Y
ormally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

#リモートからrootでログインできなくする(通常rootはlocalhostからだけ)
Disallow root login remotely? [Y/n] Y
 ... Success!

By default, MySQL comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

#testデータベースの削除
Remove test database and access to it? [Y/n] Y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

#privilege(特権?)テーブルの最読み込み
Reload privilege tables now? [Y/n] Y
 ... Success!

Cleaning up...



All done!  If you've completed all of the above steps, your MySQL
installation should now be secure.

Thanks for using MySQL!

#インストール完了!
実際に使ってみる
mysql -u root -p 
#rootのパスワードを入力
後はユーザの追加とかですね。そのままrootで使うのは避けましょう!

Redmine0.8の注目の新機能

詳細はRoadmap::0.8で見れます。Featuresが機能です。 個人的に注目しているもの ・Emailからチケット作成が可能プライベートチケットウィキページの階層化とパンくず ・添付ファイルの差分ビューワ ・リマインダーグローバルウィキウィキページのロック機能 他にもユーザグループなど新機能のチケットがたくさんありますが、実際に実装されるかは分かりません(笑

2008年7月14日月曜日

PHPUnit入門

技評にそういう連載がありました。PHPUnit入門 PHPでクラスを書いた時は、PHPUnitのようなツールでテストした方が良いです。PHPUnitの場合、テスト用クラスを書くため、テストした内容が明確に残ります。また、テスト中にバグを発見した際に、再度そのプログラムを利用してテストできるため、テストフェーズの時間を短縮することができます。 テストを真面目にやればやるほど、テストにうんざりします。テストされてないライブラリは叩かれます(たぶん)。 今日か明日にはPHPでクラスを作る予定なので、それと同時にPHPUnitも導入しようと思います。

vsftpd ルートディレクトリ 変更

OS:CentOS 5.2 vsftpd: 2.0.3 ユーザ毎に/home/xxx/public_htmlとする場合はvsftpd.confにlocal_root=public.htmlと書くだけですが、ホームディレクトリ以外にするにはどうするか? user_conf_dirを設定し、そこにユーザ毎の設定を書けばOKです。 ユーザfooの場合の設定
vi /etc/vsftpd/vsftpd.conf
以下の一文を追記
user_conf_dir=/etc/vsftpd/user_conf

ディレクトリを作成
mkdir /etc/vsftpd/user_conf
fooの設定ファイルを作成しルートディレクトリを指定する
vi /etc/vsftpd/user_conf/foo
local_root=/var/www/html
参考:http://www.eqg.org/taiki/vsftpd.shtml

2008年7月13日日曜日

Redmine0.8のメール設定

Redmine0.8からだと思いますが、それまではconfig/environment.rbにSMTPの設定を記述するのが、config/email.ymlに変更されたようです。email.yml.exampleがあるのでそれをコピーして使用してみました。
cp config/email.yml.example config/email.yml
vi config/email.yml

# Outgoing email settings

production:
delivery_method: :smtp
smtp_settings:
  address: 127.0.0.1
  port: 25
  domain: somenet.foo
 # authentication: :login
 # user_name: redmine@somenet.foo
 # password: redmine

development:
delivery_method: :smtp
smtp_settings:
  address: 127.0.0.1
  port: 25
  domain: somenet.foo
  #authentication: :login
  #user_name: redmine@somenet.foo
  #password: redmine
servide httpd restart
これで届くようになりました。Yahooメールで受信するとタイトルが文字化けする...(-_-#)

CentOS5.2にPostfix2.3.3をインストール

パッケージインストール
yum install postfix
yum install system-switch-mail # MTAをSendmailから切り替えるもの
system-switch-mail
#MTAの選択画面が出るのでPostfixを選ぶ
#postfixが自動起動されるようになる
設定
vi /etc/postfix/main.cf
myhostname=<ホスト名>
mydomain=<ドメイン名>
inet_interface=localhost #このままでは外部からのメールが受信できないので$myhostnameなどを追加する
mynetworks_style=host #ローカルだけ信頼

service postfix restart

vsftp 500 OOPS: SSL: cannot load RSA key

vsftpdでSSLを有効にする際に証明書と鍵の設定が必要になる
rsa_cert_file=/etc/vsftpd/oreore.crt
ここで注意なのが、ここで指定するファイルにはcrtとkeyの両方が書かれていないと、cannot load RSA keyとかcannot load public key とかcannot load private keyと出る。confに鍵ファイルの指定用のもあればいいのにと思うけど・・・ないっぽい。どれも中身はテキストファイルなのでくっつけて一つのファイルにして使えばいい。 ちなみに、自己署名証明書作成は以下のコマンドで簡単に作成できる(CentOS5.2)
cd /etc/pki/tls/certs
make <今回作る証明書のファイル名>.crt
入力が要求されるパスワードは覚えておく必要があるのでメモっておいた方が良い。後は管理者の情報(住所や連絡先email)が入力するように画面に表示されるので、それに従って入力するだけ(全部で7つほど)

2008年7月12日土曜日

ApacheがPHPとかOSの情報を密かにもらす件

httpd.confにこんな設定が有る
ServerTokens
これの設定次第ではOSのバージョンやPHPやモジュールのバージョンをHTTPレスポンスヘッダ内に含めて返すので、コメントアウトしておく方が無難です。 追記: コメントアウトではだめなようですw ServerTokens Prod でApahceを使っていること以外の情報は送信されなります この設定もお忘れなく
ServerSignature Off

2008年7月8日火曜日

CentOS5にSubversionレポジトリサーバを構築

apache2とsubversion1.4でいきます。OSはCentOS5.2 まずはyum
# yum install subversion
# yum install mod_dav_svn
レポジトリ用のフォルダを準備しそこにレポジトリを作成
# cd ~
mkdir repos
svnadmin create /home/<ユーザ>/repos/
svn mkdir file://localhost/home/<ユーザ名>/repos/trunk -m "create"
svn mkdir file://localhost/home/<ユーザ名>/repos/branches -m "create"
svn mkdir file://localhost/home/<ユーザ名>/repos/tags -m "create"
trunk ... 主開発レポジトリ branches ... 枝レポジトリ(各プロジェクト用とかの、いずれtrunkに結合) tags ... バージョン毎にソースを保管しておくためのレポジトリ httpd.confに設定
<Location /svn/svn>
    DAV svn
    SVNPath /home/<ユーザ>/repos
    AuthzSVNAccessFile /home/<ユーザ>/repos/conf/authz

    # 認証したユーザだけアクセス可能にする(Basic認証)
    Require valid-user
    AuthType Basic
    AuthName "None can pass!"
    AuthUserFile /home/<ユーザ>/repos/.htpasswd
  #SSLでアクセスするようにする
    SSLRequireSSL
</Location>
repos/conf/authzの設定
#グループの設定 グループ名 = ユーザ[,ユーザ]
[groups]
developers = harry, sally
#管理者
manager = dopin
[/]
# rはreadable wはwritable
#すべての人が読み込み可能にする
* = r
[repos:/trunk]
@developers = rw
[repos:/branches]
@manager = rw
[sample:/tags]
@manager = rw
htpasswdを設定する
htpasswd -c /home/<ユーザ>/repos/.htpasswd harry
htpasswd /home/<ユーザ>/repos/.htpasswd sally
所有者をapacheに変更
chown -R apache:apache /home/<ユーザ>/repos/
Apacheの再起動
service httpd restart
終わり。

Redmineで管理者がパスワードを忘れた場合

Redmine2とRails3なやり方

この記事にリンクされている方がいたのと、最近同じ対応をしたのでやり方を書いておきます。


cd /path/to/redmine # Redmineディレクトリに異動
rails c # Railsコンソールを起動(必要に応じてRAILS_ENV=production)
user = User.where(login: 'admin').first # adminは管理者のログインアカウントに置き換える
user.password = '新しいパスワード'
user.save # falseが返ってくる場合はuser.errorsで内容を確認してください


以下は古い内容です


しかもメールでのパスワードの再発行ができないときたら・・・。 SQLiteを使っていて、SSHなどコマンドラインから操作できるのが条件ですが、ログインしてredmineのデータベースファイルを開く
sqlite3 redmine.db
sqlite> .header ON
 これでカラム名を表示するようになる
sqlite> SELECT * FROM users;
 ユーザ一覧が表示される
 その中から自分のIDを見つけパスワード(hashed_password)をUPDATEで書き換える。パスワードはsha1の計算値
sqlite> UPDATE users SET hashed_password = "16進数40桁"
sqlite> WHERE id = 自分のID番号;
sqlite>.exit
パスワードを忘れたら焦りますね。^^;

PHPで携帯のGPSを取り扱うライブラリ

PEAR::Packages::Net_UserAgent_Mobile_GPS(英語) GPS PEARライブラリ / Net_UserAgent_Mobile_GPS(日本語)

サンプルコード

require 'Net/UserAgent/Mobile/GPS.php';

try {
    $g = Net_UserAgent_Mobile_GPS::factory();
} catch (Net_UserAgent_Mobile_GPS_Exception $e) {
    var_dump($e->getMessage());
    exit();
}

$url = "http://test.com";
$str = 'GPS.TEST';
$glink = $g->getGPSLink($url, $str);

print('<pre>');
var_dump($glink);
print('</pre>');

try catchは例外(Exception)と呼ばれるものでPHP5から導入されました。catchは複数指定できますが、今回のサンプルコードはNet_UserAgent_Mobile_GPS_Exceptionが投げられた時(throw)に対応するものですね。例外について詳しくはマニュアルの例外を参照して下さい。

携帯のGPSを利用しようと考えていたところなので渡りに船ですが、他にもライブラリがないか探してみようと思います。

2008年7月7日月曜日

CentOS5.2 Apache2 + SSL

Apache2にSSLを入れる
# yum install openssl
# yum install mod_ssl
SSL証明書の作成
パスワードを設定するように要求されます。すぐに使うので覚えておいて下さい。
# openssl genrsa -des3 -out /etc/httpd/conf/ca.key -rand /var/log/messages 1024
# openssl req -new -key /etc/httpd/conf/ca.key -out /etc/httpd/conf/ca.csr
  先ほどのパスワードを入力し、国名にJPなど情報を入力する
# cd /etc/httpd/conf
自己証明しちゃう(普通はCSRファイルをVeriSignなどのぼったくり機関に申請します)
# openssl x509 -req -in ca.csr -signkey ca.key -out server.crt

httpd.confの該当する場所に追記
SSLEngine on
SSLCertificateFile /etc/httpd/conf/server.crt
SSLCertificateKeyFile /etc/httpd/conf/ca.key

# service httpd start #またはrestart?
challenge passwordを入力してapacheが起動したらhttpsでアクセスしてみて下さい

no such file to load -- sqlite3

OS:CentOS 5.2 rake db:migrateでno such file to load -- sqlite3と出る。 yum install sqliteなんてしてもだめ 正解は
yum install sqlite-devel
gem install sqlite3-ruby
sqlite-develを入れていないとsqlite3-rubyを入れる時点でchecking for sqlite3.h... no というエラーが発生する そして再度,rake db:migrateをするとno such file to load -- sqlite3/databaseというエラーgが。locate database.rbをするとパーミッションのotherのところがwritableだけになってる。いや、ライブラリが読み込めないってありえない・・・
chmod 644 database.rb
chmod 644 translator.rb
これでうまく行きました

rootに昇格できるユーザを限定する

CentOS 5.2の設定です。 rootに昇格できるユーザを追記する(例:dopin)
# vi /etc/group
wheel:x:10:root,dopin
設定を有効にする
# vi /etc/pam.d/su
# Uncomment the following line to require a user to be in the "wheel" group.
と書いてあるのでコメントアウトをはずす
auth  required pam_wheel.so use_uid
# vi /etc/login.defs
SU_WHEEL_ONLY yes #を追記
これでdopin以外のユーザがsuを実行しても拒否されます。

SSHでrootの直接ログインを無効にする

sshでroot@server.comですぐにログインできる状態はセキュリティ上よくありません。一般ユーザを作成し、そちらからログインし、rootになれるようにした方がセキュリティが向上します。ついでにパスワード無しでログインできるユーザも禁止します。念のためsshは2つウィンドウを開いておき、万が一の時のために片方をrootでログインしたままにしておく方が良いです。 設定方法は
# vi /etc/ssh/sshd_config
#PermitRootLogin yes を PermitRootLogin no
#PermitEmptyPasswords no を PermitEmptyPasswords no
に変更します
#を外し、noにしているところがポイントです。sshdを再起動し反映します。
# /etc/init.d/sshd restart
実際にrootでログインしようとしても、Permission Deniedが返されるようになります。一般ユーザからrootに変わるにはsuコマンドを実行します。

SlicehostにPassengerをインストール

CentOS5.2環境です(追記:2009/02/27)

Ubuntu8.04にインストールされていた方から本記事にリンクがありましたので、Ubuntu8.04をお使いの方は、眠れない夜に書くブログ様の「SlicehostにPassengerをインストールで引っかかった。」を参照してください。

Phusion Passenger ( mod_rails )はRuby On RailsをApacheモジュールとして動作させるものです。mongrelなどよりインストールが簡単です。
# gem install passenger
うまく行かない時は
# gem prinstine --all
をしてみてから再度実行して下さい。 Passengerインストール
passenger-install-apache2-module
インストール時に足りないパッケージがあると、それをインストールするように言われます。ご自分の環境に合わせて指示通りに行ってみて下さい。yum install httpdをしてもApache2がnot foundになる場合、
# yum install apr-devel
で解決するかもしれません。(今回ここではまりましたw) Passengerのインストールが終わると、最後にhttpd.confの設定サンプルが表示されます。それをhttpd.confに書き込んで下さい.
Please edit your Apache configuration file, and add these lines:
LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.1/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.0.1
PassengerRuby /usr/local/bin/ruby
DocumentRootはRailsアプリのpublicディレクトリにしておく。

2008年7月6日日曜日

SlicehostにRuby On Railsをインストールする

gem install rails --include-dependencies
これだけでは使えないので、mod_rails(passenger)を入れてapache経由で使えるようにします。Apacheとpassengerのインストールは次回

SlicehostにRubyGemsをインストール

追記: このzlibのエラーは1.8.7を最初にインストールしたのが原因のようですw 1.8.6では必要ない作業です OSはCentOS5.2です。そのまま入れようとしたらzlibのエラーが起きまいした
# ruby setup.rb
./lib/rubygems/spec_fetcher.rb:1:in `require': no such file to load -- zlib (LoadError)
 from ./lib/rubygems/spec_fetcher.rb:1
 from ./lib/rubygems/source_index.rb:10:in `require'
 from ./lib/rubygems/source_index.rb:10
 from ./lib/rubygems.rb:767:in `require'
 from ./lib/rubygems.rb:767
 from setup.rb:22:in `require'
 from setup.rb:22
めげずにインストールします!( yumでzlibを入れる
# yum install zlib-devel
zlib-1.2.3-3がインストールされる rubyを解凍したディレクトリに移動しext/zlibに行き、zlibの設定
# cd /tmp/ruby/ext/zlib
# ruby extconf.rb --with-zlib-include=/usr/include -with-zlib-lib=/usr/lib
# make
# make install
RubyGemsをRubyForge::RubyGemsからダウンロードしインストールする
# cd /tmp
# wget http://rubyforge.org/frs/download.php/38646/rubygems-1.2.0.tgz
# tar zxf rubygems-1.2.0
# cd rubygems-1.2.0
# ruby setup.rb
ちなみにyumでrubygemsをインストールしたい場合は、yumのextra reposにあるようです。そっちの方が楽かも。

SlicehostにRubyをインストール

Railsを使うので今回は1.8.7を入れました。こんなんでいいのかな・・・ 追記: だめみたいw Railsをちゃんと動かしたい方は1.8.6が良いようです。 wget部分のURLをに変更して下さいw
ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6.tar.gz
# yum install gcc
# yum install make
# cd /tmp
# wget ftp://ftp.ruby-lang.org/pub/ruby/stable-snapshot.tar.gz
# tar zxf stable-snapshot.tar.gz
# cd ruby
# ./configure
# make
# make install

Slicehostにapache + subversion環境構築

まずはyumでインストール
# yum install httpd
# yum install subversion
# yum install mod_dav_svn
apache2.2.3、subversion1.4.2がインストールされました とりあえず、httpで繋がるか確認する。httpd.conf最下部に以下のように記述
<VirtualHost www.mydomain.com:80>
    ServerName www.mydomain.com #取得したドメインを記述
    DocumentRoot /var/www/html
</VirtualHost>
いい加減なので後でちゃんと修正して下さいw
service httpd start
これでhttp経由でapacheの画面が見れればOK 続く...

2008年7月4日金曜日

Redmine Wiki 画像のリサイズ機能を実装

RedmineでWikiに画像を貼付けると、画像のサイズのまま表示されて不便でしたが、その問題が対応されたようです。おそらくバージョン0.8からの実装になるので、0.7-stableでは無理かな・・・ マージされるといいですが 関連チケット:#949 Wikiに以下のように書いてサイズを指定します。
!{width:300px}image.png!
ちなみに、リサイズされた画像の原寸表示などのリンクは貼られません。ちょっと不親切かな。

2008年7月3日木曜日

Perlの||で関数のデフォルト値

Perlの $foo = a || b; 的なので、||がどういう感じで演算されるのか気になったのでちょっと書いてみた ちなみにPHPの||はBooleanを返すので、こういった書き方はしません。 Perlはtrueとかfalseが予約語にないんだねー。知らなかった。 スカラー変数だけじゃなく、@や%も今度テストしますw こうやってブログに書く事で自分の記憶を助けているだけですw
#!/usr/local/bin/perl
use strict;
use warnings;

sub test{
 my $foo = shift || 'default';
 $foo .= "\n";
}

undef $a;
print test(1);  # 1
print test(""); # default
print test(0);  # default
print test($a); # default