关于JavaScript的Date对象中月份的问题

2010年12月22日 没有评论

       昨晚折腾一宿碰到个“鬼打架的事情”,在JavaScript处理时间的问题时发现月份总是不对,现在明明是2010年12月,结果显示的死活晚一个月,还以为是机器闹鬼,结果查了下机器时间丝毫没有问题的迹象。最终经过再三查看Date对象的方法发现一个确实很闹心的事情.

      JavaScript的Date对象所有关于月份的操作都参数是0~11,也就是说0代表1月份,11代表12月份,好家伙,这是什么逻辑?!!!

getMonth() 从 Date 对象返回月份 (0 ~ 11)。
getUTCMonth() 根据世界时从 Date 对象返回月份 (0 ~ 11)。
setMonth() 设置 Date 对象中月份 (0 ~ 11)。
setUTCMonth() 根据世界时设置 Date 对象中的月份 (0 ~ 11)。

 

 

另外天数也是0~6

getDay() 从 Date 对象返回一周中的某一天 (0 ~ 6)。
getUTCDay() 根据世界时从 Date 对象返回周中的一天 (0 ~ 6)。

 

 

 

分类: 前端技术 标签:

视觉设计资源

2010年12月1日 没有评论
分类: 其他 标签:

PHP正则备忘录

2010年11月26日 没有评论

注意贪婪性

  假设你想用一个正则表达式匹配一个HTML 标签。你知道输入将会是一个有效的HTML 文件,因此正则表达式不需要排除那些无效的标签。所以如果是在两个尖括号之间的内容,就应该是一个HTML 标签。

  许多正则表达式的新手会首先想到用正则表达式<< <.+> >>,他们会很惊讶的发现,对于测试字符串,“This is a <EM>first</EM> test”,你可能期望会返回<EM>,然后继续进行匹配的时候,返回</EM>。

     但事实是不会。正则表达式将会匹配“<EM>first</EM>”。很显然这不是我们想要的结果。原因在于“+”是贪婪的。也就是说,“+”会导致正则表达式引擎试图尽可能的重复前导字符。只有当这种重复会引起整个正则表达式匹配失败的情况下,引擎会进行回溯。也就是说,它会放弃最后一次的“重复”,然后处理正则表达式余下的部分。

  和“+”类似,“?*”的重复也是贪婪的。

  深入正则表达式引擎内部

  让我们来看看正则引擎如何匹配前面的例子。第一个记号是“<”,这是一个文字符号。第二个符号是“.”,匹配了字符“E”,然后“+”一直可以匹配其余的字符,直到一行的结束。然后到了换行符,匹配失败(“.”不匹配换行符)。于是引擎开始对下一个正则表达式符号进行匹配。也即试图匹配“>”。到目前为止,“<.+”已经匹配了“<EM>first</EM> test”。引擎会试图将“>”与换行符进行匹配,结果失败了。于是引擎进行回溯。结果是现在“<.+”匹配“<EM>first</EM> tes”。于是引擎将“>”与“t”进行匹配。显然还是会失败。这个过程继续,直到“<.+”匹配“<EM>first</EM”,“>”与“>”匹配。于是引擎找到了一个匹配“<EM>first</EM>”。记住,正则导向的引擎是“急切的”,所以它会急着报告它找到的第一个匹配。而不是继续回溯,即使可能会有更好的匹配,例如“<EM>”。所以我们可以看到,由于“+”的贪婪性,使得正则表达式引擎返回了一个最左边的最长的匹配。

用懒惰性取代贪婪性

  一个用于修正以上问题的可能方案是用“+”的惰性代替贪婪性。你可以在“+”后面紧跟一个问号“?”来达到这一点。“*”,“{}”和“?”表示的重复也可以用这个方案。因此在上面的例子中我们可以使用“<.+?>”。让我们再来看看正则表达式引擎的处理过程。再一次,正则表达式记号“<”会匹配字符串的第一个“<”。下一个正则记号是“.”。这次是一个懒惰的“+”来重复上一个字符。这告诉正则引擎,尽可能少的重复上一个字符。因此引擎匹配“.”和字符“E”,然后用“>”匹配“M”,结果失败了。引擎会进行回溯,和上一个例子不同,因为是惰性重复,所以引擎是扩展惰性重复而不是减少,于是“<.+”现在被扩展为“<EM”。引擎继续匹配下一个记号“>”。这次得到了一个成功匹配。引擎于是报告“<EM>”是一个成功的匹配。整个过程大致如此。

惰性扩展的一个替代方案

  我们还有一个更好的替代方案。可以用一个贪婪重复与一个取反字符集:“<[^>]+>”。之所以说这是一个更好的方案在于使用惰性重复时,引擎会在找到一个成功匹配前对每一个字符进行回溯。而使用取反字符集则不需要进行回溯。

  最后要记住的是,本教程仅仅谈到的是正则导向的引擎。文本导向的引擎是

