May 11

点击这里下载

博客链接收集中

先看这里 http://www.qconbeijing.com/SpeakersList.aspx

Tim yang

May 06

公司行业:  互联网/电子商务

公司规模:  150-500人

公司简介:

   上海商派(ShopEx)网络科技有限公司

国内最大的电子商务软件及服务提供商,始于2002年,是国内网店系统持续研发最久、业内规模最大、国内市场占有率最高、发展速度最快的公司。
目前,ShopEx仅研发团队就超过100多人,市场占有率达70%,日增用户更高达1500个!ShopEx旗下的网上商店、网上商城、网络分销管理系统以及丰富的网商工具,以强大的功能、领先的技术、专业的服务以及快速的价值体现,获得了市场上近50万用户的肯定,也是80%年营业额过亿的电子商务企业的首选。
多年来,ShopEx虚心听取所有用户的建议,不断总结经验,深受业内及社会各界的好评,多次荣获国家权威机构颁发的重要奖项。
2006最具价值电子商务软件奖
2007优秀电子商务服务商奖
2008最佳电子商务技术服务奖
2009 最佳电子商务技术服务奖
2009年度上海明星软件企业

公司网站:http://www.shopex.cn

联 系 人:梁小姐

电子邮箱:liangliang@shopex.cn

PHP软件工程师 2名  ,工作地点上海徐家汇虹桥路333号4和6楼

职位描述
职位说明
负责公司软件产品的研发工作与其他项目的开发;
职位要求
PHP实际项目编程经验1年以上,熟练掌握PHP5面向对象编程,熟悉Mysql; 
精通Html、Java Script、CSS、XML等知识; 
熟悉AJAX,用户行为分析等web2.0关键技术; 
熟悉软件设计流程和软件工程规范,具备良好而规范的设计和技术文档编写能力; 
工作积极主动,富有创造力和激情,有良好的团队合作能力,善于沟通, 善于表达自己的思想; 
有Linux下JAVA,C/C++编程经验者优先。

 

具体要求也可查看 这里 和 51job

Apr 22

该方案使用mysqldump 导出数据包并压缩(一个数据库一个压缩包),使用shell搭配crontab每天凌晨3点导出并删除七天前的压缩文件夹

如下代码最早出处来自国外,看如下注释

mysql_shell_backup\mysql_del_old_backups.sh

#!/bin/bash
# Shell script to backup MySql database
# To backup Nysql databases file to /backup dir and later pick up by your
# script. You can skip few databases from backup too.
# For more info please see (Installation info):
# http://www.cyberciti.biz/nixcraft/vivek/blogger/2005/01/mysql-backup-script.html
# Last updated: Aug - 2005
# --------------------------------------------------------------------
# This is a free shell script under GNU GPL version 2.0 or above
# Copyright (C) 2004, 2005 nixCraft project
# Feedback/comment/suggestions : http://cyberciti.biz/fb/
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# -------------------------------------------------------------------------

MyUSER="xxxx"       # USERNAME mysql用户名 记得修改为自己的
MyPASS="xxxx"    # PASSWORD mysql密码 记得修改为自己的
MyHOST="localhost"   # Hostname

# Linux bin paths, change this if it can not be autodetected via which command
MYSQL="$(which mysql)"	#获取mysql路径
MYSQLDUMP="$(which mysqldump)"#获取mysqldump路径
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"
#TAR="$(which tar)"

#echo 'date %y%m%d'
# Backup Dest directory, change this if you have someother location
#date +%Y-%m-%d-%H-%M-%S
DEST="/e"

# Get hostname
HOST="$(hostname)"

# Get data in dd-mm-yyyy format
NOW="$(date +"%Y-%m-%d")" 	#获取当前时间
#(date +%Y-%m-%d-%H-%M-%S)
# File to store current backup file

# Main directory where backup will be stored
MBD="$DEST/mysqlbackup"

FILE=""
# Store list of databases
DBS=""
#alias mysql1="mysql -uroot -pz5896321 -S /tmp/mysql.sock"
# DO NOT BACKUP these databases
IGGY="information_schema test mysql"#IGGY内的数据库不需要被mysqldump出来备份

[ ! -d $MBD ] && mkdir -p $MBD || :

# Only root can access it!
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST

# Get all database list first
DBS="$($MYSQL  -S /tmp/mysql.sock -u$MyUSER -p$MyPASS -h $MyHOST  -Bse 'show databases')"#Bse 具体看mysql手册中的解释
#-S /tmp/mysql.sock 我这台服务器的sock路径是这个
for db in $DBS
do
    skipdb=-1
    if [ "$IGGY" != "" ];
    then
	for i in $IGGY
	do
	    [ "$db" == "$i" ] && skipdb=1 || :
	done
    fi

    if [ "$skipdb" == "-1" ] ; then
