PHP ToDo List

终于用php编完了第一个东西。。姑且叫它ToDo List吧。。

提前说一句:传说中的网页版砸红一已经编完了,不过将在很长的一段时间内处于alpha阶段。。实在是bug太多了。这种交互性很强的网页游戏还是不应该用html+css+javascript来做,还是用flash/silverlight来的简单一点。。

php在win下的编程环境比.net麻烦多了。我是先下了个php5,然后安装了iis插件,然后调试了半天才行。暂时没装mysql,于是这个todo list用的是文件作存储。然后还得设权限。上传到linux虚拟主机上之后还得设权限为755才行。

ide也没有好用的,这次用的aptana,对html javascript支持相当好的它却对php支持的一塌糊涂。代码没有自动提示也就算了,连调试也调试不了(也没准是我没设置对)。最后用一句一句的注释来判断到底哪句出的问题。好在程序不难,没调几次就ok了。php看着就像是弱类型的c语言,其实还没c来得顺手。

说说正题。作为第一个php应用(hello world就不算了。。),我还是用了ajax,可以看看源代码,php文件里只有读取数据、存储数据这个功能,其他的渲染啊结构啊都是javascript的功劳,这主要是因为我对php不如对JavaScript熟悉。。不过反而有更好的效果。

怎么用呢?在文本框里输入该做的事,然后点发布,然后底下的表格里就添加上了这个计划。最左边那列是状态,状态有“未进行”(暂停形状)、“正在进行”(播放形状)、“已完成”(对勾形状)、“已停止”(停止形状)这四个,点击它就能更改状态。最右边是删除,在非ie6的浏览器中,移动到哪行哪行就会显示那个叉。中间的左边可以进行排序,点击两次可以逆序。中间右边可以筛选,有橙色背景的是显示的,没有橙色背景的是不显示的,但数据依然存在。

该放出地址了!Demo:http://www.wanganran.com/todo/

源代码:http://www.wanganran.com/todolist/todolist.zip

重要提示:此地址仅作为测试用,请测试后主动删除添加的数据!若想自己使用请将源代码保存在自己的虚拟主机中并设置密码!

Asp.net中Application的收尾事件的触发

根据我之前的谷歌一下,貌似很多人都表示Application的各个事件(尤其是各种收尾事件)的触发十分诡异。

而且这些事件还十分有用。比如说如果用Application作缓存,用户输入的东西先不直接存储在数据库中而先保存到Application中,直到Application到达一定大小时再一起存储进数据库。如果Application在销毁时不利用事件将剩余的数据存储,那么那些数据就将丢失。

于是刚才做了个小程序尝试了一下。在global.asax里写下这个:

阅读更多

扫雷的概率问题

貌似很久没更新了,搞得google小蜘蛛们都不来了。

最近一直在想这个问题。寒假的时候看《编程之美》里的一道题:在windows里的扫雷里添加一个功能,按一个按钮可以把所有未打开的格子是雷的概率表示出来。

前几天突然想起了了这个问题,于是就开始想。。

显然深搜可以解决这个问题。把所有可以确定概率的格子(即所有已经打开的格子周围的格子)挑出来排成行,从第一个开始,只有0和1两种可能,同时兼顾已经打开的格子显示的周围雷数和剩余雷数,然后继续第二个格子。。直到某个格子不可能填上数,那么就回溯;或者到了最后一个格子,把每个格子的数据添加到一个记录中(一个分子数组一个分母数组,如果是1就把两个都+1,是零就只加分母),直到全部遍历完毕,两个数组中每一对数之比就是这个格子是雷的概率。耗时上,显然不会是最快的,但是人类玩的扫雷还是可以秒杀的,非人类玩的扫雷(比如1k*1k的格子数)还是留给非人类去解决吧。

但是还有没有别的方法呢?我一开始想到的是解方程组。

把所有可以确定概率的格子设成一个未知数,表示这个格子是雷的概率。然后通过打开的格子显示的周围雷数确定方程,然后解这个方程组。如果已确定的格子区域边缘都是直的(没有角),那么这个方程组显然可以解。而且和上面的那种方法所得结果相同。

但是如果已确定的格子区域是一个矩形,也就是说边缘左右已确定的格子数要小于未打开的格子数时,就会出现方程数量小于未知数数量了。

但是扫雷中会有等概率的格子。所以可以把所有在方程组中同时出现或不见的未知数当做同一个未知数,因为它们是等概率的。这样方程数量就可能等于未知数数量了。这样就可以解决类似这种的情况了:

(-表示未打开的雷,数字表示已打开的雷)

---

-2-

---

但是譬如这种情况还是解决不了:

----

-11-

-11-

----

还有我们可以把一定是雷和一定不是雷的格子先挑出来,这样也能减少未知数数量。还有由于方程右边的数字只可能是整数,方程左边的未知数只可能在[0,1]之间,这样也可以确定一些一定或一定不是雷的格子。