不回溯的。但是同时他们也不支持惰性重复操作。

取反字符集

在左方括号“[”后面紧跟一个尖括号“^”,将会对字符集取反。结果是字符集将匹配任何不在方括号中的字符。不像“.”,取反字符集是可以匹配回车换行符的。

需要记住的很重要的一点是,取反字符集必须要匹配一个字符。<<q[^u]>>并不意味着:匹配一个q,后面没有u 跟着。它意味着:匹配一个q,后面跟着一个不是u 的字符。所以它不会匹配“Iraq”中的q,而会匹配“Iraq is a country”中的q 和一个空格符。事实上,空格符是匹配中的一部分,因为它是一个“不是u 的字符”。

分类: PHP 标签:

在CentOS上安装git及常见问题处理

2010年10月25日 没有评论

1. GIT 安装篇

先安装git依赖的包
yum install zlib-devel
yum install openssl-devel
yum install perl
yum install cpio
yum install expat-devel
yum install gettext-devel

安装autoconf
yum install autoconf

安装git
wget http://www.codemonkey.org.uk/projects/git-snapshots/git/git-latest.tar.gz
tar xzvf git-latest.tar.gz
cd git-{date}
autoconf
./configure –with-curl=/usr/local
make & make install

参考文档:http://www.doc88.com/p-67839116264.html

2.常见错误

在使用Git Push代码到数据仓库时,提示如下错误:
[remote rejected] master -> master (branch is currently checked out)

错误原型
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent|
remote: error: with what you pushed, and will require ‘git reset –hard’ to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set ‘receive.denyCurrentBranch’ configuration variable to
remote: error: ‘ignore’ or ‘warn’ in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: ‘receive.denyCurrentBranch’ configuration variable to ‘refuse’.
To git@192.168.1.X:/var/git.server/…/web
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to ‘git@192.168.1.X:/var/git.server/…/web’

错误原因以及解决

这是由于git默认拒绝了push操作,需要进行设置,修改.git/config文件后面添加如下代码:

[receive]

denyCurrentBranch = ignore

无法查看push后的git中文件的原因与解决方法

在初始化远程仓库时最好使用 git –bare init 而不要使用:git init

如果使用了git init初始化,则远程仓库的目录下,也包含work tree,当本地仓库向远程仓库push时, 如果远程仓库正在push的分支上(如果当时不在push的分支,就没有问题), 那么push后的结果不会反应在work tree上, 也即在远程仓库的目录下对应的文件还是之前的内容。

解决方法:

必须得使用命令 git reset –hard 才能看到push后的内容.

分类: 其他 标签:

Android UI 用户界面开发基本概念概览

2010年10月8日 没有评论

Android UI界面编程概览

本文主要对Android UI 用户界面开放的一些基本概念,均不做深入讲解,但可以快速浏览Android开放经常涉及到的一些基本概念和要素。

一、界面元素

1.         窗口:Activity

应用程序中每个屏幕显示都通过继承和扩展基类Activity实现

分类:基本Activity,带内容的Activity(如ListActivity)

2.         对话框:Dialog

一种显示于Activity之上的界面元素,由Activity管理,用于显示一些临时信息和功能,它比Activity开销小

1)        常用对话框:

AlertDialog:信息对话框

DatePickerDialog,TimePickerDialog:时间日期选择对话框

ProgressDialog:进度对话框

还可以设置对话框内容为我们自定义的View

2)        相关函数:

onCreateDialog():创建对话框的实现

showDialog():需要显示的时候调用

onPrepareDialog():更改已有对话框时调用

3.         菜单:Menu

一种显示于Activity之上的界面元素,由Activity管理,用于提供用户一些额外的选项和设置

1)        常用菜单:

Options Menu:按Menu键时从屏幕底部滑出的菜单

Context Menu:用户通过在按件上长按调出它

Submenu:用于给菜单分类,可被添加到其它菜单上,不能添加到子菜单上

2)        相关函数:

onCreateOptionMenu():创建菜单 (onCreateContextMenu…)

onOptionsItemSelected():处理菜单项的单击事件

onPrepareOptionsMenu():动态更新

4.       可视化控件:View

View是可视化控件的基类

1)       常用控件:

TextView, ImageView

Button, CheckBox, RadioButton, ImageButton, ToggleButton

AnalogClock, DigitalClock

EditText, List…

2)       数据绑定:adapter

adapter将控件(如List, GridView)和复杂数据(如数据,键表)绑定起来

5.       其它界面元素

标题栏

二、layout布局的实现

设置控件在屏幕上如何排布

1.       LinearLayout:线性的布局方式

最常用,上下或左右的添加控件

2.       GridView:网格布局

控件按照顺序依次填到每个格子里就好了,使界面很整齐

3.       TableLayout:表格布局

