Archive for the ‘Coding’ Category

利用Google Map API获取地址坐标

Google.com

朋友拜托改的一段PHP小代码,其实就是Google MAP API FAQ里面提到的例子稍作修改,原文例子还用到了MySQL作为存储因此扯了一堆MySQL和PHPMyAdmin,只是想简单查下的就显得没必要了。

修改 @ 2009-06-07 :

于是今天写了一个Javascript版本的:http://vifix.cn/atelier/address_to_coordinates/
,代码都在HTML里面了,感兴趣可以右键查看源码。

下面是PHP版本的代码:
Read the rest of this entry >>

WordPress同步QZone插件·改

qq

这两天在想写一个WordPress的插件练练手,因为正好看到了QZone也支持了用邮件发表的文章,因此在想是不是就写个插件让WordPress发表文章自动同步到QQ。一来可以吸引QQ上的好友来阅读我发表的内容,增进交互,二来也可以算是一定程度上的SEO。

但写完了SMTP连接部分时在找WordPress插件的文档时找到了已经有现成的插件,测试了一下已经把我想做的都做出来了,还支持添加额外的电子信箱,用来支持其它所有支持电子邮件发表的BSP的发表(不过Live.com的博客服务因为暂时被功·夫·网所以无法使用这个)

不过实际尝试了一下发现这个插件还很有问题:

  • 保存密码的表单密码将被重复加密导致不可用
  • 对于引号和斜线的转义过头导致数据丢失(似乎这个是WordPress本身转义提交信息带来的问题)

因此对这个插件进行了一番修改:

  • 纠正错误的转义
  • 放弃原版使用的PHPMailer(杀鸡用牛刀的感觉),换上一个较为简单的Socket SMTP发送函数修改的类
  • 修正密码被重复加密的Bug

我修改的版本在此下载:wp-qzone.0.4-mod.zip

原始的WP-Post2Qzone获取地址:http://code.google.com/p/qzone/

作者的博客:http://liguangming.com/

更新@2010-07-26

不明原因的插件可能暂时无法使用中,待检查

一个PHP简易访问计数

source_php

嘛,受朋友所托写的,不是什么大不了的东西,贴上来就当给初学者参考吧
只有计数功能,利用session防止重复计数

注意只能运行在PHP5+上

代码见页内:

Read the rest of this entry >>

开源键-值数据库笔记

server

前段时间玩了Google App Engine之后一直对开源的键-值数据库比较关注,因为其开发使用方便,也有了在研究在自己的服务器上部署的可能性,于是自己Google了一些,同时Flying殿也有推荐了一下,于是发文简单记录一下。

眼下关注的有:

  1. MongoDB
  2. Hypertable
  3. CouchDB
  4. Tokyo Cabinet
  5. Project Voldemort

Read the rest of this entry >>

Google App Engine中datastore的Key

google_appengine

Google App Engine使用了一种与关系数据库完全不同的数据库,称为分布式键-值数据库(Key-Value-Database),所有的”条目”,都是一个对象。这种数据库拥有代码简单,开发效率高,高并发访问效率等特性,但同时也有不支持模糊查询等缺点。

在使用上,键-值数据库和之前熟悉的MySQL等所有的关系数据库都有点不太一样,因此在开发vxtodo时走了一些弯路,比如这个等同于关系数据库的”主键”的问题就让我奇怪了很久(当然,对于这种的键-值数据库中,是否能以主键来称呼应该值得商榷),刚才终于摸索清楚了,记录下来。

Google App Engine的datastore的每个条目的唯一的键是自动生成的,无需人工干预。因为一开始并不清楚这一点,所以定义”表”的结构时找不到类似于自动索引的功能,结果开始写vxtodo时我用的是时间戳 + 用户名邮箱地址然后Hash再取绝对值出来的一个唯一值的诡异方法,虽然也能用,但是毕竟不够优雅(这样的Hash值实在是太长了)。仔细翻阅文档后,终于把ID/Name部分给看明白了。

Read the rest of this entry >>

vxtodo

vxtodo

这段时间研究Google App Engine的成果,今天发布。

一个个人TODO-List管理程序,支持邮件提醒。

服务器端是Python,客户端自然还是 HTML + CSS + JS,话说Javascript的代码比Python还多一倍,没jQuery的话代码量应该会更加冗长……不过用Google App Engine来写程序还是挺幸福的。

欢迎各位使用(会有人用么?),以及帮忙测试和报告Bug

在GPL第二版协议下开源。

地址:
http://vxtodo.ihfs.net/
http://vxtodo.appspot.com/

获取源代码前往:
http://code.google.com/p/vxtodo/

PS.I: google app engine还无法支持.cn域名,因此只好用这个ihfs.net来进行绑定了……
PS.II: 话说appspot偶尔会被GFW掉,无奈……
PS.III: 于是咱也玩了把云计算了啊~

