smarty install のメモやらログやらっぽいもの

安定版の最新ファイル探してくる

Smarty - Downloads
ここから落としてきましょう。


今回は、

http://www.smarty.net/do_download.php?download_file=Smarty-2.6.26.tar.gz

これ使った。
stableだったので。

install

参考にしたのはここ、
PHP Evo Smartyのインストール
お世話になりましたm(_ _)m

cd /tmp/
wget http://www.smarty.net/do_download.php?download_file=Smarty-2.6.26.tar.gz
tar zxvf Smarty-2.6.26.tar.gz
cd Smarty
mv libs /usr/local/lib/php/Smarty

ま、解凍するだけです。

Smartyphpが認識するようにpath通す

方法は何個かあるらしい。
Smarty
こちらで4つの方法が書いてある

  • 手動で SMARTY_DIR 定数を定義する
  • ライブラリファイルの絶対パスを指定する
  • php.ini ファイルにライブラリへのパスを追加する
  • PHP スクリプト内での ini_set() によるインクルードパスの追加

今回は、

  • php.ini ファイルにライブラリへのパスを追加する

で対応しました

vi /usr/local/lib/php.ini
include_path = ".:/usr/local/lib/php:/usr/local/lib/php/Smarty"
apache restart
test
<?php
require_once('Smarty.class.php');
$smarty = new Smarty();
?>

こんなファイル作って、適当にみてみる。
エラーでなければ、path通ってる
エラーになったら、【Smartyphpが認識するようにpath通す】をもう一度見直す。
他の方法も試してみたり。

smarty を使ってみる

Smarty は、デフォルトで templates/、 templates_c/、configs/ および cache/ と名づけられた4つのディレクトリが必要です。
・これらの名前は、それぞれ Smarty クラスのプロパティ $template_dir、 $compile_dir、 $config_dir および $cache_dir で定義することができます。
Smarty を使用する各アプリケーションにおいて、 これらのディレクトリを個別に設置する事を強く推奨します。

らしい
ここは素直に従う。

mkdir smarty_test
cd smarty_test

一個、テスト用のDir掘って

mkdir templates
mkdir templates_c
mkdir configs
mkdir cache
mkdir htdocs

※注意

Smarty は $compile_dir と $cache_dir (templates_c/ と cache/) に 書き込み権限 でアクセスする必要があるので、 web サーバのユーザがこれらに書き込める必要があります

らしい。
なので、templates_c/ と cache/ は chmod 770 と、ユーザ名とグループ名の変更をしておく。
ユーザ名とグループ名は apache を利用する場合は、httpd.conf に書いてあるので、それをみて chownする。
smarty作成ユーザと apache のユーザが一緒なら(自分だけのテスト環境とか?)、変える必要はないかな。


できた階層構造はこんな感じ

/var/www/smarty_test/
            templates/
                index.tpl
            templates_c/
            configs/
            cache/
            htdocs/
                index.php

htdocsというDirを掘ったのは、下記のような理由があるらしい。

あなたは web サーバのドキュメントルートの位置を知っている必要があります。 例ではドキュメントルートは /web/www.example.com/guestbook/htdocs/ とします。Smarty ディレクトリは Smarty ライブラリによってのみアクセスされ、 web ブラウザから直接アクセスされる事はありません。 したがってセキュリティの心配を避けるために、 これらのディレクトリをドキュメントルートの 外部 に配置する事を推奨します (ただし必須ではありません)。

とのこと。
つまり、webブラウザでURL直打って、index.tplファイルとか見られちゃまずいから、rootDirの外におきましょう、って事らしい。
なるほど。

templates/index.tpl

中身はとりあえず簡単に、

{* Smarty *}
こんにちは、{$name}。ようこそ Smarty へ!

こんな感じ。

{*  *}

smartyのコメントアウト記法らしい。
こう書けば、smartyファイルって分かりやすいから、習慣つけとけよー、って書いてあったので書いてみる。

htdocs/index.php

実際にwebブラウザから叩くであろうファイルは、こんな感じ

<?php
require_once('Smarty.class.php');
$smarty = new Smarty();

