flaJson ver0.10 项目公开

flaJson是一个很简单的前端项目,基于Actionscript3及Javascript构建,旨在解决Javascript跨域问题,同时附带日语假名标注的最简解决方案。

主要功能:

  1. 使用Flash读取跨域文件。
  2. Js端使用类似JQuey Ajax语法。
  3. 一个全局变量,代码侵入性低。
  4. 可自动将XML转换为Jsonp格式输出。
  5. 扩展机能:基于Yahoo API的日语假名标注。

Demo

点击查看Demo,SVN在线只支持IE浏览器,其余浏览器请自行下载Source观看。

用例

flaJson.init();
flaJson.parse({
        type : "POST",
        dataType : 'jsonp',
        data : "id=allovince",
        url:'http://ave7.net/feed.xml',
        success : function(json){
                alert(json);
        },
        error : function(err){
                alert(err);
        }
});

[04-08] 基于Apcupsd的UPS配置使用总结(局域网/内外网共享)

在开始这篇文章之前首先要明确一点,在有复数台设备共享UPS的时候,绝对不是插上电源这么简单的,这也是我这几天折腾UPS的最大心得- -。

现在虽然智能型UPS也不算稀罕东西了,不过对于局域网来说仍存在一定的局限性。比如我这次折腾的APC Smart-UPS 1500型。设备商亲切的提供了作为可选配置的串口信号分离器和专用管理软件。但每一样的价格都几乎和再买一个UPS差不多了。好在随机附带有最基本的USB通信功能,那么就利用Apcupsd来实现与收费设备同样的功能吧。

同一网络内的Windows主从模式设置

Apcupsd在Windows下的配置相对简单,首先尝试用两台Windows搭建主从模式并自动关机。

首先选择其中一台主机作为Master,连接USB信号线,下载并安装Apcupsd的Win32版,目前最新版是3.14.5 Stable。

安装完毕后我们可以通过修改C:\apcupsd\etc\apcupsd\apcupsd.conf更改设置,配置文件如下

UPSCABLE usb
UPSTYPE usb
DEVICE
SCRIPTDIR C:\apcupsd\etc\apcupsd
PWRFAILDIR C:\apcupsd\etc\apcupsd
NOLOGINDIR C:\apcupsd\etc\apcupsd
ONBATTERYDELAY 6
BATTERYLEVEL 5
MINUTES 3
TIMEOUT 90
ANNOY 300
ANNOYDELAY 60
NOLOGON disable
KILLDELAY 0
NETSERVER on
NISIP 0.0.0.0
NISPORT 3551
EVENTSFILE C:\apcupsd\etc\apcupsd\apcupsd.events
EVENTSFILEMAX 10
UPSCLASS standalone
UPSMODE disable
STATTIME 0
STATFILE C:\apcupsd\etc\apcupsd\apcupsd.status
LOGSTATS off
DATATIME 0

其实只在默认配置的基础上更改了一行

TIMEOUT 90

即断电后90秒后自动关机。虽然根据配置文件的说明,貌似还应该将UPSCLASS改为sharemaster,UPSMODE改为share。但实际上这样更改以后反而会可能出现网络错误的提示,实践证明这两处设定完全没有必要。

接下来在另一台Windows上配置SLAVE模式,同样安装Apcupsd后修改配置文件中的下列部分:

UPSCABLE ether
UPSTYPE net
DEVICE 192.168.0.253:3551
TIMEOUT 30
UPSCLASS shareslave
UPSMODE share

DEVICE指向Master主机的IP,代表从这个IP接受断电信号。

如果不出意外的话,现在应该已经可以实现Win32下的中从模式自动关机了。

如果工作不正常,可以从C:\apcupsd\etc\apcupsd\apcupsd.events查看错误信息。

同一网络内Linux作为Master主机

这里以CentOS为例。首先下载apcupsd-3.14.5.tar.gz并解压缩

# tar –xvf  apcupsd-3.14.5.tar.gz

为了支持网络模式并加入即时监控的CGI,在编译前加入下列参数

# cd apcupsd-3.14.5
./configure --enable-cgi --with-cgi-bin=/etc/apcupsd/cgi --enable-usb --enable-master-slave

如果缺少依赖关系的包,可以根据提示安装,比如这里就加入了cgi模式,就需要绘图的CGIGD支持,用yum可以轻松安装

# yum install gd-devel

然后是编译和安装

# make
# make install
安装完毕后编辑配置文件
# vi /etc/apcupsd/apcupsd.conf