更新@2009-05-14:

  1. 修正了无法输入\和回车的bug
  2. 加入Prism的说明
  3. 制作了LOGO

更新@2009-05-15:

  1. 修改了数据模型,删除了一些无用的测试数据(没办法的选择,这种键-值数据库无法修改“表结构”,只能清空数据库然后重新添加

更新@2009-05-17:

  1. 对状态图标加上了事件,点击可以直接转换状态
  2. 将代码导入Google Code,以GPLv2开源

更新@2010-01-17:

  1. 解决一个换行的问题

Java中的支持重试,有限任务数量线程池

threadpooldemo_output

昨天学校网络没有续费没法上网,晚上找事情干,就翻着O’Reilly的《Java线程》(第三版)看了一些内容然后写的实验性质的代码,主要是对于Konachan的线程池代码很不满意而写的。

这些代码主要包括:

  1. 三个线程复用的线程池(利用ThreadPoolExecutor)
  2. 通过判断线程池现有的活动线程数量限制ThreadPoolExecutor执行新任务
  3. 如果执行出错,可以自动重试(这里的“任务”有80%的成功率)
  4. 利用Hashtable<Integer, String>来记录“任务”的运行状态,如果不在Hashtable中,表示任务已经结束
  5. 每个“任务”耗时0到10000毫秒(利用Thread.sleep模拟)

然而这个实现也让人觉得不够优雅,也许自己实现一个RejectedExecutionHandler接口的类,然后绑定为ThreadPoolExecutor的弹出策略才是王道吧。另外,觉得应该还需要自己还要再写一个队列。

完整的代码(Eclipse工程在文末):

Read the rest of this entry >>

Java实现图像的高斯模糊滤镜

gaussianblurfiltertest

继续研究那本《Java动画、图形和极富客户端效果开发》,下午到现在搞的东西,高斯模糊滤镜,其原理(高斯分布)可以用一个矩阵方程来表示:

gaussian-formula

这个公式中,u是一个像素到中心的水平距离,v是一个像素到中心的垂直距离,σ(sigma)是标准偏差。标准偏差可以设置为任意的数,但是设置成半径的1/3会生成好的结果

看来要补充些线性代数的知识了 orz

我的高数课本都已经卖给二手书收购站了啊! orzorzorz

那么滤镜核心部分的代码见内页,测试用的代码部分就不贴了,感兴趣的点击文后的压缩包看源代码(Eclipse工程)&可执行JAR吧。

Read the rest of this entry >>

Swing绘制渐变按钮

昨天从图书馆借了一本《Java动画、图形和极富客户端效果开发》,作者为Sun公司的Java SE组客户端架构师,看了几页感觉获益匪浅。内容涉及Swing的渲染原理,一些图像的滤镜实现算法(例如方框模糊和高斯模糊),以及特效(比如类似OSX的倒影风格)的原理,都十分有意义,对接下来的图形研究很有帮助,若能精读此书,相信都可以写一个简单的图像处理软件出来了。

尝试了里面提到一个十分简单的渐变按钮,效果不错,代码如下:

Read the rest of this entry >>

PHP自动加载class文件的方案

PHP5中有一个很方便的__autoload的魔术函数,PHP Manual中的示例如下:

function __autoload($class_name) {
    require_once $class_name . '.php';
}
 
$obj  = new MyClass1();
$obj2 = new MyClass2();

算是很方便的一个函数,然而有一个缺陷就是没有名称空间,大量的class不得不放在一个目录下面,才可以用这个自动加载php的魔术函数,如果class文件要放在不同的目录里面,这个自动载入就无能为力了。为了解决这个问题,自己写了一个loadClass函数实现类似功能,代码如下:

function loadClass($tgt){
	$class = substr($tgt, strrpos($tgt, '.')+1);
	require_once(DIR_APP.str_replace('.','/',$tgt).'.php');
	return new $class();
}
 
$test = loadClass("model.test");
$test->myfunc();

DIR_APP/model/test.php:

class test{
	function myfunc(){
		echo "hello, world!~";
	}
}

如此一来,就可以方便的加载在不同的目录里面的(缺点就是要打完整的”名称空间”),并且应该在PHP4中也可以使用(虽然PHP5已经是大流)……

补充@2009-02-23 22:42

就此自动载入的问题咨询了一下某飞,给了两个采用spl_autoload的自动载入的实现(by flying~):

function loader($className) {
    $classPath = str_replace('_', DIRECTORY_SEPARATOR, $className);
    require $classPath . '.php';
}
 
spl_autoload_register('loader');
 
$user = new Model_User();
// load (inlcude paths):/Model/User.php

class的名称定义遵循PEAR标准用下划线_进行分隔
更加复杂点的支持多路径的”豪华版”(by flying~):
Read the rest of this entry >>

Page 2 of 41234