但是上面那种情况还是解决不了。

怎么办呢。。。。。我想了快一个星期了。

其实既然这两种方法所得结果一样,可以把这两种方法结合一下。第二种方法中方程数量为i,未知数数量为j,把前j-i个未知数用第一种方法进行遍历,然后带入后再解方程组,应该也可以解出这个问题。效率上要比第一种要高一些。

但是应该还是有纯数学的解决方法的。。我没辙了,还是等待牛人来解决吧。。

张总泪流满面 CloudClip云剪贴板 beta版发布

这样的张总:你在家里的电脑上按了CTRL+C,然后在公司的电脑上再按CTRL+V是肯定不行的。即使同一篇文章也不行。不不,多贵的电脑都不行。

张总的愿望终于可以实现了。经过将近半个月的折磨,这个传说中的“云剪贴板”终于发布了!现在开始我们可以在不同的电脑上共享多达100条的剪贴板,支持普通文本、word文档、HTML文档等格式!

当然google docs是最先实现这个功能的工具,不过并不是所有需要复制粘贴的东西都在google docs中,况且google docs不一定能时时刻刻访问(比如说连接被重置)。

不过现在这个程序的缺点就是不能跨平台,因为是用c#编的。我的索尼本不能用ubuntu,所以不能测试可不可以在mono下运行。估计够呛。

云端的地址初始为:http://graphonline.info/clip/service.asmx 程序中已经预先定义了这个地址。如果这个地址挂了,可以把云端的asp.net程序发布到别的主机上,然后改一下.config文件就可以了。

不过毕竟只是一个简单到极点的beta版的小工具,有一些力所不能及的事情它是不能做到的。比如说拷贝超过10k的大文本,在网络不好的时候很容易出错;不能拷贝excel表格,因为不知道为啥excel每次拷贝时总会同时拷贝四次,造成网络堵塞而出问题。更有许多bug,等待着大家去发现。

计划在下个版本中加入上传功能,解决目前的上传不稳定的问题;还打算加入对图片格式的支持。

好了不废话了。下面是下载地址:

客户端可执行文件(需要.net framework 2.0及以上(windows vista以上自带)):CloudClipWindow.exe

云端源代码(Visual Studio 2008+Asp.net 2.0):CloudClip

客户端源代码(Visual Studio 2008+C# 2.0):CloudClipWindow

.Net中的Clipboard。。算是bug么

用Clipboard.GetData(format)与Clipboard.SetData(format,data)中的format竟然大小写敏感..搞了好久才知道。

format 返回类型
Text string
text以及其所有大小写格式 MemoryStream
HTML Format string
html format以及其所有大小写格式 MemoryStream

我建议都用MemoryStream的,可以用ToArray()输出byte[]。 string的很容易出现各种各样的问题,尤其在HTML Format上。

c#中监控剪贴板的两种方法

最近在做一个云剪贴板的程序,需要用一个c#桌面应用程序来监控剪贴板。本来想的是,新建一个线程用while循环检查剪贴板内容的改动,不过发现不成功,如果用GetText()访问剪贴板则不管剪贴板内有没有文字都返回空字符串,用SetText()设置剪贴板则出错:“在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。”

所以我google了一下,发现貌似监视剪贴板可以不用“幕后线程”去不断检查,有专门的API来进行监视,并通过触发事件来告诉我们。

阅读更多

依然是beta的 午饭管理系统

上个星期的这个时候正式进入了beta公测阶段,经历了一个星期的公测,我可以自豪的说,下个星期我们将步入beta2阶段。。

所以说我不打算把这个东西用在我们班了,怕被骂。所以打算赠送给现在高二的同学们,因为等他们想骂我的时候我已经在北京了。。

地址:http://www.wanganran.com/restaurant

已知问题:

  1. 在周六和周日新注册用户设置初始菜单时会出错;
  2. 新注册用户修改菜单时只能选择“仅更改当天的菜单”。

beta2较beta1的更新:

  1. 可以正常设置初始菜单;
  2. 数据库由MsSQL换成Access;
  3. 后台UI优化。

在vs2008中预编译Asp.net应用程序的方法

记得在做Asp.net网站时可以在“发布”中选择“预编译”选项,可是在Asp.net应用程序中却没有这个选项。

所以只能用命令行了。打开VS命令提示,输入:

C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC>aspnet_compiler -v /Aspnet -p "C:\inetpub\wwwroot\mt" C:\inetpub\wwwroot\mt2

其中两个路径都应该是IIS应用程序的目录。第一个可能是未预编译的Asp.net程序,第二个必须是空目录。

而后可以发现第二个目录已经被预编译,aspx文件中只包含一句话:

这是预编译工具生成的标记文件,不应被删除!

也可以发现首次访问时速度会快许多。