以行列形式管理子控件,每行为一个TableRow,TableRow可添加子控件

4.       AbsoluteLayout:绝对坐标布局

可以让子元素指定准确的x/y坐标值,并显示在屏幕上。(0, 0)为左上角。

AbsoluteLayout没有页边框,允许元素之间互相重叠(尽管不推荐)。

不推荐使用,因为其在不同的设备上可能不能很好地工作。

5.       RelativeLayout:相对坐标布局

控件可指定他们相对于其它元素或父元素的位置(通过ID指定)。

可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素。

6.       FrameLayout:单帧布局

所有的子元素将会固定在屏幕的左上角,后一个子元素将会直接在前一个子元素之上进行覆盖填充

三、事件响应

1.         用注册回调函数的方式响应事件

2.         如果没被任何一个View处理,则由Activity处理

3.         常用事件处理

1)        onKeyDown()

2)        onKeyUp()

3)        onTrackballEvent()

4)        onTouchEvent()

四、应用软件代码目录结构

1.       res:资源

资源是在代码中使用到的并且在编译时被打包进您的应用程序的附加文件

在代码中通过R类调用(R类自动生成,形如R.string.title)

1)       layout:存放布局用的xml文件

a)       布局就像容器,里面可以装下很多控件,每个控件又有布局,字体设定,

如字体大小在layout的xml里使用:

Android:textAppearance=”?android:attr/textAppearanceSmall”

b)       默认的布局文件main.xml

2)        drawable:存放图片图标

3)        values:存放常量的xml文件(如字串)

2.         src:代码

3.         AndroidManifest.xml

包含应用程序的基本信息,有哪些组件,哪些资源

1)        应用程序的java包名

2)        应用程序中所含组件(Activity, Service, BroadcastReceiver, ContentProvider)

3)        应用程序调用其它程序时的权限

4)        应用程序被其它程序调用时对其它程序的权限要求

5)        使用Android API的最低版本

6)        应用程序依赖的库

五、国际化的支持(多语言)

1.       在系统中如何设置本地语言

桌面->settings->Local & text->Select locale->Chinese(China)

2.       在程序中如何加入多语言支持

res/value中是默认的字体

把它复制一份成为res/value-zh-rCN文件夹,然后把其中文字改为简体中文

3.       在不改变系统设置的前提前,测试当前应用对某一语言的支持

import java.util.Local; // 引入相关类

import android.util.DisplayMetrics;

在OnCreate函数中加入以下本地化设置

Resources res = getResources();

Configuration conf = res.getConfiguration();

conf.locale = Locale.SIMPLIFIED_CHINESE;// 设置为简体中文

DisplayMetrics dm = res.getDisplayMetrics();

res.updateConfiguration(conf,dm);

编译后再运行程序时,读取的字串就是res/value-zh-rCN目录中strings.xml里的文字了

六、常见问题及解决方法

1.       android.app.Application

创建一个属于你自己的android.app.Application的子类,然后在 manifest中申明一下这个类,这是android就为此建立一个全局可用的实例,你可以在其他任何地方使用 Context.getApplicationContext()方法获取这个实例,进而获取其中的状态

2.       用别人写的java文件改出自己的,R.xx报错

由于资源找不对,要把它的res文件和AndroidManifest.xml内容也做相应替换,注意xml里边要改成自己的类名

3.       android中可以使用java中的类吗

一般数据结构使用它,而界面使用android自带的界面元素

4.       layout中的控件与程序中控件的关系

平等的,layout中的控件用R.id.xxx得到

5.       布局冲突

requestWindowFeature与setContentView冲突

七、android中几个重要的包(建议逐个熟悉,你就能熟能生巧了!)

android.app :提供高层的程序模型、提供基本的运行环境

android.content :包含各种的对设备上的数据进行访问和发布的类

android.database :通过内容提供者浏览和操作数据库

android.graphics :底层的图形库,包含画布,颜色过滤,点,矩形,可以将他们直接绘制到屏幕上.

android.location :定位和相关服务的类

android.media :提供一些类管理多种音频、视频的媒体接口

android.net :提供帮助网络访问的类,超过通常的java.net.* 接口

android.os :提供了系统服务、消息传输、IPC 机制

android.opengl :提供OpenGL 的工具

android.provider :提供类访问Android 的内容提供者

android.telephony :提供与拨打电话相关的API 交互

android.view :提供基础的用户界面接口框架

android.util :涉及工具性的方法,例如时间日期的操作

android.webkit :默认浏览器操作接口

android.widget :包含各种UI 元素(大部分是可见的)在应用程序的屏幕中使用

原文:http://monner.javaeye.com/blog/749846

分类: 其他 标签:

[CDN]动态内容的缓存技术 CSI,SSI,ESI