#まぁ、絶対パスで書いた方がいいかも
$smarty->template_dir = '../templates/';
$smarty->compile_dir  = '../templates_c/';
$smarty->config_dir   = '../configs/';
$smarty->cache_dir    = '../cache/';

$smarty->assign('name','Ryoff');#nameという名前でRyoffという値を送る
$smarty->display('index.tpl');#テンプレ指定
?>
結果

こんにちは、Ryoff。ようこそ Smarty へ!

で、成功

CentOS でキーボードがusになった場合の対処

困ったことが起きた。
ある日突然、キーボードがusとして認識されてしまった。


具体的な症状としては以下のようなもの

  • ダブルクォートを打とうとして、Shift+2 = @
  • vi閉じようとして、:を打とうとするが、見つからず・・
  • キーボード設定だろうと思い、キーボードレイアウト【日本語】を選択すると、すべてが全角カタカナしか入力できず


しばらく我慢しようかとも思ったが、イライラが止まらないので調べることに。

二か所確認

/etc/sysconfig/keyboard

KEYTABLE="jp106"  # USになってたら訂正

/etc/X11/xorg.conf

Option "XkbModel" "jp106"  # pc105とかになってたら訂正
Option "XkbLayout" "jp"   # usになってたら訂正

どうやらこれ、GNOMEのキーボード設定が何故か英語になった時に起こる模様。
しかも、GNOME画面から修正しても治らないという罠。


再起動後、「XとGNOMEのキーボード設定違うけど、どうすんの??」的なアラートがでたら、Xを選択すれば治った。


ふぅ

mysqld_multiを使い、MySQLを複数起動して、Master-Slave構成でReplicationを取るまで

経緯

一つの開発用サーバでmysqlのreplicationを利用したscriptを作成しなくてはならなくなり、戦友:id:maroekunから教えてもらった mysqld_multiを利用してみることにした。

mysqld_multiとは

MySQL MySQL 4.1 リファレンスマニュアル 4.8.3 mysqld_multi(複数の MySQL サーバを管理するプログラム)

mysqld_multi は、さまざまな Unix ソケットおよび TCP/IP ポートをリッスンする複数の mysqld プロセスを管理するためのプログラムです。

ようは、一つのmysqld で複数プロセスを立ち上げることができます。

もちろん、複数プロセス間でreplicationを取ることも可能です。

設定

/etc/my.cnf
の設定はこんな感じです

[mysqld_multi]
mysqld     = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin

[mysqld]
default-character-set = utf8
user=mysql

[mysqld1]
server-id = 1
port      = 3306
datadir   = /data/var/lib/mysql
socket    = /var/lib/mysql/mysql.sock
pid-file  = /var/run/mysqld/mysqld.pid

[mysqld2]
server-id = 2
port      = 3307                       <= netstat で使われていないportであることを確認しましょう
datadir   = /var/db_multi/db           <= 自分で理解しやすい名前なら、どこに作ってもいいです
socket    = /var/db_multi/mysql.sock
pid-file  = /var/db_multi/mysqld.pid

同時起動したい数だけ、[mysqld*]を追加しましょう。
共通の設定項目は、[mysqld]にかけばおk。
[mysqld_multi]には、mysqld_safeとmysqladminを記載。


※[mysqld1]は既に設定済みで稼動していたので、[mysqld2]の設定をします

dir作っておきましょう。

mkdir -P /var/db_multi/db


mysqlユーザにして

chown mysql:mysql /var/db_multi/


datadirの初期化ー

mysql_install_db --datadir=/var/db_multi/db --user=mysql
起動
mysqld_multi start 1,2
  もしくは
mysqld_multi start 1-2

で起動します

mysqld_multi report

叩けば

Reporting MySQL servers
MySQL server from group: mysqld1 is running
MySQL server from group: mysqld2 is running

こんな風に複数起動が確認できるはず。

ps aux | grep mysql

でも確認できるかな

使ってみる

[mysqld1]を Master として利用し、
[mysqld2]を Slave として利用してみます。


これらはPort番号で区別できるので、Portを指定してmysqlコマンドを実行します

