[科学院新闻]珍惜动物领养基地内测版上线

新闻

     为期三天的假期结束,科学院山寨新产品-珍惜动物领养基地上线内测,欢迎参与。
进入地址: http://www.54chen.com/2/

特点:
1.此珍惜动物非珍稀动物,意在申请了要珍惜,不然此种动物会慢慢由大变小直到挂掉。
2.对于此动物的其他意义54chen不发表任何额外意见,提供在此仅供学习和娱乐。
3.欢迎抢短数字的ID(还有大量1-9的ID,一共9个...)。

3.5.里面的天气预报是山寨的,不过是非常准确的,判断了来访者的地域显示,和cctv的一样准。 
4.路过帮我喂。

领养一个珍惜动物!

[原创]打倒投票作弊,巧用flex防刷票

[文章作者:陈臻 本文版本:v1.2 最后修改:2009.4.28 转载请注明原文链接:http://www.54chen.com/c/520 ]

在开放ID投票的应用中,如果投票后的奖品丰富,必然会招来各种各样的刷票机和人肉刷票,如何防止刷票,也就成了大家头疼的事情。

一般情况下,大家都会使用限制IP的策略,同时加上Cookies,但是日常都刷票机都能解决掉这两种方法,下面介绍的是一种比较少用一些的方法,就是利用flash的share object机制来防止刷票,这只能增加刷票的成本,而不能完全规避这种行为,要做到没人刷票而又开放,基本上只能靠--人。

下面请看flex代码,内附注释(xx.mxml):

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()" applicationComplete="onBrowseClick()" width="190" height="54" horizontalAlign="center" verticalAlign="middle" alpha="0.44" backgroundGradientAlphas="[0.0, 0.0]" backgroundGradientColors="[#ffffff, #ffffff]">
<mx:Script>
<![CDATA[
import flash.external.*;
import com.cc.StringManipulator;
import com.cc.Md5;
import mx.controls.Alert;
[Bindable]
public var myTime:String;
[Bindable]
public var myUid:String;
[Bindable]
public var myHash:String;

private function init():void{//初始化 通过下面三个html传过来的参数进行下一步的计算
myTime = Application.application.parameters.t;
myUid = Application.application.parameters.u;
myHash = Application.application.parameters.h;
} private function onBrowseClick():void{
var hk123:SharedObject = SharedObject.getLocal( "hk123" );
var temp:String = hk123.data[myUid];
var hashCode2:String = '';
hk123.data[myUid]=myTime;
hk123.data.dt = myTime;
hk123.flush();
hashCode2 = Md5.calculate('caoninengdudaozelizhenxian' + myUid + myHash);//这一行自己加了个密钥串和传来的用户ID和服务器串进行md5 如果能破解flash到这里 这个基本上就破了 ExternalInterface.call("browse",temp,hashCode2);//提交到html里的js function->browse,通过这个js把form提交给服务器端,去计算整个串是不是对的或者是不是使用过的,也就可以限制重复了
} ]]>
</mx:Script>
</mx:Application>

  PS:

有许多朋友来mail问我js部分,特地加一下,其实就是一个简单的function,里面怎么写都行,只要把参数传到服务器端就成:

 

大致如下
function browse(a,b)
{
form.action += '&s1=a&s2=b';
form.submit();//其实用ajax传也不失为一个好办法
} 这就把一个form提出去了,你当然还可以用ajax什么的直接发那两个值去服务器端就是了。
END

手机之家新系统介绍及架构分享

上周听小兄弟blankyao介绍说手机之家有个技术交流会,忙着搞校内的群组,一时没在意,这周看了dbanotes冯老大的文章才知道爆了不少料,挺不错的交流会,没去后悔了。附会议ppt,转自 http://dbanotes.net

手机之家新系统介绍及架构分享
View more presentations from Fenng Feng.
很遗憾没能在现场提问,细细看完整个ppt,基本上了解了整个DAL的想法,一直都在思考去弄一个这样的东西,始终都有瓶颈,对于DAL的构思没有什么想法,总结一下,没有看出我遇到的问题的解决方案,列出一下:

1.DAL能解决多维度的数据在高负载下的瓶颈吗?有什么方案?多维度:比如说豆瓣的群组,假设一个人有10W个组,每个组里有100w个人,如果应用要求列出每个组的人和每个人的组,只用一份数据,DAL+缓存能搞定吗?

2.如果只是靠硬件来撑DB的访问量,那DAL和DBproxy或主从DB的优势在哪里?

54chen Has Joined in One Earth Hour

“地球一小时”是WWF(世界自然基金会)应对全球气候变化所提出的一项倡议,希望参与到活动中的个人、社区、企业或政府可以在特定的时间熄灯一小时,以此来激发人们对保护地球的责任感。今年的3月28日的20:30至21:30之间,预计全球将会有超过80个国家的千余个城市和约为10亿人参与到“地球一小时”活动当中。

校内网招聘Flash A3工程师

 

任职要求:

1、计算机、软件类相关专业本科以上学历; 

2、热爱技术,对编程有足够的兴趣,勇于尝试,较强的创新能力; 

3、具有良好的算法基础及系统分析能力,具备良好的编程习惯。

4、对AS2,Flex有了解,熟悉AS3开发及架构体系;

5、有独立完成程序架构和撰写的能力,对Flash的架构设计有一定的认识;

6、至少会使用一种图片处理软件,如:Photoshop;

7、至少会一种后端程序语言,如:ASP,PHP,JSP 等。

6、系统工程师

职位描述

1. 负责大规模Linux服务器的日常监管维护;

2. 提供服务器系统相关的内部技术支持;

3. 独立或协助开发人员优化业务系统;

职位要求

1、二年以上 Linux 系统管理经验,或两年以上的Linux环境下C、C++、Python或PHP软件开发的经验;

2. 熟练使用 Linux 下的各种系统维护相关的工具;

3、熟练编写日常工作所需的脚本;

4、熟悉Linux服务器上常用服务的部署、检测、排障;

5、掌握并能熟练运用网络协议等基本原理;

6、较强的文档编写能力

 要求,全日制本科以上学历

 211工程学校的优先考虑

待遇:5.6.7.8.9.10 等等

另招 DBA、c++、wap、产品经理、系统工程师 有兴趣的m我推荐

czhttp at gmail dot com

校内网招聘研发工程师

任职资格:

1、计算机或通信、数学等相关专业毕业;

2、至少3年以上软件开发经验,有团队合作精神;

3、精通java面向对象编程,精通JSP/Servlet/HTML/JavaScript/JDBC/XML;

4、了解MVC和Apache Struts,Spring,Hibernate者;

5、熟悉Oracle,Sql Server,Mysql等数据库开发经验;

6、精通HTML、JavaScript;精通JSP、Java的开发;精通SQL程序设计;

7、熟悉Apache、Tomcat、Resin等配置;

 要求,全日制本科以上学历

 211工程学校的优先考虑

待遇:5.6.7.8.9.10 等等

[原创]Discuz! BBS的主动缓存和被动缓存

[文章作者:陈臻 本文版本:v1.1 最后修改:2009.3.16 转载请注明原文链接:http://www.54chen.com/c/505]

DZ的缓存同样分了主动缓存和被动缓存。从功能上来说,主动缓存一般用到管理员对全站的设置,等等需要手动更新的地方,这些地方的数据都有一个特点,那就是它们的更新可能性很小,平时不需要自动更新;DZ的被动缓存,一般分布在诸如帖子内容显示,用户信息更新这些地方,这些地方的更新基本上都是因为用户使用了某一特定的功能时所激发的。

在正常运行的DZ系统文件夹里面会有一个forumdata文件夹,这个是论坛记录和缓存文件的存放目录,一般这些文件都是自动生成的,在forumdata/cache/里面存储的都是一些DZ的基本设置和一些常使用的值,这些值一般在系统初始化的时候就保存在$_DCACHE全局变量中,在后面的操作中将可以简单地使用它们进行功能上的判断。

1)主动缓存,也就是只在用户操作后台时,由DZ系统去删除原有缓存进行更新的缓存。它们普遍存在于forumdata/cache/目录中,比如说/forumdata/cache/cache_settings.php保存了整个系统的核心设置,一般情况是不会更新的,只有后台修改了比如站点名称等关键信息的时候才会去主动更新这个缓存文件。还有用于保存用户组和管理员组相关信息的两类缓存文件:

/forumdata/cache/usergroup_'.intval($groupid).'.php

/forumdata/cache/admingroup_'.intval($adminid).'.php

另外还有在indexforumdisplayviewthreadpostblogtopicadminregisterarchiver几个模块中的时候分别会使用的cache_'模块名'.php的缓存。在include/common.inc.php中的流程可以看到,这些类似的主动缓存都有一个特点:统一进行引用(include),最后进行失败检测,最后再对失败的缓存(比如说文件丢失或者是上次更新还没生成这样的情况下)统一进行重新生成的操作,具体的生成方法见/include/cache.func.php中的updatecache函数。

2)被动缓存,也就是缓存的生成并非是由用户手动更新的,而是在系统里判断是否需要生成缓存,需要缓存多长时间,由系统自身来完成整个过程。很典型的代表有帖子内容的缓存生成过程。帖子内容的缓存路径被cache_setting.php里定义为一个可以由用户修改的值,默认是在forumdata/threadcaches下,由viewthread.php里的逻辑可以看到,当满足使用缓存条件的时候(一般情况是第一页的内容),系统会执行viewthread_loadcache函数,此函数会判断缓存是否过期,如果不过期就执行函数中间读取缓存的操作,最后DZ直接巧妙地在函数中die出一段javaScript,结束访问。专研DZ代码的你可能会很疑惑,究竟是什么时候生成的缓存呢?include文件夹里有一个global.func.php,这个文件包括了整个DZ系统使用到的全局方法,其中有一个叫output的函数,在函数里判断了是否可以缓存当前的页面,并且使用ob_get_contents函数直接缓存页面。

提示:ob_start()在服务器打开一个缓冲区来保存所有的输出。所以在任何时候使用echo ,输出都将被加入缓冲区中,直到程序运行结束或者使用ob_flush()来结束。然后在服务器中缓冲区的内容才会发送到浏览器,由浏览器来解析显示。函数ob_end_clean 会清除缓冲区的内容,并将缓冲区关闭,但不会输出内容。此时得用一个函数ob_get_contents()ob_end_clean()前面来获得缓冲区的内容。这样的话, 能将在执行ob_end_clean()前把内容保存到一个变量中,然后在ob_end_clean()后面对这个变量做操作。

关于哥学社: 哥学社是一个自由博客组织,以提高原创技术博客质量,为成员博客增加更有效评论,由来自腾讯、百度、盛大、人人网、新浪、奇虎、TOM等各大企业的哥们共同起草发起。

关于五四陈:
54chen(陈臻),人人网海量存储NuClear核心开发人员,业余时间混迹于各技术组织且乐此不疲。目前关注实施PHP培训。对flex等前端技术有一点研究。
个人技术站点:http://www.54chen.com/ 。可以通过电子邮件 czhttp@gmail.com 联系到他。

[原创][收集]各种语言版本的变量值作变量名的方法

[文章作者:陈臻 本文版本:v1.1 最后修改:2009.3.11 转载请注明原文链接:http://www.54chen.com/c/498]

在写代码的过程中,不可避免经常遇到的一个问题是,如何将上下文中的变量值当变量名。本文将收集各种语言下的情况,以供参考。

PHP

这是最最简单的一种:

<?php

$fruit = "apple";

$var = "fruit";

echo $$var;

?>

将得到结果 apple

JAVA

JavaScript

<script type="text/javascript">
var str = "hello world!";
var str2 = "str";
alert(eval(str2));
</script>

将得到结果:hello world

AS2

AS3

Perl

C

VFP

str1="Gaom"
str2="str1"
WAIT WINDOW &str2.
得到“Gaom”               VFP程序由Gaom同志赞助播映

Shell

v1=aaa
v2=bbb
c=1
if [ $c -eq 1 ]
then
  vname=v$c   #找到符合条件的变量名为v1
  eval vvv="$"$vname ; echo vvv: $vvv    #将变量v1的值赋予vvv,即,使vvv=aaa
  eval vvv='$'$vname ; echo vvv: $vvv    #将变量v1的值赋予vvv,即,使vvv=aaa
#eval vvv=$$vname   ; echo vvv: $vvv    #错误用法
fi

如何用php代码清空squid缓存下的指定文件

[文章作者:陈臻 本文版本:v1.0 最后修改:2009.3.5 转载请注明原文链接:http://www.54chen.com/c/490]

    PURGE 是一个特殊的HTTP请求方法。它是Squid 的专有方法,没有在任何RFC 里定义。它让管理员能强制删除缓存对象。既然该方法有些危险,squid 默认拒绝PURGE 请求,除非你定义了ACL 引用了该方法。否则,任何能访问cache 者也许能够删除任意缓存对象。我推荐仅仅允许来自localhost 的PURGE:
acl Purge method PURGE
acl Localhost src 127.0.0.1
http_access allow Purge Localhost
http_access deny Purge  (squid.conf摘要)

以下是使用purge删除指定文件的两个函数:

    //发送socket数据
function socket_service($ip, $port='80', $out="")
{  if(trim($ip)=="")return "Error: without dest host!";
 if($out=='') $out="GET / HTTP/1.1\r\nHost: $ip\r\n\r\n";
 $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
 $sourceips['internal'] = '6.4.10.9';
 $sourceips['external'] = '6.4.10.9';
 socket_bind($sock, $sourceips['internal']);
 socket_connect($sock, $ip, $port);
 socket_write($sock, $out);
 $return=socket_read($sock,100000);
 socket_close($sock);
 return $return;
} //更新url指定的文件cache
function purgeFile($url)
{   $squid_dv=array("1.5.5.6","6.6.8.8");//两个前端squid
  $request="PURGE $url \n";
  foreach($squid_dv as $key => $ip)
  {
   $result=socket_service($ip,80,$request);
  }
}

  这样只需要在代码里使用 purgeFile('/xxx.gif');即可将上述两个服务器中指定的路径文件缓存删除。