2010年9月30日 没有评论

      CDN 中动态内容是不太好解决的,通常需要很麻烦的技术和方法来实现这些功能,比如我设计过一种动态缓存的方法,基于 session 栏接,然后根据热点来做动态缓存时间的控制。目前开放的实现 Cache 的技术主要有 CSI,SSI,ESI 之类几种。在一个动态网页中,内容不断更新和变化,但这并不意味不能缓存,其实还是有 90% 的内容都可以做到 CDN中的。只要花点心思。但这些都对客户有更加高的要需求。下面是这向种技术的介绍。

动态 Cache 页面有如下一些方案:

  1、Client Side Includes(CSI):

通过iframe、javascript、ajax 等方式将另外一个页面的内容动态包含进来。这样来实现动态化。

     优点:能够利用浏览器客户端并行处理及装载的机制;这种技术基本不需要服务器支持和修改,计算和操作放在客户端,能够降低服务器端压力

     缺点:搜索引擎优化问题;javascript兼容性问题;客户端缓存可能导致服务器端内容更新后不能及时生效。常常通过加 js version 来解决.

  2、Server Side Includes(SSI):

SSI它就是HTML文件中,可以通过注释行调用的命令或指针。实现整个网站的内容更新。SSI需要特殊的文件后缀(shtml,inc).

      优点:SSI技术是通用技术,不受具体语言限制,只需要Web服务器或应用服务器支持即可,Ngnix、Apache、Tomcat、Jboss等对此都有较好的支持,目前 Squid 不支持。

      缺点:SSI在语法上不能够直接包含其他服务器的url,只能在当前服务器上运行。所以通过 CDN 之类的 Cache 时,还是会失效,不灵活.

    3、Edge Side Includes (ESI):

       Edge Side Includes(ESI) 和Server Side Includes(SSI)和功能类似。SSI需要特殊的文件后缀(shtml,inc)。ESI(Edge Side Include)通过使用简单的标记语言来对那些可以加速和不能加速的网页中的内容片断进行描述,每个网页都被划分成不同的小部分分别赋予不同的缓存控制 策略,使Cache服务器可以根据这些策略在将完整的网页发送给用户之前将不同的小部分动态地组合在一起。通过这种控制,可以有效地减少从服务器抓取整个 页面的次数,而只用从原服务器中提取少量的不能缓存的片断,因此可以有效降低原服务器的负载,同时提高用户访问的响应时间。

优点: ESI更适合用于缓存服务器上,缓存整个页面或页面片段,因此ESI特别适合用于缓存,CDN 的第一名的老大,Akamai 全力支持协议。对于布置和 Cache 都是最友好的。

缺点: 出来很久,一直没有多少人使用。会这个技术的程序员不多。

转载自:http://www.php-oa.com/

分类: 架构 标签:

MySQL扩展正则表达式

2010年9月1日 没有评论

由MySQL提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用
REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。
扩展正则表达式的一些字符是:
“.”匹配任何单个的字符。
一个字符类“[…]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。
为了命名字符的一个范围,使用一个“-”。“[a-z]”匹配任何小写字母,而“[0-9]”匹配任
何数字。
“ * ”匹配零个或多个在它前面的东西。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”
匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。
正则表达式是区分大小写的,但是如果你希望,你能使用一个字符类匹配两种写法。例如,
“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。
如果它出现在被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。
为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的
结尾用“$”。
为了说明扩展正则表达式如何工作,上面所示的LIKE查询在下面使用REGEXP重写:
为了找出以“b”开头的名字,使用“^”匹配名字的开始并且“[bB]”匹配小写或大写的“b”:
mysql> SELECT * FROM pet WHERE name REGEXP "^[bB]";
+——–+——–+———+——+————+————+
| name | owner | species | sex | birth | death |
+——–+——–+———+——+————+————+
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
+——–+——–+———+——+————+————+
为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾:
mysql> SELECT * FROM pet WHERE name REGEXP "fy$";
+——–+——–+———+——+————+——-+
| name | owner | species | sex | birth | death |
+——–+——–+———+——+————+——-+
| Fluffy | Harold | cat | f | 1993-02-04 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+——–+——–+———+——+————+——-+
为了找出包含一个“w”的名字,使用“[wW]”匹配小写或大写的“w”:
mysql> SELECT * FROM pet WHERE name REGEXP "[wW]";
+———-+——-+———+——+————+————+
| name | owner | species | sex | birth | death |
+———-+——-+———+——+————+————+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 |
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
+———-+——-+———+——+————+————+
既然如果一个正规表达式出现在值的任何地方,其模式匹配了,就不必再先前的查询中在模式的两
方面放置一个通配符以使得它匹配整个值,就像如果你使用了一个SQL模式那样。
为了找出包含正好5个字符的名字,使用“^”和“$”匹配名字的开始和结尾,和5个“.”实例在
两者之间:
mysql> SELECT * FROM pet WHERE name REGEXP "^…..$";
+——-+——–+———+——+————+——-+
| name | owner | species | sex | birth | death |
+——-+——–+———+——+————+——-+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+——-+——–+———+——+————+——-+
你也可以使用“{n}”“重复n次”操作符重写先前的查询:
mysql> SELECT * FROM pet WHERE name REGEXP "^.{5}$";
+——-+——–+———+——+————+——-+
| name | owner | species | sex | birth | death |
+——-+——–+———+——+————+——-+
| Claws | Gwen | cat | m | 1994-03-17 | NULL |
| Buffy | Harold | dog | f | 1989-05-13 | NULL |
+——-+——–+———+——+————+——-+