Masterへ

mysql -u user_name -P 3306 -h 127.0.0.1

Slaveへ

mysql -u user_name -P 3307 -h 127.0.0.1

-h 127.0.0.1 をかかないとSlaveにログインできないのでご注意を

Replication

ここから、Replication設定。
とはいっても、普通のReplication設定と同じです。
mysqld_multiだからといって、特別な意識はいらないです。

1./etc/my.cnfに追加

/etc/my.cnf

[mysqld1]
server-id = 1
port      = 3306
datadir   = /data/var/lib/mysql
socket    = /var/lib/mysql/mysql.sock
pid-file  = /var/run/mysqld/mysqld.pid
sync_binlog=1
log-bin=mysql-bin
log-bin-index=mysql-bin
relay-log=relay-bin
relay-log-index=relay-bin

[mysqld2]
server-id = 2
port      = 3307
datadir   = /var/db_multi/db/
socket    = /var/db_multi/mysql.sock
pid-file  = /var/db_multi/mysqld.pid
read_only
log-slave-updates
log-bin=mysql-bin
log-bin-index=mysql-bin
relay-log=relay-bin
relay-log-index=relay-bin

このように、binlogの設定など、Replicationの準備をします。

2.Replication用Userの作成

Master側に、Replication用のUserを作っておきましょう

mysql> GRANT REPLICATION SLAVE ON *.* TO
   repl@10.0.0.0 IDENTIFIED BY 'password';

ユーザ名は、【repl】である必要はありません。
接続元IPは、MasterとSlaveは同じなので、普通にサーバIPをかけば問題ありません。

3.Masterデータの更新lock

データをslaveに移すので、masterの更新をlockします

mysql> FLUSH TABLES WITH READ LOCK;
4.logのposiの確認

Masterで【show master status】を実行します

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |  2283327 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.10 sec)

[File]と[Position]をメモしましょう。
あとで使います。

5.データのコピー

では、lockしたまま、MasterデータをSlaveに移しましょう

