17号的时候虫子向我求助,想要我帮忙做一个支持海地的小网站。大体的思路就是,在上面的放一个大地图,然后大家可以留言、上传照片什么的,然后就在地图上出现亮点,然后亮点点进去可以看到留言和照片~这个网站已经进入公测了,大家可以在这里查看:Haiti <3(话说我曾经问虫子“<3”是什么意思,她告诉我,是爱心的意思~)
我猜从来没做过网站的人一定会觉得这个很简单,但我觉得一点都不简单……不过似乎可以实现~这种无疑又是对我技术的一次挑战!
Read the rest of this entry »
17号的时候虫子向我求助,想要我帮忙做一个支持海地的小网站。大体的思路就是,在上面的放一个大地图,然后大家可以留言、上传照片什么的,然后就在地图上出现亮点,然后亮点点进去可以看到留言和照片~这个网站已经进入公测了,大家可以在这里查看:Haiti <3(话说我曾经问虫子“<3”是什么意思,她告诉我,是爱心的意思~)
我猜从来没做过网站的人一定会觉得这个很简单,但我觉得一点都不简单……不过似乎可以实现~这种无疑又是对我技术的一次挑战!
Read the rest of this entry »
Comments
昨晚花了几个小时写了个计算人人网(其实我还是更喜欢叫他校内)当中,任意两个用户的好友之间交集的在线小工具,可以到我的实验室里看看这个小工具:人人网好友交集。
话说能写出这样的工具,主要有赖于我的空间提供商将系统换为 FreeBSD 后可以解析 Python 了,而且也没有限制 CGI,所以就成功了~
Read the rest of this entry »
Comments
看这个标题一定很奇怪:难道我以前控制音乐播放不用鼠标么?这个文章的标题看起来像鼠标刚刚发明的推广期的文章……不过,当然不是这样的!
其实只是想:如何把我的小本合上放书架上,当作一个音乐播放器+功放,并用我的无线6键鼠当遥控器遥控控制之。
想想其实还是蛮有意义的功能,这样我做作业的时候可以不用戴耳机,不用用MP3,直接把本当播放器;同时,我不会看到屏幕上的东西,可以安心做作业~再看看我的6键无限鼠,那额外的功能键平时根本不用,也想不出能有什么用……这么好的东西就这样被我浪费了……(话说,拿本当音乐播放器是不是更浪费?)
Comments
非常无语的,同济大一什么物理理论都没学,需要的高数基础也都没有学过,竟然要我们先学物理实验,而且要处理数据,计算平均值和标准误差什么的,十分麻烦……
上次处理数据弄了个零碎的小程序来,很麻烦,这次就把他统一编为一个模块,方便以后使用……这个模块里面的说有公式依据是同济大学出版社《物理实验教程》第1版第二章的内容。
如何使用这个模块呢?首先,作为一个 Python 模块,肯定要用 Python……
直接输入数据,标准格式输出~
最后是代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | #!/usr/bin/env python # -*- coding: utf-8 -*- import math sqrt = math.sqrt def gen_imet(func): def retfunc(self, other): ret = func(self, other) self.ave = ret.ave self.u = ret.u self.digs = ret.digs return self return retfunc def get_digs(a, b): if a == 0: return b elif b == 0: return a else: return min(a, b) class PhyStat: """ 物理实验数据 PhyStat(ave, u = 0.0, digs = 0) ave 表示平均值,如果传入一列数则自动计算平均值及其标准误差 u 表示标准误差,如果 ave 传入数据列表则此处表示仪器精度 digs 表示有效数字个数,0 表示不限制 """ def __init__(self, ave, u = 0.0, digs = 0): """ 对于 ave 为数据列表的情况,使用下面公式计算平均值: ave = Σx[i] / n 根据下面公式计算标准误差: S = Sqrt(Σ(x[i]-ave)^2 / (n - 1)) u = Δinst / Sqrt(3) U = Sqrt(S^2 + u^2) """ self.digs = digs if isinstance(ave, tuple) or isinstance(ave, list): data = ave n = len(data) ave = math.fsum(ave) / n self.ave = ave s = 0.0 for i in data: s += (i - ave) ** 2 s = sqrt(s / (n - 1)) u /= sqrt(3) self.u = sqrt(s ** 2 + u ** 2) else: self.ave = float(ave) self.u = abs(float(u)) def __repr__(self): ave = self.ave exp = int(math.floor(math.log10(ave))) exp10 = 10 ** exp ave = ave / exp10 u = self.u / exp10 digs = self.digs if digs == 0: ret = '%f ±%f' else: ret = '%%.%df ±%%.%df' % (digs, digs) if exp: ret = '(%s) E %d' % (ret, exp) return ret % (ave, u) __neg__ = lambda self: PhyStat(-self.ave, self.u, self.digs) __pos__ = lambda self: self __abs__ = lambda self: PhyStat(abs(self.ave), self.u, self.digs) def __add__(self, other): if isinstance(other, PhyStat): ave = self.ave + other.ave u = sqrt(self.u ** 2 + other.u ** 2) digs = get_digs(self.digs, other.digs) return PhyStat(ave, u, digs) else: ave = self.ave + other return PhyStat(ave, self.u, self.digs) __radd__ = __add__ __sub__ = lambda self, other: self + (-other) __rsub__ = lambda self, other: other + (-self) def __mul__(self, other): if isinstance(other, PhyStat): a = self.ave b = other.ave ave = a * b u = ave * sqrt((self.u / a) ** 2 + (other.u / b) ** 2) digs = get_digs(self.digs, other.digs) return PhyStat(ave, u, digs) else: ave = self.ave * other u = self.u * other return PhyStat(ave, u, self.digs) __rmul__ = __mul__ def __div__(self, other): if isinstance(other, PhyStat): return self * other ** -1 else: return (1.0 / other) * self __rdiv__ = lambda self, other: other * self ** -1 def __pow__(self, other): a = self.ave ave = a ** other u = abs(other * self.u / a * ave) return PhyStat(ave, u, self.digs) __iadd__ = gen_imet(lambda self, other: self + other) __isub__ = gen_imet(lambda self, other: self - other) __imul__ = gen_imet(lambda self, other: self * other) __idiv__ = gen_imet(lambda self, other: self / other) __ipow__ = gen_imet(lambda self, other: self ** other) __int__ = lambda self: int(self.ave) __long__ = lambda self: long(self.ave) __float__ = lambda self: self.ave |
如果大家发现什么 bug,或者有什么改进建议,欢迎提哈~ Read the rest of this entry »
Comments
曾经的曾经,很早很早以前,我发布了一个叫 ujudger-base 0.1 的东西,是用 C++ 写成的简单测评程序,仅能测试程序运行时间和内存耗用(还不准确)。
这次发布的是一个完整的测评机,支持传统题型、交互题和提交答案题,可导出测评结果。整个程序使用 Python 编写,直接把 ujudger.py 复制到待测目录下并编写 config 文件即可测评。
不过现在这个程序只有一个文字界面,非常简陋,而且安全性不佳。但现在正在撰写的 ujudger 1.0 (版本跨越大,意味着变化之巨大……) 将就这些问题有重大改进,敬请期待。
另外,有人询问是否准备让这个测评机与另一个 Windows 下的开源测评机 Cena 兼容。我的回答是,由于设计差异,可能比较困难。对比 Cena 的自定义校验器,ujudger 的自定义校验器更强大,同时 Cena 的校验器可以通过一点简单的修改或加一个脚本外壳就可以在 ujudger 中使用。在 1.0 中计划兼容 Cena 的校验器。至于配置文件,1.0 中配置文件的格式会有较大变动,不过可能可以通过转换程序将 Cena 的配置文件转为 ujudger 的。
我在 Google Code 上开了一个项目,感兴趣的同学可以关注关注~地址:http://ujudger.googlecode.com/
最后,ujudger 0.1 的下载地址也在 Google Code 上:ujudger.py
Comments
我一开始为 Python 的强大和简洁所震撼,看了些 Python 的教程,学了不少东西。前面那些探索就以后再写吧……今天先讲讲今天知道的东西。
在探索到 Python 函数的参数传递的时候,我不禁赞叹 Python 灵活的参数设计,但慢慢的,开始迷惑与传递参数的修改和返回。
众所周知,在 C++ 中传递参数分为传值和传引用两种,但 Python 没有,那到底传进去的东西,修改一下,能不能传出来呢?这是一个很奇怪和让人费解的问题,不是么?在查阅了一些资料后,对 Python 关于变量、类型和引用的一些基本方式有了一些了解,进而基于这种理解并结合实验,了解了参数传递的奥妙。
Read the rest of this entry »
Comments