分类: MySQL 标签:

DDoS deflate:自动屏蔽DDOS攻击者IP

2010年8月3日 没有评论

  前言

  互联网如同现实社会一样充满钩心斗角,网站被DDOS也成为站长最头疼的事。在没有硬防的情况下,寻找软件代替是最直接的方法,比如用 iptables,但是iptables不能在自动屏蔽,只能手动屏蔽。今天要说的就是一款能够自动屏蔽DDOS攻击者IP的软件:DDoS deflate。

  DDoS deflate介绍

  DDoS deflate是一款免费的用来防御和减轻DDoS攻击的脚本。它通过netstat监测跟踪创建大量网络连接的IP地址,在检测到某个结点超过预设的限 制时,该程序会通过APF或IPTABLES禁止或阻挡这些IP.

  DDoS deflate官方网站:http://deflate.medialayer.com/

  如何确认是否受到DDOS攻击?

  执行:

  netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n

  执行后,将会显示服务器上所有的每个IP多少个连接数。

  以下是我自己用VPS测试的结果:

  li88-99:~# netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n

  1 114.226.9.132

  1 174.129.237.157

  1 58.60.118.142

  1 Address

  1 servers)

  2 118.26.131.78

  3 123.125.1.202

  3 220.248.43.119

  4 117.36.231.253

  4 119.162.46.124

  6 219.140.232.128

  8 220.181.61.31

  2311 67.215.242.196

  每个IP几个、十几个或几十个连接数都还算比较正常,如果像上面成百上千肯定就不正常了。

  1、安装DDoS deflate

  wget http://www.inetbase.com/scripts/ddos/install.sh //下载DDoS deflate

  chmod 0700 install.sh //添加权限

  ./install.sh //执行

  2、配置DDoS deflate

  下面是DDoS deflate的默认配置位于/usr/local/ddos/ddos.conf ,内容如下:

  ##### Paths of the script and other files

  PROGDIR="/usr/local/ddos"

  PROG="/usr/local/ddos/ddos.sh"

  IGNORE_IP_LIST="/usr/local/ddos/ignore.ip.list" //IP地址白名单

  CRON="/etc/cron.d/ddos.cron" //定时执行程序

  APF="/etc/apf/apf"

  IPT="/sbin/iptables"

  ##### frequency in minutes for running the script

  ##### Caution: Every time this setting is changed, run the script with –cron

  ##### option so that the new frequency takes effect

  FREQ=1 //检查时间间隔,默认1分钟

  ##### How many connections define a bad IP? Indicate that below.

  NO_OF_CONNECTIONS=150 //最大连接数,超过这个数IP就会被屏蔽,一般默认即可

  ##### APF_BAN=1 (Make sure your APF version is atleast 0.96)

  ##### APF_BAN=0 (Uses iptables for banning ips instead of APF)

  APF_BAN=1 //使用APF还是iptables,推荐使用iptables

  ##### KILL=0 (Bad IPs are’nt banned, good for interactive execution of script)

  ##### KILL=1 (Recommended setting)

  KILL=1 //是否屏蔽IP,默认即可

  ##### An email is sent to the following address when an IP is banned.

  ##### Blank would suppress sending of mails

  EMAIL_TO="root" //当IP被屏蔽时给指定邮箱发送邮件,推荐使用,换成自己的邮箱即可

  ##### Number of seconds the banned ip should remain in blacklist.

  BAN_PERIOD=600 //禁用IP时间,默认600秒,可根据情况调整

  用户可根据给默认配置文件加上的注释提示内容,修改配置文件。

  喜欢折腾的可以用Web压力测试软件测试一下效果,相信DDoS deflate还是能给你的VPS或服务器抵御一部分DDOS攻击,给你的网站更多的保护。

分类: Linux 标签:

去掉ECSHOP版权 标志

2010年7月18日 没有评论

前台部分:

1:去掉头部TITLE部分的ECSHOP演示站 Powered by ecshop

前者在后台商店设置 – 商店标题修改

后者打开includes/lib_main.php

$page_title = $GLOBALS[‘_CFG’][‘shop_title’] . ‘ – ‘ . ‘Powered by ECShop’;

