Garey's Blog–FreeBSD/PHP/GoLang

十二月 22nd, 2009

Linux下Tomcat整合Apache安装笔记

No Comments, Linux, by garey, 4,451 views.

1,下载所需安装文件
httpd-2.2.14.tar.gz
apache-tomcat-6.0.20.tar.gz
tomcat-connectors-1.2.28-src.tar.gz
jdk-6u17-linux-i586.bin

2,安装apache
tar xzvf httpd-2.2.14.tar.gz
cd httpd-2.2.14
./configure –prefix=/usr/local/apache2 –enable-so
make
make install

3,安装tomcat
tar xzvf apache-tomcat-5.5.12.tar.gz
mv apache-tomcat-5.5.12 /usr/local/tomcat

4,编译生成mod_jk
tar xzvf tomcat-connectors-1.2.28-src.tar.gz
cd cd tomcat-connectors-1.2.28-src/native/
./configure –with-apxs=/usr/local/apache2/bin/apxs
make
cp ./apache-2.0/mod_jk.so /usr/local/apache2/modules/

cd /usr/local/apache2/conf
vi mod_jk.conf
# 指出mod_jk模块工作所需要的工作文件workers.properties的位置

JkWorkersFile /usr/local/apache2/conf/workers.properties

# Where to put jk logs

JkLogFile /usr/local/apache2/logs/mod_jk.log

# Set the jk log level [debug/error/info]

JkLogLevel info

# Select the log format

JkLogStampFormat “[%a %b %d %H:%M:%S %Y]”

# JkOptions indicate to send SSL KEY SIZE,

JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat set the request format

JkRequestLogFormat “%w %V %T”

# 将所有servlet 和jsp请求通过ajp13的协议送给Tomcat,让Tomcat来处理

