vk

“If you love someone, put their name in a circle; because hearts can be broken, but circles never end.”

August 22nd, 2010

[JxLab] Sticky

Comments Off, Uncategorized, by Vayn.

Update: Sticky TODO 正式更名为 Sticky

Stickyhttp://sticky.sinaapp.com) 是一个仿真便利贴网站,在这里你可以把思维的火花随手记录下来。

Sticky 的灵感来自 Nettus+ 的一篇教程,非常感谢 Nettus+ 一直以来分享的各类 web design 文章,如果你也想学习有关网络编程的知识,我推荐你访问 Nettus+

另外还要感谢 V2EX,我对表单设计没什么经验于是就把 V2EX 的设计拿过来山寨了:P


Sticky 的外观


Sticky 的初始界面


粘贴新的便贴


撕掉旧便贴

欢迎各位朋友使用 Sticky

目前 Sticky 还处在初级开发阶段,如果出现什么问题或者你有什么意见请告诉我,我的联系方式如下:

email: vt @at@ elnode.com

twitter: @vayn

当然你也可以在 blog 的留言板上留言。

--eof--

August 20th, 2010

[JxLab] Project VaynWords 0.6.3

Comments Off, Uncategorized, by Vayn.

经历了文本储存和 XML 储存之后,Project VaynWords 终于步入 MySQL+PHP 这个阶段。

单词释义和发音获取全部重写,查询 API 由原来的 Dict.cn 更换为 QQ Dict,至于储存的部分自然也是推倒重来。

Project VaynWords

--eof--

August 19th, 2010

[VBS] SAPI.SpVoice

Comments Off, Uncategorized, by Vayn.

Dim txt,sapi
txt="I LOVE YOU"
set sapi=CreateObject("SAPI.SpVoice")
sapi.Speak txt

来自 Kaisir™

虽然不研究 Windows 编程,但我还是觉得很赞。也许可以设置计划任务什么的,囧。

--eof--

August 15th, 2010

[PHP] 几点疑问

Comments Off, Uncategorized, by Vayn.

1.CURLOPT_HEADERFUNCTION 怎么用?

CUrl 蜘蛛 优化 CURLOPT_HEADERFUNCTION

2.declare 控制结构和 Ticks 是嘛玩意?

declare

3.CURLOPT_HTTP_VERSION 的 1.0 和 1.1 有什么区别?

Key Differences between HTTP/1.0 and HTTP/1.1

4.$_SERVER['PHP_AUTH_USER']

$_SERVER['PHP_AUTH_PW']

$_SERVER['HTTP_AUTHORIZATION']

$_SERVER['REDIRECT_HTTP_AUTHORIZATION'] 怎么用?

$_SERVER

5.header("WWW-Authenticate: Basic realm=\"foo\""); header("HTTP/1.0 401 Unauthorized"); 是什么?

header

HTTP/1.1 specification

6.HTTP 417 Expectation Failed与Expect:100-Continue

--eof--

August 13th, 2010

[PHP] Project Nowhere Plus FeedCore

Comments Off, Uncategorized, by Vayn.

Project Nowhere Plus FeedCore 是什么?

简单地说,Project Nowhere Plus FeedCore 是我写的添加了 feed 导入功能的 Nowhere。

Project Nowhere Plus FeedCore

如何使用?

登录 Nowhere,在右上角会出现一个新的选项“导入”,点击即可开始导入 feed。

目前支持以下网站的导入:

Twitter, Wakoopa, 豆瓣, Bangumi, Last.fm, FriendFeed, Google Reader。

开启自动更新

如果你想开启自动更新,进入控制面板后可以看到一行新的设置:开启Feed导入(“1”开启,“0”关闭)。在下面的文字框输入“1”即可打开自动更新功能。否则你需要每次在你想更新的时候点击“导入”。

如果你想更改更新频率,打开 inc 目录下的 config.inc.php,找到 $feedrate 变量并修改它的值,$feedrate 的时间单位为秒,默认设置 8 小时更新一次。

Credits

感谢 Sai <http://saicn.com/me>,Project Nowhere 是 Sai 一手完成的项目。

感谢 Jeremy Keith <http://adactio.com/>,同步其他 stream project 的最初实现来自他的源码

感谢水木 PHP 版的 feuvan <http://www.newsmth.net/bbsqry.php?userid=feuvan> 版主,耐心帮助我解决了异步更新的难题(对我来说,因为我不会 Javascript)。