修改这里的’Powered by ECShop

2.去掉友情链接部分

在后台的友情链接管理里修改

3.去掉底部的Powered by ecshop 270

打开 js/common.js    

删除第244行:onload = function()

  第244行函数如下:
  onload = function()
  {
  var link_arr = document.getElementsByTagName(String.fromCharCode(65));
  var link_str;
  var link_text;
  var regg, cc;
  var rmd, rmd_s, rmd_e, link_eorr = 0;
  var e = new Array(97, 98, 99,
   100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
   110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
   120, 121, 122
   );
  
   try
   {
  for(var i = 0; i < link_arr.length; i++)
  {
   link_str = link_arr.href;
   if (link_str.indexOf(String.fromCharCode(e[22], 119, 119, 46, e[4], 99, e[18], e[7], e[14],
   e[15], 46, 99, 111, e[12])) != -1)
   {
   if ((link_text = link_arr.innerText) == undefined)
   {
   throw "noIE";
   }
   regg = new RegExp(String.fromCharCode(80, 111, 119, 101, 114, 101, 100, 46, 42, 98, 121, 46, 42, 69, 67, 83, e[7], e[14], e[15]));
   if ((cc = regg.exec(link_text)) != null)
   {
   if (link_arr.offsetHeight == 0)
   {
   break;
   }
   link_eorr = 1;
   break;
   }
   }
   else
   {
   link_eorr = link_eorr ? 0 : link_eorr;
   continue;
   }
  }
   } // IE
   catch(exc)
   {
  for(var i = 0; i < link_arr.length; i++)
  {
   link_str = link_arr.href;
   if (link_str.indexOf(String.fromCharCode(e[22], 119, 119, 46, e[4], 99, 115, 104, e[14],
   e[15], 46, 99, 111, e[12])) != -1)
   {
   link_text = link_arr.textContent;
   regg = new RegExp(String.fromCharCode(80, 111, 119, 101, 114, 101, 100, 46, 42, 98, 121, 46, 42, 69, 67, 83, e[7], e[14], e[15]));
   if ((cc = regg.exec(link_text)) != null)
   {
   if (link_arr.offsetHeight == 0)
   {
   break;
   }
   link_eorr = 1;
   break;
   }
   }
   else
   {
   link_eorr = link_eorr ? 0 : link_eorr;
   continue;
   }
  }
   } // FF
  
   try
   {
  rmd = Math.random();
  rmd_s = Math.floor(rmd * 10);
  if (link_eorr != 1)
  {
   rmd_e = i – rmd_s;
   link_arr[rmd_e].href = String.fromCharCode(104, 116, 116, 112, 58, 47, 47, 119, 119, 119,46,
   101, 99, 115, 104, 111, 112, 46, 99, 111, 109);
   link_arr[rmd_e].innerHTML = String.fromCharCode(
   80, 111, 119, 101, 114, 101, 100,38, 110, 98, 115, 112, 59, 98,
   121,38, 110, 98, 115, 112, 59,60, 115, 116, 114, 111, 110, 103,
   62, 60,115, 112, 97, 110, 32, 115, 116, 121,108,101, 61, 34, 99,
   111, 108, 111, 114, 58, 32, 35, 51, 51, 54, 54, 70, 70, 34, 62,
   69, 67, 83, 104, 111, 112, 60, 47, 115, 112, 97, 110, 62,60, 47,
   115, 116, 114, 111, 110, 103, 62);
  }
   }
   catch(ex)
   {
   }
  }

再打开模板文件夹的 library/page_footer.lbi

删除 {foreach from=$lang.p_y item=pv}{$pv}{/foreach}{$licensed}

后台部分:

1.去除两张图片

admin/images/ecshop_logo.gif

admin/images/login.png

2.右上角的“关于ECSHOP”

打开admin/templates/top.htm

删除: <li><a href="index.php?act=about_us" target="main-frame">{$lang.about}</a></li>

3.中部 ECSHOP 管理中心, 和底部的版权所有

打开language/zh_cn/admin/common.php

$_LANG[‘cp_home’] = ‘ECSHOP 管理中心’;
$_LANG[‘copyright’] = ‘版权所有 &copy; 2005-2009 上海商派网络科技有限公司,并保留所有权利。’;

作者:wjjlovewjl@善水访谈
地址:http://www.php600.cn/read.php/811.htm

分类: 其他 标签:

PHP获取QQ邮箱用户好友的方法【转】

2010年7月14日 1 条评论

我用php做了改写,可能有不完善的地方。

附件中有代码,

主要的类为class.qqhttp.php

<?php
/**
* @file class.qqhttp.php
* qq邮箱登陆获取类
* @author wc<cao8222@gmail.com>
* @date 2009-04-27
*/

class QQHttp {

   var $cookie = ”;

   function __cunstrut() {
   }