#	FILE="$MBD/$db.$HOST.$NOW.gz"
	FILE="$MBD/$db.$NOW.gz"
	# do all inone job in pipe,
	# connect to mysql using mysqldump for select mysql database
	# and pipe it out to gz file in backup dir :)
        $MYSQLDUMP -S /tmp/mysql.sock -u $MyUSER -h $MyHOST -p$MyPASS $db | $GZIP -9 > $FILE
    fi
done

删除七天前的备份文件数据
mysql_del_old_backups.sh

#!/bin/env bash
upper_days=7
#该变量表示 “前几天”
directory=$(find /e -mtime +$upper_days |grep mysql |grep -v mysql_backup.sh |grep -v gz)
# 先说明这里的/e 文件夹下没有其他多余的文件 全都时备份文件夹和里面的备份文件
# -mtime参数表示 修改时间 modify time +7 大于7天 就是7天和7天以前的
# grep mysql 这个目录下所有mysql开头
# grep -v gz 结果里去除以gz结尾的文件
echo $directory
rm -rf $directory
#之后删除
#find /e/ -mtime +7 |grep mysql |grep -v mysql_backup.sh |grep -v gz
crontab -e
0 3  *  *  *  /d/env/crontab/mysql_backup.sh >> /e/mysql_backup.log
0 3  *  *  *  /d/env/crontab/mysql_del_old_backups.sh >> /e/mysql_del_old_backups.log
Apr 18

ban_ip_with_memcached_flood这篇文章根据 互联网网站的反爬虫策略浅析 使用php实现
假设现有一phpwind搭建论坛,在global.php文件内require_once(‘ban_ip_with_memcached_flood.php’)

ban_ip_with_memcached_flood.php文件

<?php
/* begin iptable with memcache for ban the flood ip*/

//memcache 连接
$memcache_obj = new Memcache;
$memcache_host = "127.0.0.1";
$memcache_obj->connect($memcache_host, 11211) or die ("Could not connect memcached at localserver");

//获取客户端ip
function getIp()
{
//php获取ip的算法
if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"])
{
$ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
}
elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"])
{
$ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
}
elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"])
{
$ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
}
elseif (getenv("HTTP_X_FORWARDED_FOR"))
{
$ip = getenv("HTTP_X_FORWARDED_FOR");
}
elseif (getenv("HTTP_CLIENT_IP"))
{
$ip = getenv("HTTP_CLIENT_IP");
}
elseif (getenv("REMOTE_ADDR"))
{
$ip = getenv("REMOTE_ADDR");
}
else
{
$ip = "Unknown";
}
echo "你的IP:".$ip ;
return $ip;
}

$client_ip = getIp();
//防火墙拦截语句 可惜开了 php.ini的safe_mode为on才可使用,并且需要相应权限才能让php重新加载php配置文件
$iptable_statement= "iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s $client_ip";
#echo($iptable_statement);
$ip_counter = $memcache_obj->increment($client_ip);
#var_dump($ip_counter);
if (!$ip_counter) {
   $memcache_obj->set($client_ip,1, 0, 60);
}elseif ($ip_counter>300) {
   $crawler_counter = $memcache_obj->increment("crawler/$client_ip");
   if (!$crawler_counter) {
        $memcache_obj->set("crawler/$client_ip",1, 0, 60);
   }
   elseif ($crawler_counter>50){
        #BlackList.add(ip_sec)
        //执行iptable 防火墙指令
        #echo exec($iptable_statement);
        echo exec("echo 'deny $client_ip;\n'>>/d/nginx/conf/ip_ban.conf");
        #注意nginx 配置文件路径
        #echo exec("nginx -s reload");
        header('HTTP/1.1 403 Forbidden');
        die("Unauthorized access forbidden! 爬虫再见");
   }
   #var_dump($crawler_counter);

   header('HTTP/1.0 401 Unauthorized');
   die("Unauthorized access forbidden! 未认证授权");
   #render :template => 'test', :status => 401 and return false
}

/* end iptable with memcache for ban the flood ip*/
?>

这里的 ip_ban.conf 是nginx的 httpaccess module 加载配置文件,利用它和crontab来实现每2秒重新reload
nginx配置文件禁止ip访问,从0.8版本开始nginx的reload方法 /d/env/nginx/sbin/nginx -s reload

mkdir -p /d/env/crontab
#创建cron执行的shell文件
nano /d/env/crontab/nginx_ban_ip.sh

#!/bin/env sh
#每2分钟重载nginx配置
/d/nginx/sbin/nginx -t
/d/nginx/sbin/nginx -s reload

#shell文件需要x权限
chmod +x /d/env/crontab/nginx_ban_ip.sh

#给ip_ban加上www执行权限,由于我的nginx和php都是www用户执行
chmod 777 /d/nginx/conf/ip_ban.conf
chown www:www /d/nginx/conf/ip_ban.conf
ll /d/nginx/conf/ip_ban.conf

