{"data":[{"id":"545aee5a3e1f39344c5b3b3e","author_id":"5283524ed2b3893f2ab0e5a1","tab":"share","content":"<div class=\"markdown-text\"><h4>概述</h4>\n<p><a href=\"/user/saionjisekai\">@saionjisekai</a> <a href=\"/user/alsotang\">@alsotang</a></p>\n<p>话说已经做了，之前未放出。 同是ionic但针对iOS，不是来捣乱的yo。</p>\n<p><a href=\"/user/callmewhy\">@callmewhy</a> icon是拿的你的, 稍微做了点修改。「捂脸」</p>\n<h4>代码地址</h4>\n<p><a href=\"https://github.com/lanceli/cnodejs-ionic\">https://github.com/lanceli/cnodejs-ionic</a></p>\n<h4>下载地址</h4>\n<p>突然发现fir.im的cli工具提供使用resign.tapbeta.com进行企业签名。详见： <a href=\"http://blog.fir.im/2014/fir_cli/\">http://blog.fir.im/2014/fir_cli/</a>\n另外提供了web演示地址，部署在coding.net上。</p>\n<h5>App Store</h5>\n<p><a href=\"https://itunes.apple.com/cn/app/cnodejs-node.js-zhong-wen/id954734793\">https://itunes.apple.com/cn/app/cnodejs-node.js-zhong-wen/id954734793</a>\n<img src=\"http://ww4.sinaimg.cn/large/658e3191gw1eo38pis6ybj208c08cq3v.jpg\" alt=\"qrcode\"></p>\n<h5>fir.im(iOS企业证书 &amp; Android)</h5>\n<p><a href=\"http://fir.im/ks4u\">http://fir.im/ks4u</a>\n<img src=\"http://qr.liantu.com/api.php?m=30&amp;fg=475a62&amp;el=L&amp;text=http%253A%252F%252Ffir.im%252Fks4u%252Finstall\" alt=\"qrcode\"></p>\n<h5>web演示</h5>\n<p><a href=\"http://cnodejs-ionic.coding.io/\">http://cnodejs-ionic.coding.io/</a>\n<img src=\"http://ww3.sinaimg.cn/large/a18989bfjw1emz832cd0gj207s07smxb.jpg\" alt=\"qrcode\"></p>\n<h4>更新</h4>\n<h5>2015-01-27</h5>\n<ul>\n<li>更名为：CNode社区</li>\n<li>增加推送功能\n<ul>\n<li>iOS商店审核中</li>\n<li>Android请手动更新到v1.2.0</li>\n</ul>\n</li>\n<li>适配了iPhone 6和iPhone 6 Plus</li>\n</ul>\n<h5>2015-01-09</h5>\n<ul>\n<li>app store已上架 <a href=\"https://itunes.apple.com/cn/app/cnodejs-node.js-zhong-wen/id954734793\">https://itunes.apple.com/cn/app/cnodejs-node.js-zhong-wen/id954734793</a></li>\n</ul>\n<h5>2015-01-05</h5>\n<ul>\n<li>打包了apk 大家可以感受下</li>\n</ul>\n<h5>2014-12-26</h5>\n<ul>\n<li>撸了个极简的app landing page\n<ul>\n<li>coding.net: <a href=\"http://cnodejs-ionic.coding.io/\">http://cnodejs-ionic.coding.io/</a></li>\n<li>github: <a href=\"https://lanceli.github.io/cnodejs-ionic/\">https://lanceli.github.io/cnodejs-ionic/</a></li>\n</ul>\n</li>\n</ul>\n<h5>2014-12-04</h5>\n<ul>\n<li>当浏览器访问时可以输入token登录</li>\n</ul>\n<h5>2014-12-03</h5>\n<ul>\n<li>显示回复被点赞数量</li>\n<li>增加小尾巴</li>\n</ul>\n<h5>2014-12-01</h5>\n<ul>\n<li>增加GA统计</li>\n</ul>\n<h5>2014-11-28</h5>\n<ul>\n<li>增加意见与反馈 by email</li>\n<li>增加localStorage存储\n<ul>\n<li>用户登录信息</li>\n<li>用户设置</li>\n</ul>\n</li>\n</ul>\n<h5>2014-11-27</h5>\n<ul>\n<li>增加省流量模式</li>\n<li>增加设置页面\n<ul>\n<li>关于作者</li>\n<li>关于CNodeJs</li>\n</ul>\n</li>\n</ul>\n<h5>2014-11-24</h5>\n<ul>\n<li>增加用户退出功能</li>\n</ul>\n<h5>2014-11-11</h5>\n<ul>\n<li>使用inappbrowser打开外部链接</li>\n<li>增加app badge标识未读消息数量</li>\n</ul>\n<h5>2014-11-10</h5>\n<ul>\n<li>增加了消息中心，查看消息历史</li>\n</ul>\n<h5>2014-11-08</h5>\n<ul>\n<li>UI\n<ul>\n<li>延时隐藏启动画面，优化体验</li>\n</ul>\n</li>\n<li>增加未读消息提示</li>\n</ul>\n<h5>2014-11-07</h5>\n<ul>\n<li>登录\n<ul>\n<li>长按“登录”时，读取剪贴板内accesstoken登录</li>\n</ul>\n</li>\n<li>更新UI\n<ul>\n<li>主题列表</li>\n<li>主题详情</li>\n<li>logo(同 cnodejs_light.svg )</li>\n</ul>\n</li>\n<li>解决了一个刷新导致的分页问题</li>\n<li>增加了moment.js的本地化文件</li>\n</ul>\n<h4>基本功能</h4>\n<ul>\n<li>话题列表\n<ul>\n<li>新建话题</li>\n<li>切换话题板块</li>\n<li>下拉刷新</li>\n<li>上滑分页 （ionic v1.0.0-beta.13 的collection-repeat有个bug, 看不到菊花 <a href=\"https://github.com/driftyco/ionic/issues/2376\">#2376</a>）</li>\n</ul>\n</li>\n<li>话题详情\n<ul>\n<li>回复话题</li>\n<li>回复回复 0.0</li>\n<li>给回复点赞</li>\n</ul>\n</li>\n<li>用户\n<ul>\n<li>扫码登录</li>\n<li>剪贴板登录</li>\n<li>查看用户信息</li>\n</ul>\n</li>\n</ul>\n</div>","title":"CNode社区 for Ionic [2015-02-07更新][1.2.1已上架][求issue]","last_reply_at":"2015-02-22T12:24:42.333Z","good":true,"top":true,"reply_count":86,"visit_count":8785,"create_at":"2014-11-06T03:43:22.312Z","author":{"loginname":"ilanceli","avatar_url":"https://avatars.githubusercontent.com/u/874744?v=3&s=120"}},{"id":"54d6c9bdf01202b424f80e89","author_id":"5142b1bb069911196d697ea0","tab":"share","content":"<div class=\"markdown-text\"><p><a href=\"https://github.com/iojs/iojs-cn/issues/1\">https://github.com/iojs/iojs-cn/issues/1</a></p>\n<p>Welcome, new localizations team :)</p>\n<p>To get this team up and running you have a few initial tasks to accomplish:</p>\n<p>Create a README.md for this repository, it should include:\nA “call to action” pointing to the Issue tracker for new translators to find tasks.\nA list of the team members.\nInstructions on how to log an issue to be added to this team.\nSet the repository description. This should not be in English, it should be in the language for this community :)\nSocial Media\nCreate a twitter account for this language. Share the password privately with the team.\nCreate accounts on other social media popular in this language. Share the passwords private with the rest of the team.\nMake sure you use these accounts not just to promote newly translated material but also to attract people in your community to help with translation tasks.\nOptional: If you plan to do a Google hangout w/ your localization team have <a href=\"/user/mikeal\">@mikeal</a> add you to the Google+ account so that it can post to the iojs YouTube channel. Once you are added there is documentation on how to setup a hangout-on-air.\nFinally, create a new Issue to translate and publish the latest io.js post. Once translated you should post it wherever you think it will get the most visibility to the community speaking you language, you don’t have to post it to Medium unless you think that it is best.</p>\n</div>","title":"iojs 中文化翻译启动, 有兴趣的同学看过来","last_reply_at":"2015-02-21T13:28:52.396Z","good":true,"top":true,"reply_count":4,"visit_count":1625,"create_at":"2015-02-08T02:28:13.575Z","author":{"loginname":"Pana","avatar_url":"https://avatars.githubusercontent.com/u/552081?v=3&s=120"}},{"id":"54e9fcb871a34f6e39d31c6a","author_id":"54e9fbf471a34f6e39d31c69","tab":"ask","content":"<div class=\"markdown-text\"><p>刚开始写node，感觉写出来的代码太丑了，可读性也不强。下面这段代码是一个简单的注册逻辑，用了Promise，希望大神拍砖，给一些风格或者是写法上的建议：</p>\n<pre class=\"prettyprint language-js\"><code>    register: function(req, res) {\n            var sha1 = require(&#x27;crypto&#x27;).createHash(&#x27;sha1&#x27;);\n            var email = req.body.email;\n            var password = sha1.update(req.body.password).digest(&#x27;hex&#x27;);\n            var connect = mysql.connect(__dirname + &#x27;/../mysql.json&#x27;, &#x27;dbname&#x27;);\n\n            var sql = &#x27;into user(email, password) value (?, ?)&#x27;;\n            emailAlreadExists(email).then(function() {\n                addUser(email, password)\n                    .then(function(id) {\n                        res.send(res.send(lib.genAjaxRet(0, &#x27;success&#x27;, {id: id})));\n                    }); \n            }, function() {\n                res.send(lib.genAjaxRet(10001, lib.s(&#x27;EMAIL_EXISTS&#x27;)))\n            }); \n        }\n</code></pre></div>","title":"关于node的代码风格","last_reply_at":"2015-02-23T09:19:48.644Z","good":false,"top":false,"reply_count":3,"visit_count":76,"create_at":"2015-02-22T15:58:48.481Z","author":{"loginname":"louis-sherren","avatar_url":"https://avatars.githubusercontent.com/u/2050207?v=3&s=120"}},{"id":"54e7cccd16de4cf07fcefd80","author_id":"52766c03d2b3893f2a12d178","tab":"ask","content":"<div class=\"markdown-text\"><ol>\n<li>创建与外层作用域同名的变量比较麻烦</li>\n</ol>\n<p>在 JS 里我可以这样做：</p>\n<pre class=\"prettyprint\"><code>var a = &#x27;global a&#x27;;\nfunction func() {\n    var a = &#x27;local a&#x27;;\n}\n</code></pre><p>但是在 Coffee 里则只能：</p>\n<pre class=\"prettyprint\"><code>a = &#x27;global a&#x27;;\n\nfunc = -&gt;\n    do (a = null) -&gt;\n        a = &#x27;local a&#x27;\n</code></pre><p>为了定义局部变量需要多一层缩进，感觉不是很好。</p>\n<ol>\n<li>没有办法使用 function 语句来定义函数</li>\n</ol>\n<p>在 JS 里我可以这样：</p>\n<pre class=\"prettyprint\"><code>module.exports = {\n    doXX: doXX,\n    doOO: doOO\n};\n\nfunction doXX() {}\nfunction doOO() {}\n</code></pre><p>这样在一个文件的开头可以很清晰地看到这个文件都定义了哪些函数，针对使用者的注释也可以都写在最上部，因为用 function 语句定义的函数会被提前到文件最开头，但在 Coffee 里就没办法这样做。</p>\n</div>","title":"对 CoffeeScript 不爽的几点，求指教","last_reply_at":"2015-02-23T07:16:24.506Z","good":false,"top":false,"reply_count":5,"visit_count":218,"create_at":"2015-02-21T00:09:49.761Z","author":{"loginname":"jysperm","avatar_url":"https://avatars.githubusercontent.com/u/1191561?v=3&s=120"}},{"id":"54e95339eb75f306219b011b","author_id":"5375c4f3cbcc3963497f9ca6","tab":"ask","content":"<div class=\"markdown-text\"><p><img src=\"//dn-cnode.qbox.me/Fp-gp7igmt-o3NwDBSP14dOyzMj5\" alt=\"2P6{J%M1F6%)M(O5SD~95)Q.jpg\"> <img src=\"//dn-cnode.qbox.me/FnX_XfEyupI1G1fc9FcWtic_iBTU\" alt=\"EO$5WRQD(5R~CYN~)V3J)VF.jpg\">\n在终端输入node -v是有显示的。。webstorm也是可以了。。不过在sublime3里就出问题了。。求大神帮忙哈。。</p>\n</div>","title":"mac环境下。。已经配置了nodejs的路径。。编译还是显示node: command not found","last_reply_at":"2015-02-23T03:13:22.816Z","good":false,"top":false,"reply_count":1,"visit_count":83,"create_at":"2015-02-22T03:55:37.456Z","author":{"loginname":"lazyfish88","avatar_url":"https://avatars.githubusercontent.com/u/3926898?v=3&s=120"}},{"id":"54e96cf7ddce2d471403203f","author_id":"51cfccdd73c638f3708c58d8","tab":"share","content":"<div class=\"markdown-text\"><blockquote>\n<p>开始本文之前，期待您了解页面与服务器的交互知识，会更容易理解。</p>\n</blockquote>\n<h2>需求</h2>\n<ul>\n<li>\n<p>某通有个活动，只要每天签到等各种操作就能累积积分，随着等级提升每月可以领到 20M - 300M的流量等。</p>\n</li>\n<li>\n<p>作为码农的你当然不愿意以正常的姿势去完成这些事情，所以你想要程序代替你完成这些事情。（(<em>^__^</em>) 嘻嘻……）</p>\n</li>\n</ul>\n<p><img src=\"http://think2011.qiniudn.com/17wo-1.png\" alt></p>\n<p><img src=\"http://think2011.qiniudn.com/17wo-2.png\" alt></p>\n<h2>效果</h2>\n<ul>\n<li>\n<p>理想：</p>\n<ol>\n<li>下午六点</li>\n<li>你收到一份邮件，里面躺着截图和报告，写着你的号码累积的积分，签到天数，优惠等。</li>\n<li>你可以置之不理，或者回复操作：\n<ul>\n<li>登录需要验证码时，回复验证码登录。</li>\n<li>领取当月流量等。</li>\n</ul>\n</li>\n</ol>\n</li>\n<li>\n<p>本文：</p>\n<ol>\n<li>下午六点</li>\n<li>你收到一份邮件，告诉你已完成签到。</li>\n</ol>\n</li>\n</ul>\n<h2>准备工作</h2>\n<ol>\n<li><a href=\"https://github.com/visionmedia/superagent\">superagent</a>，模拟登录，触发页面</li>\n<li><a href=\"https://github.com/andris9/Nodemailer\">nodemailer</a>，发送邮件</li>\n<li><a href=\"https://github.com/bunkat/later\">later</a>，定时执行任务</li>\n<li><a href=\"https://github.com/caolan/async\">*async</a>，排队完成任务（可选，某些任务有先后顺序）</li>\n<li><a href=\"https://github.com/Medium/phantomjs\">*phantomJS</a>，网页截图（可选）</li>\n</ol>\n<h2>目录规划</h2>\n<p><code>/app.js</code>             程序入口\n<code>/config.js</code>          账号配置信息等\n<code>/controller/</code>\n<code>autoCheckIn.js</code>  自动签到等任务\n<code>sendEmail.js</code>    发送邮件\n<code>task.js</code>         定时任务</p>\n<h2>0. 配置账号信息-config.js</h2>\n<pre class=\"prettyprint language-javascript\"><code>module.exports = {\n    // 某通账户\n    &quot;accounts&quot;: [\n        {\n            &quot;user&quot;: 15500000000,\n            &quot;password&quot;: 123456\n        },\n        {\n            &quot;user&quot;: 15500000001,\n            &quot;password&quot;: 123456\n        }\n    ],\n\n    // 邮件账户\n    &quot;email&quot;: {\n        &quot;host&quot;: &#x27;smtp.163.com&#x27;,\n        &quot;user&quot;: &#x27;xxx@163.com&#x27;,\n        &quot;password&quot;: 123456,\n        &quot;toUser&quot;: &#x27;xxx@qq.com&#x27;\n    }\n};\n</code></pre><h2>1. 发送邮件-sendEmail.js</h2>\n<p>这里没什么特别的，通过 <code>nodemailer</code> 模块代理发送邮件。</p>\n<pre class=\"prettyprint language-javascript\"><code>var email = require(&#x27;../config.js&#x27;).email;\nvar nodemailer = require(&#x27;nodemailer&#x27;);\n\nvar transporter = nodemailer.createTransport({\n  host: email.host,\n  secureConnection: true, // use SSL\n  auth: {\n    user: email.user,\n    pass: email.password\n  }\n});\n\n/**\n * 发送邮件\n * @param contents\n */\nmodule.exports = function (contents) {\n  transporter.sendMail({\n    from: email.user,\n    to: email.toUser,\n    subject: &#x27;checkIn success!&#x27;,\n    text: contents || &#x27;is test!&#x27;\n  }, function (error, response) {\n    if (error) {\n      console.log(error);\n    } else {\n      console.log(&quot;Message sent: &quot; + response.response);\n    }\n\n    transporter.close(); // 如果没用，关闭连接池\n  });\n};\n\n</code></pre><h2>2.1 一些调查工作</h2>\n<p>在模拟登录前，你通过抓包工具来收集登录所需的数据。</p>\n<ul>\n<li>因为页面会跳转，所以通过断点调试来暂停页面。</li>\n<li>接着查看发出的数据。</li>\n</ul>\n<p><img src=\"http://think2011.qiniudn.com/17wo-3.png\" alt></p>\n<p><img src=\"http://think2011.qiniudn.com/17wo-4.png\" alt></p>\n<h2>2.2 模拟登录和访问页面-autoCheckIn.js</h2>\n<ul>\n<li>不确定服务器会接收哪些信息，所以你把大部分headers字段都写上了，尽可能模拟真实。</li>\n<li>另外值得注意的是，你发现总是拿不到cookie，原来是页面重定向了，加上了 <code>.redirects(0)</code>，防止页面被转向。</li>\n</ul>\n<pre class=\"prettyprint language-javascript\"><code>var request = require(&#x27;superagent&#x27;);\nvar sendEmail = require(&#x27;./sendEmail&#x27;);\n\nvar headers = {\n    Accept: &#x27;text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8&#x27;,\n    Origin: &#x27;http://wap.17wo.cn&#x27;,\n    &#x27;X-FirePHP-Version&#x27;: &#x27;0.0.6&#x27;,\n    &#x27;User-Agent&#x27;: &#x27;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36&#x27;,\n    &#x27;Content-Type&#x27;: &#x27;application/x-www-form-urlencoded&#x27;,\n    DNT: 1,\n    Referer: &#x27;http://wap.17wo.cn/Login.action&#x27;,\n    &#x27;Accept-Encoding&#x27;: &#x27;gzip, deflate&#x27;,\n    &#x27;Accept-Language&#x27;: &#x27;zh-CN,zh;q=0.8,zh-TW;q=0.6,en;q=0.4,sr;q=0.2&#x27;\n};\n\nvar origin = &#x27;http://17wo.cn&#x27;,\n    urls = {\n        login: origin + &#x27;/Login!process.action&#x27;,\n        checkIn: origin + &#x27;/SignIn.action?checkIn=true&#x27;\n    };\n\n\n/**\n * 自动签到\n * @param account {object}\n * @constructor\n */\nfunction AutoCheckIn(account) {\n    this.account = account;\n\n    this.cookie = {\n        value: null,\n        expires: null\n    };\n\n    this.init();\n}\n\nAutoCheckIn.prototype = {\n    constructor: AutoCheckIn,\n\n    init: function () {\n        var that = this;\n\n        that.checkIn(function () {\n            sendEmail(that.account.user + &#x27;，签到完毕。 &#x27; + new Date());\n            console.log(&#x27;======&#x27;, &#x27;签到完毕，&#x27; + that.account.user, &#x27;======&#x27;);\n        });\n    },\n\n    // 验证登录，如果凭证没过期，无需重新验证\n    _verify: function (cb) {\n        Date.now() &gt; this.cookie.expires ? this._login(cb) : cb(this.cookie);\n    },\n\n    // 登录\n    _login: function (cb) {\n        var that = this;\n\n        request\n            .post(urls.login)\n            .set(headers)\n            .type(&#x27;form&#x27;)\n            .send({\n                backurl: null,\n                backurl2: null,\n                chk: null,\n                chkType: &#x27;on&#x27;,\n                loginType: 0,\n                mobile: that.account.user,\n                password: that.account.password\n            })\n            .redirects(0) // 防止页面重定向\n            .end(function (result) {\n                var cookie = result.headers[&#x27;set-cookie&#x27;];\n                that.cookie = {\n                    value: cookie,\n                    expires: cookie.join().match(/Expires=(.*);/)[1]\n                };\n\n                cb(that.cookie);\n            });\n    },\n\n    // 签到\n    checkIn: function (cb) {\n        var that = this;\n\n        that._verify(function (cookie) {\n            request\n                .get(urls.checkIn)\n                .set(headers)\n                .set(&#x27;Cookie&#x27;, cookie.value)\n                .end(cb);\n        });\n    }\n};\n\n\nmodule.exports = function (account) {\n    return new AutoCheckIn(account);\n};\n\n</code></pre><h2>3. 定时任务-task.js</h2>\n<p>包装定时任务，方便调用。</p>\n<pre class=\"prettyprint language-javascript\"><code>var later = require(&#x27;later&#x27;);\n\n/**\n * 定时任务\n * @param time 参考later的base time\n * @param intervalFn 定时执行的函数\n */\nmodule.exports = function (time, intervalFn) {\n    var sched = {schedules: [time]};\n    \n    // 设定为本地时间\n    later.date.localTime(); \n    later.setInterval(intervalFn, sched);\n};\n</code></pre><h2>4. 整合起来-app.js</h2>\n<pre class=\"prettyprint language-javascript\"><code>var accounts = require(&#x27;./config&#x27;).accounts;\nvar task = require(&#x27;./controller/task&#x27;);\nvar autoCheckIn = require(&#x27;./controller/autoCheckIn&#x27;);\n\n// 定时执行\ntask({h: [18], m: [0]}, function () {\n    accounts.forEach(function (v) {\n        autoCheckIn(v);\n    });\n});\n\nconsole.log(&#x27;======&#x27;, &#x27;自动签到服务运行中..&#x27;, &#x27;======&#x27;);\n\n</code></pre><h2>最后</h2>\n<p>到此简单几步已实现了想要的核心功能，很好玩，充满了想象…</p>\n<blockquote>\n<p>本文重点在于分享思路，略过了大量细节，无源代码，所需的内容均在在本文中 ：）</p>\n</blockquote>\n<ol>\n<li><a href=\"https://github.com/visionmedia/superagent\">superagent</a>，模拟登录，触发页面</li>\n<li><a href=\"https://github.com/andris9/Nodemailer\">nodemailer</a>，发送邮件</li>\n<li><a href=\"https://github.com/bunkat/later\">later</a>，定时执行任务</li>\n<li><a href=\"https://github.com/caolan/async\">*async</a>，排队完成任务（可选，某些任务有先后顺序）</li>\n<li><a href=\"https://github.com/Medium/phantomjs\">*phantomJS</a>，网页截图（可选）</li>\n</ol>\n<hr>\n<blockquote>\n<h5>技术： node.js+很多模块</h5>\n<h5>时间： 2015年02月</h5>\n<h5>博客： <a href=\"http://think2011.github.io\">think2011</a></h5>\n</blockquote>\n</div>","title":"node.js实现模拟登录，自动签到领流量。","last_reply_at":"2015-02-23T01:41:38.080Z","good":false,"top":false,"reply_count":1,"visit_count":137,"create_at":"2015-02-22T05:45:27.721Z","author":{"loginname":"think2011","avatar_url":"https://avatars.githubusercontent.com/u/3961388?v=3&s=120"}},{"id":"54227b6b3bb55c3f0632c101","author_id":"54227b233bb55c3f0632c100","tab":"job","content":"<div class=\"markdown-text\"><p>2014，互联网物流元年。</p>\n<p>云物流希望用互联网的方式和用户体验，创造一款全新的货运调车配货产品，改良货运交易O2O模式，促进物流运输业向互联网化转型。</p>\n<p>云物流核心团队由互联网、IT及物流行业资深人士组成，来自金蝶、网易、Infosys等知名公司。产品已在客户与台塑、三星等项目中对接使用。</p>\n<p>我们提供开放、创新、团结、激情的创业氛围与机遇。</p>\n<p>加入我们，体验物流行业与互联网碰撞中擦出的精彩火花，做出市场真正期待的颠覆式产品和商业模式。</p>\n<p>云物流助手产品主页： <a href=\"http://yun56.co\">http://yun56.co</a> .</p>\n<p>2014年是物流元年，加入我们，一起踏上改变行业的征程吧！</p>\n<p>nodejs开发工程师</p>\n<p>岗位职责：\n1、负责web页面的开发；\n1、负责nodejs后端开发；\n2、负责项目模块的设计、编码、测试及bug处理；\n3、负责配合移动客户端进行编码开发。</p>\n<p>能力要求：\n1、需要你熟练使用JavaScript，1年以上工作经验；\n2、熟悉nodejs，并可以独立开发nodejs module；\n3、熟练使用git进行代码托管；\n4、熟悉或了解CoffeeScript，python，ruby，shell其中一种或几种语言优先；\n5、有服务器运帷经验者优先。</p>\n<p>我们的办公地点在杭州滨江区六合天寓，我们提供有竞争力的薪酬，宽松的工作氛围。当然，作为创业公司，我们同时提供股票期权相关的激励政策。</p>\n<p>欢迎发送简历至：  kurten.chan @ <a href=\"http://qeemo.me\">qeemo.me</a>.   请注明来自 cnodejs 社区.</p>\n</div>","title":"[杭州-滨江]云物流助手 招聘 [nodejs 开发工程师]","last_reply_at":"2015-02-23T01:34:39.050Z","good":false,"top":false,"reply_count":5,"visit_count":776,"create_at":"2014-09-24T08:06:03.889Z","author":{"loginname":"kurten","avatar_url":"https://avatars.githubusercontent.com/u/589831?v=3&s=120"}},{"id":"54bf738f2d19f08315f35596","author_id":"51384199df9e9fcc5864fdc3","tab":"job","content":"<div class=\"markdown-text\"><p>坐标：\n北京三元桥\n薪资：10K–15K ，股票期权  其他：五险一金、餐补、无限零食饮料、弹性工作等</p>\n<p>公司：\n专注互联网招聘的创业公司，去年已经拿到千万投资，目前正在发展壮大中</p>\n<p>岗位职责：\n1、负责nodejs后端开发；\n2、负责项目的设计、编码、测试及bug处理；\n3、负责配合移动客户端进行编码开发。</p>\n<p>能力要求：\n1、需要你熟练使用JavaScript，1年以上工作经验；\n2、熟悉nodejs、熟悉mongodb，有独立开发项目经验；\n3、熟练使用github进行代码托管，有独立学习能力;</p>\n<p>跪求小伙伴入伙，联系邮箱：<a href=\"mailto:bin.he@91talent.com\">bin.he@91talent.com</a></p>\n</div>","title":"北京三元桥，诚招nodejs开发工程师","last_reply_at":"2015-02-23T01:34:15.721Z","good":false,"top":false,"reply_count":4,"visit_count":727,"create_at":"2015-01-21T09:38:23.031Z","author":{"loginname":"guolin","avatar_url":"//gravatar.com/avatar/e5710259581f2bab20451932d394e6f4?size=48"}},{"id":"548ec2104823a0234c9e1654","author_id":"53b42a94c30625952a40d167","tab":"job","content":"<div class=\"markdown-text\"><p>时速云是一家由3位工程师于2014年10月份创立的团队，我们致力于提供高价值的云计算服务，目前时速云\n移动应用开发云服务已正式上线 ，<a href=\"https://www.tenxcloud.com\">https://www.tenxcloud.com</a> 未来我们还将提供诸如数据库等云服务。</p>\n<p>时速云有国内首个MVC一体的移动应用开发云服务。所谓MVC一体，是将应用程序的数据层（Model）、视图层（View）以及控制层（Control）完全在云端完成。时速云由Docker container容器驱动，我们为每一个用户建立私有Runtime和私有数据库，保障平台的安全性。</p>\n<p>公司产品：时速云 <a href=\"https://www.tenxcloud.com\">https://www.tenxcloud.com</a>\n公司名称：北京云思畅想科技有限公司\n公司地址：北京市海淀区西二旗辉煌国际大厦6号楼东</p>\n<p><strong>Node.js工程师</strong>\n<strong>薪资范围</strong>\n8k ~ 15k （另加股权，五险一金等）</p>\n<p><strong>职责描述</strong></p>\n<ul>\n<li>负责网站Web后端程序开发;</li>\n<li>与后端API交互，实现高性能高扩展的数据访问;</li>\n<li>负责网站产品的技术架构设计</li>\n</ul>\n<p><strong>职位要求</strong></p>\n<ul>\n<li>熟悉Node.js 有Node.js 相关开发工作经验, web开发经验;</li>\n<li>熟悉express.js, passport.js, connect.js,socket.io等js框架;</li>\n<li>熟悉HTML, HTML5, CSS3;</li>\n<li>熟悉MongoDB等NoSQL数据库开发;</li>\n<li>熟悉Shell等脚本语言，能熟练使用git;</li>\n<li>有良好的团队合作能力，善于沟通，工作自主驱动;</li>\n<li>熟悉Docker，Cordova者优先</li>\n</ul>\n<p><strong>前端开发工程师</strong>\n<strong>岗位职责</strong></p>\n<ul>\n<li>熟练掌握专业的 HTML/CSS/JS 方面的知识</li>\n<li>至少熟悉掌握一种 MV* 开发框架，并有 Web App 开发经验</li>\n<li>注重利用合理的设计模式和模块化的组织方式对代码进行架构</li>\n</ul>\n<p><strong>任职要求</strong></p>\n<ul>\n<li>喜欢参与产品设计，对易用性及视觉感觉有较高要求</li>\n<li>有自己的，或参与贡献的开源项目</li>\n<li>有移动 App 开发经验</li>\n</ul>\n</div>","title":"【北京】TENXCLOUD创业团队跪求Node.js工程师","last_reply_at":"2015-02-23T01:34:02.376Z","good":false,"top":false,"reply_count":4,"visit_count":1338,"create_at":"2014-12-15T11:12:16.134Z","author":{"loginname":"Jerry-HQG","avatar_url":"https://avatars.githubusercontent.com/u/5961349?v=3&s=120"}},{"id":"54c058fe08db81d71f31625e","author_id":"54c0583d08db81d71f31625d","tab":"job","content":"<div class=\"markdown-text\"><p>公司地址：北京市朝阳区望京SOHO\n公司名称：北京众赢数字科技有限公司</p>\n<p>基本要求：\n1、熟悉 Javascript 和 NodeJS；\n2、了解 MySQL、MongoDB；\n3、了解模块化编程和敏捷开发；\n4、具备独立解决问题的能力；\n5、善于沟通和协作。</p>\n<p>联系邮箱：\n<a href=\"mailto:hr@crowd-win.com\">hr@crowd-win.com</a></p>\n<p>详情见：<a href=\"http://v2ex.com/t/164370\">http://v2ex.com/t/164370</a></p>\n</div>","title":"创业公司，招聘 nodejs 工程师","last_reply_at":"2015-02-23T00:53:00.796Z","good":false,"top":false,"reply_count":2,"visit_count":910,"create_at":"2015-01-22T01:57:18.870Z","author":{"loginname":"crowdwin","avatar_url":"https://avatars.githubusercontent.com/u/10645572?v=3&s=120"}},{"id":"54e9e14e2b6f3ecb2c36661e","author_id":"54bdcd3d514ea9146862ac27","tab":"ask","content":"<div class=\"markdown-text\"><p>据说原来有个app.error\n现在被deprecated了\n整个人都迷了</p>\n</div>","title":"express中路由内抛出的错误该怎样处理","last_reply_at":"2015-02-22T17:49:13.384Z","good":false,"top":false,"reply_count":4,"visit_count":71,"create_at":"2015-02-22T14:01:50.162Z","author":{"loginname":"MephistoMMM","avatar_url":"https://avatars.githubusercontent.com/u/9097390?v=3&s=120"}},{"id":"54d47ec32ee8226d75a48e27","author_id":"54d47dad2ee8226d75a48e25","tab":"job","content":"<div class=\"markdown-text\"><p>招　聘  网上QQ面试: 1347653\nWeb前端工程师　　　<br>\n北京龙旗广场  经验1-3年  学历不限  全职　 待遇面谈     职位诱惑：做到A轮股东名单里一定有你\n职位描述：   配合产品、交互及技术，开发优秀用户体验的互联网旅游产品，传递产品价值；\n配合技术负责人进行前端技术规划及架构；\n根据产品设计，开发PC端及移动端HTML/HTML5功能页面；\n研究及开发前端Web工程工具，加速产品开发，优化代码部署；\n配合服务器端开发人员进行应用及系统整合；\n负责相关技术文档编写\n岗位要求：   两年以上互联网公司Web前端开发经验；\nHTML、CSS以及Javascript熟练掌握且技能均衡（无弱项）；\n对前端各种技术和工具有积累、钻研和自己的思考；\n熟悉主流的Javascript 及CSS库和框架，例如jQuery、Zaptojs及Bootstrap等；\n了解前端MV**技术，有Backbone，Angular经验者优先；\n了解响应式设计，有移动Web App或Hybrid App开发经验优先；</p>\n<p>网上QQ面试: 1347653</p>\n<p>Node.js 研发工程师　　　\n北京龙旗广场　　 经验1-3年　　 学历不限　 全职　　待遇面谈　　诱惑：做到互联网创业公司的股东\n岗位职责：   参与互联网旅游产品的功能设计与开发，打造高性能互联网产品；\n配合产品经理进行产品实现，捕捉用户需求，创造极致用户体验；\n配合运营经理通过数据采集、功能改良和创新，实现运营目标；\n关注互联网产品的技术发展与变化，不断学习、融入与创新；\n职位要求：   计算机相关专业本科以上学历；\n两年以上互联网应用系统分析、设计、开发经验，有旅游或电商产品开发经验者优先；\n有互联网Web系统开发、部署和调优方面的实战经验，有微信公共号开发经验者优先；\n熟练使用Nodejs进行服务端开发，有Java或Python经验者优先；\n熟悉Javascript/HTML5/CSS/jQuery等前端开发技术，有Backbonejs等单页应用框架经验者优先；\n熟悉MySQL和Redis，有Nginx使用经验；\n会沟通，有责任心，喜欢挑战和创新；</p>\n<p>北京中景合天科技有限公司：\n中景合天是一家专注于旅游C2C的移动互联网创业公司，目标市场是为您提供个性化的旅游产品为己任，帮您完成自助游、互助游，组团游、品团游多种旅游形势，以您想要得方式提供给您最惬意的出行选择。目前融资阶段是天使轮。公司的创始人来自知名铁路服务企业，核心团队来自成熟互联网创业团队。公司奉行创新和拼搏的价值观，实行扁平化团队管理，团队风格为谦逊与尊重！</p>\n<p>公司地址：北京市昌平区回龙观镇黄平路19号院4号楼龙旗广场E座1308室\n电子邮件: <a href=\"mailto:liujianguo@easyway.net.cn\">liujianguo@easyway.net.cn</a>　　电话：82694735,   欢迎加 QQ，  网上QQ面试: 1347653</p>\n</div>","title":"移动互联网创业公司（回龙观龙旗广场）招聘: Web前端工程师+Node.js 研发工程师","last_reply_at":"2015-02-22T15:36:07.616Z","good":false,"top":false,"reply_count":2,"visit_count":376,"create_at":"2015-02-06T08:43:47.683Z","author":{"loginname":"Gimboliu","avatar_url":"https://avatars.githubusercontent.com/u/10879387?v=3&s=120"}},{"id":"54cb4faaef1b48510c27dfab","author_id":"4f4362f6e611df827a000df8","tab":"job","content":"<div class=\"markdown-text\"><p>公司简介</p>\n<p>十多年前，合得国际率先将商战模拟开发的鼻祖——欧洲工商管理学院（INSEAD）的商战模拟引入中国，并且在2009年，合得国际并购了为欧洲工商管理学院（INSEAD）开发电脑商战模拟的核心技术团队，不断推出全球唯一针对新兴市场的商战模拟游戏。如“营销在线”MarkSimos，“耐消风云”CasaSimos，“零售风暴”eTales等。合得国际同时也在研发系列针对行业的其他相关商战模拟游戏， 例如B2B行业、银行业、烟草业、医药、汽车等行业特设模拟课程</p>\n<p>产品介绍:\nMarksimos / Etales 在线模式零售电商实战模拟游戏\nChangeMan / LeaderStyle 变革管理/ 领导力风格培训</p>\n<p>官网 <a href=\"http://www.hcdlearning.com/cn/\">http://www.hcdlearning.com/cn/</a></p>\n<p>办公室环境图片\n<a href=\"http://ww2.sinaimg.cn/mw690/87992fe6gw1ee3ra1xpz9j20ih0ppthu.jpg\">http://ww2.sinaimg.cn/mw690/87992fe6gw1ee3ra1xpz9j20ih0ppthu.jpg</a></p>\n<p>入职会提供MacBook Pro一台\n联系邮箱 <a href=\"mailto:jinwang@hcdlearning.com\">jinwang@hcdlearning.com</a> <a href=\"http://weibo.com/jinwyp\">weibo.com/jinwyp</a></p>\n<p>薪资15K-25K</p>\n<p>网站前端开发工程师</p>\n<p>合得教育正在寻找一位精于搭建用户界面的前端网站开发工程式。</p>\n<p>我们在技术平台中运用了MEAN Stack新技术，包括AngularJS, NodeJS, MongoDB, Socket.io 等等。 你不需要了解以上所有，我们需要的是天资卓越的工程师，能快速掌握所需工具，并和我们一同充满热情地编写代码，帮助客户收获变革性的体验式学习经验。 我们热烈欢迎愿意在将来成为全栈程序员的员工。</p>\n<p>我们将提供有竞争力的薪资待遇和福利，并配备设施齐全、现代舒适的工作环境。 如果你需要，我们还专程为程序员们提供MacBook以及24英寸的外接显示器，你也可以携带自己的电脑来办公场所。 为程序员，如果你的自我管理能力得到团队的认可，也可以在家中办公。</p>\n<p>合得教育拥有跨文化团队合作分为，我们的成员来自韩国、印度、波兰以及中国。 在这里，你将有机会和来自不同国家及文化的精英一同工作。</p>\n<p>有机会接触上海最完整的angularjs项目。</p>\n<p>核心工作职能:</p>\n<ul>\n<li>负责商战模拟类游戏的web版本开发工作,包括Marksimos, Etales产品。</li>\n<li>开发设计移动端的Web APP 包括专门针对移动端新设计的产品。</li>\n<li>完成可测试的编码要求。</li>\n<li>持续和客户及产品团队沟通，汇报开发进度</li>\n<li>将UI/UX团队提供的设计和风格指南转化为功能性用户界面，确保主流浏览器下的兼容性和性能</li>\n<li>通过提出新建议，改进用户界面、软件构架或新兴技术不断促成进步</li>\n</ul>\n<p>技能要求：</p>\n<ul>\n<li>熟悉Html语言, css样式, 能按照设计稿完成Html编码工作</li>\n<li>熟悉javascript语言, jQuery框架</li>\n<li>熟悉AngularJS 框架, 熟悉ng-repeat, ng-class, ng-if ng-show 常用指令, 或其他任何MVVM框架 例如Vuejs</li>\n<li>熟悉Git和linux, Mac 开发环境</li>\n</ul>\n<p>加分技能：</p>\n<ul>\n<li>使用Sass,和Compass 进行Html, css编码工作</li>\n<li>熟练使用angularjs框架, 例如 理解scope作用域, 自定义指令 directive, filter</li>\n<li>使用过bower gulp,或grunt工具</li>\n<li>熟练使用单元测试工具jasmine</li>\n<li>拥有Socket.io/Nodejs 实时开发经验</li>\n</ul>\n<p>NodeJS 后端开发工程师</p>\n<p>核心工作职能:</p>\n<ul>\n<li>负责商战模拟类游戏的web版本后端开发工作,包括Marksimos, Etales产品。</li>\n<li>开发设计移动端的Web APP 的后端开发工作。</li>\n<li>完成可测试的编码要求。</li>\n<li>持续和客户及产品团队沟通，汇报开发进度</li>\n<li>使用一些新技术例如websocket, webRTC进行实时传输</li>\n</ul>\n<p>技能要求：</p>\n<ul>\n<li>熟悉nodejs 和 express 框架进行后端开发</li>\n<li>熟悉javascript语言</li>\n<li>熟悉mongodb 和 mongoose , 以及优化collection结构定义,方便查询和分片</li>\n<li>熟悉Git和linux, Mac 开发环境</li>\n</ul>\n<p>加分技能：</p>\n<ul>\n<li>精通nodejs异步编程 和nodejs错误处理 例如 promise, q 等</li>\n<li>熟练使用前端angularjs框架</li>\n<li>使用过bower gulp,或grunt工具</li>\n<li>熟练nodejs常用库 包括 request, validation, socket.io</li>\n<li>熟练使用单元测试工具jasmine/mocha</li>\n<li>熟悉linux系统操作, ubuntu server, 设置用户权限, 搭建nodejs/nginx web 服务器</li>\n<li>熟悉Delphi</li>\n</ul>\n<p>iOS Developer Requirement:</p>\n<ol>\n<li>熟练掌握C/C++,Objective-C，熟悉 Mac OS X，Xcode，和iPhone SDK 开发环境，精通Cocoa/UIKit Framework，熟悉CoreAnimation，熟悉iPhone/iPad各个版本之间的差异，并且能够提供良好的解决方案；</li>\n<li>精通IOS下的高性能编程及性能调优；</li>\n<li>熟悉SQLite数据库编程；</li>\n<li>熟练编写Xcode下的单元测试，了解Xcode下的自动化测试；</li>\n<li>熟练使用Xcode的Instrument来诊断和调试问题;</li>\n<li>对IOS的UI控件有优化经验者优先，具有丰富的iOS性能优化经验者优先，在APP store上有上线应用者优先。\n7 熟悉Unit3D 框架或Cocos2d 框架或其他游戏框架优先</li>\n</ol>\n<ol>\n<li>Familiar with C/C++,Objective-C, Familiar with Xcode,iPhone SDK , Skilled with Cocoa/UIKit Framework，CoreAnimation</li>\n<li>Familiar with iOS performance improvement</li>\n<li>Familiar with SQLite</li>\n<li>Familiar with Xcode and Unit Test</li>\n<li>Familiar with Xcode Instrument Tool\n6 Better with UI Customize.\n7 Better with Game Framework Unit3D or Cocos2d or others.</li>\n</ol>\n<p>Android Developer Requirement:</p>\n<p>1 熟悉Android开发技术，如UI，网络编程，多线程，性能优化等；\n2 精通java语言，熟悉android SDK，深刻理解Android的运行机制；\n3 熟悉Unit3D 框架或Cocos2d 框架或其他游戏框架优先</p>\n<p>1 Familiar with Android SDK, UI, net protocol programming, multi thread programming\n2 Familiar with JAVA, Object-oriented programming. Skilled with Android Runtime.\n3 Better with Game Framework Unit3D or Cocos2d or others.</p>\n</div>","title":"上海 在线教育 招聘前端和 nodejs 后端工程师","last_reply_at":"2015-02-22T10:31:13.496Z","good":false,"top":false,"reply_count":5,"visit_count":469,"create_at":"2015-01-30T09:32:26.359Z","author":{"loginname":"jinwyp","avatar_url":"//gravatar.com/avatar/bacddcc29be28c411b92534c6c254d34?size=48"}},{"id":"54c58bc40d075f173d433f23","author_id":"5062b5ea01d0b801483ae4ff","tab":"job","content":"<div class=\"markdown-text\"><p>想早日买房的童鞋看过来！</p>\n<h3>诚意的薪资</h3>\n<p>初创团队，薪资的区间在 12k - 20k 之间，A 轮后继续提升，全力保障程序员的幸福感和贴身利益。</p>\n<h3>度假办公</h3>\n<p>目前 base 杭州，入职后可选择一个月到美国硅谷度假式办公，费用公司全包，无论是游名校，还是逛湾区，有专职司机加翻译接送</p>\n<p>不久将来，业务推广到其他国家时候，研发团队拉到硅谷全职办公（H1B 签证），但不强制去硅谷，可以继续留守杭州 remote</p>\n<p>我最近在硅谷办公，想了解华人程序员的生活请前往 <a href=\"https://cnodejs.org/topic/5487fe00fa1171ca10c11c30#548802a4fa1171ca10c11c38\">硅谷所见所闻</a></p>\n<h3>弹性办公</h3>\n<p>创业公司大家知道工作不轻松，但是也要想尽办法轻松，每周可选择一天在家办公，同时遇到恶劣天气（台风，下雪，大雨，PM 过高、重大庆祝活动导致堵车）均可呆在家里，怎么爽怎么来。</p>\n<h3>福利篇 - 巨量期权</h3>\n<p>现在是 A 轮前夕，加入的黄金时期，30 岁以前的年轻程序员尤其值得关注，大翻身在此一举！</p>\n<h3>妹子多多</h3>\n<p>唯一一个程序员实习妹子（其他妹子到帖子底部），求调教：</p>\n<p><img src=\"//dn-cnode.qbox.me/FoZidLb7wHPxNGWMtVN5_UMS8IA0\" alt=\"6.pic.jpg\"></p>\n<p>但是，我不鼓励你上来就投简历：</p>\n<h3>如果一定要投，请投递到： <a href=\"mailto:hr@moveha.com\">hr@moveha.com</a></h3>\n<h3>招聘 JS 开发工程师</h3>\n<h4>1. 可以偏前端方向：</h4>\n<ul>\n<li>拎起来 jQuery RequireJS 轻松驾驭</li>\n<li>不愿意兼容 IE8 及以下</li>\n<li>熟悉 HTML 5（不是 H5）标签的语义</li>\n<li>CSS3 各种主流属性玩的转</li>\n<li>有丰富的重构经验（如何用 HTML 标签合理的构建一个 html 页面，这个我不擅长，希望你可以来教我）</li>\n<li>用 Mac/Linux 系统电脑</li>\n</ul>\n<h4>2. 可以偏后端方向</h4>\n<ul>\n<li>至少 2 年 Node.js 工作经验（不是简单的使用经验）</li>\n<li>熟悉主流前后端技术，有复杂大型后端系统的开发经验</li>\n</ul>\n<h3>工作地点</h3>\n<p>杭州滨江海创园区\n在六和路附近，我住在余杭，距离这里也很远，选它是因为我们拿下杭州 5050 海归创业的 300 万奖金，政府同时扶持了这个办公场地，不用可惜了</p>\n<h3>往下进行</h3>\n<p>如果你看到这里，也许你的技术是完全超过预期的，我们聊下这个项目，看走不走心。</p>\n<h4>Moveha 是干嘛的</h4>\n<p>Moveha 是一个帮助国际学生远程租房的平台，帮助国际学生在来美国之前把房子预定下来，也面向所有需要校外租房的美国本土学生群体。</p>\n<p>此外，Moveha 还综合各方面资源，提供了机票预定（StudentUniverse）、接机（LYFT）、家具租赁（cort）、手机卡办理（T-Mobile）、一对一定制服务（Premium Service）等多项附加服务，来保障留学生来美后能够省去繁文缛节，轻松入住新家（留学过的人都知道租房这个过程有多痛）。</p>\n<h3>项目现状</h3>\n<p>目前，Moveha 已经获得 240多万元天使投资，和上面提到的 300 万人民币海创大赛基金，以及杭州市政府提供的免费办公场地。公司总部位于美国加州硅谷腹地，房源目前覆盖到加州、新泽西、宾夕法尼亚等州，和芝加哥、西雅图等大型城市，正在向全美留学生集中的学校扩张。同时已经和美国 100 多所大学、几十家房屋中介机构、以及国内几十家留学中介、英语培训学校建立合作关系。</p>\n<h3>团队现状</h3>\n<p>正式员工我们有 7 个左右，以及 10 个左右的实习生（还没毕业的女学生）</p>\n<ul>\n<li>那么关心妹子的童鞋会问，妹纸多么，好看么，自行往下看照片。</li>\n<li>关心技术的童鞋会问，你们几个开发，怎么分工？</li>\n</ul>\n<p>准确的说，全职的开发只有我一个，前端的 HTML 要写，后端的 Mongodb 要做，所以，我是自己一个人的 CTO。</p>\n<h4>为什么不多招些人啊？</h4>\n<p>首先，在没有正式 A 轮以前，投资人的每一分钱我们都花很慎重\n其次，跟业务有关，在初创的前期，很多业务需要不断的迭代和验证（上和下），这种不确定性导致越早进来的人所承担的失败风险越大，我们不希望过早把这种风险转移给工程师，这也是我们为何保持慢增长的原因，无论是用户还是成交。</p>\n<h4>我（候选人）能得到什么呢？</h4>\n<ul>\n<li>一份码农的工作，在哪里不是写代码呢</li>\n<li>一份年轻的工作，服务的人群是 16 ~ 26 岁的群体，做年轻的产品，心态也更年轻</li>\n<li>有诚意的创业薪资，外加优厚的期权，12 ~ 20k 多么，不多，甚至你进来都是降薪进来，我不会鼓励你一定放弃眼前稳定的工作和相对丰厚的薪酬，但我会鼓励你遇到一个喜欢的创业团队和他们项目的时候，可以勇敢的想一想，倘若就这点工资，我敢不敢加入，即便是失败了，结果我能不能承受的起。</li>\n<li>雾霾严重，心情抑郁的时候，随时申请去美国硅谷出差式度假</li>\n</ul>\n<p>不过，我会打击你的士气，如下是我认为公司不完善/不确定/不好的地方：</p>\n<ul>\n<li>现在只有一台主服务器（脏任务服务器不算），肯定撑不住 6 月份后（旺季）并发 20000 的压力，一年后并发 80000（预测）的压力</li>\n<li>初创团队，人少，累，暂时工资不惊不喜</li>\n<li>总部在硅谷，虽然每年可能要花 1 个月出差去硅谷，说是度假，其实是熟悉下美国的朋友和换个环境写代码</li>\n<li>办公室在滨江，上班不方便</li>\n<li>因为和总部有时差，可能需要熬夜开会或者早起开会</li>\n</ul>\n<p>我还可以想更多缺点出来，比如没有大公司学习氛围浓，各种学习资源不足啊等等。至于其他好的方面，我不会告诉你，需要你来悟，或者到了团队后慢慢体会。</p>\n<p>所以，我不鼓励你看完这个帖就投简历，我希望你先想两天，如果有女朋友的话，先商量一下，因为这个决定很可能改变的是你的人生轨迹，而不单单是在国内的 BAT 公司跳来跳去，城市搬来搬去。另外，我希望你对技术是有很大的热情和兴趣，对这个项目有足够的好感（认同感是随着投入慢慢起来的），否则做起来你万一不开心呢。</p>\n<p>哦，BTW 一句，我现在正在带一个 高校的教授（Are you kidding?），他那种技术热情足以感染任何一个身边的人，全靠自学，希望做一个全栈工程师。</p>\n<h3>回到团队</h3>\n<p>来看看团队的小伙伴吧：</p>\n<p><img src=\"https://cloud.githubusercontent.com/assets/670360/5894045/2ca255ca-a4ae-11e4-9af5-1917bebfe0ec.png\" alt=\"image\"></p>\n<h2>其他相关图文，请前往 <a href=\"https://cnodejs.org/topic/5487fe00fa1171ca10c11c30#548802a4fa1171ca10c11c38\">硅谷所见所闻</a></h2>\n</div>","title":"20k【巨量期权】【度假办公】【弹性工作】【美国硅谷】 【早日买房】","last_reply_at":"2015-02-22T09:49:29.750Z","good":false,"top":false,"reply_count":92,"visit_count":7952,"create_at":"2015-01-26T00:35:16.249Z","author":{"loginname":"huanglong","avatar_url":"https://avatars.githubusercontent.com/u/670360?v=3&s=120"}},{"id":"54196f744566f991643a182d","author_id":"515005e9604b3d512109bb17","tab":"job","content":"<div class=\"markdown-text\"><p>『那一天，人类终于回想起了曾一度被没有前端的日子所支配的恐怖。』</p>\n<p>——《进击的花瓣网》</p>\n<p>花瓣前端团队需要你。</p>\n<p>只需要你：</p>\n<ol>\n<li>具备较强的逻辑思维能力、自学能力、英语阅读能力一级沟通能力。</li>\n<li>熟悉语义化 HTML，了解 SEO；熟悉含有语义的 HTML 标签含有的原生样式。</li>\n<li>精通常用 CSS 属性，能快速给出常见前端特效的 CSS 解决方案给小伙伴；熟悉浏览器渲染差异以及重要的 CSS 兼容问题。</li>\n<li>精通原生 Javascript，精通 jQuery 或者 MooTools。</li>\n<li>有一定的 Web 服务器端开发经验，熟悉 PHP / Python / Ruby / Node.js 中的一种以上。</li>\n<li>善于沟通和逻辑表达，良好的团队合作精神和积极主动的沟通意识。</li>\n</ol>\n<p>下面的小伙伴优先考虑哈：</p>\n<ol>\n<li>Linux / Mac OS 作为开发系统</li>\n<li>VIMer</li>\n<li>陈老师学徒（摄影爱好者</li>\n<li>参与过开源项目或者发表过原创技术博文</li>\n<li>具备一(te)定(shu)的(de)美(pa)术(pa)功(ji)底(qiao)</li>\n</ol>\n<p>加入自由之翼军团的小伙伴们将：</p>\n<ol>\n<li>能在刚入住木有多久的新办公环境工作</li>\n<li>萌妹纸软妹纸女汉纸多多哦</li>\n<li>有爱的小伙伴们还搭了 MineCraft 服务器哦</li>\n<li>免费的零食饮料无限畅饮哦</li>\n<li>全职 7 ~ 10 k 哦</li>\n<li>得到意想不到的技术成长</li>\n</ol>\n<p>在花瓣的小伙伴们都非常的 Geek，技术也走在互联网前沿，是国内最早使用 Node.js 的公司之一。</p>\n<p>工作地点：杭州市西湖区西斗门路 9 号福地创业园二期 4 号楼</p>\n<p>花瓣： <a href=\"http://huaban.com/\">http://huaban.com/</a> （别说不知道哦，会桑心的</p>\n<p>有兴趣的可以发简历过来哈：i(at)2333.moe</p>\n</div>","title":"[花瓣网] 萌妹纸多多，招前端汉纸软妹纸萌妹纸女汉纸，全职、实习都欢迎","last_reply_at":"2015-02-22T08:09:33.779Z","good":false,"top":false,"reply_count":17,"visit_count":1759,"create_at":"2014-09-17T11:24:36.105Z","author":{"loginname":"xadillax","avatar_url":"https://avatars.githubusercontent.com/u/2842176?v=3&s=120"}},{"id":"54e75c88ba8375854f8b4c5a","author_id":"5485d4911bd3c71762df05b0","tab":"share","content":"<div class=\"markdown-text\"><p><a href=\"https://github.com/bitinn/svgshelf\">https://github.com/bitinn/svgshelf</a></p>\n<p>2015年，别再依赖font icon了，用svg icon吧。如果你用过svgstore，这个功能仿照他们设计，只是没有gulp或grunt的依赖，并基于iojs开发（兼容node.js，不过要–harmony）。</p>\n<p>为什么svg icon见此两文，不是什么新概念了，用法也愈来越多。</p>\n<ul>\n<li><a href=\"http://css-tricks.com/icon-fonts-vs-svg/\">http://css-tricks.com/icon-fonts-vs-svg/</a></li>\n<li><a href=\"http://css-tricks.com/svg-fragment-identifiers-work/\">http://css-tricks.com/svg-fragment-identifiers-work/</a></li>\n</ul>\n</div>","title":"svgshelf: 将多个svg文件合并为同一个svg，以便引用的工具。","last_reply_at":"2015-02-22T04:15:20.600Z","good":false,"top":false,"reply_count":5,"visit_count":119,"create_at":"2015-02-20T16:10:48.374Z","author":{"loginname":"bitinn","avatar_url":"https://avatars.githubusercontent.com/u/1484279?v=3&s=120"}},{"id":"54e846168ff821b53f851860","author_id":"53aecc6fa087f4562011cc62","tab":"ask","content":"<div class=\"markdown-text\"><p>happycasts.net 里有一集是实现一个多人协同编辑的  挺有意思的</p>\n</div>","title":"想实现一个多人同时协同画画的软件，有木有啥思路？","last_reply_at":"2015-02-22T00:01:39.146Z","good":false,"top":false,"reply_count":2,"visit_count":128,"create_at":"2015-02-21T08:47:18.786Z","author":{"loginname":"zzz6519003","avatar_url":"https://avatars.githubusercontent.com/u/1625608?v=2&s=120"}},{"id":"54dfd4181712f19837bd51a6","author_id":"54dfce2f1712f19837bd51a5","tab":"ask","content":"<div class=\"markdown-text\"><p>读教程时看到在服务器端响应post请求的时候，文章里用触发data和end事件去处理数据流，用req.addListener实现对事件的侦听，代码如下：\n<img src=\"//dn-cnode.qbox.me/Fmpry3mrmddfzrxxJpvflZKo5_1a\" alt=\"1.jpg\">\n但是读Node API的时候看到了官网上用req.on()实现了同样的功能，代码如下：\n<img src=\"//dn-cnode.qbox.me/FhdA_dILDjc0YA9CN8Th4_W67bwp\" alt=\"2.jpg\"></p>\n<p>问题：</p>\n<ol>\n<li>想请问一下各位，on和addListner有什么区别？在API里看到了这段话：\n<img src=\"//dn-cnode.qbox.me/FqnZzTUf6I2RowHn7IQizwg3F0Vg\" alt=\"3.jpg\">\n所以我自己理解这两个方法功能是一样的，但是为什么同样功能的方法要定义两种形式？</li>\n</ol>\n<p>2.如何在API里查看req和res这两个对象的成员属性和方法？我没找到在哪里…（请勿吐槽，新手见谅）</p>\n</div>","title":"求解一个node入门问题,on()和addListener()的区别","last_reply_at":"2015-02-21T15:12:05.633Z","good":false,"top":false,"reply_count":7,"visit_count":334,"create_at":"2015-02-14T23:02:48.400Z","author":{"loginname":"HongzhiZhao","avatar_url":"https://avatars.githubusercontent.com/u/10377209?v=3&s=120"}},{"id":"54e6307e629934692ea99f90","author_id":"545b74143e1f39344c5b3bee","tab":"share","content":"<div class=\"markdown-text\"><p>set number\ncolo desert\nsyntax on\nset autoindent</p>\n<p>刚开始弄,比较简单,呵呵</p>\n</div>","title":"大家贴下自己的.vimrc配置吧:)","last_reply_at":"2015-02-21T15:09:43.503Z","good":false,"top":false,"reply_count":7,"visit_count":178,"create_at":"2015-02-19T18:50:38.211Z","author":{"loginname":"chapgaga","avatar_url":"https://avatars.githubusercontent.com/u/9590859?v=3&s=120"}},{"id":"54e3de68d84b17ec08a21873","author_id":"545b74143e1f39344c5b3bee","tab":"ask","content":"<div class=\"markdown-text\"><p>否则每次打开页面,都要编译一次coffee片段,性能会比较差吧:(</p>\n</div>","title":"部署时,如何将html页面中的coffee片段编译成JS呢?","last_reply_at":"2015-02-21T06:33:28.630Z","good":false,"top":false,"reply_count":5,"visit_count":200,"create_at":"2015-02-18T00:35:52.871Z","author":{"loginname":"chapgaga","avatar_url":"https://avatars.githubusercontent.com/u/9590859?v=3&s=120"}},{"id":"54e0616a1712f19837bd51ee","author_id":"5371bff4a2b434933a022111","tab":"share","content":"<div class=\"markdown-text\"><p><strong>编译环境</strong></p>\n<blockquote>\n<p>CnetOS 7\nNDKr10d\nPython 2.7.9</p>\n</blockquote>\n<p><strong>存在问题</strong></p>\n<blockquote>\n<p>Android 5.0 PIE安全机制原因，编译的时候不知道怎么加入flag，导致5.0及以上android设备会出现  <code>error: only position independent executables (pie) are supported.</code></p>\n</blockquote>\n<p><strong>二进制下载地址（ARM）</strong></p>\n<blockquote>\n<p><a href=\"http://pan.baidu.com/s/1dDGRJtZ\" title=\"node\">百度云盘</a></p>\n</blockquote>\n</div>","title":"node@0.12.0在android运行，支持express","last_reply_at":"2015-02-21T06:19:31.012Z","good":false,"top":false,"reply_count":3,"visit_count":403,"create_at":"2015-02-15T09:05:46.184Z","author":{"loginname":"chuchangming","avatar_url":"https://avatars.githubusercontent.com/u/3062671?v=3&s=120"}},{"id":"54e043271712f19837bd51db","author_id":"53528d421969a7b22aad93f6","tab":"share","content":"<div class=\"markdown-text\"><p>##项目地址\ngithub: <a href=\"https://github.com/wszgxa/tra\">https://github.com/wszgxa/tra</a></p>\n<h2>做这个的目的</h2>\n<p>首先，说说为什么做这么个东东。请看图：</p>\n<p><img src=\"//dn-cnode.qbox.me/FnZwC2qowSw_4XkMKcubk0U7mm48\" alt=\"2015-02-15 14:22:55 的屏幕截图.png\"></p>\n<p>这事我平常看英文资料时候的状态，没办法英语没学好，得开个浏览器来个百度翻译。屏幕被占那么多，看着就不爽啊。** 昨天下午的时候实在忍不了。 **然后就想能不能做个sheel的工具能不能直接在sheel上翻译，记得(七天学会nodejs)[<a href=\"https://github.com/nqdeng/7-days-nodejs]\">https://github.com/nqdeng/7-days-nodejs]</a>上有讲，重新看了看，然后又去看了看百度翻译的api，可行。然后忙活一晚上（新手，效率是有些低。。。）搞好了,请看图：</p>\n<p><img src=\"//dn-cnode.qbox.me/FopgCKHtKSIEOEu8FjNTYo8LhKXM\" alt=\"2015-02-15 14:23:12 的屏幕截图.png\"></p>\n<p>终端还是半透明，顿时神清气爽。</p>\n<p>然后今天早上忙活了一早上。。。又把它在npm上发布了。</p>\n<h2>使用</h2>\n<p>首先安装，只能<strong>全局安装</strong>。由于需要系统命令，我拿人头保证。。。没有毒。\n<code>sudo npm install -g tra</code>\n使用就很简单了<code>tra +单词</code>就行了\n然后<code>tra -h</code>一个简单的帮助文档<code>tra -v</code>查看版本。</p>\n<p>最后感谢回答我在论坛提问的小伙伴=。=</p>\n</div>","title":"新手自己制作了一个终端的翻译工具，求拍砖。","last_reply_at":"2015-02-20T20:35:26.260Z","good":false,"top":false,"reply_count":2,"visit_count":297,"create_at":"2015-02-15T06:56:39.308Z","author":{"loginname":"wszgxa","avatar_url":"https://avatars.githubusercontent.com/u/6060475?v=3&s=120"}},{"id":"54a753154d2e86d10775b52a","author_id":"5437ce8aa220049637e41920","tab":"share","content":"<div class=\"markdown-text\"><h3>概述</h3>\n<p>javaScript – 目录最火热的语言，到处发着光芒, html5, hybrid apps, node.js, full-stack 等等。javaScript 从一个仅仅在浏览器上面的一个玩具语言，一转眼演变成无所不能神一般的存在。但是，由于天生存在着一点戏剧性（javaScript 据传说是在飞机上几天时间设计出来的），模块系统作为一门语言最基本的属性却是javaScript所缺的。\n让我们回到过去，通过 <code>&lt;script&gt;</code> 标签来编写管理 js 脚本的年代也历历在目，翻看现在的许多项目，还是能找到这样子的痕迹，但是随着项目规模的不断增长，js文件越来越多，需求的不断变更，让维护的程序员们越来越力不从心，怎么破？</p>\n<h3>CommonJS</h3>\n<p>2009 ~ 2010 年间，<a href=\"http://wiki.commonjs.org/wiki/CommonJS\">CommonJS</a> 社区大牛云集，稍微了解点历史的同学都清楚，在同时间出现了 <a href>nodejs</a>，一下子让 javaScript 摇身一变，有了新的用武之地，同时在nodejs推动下的 CommonJS 模块系统也是逐渐深入人心。\n1：通过 require 就可以引入一个 module，一个module通过 exports 来导出对外暴露的属性接口，在一个module里面没有通过 exports 暴露出来的变量都是相对于module私有的<br>\n2：module 的查找也有一定的策略，通过统一的 <code>package.json</code> 来进行 module 的依赖关系配置，require一个module只需要require package.json里面定义的name即可</p>\n<p>同时，nodejs也定义了一些系统内置的module方便进行开发，比如简单的http server</p>\n<pre class=\"prettyprint language-js\"><code>var http = require(&#x27;http&#x27;);\nhttp.createServer(function (req, res) {\n  res.writeHead(200, {&#x27;Content-Type&#x27;: &#x27;text/plain&#x27;});\n  res.end(&#x27;Hello World\\n&#x27;);\n}).listen(1337, &#x27;127.0.0.1&#x27;);\nconsole.log(&#x27;Server running at http://127.0.0.1:1337/&#x27;);\n</code></pre><p>CommonJS 在nodejs带领下，风声水起，声明大噪，CommonJS 社区大牛们也就逐渐思考能否把在nodejs的这一套推向浏览器？<br>\n理想很丰满，但是现实却是不尽如人意的<br>\n一个最大的问题就是在浏览器加载脚本天生不支持同步的加载，无法通过文件I/O同步的require加载一个js脚本<br>\nSo what ? CommonJS 中逐渐分裂出了 <a href=\"http://wiki.commonjs.org/wiki/Modules/AsynchronousDefinition\">AMD</a>，这个在浏览器环境有很好支持的module规范，其中最有代表性的实现则是 <a href=\"http://requirejs.org/\">requirejs</a></p>\n<h3>AMD</h3>\n<p>正如 AMD 介绍的那样：\nThe Asynchronous Module Definition (AMD) API specifies a mechanism for defining modules such that the module and its dependencies can be asynchfanronously loaded. This is particularly well suited for the browser environment where synchronous loading of modules incurs performance, usability, debugging, and cross-domain access problems.</p>\n<p>翻译过来就是说：异步模块规范 API 定义了一种模块机制，这种机制下，模块和它的依赖可以异步的加载。这个非常适合于浏览器环境，因为同步的加载模块会对性能，可用性，debug调试，跨域访问产生问题。</p>\n<p>确实，在浏览器环境下，AMD有着自己独特的优势：<br>\n由于源码和浏览器加载的一致，所见即所得，代码编写和debug非常方便。尤其是在多页面的web项目下，不同页面的脚本js都是根据依赖关系异步按需加载的，不用手动处理每个页面加载js脚本的情况。</p>\n<p>但是，AMD 有一个不得不承认的作为一个module system的不足之处<br>\n请问？在 AMD(requireJS)里面怎么使用一个第三方库的？</p>\n<p>一般都会经历这么几个步骤：</p>\n<ul>\n<li>使用的第三方库不想成为 global 的，只有引用的地方才可见</li>\n<li>需要的库支不支持 AMD ？</li>\n<li>不支持 AMD，我需要 fork 提个 patch 吗？</li>\n<li>支持AMD，我的项目根路径在哪儿？库在哪儿？</li>\n<li>不想要使用库的全部，要不要配置个 shim？</li>\n<li>需不需要配置个 alias ？</li>\n</ul>\n<p>一个库就需要问这么些个问题，而且都是<code>人工手动的操作</code><br>\n最最关键的问题是你辛辛苦苦搞定的配置项都是相对于你当前项目的<br>\n当你想用在其他项目或者是单元测试，那么OK，你还得修改一下<br>\n因为，你相对的是当前项目的根路径，一旦根路径发生改变，一切都发生了变化</p>\n<p>requireJS 使用之前必须配置，同时该配置很难<strong><em>重用</em></strong></p>\n<p>相比较于 CommonJS 里面如果要使用一个第三方库的话，仅仅只需要在 package.json 里面配置一下 库名和版本号，然后npm install一下之后就可以直接 require 使用的方式，AMD 的处理简直弱爆了 !!!</p>\n<p>对于 AMD 的这个不足之处，又有社区大神提出了可以在 browser 运行的 CommonJS 的方式，并且通过模块定义配置文件，可以很好的进行模块复用<br>\n比较知名的就有 substack 的 <a href=\"https://github.com/substack/node-browserify\">browserify</a>, tj 曾主导的 <a href=\"https://github.com/componentjs/component\">component</a>，还有后来的 <a href=\"https://github.com/duojs/duo\">duo</a>，<a href=\"https://github.com/webpack/webpack\">webpack</a>，时代就转眼进入了 browser 上的 CommonJS</p>\n<h3>CommonJS in browser</h3>\n<p>由于 CommonJS 的 require 是同步的，在 require 处需要阻塞，这个在浏览器上并没有很好的支持（浏览器只能异步加载脚本，并没有同步的文件I/O），CommonJS 要在 browser 上直接使用则必须有一个 build 的过程，在这个 build 的过程里进行依赖关系的解析与做好映射。这里有一个典型的实现就是 substack 的 <a href=\"https://github.com/substack/node-browserify\">browserify</a>。</p>\n<h4>browserify</h4>\n<p>browserify 在 github 上的 README.md 解释是：</p>\n<p><code>require(&#x27;modules&#x27;)</code> in the browser</p>\n<p>Use a <a href=\"http://nodejs.org\">node</a>-style <code>require()</code> to organize your browser code\nand load modules installed by <a href=\"https://npmjs.org\">npm</a>.</p>\n<p>browserify will recursively analyze all the <code>require()</code> calls in your app in\norder to build a bundle you can serve up to the browser in a single <code>&lt;script&gt;</code>\ntag.</p>\n<p>在 browserify 里可以编写 nodejs 一样的代码（即CommonJS以及使用package.json进行module管理），browserify 会递归的解析依赖关系，并把这些依赖的文件全部build成一个bundle文件，在browser端使用则直接用 <code>&lt;script&gt;</code> tag 引入这个 bundle 文件即可</p>\n<p>browserify 有几个特性：</p>\n<ul>\n<li>编写和 nodejs 一样的代码</li>\n<li>在浏览器直接使用 npm 上的 module</li>\n</ul>\n<p>为了能让browser直接使用nodejs上的module，browserify 内置了一些 nodejs module 的 browser shim 版本<br>\n比如：assert，buffer，crypto，http，os，path等等，具体见<a href=\"https://github.com/substack/browserify-handbook#builtins\">browserify builtins</a></p>\n<p>这样子，browserify就解决了：</p>\n<ul>\n<li>CommonJS在浏览器</li>\n<li>前后端代码复用</li>\n<li>前端第三方库使用</li>\n</ul>\n<h4>component</h4>\n<p>component 通过 component.json 来进行依赖描述，它的库管理是基于 github repo的形式，由于进行了显示的配置依赖，它并不需要对源码进行 require 关系解析，但是时刻需要编写 component.json 也使得开发者非常的痛苦，开发者更希望 code over configuration 的形式</p>\n<h4>duo</h4>\n<p>所以有了 duo，duo 官网上介绍的是：</p>\n<p>Duo is a next-generation package manager that blends the best ideas from <a href=\"https://github.com/component/component\">Component</a>, <a href=\"https://github.com/substack/node-browserify\">Browserify</a> and <a href=\"http://golang.org/\">Go</a> to make organizing and writing front-end code quick and painless.</p>\n<p>Duo 有几个特点：</p>\n<ul>\n<li>直接使用 require 使用 github 上某个 repo 的库</li>\n</ul>\n<pre class=\"prettyprint language-js\"><code>var uid = require(&#x27;matthewmueller/uid&#x27;);\nvar fmt = require(&#x27;yields/fmt&#x27;);\n\nvar msg = fmt(&#x27;Your unique ID is %s!&#x27;, uid());\nwindow.alert(msg);\n</code></pre><ul>\n<li>不需用配置文件进行描述，直接内嵌在代码里面</li>\n<li>支持源码transform，比如支持 Coffeescript 或者 Sass</li>\n</ul>\n<h4>webpack</h4>\n<p>webpack takes modules with dependencies and generates static assets representing those modules.</p>\n<p>webpack 是一个 module bundler 即模块打包工具，它支持 CommonJS，AMD的module形式，同时还支持 code splittling，css 等</p>\n<p>最近 browserify 和 webpack 也有一定的比较，可以看看 substack 的文章 <a href=\"https://gist.github.com/substack/68f8d502be42d5cd4942\">browserify for webpack users</a></p>\n<h4>小结</h4>\n<p>这些 browser 上的 CommonJS 解决方案都有一个共同的问题，就是无法避免的需要一个 build 过程，这个过程虽然可以通过 watch task 来进行自动化，但是还是edit和debug还是非常不方便的</p>\n<p>试想着，你在进行debug，你设置了一个debugger，然后单步调试，调试调试着跳到了另外一个文件中，然后由于是一个bundle大文件，你在浏览器开发者工具看到的永远都是同一个文件，然后你发现了问题所在，回头去改源码，还得先找到当前所在行与源码的对应关系！当然这个可以通过 <a href=\"http://thlorenz.com/blog/browserify-sourcemaps\">source map</a> 技术来进行解决，但是相比较 AMD 那种所见即所得的开发模式还是有一定差距</p>\n<p>同时，需要build的过程也给多页面应用开发带来了很多麻烦，每个页面都要配置 watch task，都要配置 source map 之类的，而且build过程如果一旦出现了build error，开发者还要去看看命令行里面的日志，除非使用 <a href=\"https://github.com/chrisdickinson/beefy\">beefy</a> 这种可以把命令行里面的日志输出到浏览器console，否则不知道情况的开发者就会一脸迷茫</p>\n<h3>CommonJS vs AMD</h3>\n<p>这永远是一个话题，因为谁也无法很好的取代谁，尤其在浏览器环境里面，两者都有自己的优点和缺点<br>\nCommonJS</p>\n<ul>\n<li>优点：简洁，更符合一个module system，同时 module 库的管理也非常方便</li>\n<li>缺点：浏览器环境必须build才能使用，给开发过程带来不便</li>\n</ul>\n<p>AMD</p>\n<ul>\n<li>优点：天生异步，很好的与浏览器环境进行结合，开发过程所见即所得</li>\n<li>缺点：不怎么简洁的module使用方式，第三方库的使用时的重复繁琐配置</li>\n</ul>\n<h3>dependency injection</h3>\n<p>前面提到的 javaScript 依赖管理的方式，其实都是实现了同一种设计模式，service locator 或者说是 dependency lookup：<br>\n通过<code>显示的</code>调用 require(id) 来向 service locator 提供方请求依赖的 module<br>\nid 可以是路径，url，特殊含义的字符串（duo 中的github repo）等等</p>\n<p>相反，dependency injection 则<code>并没有显示的</code>调用，而仅仅通过一种与 container 的约定描述来表达需要某个依赖，然后由 container 自动完成依赖的注入，这样，其实是完成了 IoC（Inversion of control 控制反转）</p>\n<p>service locator 和 dependency injection 并没有谁一定优于谁一说，要看具体使用场景，尤其是 javaScript 这种天生动态且是first-class的语言里, 可以简单的对比下：</p>\n<ul>\n<li>service locator 非常直接，需要某个依赖，则直接通过 locator 提供的 api （比如 require）调用向 locator 获取即可，不过这也带来了必须与 locator 进行耦合的问题，比如CommonJS的require，AMD的define</li>\n</ul>\n<p>相反，dependency injection 由于并没有显示的调用container某个api，而是通过与container之间的某个约定来进行描述依赖，container再自动完成注入，相比较 service locator 则会隐晦一点</p>\n<ul>\n<li>\n<p>service locator 由于可以自己控制，使用起来更加的灵活，所依赖的也可以多样，不仅仅限于javaScript（还可以是json等，具体要看service locator实现）<br>\ndependency injection 则没有那么的灵活，一般的container实现都是基于某个特定的module，比如最简单的class，注入的一般都是该module所约定好的，比如class的instance</p>\n</li>\n<li>\n<p>service locator 中的id实现一般基于文件系统或者其它标识，可以是相对路径或者绝对路径或者url，这个其实就带来了一定的限制性，依赖方必须要在该id描述下一直有效，如果依赖方比如改了个名字或者移动了目录结构，那么所有被依赖方则必须做出改动</p>\n</li>\n</ul>\n<p>dependency injection 中虽然也有id，但是该id是module的全局自定义唯一id，这个id与文件系统则并没有直接的关系，无论外部环境如何变，由于module的id是硬编码的，container都能很好的处理</p>\n<ul>\n<li>service locator 由于灵活性，写出来的代码多样化，module之间会存在一定耦合，当然也可以实现松耦合的，但是需要一定的技巧或者规范</li>\n</ul>\n<p>dependency injection 由于天生是基于id描述的形式，控制交由container来完成，松散耦合，当应用规模不断增长的时候还能持续带来不错的维护性</p>\n<ul>\n<li>service locator 目前在javaScript界有大量实现，而且有大量的库可以直接使用，比如基于CommonJS的npm，因此在使用库方面 service locator 有着天然的优势</li>\n</ul>\n<p>dependency injection 则实现不多，而且由于是与container之间的约定，不同container之间的实现不同，也无法共通</p>\n<p>其实，比较来比较去，不如两者结合起来使用，都有各自的优缺点：<br>\ndependency injection 来编写松散耦合的应用层逻辑，service locator来使用第三方库</p>\n<h4>dependency injection container</h4>\n<p>一个优秀的dependency injection container需要有下面这些特性：</p>\n<ul>\n<li>无侵入式，与container之间的描述不是显示通过container api调用而是通过配置</li>\n<li>code over configuration，配置最好是内嵌于code的，自描述的</li>\n<li>实现异步脚本加载，由于已经描述了依赖关系，那么就无需蛋疼的再通过其它途径来处理依赖的脚本加载</li>\n<li>代码可以前后端直接复用，可以直接引用，而不是说通过复制/粘贴而来的复用</li>\n<li>在container之上实现其它，比如AOP，一致性配置，代码hot reload</li>\n</ul>\n<p>这其实就是 <a href=\"http://bearcatjs.org/\">bearcat</a> 所做的事儿<br>\nbearcat 并不是实现了 service locator 模式的module system，它实现了 dependency injection container，因此bearcat可以很好的与上面提到的各种CommonJS或者AMD结合使用，结合自己的优势来编写弹性、持续可维护的系统（应用）</p>\n<h4>bearcat</h4>\n<p>bearcat 的一个理念可以用下面一句话来描述：<br>\n<code>Magic, self-described javaScript objects build up elastic, maintainable front-backend javaScript applications</code><br>\nbearcat 所倡导的就是使用简单、自描述的javaScript对象来构建弹性、可维护的前后端javaScript应用</p>\n<p>当然可能有人会说，javaScript里面不仅仅是对象，还可以函数式、元编程什么的，其实也是要看应用场景的，bearcat更适合的场景是一个多人协作的、需要持续维护的系统（应用），如果是快速开发的脚本、工具、库，那么则该怎么简单、怎么方便，就怎么来</p>\n<h5>bearcat 快速例子</h5>\n<p>假如有一个应用，需要有一辆car，同时car必须要有engine才能发动，那么car就依赖了engine，在bearcat的 dependency injection container 下，仅仅如下编写代码即可：</p>\n<p>car.js</p>\n<pre class=\"prettyprint language-js\"><code>var Car = function() {\n    this.$id = &quot;car&quot;;\n    this.$engine = null;\n}\n  \nCar.prototype.run = function() { \n    this.$engine.run(); \n    console.log(&#x27;run car...&#x27;);\n}\n  \nbearcat.module(Car, typeof module !== &#x27;undefined&#x27; ? module : {});\n</code></pre><p>engine.js</p>\n<pre class=\"prettyprint language-js\"><code>var Engine = function() {\n    this.$id = &quot;engine&quot;;\n}\n  \nEngine.prototype.run = function() {\n    console.log(&#x27;run engine...&#x27;);\n}\n  \nbearcat.module(Engine, typeof module !== &#x27;undefined&#x27; ? module : {});\n</code></pre><ul>\n<li>通过 <code>this.$id</code> 来定义该module在bearcat container里的全局唯一id</li>\n<li>通过 <code>$Id</code> 属性来描述依赖，在car里就描述了需要id为 engine的一个依赖</li>\n<li>通过 bearcat.module(Function) 来把module注册到bearcat container中去\n<code>typeof module !== &#x27;undefined&#x27; ? module : {}</code><br>\n这一段是为了与 CommonJS（nodejs） 下进行兼容，在nodejs里由于有同步require，则无需向在浏览器环境下进行异步加载</li>\n</ul>\n<p>启动bearcat容器，整体跑起来</p>\n<p>浏览器环境</p>\n<pre class=\"prettyprint\"><code>&lt;script src=&quot;./lib/bearcat.js&quot;&gt;&lt;/script&gt;\n&lt;script src=&quot;./bearcat-bootstrap.js&quot;&gt;&lt;/script&gt;\n&lt;script type=&quot;text/javascript&quot;&gt;\nbearcat.createApp();   // create app to init \nbearcat.use([&#x27;car&#x27;]);  // javaScript objects needed to be used\nbearcat.start(function() {\n    // when this callback invoked, everything is ready\n    var car = bearcat.getBean(&#x27;car&#x27;);\n    car.run(); \n});\n</code></pre><p><code>bearcat.use([&#x27;car&#x27;])</code> 表面当前页面需要使用 car，bearcat然后就会加载car.js，然后解析car里面的依赖，知道需要engine，然后加载engine.js脚本，加载完之后，再把engine实例化注入到car中，最后调用<code>bearcat.start</code>的回调完成整个容器的启动</p>\n<p>nodejs 环境</p>\n<pre class=\"prettyprint language-js\"><code>var bearcat = require(&#x27;bearcat&#x27;);\nvar contextPath = require.resolve(&#x27;./context.json&#x27;);\nglobal.bearcat = bearcat; // make bearcat global, for `bearcat.module()`\nbearcat.createApp([contextPath]);\nbearcat.start(function() {\n  var car = bearcat.getBean(&#x27;car&#x27;); // get car\n  car.run(); // call the method\n});\n</code></pre><p>nodejs 环境下启动，则不需用<code>bearcat.use</code>了，直接把 <code>context.json</code>的路径传递给bearcat即可，bearcat会扫描<code>context.json</code>里面配置着的扫描路径，该路径下的所有js文件都会被扫描，合理的module都会注册到bearcat中，然后实例化，注入</p>\n<p>完整源码 <a href=\"https://github.com/bearcatjs/bearcat-examples/tree/master/10-seconds-example\">10-secondes-example</a></p>\n<h5>bearcat + browserify</h5>\n<p>bearcat 的简洁，异步加载的module，无需打包，所见即所得，在编写应用层代码上有非常大的便利<br>\nbrowserify 可以直接复用 npm 上的 module，使用第三方库非常的方便</p>\n<p>bearcat + browserify 会是一个不错的组合</p>\n<p>一个例子，基于 bearcat + browserify 的 markdwon-editor</p>\n<p>bearcat 与 browserify 之间通过一个<code>requireUtil</code>（比如）的module来进行连接</p>\n<p>在这个 <code>requireUtil</code> 可以使用 browserify 的 require，用这个 require 来引入第三方库，比如marked库</p>\n<p>requireUtil.js</p>\n<pre class=\"prettyprint language-js\"><code>var RequireUtil = function() {\n    this.$id = &quot;requireUtil&quot;;\n    this.$init = &quot;init&quot;;\n    this.brace = null;\n    this.marked = null;\n}\n    \nRequireUtil.prototype.init = function() {\n    this.brace = require(&#x27;brace&#x27;);\n    this.marked = require(&#x27;marked&#x27;);\n}\n     \nbearcat.module(RequireUtil, typeof module !== &#x27;undefined&#x27; ? module : {});\n</code></pre><p>然后在你的业务层代码上，注入这个 <code>requireUtil</code>来使用 browserify 引入的第三方库</p>\n<p>markDownController.js</p>\n<pre class=\"prettyprint language-js\"><code>var MarkDownController = function() {\n    this.$id = &quot;markDownController&quot;;\n    this.$requireUtil = null; // requireUtil is ready for you to use\n}\n    \nMarkDownController.prototype.initBrace = function(md) {\n    var ace = this.$requireUtil.brace;\n    var editor = ace.edit(&#x27;editor&#x27;);\n    editor.getSession().setMode(&#x27;ace/mode/markdown&#x27;);\n    editor.setTheme(&#x27;ace/theme/monokai&#x27;);\n    editor.setValue(md);\n    editor.clearSelection();\n    return editor;\n}\n     \nbearcat.module(MarkDownController, typeof module !== &#x27;undefined&#x27; ? module : {});\n</code></pre><p>这样子一来，编写业务层代码由于是bearcat管理的，javaScript依赖异步加载，代码编写和debug就和AMD一样，所见即所得，设置断点什么的，再也不用担心找不到源文件（或者需要source map）<br>\n使用 browserify 仅仅是为了用它来引入第三方库，且也仅仅当引入一个新的第三方库的时候才会执行一下 browserify 的 build</p>\n<p>bearcat 和 browserify 的优势就都发挥了出来，提高了开发的效率以及可维护性</p>\n<p>bearcat-markdown-editor 官网例子地址 <a href=\"http://bearcatjs.org/examples/markdown-editor.html\">markdown-editor</a></p>\n<h3>总结</h3>\n<p>无论是CommonJS、AMD或者是dependency injection，单独使用某一个，javaScript依赖管理都不是完美的<br>\n应人而异，各取所需</p>\n<h3>参考</h3>\n<ul>\n<li><a href=\"http://martinfowler.com/articles/injection.html\">martin fowlter dependency injection</a></li>\n<li><a href=\"http://bearcatjs.org/2014/12/24/asynchronous-frontend-dependency-management-without-AMD/\">asynchronous frontend dependency management without AMD</a></li>\n<li><a href=\"http://bearcatjs.org/2015/01/02/browserify-with-asynchronous-script-loading/\">browserify with asynchronous script loading​</a></li>\n<li><a href=\"http://bearcatjs.org/%E5%8D%9A%E5%AE%A2/index.html\">原文</a></li>\n</ul>\n</div>","title":"JavaScript 依赖管理","last_reply_at":"2015-02-20T20:18:39.929Z","good":true,"top":false,"reply_count":12,"visit_count":1046,"create_at":"2015-01-03T02:25:25.105Z","author":{"loginname":"fantasyni","avatar_url":"https://avatars.githubusercontent.com/u/1411347?v=3&s=120"}},{"id":"54e67b70629934692ea99f91","author_id":"53fdd8502243147e7857b2bb","tab":"share","content":"<div class=\"markdown-text\"><p>Node.js 的 exports 和 module.exports 两者很容易给新手造成疑惑。这里希望能讲清楚它们的异同。</p>\n<h5>相同之处</h5>\n<p>exports 和 module.exports 并不是全局变量，而只是对各自的 module 可见。</p>\n<p>它们指向同一个对象，其缺省初始值为空 {}。</p>\n<p>如果 exports 和 module.exports 没有被重新赋值，这个对象就是将要输出的对象。</p>\n<h5>不同之处</h5>\n<p>module 是对当前模块的一个引用。真正输出的是 module.exports。</p>\n<p>所以对 exports 直接赋值没有作用。而对 module.exports 直接赋值后，module.exports 就指向新的对象了，这个新的对象成为将要被输出的对象。</p>\n<h5>详细说明</h5>\n<p>exports 和 module.exports 指向的是同一个对象，所以给他们任何一个添加属性或方法，另外一个都会接收到变化，因为他们指向的是同一个对象。例如：</p>\n<pre class=\"prettyprint\"><code>exports.afunc = function(){};\nmodule.exports.name = &quot;Wang&quot;;\nconsole.log(exports);\nconsole.log(module.exports);\n</code></pre><p>后面两条语句的输出都是： <code> { afunc: [Function], name: ‘Wang’ } </code> 。</p>\n<p>但是如果是对其中任何一个直接赋值，就会切断对最初对象的引用。</p>\n<ul>\n<li>exports</li>\n</ul>\n<p>例如给 exports 直接赋值，就切断了 exports 对之前其和 module.exports 一同指向的对象的引用，但是由于真正输出的是 module.exports 指向的对象，所以对 exports 赋值无效，比如在 ep.js 输入：</p>\n<pre class=\"prettyprint\"><code>exports.name = &quot;Wang&quot;;\nvar afunc = function(){};\nexports = afunc; //注意对 require 无效\nconsole.log(exports); //内部有效，输出 [Function]\n</code></pre><p>在另外一个 me.js 输入：</p>\n<pre class=\"prettyprint\"><code>var ep = require(&#x27;./ep&#x27;);\nconsole.log(ep);//输出 {name: &#x27;Wang&#x27;}，不是 [Function]\n</code></pre><p>要让 exports 输出，可以在 ep.js 加上</p>\n<pre class=\"prettyprint\"><code>module.exports = exports; \n</code></pre><p>两者的 reference 关系再次建立。这样输出都是 [Function] 。</p>\n<ul>\n<li>module.exports</li>\n</ul>\n<p>如果给 module.exports 直接赋值，也切断了 exports 的引用，同样道理，因为真正输出的是 module.exports 指向的对象，所以新赋给 module.exports 的对象将被输出。例如把 ep.js 改为：</p>\n<pre class=\"prettyprint\"><code>exports.name = &quot;Li&quot;;\nconsole.log(exports); //{name: &#x27;Li&#x27;}\nconsole.log(module.exports);//一样 {name: &#x27;Li&#x27;}\nmodule.exports = &quot;Zhou&quot;;\nconsole.log(exports); //还是 {name: &#x27;Li&#x27;}\nconsole.log(module.exports);//变为 Zhou\n</code></pre><p>再次运行 me.js，输出 <code> Zhou </code>, 覆盖了之前的对象.</p>\n<h4>总结</h4>\n<p>真正输出总是 module.exports。如果两者同时出现或被修改，只有 module.exports 返回，exports 被忽略。</p>\n<h4>参考：</h4>\n<ul>\n<li>\n<p><a href=\"https://github.com/joyent/node/blob/069dd07a1732c6a752773aaed9e8c18ab472375f/lib/module.js#L354\">Node module.js 源码</a></p>\n</li>\n<li>\n<p><a href=\"http://nodejs.org/api/globals.html#globals_module\">Node global objects 文档</a></p>\n</li>\n<li>\n<p><a href=\"http://nodejs.org/api/modules.html\">Node modules 文档</a></p>\n</li>\n</ul>\n</div>","title":"exports vs module.exports","last_reply_at":"2015-02-20T00:10:24.898Z","good":false,"top":false,"reply_count":0,"visit_count":150,"create_at":"2015-02-20T00:10:24.898Z","author":{"loginname":"russj","avatar_url":"https://avatars.githubusercontent.com/u/2281763?v=2&s=120"}},{"id":"54db02a04d04937c4a80629d","author_id":"539815c4c3ee0b58202a30c9","tab":"ask","content":"<div class=\"markdown-text\"><p>如题\n用POST方式上传文件，Express框架可以获得content-length的大小\n是否可以通过content-length的大小直接拒绝掉超过大小限制的请求，\n而不需要等到整个文件都上传完之后再判断文件的大小。</p>\n</div>","title":"Express框架中，使用POST方式上传文件时文件大小的检查","last_reply_at":"2015-02-19T10:42:12.890Z","good":false,"top":false,"reply_count":5,"visit_count":483,"create_at":"2015-02-11T07:20:00.359Z","author":{"loginname":"xinyuanyu","avatar_url":"https://avatars.githubusercontent.com/u/7496811?v=3&s=120"}},{"id":"54e47dd6a41603161e86fe43","author_id":"53fdd8502243147e7857b2bb","tab":"share","content":"<div class=\"markdown-text\"><p>有人用过吗？\ngithub star 2500 左右\n看它自己列的功能到是挺全的\n<img src=\"//dn-cnode.qbox.me/FkbNMxEVSBoVN1qmpQ0qA-cbNJjK\" alt=\"Screenshot 2015-02-18 22.52.18.png\"></p>\n</div>","title":"一个比较新的单元测试框架 intern","last_reply_at":"2015-02-19T08:44:19.223Z","good":false,"top":false,"reply_count":3,"visit_count":187,"create_at":"2015-02-18T11:56:06.242Z","author":{"loginname":"russj","avatar_url":"https://avatars.githubusercontent.com/u/2281763?v=2&s=120"}},{"id":"54dffd521712f19837bd51b6","author_id":"545b74143e1f39344c5b3bee","tab":"ask","content":"<div class=\"markdown-text\"><p>JS中好像没有抽象函数的概念啊,如何做到把实现放在子类中呢?</p>\n</div>","title":"JS中可以实现Template模式么?","last_reply_at":"2015-02-19T01:54:41.145Z","good":false,"top":false,"reply_count":6,"visit_count":360,"create_at":"2015-02-15T01:58:42.318Z","author":{"loginname":"chapgaga","avatar_url":"https://avatars.githubusercontent.com/u/9590859?v=3&s=120"}},{"id":"53d0a5b8691a430912751e33","author_id":"5358a516e29778b00702b420","content":"<div class=\"markdown-text\"><p><a href=\"http://115.29.99.116:1400/index.html\">http://115.29.99.116:1400/index.html</a>\n刚进去可能内容会挤在一块，稍微调整一下窗口大小就可以了。\n项目地址: <a href=\"https://github.com/tsq/xiami\">https://github.com/tsq/xiami</a></p>\n</div>","title":"SailsJs+Angularjs 爱虾米网站","last_reply_at":"2015-02-19T01:54:11.150Z","good":false,"top":false,"reply_count":7,"visit_count":1472,"create_at":"2014-07-24T06:20:40.387Z","author":{"loginname":"tsq","avatar_url":"https://avatars.githubusercontent.com/u/6081537?v=3&s=120"}},{"id":"544ca7e2d1cec60b7e4bdcb3","author_id":"53aecc6fa087f4562011cc62","tab":"ask","content":"<div class=\"markdown-text\"><p>RT，我想，用一个field来放转发人的信息，这个field是一个array，每个array里面有一个dic，是【人：转发时候说的东西】？</p>\n</div>","title":"如何实现类似weibo的转发链？","last_reply_at":"2015-02-18T15:23:40.516Z","good":false,"top":false,"reply_count":6,"visit_count":468,"create_at":"2014-10-26T07:50:58.817Z","author":{"loginname":"zzz6519003","avatar_url":"https://avatars.githubusercontent.com/u/1625608?v=2&s=120"}},{"id":"54e45838b67ac549184fda85","author_id":"54e3ef64d84b17ec08a21875","tab":"share","content":"<div class=\"markdown-text\"><p>如果你依然在寻找一种开发移动应用的方式，而依然尚未决定采用 Ionic 的话，那么现在是时间做出选择了。我把现在 Ionic逐渐升温的迹象和为什么你会要通过 Ionic 来开发新的移动应用的原因列出来了。</p>\n<h3>Ionic 是 GitHub 上排名前50位的项目之一</h3>\n<p>Ionic 是 GitHub 上排名前50位的项目之一，Ionic 已经一岁了，并且还在快速的发展中。有疑问？简单的提问就行，这也说明有大量的开发者在为了使 Ionic 成为最棒的框架而努力，同时这也带来了很多的机会。（<a href=\"https://github.com/search?p=1&amp;q=stars%253A%3E1&amp;s=stars&amp;type=Repositories\">来源</a>）</p>\n<h3>Ionic 正在构建一个强大的平台</h3>\n<p>目前为止你用来开发移动应用界面时候用到的  Ionic 的强大之处主要在框架上，然而Ionic 在他们的平台上提供了更多地特性。有一些现在已经开放了，比如 * <a href=\"https://view.ionic.io/\">Ionic View</a>，一种不需要上传到应用商店就可以和其他人分享你的应用的方式，可以在客户端非常完美的展示应用。* <a href=\"http://ionicinaction.com/the-time-is-now-to-learn-ionic/httpsL//creator.ionic.io\">Ionic Creator</a>，在可视化编辑器通过拖拽就可以起草一个应用，虽然有限制，但却可以通过头脑风暴方式绘制出界面原型。 * Ionic Push Notifications，目前还处于内测阶段，可以通过 Ionic 的推送服务器来推送你的应用通知，如果自己实现挺恶心的。* Ionic Future Platform，还有其他一些服务，比如分析、设计工具、调试帮助。该集成平台将允许你快速的进行功能开发设计，与您的应用程序无缝协作。</p>\n<h3>非常了不起的社区</h3>\n<p>Ionic 社区非常了不起并且在快速发展，过去的一周里有将近3,000人在 Ionic 论坛注册（过去的一年有41,000），一共有大约54,000篇帖子。 Ionic在 Stack Overflow 上有超过1,700个话题，每天依然还在不断增长。</p>\n<h3>稳定的1.0版本即将到来</h3>\n<p>有些人喜欢尝鲜，但其他人并不喜欢这种不稳定和每一个测试版的变化。最后一个测试版目前已经发布，发布正式版指日可待。一旦正式版本出来了，你不应该就不需要担心开发后API的变化。可以预期随着时间的推移将会添加更多的功能，到时候肯定会是个惊喜！</p>\n<h3>Ionic 和 Angular 正在共同协作</h3>\n<p>在Angular的生态系统中 Ionic 不只是一个消费者，实际上Ionic 团队和Angular开发团队正在共同协作，为了下一个主要版本的发展而努力（估计还有一段时间，请耐心等待）。这也给了我信心让我相信将来 Ionic 和Angular会继续共同协作。</p>\n<h3>Ionic 有一本参考书(广告，请忽略，我就不翻译了)</h3>\n<p>Ok I had to plug the book, but I’m getting close to the final draft for Ionic in Action. I’m excited about it, and if you do grab a copy be sure to let me know how you like it in the author forum!</p>\n<h3>你呢？</h3>\n<p>你还觉得 Ionic 那里很棒呢？在社区里和大家分享下吧！</p>\n<p>偷偷的说下，这篇文章是翻译老外的，这里是<a href=\"http://ionicinaction.com/the-time-is-now-to-learn-ionic/\">原文</a>。</p>\n<p><a href=\"http://openionic.com/\">Ionichina社区</a>正在建设中，欢迎大家有关 Ionic 方面的问题过来讨论哈~</p>\n</div>","title":"是时候开始学习 Ionic了","last_reply_at":"2015-02-18T09:57:30.880Z","good":false,"top":false,"reply_count":2,"visit_count":303,"create_at":"2015-02-18T09:15:36.032Z","author":{"loginname":"IonicChina","avatar_url":"https://avatars.githubusercontent.com/u/10623634?v=3&s=120"}},{"id":"54e400eaf47d8cb30dcad524","author_id":"54e3ef64d84b17ec08a21875","tab":"share","content":"<div class=\"markdown-text\"><p>用Nodeclub自己搭建了个<a href=\"http://openionic.com/\">社区</a>，遇到了一些小问题，不过现在是正常跑起来了，分享下安装过程。<br>\n我的环境：<br>\nOS: CentOS release 6.6 (Final)<br>\nNodeJS: v0.10.36<br>\nMongoDB: 2.6.7<br>\nGit: 1.7.1<br></p>\n<p>1.首先是安装环境，Node.js， MongoDB<br>\n安装 Node.js，<a href=\"http://www.w3cschool.cc/nodejs/nodejs-install-setup.html\">点此</a>查看<br>\n安装MongoDB，<a href=\"http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/\">点此</a>查看<br>\n安装 Git，<a href=\"http://git-scm.com/download/linux\">点此</a>查看<br>\n2.然后在 github 上 fork 了一份<a href=\"https://github.com/IonicChina/nodeclub\">代码</a><br>\n3.clone到本地，拷贝一份config.default.js，重命名为 config.js，依据注释进行内容修改<br>\n有一个地方比较坑，发布版本一定要把debug设置为 false，否则邮件不能用<br>\n4.push 到 github自己 fork 出来的那份上<br>\n5.在服务器想要安装的目录，git clone 下来<br>\n6.执行安装命令<br>\n<code>make install</code><br>\n正常安装完后启动<br>\n<code>node app.js</code>，<br>\n访问看是否正常 <a href=\"http://ip:3000\">http://ip:3000</a><br></p>\n<p>7.用Upstart 进程守护工具来启动 Nodeclub<br>\n关于Upstart，<a href=\"http://www.ghostchina.com/keep-ghost-up-with-upstart/\">这里</a>有一篇介绍文章。<br>\n按照下面配置完事儿后，直接 start ionichina，正常启动，搞定收工！<br><br><br></p>\n<p>附录：我的配置<br>\n<code>more /etc/init/ionichina.conf</code><br>\n显示<br></p>\n<pre class=\"prettyprint language-shell\\n\"><code>description &quot;ionic china&quot;  \nauthor      &quot;ionichina.com&quot;  \nstart on runlevel [2345]  \nstop on shutdown\n\nrespawn  \nrespawn limit 99 5\n\nscript  \n    cd /alidata/server/nodeclub\n    #npm start --production 2&gt;&amp;1 &gt;&gt; /dev/null\n    node app.js\n    exec /usr/bin/node /alidata/server/nodeclub/app.js &gt;&gt; /var/log/ionichina.log 2&gt;&amp;1\n\nend script\n</code></pre></div>","title":"Nodeclub 安装部署日志","last_reply_at":"2015-02-18T09:10:54.086Z","good":false,"top":false,"reply_count":4,"visit_count":198,"create_at":"2015-02-18T03:03:06.237Z","author":{"loginname":"IonicChina","avatar_url":"https://avatars.githubusercontent.com/u/10623634?v=3&s=120"}},{"id":"54da39061e6a327207e097db","author_id":"53eade54f4b616a82f00a241","tab":"job","content":"<div class=\"markdown-text\"><h2>云视链资料</h2>\n<p>目前A轮前夕\n<a href=\"http://venvyvideo.cn\">venvyvideo.cn第一版</a> ,第二版3月初上线\n<a href=\"http://www.36kr.com/p/218356.html\">36kr的报道</a>\n<a href=\"http://newspaper.jfdaily.com/jfrb/html/2015-01/27/node_11.htm\">CEO专访</a>\n<a href=\"http://www.cyzone.cn/a/20150106/268032.html\">CEO专访2</a></p>\n<h3>1 薪资待遇</h3>\n<ul>\n<li>12k~25k</li>\n<li>各种奖金</li>\n<li>餐补</li>\n<li>无限饮料/水果/零食</li>\n<li>美女主编,美女设计师 (这个必须有,送不送看能力)</li>\n<li>…</li>\n</ul>\n<h3>2 宽松的办公环境</h3>\n<ul>\n<li>坐落黄浦区,外马路,老码头5号库创邑so cool大楼</li>\n<li>外滩江景办公,环境优美</li>\n<li>养眼美女很多,并且就在你身边 : )</li>\n<li>每天中午11点上班 , 所以你可以睡到太阳晒屁股 .</li>\n<li><a href=\"http://newspaper.jfdaily.com/jfrb/html/2015-01/27/node_11.htm\">90后哈佛CEO</a> 创意无限</li>\n</ul>\n<h3>3 要求</h3>\n<ul>\n<li>2年以上Node.js工作经验</li>\n<li>熟悉主流前后端技术</li>\n<li>熟悉 Git, Git Flow 或类似工作流程</li>\n<li>熟悉 grunt/gulp 构建工具</li>\n<li>熟悉 redis,mongoDB</li>\n<li>熟悉 jade/coffee/ejs 等模板引擎</li>\n</ul>\n<h3>4 加分</h3>\n<ul>\n<li>mac 系统</li>\n<li>熟悉shell</li>\n<li>github有自己的项目,在npm上发布过模块,有自己的技术blog</li>\n<li>对新事物反应敏感</li>\n</ul>\n<h3>5 联系</h3>\n<p><a href=\"mailto:wjoy@venvyvideo.cn\">wjoy@venvyvideo.cn</a> 邮件标题注明:来自cnode社区</p>\n</div>","title":"[上海] 云视链, 哈佛创新实验室项目, 外滩江景办公,  全球独有互动视频2.0平台","last_reply_at":"2015-02-18T04:03:59.467Z","good":false,"top":false,"reply_count":14,"visit_count":868,"create_at":"2015-02-10T16:59:50.777Z","author":{"loginname":"netpi","avatar_url":"https://avatars.githubusercontent.com/u/8254020?v=3&s=120"}},{"id":"53df57aa111cfedf0b4500b5","author_id":"53df56f5bd3cc3e50b3fc9e0","content":"<div class=\"markdown-text\"><p>原文[<a href=\"http://baoz.me/449778]\">http://baoz.me/449778]</a></p>\n<p>少废话，上代码。nodejs 代码如下：</p>\n<pre class=\"prettyprint language-js\"><code>var http = require(&quot;http&quot;);\nvar server = http.createServer(function(request, response) {\n    response.writeHead(200, {\n        &quot;Content-Type&quot;: &quot;text/html&quot;\n    });\n    response.write(&quot;Hello World!&quot;);\n    response.end();\n});\n\nserver.listen(8000);\n</code></pre><p>测试结果：</p>\n<pre class=\"prettyprint\"><code>lion$ wrk -t12 -c400 -d30s http://127.0.0.1:8000/\nRunning 30s test @ http://127.0.0.1:8000/\n  12 threads and 400 connections\n  Thread Stats   Avg      Stdev     Max   +/- Stdev\n    Latency    38.61ms    6.18ms  77.46ms    84.50 %\n    Req/Sec    837.87      134.82      1.77k     81.78 %\n  297965 requests in 30.00s, 44.05MB read\n  Socket errors: connect 0, read 453, write 0, timeout 90\nRequests/sec:    9931.42 \nTransfer/sec:      1.47MB\n</code></pre><p>fibjs 相似代码如下：</p>\n<pre class=\"prettyprint\"><code>var http = require(&quot;http&quot;);\nvar svr = new http.Server(8080, function(req) {\n    var rep = req.response;\n    rep.addHeader({\n        &quot;Content-Type&quot;: &quot;text/html&quot;\n    });\n    rep.body.write(new Buffer(&quot;Hello World!&quot;));\n});\n\nsvr.run();\n</code></pre><p>测试结果如下：</p>\n<pre class=\"prettyprint\"><code>lion$ wrk -t12 -c400 -d30s http://127.0.0.1:8080/\n\\Running 30s test @ http://127.0.0.1:8080/\n  12 threads and 400 connections\n  Thread Stats   Avg      Stdev     Max   +/- Stdev\n    Latency    16.73ms   31.61ms 162.45ms    94.93 %\n    Req/Sec     3.25k    822.21      5.28k     89.45 %\n  1137450 requests in 30.00s, 160.54MB read\n  Socket errors: connect 0, read 282, write 0, timeout 0\nRequests/sec:   37916.03 \nTransfer/sec:      5.35MB\n</code></pre><p>可是有些代码对 fibjs 纯属多余，精简一下：</p>\n<pre class=\"prettyprint\"><code>var http = require(&quot;http&quot;);\nvar svr = new http.Server(8080, function(req) {\n    req.response.body.write(new Buffer(&quot;Hello World!&quot;));\n});\n\nsvr.run();\n</code></pre><p>测试结果如下：</p>\n<pre class=\"prettyprint\"><code>lion$ wrk -t12 -c400 -d30s http://127.0.0.1:8080/\nRunning 30s test @ http://127.0.0.1:8080/\n  12 threads and 400 connections\n  Thread Stats   Avg      Stdev     Max   +/- Stdev\n    Latency    24.39ms   71.85ms 343.96ms    95.11 %\n    Req/Sec     3.99k     1.00k    6.67k     91.61 %\n  1379337 requests in 30.00s, 161.80MB read\n  Socket errors: connect 0, read 270, write 0, timeout 0\nRequests/sec:   45980.00 \nTransfer/sec:      5.39MB\n</code></pre></div>","title":"fibjs比 nodejs 快五倍","last_reply_at":"2015-02-18T03:38:40.366Z","good":true,"top":false,"reply_count":152,"visit_count":10731,"create_at":"2014-08-04T09:51:38.744Z","author":{"loginname":"ngot","avatar_url":"https://avatars.githubusercontent.com/u/5243774?v=3&s=120"}},{"id":"54e3ba17d84b17ec08a2186c","author_id":"54e3b8e9d84b17ec08a2186b","tab":"ask","content":"<div class=\"markdown-text\"><p>初学node 想建立一个Node server 可以GET request 其他API 然后把反馈的信息 在加工 然后存到MongoDB 里面\n然后再发送电子邮件给收件人，不知道可不可能实现。请有检验的Node友 分享经验或者代码。先谢谢了。</p>\n</div>","title":"想学习编程 求问 一个关于Node server 如何GET Request 其他API","last_reply_at":"2015-02-18T03:37:02.059Z","good":false,"top":false,"reply_count":2,"visit_count":154,"create_at":"2015-02-17T22:00:55.849Z","author":{"loginname":"roxnnz","avatar_url":"https://avatars.githubusercontent.com/u/5995378?v=3&s=120"}},{"id":"54df58351712f19837bd5188","author_id":"53aecc6fa087f4562011cc62","tab":"ask","content":"<div class=\"markdown-text\"><p>RT</p>\n</div>","title":"想做一个可以保存用户的微信的自定义表情的工具，各位有什么思路么？","last_reply_at":"2015-02-17T21:55:38.521Z","good":false,"top":false,"reply_count":3,"visit_count":254,"create_at":"2015-02-14T14:14:13.565Z","author":{"loginname":"zzz6519003","avatar_url":"https://avatars.githubusercontent.com/u/1625608?v=2&s=120"}},{"id":"54e1e340ba3663630a654498","author_id":"54bdcd3d514ea9146862ac27","tab":"ask","content":"<div class=\"markdown-text\"><p>这是用来访问的代码：\n<code>var http = require(&#x27;http&#x27;);</code>\n<code>var req = http.request({</code>\n<code>method: &#x27;POST&#x27;,</code>\n<code>port: 3000,</code>\n<code>headers: {</code>\n<code>&#x27;Content-Type&#x27;: &#x27;application/json&#x27;</code>\n<code>}</code>\n<code>},function(res){</code>\n<code>console.log(res);</code>\n<code>});</code></p>\n<p><code>req.write(&#x27;{&quot;foo&quot;:&quot;&#x27;);</code>\n<code>var n=300000;</code></p>\n<p><code>while (n--){</code>\n<code>req.write(&#x27;foo,&#x27;);</code>\n<code>}</code></p>\n<p><code>req.end(&#x27;bar&quot;}&#x27;);</code>\n<code>console.log(&quot;over&quot;);</code></p>\n<p>下面是后端代码：</p>\n<p><code>var connect = require(&#x27;connect&#x27;);</code>\n<code>var bodyParser =require(&quot;body-parser&quot;);</code>\n<code>var app = connect();</code></p>\n<p><code>app.use(function(res,req,next){</code>\n<code>console.log(&quot;start&quot;);</code>\n<code>next();</code>\n<code>});</code>\n<code>app.use(bodyParser());</code>\n<code>app.use(function(req,res){</code>\n<code>console.log(req.body.foo);</code>\n<code>res.end(&quot;ok\\n&quot;);</code>\n<code>}).listen(3000);</code></p>\n<p>都运行后，结果什么事情都没发生</p>\n</div>","title":"用http模块访问后端失败，求解原因","last_reply_at":"2015-02-17T21:33:42.815Z","good":false,"top":false,"reply_count":1,"visit_count":193,"create_at":"2015-02-16T12:32:00.669Z","author":{"loginname":"MephistoMMM","avatar_url":"https://avatars.githubusercontent.com/u/9097390?v=3&s=120"}},{"id":"54e1c28536989e6b64f87484","author_id":"54e1c11736989e6b64f87483","tab":"ask","content":"<div class=\"markdown-text\"><p>默认的routes中的index想要发送一个html页面\nvar express = require(‘express’);\nvar router = express.Router();</p>\n<p>/* GET home page. */\nrouter.all('/’, function(req, res, next) {\nres.sendfile(“./views/index.html”);\n});</p>\n<p>module.exports = router;\n能够发送但是外部关联css和js都不能加载，求问为啥</p>\n</div>","title":"express4.0默认的routes中的index想要发送一个html页面","last_reply_at":"2015-02-16T14:31:50.709Z","good":false,"top":false,"reply_count":1,"visit_count":236,"create_at":"2015-02-16T10:12:21.361Z","author":{"loginname":"1043099804","avatar_url":"https://avatars.githubusercontent.com/u/8143638?v=3&s=120"}},{"id":"54e1da96ba3663630a654495","author_id":"54bdcd3d514ea9146862ac27","tab":"ask","content":"<div class=\"markdown-text\"><p>我用<code>curl -F image=@head.png -F name=tobi http://192.168.0.100:3000</code>，想上传一张图片，并把它解析\n但是总是出现问题\n输出如下\n<code>{}</code>\n<code>undefined</code>\n后端如下</p>\n<p><code>var connect = require(&#x27;connect&#x27;);</code>\n<code>var bodyParser =require(&quot;body-parser&quot;);</code>\n<code>var app = connect();</code></p>\n<p><code>app.use(bodyParser());</code>\n<code>app.use(function(req,res){</code>\n<code>console.log(req.body);</code>\n<code>console.log(req.files);</code>\n<code>res.end(&quot;ok\\n&quot;);</code>\n<code>}).listen(3000);</code></p>\n<p>求解原因</p>\n</div>","title":"curl上传文件总是失败，求解原因","last_reply_at":"2015-02-16T11:55:02.970Z","good":false,"top":false,"reply_count":0,"visit_count":192,"create_at":"2015-02-16T11:55:02.970Z","author":{"loginname":"MephistoMMM","avatar_url":"https://avatars.githubusercontent.com/u/9097390?v=3&s=120"}},{"id":"54e19e8f36989e6b64f87476","author_id":"54e19ac036989e6b64f87475","tab":"ask","content":"<div class=\"markdown-text\"><p>初学Nodejs 想写个爬xml的爬虫\n本来想用cheerio  结果发现无法解析<code>&lt;![CDATA[我是无法解析的CDATA]]&gt;</code>\n上网搜了下发现基于sax-js的xmlreader模块可以解析\n自己写了个 发现无论怎样输出都是空的  上网搜了也无果<br>\n没办法了  只好求助各位大大麻烦解答一下</p>\n<pre class=\"prettyprint language-js\"><code>var superagent = require(&#x27;superagent&#x27;);\nvar xmlreader=require(&#x27;xmlreader&#x27;);\n  superagent.get(&#x27;http://hexo.io/atom.xml&#x27;)\n    .end(function (err, sres) {\n      if (err) {\n        return next(err);\n      }\n      xmlreader.read(sres.text,function(err,res){\n        if(err) return next(err);\n        \n        console.log( res.feed.text());\n      })\n    });\n</code></pre><p>网上的例子都是读取本地的xml文件  难道这个模块只能读本地的？\n如果有更优雅的方法可以解析CDATA也请告诉我哈~</p>\n</div>","title":"写个爬虫解析xml里的CDATA遇到的问题","last_reply_at":"2015-02-16T07:38:55.413Z","good":false,"top":false,"reply_count":0,"visit_count":197,"create_at":"2015-02-16T07:38:55.413Z","author":{"loginname":"SuperKieran","avatar_url":"https://avatars.githubusercontent.com/u/10074039?v=3&s=120"}},{"id":"54d877d36a95c42f404f7e4f","author_id":"53b25565399ed9e07d1e8793","tab":"share","content":"<div class=\"markdown-text\"><p>自己正在用，每天有100M流量，速度还不错\n<a href=\"http://www.mxvpnjsq.cc/download.php\">http://www.mxvpnjsq.cc/download.php</a>\n平台支持很全的的哦！</p>\n</div>","title":"给大家分享一个免费的vpn软件","last_reply_at":"2015-02-16T05:31:34.202Z","good":false,"top":false,"reply_count":6,"visit_count":778,"create_at":"2015-02-09T09:03:15.051Z","author":{"loginname":"liygheart","avatar_url":"https://avatars.githubusercontent.com/u/6915570?v=3&s=120"}}]}