JkMount /servlet/* worker1

JkMount /* worker1

vi workers.properties
# Defining a worker named worker1 and of type ajp13

worker.list=worker1

# Set properties for worker1

worker.worker1.type=ajp13

worker.worker1.host=localhost

worker.worker1.port=8009

worker.worker1.lbfactor=50

worker.worker1.cachesize=10

worker.worker1.cache_timeout=600

worker.worker1.socket_keepalive=1

worker.worker1.socket_timeout=300

vi httpd.conf
修改:
DocumentRoot “/var/www”
<Directory “/var/www”>
    Options Includes FollowSymLinks
        AllowOverride None
        Order deny,allow
        Allow from all
        XBitHack on
</Directory>
<Directory “/var/www/WEB-INF”>    
        Order deny,allow
        Deny from all
</Directory>

修改:
    DirectoryIndex index.jsp index.html

新增:
    LoadModule jk_module modules/mod_jk.so

  Include /usr/local/apache2/conf/mod_jk.conf

最后编辑Tomcat的配置文件server.xml,在HOST段中加入:

<Context path=”" docBase=”/var/www” debug=”0″ reloadable=”true” crossContext=”true”/>

5,java环境设置
./jdk-6u17-linux-i586.bin
mv jdk1.6.0_17 /usr/local/.

vi /usr/local/tomcat/bin/start.sh
#!/bin/sh
#set java environment
JAVA_HOME=/usr/local/jdk1.6.0_17
CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export JAVA_HOME CLASSPATH PATH
/usr/local/tomcat/bin/catalina.sh start

vi /usr/local/tomcat/bin/stop.sh
#!/bin/sh
#set java environment
JAVA_HOME=/usr/local/jdk1.6.0_17
CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export JAVA_HOME CLASSPATH PATH
/usr/local/tomcat/bin/catalina.sh stop

chmod 744 start.sh stop.sh

6,运行apache,tomcat
/usr/local/apache2/bin/apachectl start
/usr/local/tomcat/bin/start.sh

7,测试
cd /var/wwwroot
vi index.jsp
<html>
<title>
test jsp
</title>
<%
   String showMessage=”Hello World!”;
   out.print(showMessage);
%>
</html>

访问:http://127.0.0.1

十二月 20th, 2009

FreeBSD下wordpress编辑工具Drivel

No Comments, FreeBSD, by garey, 3,052 views.

终于找到一款FreeBSD下的wordpress编辑工具:Drivel

drivel

十二月 17th, 2009

FreeBSD下PHP编辑器NetBeans

No Comments, FreeBSD, by garey, 3,772 views.

终于找到一款FreeBSD下的PHP编辑器NetBeans,并且安装成功。

netbeans

十二月 16th, 2009

gnome2 2.28有Bug?

4 Comments, FreeBSD, by garey, 6,516 views.

我把ports更新到最新,安装的gnome2登录界面没有登录框,不知道怎么回事

FreeBSD的版本是8.0-RELEASE-p1,升级后的gnome2的版本是2.28.1,之前装gnome2没有这个问题的,难道是这个版本的Bug?

12162009077

十二月 16th, 2009

itouch发日志

1 Comment, 未分类, by garey, 5,634 views.

用itouch发篇文章试试…

十二月 15th, 2009

[转]PHP中——PDO的使用

No Comments, PHP, by garey, 4,409 views.

PHP 5.1 发布时附带一个全新的数据库连接层PDO(PHP Data Objects)。它与ADODB和Pear DB等数据库抽象层不同,它提供的是如何存取数据库和处理查询结果,效率也更高,还可以通过预处理语句来防止sql注入。
目前支持的数据库:
• DBLIB: FreeTDS / Microsoft SQL Server / Sybase
• Firebird (http://firebird.sourceforge.net/): Firebird/Interbase 6
• MYSQL (http://www.mysql.com/): MySQL 3.x/4.x
• OCI (http://www.oracle.com): Oracle Call Interface
• ODBC: ODBC v3 (IBM DB2 and unixODBC)
• PGSQL (http://www.postgresql.org/): PostgreSQL
• SQLITE (http://www.postgresql.org/): SQLite 3 and SQLite 2
1. 连接数据库
PDO提供了统一的接口:PDO对象。
$db=new PDO(
“driver_name:dbname=db_name;host=hostname/IP;[charset=char_type]“,   //(1)连接字符串
“db_username”,  //(2)db用户名
“db_password”   //(3)db密码
);
说明,PDO有三个参数
(1)连接字符串:
driver_name是使用的PDO驱动,可以为:mysql, mssql, sybase, dblib, firebird, oci, odbc, pgsql, sqlite, sqlite2;
db_name是数据库名称;
hostname/IP是指要连接到哪里,如果是本地则为localhost。
[charset=char_type]是可选的,用来设置字符类型。
(2)db用户名
(3)db密码
example:
$db = new PDO(
“pgsql:dbname=pdo;host=localhost;charset=utf-8″,
“postgres8″,
“postgres8″
);
echo “Successfully created a PDO object”;
?>
连接之前,应先确认已经加载了PDO模块。如果试图处理一个无效的连接字符串:
$db = new PDO(
“this_is_not_a_pdo_module:dbname=pdo;host=localhost”,
“foo”,
“bar”
);
echo “Successfully created a PDO object”;
?>
PHP将会返回以下错误:
Fatal error: Uncaught exception ‘PDOException’ with message ‘could not find driver’
所以,我们可以用一种优雅的方式来处理,即抛出PDO异常来处理错误(但并不是所有情况都是)。
try
{
$db = new PDO(
“this_is_not_a_pdo_modul:dbname=pdo;host=localhost”,
“postgres8″,
“postgres8″
);
}
catch( PDOException $e )
{
die( $e->getMessage() );
}
echo “Successfully created a PDO object”;
?>
我们会得到
could not find driver

SQLSTATE[HY000] [7] FATAL: database “pdo2″ does not exist
如果数据库不存在(不同的错误会返回不同的提示信息)。
2. 设置属性
1) PDO有三种错误处理方式:
• PDO::ERRMODE_SILENT不显示错误信息,只设置错误码
• PDO::ERRMODE_WARNING显示警告错
• PDO::ERRMODE_EXCEPTION抛出异常
可通过以下语句来设置错误处理方式为抛出异常
$db->setAttribute(PDO::ATTR_ERRMODE, );
example:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
当设置为PDO::ERRMODE_SILENT时可以通过调用errorCode() 或errorInfo()来获得错误信息,当然其他情
况下也可以。
2) 因为不同数据库对返回的字段名称大小写处理不同,所以PDO提供了PDO::ATTR_CASE设置项(包括
PDO::CASE_LOWER,PDO::CASE_NATURAL,PDO::CASE_UPPER),来确定返回的字段名称的大小写。
3) 通过设置PDO::ATTR_ORACLE_NULLS类型(包括PDO::NULL_NATURAL,PDO::NULL_EMPTY_STRING,
PDO::NULL_TO_STRING)来指定数据库返回的NULL值在php中对应的数值。
3. 查询
为了说明清楚,我们这里定义了一个RSS feeds表
id integer
name character varying(100)
url varharacter varying(255)
feed character varying(255)
不使用预处理语句的方式:
$stmt=$db->query(“select * from feeds”);
while($f=$stmt->fetch()){
echo $f["id"].” “;
echo $f["name"].” “;
echo $f["url"].” “;
echo $f["feed"].”
“;
};
/*使用foreach 获取数据
foreach( $db->query( “SELECT * FROM feeds” ) as $row )
{
print_r( $row );
}
*/
?>
得到以下结果:
Array
(
[id] => 1
[0] => 1
[name] => Planet-PHP
[1] => Planet-PHP
[url] => http://www.planet-php.net
[2] => http://www.planet-php.net
[feed] => http://www.planet-php.net/rdf/
[3] => http://www.planet-php.net/rdf/
)
(只显示已行为了节省空间)
使用预处理语句的方式:
$stmt = $db->prepare( “SELECT * FROM feeds” );
$stmt->execute();
print_r( $stmt->fetch() );
?>
这里,$stmt是一个PDOStatement对象,预处理之后会得到这样一个对象,必须execute后才起作用。
fetch函数只提取了一行数据,如果需要读取全部数据,可换成fetchAll函数。
绑定数据
$stmt = $db->prepare( “SELECT * FROM feeds WHERE url = :url” );
$url = “http://www.planet-php.net”;
$stmt->bindParam( “:url”, $url );
$stmt->execute();
while( $row = $stmt->fetch() )
{
print_r( $row );
}
?>
这里,bindParam将$url变量绑定到了:url域,执行时会自动将改变量载入。
插入数据
$stmt = $db->prepare(
“INSERT INTO feeds
( name, url, feed )
VALUES
( :name, :url, :feed )”
);
$stmt->execute(
array(
“:name” => “Planeti Apache”,
“:url” => “http://www.planetapache.org”,
“:feed” => “http://www.planetapache.org/rss10.xml”
)
);
?>
实现插入数据也可以像绑定数据一样来quote数据,这里给出通过在execute中给定输入参数来自动quote
的方法。
事务处理
$dbh->beginTransaction();
try {
$dbh->query(“UPDATE …”);
$dbh->query(“UPDATE …”);
$dbh->commit();
} catch (Exception $e) {
$dbh->rollBack();
}
如果数据库支持事务处理,调用beginTransaction的同时将数据库设置为非自动提交,commit或rollBack
返回自动提交状态。
4. 存储过程
$stmt = $dbh->prepare(“CALL sp_set_string(?)”);
$stmt->bindParam(1, $str);
$str = ‘foo’;
$stmt->execute();
于先前的例子差不多,只是这里使用了“?”数据绑定方法,sp_set_string是存储过程名称。
带有输出参数的存储过程
$stmt = $dbh->prepare(“CALL sp_get_string(?)”);
$stmt->bindParam(1, $ret,PDO:ARAM_STR, 4000);
if ($stmt->execute()) {
echo “Got $retn”;
}
绑定列输出
$stmt = $dbh->prepare(“SELECT extension, name from CREDITS”);
if ($stmt->execute()) {
$stmt->bindColumn(‘extension’, $extension);
$stmt->bindColumn(‘name’, $name);
while ($stmt->fetch(PDO::FETCH_BOUND)) {
echo “Extension: $extensionn”;
echo “Author: $namen”;
}
}

