« 2007年05月 | メイン | 2007年07月 »
Vine Linux 4.1にOpenPNE2.8をインストール手順です。
このサンプルでは、Vine Linux4.1を使っています。
基本的に、他のLinuxでも手順は変わらないと思います。
OpenPNEのダウンロード
ファイルの設置
ダウンロードしたOpenPNE-2.8.0.tar.bz2(Windowsの場合はOpenPNE-2.8.0.zip)を展開する。
tar xzvf OpenPNE-2.8.0.tar.bz2
展開されたファイルのうち、public_htmlディレクトリ以外のファイルをブラウザからアクセスできない場所に設置しま。 この設置場所をOPENPNE_DIRとします。
- OPENPNE_DIR
├ bin
├ lib
├ webapp
├ webapp_biz
└ webapp_ext
public_htmlディレクトリをブラウザから閲覧可能な場所に設置します。
- public_html
├ config.inc.php
├ index.php
...
public_htmlのディレクトリ名は変更可能です。 snsなど、ほかの名前に変更しても問題ありません。
OPENPNE_DIRは、/home/yamamoto/OpenPNE/としています。 Windowsの場合は、C:\OpenPNE\などに設置すればいいと思います。
- /home/yamamoto/OpenPNE/
├ bin
├ lib
├ webapp
├ webapp_biz
└ webapp_ext
public_htmlディレクトリは、/home/yamamoto/public_html/の下に設置して、ディレクトリの名前をsnsに変更しています。(/home/yamamoto/public_html/sns/になります。)
- /home/yamamoto/public\_html/sns/
├ config.inc.php
├ index.php
...
URLは、http://localhost/~yamamoto/sns/でアクセスできるようにします。
環境に合わせて読み替えてください。
public_htmlディレクトリの中にあるconfig.inc.phpを編集します。
define('OPENPNE_DIR', realpath('../'));
この行をブラウザからアクセスできない場所に設置したOPENPNE_DIRのパスを指定します。
絶対パス、相対パスのどちらでも指定できます。
define('OPENPNE_DIR', realpath('/home/yamamoto/OpenPNE/'));
ディレクトリのアクセス権の設定
ディレクトリのアクセス権を次のように設定します。
- OPENPNE_DIR
├ var
│ ├ img_cache
│ │ ├ gif [777]
│ │ │ ├ w_h [777]
│ │ │ ... [777]
│ │ ├ jpg [777]
│ │ │ ├ w_h [777]
│ │ │ ... [777]
│ │ └ png [777]
│ │ ├ w_h [777]
│ │ ... [777]
│ ├ log [777]
│ ├ rss_cache [777]
│ ├ templates_c [777]
│ └ tmp [777]
アクセス権を設定するには、次のコマンドを実行します。
chmod -R 0777 var/*
config.phpの設定
OPENPNE_DIRディレクトリにあるconfig.php.sampleをconfig.phpにコピーします。
- OPENPNE_DIR
├ config.php
├ config.php.sample
コピーしたconfig.phpを環境に合わせて編集します。
URLの設定
// Web上の絶対パス(URL)(最後にスラッシュを付けてください)
define('OPENPNE_URL', 'http://sns.example.com/');
この行では、public_htmlディレクトリのURLを設定します。絶対パスで指定し、最後に/をつけます。
// Web上の絶対パス(URL)(最後にスラッシュを付けてください)
define('OPENPNE_URL', 'http://localhost/~yamamoto/sns/');
DB暗号化キーの設定
// DB暗号化キー(56バイト以内のASCII文字列)
define('ENCRYPT_KEY', '');
この行では、メンバーのログイン情報を暗号化する際に使用するキーを設定します。 他人に推測されにくい文字列にします。
// DB暗号化キー(56バイト以内のASCII文字列)
define('ENCRYPT_KEY', 'abcdefg');
メールサーバードメインの設定
// メールサーバードメイン
// 携帯メール投稿の宛先などのドメイン名に使われる
define('MAIL_SERVER_DOMAIN', 'mail.example.com');
この行では、携帯版でメール投稿をする場合に使用するメールサーバのドメイン名を設定します。
今回は、携帯版は使用しないのでパス。
データベース関連の設定
// DBサーバ設定
$GLOBALS['_OPENPNE_DSN_LIST']['main'] = array(
'dsn' => array(
'phptype' => 'mysql',
'username' => '',
'password' => '',
'hostspec' => 'localhost',
'database' => '',
'new_link' => false,
),
);
この部分は、データベースの設定を行います。
MySQLの設定は、データベースを「openpne_db」、ユーザー名を「openpne_user」、ユーザーのパスワードを「openpne_pass」とします。
データベースのユーザー名を設定します。
'username' => 'openpne_user',
データベースのユーザーのパスワードを設定します。
'password' => 'openpne_pass',
使用するデータベースの名前を設定します。
'database' => 'openpne_db',
データベースの設定
MySQLにデータベースを作成します。
mysqladmin -uroot -p create --default-character-set=utf8 openpne_db
MySQLのバージョンが4.0以下の時は、--default-character-set=utf8 は不要です。
mysqladmin -uroot -p create openpne_db
MySQLのユーザーを作成する。
mysql -uroot -p
GRANT ALL PRIVILEGES ON openpne_db.* TO openpne_user@localhost IDENTIFIED BY 'openpne_pass';
OpenPNEセットアップ用SQL実行
cd setup/sql/mysql41/install/ (MySQLのバージョンが4.1以上の時。4.0以下の時はcd setup/sql/mysql40/install/)
mysql -uopenpne_user -popenpne_pass --default-character-set=utf8 openpne_db < install-2.8-create_tables.sql
mysql -uopenpne_user -popenpne_pass --default-character-set=utf8 openpne_db < install-2.8-insert_data.sql
cd ../option/
mysql -uopenpne_user -popenpne_pass --default-character-set=utf8 openpne_db < pnebiz-header.sql
メールサーバーの設定
今回は携帯版を使用しないのでパス。
セットアップモジュールの実行
config.phpのOPENPNE_URLで設定したURLに「?m=setup」をつけてアクセスします。
(例)
http://localhost/~yamamoto/sns/?m=setup
OpenPNEセットアップ画面が表示されます。
各項目を入力します。
「セットアップが完了しました。」と表示されたら、インストールは完了です。
OpenPNE2.8の設定で、招待制からオープン制に変更した。
これで、参加者の招待なしでも登録できるようになるはずだが、どこから登録できるのかわからない。
調べてみると、「OpenPNE オープン制で新規登録ボタンが無い」のページを発見。
解決方法は、public_html/skin/ディレクトリにある「skin_login_open.jpg」を「skin_login.jpg」に変更すること。
確かに、これでログイン画面に「新規登録」ボタンが表示されるようになった。
しかし、この対応はあまりスマートではないように思う。これが正式な方法なのだろうか?
ソースコードを追いかけてみることにする。
おそらく、このログイン画面で「skin_login.jpg」をよんでいるのが、OPENPNE_DIR/webapp/modules/pc/templates/o_login.tplの次の個所。
<img src="({t_img_url_skin filename=skin_login})" class="bg">
ここの「t_img_url_skin」というのは、PHPのテンプレートエンジンである「Smarty」のプラグイン機能で、実体は OpenPNE_DIR/webadd/lib/smarty_plugins/function.t_img_url_skin.php かな?
(Smartyについては全然知らないので、あまり自信がない。)
function.t_img_url_skin.phpでは、引数filenameと「c_skin_filename」テーブルのskinnameフィールドが一致するレコードがないとき、引数filenameに適当な拡張子(filenameがskin_から始まれば「jpg」を、それ以外の場合は「gif」)をつけて返す。
一致するレコードがある場合は、OPENPNE_IMG_CACHE_PUBLICの設定で処理が別れる。
OPENPNE_IMG_CACHE_PUBLICは、OPNPNE_DIR/config.phpで設定している。
初期値はfalse。
OPENPNE_IMG_CACHE_PUBLICがfalseの場合は、「img_skin.php?filename=引数のfilename」になる。
以上から、「c_skin_filename」テーブルに該当するレコードがないために、SNS設定の招待制/オープン制にかかわらず、常に「skin_login.jpg」になってしまっている。
期待される正しい動作は、「c_skin_filename」テーブルに該当するレコードがあり、「<img src="OpenPNEのURL/img_skin.php?filename=skin_login)" class="bg">」になることだろう。
きっと、SNS設定画面で「設定変更する」ボタンを押したとき、「c_skin_filename」テーブルを更新するようにすれば、正しい動作になると思われる。
この続きは「 OpenPNE2.8でオープン制にしても新規登録ボタンが表示されない問題について(解決)」です。
OpenPNE2.8の設定で、招待制からオープン制に変更した。
これで、参加者の招待なしでも登録できるようになるはずだが、どこから登録できるのかわからない。
調査結果。
管理画面の「SNS設定」→「スキン画像変更」で、ログイン画面の画像を「skin_login_open.jpg」に変更する。
これで、トップ画面に「新規登録」ボタンが表示されるようになる。
結局、管理画面の「SNS設定」→「SNS設定」で「招待制/オープン制」を変更するだけではダメだということ。
JAVAのインストール
「JDK 5.0 Update 12」のダウンロードを選択する。
「Accept License Agreement 」をチェックする。
「Download Now! Linux self-extracting file」を選択する。
ダウンロードが始まる。
ダウンロードしたファイルを展開する。
$ chmod 544 jdk-1_5_0_12-linux-i586.bin
$ ./jdk-1_5_0_12-linux-i586.bin
動作確認
$ jdk1.5.0_12/bin/java -version
java version "1.5.0_12"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_12-b04)
Java HotSpot(TM) Client VM (build 1.5.0_12-b04, mixed mode, sharing)
Eclipseのインストール
「Eclipse SDK 3.2.2」を選択する。
適当なサーバーを選んで、ダウンロードする。
ダウンロードしたファイルを展開する。
$ tar xzvf eclipse-SDK-3.2.2-linux-gtk.tar.gz
Eclipseを展開してできてディレクトリの中に、JDKをディレクトリ名「jre」にして移動する。
$ mv jdk1.5.0_12 eclipse/jre
Eclipseを実行する
$ cd eclipse
$ ./eclipse
Eclipseの日本語化
Eclipse Project Downloads のページのページ下部にある「Language Packs」からバージョンにあったBuild Name(3.2.1_Language_Packs)を選択する。
「SDK Language Packs」から「NLpack1-eclipse-SDK-3.2.1-gtk.zip」を選択する。
適当なサーバーを選択すると、ダウンロードが始まる。
$ unzip NLpack1-eclipse-SDK-3.2.1-gtk.zip
展開してできたディレクトリをEclipseのディレクトリにコピーする。
PHPの統合開発環境雑感。
PHPeclipseは、無料だけどインストールが面倒。VS.Phpは、有料だけどインストールは簡単。
がんばってPHPeclipseをインストールするか、手短にVS.Phpを購入するか。
Delphi for PHPは、ビジュアルな開発環境を提供する魅力的なツールだが、日本語対応に問題がある。
次のバージョンアップに期待したい。
(備考)Delphi for PHP Update 1で、エディタはUTF-8で日本語に対応しているみたい。
長所
短所
総評
長所
短所
総評
長所
短所
総評
毎週恒例のブログの目次を更新しました。
新しく日比野さんのブログ「ミナミを往く ~4JHから愛を込めて」の目次を作成しました。
日比野さんからなんだかよくわからないけどすばらしい誉め言葉をいただきました。
ありがとうございます。
Beltaの大人の効果的な学習方法の目次を更新しました。
山陰のたべもの屋さんの目次を更新しました。
RubyのprotectedはJavaやC++とは違うことは、意外と知られていないようです。
Ruby の protected は Java, C++ とは意味が違います。 Ruby の protected を使うと、サブクラスのインスタンスが「オブジェクトの外から」メソッドを呼べるようになります。
ということで、例として次のコードが示されています。
class A
def m
puts "OK"
end
protected :m
def call_m(a)
a.m
end
end
A.new.call_m(A.new) # これは大丈夫
A.new.m # これはダメ
このコードを見ると一目瞭然ですね。
参考
追記
ちなみに、privateもJavaやC++とは意味が違います。
Rubyでは関数形式(レシーバを省略した形)でしか呼び出すことのできないメソッドのことをprivateなメソッドと呼んでいます。C++やJavaのprivateとは意味が違うので注意してください。
ということで、Rubyではprivateに指定したメソッドをサブクラスから呼び出すことができます。
フレームワークを使っていると、知らないうちに基底クラスのメソッドをオーバーライドしてしまい、予期せぬバグに悩まされたりします。
毎週恒例のブログの目次を更新しました。
Beltaの大人の効果的な学習方法の目次を更新しました。
山陰のたべもの屋さんの目次を更新しました。
「ミナミを往く ~4JHから愛を込めて」の目次更新しました。
目次は、拙作のブログ目次作成ソフト Blomokuで作っています。
このソフトもいろいろと手を加えたいと思っています。
グラスに入ったハサミ、ボールペン、万年筆。
難しかった。
ラミー20004色ボールペン。
一目でわかりますよね。
Ruby on Rails 1.1.6で作成したアプリケーションをRuby on Rails 1.2.3で動かすと、いくつかの警告が出たので修正作業を行った。
変更箇所は、
<%= start_form_tag %>
<%= end_form_tag %>
を
<% form_tag do %>
<% end %>
に書き直す。
Ruby on Railsの開発チームがこの変更を行った気持ちもわかる。
何といっても「end_form_tag」が気持ち悪い。
「end_form_tag」は</form>でも良く、</form>の方がタイプ数が少ない。
しかし、だからといって、
<%= start_form_tag %>
</form>
も受け入れがたい。
しかし、新しい「form_tag do ~ end」も良いかといわれると微妙なところ。
「do ~ end」の距離が離れると、対応がわかりにくくなる。
「start_form_tag ~ end_form_tag」の方が対応がわかりやすかった。
もう一つの変更箇所は、
Model.count(["priority=?", 1])
を
Model.count(:conditions => ["priority=?", 1])
に変更。
タイプ数が増えているけど、見やすさを重視したのかな。
第二言語習得研究とは、外国語をどのような仕組みで習得していくかを研究する学問。
その研究の成果を元に、英語学習の俗説を検証します。
後半の脳科学からのアプローチも興味深い話です。
英語は右脳で学ぶ?
英語を習得できるのは15歳まで?
ホントかウソか。
【検証8】「多読で英語力は伸びる」のか?
(1) 辞書を引くことなく、書物をいくらたくさん読んでも、読むスピードは向上するだろうが、語彙力が増加したり、文法能力が高まったり、発音能力が良くなったりはしない。
この2つのルールに従い、たくさんの本を読むことが多読です。
残念ながら、この方法では語彙力が増えにくいことが研究でわかっているようです。
ただし、知らない単語の意味を類推しながら読み進めると、3倍から4倍の割合で単語を学習できます。
【検証17】「第二言語学習は幼少期から始めないと遅すぎる」のか?
(1) 第二言語習得環境で、母語話者と変わらないレベルの言語(文法)能力を全員が身につけるためには、7歳ぐらいまでに言語取得を開始する必要がある。 (3) 学習開始年齢が高くなるほど、個人によって到達度に差違が生じる。
興味深いのは、研究結果で成人グループの中にも母語話者グループのレベルに到達している人がいる、ということ。
8歳以上だからといって、あきらめるのはまだ早い。
【検証19】「幼い内なら日本人でも/l/と/r/を聞き分けられる」のか?
英語のできない日本人成人は、/l/-/r/を意識的には区別できないものの、潜在的にはその音声対立を区別する能力を持っているのです。その能力が、音声言語を聞き分ける時に使われていないだけのようです。
訓練をすれば、成人でも聞き取れるようになる可能性が高いようです。
【検証22】「『英語耳』や『日本語耳』という区別はある」のか?
「イギリス英語は2000ヘルツから12000ヘルツ、日本語は125ヘルツから1500ヘルツ以下の周波数。
日本語の低周波数言語に長い間触れていると、高周波数言語である英語を聞き取ることができなくなる。」
というのは、間違いのようです。少なくとも、脳内では聞き取ることができています。
【検証23】「英語は『右脳』で学習する」のか?
英語は右脳のみでは学習できません。当たり前の結論でした。 右脳ブームの行き過ぎた問題だと思いました。
(ii) 「2倍速や3倍速で英語を聞いて効果はある」のか
理解できない場合は、効果はありません。脳内では言葉ではなくただの音として処理しています。
理解可能な音の連続を聞いた場合にのみ、そうはそれを言葉として認識します。
C++の設計と進化を読んで。
感動した。
Lambda x;
list<int>::iterator p = find_if(lst.begin(), lst.end(), x < 7);
で、Lambdaクラスが、こんな感じ。
(ちょっと編集しています。もっと上手に書けないかな。)
class Lambda{};
template<class T> binder1st<greater<T> > operator<(Lambda, const T& v)
{
return bind1st(greater<T>(), v);
}
これも、C++の設計と進化を読んで知った。
cross-castと言うらしい。
class Robot {...};
class Human {...};
class Android : public Robot, public Human {...};
Robot* pr;
Human* ph = dynamic_cast<Human*>(pr);
これ、JavaやC#でできるの?
これも、C++の設計と進化を読んで知った。
C++では、オーバライド関数の返値は、ベースクラスの関数と正確に一致しなくても良い。
BがDのアクセス可能なベースクラスであるときには、B*をD*で、そしてB&をD&でオーバライドできるようにした。
class B {
virtual B* clone() { return new B(*this); }
};
class D : public B {
D* clone() { return new D(*this); }
};