Semantic web has been talking about many years. Now, it becomes more closer. Even people like me, less sensitive, should feel some thing happend in this net world. Yes, I should do something for this movement. Microformat as one part of this movement, I just learned about it recently, is a good start practical point for a coder like me.
I translate a Chinese version of XFN Creator 1.1 for the microformats.org and ask for nothing. Only hope it will help more people to know it.
http://www.beyondcow.com/creator-ch.html
If this page can be moved on http://microformats.org/code-tools I will update this post.
Thanks the orignal authors:
XFN Creator 1.0 by Matt Mullenweg . XFN Creator 1.1 update by Tantek Çelik .
大约在2006年,开始了 http://acm.nuc.edu.cn/OJ 的开发和维护工作。系统已经经历了3次大的改版。
1. 完全使用Servlet技术,简单的ajax技术。数据库是要mysql。提交处理的核心部分使用java多线程处理。核心裁判程序使用C++, WIM32 Process。
2. 基本程序未变。分离出MVC模式,servlet成为控制器,jsp文件做 View 部分。
3. 第三阶段取消使用java服务器,全面改为apache+php+mysql做web服务器。提交处理的核心模块分离出来使用C++,socket,mysql,POSIX thread,WIN32 Process守护程序。 核心裁判程序还是C++, WIM32 Process。成为总的三层结构。
第三阶段基本系统架构图如下:
2. Web接口
1. 提交守护进程
0. 核心裁判程序
三层架构带来的好处有几点:灵活的配置性,更强的出错冗余,规范的开发模式,更高的应用层负载,更快的响应速度
三层架构介绍
为何要三层结构?
OnlineJudge 是个比较特殊的应用型网站。提交的测试代码都会在服务器端编译,运行。这一点上和基本的防hacker教科书里倡导的无运行权限更安全的概念有些背道而驰。代码的编译和运行导致服务器高CPU和内存使用和更高的风险。所以能够分离网页服务器和裁判服务器是OJ系统的一个比较重要的特性。
经过之前的两个版本的实际运行,java服务器负责维护提交队列及处理线程会导致Web服务负载过高,严重降低web响应速度,甚至停止服务。分离出的第二层使用C++, Mysql API, POSIX thread, WIN32 Process与Java多线程和数据操作相比提供了异常高效的裁判过程。同时使得Web服务更加稳定,不会出现因为裁判问题导致无法浏览题目或排名之类的问题。
三层架构的第一层和第二层之间的socket协议是分离这两个部分的关键。这样当用户提交了代码,web程序插入代码到数据库,再通过socket连接通知提交守护服务器。这样完全可以建立一个裁判服务器集群。web程序端做少许配置,就可以自动选择空闲裁判服务器就行每次提交的处理。
核心裁判程序类似于传统cgi的运行模式。虽然cgi有着fork-and-execute模式的诟病,不过用在这里再合适不过了。第2层维护一个提交队列,以First Come First Served模式调用核心裁判程序运行和裁判用户提交代码,最大限度的保证了服务器的稳定性和测试时间和内存的准确性。一旦核心程序运行完毕完全释放进程及其所有的系统资源。
一个提交的处理流程(项目前编号表示负责的层)
2. 用户提交
2. Web程序处理提交
2. 添加到数据库
2. 通知提交守护服务器
1. 收到提交请求插入裁判队列
1. 如果裁判线程不存在创建
1. 循环从队列取出提交到数据库读取对应数据
1. 调用对应编译器编译代码
1. 编译成功准备测试数据调用裁判程序
0. 为用户程序建立新建成并监视
0. 提供测试数据并判断返回结果
0. 运行失败然后runtime error
0. 运行超过限制时间返回time limit error
0. 运行成功结果错误返回wrong answer
0. 结果有其他问题返回对应错误
0. 结果正确继续下一个测试数据
0. 所有测试数据通过返回accepted
0. 结束进程取得运行时间和内存
0. 内存超出返回memory limit error
三个版本所采用的保护技术
非法系统函数调用
第一个版本基本没有函数调用限制,简单的hack代码,就可以导致系统崩溃,或者数据流失。第一个版本后期采用了一个过滤程序,在源代码级别做字符串匹配来检测非法函数调用。缺点是误判率高。
第二个版本采用了编译器提供的参数,把源代码编译成汇编代码,再汇编代码级别过滤call调用到的函数。这样基本消灭了误判。并且可以把非法的函数调用消息提供给用户。 但缺点是增加了近1倍的编译时间,效率较低,而且编译参数和语言配置难度有所增加。
第三个版本采用了另一种方案。在用户源代码内安插OJ提供了宏定义文件,冲掉一些需要过滤的系统函数名。这样一遍编译就可以过滤掉非法函数调用。基本没有误判,包括用户自己重定义的系统函数也可以使用。而且较低了语言配置的难度。一个很小的缺点是无法提供给用户准确的非法函数调用消息,对应的变成编译错误信息。在这个方案中需要注意一点,对于 #define fopen oj_fopen 这样的定义,用户仍有可能在程序中自定义 #define oj_fopen fopen 来夺回系统函数使用权。所以增加运行时处理必不可少,简单的随机函数足够了。#define fopen oj_random()_fopen 这样用户出现非法调用会得到 main.cpp:58: error: `oj_893_fopen’ was not declared in this scope 这样的编译信息。既可以提到非法调用函数,又可以保证用户无法重定义
Runtime Error检测
多线程和多进程的一些注意问题
关键数据结构的互斥
守护进程建立的几个关键数据结构需要仔细的考虑线程互斥问题。例如裁判队列使用stl里的queue容器建立,访问该数据的至少有2个线程,包括socket线程做push操作,和裁判线程做pop操作。这是典型的生产者消费者模型,任何一本操作系统的教科书上都可以找到对应的例子。该部分只有对 POSIX thread 编程有准确的理解就可以安全的实现。
管道重定向
在新建编译和裁判进程时候需要重定义输入输出管道。它们是阻塞的,对于某些代码的编译执行会产生循环等待的情况,所以对于重定向的管道需要建立额外的线程进行处理。当编译,运行主线程超时关闭进程。
关于杀掉进程
杀掉进程的技术在OJ开发中必不可少。对于超时,错误的运行应该及时终止进程运行返还对应资源保证系统继续裁判。Windows API的进程函数提供了几种杀掉进程的方法。大部分网上的资料提到的是调用 TerminateProcess 结束进程。不过在建立OJ系统需要多考虑一些问题。直接调用 TerminateProcess 的确是可以结束子进程。但是OJ开发过程中发现,某些编译器运行时候自身还会建立额外进程,相当于我们的子子进程,而且恰好这些进程还占用大部分的编译时间。这时候如果OJ只调用 TerminateProcess 结束子进程就会导致一堆占用大量cpu时间的僵尸进程出现。所以正确的方法应该是调用 CreateToolhelp32Snapshot 得到系统进程快照,杀死进程树。
February 5th, 2010 in
OnlineJudge | tags:
OnlineJudge |
No Comments
CoolBox contain a subclass of NSBox with four corners configurable, gradient and a subclass of NSSlider and a subclass NSSliderCell.
CoolBox.zip
在Mac OS下没有像Windows下酷我音乐盒这样软件,这点很遗憾。只能用iTunes购买收费歌曲,而且iTunes对中文支持是在不怎么样, 经常出现乱码。
网上那么多免费链接为何不做一个类似软件呢。Beyondcow决定启动这个项目,为大家造福。该项目并非要取代iTunes, 只是提供搜索下载,歌曲编码调整,并整合到iTunes库里面。
iYY就是iYingyue的简称iYY . 让人赋予联想.
iYY在xcode下使用Cocoa开发。
特性
自动搜索音乐链接
多线程下载音乐
综合iTunes管理音乐
快捷键支持
自动更新
ID3编码自动修复
ID3编辑功能
音乐导入
系统需求Mac OS X 10.5 or Later
2.4.8 bate1 截图 Mon, Oct 26, 2009
iYY 2.4.8 Bate1 已经发放 请到主页下载.
1.当您下载到iYY之后,是一个压缩文件. 应该像iYY.2.2.zip这样的.
2.安装iYY非常简单,双击该文件系统就回解压缩得到iYY的运行程序iYY.app
3.拖动改程序到您的Applications目录下就可以使用了, 您也可以从Applications里拖动到Dock里方便今后使用
使用很简单,搜索框搜索歌曲.选中要下载歌曲双击 就加入下载队列. 从左边进入下载管理列表 进行管理.
默认歌曲下载目录为用户音乐目录 , 您也可以在配置面板内修改下载目录 .
默认语言为英语,您可以在配置面板设置中文
如果遇到程序问题 请在下面报告bug.
感谢大家对Beyondcow的支持.
July 26th, 2009 in
Project | tags:
iYY ,
Project |
83 Comments
iWord is a Greasemonkey script. It will help to find out the meaning of the english word from different dictionary website.
Current Version:0.1.6.20090722
Dicionary list:
July 23rd, 2009 in
Project | tags:
Project ,
script |
No Comments
校内连连看作弊器使用Java开发。推荐使用Firefox和IE7
February 28th, 2009 in
Project | tags:
Project ,
校内连连看作弊器 |
No Comments