cp -aR /data/var/lib/mysql/* /var/db_multi/db/
6.masterのunlock

ここまできたら、Masterの更新Lockを戻してあげましょう

mysql> UNLOCK TABLES;
7.Slave側でReplicationのためのパラメータ設定
mysql> CHANGE MASTER TO
        MASTER_HOST='10.0.0.0',             <=今回はMasterもSlaveも同一サーバなので自分のIP
        MASTER_USER='repl',                 <=2で作ったUser名
        MASTER_PASSWORD='password',         
        MASTER_LOG_FILE='mysql-bin.000003', <=4で記録した[File]名
        MASTER_LOG_POS=2283327 ;            <=4で記録した[Position]
8.Replication start
mysql> start slave;


起動したかどうかは、

mysql> show slave status;

で確かめましょう。

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

であれば正常に動いています。


もし、
[IO_Running]だけが No の場合は、Replicationがうまく設定できていない可能性が、
[SQL_Running]だけが No の場合は、何らかのSQLによりReplicationエラーになっている可能性が高いです

何番煎じだ。iPhone での位置情報取得javascriptのメモ

iPhoneの位置情報取得について調べる機会があったので、メモしておく。

iPhone OS 3.0 のsafariで、GPSが取得できるようになった。

とのこと。

さっそく、取得するコードを書いてみましょう。


iPhoneの位置情報取得コードは、日本のガラケーみたいに、変なタグを書く必要はないです。

W3C準拠のAPIを使用する

世界標準で用意されているといいですね。
W3C の Geolocation API の仕様に準拠してます。

navigator.geolocation.watchPosition() を使う

※サンプル

function getLocation(pos) { 
    console.log("lat : " + pos.coords.latitude + "long : " + pos.coords.longitude + "accuracy : " + pos.coords.accuracy);
}
 
function catchErr(a) {
    console.log(" error: " + a.code);
 
}
 
var init = function(){
   navigator.geolocation.watchPosition(getLocation, catchErr)
};

init();

navigator.geolocation.watchPosition(getLocation, catchErr)

この一行で位置情報とってこれます。
watchPosition は現在の位置情報を連続取得し続けるメソッドですね。


このメソッドの callback 関数の引数(今回の場合は、"pos")に、位置情報が入ってきます。



ちなみにこのメソッドは連続して呼ばれるので、もし地図などを表示したい場合は、

初回呼び出しのみ地図表示

のような処理を書かないと、地図が永遠に生成され続けます。



数回位置情報を取得して、不正対策や位置補正なんかもできるかな。


経路探索やその他色々な使い道がありそう。

初めてのruby 基本〜配列

初めてのrubyです。


自分用メモ

前提

全てオブジェクト
p "test".class    #=>Stringクラス
p 1.class         #=>Fixnumクラス
p 1.class.class   #=>Classクラス
p関数は開発時に変数内部見るのに便利
代入演算子は毎回オブジェクトを作る。
1: a = 1
2: a = 1
  • 1と2のaは別のオブジェクト。
1: a = "test"
2: p a.object_id    #=>-604044008
3: a = "test"
4: p a.object_id    #=>-604044028

こうすれば分かる。
object_idは別。

実行時に評価される
def hoge
  p "hoge"
end
hoge

これはOK

fuga
def fuga
  p "fuga"
end

これはエラー

1.8系と1.9系は相当違うらしい
RubyGemsを RubyGames に空目していたのはいい思い出

配列

リテラルは、[]
a = ["a",1,3]
添え字でも入力可能
  • 範囲外の添え字も自動生成される
a = [1,2]
a[2] = 3
a[4] = 5
p a          #=>[1, 2, 3, nil, 5]
  • 添え字の範囲指定もできる
a = [1,2]
a[0] = 3
a[4] = "4"
a[0,3] = 'a', 'b', 'c'
p a          #=>["a", "b", "c", nil, "4"]
マイナスの添え字も可能
a = [0,1,2,3,4,5]
p a[-1]      #=>5
p a[-3]      #=>3
添え字の範囲指定
  • [n..n]は末尾を含む
  • [n...n]は末尾を含まない
c = [0,1,2,3,4,5,6,7,8,9]
p c[0..3]         #=>[0, 1, 2, 3]
p c[0...3]        #=>[0, 1, 2]
p c[1...7]        #=>[1, 2, 3, 4, 5, 6]
p c[-2...2]       #=>[]
p c[-7...7]       #=>[3, 4, 5, 6]
配列のメソッド
  • length
  • size
  • *=
  • sort
  • include
  • uniq
a = [1,2,3,4]
p a.length          #=>4
p a.size            #=>4
p a *= 2            #=>[1, 2, 3, 4, 1, 2, 3, 4]
p a.sort            #=>[1, 1, 2, 2, 3, 3, 4, 4]
p a.include?(1)     #=>true
p a.uniq            #=>[1, 2, 3, 4]
p a                 #=>[1, 2, 3, 4, 1, 2, 3, 4]
a.uniq!             #元の配列を更新
p a                 #=>[1, 2, 3, 4]
配列のイテレータ
  • eachの使い方

do から end までが繰り返し。

hoge パイプに囲まれた文字列に配列要素が一つずつ入ってくる
a = ["Aaaa", "Bbbb", "Cccc"]
a.each do |item|
  print item + "\n"
end
  • 結果
Aaaa
Bbbb
Cccc
  • 配列の位置も利用したい場合
  • each_with_index
a.each_with_index do |item, index|
  p [item, index]
end
  • 結果
["Aaaa", 0]
["Bbbb", 1]
["Cccc", 2]
数字のsort
  • rubyのsort関数のデフォルトは文字によるソート
b = [1,2,3,99,20.9,"a","10"]
p b                                #=>[1, 2, 3, 99, 20.9, "a", "10"]
p b.sort{|x,y|x.to_i <=> y.to_i}   #=>["a", 1, 2, 3, "10", 20.9, 99]
selectメソッド
  • 要素内から真のものだけ取得する
c = [1,2,3,4,5,6,7,8,9,10]
p c.select{|cc|cc % 2 == 0}     #=>[2, 4, 6, 8, 10]