   function makeForm() {
       $form = array(
           ‘url’ => "http://mail.qq.com/cgi-bin/loginpage",
       );
       $data = $this->curlFunc($form);
       preg_match(‘/name="ts"\svalue="(\d+)"/’,$data[‘html’], $tspre);
       $ts = $tspre[1];
       preg_match(‘/action="http:\/\/(m\d+)\.mail\.qq\.com/’,$data[‘html’], $server);
       $server_no = $server[1];

       /*login.html 载入 */
       $html = file_get_contents(dirname(__FILE__).’/login.htm’);
       $html = str_replace(‘{_ts_}’,$ts, $html);
       $html = str_replace(‘{_server_no_}’,$server_no, $html);
       return $html;
   }

   function curlFunc($array)
   {
       $ch = curl_init();
       curl_setopt($ch, CURLOPT_URL, $array[‘url’]);
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
       if( isset($array[‘header’]) && $array[‘header’] ) {
           curl_setopt($ch, CURLOPT_HEADER, 1);
       }
       if(isset($array[‘httpheader’])) {
           curl_setopt($ch, CURLOPT_HTTPHEADER, $array[‘httpheader’]);
       }
       if(isset($array[‘referer’])) {
           curl_setopt($ch, CURLOPT_REFERER, $array[‘referer’]);
       }
       if( isset($array[‘post’]) ) {
           curl_setopt($ch, CURLOPT_POST, 1 );
           curl_setopt($ch, CURLOPT_POSTFIELDS, $array[‘post’]);
       }
       if( isset($array[‘cookie’]) ){
           curl_setopt($ch, CURLOPT_COOKIE, $array[‘cookie’]);
       }
       $r[‘erro’] = curl_error($ch);
       $r[‘errno’] = curl_errno($ch);
       $r[‘html’] = curl_exec($ch);
       $r[‘http_code’] = curl_getinfo($ch, CURLINFO_HTTP_CODE);
       curl_close($ch);
       return $r;
   }

   /**
    * 获取验证码图片和cookie
    * @param Null
    *
    * @return array(‘img’=>String, ‘cookie’=>String)
    */
   function getVFCode ()
   {
       $t = ‘http://m127.mail.qq.com/cgi-bin/getverifyimage?aid=23000101&0.8881121444410955’;
       $t = ‘ttp://mail.qq.com/cgi-bin/getinvestigate?t=loginpage&stat=verifyimg&verifyuser=49450402’;
       $vfcode = array(
           ‘header’ => true,
           ‘cookie’ => false,
           ‘url’=>’http://’.$_GET[‘server_no’].’.mail.qq.com/cgi-bin/getverifyimage?aid=’.$_GET[‘aid’].’&’.@$_GET[‘t’],
       );
       //var_dump($vfcode);

       $r = $this->curlFunc($vfcode);
       if ($r[‘http_code’] != 200 ) return false;
       $data = split("\n", $r[‘html’]);
       //var_dump($data);exit;
       preg_match(‘/verifyimagesession=([^;]+);/’,$data[7], $temp);
       $cookie = trim($temp[1]);
       $img = $data[11];
       returnarray(‘img’=>$img,’cookie’=>$cookie, ‘data’=>$data);
   }

   /**
    * 登陆qq邮箱
    *
    * @param $cookie getvfcode中生成的cookie
    *
    * @return array(
    *  sid=>String , //用户认证的唯一标示
    *  login => Boolean, //true 登陆成功 ,false 登陆失败
    *  server_no => String // 服务器编号
    *  active => Boolean //true 已开通 ,false 未开通 邮箱
    *  cookie => String // 获取数据cookie
    *
    * );
    */
   function login($cookie)
   {
       /* 生成参数字符串 */
       $post = array();
       foreach($_POST as $k => $v) {
           $post[] = $k.’=’.urlencode($v);
       }
       $poststr = implode(‘&’,$post);
       $r[‘server_no’] = $_GET[‘server_no’];

       $login = array(
           ‘url’=>’http://’.$r[‘server_no’].’.mail.qq.com/cgi-bin/login?sid=0,2,zh_CN’,
           ‘header’ => true,
           ‘cookie’ => ‘verifyimagesession=’.$cookie,
           ‘referer’ => ‘http://mail.qq.com/cgi-bin/loginpage’,
           ‘httpheader’=>array(
               "Host: " . $r[‘server_no’] . ‘.mail.qq.com’,
               "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9 FirePHP/0.2.4",
               "Content-Type: application/x-www-form-urlencoded",
           ),
           ‘post’ => $poststr ,
       );
       $data = $this->curlFunc($login);
       $data[‘html’] = iconv("gb2312", "UTF-8", $data[‘html’]);
       if ($data[‘http_code’] != 200) {
           $this->error($data);
           return false;
       }

      // var_dump(str_replace(‘script’,”,$data));exit;
       /* 测试数据 */
       //$data[‘html’] =file_get_contents(‘./r.txt’);
       $r[‘uin’] = $_POST[‘uin’];
       /* 登陆错误的判断 */
       if (preg_match(‘|errtype=(\d)|’, $data[‘html’], $temp_err)) {
           $r[‘login’] = false;
           if ($temp_err[1] == 1) {
               $r[‘msg’] = ‘账号和密码错误’;
           } elseif ($temp_err[1] == 2) {
               $r[‘msg’] = ‘验证码错误’;
           }
           return $r;
       }
       /* 登陆成功 */
       preg_match(‘|urlHead="([^"]+)"|i’,$data[‘html’],$temp_url);
       $urlhead = $temp_url[1];
       if (preg_match(‘|frame_html\?sid=([^"]+)"|i’,$data[‘html’],$temp_sid) ) {
           $r[‘sid’] = $temp_sid[1];
           $r[‘active’] = true;
       } elseif (preg_match(‘|autoactivation\?sid=([^&]+)?&|i’,$data[‘html’],$temp_sid) ) {
           $r[‘sid’] = $temp_sid[1];
           $r[‘active’] = false;
       }
       /* 登录后cookie的获取 ,在后续操作中用到 */
       if (preg_match_all(‘|Set-Cookie:([^=]+=[^;]+)|i’, $data[‘html’], $new_cookies) ) {
           $cookiestr = implode(‘; ‘, $new_cookies[1]);
           $cookiestr .= ‘; verifyimagesession=’.$cookie;
       }

       $r[‘login’] = true;
       $r[‘cookie’] = $cookiestr;
       return $r;
   }

   function openEmail($param)
   {
       $openEmail = array(
           ‘url’=>’http://’.$param[‘server_no’].’.mail.qq.com/cgi-bin/autoactivation?actmode=6&sid=’.$param[‘sid’],
           ‘header’ => true,
           ‘cookie’ => $param[‘cookie’],
           ‘referer’ => ‘http://’.$param[‘server_no’].’mail.qq.com/cgi-bin/autoactivation?sid=’.$param[‘sid’].’&action=reg_activate&actmode=6′,
           ‘httpheader’=>array(
               "Host: " . $param[‘server_no’] . ‘.mail.qq.com’,
               ‘Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7’,
               "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9 FirePHP/0.2.4",
           ),
       );

       $data =$this->curlFunc($openEmail);
       if (preg_match(‘|Set-Cookie:qqmail_activated=0|i’, $data[‘html’])) {
           $param[‘active’] = true;
           $param[‘cookie’] = $param[‘cookie’] .’; qqmail_activated=0; qqmail_alias=’;
       }
       return $param;
   }

   /**
    *
    * 获取friends数据
    *
    * @param $param = array(
    *  sid=>String , //用户认证的唯一标示
    *  login => Boolean, //true 登陆成功 ,false 登陆失败
    *  server_no => String // 服务器编号
    *  active => Boolean //true 已开通 ,false 未开通 邮箱
    *  cookie => String // 获取数据cookie
    *
    * );
    * @return Array(
    *  key=>value, // key:qq号,value: nickname
    * );
    */
   function getFriends($param)
   {

       $friend = array(
           ‘url’=>’http://’.$param[‘server_no’].’.mail.qq.com/cgi-bin/addr_listall?type=user&&category=all&sid=’.$param[‘sid’],
           ‘header’ => true,
           ‘cookie’ => $param[‘cookie’],
           ‘referer’ => ‘http://m151.mail.qq.com/cgi-bin/addr_listall?sid=’.$param[‘sid’].’&sorttype=null&category=common’,
           ‘httpheader’=>array(
               "Host: " . $param[‘server_no’] . ‘.mail.qq.com’,
               ‘Accept-Charset:utf-8;q=0.7,*;q=0.7’,
               "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.9) Gecko/2009040821 Firefox/3.0.9 FirePHP/0.2.4",
           ),
       );
       $r = $this->curlFunc($friend);
       if ($r[‘http_code’] != 200) {
           $this->error($r);
           return false;
       }
       $data =$r[‘html’];
       $preg = preg_match_all(‘|<p class="L_n"><span t="1" u="(\d+)" n="([^"]+)" e="([^"]+)">|i’, $data, $temp_list);
       if ($preg == 0) return array();
       $list = array_combine($temp_list[1],$temp_list[2]);
       return $list;
   }

   /**
    * 错误显示
    *
    * @param $str array
    *
    * @return
    */
   function error($str) {
       $str[‘html’] = str_replace(‘script’,”, $str[‘html’]);
       var_dump($str);
       exit;
   }
}

?>

源码下载:http://dl.javaeye.com/topics/download/28cecf25-7c12-375d-8293-1897a8630543
原文引用:http://www.javaeye.com/topic/375434

分类: PHP 标签: