Mar
4
花钱如流水 v0.0.1
By Felix021 @ 2010-03-04
http://www.felix021.com
一个PHP+MySQL的简易支出记录系统,提供一些最基本功能,界面简单,方便手机使用。
安装:随便找一个数据库,导入tbl.sql,然后修改config.php里的相关参数即可使用。
(界面很难看,代码很难看,原则:够用就好。)
By Felix021 @ 2010-03-04
http://www.felix021.com
一个PHP+MySQL的简易支出记录系统,提供一些最基本功能,界面简单,方便手机使用。
安装:随便找一个数据库,导入tbl.sql,然后修改config.php里的相关参数即可使用。
(界面很难看,代码很难看,原则:够用就好。)
下载文件 (已下载 1336 次)
Feb
10
决定了毕设做这个东西。WOJ3.0。
起名Land,不是我自己想出来的,忘了是谁贡献的了。之所以叫做Land,看如下的woj名字的演化就知道原因了:D
noah(v1.0) -> oak(ark?)(v1.1) -> flood(v2.0) -> land(v3.0)
去年暑假还写了个不成器的judge然后就荒了,不过也算是打个基础。
这次要更详细地考虑具体的OJ系统架构了。
前端就apache+php吧。如果有空可以试试加一层lighttpd。需要完成的基本功能就是题目相关(包括统计数据),比赛(虚拟比赛?),站内信,题目讨论,后台管理。模板尽量参考Noah的,保持风格统一。这个是代码量最大的,但是应该不难。主要是要实现容易扩展的架构,使得将来增加新功能比较方便,不再需要重写OJ了。
数据库还是MySQL,比较熟。得有个数据转换工具,把noah的数据转过来。
Daemon可以用java,我给oak重写的那个版本拿来改改就能用。
希望有一个judge wrapper负责数据库相关的处理,让judge只负责judge。看起来用php挺好的。
Judge可以在hustoj和之前那个oj的基础上写一个,不过还得有进一步的拆分。每个语言一个judge,因为编译、执行、监控可能都有较大区别。把判断AC/PE/WA的功能和SPJ的功能也独立出来,由wrapper来组装使用。
可能还需要一个补单的,有可能数据库中存在一些还没有judge并且不会再被自动judge的item。
此外有点想搞一个memcached,减轻在比赛时mysql的负担。
目前想到这些,这两天再仔细考虑考虑,就要动手做了。希望有人多提意见和建议。
p.s. 祈祷这个项目不会烂尾...
起名Land,不是我自己想出来的,忘了是谁贡献的了。之所以叫做Land,看如下的woj名字的演化就知道原因了:D
noah(v1.0) -> oak(ark?)(v1.1) -> flood(v2.0) -> land(v3.0)
去年暑假还写了个不成器的judge然后就荒了,不过也算是打个基础。
这次要更详细地考虑具体的OJ系统架构了。
前端就apache+php吧。如果有空可以试试加一层lighttpd。需要完成的基本功能就是题目相关(包括统计数据),比赛(虚拟比赛?),站内信,题目讨论,后台管理。模板尽量参考Noah的,保持风格统一。这个是代码量最大的,但是应该不难。主要是要实现容易扩展的架构,使得将来增加新功能比较方便,不再需要重写OJ了。
数据库还是MySQL,比较熟。得有个数据转换工具,把noah的数据转过来。
Daemon可以用java,我给oak重写的那个版本拿来改改就能用。
希望有一个judge wrapper负责数据库相关的处理,让judge只负责judge。看起来用php挺好的。
Judge可以在hustoj和之前那个oj的基础上写一个,不过还得有进一步的拆分。每个语言一个judge,因为编译、执行、监控可能都有较大区别。把判断AC/PE/WA的功能和SPJ的功能也独立出来,由wrapper来组装使用。
可能还需要一个补单的,有可能数据库中存在一些还没有judge并且不会再被自动judge的item。
此外有点想搞一个memcached,减轻在比赛时mysql的负担。
目前想到这些,这两天再仔细考虑考虑,就要动手做了。希望有人多提意见和建议。
p.s. 祈祷这个项目不会烂尾...
Feb
9
这几天简单学习了一下jsp的使用(主要是看《jsp开发web应用系统参考书籍》系列pdf),大致做一下记录。
首先是环境,jdk是必须的,服务器我用tomcat,因为以前搞noah/oak的时候整过,熟悉些。具体的配置不赘述了,网上很多,无非是JAVA_HOME CLASSPATH CATALINA_HOME之类的环境变量。此外为了连上mysql,还要去下个jar,比如mysql-connector-java-5.0.8-bin.jar,可以在网上搜到。这个要放在tomcat/shared/lib/下面。当然,也是可以放在jsp的WEB-INF/lib下面,但是这个我没研究过,不太了解细节。
最简单地写JSP,其实和写ASP/PHP很像,把java当成一个面向过程的语言填上去就行了。比如经典的hello world:
因为这里的java和普通的*.java程序不一样,所有有些语句也得变,比如import不能直接用了,必须这么写:
格式为 <%@ page oo="xx" %> 这样的oo和xx有很多个,比如session开关就是通过这种方式控制,详情参考那些pdf。包含文件则用<%@ include file="xxxx" %>这样的格式。
在编写的过程中要获取GET/POST等请求的数据以及客户端IP等信息的时候,可以使用默认import进来的request对象,有getParameter()、getMethod()、getRequestURI()、getRemoteADDR()....等方法。相当于php的$_GET/$_POST/$_SERVER等变量的大杂烩。
要控制输出,比如HTTP Header或者具体的Cookie字段,则使用response对象的addCookie()、addHeader()等方法。
Session,则是使用session对象。但是要先<%@ page session="true" %>开启session。
此外还有一个和ASP同样性质也同名的Application对象。看起来像是抄ASP的。就是一个和服务器同生死的全局变量。
以上就是最简单的jsp开发需要的一些东西了。至少开发一个留言板什么都OK了 :)
至于Java Beans,这个是第六章,我还没看...
首先是环境,jdk是必须的,服务器我用tomcat,因为以前搞noah/oak的时候整过,熟悉些。具体的配置不赘述了,网上很多,无非是JAVA_HOME CLASSPATH CATALINA_HOME之类的环境变量。此外为了连上mysql,还要去下个jar,比如mysql-connector-java-5.0.8-bin.jar,可以在网上搜到。这个要放在tomcat/shared/lib/下面。当然,也是可以放在jsp的WEB-INF/lib下面,但是这个我没研究过,不太了解细节。
最简单地写JSP,其实和写ASP/PHP很像,把java当成一个面向过程的语言填上去就行了。比如经典的hello world:
<html>
<body>
<%
out.println("Hello, world!\n"); //在jsp里输出就用out啦,不是System.out。
%>
</body>
</html>
<body>
<%
out.println("Hello, world!\n"); //在jsp里输出就用out啦,不是System.out。
%>
</body>
</html>
因为这里的java和普通的*.java程序不一样,所有有些语句也得变,比如import不能直接用了,必须这么写:
引用
<%@ page import="java.sql.*" %>
格式为 <%@ page oo="xx" %> 这样的oo和xx有很多个,比如session开关就是通过这种方式控制,详情参考那些pdf。包含文件则用<%@ include file="xxxx" %>这样的格式。
在编写的过程中要获取GET/POST等请求的数据以及客户端IP等信息的时候,可以使用默认import进来的request对象,有getParameter()、getMethod()、getRequestURI()、getRemoteADDR()....等方法。相当于php的$_GET/$_POST/$_SERVER等变量的大杂烩。
要控制输出,比如HTTP Header或者具体的Cookie字段,则使用response对象的addCookie()、addHeader()等方法。
Session,则是使用session对象。但是要先<%@ page session="true" %>开启session。
此外还有一个和ASP同样性质也同名的Application对象。看起来像是抄ASP的。就是一个和服务器同生死的全局变量。
以上就是最简单的jsp开发需要的一些东西了。至少开发一个留言板什么都OK了 :)
至于Java Beans,这个是第六章,我还没看...
Jan
30
$from = 'FROM: "=?UTF-8?B?' . base64_encode($yourname) . '?=" <from@yourdomain.com>';
$content = 'Content-Type: text/html; charset=UTF-8';
if (mail("to@yourdomain.com", "Subject", $msg, "{$from}\r\n{$content}\r\n")) {
echo "搞定!";
}
else {
echo "可耻地失败鸟...";
}
$content = 'Content-Type: text/html; charset=UTF-8';
if (mail("to@yourdomain.com", "Subject", $msg, "{$from}\r\n{$content}\r\n")) {
echo "搞定!";
}
else {
echo "可耻地失败鸟...";
}
大致记录一下:
额外的HEADER指定了FROM和Content-Type字段
Content-Type用于标识内容是什么格式(text/html),什么编码(UTF-8)
下面这一行表示发件人,显示名称“xxxxxx”是经过BASE64编码(那个?B?的意思)后的UTF-8字符。
FROM: "=?UTF-8?B?xxxxxxxx?=" <from@yourdomain.com>
如果Subject需要中文字符,应该类似地:
SUBJECT: =?UTF-8?B?xxxxxxx?=
Jan
29
Jan
25
Jan
24
参考这里的教程写的: http://www.developer.com/article.php/3417381
同时也终于知道了stmt原来是Statement的简写,惭愧。。。
同时也终于知道了stmt原来是Statement的简写,惭愧。。。
import java.sql.*;
public class Jdbc11 {
public static void main (String args[]) {
try {
Class.forName("com.mysql.jdbc.Driver");
Statement stmt = null;
String url = "jdbc:mysql://localhost:3306/test";
String dbuser = "root";
String dbpass = "123456";
String dbname = "felix021";
String tblname = "users";
Connection con = DriverManager.getConnection(url, dbuser, dbpass);
stmt = con.createStatement();
System.out.println("URL: " + url);
System.out.println("Connection: " + con);
//建库
stmt.executeUpdate("CREATE DATABASE IF NOT EXISTS " + dbname);
stmt.executeUpdate("USE " + dbname);
//建表
stmt.executeUpdate("DROP TABLE IF EXISTS " + tblname);
stmt.executeUpdate(
"CREATE TABLE " + tblname + "(\n" +
" `id` INT PRIMARY KEY AUTO_INCREMENT, \n" +
" `name` CHAR(20) NOT NULL, \n" +
" `description` varchar(255) DEFAULT NULL\n" +
")"
);
//插入
int count = stmt.executeUpdate(
"INSERT INTO " + tblname + "\n" +
"(`id`, `name`, `description`) VALUES \n" +
"(NULL, 'a', 'ooxx'), \n" +
"(NULL, 'b', NULL), \n" +
"(NULL, 'c', 'haha'), \n" +
"(NULL, 'd', 'hoho')"
);
System.out.println("Inserted " + count + " rows");
//statement for resultset
stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
//查询
ResultSet rs = stmt.executeQuery("SELECT * FROM " + tblname);
System.out.println("All results are listed below:");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String description = rs.getString("description");
System.out.println(
"id=" + id + ", " +
"the name is " + name + ", " +
description
);
}
//删表
stmt.executeUpdate("DROP TABLE " + tblname);
//删库
stmt.executeUpdate("DROP DATABASE " + dbname);
}
catch (SQLException sqlE) {
System.out.println("SQL Error: " + sqlE);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
public class Jdbc11 {
public static void main (String args[]) {
try {
Class.forName("com.mysql.jdbc.Driver");
Statement stmt = null;
String url = "jdbc:mysql://localhost:3306/test";
String dbuser = "root";
String dbpass = "123456";
String dbname = "felix021";
String tblname = "users";
Connection con = DriverManager.getConnection(url, dbuser, dbpass);
stmt = con.createStatement();
System.out.println("URL: " + url);
System.out.println("Connection: " + con);
//建库
stmt.executeUpdate("CREATE DATABASE IF NOT EXISTS " + dbname);
stmt.executeUpdate("USE " + dbname);
//建表
stmt.executeUpdate("DROP TABLE IF EXISTS " + tblname);
stmt.executeUpdate(
"CREATE TABLE " + tblname + "(\n" +
" `id` INT PRIMARY KEY AUTO_INCREMENT, \n" +
" `name` CHAR(20) NOT NULL, \n" +
" `description` varchar(255) DEFAULT NULL\n" +
")"
);
//插入
int count = stmt.executeUpdate(
"INSERT INTO " + tblname + "\n" +
"(`id`, `name`, `description`) VALUES \n" +
"(NULL, 'a', 'ooxx'), \n" +
"(NULL, 'b', NULL), \n" +
"(NULL, 'c', 'haha'), \n" +
"(NULL, 'd', 'hoho')"
);
System.out.println("Inserted " + count + " rows");
//statement for resultset
stmt = con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
//查询
ResultSet rs = stmt.executeQuery("SELECT * FROM " + tblname);
System.out.println("All results are listed below:");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String description = rs.getString("description");
System.out.println(
"id=" + id + ", " +
"the name is " + name + ", " +
description
);
}
//删表
stmt.executeUpdate("DROP TABLE " + tblname);
//删库
stmt.executeUpdate("DROP DATABASE " + dbname);
}
catch (SQLException sqlE) {
System.out.println("SQL Error: " + sqlE);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Jan
23
php代码
侧边栏的内容:
<?php
define ("MAX_MSG_COUNT", 5);
define ("USER_NAME", 'felix021');
$msg_c = isset($_GET['c']) ? intval($_GET['c']) : MAX_MSG_COUNT;
$user = isset($_GET['u']) ? $_GET['u'] : USER_NAME;
require ('../lib/twitter.php'); //注: 此文件从twitese的lib目录下提取,并增加了
//define("API_URL", "http://twitter.com");
$t = new twitter();
$s = $t->userTimeline(1, $user);
$msg = array();
for ($i = 0; $i < $msg_c; $i++) {
$msg[$i] = htmlspecialchars(stripslashes($s[$i]->text));
$msg[$i] = preg_replace(
array(
"/(\w+):\/\/([a-zA-Z0-9\.\/\-%+\?#_=@:&;])*/i",
'/(\s|^)@([a-zA-Z0-9_-]+)/',
'/(\s|^)#([a-zA-Z0-9_-]+)/',
),
array(
'<a href="\0" target="_blank">\0</a>',
'\1<a href="/t/\2" target="_blank">@\2</a>',
'\1<a href="/t/~\2" target="_blank">#\2</a>',
),
$msg[$i]
);
}
echo json_encode($msg);
?>
define ("MAX_MSG_COUNT", 5);
define ("USER_NAME", 'felix021');
$msg_c = isset($_GET['c']) ? intval($_GET['c']) : MAX_MSG_COUNT;
$user = isset($_GET['u']) ? $_GET['u'] : USER_NAME;
require ('../lib/twitter.php'); //注: 此文件从twitese的lib目录下提取,并增加了
//define("API_URL", "http://twitter.com");
$t = new twitter();
$s = $t->userTimeline(1, $user);
$msg = array();
for ($i = 0; $i < $msg_c; $i++) {
$msg[$i] = htmlspecialchars(stripslashes($s[$i]->text));
$msg[$i] = preg_replace(
array(
"/(\w+):\/\/([a-zA-Z0-9\.\/\-%+\?#_=@:&;])*/i",
'/(\s|^)@([a-zA-Z0-9_-]+)/',
'/(\s|^)#([a-zA-Z0-9_-]+)/',
),
array(
'<a href="\0" target="_blank">\0</a>',
'\1<a href="/t/\2" target="_blank">@\2</a>',
'\1<a href="/t/~\2" target="_blank">#\2</a>',
),
$msg[$i]
);
}
echo json_encode($msg);
?>
侧边栏的内容:
<div id="twitter" style="font-size:12px"></div>
<script>
function getXML() {
var a = null;
try {
if (window.XMLHttpRequest) {
a = new XMLHttpRequest();
} else if (window.ActiveXObject) {
a = new ActiveXObject("Msxml2.XMLHTTP");
}
}catch(e) {}
return a;
}
function _t(c) {
var x = getXML();
x.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
var g = eval(this.responseText);
var tt = '';
var t = document.getElementById('twitter');
for(var i = 0; i < g.length; i++){
tt += g[i] + (i+1 == g.length ? "" : "<hr/>");
}
t.innerHTML = tt;
}
}
x.open("GET", "/blog/tt.php?c="+c, true);
x.send('');
}
_t(4);
</script>
<script>
function getXML() {
var a = null;
try {
if (window.XMLHttpRequest) {
a = new XMLHttpRequest();
} else if (window.ActiveXObject) {
a = new ActiveXObject("Msxml2.XMLHTTP");
}
}catch(e) {}
return a;
}
function _t(c) {
var x = getXML();
x.onreadystatechange = function(){
if(this.readyState == 4 && this.status == 200){
var g = eval(this.responseText);
var tt = '';
var t = document.getElementById('twitter');
for(var i = 0; i < g.length; i++){
tt += g[i] + (i+1 == g.length ? "" : "<hr/>");
}
t.innerHTML = tt;
}
}
x.open("GET", "/blog/tt.php?c="+c, true);
x.send('');
}
_t(4);
</script>