让php生成rss和atom的工具

我的blog系统支持RSS+ATOM了。


本来要自己调XML库函数写的,后来发现网上已经有现成的 RSSCreator.class.php 类库,它支持使用PHP+MySQL的系统生成RSS,ATOM等XML文件,很方便,看一下网站上Sample就知道怎么用了,唯一要注意几点是:


1.$item->data 传进去的值应该是int型的timestamp


2.需要设一下文件中的时区


3.如果中文页面用的是gb2312或者utf-8需要相应的把默认的encoding改掉

Oracle初学笔记

Preinstallation Tasks (for Linux/Unix only)


1. Configuring the Kernel and Creating the oracle User
2. Setting Environment Variables


Change Password in Database Configuration Assistant


用户密码设置
sys => sysdba 凌驾于多个db之上
system => dba 只属于一个db



Strcture overview


Physical Structure



Instance (db启动后的管理, 运转的机制)


memory (sga  + pga):


SGA: System Global Area, allocated at instance startup
PGA: Program Global Area, allocated when the server process is started (pga private属于一个用户session)


share pool: library cache (put in SQL)
data dict. cache (数据字典,包含了数据库中所有的信息). 
data buffer cache 数据缓存
large pool 对share pool的补充
redo log buffer 对数据库的任何change
pga: user session info


backgroud process
SMON(system monitor)
DBW0(db writer, 原dbwr, wr:writer)可以有多个
PMON(process monitor)
LGWR(log writer)
CKPT (checkpoint)
Others…


Database (数据库的文件形式)


Files:
data files,
control files(binary file, defines db name , instant name, collate char…),
redo log(record redo log buffer),
other…


redo log file: 文件循环使用、可以通过写到archive log file导出成文件, 写到tape等存储介质


transction <-> DML(data management language)  DDL(data definition language)
rollback commit 中间包含update delete alter
LOCK: when a transction is running, other transctions have to wait
rollback segment (undo) -> 存储在data buffer cache


old image: buffer 中,与transction有关
new image: buffer -> file, 记录所有新的改变


roll forward: database crash, first compare the SCN(seqence number in files), get data from redo log files, put into data cache, then write to data file


checkpoint: 触发点 在redo log file从1到2时会产生一个checkpoint,可以手工设置


NONArchiveLog mode: 循环使用redo log file,不写出文件,自动清空;否则当磁盘满是系统会等待


parameter file(pfile) (sp file:server parameter file, binary)


password file(binary), relate to security


alert file: important system event(boot, shutdown, error log)


trace file: backgroud process & server process or user process(a user session)
MTS share server


Logical Structure



Tablespaces


An Oracle database can be logically grouped into smaller logical areas of space known as tablespaces.
A tablespace can belong to only one database at a time.
Each tablespace consists of one or more operating system files, which are called data files.
A tablespace may consist of zero or more segments.
Tablespaces can be brought online while the database is running.
Except for the SYSTEM tablespace or a tablespace with an active undo segment, tablespaces can be taken offline, leaving the database running.
Tablespaces can be switched between read-write and read-only status.


Tablespace (can have multi data file,1 data file only belong to 1 tablespace): system(dict.) & non-system (table, index, sp) 存放考虑因素: IO & 碎片. temp (for sorting) temporate, undo(RBS), data(table), index, user, tools


Segment


A segment is the space allocated for a specific logical storage structure within a tablespace. For example, all of the storage allocated to a table is a segment.
A tablespace may consist of one or more segments.
A segment cannot span tablespaces; however, a segment can span multiple data files that belong to the same tablespace.
Each segment is made up of one or more extents.


Extents


Space is allocated to a segment by extents.
One or more extents make up a segment.
An extent is a set of contiguous Oracle blocks.
An extent cannot span a data file but must exist in one data file.


extent (连续的block)


Data Blocks


The Oracle server manages the storage space in the data files in units called Oracle blocks or data blocks.


oracle block (DW:32k, OLTP:8k) depend on data transfer


RAC: 多个instance 对应一个db(cluster)


Process Structure


User Process
Server Process
Background Process (related to physical and memory structures)


Oracle Startup:


NOMOUNT(instance started) -> MOUNT(open control files) -> OPEN (open all files)


Oracle Shutdown:


Abort
Immediate
Transctional
Normal


Tuning DEV


design: 3NF
application: SQL* , clusters物理存储重叠, index (B-tree, bitmap, function based一个表达式index)
memory: sga (3)
I/O (space management)
contention ( latch 资源锁), lock <=> (DML) <=> trans; level : table, record; size of trans
OS


Tuning PRO
contention


SQL Tuning:
Optimizer
RBO rule-based
CBO cost-based
小的表放在后面(产生笛卡尔积)
尽量加等于
大于、小于子句放在等于前面
where子句中有”=”,使用index较好;数据较多用index
delete (record in redo log file); truncate (not record, DDL operate) 磁盘整理好,但developer一般不使用
使用IN性能较差,尤其当使用OR时
exist 替代 distinct


Tools
Statspack 整个db
explain plan => 分析结果,plan_table
tkprof读trace工具
sql analyze
sql *plus: plan_table, role, set autotrace [on] [explain]


Security


User:
Collection of privileges


Schema:
Collection of objects
object集合, table属于schema,
User: 权限集合 Create user
一个user对应一个schema,但也不尽然


v$_   dynamic view
DBA_  static view


Role:
可赋于多个User的权限集合


Profile对应User
Direct权限:Create User,Table
Authentication mechanism: 1. OS SYS; 2.DB SYSTEM

CONNECT -> table, index
Resoure -> more privilege
DBA -> can only give to dba


Net Service


db_1networkadmintnsnames.ora
Client Side: Service Name
Production环境将port换掉,不用1521
tnsping命令, 测试连接


DB Backup


Logical: import/ export
Physical: copy file (cold, hot)


Mode:
Table mode: export时没有关系,import要注意导入的顺序,如需要将有PK的表先导入,FK的表随后导入
用途:数据库升级,处理碎片,Backup数据


Rocovery: 从Redo Log File中恢复某一点的DB备份,用Until time制定恢复时间


RESETLOGS命令,用于同步各file的SCN


RMAN: backup工具包
优点:可以做基于increametal/accumental的累积备份,不用每次复制整个db(export/import同样有这一功能)


Resource:


ASK TOM (oracle expect)


Book: Expect one on one

Windows下Apache2+PHP4安装笔记

开发的时候用 EasyPHP 装的环境,但它不能做为Windows Service启动,所以还是要手工安装Apache2+PHP4。


注:
安装环境: Windows 2003 或 Windows XP
Web Server 端口: 8080


笔记:


download apache 2 for win32 at http://mirror.vmmatrix.net/apache/httpd/binaries/win32/apache_2.0.55-win32-x86-no_ssl.msi


download php 4 win32 lastest stable at http://snaps.php.net/win32/php4-win32-STABLE-latest.zip


Httpd.conf:
Listen 8080
ServerName localhost:8080
DirectoryIndex index.html index.html.var index.php
AddType application/x-httpd-php .php
LoadModule php4_module “c:/php/php4apache2.dll”  (first copy php4apache2.dll from sapi to c:/php/)


Add c:/php/ to System Variables PATH
Add c:/php/dlls/ to System Variables PATH


php.ini-recommended -> php.ini (copy to C:WINDOWS)
doc_root = c:apacheapache2htdocs
extension_dir = c:phpextensions
session.save_path = c:/temp  (need to create this temp folder)


run emd.exe
cd C:ApacheApache2bin
apache –k start
apache –k restart
apache –k stop

Brokeback Mountain

下午快昏过去的时候看了李安的断臂山,bt上下的,因为没有字幕,加上希斯同志含着口香糖讲话,所以基本上是看得云里雾里的感觉。


后来在网上找到《断臂山》的小说,并不长,但节约时间的考虑还是看了翻译过的中文版,回味了很多片子中的细节,想想“爱,真的可以没有性别之分吗?”


不置可否。


英文里那座山叫做BorkeBack Mountain,翻译过来应该是“断背山”,据说李安把它译成“断臂山”,因为中文里有所谓“断袖”的说法,似乎意境更高深一点。


很喜欢片中的风光和配乐,广角镜头里的雪山、湖面、帐篷和主人公,以及带有些许淡淡哀伤的吉它声,一部适合在百无聊赖的星期天的下午拉上窗帘细细回味的片子,这样的西部片也只有李大师这样的东方人才拍得出来吧。

Windows中删不掉的文件

几天前笔记本一直开着好几天没关,今天突然发现桌面上多了一个叫 BTER4UJ. 的这么一个莫名奇妙的文件,更奇怪的是这个文件既打不开也删不掉,大小是0k,每次删报的错都是“cannot delete file: cannot read from the source file or disk.”。

然后决定到dos里面去删,但dos里面根本就没有这个文件。

突然发现我这人对Windows桌面好像有洁癖的,从来都是干净的一塌糊涂,有这么个莫名奇妙的文件在那实在不爽得很;而且从安全的角度来说它完全有可能是一个黑客创建的带有Windows无法识别的特殊字符的文件夹,这个就更恐怖了。

于是继续Google终于找到一篇好文章:http://www.experts-exchange.com/Operating_Systems/WinXP/Q_20791525.html

最后还是删掉了,我是这么删的:

在DOS里面打:

DIR /A
DEL /A BTER4UJ.

/A 的意思是显示所有属性(Attribute),这是一个属性很奇怪的文件,似乎根本就没有属性。

在那篇文章里面引起提到一句:What has happened is that the hacker has added a character to the end of the folder that Explorer does not recognize.

以前的确在电脑报里面看到过通过在文件夹后面加特殊字符使得该文件夹既不能被访问,也不能被删除的情况。

SimpleTest for PHP

SimpleTest 是又一个我通过Google发现的好东东,是可以用来实现PHP的Unit Test的工具,功能类似于Java的JUnit。


测试时只需要建一个包含被测函数、测试输入和测试结果判断的函数,SimpleTest 可以将测试结果输出成html或者XML的形式。