UPSCABLE usb                 
UPSTYPE usb
DEVICE
LOCKFILE /var/lock
SCRIPTDIR /etc/apcupsd
PWRFAILDIR /etc/apcupsd
NOLOGINDIR /etc
ONBATTERYDELAY 6
BATTERYLEVEL 5
MINUTES 3
TIMEOUT 90
ANNOY 300
ANNOYDELAY 60
NOLOGON disable
KILLDELAY 0
NETSERVER on
NISIP 0.0.0.0
NISPORT 3551
EVENTSFILE /var/log/apcupsd.events
EVENTSFILEMAX 10
UPSCLASS sharemaster
UPSMODE share
STATTIME 0
STATFILE /var/log/apcupsd.status
LOGSTATS off
DATATIME 0

将Apcupsd加入启动列表

# /sbin/chkconfig --add apcupsd

如果服务器装有Apache,那么可以通过网页查看UPS状况,在Apache设定文件中加入

ScriptAlias /apcupsd/  "/etc/apcupsd/cgi/"

启动Apcupsd

# /sbin/service apcupsd start

即可通过访问http://localhost/apcupsd/multimon.cgi获得UPS状态。

在Linux的Master模式下,UPSCLASS和UPSMODE的设置是必须的,其他与Win32下没有区别,同样可以通过查看/var/log/apcupsd.events得到启动日志。而Slave主机无论Windows或Linux都可以参照上文的配置。

不同网络的Linux和Windows互连共享UPS

上面的配置都基于主机在同一网络内这一前提,假设一台Win主机a放置于A网络,另一台Linux主机b放置于B网络,ab主机想要共享同一UPS要怎么做?最简单的方法当然是购买设备商提供的信号分离器。不过相对廉价的方法也是有的,那就是通过双网卡实现双机互联然后共享UPS。

首先要为每台主机增加一块网卡,然后用交错双绞线(Crossover cable)互联。只要为这两台主机设置同一网段相同掩码,即可实现双机互联。

比如将A网络的Windows主机作为Master

网卡1:
IP:192.168.1.2
子网掩码255.255.255.0
下略...

网卡2:
IP:10.1.1.2
掩码:255.255.255.248

B网络的Linux主机做如下配置:

# vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
ONBOOT=yes
BOOTPROTO=static
HWADDR=XXXXXXXXXXXXXXXXXXX #此处为马赛克
NETMASK=255.255.255.248
IPADDR=10.1.1.3
GATEWAY=
GATEWAYDEV=

注意Linux在多块网卡时只需指定一个网关,所以此处GATEWAY和GATEWAYDEV均留空。

然后在Slave主机中指定Master主机的IP即可收工。

DEVICE 10.1.1.2:3551

注意点

Master主机将断电信号传递给Slave有延迟时间,这个延迟时间可以通过ANNOYDELAY来设定,但至少要让Master的自动关机延迟要大于Slave自动关机延迟+ANNOYDELAY才能保证Slave也能正常关机。

Apcupsd在配置时经常会提示网络错误,有时明明是同样的配置,重启之后就会报错,而即使重启服务也无济于事。这多半都是因为主机的启动顺序不对造成的,一定要在Master主机的服务启动后再开启Slave主机,切记切记。

PS:AVBlog2.0开发进度约70%,敬请期待.

Read More

[02-12] 基于Tag标签的简单三表查询相关度实现

AVBlog2.0开发手记之2

在以往的相关度实现中,都需要实现搜索引擎的类似功能,对检索的所有内容进行分词、索引,然后统计对比TF/IDF,从而对内容的相关性作出判断。关于上述内容,Google研究员吴军的数学之美系列中有一篇很好的文章可供参考。

而Tag的出现,是对相关度实现的一个绝好补充。因为以往由机器以统计方式获得的关键词,改由用户作出人为的描述,准确性和适用性都是机器所不能比的。

在一个简单系统中,往往采用一个内容表,一个Tag表,一个关联表这样的多对多关系来实现Tag功能。例如这样的三个表分别是内容表Blogs,标签表Tags和关联表Marks,Blogs/Tags都有主键id,关联表通过blog_id和tag_id将三个表联系起来。

CREATE TABLE `blogs` (
  `id` int(10) auto_increment,
  `title` varchar(255) ,
  PRIMARY KEY  (`id`)
);

CREATE TABLE `tags` (
  `id` int(10) auto_increment,
  `tag` varchar(100) ,
  `count` int(10),
  PRIMARY KEY  (`id`)
);