#crontab -e 添加2分钟执行shell的语句
*/2 *  *  *  *  /d/env/crontab/nginx_ban_ip.sh

找到一款不错的网站压力测试工具webbench[原创]

使用该压力测试对nginx服务器进行虐待,测试以上反爬虫效果,注意linux系统专用
webbench -c 200 -t 30 http://www.xxxxxxxxxxxxxxxxxxxxxxxx.com/

30秒内开启浏览器访问网址吧 ,应该会显示“爬虫再见”,2分钟之后nginx就会重读配置文件,之后返回403,ip地址被禁止访问了。
(403页面可以自定义)

Mar 19

1 如何查看phpwind的版本?
登陆论坛 管理页面 默认为admin.php ,页面底部最下方
Powered by PHPWind 7.5 SP3 (GBK) © 2003-09,phpwind.com 这字样
不过pw系统更新太快 而且版本号居然也不写,,真是。。。只能从这个时间上判断

Mar 19

从服务器 部署的老版本 web文件和数据库文件导出压缩之后传输到本地进行升级
以下环境都在linux服务器下
1 进入web文件存放处(假设文件存放在/d/web/phpwind)

cd /d/htdocs/phpwind

tar zcvf filename.tgz ./ \
--exclude="pwb" \
--exclude="works_file" \
--exclude="home/attachment" \
--exclude="attachment" \

\ 为换行分隔符,为了可以让命令多行
–exclude表示排除 可以排除文件夹 可以以扩展名排除文件 例如 –exclude=”*.jpg”

2 导出 mysql数据库文件

mysqldump -udbusername -pdbpwd -S /tmp/mysql.sock dbname>dbname.sql
tar zcvf dbname.sql.tgz dbname.sql

解说
dbname #是数据库名
dbusername #是数据库访问用户名
dbpwd #是数据库访问密码

剩下要做的就是使用各种ftp ssh 文件来传输文件

3 之后下载下来的phpwind 修改 data/sql_config.php 修改连接字符串

Mar 04

github上开始用actionscript3 编写巴巴变的api,没办法yupoo坏了。
暂时只实现了 第一个 bababiao.getRecommendPhoto的方法(今日精彩照片

具体的使用方法都在github的readme里 ,这里放上演示

Mar 04

pw的模板就不用提了,和discuz比较看看。
以下phpwind

以下discuz

至于shopex,dedcms的也不用介绍了。拜托,phpwind,专业点。

前几天和同事 讨论起一个javascript问题,为了搞一个幻灯js播放的效果,使用的是veryide的js.
这段代码单独独立了出来放在干净的html里没什么问题,可是一放到phpwind的系统里就出错。


print <<<EOT
-->

<script  type="text/javascript" src="mode/area/themes/home1/js/veryide.core.js"></script>
<script  type="text/javascript" src="mode/area/themes/home1/js/veryide.library.js"></script>
<script  type="text/javascript" src="mode/area/themes/home1/js/veryide.effect.js"></script>
<script type="text/javascript">
addLoadEvent(function(){
	/*****************/
	var TO = new VeryIDE.TabOption("mouseover");
	TO.TabClass("active","");
	var Sel = $E("#a-slide ol li");
	var Box = $E("#a-slide ul li");
	//使用firefox查看
	console.log(Sel);

	//console.log(Box);

	for(var i=0;i<Sel.length;i++){
		TO.Add(Sel[i],Box[i]);
	}
	TO.Play(0);
	TO.Auto(3000);
	/*****************/

});
</script>

<!--
EOT;

单独运行以上的代码,使用firebug查看console.log 返回的是4个li

[li, li, li, li]

一旦放入phpwind,变成

 "#a-slide ol li"

本以为是pw做了和dz一样事情,改写了javascript的prototoype中的push方法(详见google),但最后发觉问题出在模板引擎上,最后模板引擎出现的结果是

addLoadEvent(function(){
 /*****************/
 var TO = new VeryIDE.TabOption("mouseover");
 TO.TabClass("active","");
 var Sel = ("#a-slide ol li");
 var Box = ("#a-slide ul li");

 console.log(Sel);

真相大白,由于模板引擎将dollar符合也给解析掉了,大家都很喜欢$啊。使用转义字符或者干脆直接将js文件放到文件里用script载入,而且可以进行js减肥和压缩。

var Sel = \$("#a-slide ol li");

修改在运行 这下对了

addLoadEvent(function(){
 /*****************/
 var TO = new VeryIDE.TabOption("mouseover");
 TO.TabClass("active","");
 var Sel = $("#a-slide ol li");
 var Box = $("#a-slide ul li");
Feb 17

51dpg 的全名就是 我要点评游戏,作为一个类似像fami通一样的投票网站而诞生的。本blog是一个纯粹的以讨论计算机技术为主的博客。

preload preload preload