另外它还支持 Mock objects* 和 Web test 。


Sample Code:


<?php
require_once(‘simpletest/unit_tester.php’);    // SimpleTest库
require_once(‘simpletest/reporter.php’);        // SimpleTest输出Report的库
require_once(‘../classes/log.php’);            // 被测函数库


class TestOfLogging extends UnitTestCase {
    // 新建测试函数
    function testCreatingNewFile() {
        $log = new Log(‘/temp/test.log’);    // 新建被测对象
        $this->assertFalse(file_exists(‘/temp/test.log’));    // 判断测试输出的结果
    }
}
?>


注:什么是mock objects?
简单的说,就是一个仿造的对象,它和被模访的对象有着相同的接口。
举个例子,我们要测试Class A,Class A要调用Class B的函数,但如果Class B现在还没有实现,那么我们可以从Class B的接口抽象出一个接口interfaceB,再构建一个类Class MockB来实现这个接口,一般MockB的实现非常简单,它的存在只是为了方便测试Class A。
要注意的是我们要测试的是Class A,而不是Class MockB这个mock object。

如何控制blogkomm的垃圾留言

前几天我的blog似乎被一个国外的垃圾留言发送机(不清楚这种专门用来发布垃圾留言的软件学名叫什么)给盯上了,一天里往我的blog发送了40多条垃圾留言。


虽然不知道它确切的实现垃圾留言方式,但可以肯定它不是用手发的,据我的猜想(只是猜想没有实践过的),它应该是通过这种方式实现:


我们知道的是我的blog现在用的留言系统blogkomm是没有用户控制的,所以这个垃圾留言发送机首先要做的就是搜集使用blogkomm的网站,因为这些网站用的blogkomm是一样的,在发送留言的http请求中它只需要稍微改改http地址就可以了。关于如何搜集到使用blogkomm的网站其实也很简单,用google就可以了,比如我的这篇文章里有这么多的’blogkomm’关键字,一定会被google收录,到时候也就进入到这个垃圾留言数据库中。然后它要做的就是把填了垃圾留言的 http request 发给页面就可以了。


如何禁止这些垃圾留言,但又需要可以让普通用户可以正常的留言。因为这些垃圾留言就目的而言就是要留下反向的链接,一般留言会是:


http://www.ericfish.com
<a href=”http://www.ericfish.com”>desk3</a>
[url=http://www.ericfish.com]desk4[/url]
[link=http://www.ericfish.com]desk6[/link]


可以看到的是它一定要留下的是一个可以被搜索引擎发现超级链接,所以它必须以http://开头。如果在留言的内容中不允许有http://这个字符,世界从此就会安静许多。


blogkomm代码的更新,打开do_comments.php,改动以下函数 (粗体代码是改动部分)


function comments_eingaben($eingabe)
    { global $mail_valid;


  // filter garbage comment
  $garbage = “http://”;
  $pos1 = strpos($eingabe[3],$garbage);
     if ($eingabe[0] == “” ){
                  echo “<div style=”color: red”><strong>”.msg(‘enter_name’).”</strong></div>”; 
                  $okay=0;
                  }
  elseif ($eingabe[1] == “” || (!strstr($eingabe[1],”@”)) || (!strstr($eingabe[1],”.”)) and $mail_valid==1){
                            
                  echo “<div style=”color: red”><strong>”.msg(‘enter_e-mail’).”</strong></div>”; 
                 
                  $okay=0;
                  }
  elseif ($eingabe[3] == “” ){
                  echo “<div style=”color:red”><strong>”.msg(‘enter_comment’).”</strong></div>”; 
                  $okay=0;
                  }
  // filter garbage comment
  elseif ($pos1 !== false){
                  echo “<div style=”color:red”><strong>评论中不允许 http:// 字符,以防止垃圾留言,请去掉http://后重新发布,谢谢</strong></div>”; 
                  $okay=0;
                  }
  else
             
              {
                comments_einlesen();  // einlesen (german): read in comments                                                   
              }
   }

一个关于达喀尔的梦想

“对于参加的人来说,这是一项挑战;对于没有参加的人来说,这是一个梦想。”


— 达喀尔拉力赛创始人Thierry Sabine


“不得不承认有一天能参加达喀尔拉力赛是我众多伟大梦想中的一个。”


— ericfish











其实无论是何种方式,这就是一个人类挑战自然的地方。



达喀尔的玫瑰湖


以上所有图片来自达喀尔拉力赛官方网站

病好了,新年计划

真是没想到咳嗽竟然咳掉新年的前两个礼拜,生病真是麻烦呀


也许生病唯一的好处就是可以从容的有理由的放慢节奏的生活


不过现在病好了,我重新回到有目标有计划有安排的生活轨道


新年计划:


一、坚持每天在blog上怼点东西,似乎我近来写的越来越少了


二、夏天来到前,体重增加10斤,目标明确,还需详细饮食健身计划,能想到的是周末去买个健康秤放在边上督促自己


三、哦。。。暂时没想好,想好再补