CREATE TABLE `marks` (
  `tag_id` int(10),
  `blog_id` int(10),
  PRIMARY KEY  (`tag_id`,`blog_id`)
) ;

那么在这样的系统中,如果想要得到文章A的关联内容,只需要检索文章A的所有标签,然后在检索这些标签所关联的文章就可以了。例如我们想要获得id为1的blog的关联blog,可以在Marks表中用left join这样实现

SELECT B.blog_id, B.tag_id
FROM marks AS A
LEFT JOIN marks AS B ON A.tag_id = B.tag_id
WHERE A.blog_id =1 and B.blog_id != 1

结果栏的blog_id就是所有id为1的相关blog

这样做存在很多缺点,首先这是在认为所有标签的重要性都一样的前提下的结果。但事实上Tag自身也有着不同的权重,例如在我的Blog中,【Javascript】这个标签有12篇文章被标记,【Apache】这个标签只有两篇文章被标记。如果每篇文章都只有一个标签的话,显然被标记【Apache】的两篇文章要比标记【Javascript】的12篇文章联系更加紧密。

于是我们可以在这里借用TF/IDF的概念来计算一个Tag的权重,如果Blog的数量有100篇,那么【Javascript】的Tag就是Ln(100/12)=2.120,【Apache】则是Ln(100/2)=3.912。体现到SQL语句里就是这样

SELECT B.blog_id, B.tag_id, LOG( 100 / C.count ) AS weight
FROM marks AS A
LEFT JOIN marks AS B ON A.tag_id = B.tag_id
LEFT JOIN tags AS C ON B.tag_id = C.id
WHERE A.blog_id =1
AND B.blog_id !=1

通过关联Tag表以及Tag表的count值(即为一个Tag标记的Blog数)获得Tag的权重。

接下来的问题是,一个文章往往会关联多个Tag,例如

  • 文章A的Tag有【Javascript】、【Apache】、【Css】、【Ajax】
  • 文章B的Tag有【Javascript】、【Apache】、【Google】
  • 文章C的Tag有【Json】、【Apache】、【XML】

如果Tag的权重都一样的话,显然这三篇文章的相关度是AB>AC的。因为AB有两个标签一致,而AC只有一个。

如何体现在SQL联合查询上呢,我们只需要对上面做少量修改

SELECT B.blog_id, B.tag_id, SUM( LOG( 100 / C.count ) ) AS weight
FROM marks AS A
LEFT JOIN marks AS B ON A.tag_id = B.tag_id
LEFT JOIN tags AS C ON B.tag_id = C.id
WHERE A.blog_id =1
AND B.blog_id !=1
GROUP BY B.blog_id
ORDER BY weight DESC

这里利用了SUM函数和GROUP BY语句。

至此我们通过1个SQL语句就获得了按照相关度排序的序列,虽然使用了两次比较消耗资源的Left Join, 不过因为关联表都是数字序列,操作又集中在主键和索引上,还是可以放心使用的。

Read More

[02-06] OpenID with PHP 上(with OpenID Enabled)

AVBlog2.0开发手记之一

打酱油先

OpenID已经不算是新鲜事物了,不过至今仍然是处于叫好不叫座的尴尬状态。推广的策略是一方面,从用户体验的角度来看,登录过程中会有可能跳转到OpenID网站,这是对已经习惯了普通注册登录流程的用户一个极大的考验。所以像Facebook Connect这样更简洁的应用反而更容易获得市场。也许OpenID想要获得广泛应用还需要不少改进之处,但OpenID的理念,毫无疑问会在未来大放异彩。

不过这些和本次的Blog并无太大关系,我只是出来打酱油的:P

想要让自己的网站支持OpenID,门槛并不算高,以下以PHP为例,记述PHP环境下OpenID登录过程的开发。

准备工作

OpenID的通讯过程已经有很多库封装好了,在OpenID Wiki里可以看到不少PHP类库,本次我们选择JanRain的OpenID Enabled

最新的版本是Version 2.1.2,基于OpenID2.0协议,下载到本地后直接运行examples文件夹里的detect.php,可以根据提示调整开发环境,最低限度需要PHP的PEAR支持。具体情况可以根据提示灵活处理,环境调整的工作这里一笔带过。

运行Demo

客户端登录,已经有现成的Demo可供参考,运行examples/consumer/index.php,输入我们想要验证的OpenID然后提交,Win32环境下会很不幸的出现无法创建/tmp/_php_consumer_test的错误。这是为了保存登录过程中的临时文件,修改examples/consumer/common.php第53行,改为相对目录。

    $store_path = "./_php_consumer_test";