也感谢 V2EX 的各位网友,Project Nowhere Plus FeedCore 是我看到 http://www.v2ex.com/t/1093 这个贴子的时候才萌生了给 Nowhere 加入 feed 导入功能。

下载地址

http://project-vaynwords.googlecode.com/files/nowhere.zip

安装方法参考 Sai 所写的 How to install

如果你发现任何问题,欢迎和我联络,我的电子邮件地址是 vt at elnode dot com

--eof--

August 11th, 2010

[PHP] PHP 与 Ajax

Comments Off, Uncategorized, by Vayn.

结合 Ajax 进行 PHP 开发

异步 JavaScript 和 XML(Asynchronous JavaScript and XML,Ajax)无疑是最流行的新 Web 技术。“结合 Ajax 进行 PHP 开发” 这个系列包括两部分,我们将完全使用 PHP 和 Simple Ajax Toolkit (Sajax) 创建一个简单的相册作为在线 Web 应用程序。我们首先用标准的 PHP 开发方法编写简单的相册,然后再用 Sajax 将其变成活动的 Web 应用程序。

通过 PHP 和 Sajax 使用 Ajax

多年以来,创建真正具有响应性的 Web 应用程序这一目标一直被 Web 开发的一个简单事实所阻碍:要改变页面某一部分的信息,用户就必须重载整个页面。但是以后不再会这样了。感谢异步 Java™ 脚本和 XML(Ajax),我们现在可以从服务器端请求新内容,只修改页面的一部分。这个教程解释了如何把 Ajax 用于 PHP ,并介绍了简单 Ajax 工具包(Sajax),这是一个用 PHP 编写的工具,可以把服务器端 PHP 与 JavaScript 集成。

--eof--

August 11th, 2010

[CSS] :nth-of-type(N)

Comments Off, Uncategorized, by Vayn.

这么好玩的功能以前竟然不知道!

:nth-of-type(N)

http://reference.sitepoint.com/css/pseudoclass-nthoftype

This pseudo-class matches elements on the basis of their positions within a parent element’s list of child elements of the same type. This pseudo-class accepts an argument, N, which can be a keyword, a number, or a number expression of the form an+b. For more information, see Understanding :nth-child Pseudo-class Expressions

--eof--

August 9th, 2010

[JxLab] Redis 官方网站 README 翻译(原创)

Comments Off, Uncategorized, by Vayn.

(本文为原创翻译,翻译的不好请各位指点。如果有人真的想转载此文(谜之音:会有吗?),请注明作者是 Vayn <vt at elnode dot com>。)

原文地址:http://code.google.com/p/redis/wiki/README

本文同时发表于 VKForkGeek

简介

Redis 是一个极其快速和强大的键值(key-value)存储数据库,服务器用 ANSI-C 实现。

Redis 提供多种不同的方法做一件明确的事:将一个 value(“antirez”)与对应的 key(“redis”)储存。虽然 key 的格式必须是简单的字符串,但 value 支持以下几种数据类型:

每种 value 的数据类型都有一个相关的可以对其进行操作的命令列表,并且在 The Redis Command Reference 中包括一张最新的,主要以数据类型组织的命令表。

Redis 源中也包含着一个 Redis command line interface,能够让你直接与服务器交互,这意味着本说明将会提供一些样例。当你扫阅 Redis Quick Start Guide 以建立一个 Redis 运行实例时,可以独自按步骤进行。

Redis 最强大的一面是一系列的命令,这些命令是为了工作于特定数据类型而优化的,并且作为服务器端原子操作执行。List 类型是一个很棒的例子——Redis 实现例如 LPUSHRPUSH 这样伴随着 LPOPRPOP 方法的 O(1) 操作:

redis> lpush programming_languages C
OK
redis> lpush programming_languages Ruby
OK
redis> rpush programming_languages Python
OK
redis> rpop programming_languages
Python
redis> lpop programming_languages
Ruby

更多用于各种数据类型的复杂操作也是可用的。继续列下去,你能够获得一系列 LRANGE(O(start+n)) 的元素或用 LTRIM(O(n)) 修整的列表。

redis> lpush cities NYC
OK
redis> lpush cities SF
OK
redis> lpush cities Tokyo
OK
redis> lpush cities London
OK
redis> lpush cities Paris
OK
redis> lrange cities 0 2
1. Paris
2. London
3. Tokyo
redis> ltrim cities 0 1
OK
redis> lpop cities
Paris
redis> lpop cities
London
redis> lpop cities
(nil)

你也可以从一个集合中添加或移除元素,执行交集(intersection)、并集(union)和补集(difference)。Redis 也可以被看成是一个数据结构服务器。Redis 用户实质上拥有一个抽象数据类型(Abstract Data Types)接口,使其免于实施具体数据结构和算法(concrete data structures and algorithms)——的确为了获得最佳性能,Redis 恰当地选择了算法和数据结构。

全部数据放置于内存(memory)中,但储存于硬盘(disk)里

Redis 在内存中加载和维护整个数据集(dataset),但与此同时数据集也持久储存在硬盘中。因此当服务器重启的时候,数据可以加载回内存中。Redis 有两种持久性支持:第一种叫做快照(snapshotting)。此模式下 Redis 周期性地(将数据)异步写入硬盘。数据集在每次服务器(重新)启动的时候从 dump 载入。

可将 Redis 配置成达到若干改变并过了限定的时间后就保存数据集。比如你可以设置 Redis 在 1000 次变化后且自上次储存不超过 60 秒的条件储存。你能够指定任意这些数字的组合。

因为数据是异步写入的,当一次系统崩溃发生,最后的一些查询可能会丢失(the last few queries can get lost)(在很多的应用中可用,但不是全部的)。为了让这种情况不发生问题 Redis 支持另一种更安全的持久模式,被称为 Append Only File(只能添加文件),就是每个收到的用来修改数据集的命令(因此不是一个读取命令,而是一个写入命令)尽可能快地写入一个只能添加文件(AOF)。这些命令在服务器启动的时候被重新执行,用来在内存中重建数据集。

Redis Append Only File 支持一个非常便捷的功能:当服务器长时间运行,它可以在后台以非阻塞方式安全重建一个只添加文件。你可以在 Append Only File HOWTO 找到更多细节。

主从复制实现细节

如果你想保持真正的安全或者你需要均衡(scale)数量巨大的读取,无论你要使用哪种持久性模式Redis 都支持主从复制。

Redis Replication 是一个微不足道的设置。琐碎到为了配置一台 Redis 服务器作为另一台的从服务器,并在假设连接下降的条件下自动同步等等,你全部要做的就是下面一行设置:slaveof 192.168.1.100 6379。如果你想了解更多有关这个功能的资料,我们为你准备了 Replication Howto

持久但支持有效期

Redis 可以当作 memecached on steroids,因为它就像 memcached 一样快但却拥有更多特性。像 memcached 一样,Redis 也支持设置超时时间,这样一个 key 会自动在限定时间过后被移除。

超越键值(key-value)数据库

通过这些特性你可以把 Redis 作为可扩展(伸缩)应用的唯一数据库,而无需使用关系数据库。我们写好了一个用 PHP + Redis 实现地简单的克隆 Twitter,以展示一个现实世界的例子,链接指向一篇遣词简单的文章,这篇文章解释了例子的设计和内部构件。

多数据库支持

Redis 支持多数据库,通过命令自动从一个数据库到另一个数据库移除 key。作为缺省数据库 0 在每次新连接的时候会被选中,但使用 SELECT 命令却不可能选择不同的数据库。MOVE 操作可以自动把一个项从一个数据库移到另一个数据库。这和 RANDOMKEY 命令配合,可以被用做无锁算法的基础(This can be used as a base for locking free algorithms together with the 'RANDOMKEY' commands.)

了解更多关于 Redis!

想真正感觉什么是 Redis 并且想知道它如何工作,请试阅 A fifteen minutes introduction to Redis data types

想知道点儿更多Redis 内部如何工作请继续阅读。

Redis 指导

(注意,如果你只对“正式”文档有兴趣你可以跳过本节)

接下来,你可以在本文档找到有关 Redis 命令的细节信息、协议说明等等。这类文档很有用,但……如果你是个刚了解 Redis 的菜鸟,你会发现这样的文档也很•无•聊!Redis 协议被设计为计算机可高效解析,同样,对只想用 “telnet”命令四处溜达的人类来说也足够简单。So,本节将会向读者稍稍表演一下怎么和 Redis 玩儿,Redis 怎么工作。这样你就会对 Redis 产生一种初恋的感觉~

只需“make”即可编译 Redis,用“./redis-server”启动它。服务器将会开始用标准输出(standard output)记录日志,如果你想记录更多信息请编辑 redis.conf,把 记录等级(loglevel)设为 debug,然后重启。

你可以指定一个配置文件作为特有参数:

./redis-server /etc/redis.conf

