Posts Tagged “php”

之前为了穿墙和正常访问校园网两不误而在90上架了个DNS。昨天facebook hackercup里穿墙的90代理也是给力的,不过facebook就不怎么给力了 ╮(╯▽╰)╭ 扯远了,虽然不是最初的动机,不过即然架设好了DNS Server就会自然而然的想折腾一下,提供一些内部用的短域名。比如直接将zoj, nhd, icpc, printer解析成ZOJ, NexusHD, ZJU ICPC-HOST和218打印机的IP。不过为了省事,最后是改用了一个自己yy的.acm的根域名,只要简单修改bind9的配置文件,在/etc/named.conf.local中新加一个zone:

zone "acm." {
	type master;
	file "/etc/bind/acm.zone";
};

并且新建一个文件/etc/bind/acm.zone内容如下:

$TTL	604800
@	IN	SOA	acm. root.acm. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL
;
@	IN	NS	acm.
@	IN	A	10.71.101.90
9	IN	A	10.71.101.9
;; ...
70	IN	A	10.71.101.70
90	IN	A	10.71.101.90
90	IN	AAAA	2001:da8:e000:90:0:5efe:10.71.101.90
192	IN	A	10.71.101.192
zoj	IN	CNAME	acm.zju.edu.cn.
watashi	IN	CNAME	watashi.ws.

A记录对应ipv4,AAAA记录对应ipv6,CNAME记录对应别名。于是都可以如法炮制,其中特殊符号@代表current origin,也就是没有任何.的acm,而zoj对应的是zoj.acm,并会转到acm.zju.edu.cn上。注意最后有一个点,和url中的/类似,如果以.结尾表示是绝对的,而不以.结尾的则是相对的。

当然也可以邪恶一把,比如修改并加入两个zone,并加入下面的zone file:

$TTL	604800
$ORIGIN	shouji.360.cn.
@	IN	SOA	shouji.360.cn. root.shouji.360.cn. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL
;
@	IN	NS	shouji.360.cn.
shouji.360.cn.	IN	A	250.250.250.250