重新运行Demo,仍然报错

Fatal error: Define Auth_OpenID_RAND_SOURCE as null to continue with an insecure random number generator.

在Auth\OpenID\CryptUtil.php的第23行,这里定义了Auth_OpenID_RAND_SOURCE会通过一个特定文件用来生成随机数,这里可以指定本机的一个文件,也可以直接定义为null

define('Auth_OpenID_RAND_SOURCE', null);

至此如果运行环境没有问题的话,客户端登录的Demo已经可以成功运行了。

数据库模式运行

上面的例子采用了文件的方式保存登录过程中的临时文件,OpenID Enabled同时也提供了数据库方式的存储,数据库连接部分是基于PEAR的DB类实现。以Mysql为例,修改examples/consumer/index.php的getStore函数如下

function &getStore() {
    require_once "Auth/OpenID/MySQLStore.php";
	$db =& DB::connect(array(
		'phptype'  => 'mysql',
		'username' => 'root',
		'password' => 'root',
		'hostspec' => 'localhost',
		'database' => 'blog'
	));
    $store = new Auth_OpenID_MySQLStore($db);
    $store->createTables();
    return $store;
}

变量$db指定了数据库链接信息,运行后会发现数据库里自动建立了两个表
oid_associations和oid_nonces,用于存储OpenId登录信息。

Read More

[01-15] 志方あきこ - Harmonia 于发售前种种

虽然火星了一点,不过志方あきこ的第三张专辑「Harmonia」终于要在2月18日发行了。

现在虽然已经开始接受预订,不过关于这张专辑的封面和具体消息透露的不多。简单翻译一下目前Amazon上的简介

游戏音乐界的领军歌姬志方あきこ的新专辑。第一张专辑『Navigatoria』是“星”,第二张专辑『RAKA』是“月”,这次的第三张专辑是以“生命交响曲(Gaia Symphony)”作为主题的集大成之作!4曲×4要素(“地 ” “水” “火” “风”)+1首主题曲共收录17首曲目。

Harmonia有很多意思,根据专辑的主题,这里应该是指希腊神话中的女神哈耳摩尼亚(希腊语αρμονία),战神阿瑞斯(Ares)和美神阿芙洛狄忒(Aphrodite)之女(另一说为赫菲斯托斯 Hephaestus与阿芙洛狄忒),象征调和。而根据这个词所演化出的Harmony一词,正是声乐中的和声之意,再加上“交响曲”的主旨,是不是可以推测这是一张以纷繁的和声为核心的专辑呢。

专辑分为初回限定版和普通版,区别在于限定版的CD盒是贴了金箔的,志方あきこ在Blog上写道装饰金箔是在其本人的强烈要求下加上去的,但因为预算有限,只能将限量改造。戏称自己对金光闪闪的东西最没有抵抗力了,前世一定是只乌鸦。本次能够用上金箔真是一生无悔(笑)。

当然有没有金箔装饰对于欣赏志方さん的音乐并没有影响,不过如果有同样爱好的同学,一定要尽早订购才是。

Read More

[01-13] 例行汇报

终于忍不住为时空之滨做了新的临时过渡画面,当然因为偷懒,很多东西都拿现成的来用,所以这只是一个集成了Google Reader、Twitter、Delicious服务的前端聚合,不过总算是看起来舒服了不少。

音乐盒进度报告,后台部分仍在缓慢的建设中,暂时决定用Rails搭一个简单的构架出来,放出DB部分的初步E-R图

DB E-R图

前端部分则要根据AvPlayer的开发情况决定。

AvPlayer已经华丽的发布了0.10版,也有了几个实质性的Demo,比如作为迷你播放器结合swfobject实现一行代码的简单嵌入,以及完全用Js操作播放器等等,虽然还处于项目的最初阶段,不过拿来用用已经不成问题了。

整体的前端搭建将是对自己这一年来的一个整理总结,给自己的要求是:

  • 通过W3C Strict的语义化页面
  • 样式布局与内容解耦
  • 用更好的布局和CSS来代替滥用的css Hack和js补正
  • 无侵入和模块化的Js
  • 完善的Ajax回退问题以及部分刷新后DOM事件重新绑定问题的解决方案
  • 通过RESTful来实现更简化的前端数据获取

发现果然还是很享受这种没有什么回报,但是可以自由发挥的感觉,真是遗憾哪- -。

Read More
127 - 1/261234...下一页 末页
Now Loading...