0

Comments

貌似很久没发文章了,无聊冒出来发一个……

这次发的东西是很无聊的,大家知道最近世界杯在踢。不过呢,作为一个对体育几乎毫不关心的人,这事基本上也跟我没什么关系……不过我要说的呢,是关于世界杯竞猜的“赌博”游戏,貌似不止百度再做,还有网易、校内什么的都在搞。不过鉴于百度这个,比较经常上,我就也来参加了~

当然,发在这里的东西总归要有一些技术性……这次也不例外的……

我看到网易的竞猜不仅有各种形式,而且最重要的是有赔率!而百度只显示投注金额,显然不够专业,于是我就拿 Greasemonkey 插件,可以在百度投注金额的下面显示当前赔率~就像下面这样:

安装了 Firefox 的 Greasemonkey 插件的,可以点击这里安装这个脚本:tieba_guess.user.js

哦,有人大概会注意到我在前面那张图里面下注给了韩国。倒不是我多喜欢棒子,只是因为我几乎完全不懂足球,所以就根据赔率压冷门……话说压冷门有的时候其实很划算的,比如昨晚我压瑞士,赔率40!赚翻了~强大吧~

< ,,,,, >

QR code 生成器

0

Comments

前几天在找 Android 应用的时候,又见到了 QR code。说到 QR code,记得2006年,我还在维基活跃的时候,有一个人在维基的 QQ 群上发了这个的东西,然后大家就觉得很好玩。很早的事情了。寒假回福州的时候,在乌山公园,不少地方也有这个二维码,是移动设置的“物联网试验区”。

二维码着实是一个很有趣的东西。据我去过日本的同学讲,这个东西在日本已经十分普及了。在维基上查了一下,QR code 是开放的,有专利但没有被行使。而且识别算法似乎已经十分稳定成熟了。Android 手机里面安装一个 Barcode Scanner 就可以利用摄像头扫描二维码了,非常方便~

二维码可以干嘛呢?它可以储存网址、储存电话、储存名片信息,扫描一下就可以读取出来,将人从人工的复制方式中解脱出来~

于是我便也做了一个 CGI 的 QR code 生成器。
Read the rest of this entry »

< ,, >
0

Comments

因为以后可能要用到,于是今天用 Erlang 写了一个 0-1 背包算法,这算是我第一次用 Erlang 写算法,也是我第二次写 Erlang 程序……

以前都使用正常语言写,各种算法自然不会难写。所谓正常的语言,呃……也就是我们平时用的最多的语言了,像 C++、Python 什么的在我看来都还算正常的语言。那么 Erlang 到底哪里不正常了呢?

其实 Erlang 只要两个不正常的地方就足够囧死人了……那就是:

  1. 没有循环,必须用递归代替
  2. 数组不能随机访问,只能从头部读写

其实说数组不能随机访问吧,应该也是能的,只不过时间恐怕就不是 O(1) 了罢了。
Read the rest of this entry »

< , >
1

Comments

昨晚花了几个小时写了个计算人人网(其实我还是更喜欢叫他校内)当中,任意两个用户的好友之间交集的在线小工具,可以到我的实验室里看看这个小工具:人人网好友交集

话说能写出这样的工具,主要有赖于我的空间提供商将系统换为 FreeBSD 后可以解析 Python 了,而且也没有限制 CGI,所以就成功了~
Read the rest of this entry »

< ,,, >
1

Comments

昨天的那篇日志跨编译器的 C 语言 NaN 支持当中讲到了如何在 Linux 下用 wine 执行 VC6 编译器编译程序,不过总觉得还是有那么些麻烦,要把待编译的文件复制到 VC6 的安装目录,还要写那么长一串东西。要是能像调用 GCC 那么方便就好了~

于是就有了下面这个小脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# - * - coding: UTF-8 - * -
 
VC6_DIR="这里写上VC6的安装地址"
 
BIN="$VC6_DIR/VC98/Bin"
export INCLUDE="$VC6_DIR/VC98/Include"
export LIB="$VC6_DIR/VC98/Lib" 
 
ARGS=
 
while getopts "o:c" optname
do
  case "$optname" in
  "o")
    ARGS="$ARGS /o$OPTARG"
    ;;
  "c")
    ARGS="$ARGS /c"
    ;;
  esac
done
 
wine "$BIN/CL.EXE" $ARGS ${@:$OPTIND}

然后把他放在 PATH 里面的某个目录下 (我放在了用户级的 /home/upsuper/bin 里,这个似乎要自己添加就是了),然后给这个文件加上可执行属性,最后只要在需要的地方执行:

1
vc6 xxx.cpp

就解决了~
Read the rest of this entry »

< ,,, >
6

Comments

看这个标题一定很奇怪:难道我以前控制音乐播放不用鼠标么?这个文章的标题看起来像鼠标刚刚发明的推广期的文章……不过,当然不是这样的!

其实只是想:如何把我的小本合上放书架上,当作一个音乐播放器+功放,并用我的无线6键鼠当遥控器遥控控制之。

想想其实还是蛮有意义的功能,这样我做作业的时候可以不用戴耳机,不用用MP3,直接把本当播放器;同时,我不会看到屏幕上的东西,可以安心做作业~再看看我的6键无限鼠,那额外的功能键平时根本不用,也想不出能有什么用……这么好的东西就这样被我浪费了……(话说,拿本当音乐播放器是不是更浪费?)

说干就干!
Read the rest of this entry »

< ,,,,, >
4

Comments

非常无语的,同济大一什么物理理论都没学,需要的高数基础也都没有学过,竟然要我们先学物理实验,而且要处理数据,计算平均值和标准误差什么的,十分麻烦……

上次处理数据弄了个零碎的小程序来,很麻烦,这次就把他统一编为一个模块,方便以后使用……这个模块里面的说有公式依据是同济大学出版社《物理实验教程》第1版第二章的内容。

如何使用这个模块呢?首先,作为一个 Python 模块,肯定要用 Python……

然后我用我第一次做实验的部分数据演示一下:
Screenshot-upsuper@upsuper-netbook: ~-external-tju

直接输入数据,标准格式输出~

最后是代码:

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 »

< ,, >

ujudger 0.1 发布

4

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

< ,,,, >
0

Comments

感觉挂载 iso 每次要建文件夹、挂载,用完还要删除、删文件夹,很麻烦。在网上找了一个帖子:用于使用 鼠标右键 挂载iso的脚本!,觉得看起来不错,不过好像不能自动卸载。经过一番学习,给出了如下自动挂载/卸载脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
[ $UID == 0 ] || cmd="gksu"
if [ ! -f $1 ]; then
	exit 2
fi
dir="/media/`basename $1 .iso`"
if [ ! -d $dir ]; then
	$cmd "mkdir $dir"
	$cmd "mount -t iso9660 -o loop $1 $dir"
else
	$cmd "umount $dir"
	$cmd "rm -r $dir"
fi

写的很短很简陋,如果把 cmd= 后面改成 kdesudo 就可以在 KDE 下用了。

e68c82e8bdbde58db8e8bdbdiso我把这个设置为 iso 文件的默认打开方式,这样以后双击 iso 文件,马上挂载,再双击,自动卸载,太方便了!用 Linux 的都可以试试~

< , >

WAP版百度投票

0

Comments

百度贴吧的投票不支持手机,连 UCWEB 和 Opera Mini 都看不了,于是就自己写了个,不过只能查看,不能投票就是了……
Read the rest of this entry »

< , >