$TTL	604800
$ORIGIN	mail.139.com.
@	IN	SOA	mail.139.com. root.mail.139.com. (
			      1		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL

@	IN	NS	mail.139.com.
mail.139.com.	IN	A	209.85.227.17	; mail.google.com
mail.139.com.	IN	A	119.147.15.56	; mail.qq;com

前面做的事情就是流氓了一把360,把shouji.360.cn解析到了不存在的IP 250.250.250.250,于是访问将会得到诸如Connection Timeout(连接超时)的错误。不知道生活在天朝的同学们是不是对此似曾相识呢 (  ̄ー ̄) 第二个就要更流氓了,如果你访问mail.139.com,那么实际可能随机访问到gmail或者qq邮箱,这也是个做负载均衡的例子,嘛,我只是建议别用139邮箱啦 >▽< 你懂的。

然后猛犸同学给了个不错的建议,就是利用这个DNS,能不能做到在地址栏里输入zoj2011之类的题号的时候就直接跳转对应题目的页面上去。当然DNS直接是做不了这个事的,DNS联系的是domain和ip address这两样东西,和http都八杆子打不着,而题目页面还是一个具体的url的http请求。不过仔细想一想其实分两步做就很简单了,简单来说就是泛域名+根据HOST重定向。所谓泛域名其实就是

Comments 4 Comments »

上回说到实现了各种文件的上传,正要给attachment.php实现高亮显示源代码……(天外音——pia飞)。

先上Demo:
icon-icpc-smallsource code (ZOJ2705.cpp)
attachment-demo

在wordpress的template hierarchy里,对附件显示(attachment display)的处理,wp会按照

  1. MIME_type.php – 可以是任意的MIME,对于type/subtype,比如text/plain会按照:

    1. type.php (e.g. text.php)
    2. subtype.php (e.g. plain.php)
    3. type_subtype (e.g. text_plain.php)
  2. attachment.php
  3. single.php
  4. index.php

的顺序,调用第一个主题(theme)中可用的php文件。wp模认主题里没有attachment.php,我所用的主题mandigo里提供有attachment.php,对于图片,会显示缩略图(thumbnail),而对于其他文件,只显示一个图标(icon)和文件标题(title)。而我希望对于上传的源代码,可以直接显示代码内容,最好还是语法高亮的。因为很多时候我们只是想简单的看一下代码,这样也要下载太麻烦了,而且硬盘空间可能不够(……几k的空间都没有么……),提供预览也能排雷,下了个假档影响多不好啊。

为了达到这一目的,图方便,我直接对attachment.php文件进行了hack,首先加入了下面这一段代码:

Comments 6 Comments »

blog里经常需要贴一些代码,平时用SyntaxHighlighter直接贴在文章里是一个不错的选择,但遇到写一套题的解题报告这样的情况时,贴过多的代码显得很违和,容易喧宾夺主,可以改用附件(attachment)的形式贴在解题报告中。可惜wordpress by default不支持cpp文件,如果尝试在Media – Add New中上传cpp文件,会得到”Error saving media attachment”的错误。一个变通的办法是把扩张名改为txt上传。事实上wp虽然不支持cpp文件,但却支持cc文件,这里有一个完整的支持列表。

改扩展名上传文件不是一个干净的做法,对上传,下载着都不方便。要添加额外的文件类型,比如cpp和php,可以用下面的api来增加允许上传的mime:

function add_upload_mime($mimes = '') {
	$mimes['cpp'] = 'text/x-c++src';
	$mimes['php'] = 'application/x-httpd-php';
	return $mimes;
}
add_filter('upload_mimes', 'add_upload_mime');

不过还是用现有的plugin比较方便,PJW Mime Config就是一个这样的plugin。

这样虽然解决了上传php文件的问题,但是下载却出现了问题。对于txt文件,通常将直接再浏览器打开;对于cpp文件,通常会弹出一个下载对话框;但对于php或其他cgi文件,服务器将会执行它,返回的是执行结果,而不是源文件,或者出现HTTP 500。所以需要更改服务器设置,将这些后缀的文件当成普通文件处理,对于lighttpd,可以在lighttpd.conf中对上传文件夹upload这样设置:

$HTTP["url"] =~ "^/blog/wp-content/uploads/" {
	cgi.assign = ()
	fastcgi.server = ()
	static-file.exclude-extensions = ()
}

附件上传的问题就这样解决了,下一步就是要扩展attachment.php的功能,使得源代码能供直接再attachment页面内通过语法高亮显示出来。

Comments 1 Comment »

计算机内的整数往往是固定长度的,比如32位整数,如果整数超出表示范围则会发生溢出。大数(BigInteger)则是具有任意精度的数(arbitrary precision number),是一个实际运用中常见,尤其在程序设计竞赛里频繁出现的数据结构。java因为带有BigInteger类,而成为竞赛中解决大数问题的首选,而C/C++则需要第三方库提供大数支持。至于其他很多语言,都有语言或标准库级别上的高精度运算支持,只不过其中很多除了在SPOJ和GCJ外恐怕都不怎么能用于水题。Small factorials里有在SPOJ中使用高精度的例子。

Perl: Math::BigInt

Math::BigInt提供了非常多方法,而且很多方法也有对应的运算符重载,支持bin, oct, dec, hex格式字符串与BigInt之间的相互转化,几乎没有不支持的操作,包括三角函数,二项式系数都有。不过Math::BigInt有很多不同的实现,其中最快的是Math::BigInt::GMP,效果还是非常理想的,但是默认的Math::BigInt::Calc就慢得不能忍了,远比php, java, ruby, python的都要慢。另外Math::BigFloat是基于Math::BigInt的高精度浮点数。

use Math::BigInt lib => 'GMP';
use Math::BigFloat try => 'GMP';
print Math::BigFloat->bpi(64), "\n"; # 3.14...
my $x = new Math::BigInt('0x123456789abcdef');
my $y = Math::BigInt->new('0b101010101010101');
print $x + $y, "\n";
print join(":", $x->copy()->bdiv($y)), "\n";

Bash: bc

说bash支持高精度不是很严谨,不过bc(白痴)是Linux下一个支持任意精度数字计算的语言,也算半个标配。bc支持算术运算(+, -, *, /, %, ^等),逻辑运算(<=, ==, ||等),流程控制(if, while, for等),函数定义(define)。bc本身就可以写成脚本执行。

#!/usr/bin/bc -q

define e(n) {
	auto i, p, s;
	p = 10 ^ n;
	s = 2 * p;
	for (i = 2; p > 0; ++i) {
		p /= i;
		s += p;
	}
	return s;
}

print "input a integer: "
x = read()
e(x)
quit

# input a integer: 40
# 27182818284590452353602874713526624977552

Php: BCMath

bc是Binary Calculator的

Comments 7 Comments »

SPOJ24. Small factorials[FCTRL2]就是阶乘计算加高精度运算。以下是用内置大数支持的perl, php, java, ruby, python, haskell, bash, scheme等语言实现的代码。

haskell

main = interact $ unlines . map (\i -> show $ f !! read i) . tail . words
	where f = scanl (*) 1 [1 ..]

perl

#!/usr/bin/perl -w

use strict;
use Math::BigInt lib => 'GMP';

my @f = ();
push @f, Math::BigInt->new(1);
for (my $i = 1; $i <= 100; ++$i) {
	push @f, $f[$#f]->copy()->bmul($i);
}
chomp(my $re = <STDIN>);
for (my $ri = 1; $ri <= $re; ++$ri) {
	chomp(my $n = <STDIN>);
	print "$f[$n]\n";
}

php

Comments 15 Comments »