十二月 15th, 2009

PHP5中的mysqli

No Comments, MySQL, PHP, by garey, 4,349 views.

php5提供了一种新的连接mysql的方式:mysqli。
但在网上搜索很久,没找到几个关于这个函数的中文解说,目前流行的php程序也还都是使用的mysql函数,只好自己摸索了。
先写个简单的Class,能够简单实现连接、查询,以后再慢慢完善它。

class class_mysql {
private $dbhost = ‘localhost’;
private $dbuser = ‘root’;
private $dbpasswd = ’123456′;
private $dbname = ‘testdb’;
private $link;
function __construct() {
$this->connect ();
}
function __destruct() {
$this->close ();
}
function connect(){
$this->link = new mysqli($this->dbhost, $this->dbuser, $this->dbpasswd, $this->dbname);
if (mysqli_connect_errno()) {
echo “Can’t connect to MySQL Server. Errorcode: “.mysqli_connect_error();
}
}
function query($query){
if($this->link !== false){
$mylink = $this->link;
if($result = $mylink->query($query)){
$query_result = true;
}
else {
$query_result = false;
}
}
else {
$query_result = false;
}
return $query_result;
}
function num_rows($query){
if($this->link !== false){
$mylink = $this->link;
if($result = $mylink->query($query)){
$query_result = $result->num_rows;
}
else {
$query_result = false;
}
}
else {
$query_result = false;
}
return $query_result;
}
function fetch_rows($query,&$row_num){
if($this->link !== false){
$mylink = $this->link;
if($result = $mylink->query($query)){
$row_num = $result->num_rows;
for ($i = 1; $i <= $row_num; $i++){
$query_result[$i] = $result->fetch_array(MYSQLI_ASSOC);
}
}
else {
$query_result = false;
}
}
else {
$query_result = false;
}
return $query_result;
}
function close(){
$this->link->close();
}
}

