2008年3月 Archives
源文件目录结果如下:
ls -l /temp/filelist/2001/
-rw-r--r-- 1 test test 6472 03-28 19:19 100-2001-9-2-0.png
-rw-r--r-- 1 test test 5860 03-28 19:19 100-2001-9-2-1.png
-rw-r--r-- 1 test test 6472 03-28 19:20 100-2001-9-3-0.png
-rw-r--r-- 1 test test 5860 03-28 19:20 100-2001-9-3-1.png
-rw-r--r-- 1 test test 6472 03-28 19:20 100-2001-9-4-0.png
-rw-r--r-- 1 test test 5860 03-28 19:20 100-2001-9-4-1.png
-rw-r--r-- 1 test test 6472 03-28 19:20 100-2001-9-5-0.png
-rw-r--r-- 1 test test 5860 03-28 19:20 100-2001-9-5-1.png
ls -l /temp/filelist/2003/
-rw-r--r-- 1 test test 6472 03-28 19:19 100-2003-8-2-0.png
-rw-r--r-- 1 test test 5860 03-28 19:19 100-2003-8-2-1.png
-rw-r--r-- 1 test test 6472 03-28 19:20 100-2003-8-3-0.png
-rw-r--r-- 1 test test 5860 03-28 19:20 100-2003-8-3-1.png
-rw-r--r-- 1 test test 6472 03-28 19:20 100-2003-8-4-0.png
-rw-r--r-- 1 test test 5860 03-28 19:20 100-2003-8-4-1.png
-rw-r--r-- 1 test test 6472 03-28 19:20 100-2003-8-5-0.png
-rw-r--r-- 1 test test 5860 03-28 19:20 100-2003-8-5-1.png
要求把2003目录中的“2003”替换为“2001”,并且把2003目录中修改文件名后的文件合并到2001目录中。
[local#2hei.net]# more ChangeName.sh
#!/bin/sh
# Edit By 2hei
Path="/temp/filelist"
ls -l $1 |awk '{if($8>0) print $8}' > $Path/list
while read Line
do
Name=`echo $Line|sed 's/2003/2001/g'`
cp $Path/2003/$Line $Path/2001/$Name
done < $Path/list
Usage: sh ChangeName.sh /temp/filelist/2003
tidy up 整理
in the panel at the head of your bed
run down 撞倒 恶化
fed up 厌烦
continental breakfast 欧式早餐
pullover n.套衫 adj.套领的
maid 女仆
spray 飞沫,喷雾
panel 全体陪审人员, 面板,仪表板
I am after a size 40 V-neck pullover in grey.
I keep feeling dizzy.
The radio's terribly loud, could you turn it down in faction?
一直对C++中的引用没有太深刻的认识,这几天趁着工作不忙,认真地学一习了一番,在这里总结一下。
引用(reference):某一变量的别名,对引用的操作与对对象的操作一样。
引用的声明方法: 类型标示符 &引用名 = 目标变量名
声明引用时,必须同时对其进行初始化。
一旦引用被初始化指向一个对象,不能改变为另一个对象的引用。(这一点是与指针的最大区别)
引用不能为NULL。
引用最大的作用是用作函数的参数。当引用被函数改变时,相应的变量被改变。如果传递的数据块比较大,使用引用或指针,可以避免将整块数据全部压栈。
常引用
const 类型标示符 & 引用名 = 目标变量名
不能通过引用,修改目标变量值。引用型参数应该在能被定义为const的情况下尽量定义为const。
Natural beauty is best.
I have a table for two under the name of Mike.
We are right in the middle of lunch.
I'd like to travel first class.
wear make-up 擦化妆品
fly direct 直飞
at the latest
on the diet 吃规定的饮食
cut down 削减,删节,砍倒
no vacancies 没有空房
fix up 修理,理解
main course 主修课程,主菜,主帆
tender a.嫩的
lamb n.小羊,羊羔;v.生小羊
prawn n.对虾,大虾v,捕虾
sherry n.葡萄酒,雪梨酒
carafe n.玻璃瓶子
curry n. 咖喱粉,咖喱饭菜v.用咖喱粉调味
laundry n.洗衣店,要洗的衣服,熨烫
mushroom n. 蘑菇,暴发户 vi.迅速增长,采蘑菇;a.蘑菇形的
plaice n.[渔]欧鲽,拟庸鲽(生活在西欧水域中海生的可食的大比目鱼)
今天学了一些单词和一些句子,列在这里加深记忆。
do washing up,
slurp,
slim,
tart(adj. 辛酸的,刻薄的,酸的;v.打扮;n.果馅饼)
strawberry 草莓
crab 螃蟹
shrimp 虾
lobster 龙虾
etiquette 礼节
carnival n.狂欢
grave n.雕刻,铭刻;n.坟墓;a.严肃的,重大的
sirloin n.牛腰部上的肉
catch the waitress's eye
刚刚吃过晚饭,没事上博客来看看,就发现站点打开的特别慢,
还怀疑这MT blog有什么问题了,打开其他网站倒是正常的很。
纳闷中,大约过了十几秒钟,系统返回了这样的几句话:
Got an error: Connection error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) at lib/MT/ObjectDriver/Driver/DBD/mysql.pm line 49
at lib/MT/ObjectDriver/Driver/DBD/mysql.pm line 49
哈哈,居然百年不遇的现象,让我赶上了,MT blog Server的Mysql服务服务重新启动了,有意思。
我还真是第一次遇到服务重启。
不过,这国外的空间服务质量还是不错的,整个过程大概经过了2分钟,刷新了一下页面,系统便恢复了正常。
以前也一直在用sqlldr进行oracle的数据导入工作,但由于数据表结构比较简单,数据格式比较规范,所以简单的脚本即可完成任务,没有仔细的进行研究。
最近因为项目需要,要处理一个稍微复杂一点的表,涉及到日期字段,还有自增序列,字段比较复杂不规则,有很多空列,经过一番研究后,终于搞定,特此总结一下。
1. 空字段处理: TRAILING NULLCOLS 但是整行不能全空,否则整行无法插入
2. 日期字段处理:格式化处理 AddDate "to_date(:AddDate,'''yyyy-mm-dd hh24:mi:ss''')"
3. 自定义字段分割符 “|”
4. 采用触发器来处理自增字段,具体的建立方法可参考我的另一篇关于触发器的介绍带有条件的触发器trigger
ldr脚本如下:
vi sql.ctl
LOAD DATA
INFILE '/home/oracle/data/table.data'
APPEND INTO TABLE table
fields terminated by '|'
TRAILING NULLCOLS
(
ID,
USERNAME,
PASSWORD,
AddDate "to_date(:AddDate,'''yyyy-mm-dd hh24:mi:ss''')"
)
数据文件样式 table.data
|test|test|2008-03-20 18:09:10
|2hei|2hei|2008-03-20 18:09:10
|admin|admin|2008-03-20 18:09:10
loader 脚本运行方式:
切换到oracle用户 su - oracle
或者root下执行 su -l oracle -c "sqlldr userid=2hei/2hei control=/home/oracle/data/sql.ctl log=/home/oracle/log/sql.log bad=/home/oracle/log/bad.log"
执行后可以查表,看看字段的插入情况。
如果有问题可以看执行后的log 或者 bad文件。
Apache 一般有两种日志格式:
通用日志格式(Common Log Format) 和 组合日志格式(Combined Log Format)
http.conf中默认格式如下:
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
也可以使用自定义,这里使用`分隔 日志参数
%h`%l`%u`%{%Y-%m-%d %H:%M:%S}t`%r`%s`%b`%{Referer}i`%{User-Agent}i`%{X-Up-Calling-Line-ID}i
输出结果如下:
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326
127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"
172.16.0.115`-`-`2008-03-13 11:00:03`GET /logo.gif HTTP/1.1`200`2893`http://172.16.0.252/index.jsp `Opera/9.26 (Windows NT 5.1; U; zh-cn)`-
%h 这是发送请求到服务器的客户的IP地址,如果客户和服务器之间存在代理,那么记录中的这个IP地址就是那个代理的IP地址,而不是客户机的真实IP地址。
%l 这是由客户端identd进程判断的RFC1413身份(identity),输出中的符号"-"表示此处的信息无效。除非在严格控制的内部网络中,此信息通常很不可靠,不应该被使用。只有在将IdentityCheck指令设为 On 时,Apache才会试图得到这项信息。
%u 这是HTTP认证系统得到的访问该网页的客户标识(userid),环境变量REMOTE_USER会被设为该值并提供给CGI脚本。如果状态码是401,表示客户未通过认证,则此值没有意义。如果网页没有设置密码保护,则此项将是"-"。
%{%Y-%m-%d %H:%M:%S}t
这是服务器完成请求处理时的时间。
其格式是:
[日/月/年:时:分:秒 时区]
日 = 2数字
月 = 3字母
年 = 4数字
时 = 2数字
分 = 2数字
秒 = 2数字
时区 = (+|-)4数字
可以在格式字符串中使用 %{format}t 来改变时间的输出形式,其中的format与C标准库中的strftime()用法相同。
如:%Y-%m-%d %H:%M:%S --- 2008-03-13 11:00:03
%r 引号中是客户端发出的包含许多有用信息的请求行。可以看出,该客户的动作是GET ,请求的资源是/logo.gif ,使用的协议是HTTP/1.1 。另外,还可以记录其他信息,如:格式字符串"%m %U%q %H"会记录动作、路径、查询字符串、协议,其输出和"%r"一样。
%s 这是服务器返回给客户端的状态码。这个信息非常有价值,因为它指示了请求的结果,或者是被成功响应了(以2开头),或者被重定向了(以3开头),或者出错了(以4开头),或者产生了服务器端错误(以5开头)。
服务器响应吗列表 :
Successful 2xx
200 OK .....
201 Created
202 Accepted
203 Non-Auth
204 No Conte
205 Reset Co
206 Partial
Redirection 3xx
300 Multiple
301 Moved Pe
302 Found ..
303 See Othe
304 Not Modi
305 Use Prox
306 (Unused)
307 Temporar
Client Error 4x
400 Bad Req
401 Unautho
402 Payment
403 Forbidd
404 Not Fou
405 Method
406 Not Acc
407 Proxy A
408 Request
409 Conflic
410 Gone ..
411 Length
412 Precond
413 Request
414 Request
415 Unsuppo
416 Request
417 Expecta
Server Error 5x
500 Internal
501 Not Impl
502 Bad Gate
503 Service
504 Gateway
505 HTTP Ver
%b 最后这项是返回给客户端的不包括响应头的字节数。如果没有信息返回,则此项应该是"-",如果希望记录为"0"的形式,就应该用%B 。
%{Referer}i
"Referer"请求头。此项指明了该请求是被从哪个网页提交过来的,http://172.16.0.252/index.jsp 这个网页应该包含有/logo.gif 或者其连接。
%{User-Agent}i
"User-Agent"请求头。此项是客户端提供的浏览器识别信息。如:(Opera/9.26 (Windows NT 5.1; U; zh-cn) Mozilla/4.08 [en] (Win98; I ;Nav )
%{X-Up-Calling-Line-ID}i
如果使用手机访问,并且移动(联通)网关可以返回访问者的手机号码。
配置好的 apache 虚拟主机,已经跑着一个web应用,现在绑定了另外一个域名:
环境: apache2 + php5
vi http.conf
NameVirtualHost *:8080
<VirtualHost www.abc.net:8080>
ServerName www.abc.net
ServerAdmin test@abc.net
DocumentRoot /usr/local/apache/htdocs/2hei.net
</VirtualHost>
<VirtualHost www.asd.net:8080>
ServerName www.asd.net
ServerAdmin postmaster@asd.net
DocumentRoot /home/asd/htdocs
</VirtualHost>
访问网站:www.asd.net:8080 系统提示:
You don't have permission to access / on this server error
403(禁止)
原因是默认的apache配置里面已经设定了目录访问权限
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory>
在设定NameVirtualHost时,也是遵循这个规则,
所以应该在 VirtualHost 中单独指定发布目录的目录访问权限。
NameVirtualHost *:8080
<VirtualHost www.abc.net:8080>
ServerName www.abc.net
ServerAdmin test@abc.net
DocumentRoot /usr/local/apache/htdocs/2hei.net
</VirtualHost>
<VirtualHost www.asd.net:8080>
ServerName www.asd.net
ServerAdmin postmaster@asd.net
DocumentRoot /home/abc/htdocs
<Directory "/home/asd/htdocs">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
接着访问你的网站:www.asd.net:8080 应该可以了。
今天看了一下公司HTTP服务器的log,发现爬虫活动异常频繁,有将近1/10的流量来自爬虫们,说起来也挺恐怖的。
其实那点东西也没有必要爬来爬去的吧,于是写了个robots.txt 做了一下限制。
vi robots.txt
User-agent: *
Disallow: /
按照套路,原则上禁止掉了所有的爬虫的骚扰。
下班前,上去看了一眼是否生效了,他奶奶的,爬虫居然如此张狂,继续爬我没商量。
首先就是Baiduspider不守规矩,继续爬网站,而且变本加厉的爬,流量有增无减。
61.135.190.24`-`-`2008-03-18 02:33:37`HEAD /index.html HTTP/1.1`200`2775`-`Baiduspider+(+http://www.baidu.com/search/spider.htm)`-
再有就是google,也有一些,有些是当访问到了robots.txt就停止了。但是还有一些不要脸的仍在爬着。
比如这条:
203.208.60.22`-`-`2008-03-17 13:27:25`GET /Index.html?id=1714 HTTP/1.1`200`2530`-`Mozilla/5.0 (compatible; Googlebot/2.1; +http://www...google.com/bot.html)`-
我查了一下那个IP:真他妈服了,居然有人在冒充google的爬虫在网络世界横行,这不是真正的谷歌,这是假冒伪劣产品哟!
那个真正的Google还是蛮守规矩的,但到robots.txt的内容就停下了匆匆的脚步。
66.249.70.130`-`-`2008-03-18 02:30:40`GET /robots.txt HTTP/1.1`200`27`-`Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)`-
经核实,假冒google的爬虫IP:
IP查询(搜索IP地址的地理位置)
您查询的IP:203.208.60.22
本站主数据:北京市 飞翔人信息技术有限公司
查询结果2:北京市 飞翔人信息技术有限公司
查询结果3:北京市 飞翔人信息技术有限公司
“飞翔人”何许人也,原来是大名顶顶的ganji.com(赶集网),哎,枉我当初对赶集的一片痴心。
顺便也查了一下这斯的来历,原来赶集与Google也曾有着一段“姻缘”哩。
怪不得敢打着Googlebot的名义在网络横行!!!
作为弱势群体的我们普通小站点,只能忍了,这里发发牢骚,骂骂人,自个心里爽爽罢了。
或许ganji凭借google的余威在“爬虫”界也是很吊、很暴力?
PS :
强列鄙视Baidu,这么大的站点不遵守最起码的游戏道德。
表扬一下真正的Googlebot,实实在在老实人,我喜欢! 以后搜索还是使用Google.
今儿个做了一下Linux下resin的访问压力测试,感觉比较好玩,resin独立作为http Server
单点不做任何负载的情况下,resin最高可以坚持到3000访问,访问量在接近4000时http无响应。
测试环境:
FC6 + oralce10g + resin3.1.3
PC机配置: AMD Sempron(tm) Processor 3800+ , 1G RAM
内网环境: Web-Server IP: 172.16.0.252
系统内核:
# uname -a
Linux 2.6.18-1.2798.fc6 #1 SMP Mon Oct 16 14:54:20 EDT 2006 i686 athlon i386 GNU/Linux
系统参数:
more /etc/sysctl.conf
kernel.shmmax = 2147483648 (2G) #oracle配置时 使用 2G 805306368 #768M
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.sem = 250 32000 100 128
kernel.threads-max = 8192
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default=262144
net.core.rmem_max=262144
net.core.wmem_default=262144
net.core.wmem_max=262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack =1
net.ipv4.tcp_window_scaling = 1
相关参数值说明
(1)shmmax:该参数定义了共享内存段的最大尺寸,因为安装了oracle,将其设置为2G。
(2)shmmni:这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096 。通常不需要更改。
(3)shmall:该参数表示系统一次可以使用的共享内存总量(以页为单位)。缺省值就是2097152,通常不需要修改。
(4)sem:该参数表示设置的信号量。
(5)file-max:该参数表示文件句柄的最大数量。文件句柄设置表示在linux系统中可以打开的文件数量。
(6)threads-max:表示指定内核所能使用的线程的最大数目。
Resin 3.1.3配置
resin.conf
<jvm-arg>-Xmx768m</jvm-arg>
<jvm-arg>-Xss1m</jvm-arg>
<jvm-arg>-Xdebug</jvm-arg>
<memory-free-min>1M</memory-free-min>
<thread-max>10240</thread-max>
<socket-timeout>65s</socket-timeout>
<keepalive-max>128</keepalive-max>
<keepalive-timeout>15s</keepalive-timeout>
因为pro版,需要license,所以使用resin3.1.3开源版。
当测试访问量达到512时,系统无法接受新的请求。
所以需要修改resin源文件,参考网上相关文章。
vi com.caucho.server.port.Port.Port.java
com.caucho.server.port.Port
// Secure override for load-balancers/proxies
private boolean _isSecure;
private InetAddress _socketAddress;
// default timeout
private long _socketTimeout = DEFAULT;
private int _connectionMax = 512 ; 改为 10240
private int _minSpareConnection = 16;
private int _keepaliveMax = DEFAULT;
编译成功后替换resin.jar相应的类,重启resin服务
使用压力测试工具MS web application: 3000访问.
Top 命令显示如下:
vmstat显示:
Load:
resin-status:http://172.16.0.252/resin-status
数据库连接池
http://172.16.0.252/proxoolAdmins
#netstat -an|grep ESTABLISHED|wc -l 已经建立的连接数
670
#netstat -an|wc -l 所有连接
2971
压力测试持续了10分钟,结果除了系统负载比较大外(达到了19以上),访问速度和响应还算可以。
达到峰值后的系统,我觉得瓶颈出现在cpu上,达到90%以上。另外系统的tcp连接数量还是根据linux的内核设置有关。虽然已经将resin的http请求线程数放大到了10240,其实这或许只是个理论期望值吧。
不知道还有什么地方可以继续调优的,或许使用resin-pro版本能更加好些?
与朋友聊天,说他们公司的IPV4地址比全中国的总和还要大,我自然是不信。
网上搜集了一下相关资源:发现中国的全部网段的IP总和为1.4亿,而且每年都在增长。
但是确实不及该垄断IP的跨国公司啊! 举个例子:
比如18.0.0.0-18.255.255.255,算了一下,这当中有IPV4地址1.6亿个。
果然不假!
全世界一共42亿个IP地址已经极尽匮乏。什么时候应用IPV6呢?
http://trace.twnic.net.tw/ipstats/statsipv4.php
proxool 介绍请看:
http://proxool.sourceforge.net/
you can download here!
http://proxool.sourceforge.net/download.html
我的hibernate采用properties方式配置,下面介绍我做的两种配置:
========================
配置一:使用proxool.properties
设置proxool的监控servlet
web.xml
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>propertyFile</param-name>
<param-value>WEB-INF/classes/Proxool.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>Admins</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Admins</servlet-name>
<url-pattern>/Admins</url-pattern>
</servlet-mapping>
2.hibernate.properties
使用 proxool.properties 配置:
hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
hibernate.connection.driver_class=oracle.jdbc.OracleDriver
hibernate.query.factory_class=org.hibernate.hql.ast.ASTQueryTranslatorFactory
connection.useUnicode=true
connection.characterEncoding=UTF-8
hibernate.show_sql=false
hibernate.connection.provider_class=org.hibernate.connection.ProxoolConnectionProvider
hibernate.proxool.pool_alias DBPool
hibernate.proxool.properties proxool.properties
proxool.properties
jdbc-1.proxool.alias=DBPool
jdbc-1.proxool.driver-class=oracle.jdbc.driver.OracleDriver
jdbc-1.proxool.driver-url=jdbc:oracle:thin:@172.10.0.111:1521:2hei
jdbc-1.user=2hei
jdbc-1.password=2hei.net
jdbc-1.proxool.maximum-connection-count=20
jdbc-1.proxool.prototype-count=4
jdbc-1.proxool.house-keeping-test-sql=select sysdate from DUAL
jdbc-1.proxool.verbose=true
jdbc-1.proxool.statistics=10s,1m,1d
jdbc-1.proxool.statistics-log-level=ERROR
配置二:使用proxool.xml
hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
hibernate.connection.driver_class=oracle.jdbc.OracleDriver
hibernate.query.factory_class=org.hibernate.hql.ast.ASTQueryTranslatorFactory
connection.useUnicode=true
connection.characterEncoding=UTF-8
hibernate.show_sql=false
hibernate.connection.provider_class=org.hibernate.connection.ProxoolConnectionProvider
hibernate.proxool.pool_alias DBPool
hibernate.proxool.xmlproxool.xml ### 与配置的区别
vi classes/proxool.xml
<?xml version="1.0" encoding="utf-8"?>
<something-else-entirely>
<proxool>
<alias>DBPool</alias>
<driver-url>jdbc:oracle:thin:@172.10.0.111:1521:2hei</driver-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<driver-properties>
<property name="user" value="2hei"/>
<property name="password" value="2hei.net"/>
</driver-properties>
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<maximum-new-connections>20</maximum-new-connections>
<prototype-count>5</prototype-count>
<maximum-connection-count>100</maximum-connection-count>
<minimum-connection-count>10</minimum-connection-count>
<house-keeping-test-sql>select sysdate from dual</house-keeping-test-sql>
</proxool>
</something-else-entirely>
下面是监控记录:
看到active connection 数量始终为0,以为自己的配置有些问题,
后来采用了压力测试软件,施加点压力(50*10),感觉连接池对数据的压力还是比较敏感,
管理界面显示当available connection 达到最大值后,不会立即消失,而是保持一段时间,
此时的连接数保持较大的数量也应该对服务器不会产生坏影响。
今天看了一篇文章,才知道自己对delete和free的理解不对。
从前以为指针使用delete或free释放之后就万事大吉了,但事实上用delete和free释放指针内存后,指针并不会被置为空。如果在后面的程序通过判断指针是否为空来进行不同的操作,很可能导致错误,所以,今后在用delete和free释放指针内存后,一定要把指针置为空。
既然谈到了delete和free,就要说说new/delete和malloc/free。
delete和free是C++的运算符,malloc和free是C++/C语言的标准库函数,它们都是用来动态的申请和释放内存。new和delete用于对象的申请和释放。new可以完成动态内存分配和初始化工作(构造过程),delete完成清理与释放内存的工作(析构过程)。malloc和free用于类内部数据类型(无需构造和析构)内存的申请和释放。
用new创建数组,只能用对象的无参数构造函数:
Obj *objects = new Obj[100];
在用delete释放对象数组是,不要丢了[]:
delete []objects;
如果用delete objects;相当于delete objects[0],漏掉了另外99个对象。
今天使用VSS6 打开指定的目录时 提示 "Error reading from file"。
开始以为是自己的机器网络问题,后来发现并不是这样。
网上搜索了一番,下面是我的解决方法:
进入vss服务器:
到vss安装目录,cmd 命令下,执行:
ANALYZE.EXE -f E:\VSS_DATA\2hei.net\data #E:\VSS_DATA\2hei.net\data为我的项目目录
系统提示:
Analyze Visual SourceSafe Version 6.0d (Build 9848)
Database analysis in progress @ 08-03-06;18:09.
File e:\vss_data\2hei.net\data\status.dat is already open
Cannot rebuild the database while Visual SourceSafe is being run. Make sure all users have exited SourceSafe and try again.
Analysis complete @ 08-03-06;18:09
原来我的客户端还登陆着呢!
关闭vss,继续执行上述命令
提示:
delete your data\backup
删除backup目录后。
继续执行:
Analyze Visual SourceSafe Version 6.0d (Build 9848)
Database analysis in progress @ 08-03-06;18:15.
Creating a new nameset, or long filename information, for the file Dict_Off.java.
Creating a new nameset, or long filename information, for the file Dict_Off.hbm.xml.
Creating a new nameset, or long filename information, for the file VersinCtrl.java.
Analysis complete @ 08-03-06;18:15
Potentially serious errors or inconsistencies were found.
提示成功。
注: 一般来讲出现如此问题是因为在check out 或者check in 时发生网络故障,突然断开服务器造成
文件不完全。 使用VSS的Analyze 命令可以进行修复。
today My Resin's log has some error. make me mass.
My site Use Resin3.1.3+Struts2+Hibernate3+oracle10g ...
the website reports the error code of 500
500 Servlet Exception
java.lang.IllegalStateException: sendError() forbidden after buffer has been committed.
at com.caucho.server.connection.AbstractHttpResponse.sendError(AbstractHttpResponse.java:460)
at org.apache.struts.action.RequestProcessor.processMapping(RequestProcessor.java:665)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:191)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:115)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:92)
at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:103)
at com.caucho.server.webapp.DispatchFilterChain.doFilter(DispatchFilterChain.java:97)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:226)
at com.caucho.server.webapp.RequestDispatcherImpl.include(RequestDispatcherImpl.java:488)
at com.caucho.server.webapp.RequestDispatcherImpl.include(RequestDispatcherImpl.java:353)
at com.caucho.jsp.PageContextImpl.include(PageContextImpl.java:957)
at _jsp._zhengfu._zhijian._xzsp__jsp._jspService(zhengfu/zhijian/xzsp.jsp:131)
at com.caucho.jsp.JavaPage.service(JavaPage.java:61)
at com.caucho.jsp.Page.pageservice(Page.java:577)
at com.caucho.server.dispatch.PageFilterChain.doFilter(PageFilterChain.java:190)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:167)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:226)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:263)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:477)
at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:591)
at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:513)
at java.lang.Thread.run(Thread.java:619)
=================================
and the jvm's log show this:
java.lang.IllegalStateException: sendError() forbidden after buffer has been committed.
at com.caucho.server.connection.AbstractHttpResponse.sendError(AbstractHttpResponse.java:485)
at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:760)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:513)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:76)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:178)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:241)
at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:268)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:586)
at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:690)
at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:612)
at java.lang.Thread.run(Thread.java:619)
I don't know what's cause this error, may by the struts ?
I find this site about a resin's bug:
http://bugs.caucho.com/view.php?id=1684 resin3.*
thereis no replay for the error?
Can any one tell me the reason?
问题总是会有的,有时候解决问题也是一种乐趣,而处理问题的关键是“不抛弃、不放弃”。
症状:
FC6( kernel 2.6.18-1)上安装的Oracle10g
修改了IP地址,从原来的192.168.1.* 到 172.16.0.*
系统重启后,发现oracle监听无法启动。
提示:
ORA-00600: internal error code, arguments: [%s], [%s], [%s], [%s], [%s], [%s], [%s], [%s]
oracle数据库也无法启动,提示数据库无法连接。
看似很简单的问题,以下是曲折的问题解决过程:
googleing : keywords: ORA-00600: internal error code, arguments:
翻了一通,说是什么头晕眼花,没有收获。
查询oracle的监听(listener.ora)配置。
# listener.ora Network Configuration File: /opt/oracle/product/10g/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /opt/oracle/product/10g)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost.localdomain)(PORT = 1521))
)
)
发现没有任何改动。
里面只有host配置,并没有具体指定某个IP。
重新修改网卡的IP地址:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
# nVidia Corporation MCP61 Ethernet
DEVICE=eth0
HWADDR=10:c0:f8:b9:1c:30
IPADDR=172.16.0.252
NETMASK=255.255.255.0
ONBOOT=yes
GATEWAY=172.16.0.1
TYPE=Ethernet
Reboot Server 。。。
一分钟过后,oralce监听仍然无法启动。
#setup
直接配置网卡的设置
这里出现了错误,修改完ip后,无法save 只有quit。
提示如下:
出现一个未解决的异常。这极可能是一个程序错误,请将其崩溃组合码转储入一个文件,
然后在 https://bugzilla.redhat.com/bugzilla 提交一份关于 system-config-network 的详细错误报告。
Component: system-config-network
Version: 1.3.95
Summary: TB /usr/lib/python2.4/sre.py:227:_compile:error: multiple repeat
Traceback (most recent call last):
File "/usr/sbin/system-config-network-tui", line 277, in ?
plist.save()
File "/usr/share/system-config-network/netconfpkg/NCProfileList.py", line 394, in save
del hoconf[i]
File "/usr/lib/python2.4/site-packages/rhpl/Conf.py", line 581, in __delitem__
while self.findnextline('^\S*[' + self.separators + ']+' + varname):
File "/usr/lib/python2.4/site-packages/rhpl/Conf.py", line 198, in findnextline
elif re.search(regexp, self.lines[self.line]):
File "/usr/lib/python2.4/sre.py", line 134, in search
return _compile(pattern, flags).search(string)
File "/usr/lib/python2.4/sre.py", line 227, in _compile
raise error, v # invalid expression
error: multiple repeat
> /usr/lib/python2.4/sre.py(227)_compile()
-> raise error, v # invalid expression
(Pdb)
googleing 。。。。。。。。。。。
未果。
郁闷中。难道让我重装oracle?
虽然作为一台测试服务器,重装oracle也是一件比较让人不爽的事情啊。
接着google。。。。。。 keywords: erverything (先看了会娱乐八卦再说。)
无果。。。
我无语了。。。
半小时后。
偶然发现Linux下面的提示如下:
[root@bogon]#
这个bogon是什么东东哩?
是不是中毒了,这台机器的防范可是超级薄弱啊,所有口令都是12345678,哈哈
赶紧看/var/log
看了一遍所有日志,和配置等等,没有发现异常。
使用了chkrootkit http://www.chkrootkit.org下载 chkrootkit.tar.gz 最新版本 chkrootkit-0.48
./chkrootkit > result.txt
vi result.txt
ROOTDIR is `/'
Checking `amd'... not found
Checking `basename'... not infected
Checking `biff'... not found
Checking `chfn'... not infected
Checking `chsh'... not infected
Checking `cron'... not infected
Checking `crontab'... not infected
Checking `date'... not infected
Checking `du'... not infected
Checking `dirname'... not infected
Checking `echo'... not infected
Checking `egrep'... not infected
Checking `env'... not infected
...
Searching for suspect PHP files... nothing found
Searching for anomalies in shell history files... nothing found
Checking `asp'... not infected
Checking `bindshell'... not infected
Checking `lkm'... chkproc: nothing detected
chkdirs: nothing detected
Checking `rexedcs'... not found
Checking `sniffer'... eth0: not promisc and no PF_PACKET sockets
Checking `w55808'... not infected
Checking `wted'... chkwtmp: nothing deleted
Checking `scalper'... not infected
Checking `slapper'... not infected
Checking `z2'... chklastlog: nothing deleted
Checking `chkutmp'... chkutmp: nothing deleted
没有发现异常。
#hostname
bogon
继续google... keywords: hostname bogon
解释说可能是内网防火墙所致,跟IP段或许有关系。
bogon是指那些不该出现在internet路由表中的地址
这些地址应该包括:
1,私有地址如10,172.16-32,192.168.....
2,还未正式分配出去的地址
Bogons are prefixes that should never appear in the Internet routing table, and obviously should not appear as the source address in any packets you receive.
联系起来最近的操作,恰恰证实了这一点。
昨天刚刚把ISA2004架设好,内网网段从192.168.1.0/24 改到了 172.16.0.1/24
但是究竟是什么修改了Linux的hostname了呢?
先不管他,修改hostname,改为原来的hostname。
#hostname localhost.localdomain
vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
172.16.0.252 localhost.localdomain localhost
#reboot
系统重启后提示变为:[root@localhost]
#hostname
localhost.localdomain
正常了,跟oracle中监听的配置一致。
切换到oracle用户。
[oracle@localhost admin]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 04-MAR-2008 13:40:44
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Starting /opt/oracle/product/10g/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /opt/oracle/product/10g/network/admin/listener.ora
Log messages written to /opt/oracle/product/10g/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 04-MAR-2008 13:40:44
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /opt/oracle/product/10g/network/admin/listener.ora
Listener Log File /opt/oracle/product/10g/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
启动数据库。
[oracle@localhost admin]$ sqlplus "/as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Mar 4 13:40:57 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 88082000 bytes
Database Buffers 192937984 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
oracle启动正常。
总结:
如果您的oracle有这样的错误
ORA-00600: internal error code, arguments:
先看看是不是hostname被修改了??
itext果然是个好东西,虽然很是复杂,但是使用起来确是很好,很弓虽大!
《itext in action》写的很是详细,看了其中的一个分割pdf的类,修改了一下。
参数2个,tag file-you-want-split.pdf
/**
* pdf split tools
* @author 2hei.net
*/
package com.2hei.net.pdftools;
import java.io.*;
import java.util.List;
import java.util.Date;
import java.util.ArrayList;
import java.util.Iterator;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfImportedPage;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.pdf.PdfCopy;
import com.lowagie.text.pdf.SimpleBookmark;
public class Main extends java.lang.Object {
public static void main(String[] args)
{
if (args.length < 2)
{
System.err.println("参数 error ");
}
else
{
// split pdf
if(args[0].equals("1"))
{
StringBuffer path = new StringBuffer();
for(int i = 0 ;i< args[1].split("\\.")[0].split("\\\\").length-1;i++)
{
path.append(args[1].split("\\.")[0].split("\\\\")[i]+"\\");
}
try {
int pagenumber = 0;
// we create a reader for a certain document
PdfReader reader = new PdfReader(args[1]);
// we retrieve the total number of pages
int n = reader.getNumberOfPages();
System.out.println("");
for(int i=1;i<=n;i++)
{
Document document = new Document(reader.getPageSizeWithRotation(i));
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(path+"\\A"+i+".pdf"));
document.open();
PdfContentByte cb = writer.getDirectContent();
PdfImportedPage page;
document.setPageSize(reader.getPageSizeWithRotation(i));
page = writer.getImportedPage(reader, i);
int rotation;
rotation = reader.getPageRotation(i);
if (rotation == 90 || rotation == 270) {
cb.addTemplate(page, 0, -1f, 1f, 0, 0, reader.getPageSizeWithRotation(i).getHeight());
}
else {
cb.addTemplate(page, 1f, 0, 0, 1f, 0, 0);
}
document.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}




