0#

关于Node.js下的MongoDB阻塞模式实现

程序  

背景

最近在做公司项目的一个模块,主要用于JSON Api的传输,所以开发环境的目标就锁定在了Node.js。而这一块的登陆用户又是存在MongoDB里面的,所以就有了如下的问题。

  • 网上的Node.JS框架都比较重型或者臃肿的,学了Node之后还需要学额外的东西。
  • 所以我就打算自己写一个专注于JSON Api的快速开发框架,于是有了SevenJS
  • 问题出现了,虽然Node.JS极度推崇异步非阻塞模式,但是阻塞模式在平常开发中还是太常用了。

我们试想一下,如果我们有几句MongoDB的查询之类的,用node-mongodb-native来写的话是这样的:

var client = new Db('test', new Server("127.0.0.1", 27017, {}));
var test = function (err, collection) {
    collection.insert({a:2}, function(err, docs) {
        collection.count(function(err, count) {
            test.assertEquals(1, count); });

            // Locate all the entries using find
            collection.find().toArray(function(err, results) {
            test.assertEquals(1, results.length);
            test.assertTrue(results[0].a === 2);

            // Let's close the db
            client.close();
        });
    });
};

client.open(function(err, client) {
    client.collection('test_insert', test);
});

各种嵌套回调有木有!这不是我们想要的,尤其是我的那个框架,因为我的框架是流式的。

所以我就想有这样的一种方案:

var client = mongodb.connect();
var collection = mongodb.getCollection(client, "dbname");
var result = mongodb.find({ "foo" : "bar" });

使得这样就能找出dbname表下的foo为bar值的记录了。

正题

出于这样的想法,我在网上找遍了大江南北,除了CNode社区有人问到了类似的问题以外,再也找不到音信了,而且那里也没有一个好的回答。

不过这也正常,因为Node.js官方本身就不推荐这么做——他们认为异步非阻塞是非常优雅的一件事情。

包括我在Node.js的IRC聊天室里面问了这个问题,也有人是这么回答我的:

You can’t use a car as a boat. If you want a boat, use a boat.

言简意赅,直截了当地说明Node.js是不支持这样的,如果你想这样做,就用python或者ruby去吧。

不过好在后来IRC里面有人推荐了我一个模块:fibers

有了这个模块好啊,直接能用了有木有!

接下来就来讲一下如何使用吧:

function find(collection, selector, callback) {
    collection.find(selector).toArray(callback);
}

var Fiber = require('fibers');
var Future = require('fibers/future');
var wait = Future.wait;

Fiber(function(){
    var wrapper = Future.wrap(fund);

    /** 这里就是正题了,我们假设已经获取一个collection了 */
    var result = wrapper(collection, { "foo" : "bar" }).wait();
    console.log(JSON.stringify(result));
}).run();

这就是一个非常简单的同步查询MongoDB的例子了,实际上本质还是一个异步,注意到没有,其实Fiber()内部的那个function本质上还是一个回调函数,只不过在这个回调函数里面,里面的所有callback都可以被同步了。不过我们只需要小动一些手脚就能加上这个外壳了。具体请参见sRouter.js约121行的外壳以及sMongoSync.js的实现,加上index.js中的查询demo。

结尾

所以说当我们做不到某件事的时候,多去IRC看看,多去社区混混,也多去找找模块,要真没有的话就只能自己丰衣足食了(我还没到那水平,笑)。总之这次Fibers帮了我一个大忙。

最后,SevenzJS欢迎Fork

2013-03-29 09:31:38      
0#

关于WordPress中的Markdown插件测试

日誌  

Markdown写博客测试

所以说这就是我的第一篇 Markdown 博文了。

2013-01-24 00:09:51  
0#

關於jQuery中”animate()”函數對顏色變...

程序  

最近在做一個汽車團購網的項目,由於老大力求簡潔,所以界面做得有些小清新。不過得說一下頁面不是我設計的,是一位美工同志。

廢話不多說,直接切入正題吧——

我要做得就是讓下面一段代碼生效:

$("#yourid").stop().animate({ "backgroundColor" : "#rrggbb", "color" : "#rrggbb" }, "fast");

但是,很遺憾,一點也沒有動。本來效果應該跟這個版本的xcoder博客的天頭導航條一樣有個動態效果(只不過xcoder的導航條是透明度變化,而項目中我想讓它背景色變化)。

原因是什麼呢?死月上網查了很久,找到的東西都很簡單地說明了一下,貌似都可以。嘛,也許是jQuery新版本不支持這個特性了吧。

最後,死月在jQuery的官方文檔中找到了下面這段話——

All animated properties should be animated to a single numeric value, except as noted below; most properties that are non-numeric cannot be animated using basic jQuery functionality (For example, widthheight, or left can be animated but background-color cannot be, unless the jQuery.Color() plugin is used). Property values are treated as a number of pixels unless otherwise specified. The units em and % can be specified where applicable.

——jQuery官方文檔 .animate()

大致的意思就是說所有動畫屬性都必須是一個單數字值,所以說大多數非數字的屬性是不能被動畫化的。例如高度、寬度等可以被動畫化,但是背景色就不信了。除非你用了jQuery.Color()插件。

所以說問題找到了,我們必須得用一個jQuery.Color()插件來對一些顏色進行動畫操作。

話不多說,我們去下一個jQuery.Color()插件。把它加在我們的頁面中,然後就可以用如下方式來進行動畫操作了:

$(this).stop().animate({ "backgroundColor" : jQuery.Color("rrggbb"), "color" : jQuery.Color("rrggbb") }, "fast");
2012-12-24 09:20:16  
1#

线程安全——Scope Lock模式

程序  

  嘛,本文是建立在M$的Visual Studio基础上的,linux☭勿喷

  我最先用到ScopeLock模式是在自己开发XAE引擎的时候。在里面用到挺多的线程函数,那么如何解决临界区就成了一个重要的课题。可能大家想,不就一个线程锁临界区什么的么,一个EnterCriticalSection和一个LeaveCriticalSection不就解决了么?

  其实不然。在M$中,最常用的当然就是CRITICAL_SECTION了,但是如果临界区上锁却木有解锁呢?这就会发生死锁现象。对于一个粗心的程序猿来说这样的错误还是有几率发生的。就算你足够细心,还是有时候会一失足成千古恨。

  所以就有了这么一种方法来杜绝这种死锁的产生——ScopeLock。
›› 围观更进一步吐槽

2012-09-8 01:31:59     
2#

CodeForces Round #130 DIV2

程序  

回家就生锈了。B题早不去搜索去。

废话不说了,唉。

Description:

A. Dubstep

给你一串字符串,用一个或者”WUB”分割。”WUB”连着多了只算一个。求分割之后的字符串(用空格代替”WUB”)。(字符串长度不超过200,只包含大写字母)

B. Solitaire

一坨纸牌。每次都要把最后一堆纸牌拿起来放到他前1堆或者前3堆上。但是只要它要放的那堆纸牌顶部那张的花色或者数值跟它的花色或者数值一样时才能放。问最后能不能放成一堆纸牌。(花色SDHC,数值23456789TJQKA,纸牌不超过52张)

C. Police Station

我没看。

 [蓝翔]小雨(112****148)  2:24:16
选一个点使得每条最短路上被这个点占据的边数和除以最短路条数的商最大

D. Prizes, Prizes, more Prizes

有N个巧克力。每吃一个,都能去店里加相应的积分。当积分达到一定时,能获取a、b、c、d、e五种物品其中一种。积分可以不断累积。Vasya没吃一个巧克力都要去看看能不能兑换什么东西了没。如果能兑换了就从e开始兑换一直到a过,直到兑换到不能再兑换为止再吃下一个。
(巧克力不超过50个,每个巧克力的积分不超过10^9,1 ≤ a < b < c < d < e ≤ 10^9)

E. Blood Cousins

没看。

›› 围观更进一步吐槽

2012-07-24 02:44:21  
0#

CodeForces Round #129 DIV2

程序  

-. – 同样,又玩儿脱了。在搞出两道水题之后策略失误,一直卡在C题的一个小细节上没A。最后终于意识过来要没时间的时候,最后五分钟敲了D,但是卡在了一个Trick上了,改好后没时间了。不过所幸的是还是稍稍涨了11。

Description:

A. Little Elephant and Rozdil

给你一个n个元素的数组(1 ≤ n ≤ 10^5),让你输出最小值下标。如果有两个或以上最小值,输出”Still Rozdil”。

B. Little Elephant and Sorting

给你一个n个元素的数组(1 ≤ n ≤ 10^5)。你能做多次改变。每次改变都是从数组中取任意一段,对这一段的所有数字加一。问最少需要几次才能把数组变成非递减序列。

C. Little Elephant and Interval

一个数字,如果首位跟末尾相同,我们就把它取来,否则就不要。问l到r区间内,我们能拿到多少个数字。(1 ≤ l ≤ r ≤ 1018)

D. Little Elephant and Cards

有n张卡片(1 ≤ n ≤ 10^5),正反面都有一个颜色。问最少需要翻几张卡片,使得正面有一种颜色不低于半数。

E. Little Elephant and Furik and Rubik

还没看。

›› 围观更进一步吐槽

2012-07-12 14:13:44  
0#

TopCoder SRM 549 DIV2

程序  

Description:

250 Ball And Hats:

有三个帽子,初始的时候球在其中一个帽子下面。然后有swapNum次交换,每次交换都是有球的那个帽子与其相邻的帽子交换。如果有两种选择,那么这两种选择的几率都为50%。问最后球最有可能在哪个帽子下面?如果有多个帽子可能性一样,则输出编号小的那个。

500 Pointy Wizard Hats:

有很多“顶帽子”以及很多“底帽子”。两个帽子可以做成魔法帽需要符合下面的条件:

顶帽子要扣在底帽子上面,并且两个帽子的顶部不能碰到,而且底帽子至少还能看得到。

问怎么分配顶帽子与底帽子的组合,使得能做成最多个魔法帽。

1000 Order Of The Hats:

有个魔法学时表被打乱了,求修复这个魔法学时表所需的最少次数。

每个魔法都有其前驱魔法,表示要学本魔法必须学完前驱魔法。但是学时表被打乱了,使得比如说形成了环。然后现在要修复学时表,即去掉所有环,求最少修复次数。

›› 围观更进一步吐槽

2012-07-10 21:26:39    
0#

NOJ离线提交器 1.0 Beta 2发布

程序  

应大家要求,离线提交器继续完善。

  1. 增加了自动登录
  2. 增加了断线重连的功能。
  3. 题目的页面稍微做了点美化。
  4. 减轻了网络环境差程序奔溃现象。

ACM集训的孩子们好好加油,未来是属于你们的。

遇到问题请及时向我反映
iGod_eleven#163.com
QQ:420007785

注意:如果该程序在你的电脑上无法运行,请将本程序文件夹中的vcredist_x86.exe安装。

欢迎光临 NBUT OJ http://acm.nbut.cn/

经过我们集训队Mr.Eleven一段时间的努力,完成了我们NOJ的离线提交器。提交器是用C#写的,其过程是曲折的:用C++来对网络爬虫库libcurl进行二次封装完成了vjspider.dll(XadillaX之前写这个用于以后写Virtual Judge),然后又对vjspider.dll进行了一次C#的封装,于是有了vjspider.net.dll。

好的,接下去让我们看几个界面:

[下载地址]

2012-07-5 03:28:47    
3#

WordPress处女皮肤作——原创皮肤xcoder-yomi

日誌  

        之前看到Shuizilong啊、日匀神啊等都在做自己的皮或者说已经完成了。这才想起自己去年在西班牙的时候撂下一半的原创皮肤

        经过几天赶工,粗制品也终于出来了。希望勉强能入各位看官的法眼。

        不过除了Chrome,其它浏览器下我都还没看过效果,直接就拉上来了。

2012-07-5 03:09:29  
2#

CodeForces Round #128 DIV2

程序  

这次玩脱了。好不容易四题都做出来,却因为小细节挂了两题。

Description:

A. Two Problems

题意就是说,CF有两题,每题初始分A和B,然后每题在每分钟会扣DA和DB分。给你比赛总时间T,问你某个人可不可能拿到X分。(注意可能做出一题、两题或者一题也没做出)

(0 ≤ x ≤ 600; 1 ≤ t, a, b, da, db ≤ 300且保证及时比赛时间到了各题的分数也不会小于0)

B. Game on Paper

有一个N*N方格纸。在上面的方格里一格格涂黑。每一步涂一格一共涂m次,给定xi和yi。问最少涂几步方格纸里会出现一个3*3的正方形。

(1 ≤ n ≤ 1000, 1 ≤ m ≤ min(n· n, 105))

C. Photographer

照相内存卡里有d容量。其中高质量照片占a容量、低质量占b容量。然后有n个顾客,每个顾客需要xi张高质量照片和yi张低质量照片。摄影师如果给一个人拍照了,就应该满足他所有要求(即给xi张高质量照片和yi张低质量照片)。问摄影师最多能给几个人拍照。

(1 ≤ n ≤ 105, 1 ≤ d ≤ 109, 1 ≤ a ≤ b ≤ 104, 0 ≤ xi, yi ≤ 105)

D. Hit Ball

封闭房间里,从房间的一头最底下的中间以某个方向踢球(一定是网对面踢),问踢到另一头的墙上的时候,x、z各是多少。

(各坐标以及向量都是小于等于100的正整数)

Hit Ball

E. Transportation

还没看。

›› 围观更进一步吐槽

2012-07-4 11:38:59  
Copyright © 2011 艾克斯の編碼者 | WordPress: xcoder-yomi Theme by XadillaX.