十二月 15th, 2009

FreeBSD 8.0 Gnome桌面安装笔记

3 Comments, FreeBSD, by garey, 8,404 views.

一,安装FreeBSD系统
安装系统并升级到8.0 release
编译内核,以便获得显卡,声卡,无线网卡等支持
我的电脑是IBM R52,编辑内核文件:
# ATI drives
device    drm
device    radeondrm
# Sound drives
device sound
device snd_ich
# Intel Wireless
device          iwi

编译内核,重启电脑

二、无线网卡设置
vi /boot/loader.conf
legal.intel_iwi.license_ack=1

vi /etc/rc.conf
wlans_iwi0=wlan0
ifconfig_wlan0=”ssid linksys wepmode on weptxkey 1 wepkey 1:0xFFFFFFFFFF DHCP”

三、升级ports
cp /usr/share/examples/cvsup/ports-supfile /root/.
csup -L 2 -h cvsup.cn.freebsd.org /root/ports-supfile

四、安装xorg
vi /etc/make.conf
MASTER_SITE_OVERRIDE=ftp://ftp.FreeBSDChina.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/
USE_LINUX_BASE_PORT=f10
USE_LINUX_NONBASE_PORTS=f10
OVERRIDE_LINUX_BASE_PORT=f10
OVERRIDE_LINUX_NONBASE_PORTS=f10

cd /usr/ports/x11/xorg
make install clean

五、安装gnome2
cd /usr/ports/x11/gnome2
make install clean

六、安装输入法
1,安装SCIM输入法主程序
cd /usr/ports/textproc/scim
make install clean

2,安装五笔插件
cd /usr/ports/chinese/scim-tables
make install clean

3,安装拼音插件
cd /usr/ports/chinese/scim-pinyin
make install clean

七、配置汉化Gnome
Xong -configure
cp /root/xong.conf.new /etc/X11/xong.conf

mkdir /usr/X11R6/lib/X11/fonts/TypeFonts
把WINDOWS系统字体文件复制到/usr/X11R6/lib/X11/fonts/TypeFonts
包括mingliu.ttf
simhei.ttf
simsun.ttf(simsun.ttc重命名即可)
tahoma.ttf
tahomabd.ttf
执行命令:
fc-cache -v

vi /etc/profile
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8
export LANG LC_ALL
exec scim -d &

vi /etc/rc.conf
hald_enable=”YES”
dbus_enable=”YES”
# 开机自动启动gnome
gdm_enable=”YES”

vi /etc/fstab
proc    /proc    procfs    rw    0    0

八、其它常用软件安装
1,QQ
vi /boot/loader.conf
linux_load=”YES”

vi /etc/rc.conf
linux_enable=”YES”

vi /etc/sysctl.conf
compat.linux.osrelease=2.6.16

cd /usr/ports/emulators/linux_base-f10
make install clean

cd /usr/ports/net-im/qq
make install clean

如果不能中文输入,执行:
/compat/linux/usr/bin/localedef -i zh_CN -f UTF-8 zh_CN

2,Firefox
cd /usr/ports/www/firefox35
make install clean

3,firefox flashplayer插件
cd /usr/ports/www/nspluginwrapper
make install clean

cd /usr/ports/www/linux-f10-flashplugin10
make install clean

ln -s /usr/local/lib/npapi/linux-f10-flashplugin/libflashplayer.so /usr/local/lib/browser_plugins/

安装插件
nspluginwrapper -v -a -i

vi /etc/fstab
linproc    /usr/compat/linux/proc    linprocfs    rw    0    0

十二月 15th, 2009

FreeBSD 8.0 Gnome桌面

No Comments, FreeBSD, by garey, 3,434 views.

FreeBSD 8.0装了Linux版QQ,感觉还不错…
freebsd

十二月 15th, 2009

FreeBSD安装ATI显卡驱动

No Comments, FreeBSD, by garey, 13,482 views.

ATI没有freebsd的驱动。
需要在内核配置文件中加入下面两行

device    drm # DRM core module required by DRM drivers
device    i915drm # Intel i830 through i915
device    mach64drm # ATI Rage Pro, Rage Mobility P/M, Rage XL
device    mgadrm # AGP Matrox G200, G400, G450, G550
device    r128drm # ATI Rage 128
device    radeondrm # ATI Radeon
device    savagedrm # S3 Savage3D, Savage4
device    sisdrm # SiS 300/305, 540, 630
device    tdfxdrm # 3dfx Voodoo 3/4/5 and Banshee

然后重新编译内核。