这不是必须的。服务器甚至可以在没有配置文件的情况下用缺省内置配置启动。

现在让我们尝试把一个 key 设置到给定的 value:

$ telnet localhost 6379
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
SET foo 3
bar +OK

第一行我们把“set foo 3”发送到服务器。这个意思是“把名为 fool 的 key连同我要发给你的 3 byte设置到名为 bar 的 value”。很简单吧!

(注意,你用小写发送命令服务器也将良好运作,总之命令不是大小写敏感的。)

注意第一二行过后,我们向服务器发送了一行新命令在最后:服务器希望命令和字节序列均以“\r\n”终止。同时从服务器和客户端的观点来看,这是允许我们轻松使用 telnet 命令摆弄 Redis 的最小代价。

服务器和客户端之间会话的最后一行是“+OK”。意思是我们的 key 已经被毫无状况地加入了。事实上只要 “+OK”发送 SET 就不会失败,这让我们知道服务器收到所有命令并且已经实际执行了。

现在我们尝试获取 key 的内容:

GET foo
$3
bar

Ok 这很像于“set”,只是颠倒过来。我们发送了“get foo”,服务器在第一行用 $ 符号后接 value 储存的 key 所包含的 byte 数目作为应答。“\r\n”再次附在 byte 计数和实际数据之后。在 Redis 俚语中,这被称为批量应答(a bulk reply)。

请求一个不存在的 key 会怎样?

GET blabla
$-1

当 key 不存在用长度替换的时候就仅仅发送“$-1”字符串。-1 长度的 bulk reply 没有什么实际含义,它是为了定义“nil” value 并与零长度(zero length)value 区别。另一种检查一个给定 key 是不是确实存在的方法是 EXISTS 命令:

EXISTS nokey
:0
EXISTS foo
:1

正如你所见,服务器第一次应答“:0”,因为 “nokey”(这个 key)不存在。同时“:1”对 foo,这个 key 存在。以冒号开始的应答是完整应答。

Ok……现在你了解了一些基础知识,阅读 REDIS COMMAND REFERENCE 一节学习 Redis 支持的所有命令。如果你想实现一个像样的 Redis实例,请阅读 PROTOCOL SPECIFICATION 一节以了解更多细节。

许可

Redis使用BSD协议进行授权,请阅读源代码中的COPYING文件来了解更多信息。

鸣谢

Redis是由Salvatore Sanfilippo(又叫“antirez”)开发和维护的。

--eof--

August 3rd, 2010

[PHP] Dictionary Web API

Comments Off, Uncategorized, by Vayn.

先来个 Google Translate API 自制版

http://labs.involutive.com/2007/06/05/google-translator-api-php-5-class/

<?php
class Google_API_translator {
    public $opts = array("text" => "", "language_pair" => "en|it");
    public $out = "";
 
    function __construct() {}
 
    function setOpts($opts) {
        if($opts["text"] != "") $this->opts["text"] = $opts["text"];
        if($opts["language_pair"] != "") $this->opts["language_pair"] = $opts["language_pair"];
    }
 
    function translate() {
        $this->out = "";
        $google_translator_url = "http://google.com/translate_t?langpair=";
        $google_translator_url .= urlencode($this->opts["language_pair"])."&";
        $google_translator_url .= "text=".urlencode($this->opts["text"]);
        $gphtml = $this->getPage(array("url" => $google_translator_url));
        preg_match('/(.*?)</div>/', $gphtml, $out);
        $this->out = utf8_encode($out[0]);
        return $this->out;
    }
 
    function getPage($opts) {
        $html = "";
        if($opts["url"] != "") {
            $ch = curl_init($opts["url"]);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($ch, CURLOPT_TIMEOUT, 15);
            $html = curl_exec($ch);
            if(curl_errno($ch)) {
                $html = "";
            }
            curl_close ($ch);
        }
        return $html;
    }
}
 
// Example
$g = new Google_API_translator();
$g->setOpts(array("text" => "ciao", "language_pair" => "it|en"));
$g->translate();
echo $g->out;
?>

在线词典 API:

1.dict.cn: http://api.dict.cn/ws.php?utf8=true&q=#{word}

XML 格式。Project Vaynwords 之前一直在用,说实话查询质量一般。

2.爱词霸: http://dict-co.iciba.com/api/dictionary.php?w=#{word}

XML格式。

3.QQ 词典: http://dict.qq.com/dict?q=#{word}

JSON 格式。


Switch to our mobile site