<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Designsor</title>
	<atom:link href="http://www.designsor.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.designsor.com</link>
	<description>End Web Developer&#039;s Blog</description>
	<lastBuildDate>Sat, 14 Jan 2012 02:35:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>2011 End</title>
		<link>http://www.designsor.com/2012/01/14/2011end/</link>
		<comments>http://www.designsor.com/2012/01/14/2011end/#comments</comments>
		<pubDate>Sat, 14 Jan 2012 02:30:23 +0000</pubDate>
		<dc:creator>xiaojue</dc:creator>
				<category><![CDATA[心情日志]]></category>

		<guid isPermaLink="false">http://www.designsor.com/?p=1144</guid>
		<description><![CDATA[2011年过的是我24年来过的最快的一年。 年初还在杭州，年末却已然在北京生活了。今天周末，特别拿出时间来对自己进行一次总结，各个方面的，哎，记性一年不如一年，还是记录靠谱。 2010年如果说是蜕变，我记得去年的总结是用的这个词，去年给自己的期望是沉淀或者说成长。那么好吧，沉淀可能做的不太好，但是成长，是非常明显的。 先说技术上吧。年初的时候开始看了python和ruby，从一点不懂到可以翻阅手册写点脚本，嗯，4，5月份的时候特别对javascript的基础知识【由于换工作】又刷新了一下自己的世界观-主要把犀牛书，设计模式，周爱民的那本语言精粹，还有高性能全部读了一次，并且做了总结和实践，5，6月份由于全身心把时间精力扑在面试上，基本也面了全国绝大部分top10的公司，对一些概念和新知识点又有了明确的方向和目标。7月-8月时沉淀的2个月份，自己一个人独立完成一个独立社区的所有前端工作，到了9月底，自己又独立完成了一个电子商务平台的前端代码编写部分，总计最终代码量10W行【主要是js】。在其中对一些平时模糊不清的概念和一些没有接触过的组件又有了质的认识提高。在新公司期间对java，apache，nginx，linux还有vi的熟悉程度算是从工作开始到现在的扫盲阶段。一个月的时间不看js，只看prel和shell的基础还有linux常用命令，用了2周把vim的使用提升到工作环境，这些都是2011年从0开始的长进，虽然还是很菜。10月份左右开始接触nodejs，自己写了一个叫nodecombo的小玩具，并且对nodejs相关的知识点有了认识和自己的看法，增强了自己对web server的认知，还有对http socket协议等的全新扫盲。。。年底了，对自己工作文档总结的完成，编写了公司年会的一些活动页面特效和抽奖程序，并且再次更换工作环境，年后去sina啦……是机会也是挑战，全新的项目和新知识也再次面对了我。喔，忘记说了，在nodejs的编写过程中，由于使用了node canvas，也从0的canvas编写经验上突破了一小下……嗯，杂乱的东西很多，这简直就是让人发指的流水账。。 其他方面：北京-杭州-北京的多次迁徙，2次搬家，3次web标准交流的参加，1次nodejs聚会，大小10次面试，20于次电话面试，QQ里多了5个javascript群，猎头累积名单12，各公司HR联系方式也都收集了个遍。。。 生活：6月份认识到现在的女朋友一直相处到现在，突破了我恋爱时长最长的记录……，一年努力最后工资成功实现当年的treble，信用卡限额提高了一倍，欠款降低一倍，入手2个ipad，增加一个vps和N个还没过期的vpn，街头篮球盖帽全区最高记录29名。。存款尚无，还需努力，但是同期每月开始给家里寄钱了，是个好开始了。。 嗯，看起来2011年还算没有虚度，如果说倒退就是豆瓣账号连续又注销了2次。 嗯，大家好，我是小爝，2012年，我来了。 &#160;]]></description>
			<content:encoded><![CDATA[<p>2011年过的是我24年来过的最快的一年。</p>
<p>年初还在杭州，年末却已然在北京生活了。今天周末，特别拿出时间来对自己进行一次总结，各个方面的，哎，记性一年不如一年，还是记录靠谱。</p>
<p>2010年如果说是蜕变，我记得去年的总结是用的这个词，去年给自己的期望是沉淀或者说成长。那么好吧，沉淀可能做的不太好，但是成长，是非常明显的。</p>
<p>先说技术上吧。年初的时候开始看了python和ruby，从一点不懂到可以翻阅手册写点脚本，嗯，4，5月份的时候特别对javascript的基础知识【由于换工作】又刷新了一下自己的世界观-主要把犀牛书，设计模式，周爱民的那本语言精粹，还有高性能全部读了一次，并且做了总结和实践，5，6月份由于全身心把时间精力扑在面试上，基本也面了全国绝大部分top10的公司，对一些概念和新知识点又有了明确的方向和目标。7月-8月时沉淀的2个月份，自己一个人独立完成一个独立社区的所有前端工作，到了9月底，自己又独立完成了一个电子商务平台的前端代码编写部分，总计最终代码量10W行【主要是js】。在其中对一些平时模糊不清的概念和一些没有接触过的组件又有了质的认识提高。在新公司期间对java，apache，nginx，linux还有vi的熟悉程度算是从工作开始到现在的扫盲阶段。一个月的时间不看js，只看prel和shell的基础还有linux常用命令，用了2周把vim的使用提升到工作环境，这些都是2011年从0开始的长进，虽然还是很菜。10月份左右开始接触nodejs，自己写了一个叫nodecombo的小玩具，并且对nodejs相关的知识点有了认识和自己的看法，增强了自己对web server的认知，还有对http socket协议等的全新扫盲。。。年底了，对自己工作文档总结的完成，编写了公司年会的一些活动页面特效和抽奖程序，并且再次更换工作环境，年后去sina啦……是机会也是挑战，全新的项目和新知识也再次面对了我。喔，忘记说了，在nodejs的编写过程中，由于使用了node canvas，也从0的canvas编写经验上突破了一小下……嗯，杂乱的东西很多，这简直就是让人发指的流水账。。</p>
<p>其他方面：北京-杭州-北京的多次迁徙，2次搬家，3次web标准交流的参加，1次nodejs聚会，大小10次面试，20于次电话面试，QQ里多了5个javascript群，猎头累积名单12，各公司HR联系方式也都收集了个遍。。。</p>
<p>生活：6月份认识到现在的女朋友一直相处到现在，突破了我恋爱时长最长的记录……，一年努力最后工资成功实现当年的treble，信用卡限额提高了一倍，欠款降低一倍，入手2个ipad，增加一个vps和N个还没过期的vpn，街头篮球盖帽全区最高记录29名。。存款尚无，还需努力，但是同期每月开始给家里寄钱了，是个好开始了。。</p>
<p>嗯，看起来2011年还算没有虚度，如果说倒退就是豆瓣账号连续又注销了2次。</p>
<p>嗯，大家好，我是小爝，2012年，我来了。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.designsor.com/2012/01/14/2011end/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>nodejs static server</title>
		<link>http://www.designsor.com/2011/12/18/nodejs-static-server/</link>
		<comments>http://www.designsor.com/2011/12/18/nodejs-static-server/#comments</comments>
		<pubDate>Sun, 18 Dec 2011 10:33:51 +0000</pubDate>
		<dc:creator>xiaojue</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[前端开发]]></category>
		<category><![CDATA[nodejs]]></category>

		<guid isPermaLink="false">http://www.designsor.com/?p=1141</guid>
		<description><![CDATA[额，文章地址请见： http://w3ctech.com/b/archives/749 就不再复制一遍了，然后，细节内容等版本稳定，或者全部完成了，会再贴。]]></description>
			<content:encoded><![CDATA[<p>额，文章地址请见：</p>
<p><a href="http://w3ctech.com/b/archives/749">http://w3ctech.com/b/archives/749</a></p>
<p>就不再复制一遍了，然后，细节内容等版本稳定，或者全部完成了，会再贴。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.designsor.com/2011/12/18/nodejs-static-server/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Godaddy Account Suspend</title>
		<link>http://www.designsor.com/2011/12/07/godaddy-account-suspend/</link>
		<comments>http://www.designsor.com/2011/12/07/godaddy-account-suspend/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 06:10:04 +0000</pubDate>
		<dc:creator>xiaojue</dc:creator>
				<category><![CDATA[notification]]></category>
		<category><![CDATA[Godaddy]]></category>

		<guid isPermaLink="false">http://www.designsor.com/?p=5</guid>
		<description><![CDATA[有一个不幸的消息，要告诉很多人，那就是，我的Godaddy账号因为之前某个同事的database过大，被Godaddy封停了服务，Ftp和mysql还有控制面板都上不去了，已经给了邮件进行沟通，目前在等待中，如果恢复了，我会联系所有人，去拿备份，然后在下一年，我这个GD空间就会停用，改用现在的VPS来进行服务和自己玩耍…… 恩，目前这个BLOG就是我在香港机房的VPS了，过一段时间GD服务启用申诉回来，看还能不能进行备份导入吧。总之，就先这样吧。]]></description>
			<content:encoded><![CDATA[<p>有一个不幸的消息，要告诉很多人，那就是，我的Godaddy账号因为之前某个同事的database过大，被Godaddy封停了服务，Ftp和mysql还有控制面板都上不去了，已经给了邮件进行沟通，目前在等待中，如果恢复了，我会联系所有人，去拿备份，然后在下一年，我这个GD空间就会停用，改用现在的VPS来进行服务和自己玩耍……</p>
<p>恩，目前这个BLOG就是我在香港机房的VPS了，过一段时间GD服务启用申诉回来，看还能不能进行备份导入吧。总之，就先这样吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.designsor.com/2011/12/07/godaddy-account-suspend/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>nodejs的自定义事件与简单原理实现</title>
		<link>http://www.designsor.com/2011/11/27/nodejs%e7%9a%84%e8%87%aa%e5%ae%9a%e4%b9%89%e4%ba%8b%e4%bb%b6%e4%b8%8e%e7%ae%80%e5%8d%95%e5%8e%9f%e7%90%86%e5%ae%9e%e7%8e%b0/</link>
		<comments>http://www.designsor.com/2011/11/27/nodejs%e7%9a%84%e8%87%aa%e5%ae%9a%e4%b9%89%e4%ba%8b%e4%bb%b6%e4%b8%8e%e7%ae%80%e5%8d%95%e5%8e%9f%e7%90%86%e5%ae%9e%e7%8e%b0/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 04:55:05 +0000</pubDate>
		<dc:creator>xiaojue</dc:creator>
				<category><![CDATA[随便写写]]></category>
		<category><![CDATA[customevents]]></category>
		<category><![CDATA[eventsEventEmitter]]></category>
		<category><![CDATA[nodejs]]></category>

		<guid isPermaLink="false">http://www.designsor.com/?p=1140</guid>
		<description><![CDATA[首先,我不想解释太多了……因为会用的人一般都知道怎么实现，针对node的话，node自身是提供了一个events的类，具体的api参见：http://nodejs.org/docs/v0.6.3/api/events.html 然后，针对它的使用方法，我是说给一个自己的类增加自定义事件的功能，文档没有细说，简单看下我的例子：https://gist.github.com/1396974 没有几行，在cnodejs上查到相应的解释，那个帖子说的有点模糊，也没解释清楚到底原理是什么。那么下面给出原声js的相应简单代替：https://gist.github.com/1396984 代码都很短，在一个类里实现run方法，然后自定义个触发的时机。主要想写给后端人员看，只实现了on和emit，至于其他的，大同小异。 接下来就是要自己封装一个自动产生拥有events功能的类的工厂方法，类似yui的base类了。唔。。。]]></description>
			<content:encoded><![CDATA[<p>首先,我不想解释太多了……因为会用的人一般都知道怎么实现，针对node的话，node自身是提供了一个events的类，具体的api参见：http://nodejs.org/docs/v0.6.3/api/events.html</p>
<p>然后，针对它的使用方法，我是说给一个自己的类增加自定义事件的功能，文档没有细说，简单看下我的例子：https://gist.github.com/1396974</p>
<p>没有几行，在cnodejs上查到相应的解释，那个帖子说的有点模糊，也没解释清楚到底原理是什么。那么下面给出原声js的相应简单代替：https://gist.github.com/1396984</p>
<p>代码都很短，在一个类里实现run方法，然后自定义个触发的时机。主要想写给后端人员看，只实现了on和emit，至于其他的，大同小异。</p>
<p>接下来就是要自己封装一个自动产生拥有events功能的类的工厂方法，类似yui的base类了。唔。。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.designsor.com/2011/11/27/nodejs%e7%9a%84%e8%87%aa%e5%ae%9a%e4%b9%89%e4%ba%8b%e4%bb%b6%e4%b8%8e%e7%ae%80%e5%8d%95%e5%8e%9f%e7%90%86%e5%ae%9e%e7%8e%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nodejs和linux历险记。</title>
		<link>http://www.designsor.com/2011/11/20/nodejs%e5%92%8clinux%e5%8e%86%e9%99%a9%e8%ae%b0%e3%80%82/</link>
		<comments>http://www.designsor.com/2011/11/20/nodejs%e5%92%8clinux%e5%8e%86%e9%99%a9%e8%ae%b0%e3%80%82/#comments</comments>
		<pubDate>Sun, 20 Nov 2011 14:25:28 +0000</pubDate>
		<dc:creator>xiaojue</dc:creator>
				<category><![CDATA[随便写写]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nodejs]]></category>

		<guid isPermaLink="false">http://www.designsor.com/?p=1131</guid>
		<description><![CDATA[距离上一次写blog又隔了好久，这次又回来更新了。最近一直在忙着吸收新知识，当然 是对于自己不了解的知识。 自从上次用vim代替aptana之后，对linux的文件操作，现在是一点问题没有了，配置插件和设置环境变量【当然都是ubuntu下】都一路顺畅，发现linux系统真的是开发利器，装什么都方便的不行，最最要紧的一点是，通过使用ubuntu进行代码开发，强迫我又去理解和查找了很多linux的常用操作命令和了解它的文件系统。总之，下面来做个总结吧。 常用命令就不说了，google一下，日常的文件夹文件操作，改名mv，移动mv，复制cp，删除rm，递归-r，查看树形tree，查找find，都木的问题。 简单的shell命令比如管道，I/O通道等，工具比如curl，grep，wget，ftp，scp等的使用。 vim与系统的数据交互，vim中多个文件同事编辑，diff，互相读取和粘贴，自定义map映射还有自定义调插件与命令行工具进行便利开发，所有这些，我都让我觉得，我爱上vim这玩意了，或者说，linux下的工作方式。 再然后，linux下git的使用，多个虚拟机（单位服务器，vps服务器，自己家ubuntu，单位虚拟机ubuntu的代码同步全靠他了，合并处理分支一系列的工作） 由于vps的不稳定，我也看了一些相关linux下备份系统的东东，由于linux根目录下的东西在不结束进程的情况下就可以自由备份，所以现在一个tar就可以搞定全部的工作，再配合shell的定时处理和ftp，每天将最新的系统备份到了其他的远程主机，比如公司服务器或者我gd的服务器。 丫真心的很是方便…… 再然后就是在linux下安装SpiderMonkey,进行js代码的实时运行，lint工作。安装各种开发套件，比如apache，nginx，node，java，php等。现在来看，我得感谢我的vps太干净了，连zip这种工具都要自己装，所以上面这些全部都是手动编译安装到系统的。又顺带了解到了许多之前不理解的文件夹结构，还有编译前的一些文件配置。【找资料当时找的头疼啊……】 当这些都搞定，我才开始在linux下学习开发以nodejs为基础的web应用~。 说到这里，我想解释一下，node火成现在这个样子，虽然我早在09年出了0.2版本左右的时候就知道有这么个东西了。。就是直到1周前才开始认真去学。 就不说学习的曲折路线了，官方和cnnode社区都给了完整的文档，新手指南和入门教程。源码和安装方法也是windows和linux都有，比较简单，一路走下来没有什么困难。主要下面说一些改变我认知的东西…… 当安装完nodejs，跑起来一个http服务的时候。我没任何感觉。。但是当我关掉apache之后，发现这个服务依然存在的时候，我才感觉到这玩意有点意思……。 在cnnode的群里人指导，下开始对node的服务进行apache的配置，其实nginx也是一个道理，把虚拟主机的配置和域名解析，反向代理都弄明白，基本的web开发知识也就是这个样子了，剩下就是配置了，不多说。 当架设好一个反向代理到node server的虚拟主机的时候，我成就感真的很大……当然那时候就只是一个hello world而已。但对于我这种菜鸟来说，你们懂的。 那么，下面开始进行开发了。读完整个node的官方文档和新手入门教程以后，知道了什么模块干什么的，模块的加载机制和如何编写自己的模块，基本就差不多了。语法和js一样，没的解释，写起来很流畅，web程序开发的过程一上来我就选择自己建立自己的mvc编码方式。 简单说一下，node的mvc，超级简单……我现在db层还没有写，但是v和c已经基本完成了。node的路由代码，应该所有网站都有介绍，配合mustache，我根本没有用到express……就把控制器和templates搞定了。虽然我的代码没express那么简洁，但是我觉得如果一上来就用各种框架，很难理解到node的精髓，就像你学js直接用jq开发一样，没意思。。 再然后db层，花了一下午的时候去看mongodb的资料，安装配置，以及简单的4个操作，增删改查……【对于我这种纯前端来说，也就是这个了】。mongodb为什么说和node配合最方便呢，node可以操作别的数据库，npm上应该各种模块都有，但是mongodb的shell居然就是用js的语法写的……包括各种sql。。好吧，那不用它还用啥？而且nosql和bson的方式也是第一次听说，详细看一下，我包你世界观又有改变。。，我在想如果再配合操作Memcache,又会如何呢，之后我会尝试。。 嗯，在写完几个简单的控制器和模板之后，我没有往m层走，而是转向去完成一个node版本的静态服务器，通过朴灵同学的这篇文章可以简单了解实现技术，我就不多说了。。最开始我实现的和他差不多，看过他的之后觉得他的那种方法更好。貌似是从老外的书上翻译来的……？看看你就知道了。http://cnodejs.org/blog/?p=3904 在这个的基础上，【其实我最开始没在他的基础上】我直接就开始搞combo了，写过php版本combo的人都知道，无非就是解析url，抓文件拼合，缓存，返回请求，都不复杂。 期间我自己被自己纠结到了： 就是I/O读取硬盘文件，然后装载到响应体的过程，我开始是要做内存缓存的，后来问了几个人，发现其他语言，都是木有做过cache的，我自己就琢磨要cache。。但是朴灵说：内存永远大不过硬盘。我立刻醒悟了…… 那就每次都直接去读吧。确实什么都装进内存，不太好，也不现实。 关于node的异步操作，很多没写过js的人可能不理解，这里我就可以跳来了，对与异步的理解个人觉得我还行。打算写一个自己简化版本的eventproxy实现。。 总之，在实现这个combo的时候，我了解大量以前前端根本不需要了解的知识点……包括对node的进程概念，server概念也是从无到有，逐渐建立起来了，很开心，又学到了。。【node的combo和其他语言不太一样，io是异步的，所以顺序很重要，之前写过一个前端的js加载器，所以这里实现起来很easy~，具体可以看我项目中的lithe v2的loader部分，无非就是异步操作同时发出，依赖关系列队处理，每次回调check列队，全部ok执行callback】 唔。好吧，先说这么多。由于好多东西很杂，我突然想记录一下自己的思绪，所以就这么写了，代码实现可以看github上的2个项目，一个node-board一个node-combo，当然都根本没有写完。。。 &#8211; -&#124;&#124; 但是总算架子搭起来了。 好，期待下周，能够搞定，由于都是业余时间在弄，进度不保准了……：） 写的很匆忙，睡觉了……有问题欢迎交流，我爱上node这货了。。]]></description>
			<content:encoded><![CDATA[<p>距离上一次写blog又隔了好久，这次又回来更新了。最近一直在忙着吸收新知识，当然 是对于自己不了解的知识。</p>
<p>自从上次用vim代替aptana之后，对linux的文件操作，现在是一点问题没有了，配置插件和设置环境变量【当然都是ubuntu下】都一路顺畅，发现linux系统真的是开发利器，装什么都方便的不行，最最要紧的一点是，通过使用ubuntu进行代码开发，强迫我又去理解和查找了很多linux的常用操作命令和了解它的文件系统。总之，下面来做个总结吧。</p>
<p>常用命令就不说了，google一下，日常的文件夹文件操作，改名mv，移动mv，复制cp，删除rm，递归-r，查看树形tree，查找find，都木的问题。</p>
<p>简单的shell命令比如管道，I/O通道等，工具比如curl，grep，wget，ftp，scp等的使用。</p>
<p>vim与系统的数据交互，vim中多个文件同事编辑，diff，互相读取和粘贴，自定义map映射还有自定义调插件与命令行工具进行便利开发，所有这些，我都让我觉得，我爱上vim这玩意了，或者说，linux下的工作方式。</p>
<p>再然后，linux下git的使用，多个虚拟机（单位服务器，vps服务器，自己家ubuntu，单位虚拟机ubuntu的代码同步全靠他了，合并处理分支一系列的工作）</p>
<p>由于vps的不稳定，我也看了一些相关linux下备份系统的东东，由于linux根目录下的东西在不结束进程的情况下就可以自由备份，所以现在一个tar就可以搞定全部的工作，再配合shell的定时处理和ftp，每天将最新的系统备份到了其他的远程主机，比如公司服务器或者我gd的服务器。</p>
<p>丫真心的很是方便……</p>
<p>再然后就是在linux下安装SpiderMonkey,进行js代码的实时运行，lint工作。安装各种开发套件，比如apache，nginx，node，java，php等。现在来看，我得感谢我的vps太干净了，连zip这种工具都要自己装，所以上面这些全部都是手动编译安装到系统的。又顺带了解到了许多之前不理解的文件夹结构，还有编译前的一些文件配置。【找资料当时找的头疼啊……】</p>
<p>当这些都搞定，我才开始在linux下学习开发以nodejs为基础的web应用~。</p>
<p>说到这里，我想解释一下，node火成现在这个样子，虽然我早在09年出了0.2版本左右的时候就知道有这么个东西了。。就是直到1周前才开始认真去学。</p>
<p>就不说学习的曲折路线了，官方和cnnode社区都给了完整的文档，新手指南和入门教程。源码和安装方法也是windows和linux都有，比较简单，一路走下来没有什么困难。主要下面说一些改变我认知的东西……</p>
<p>当安装完nodejs，跑起来一个http服务的时候。我没任何感觉。。但是当我关掉apache之后，发现这个服务依然存在的时候，我才感觉到这玩意有点意思……。</p>
<p>在cnnode的群里人指导，下开始对node的服务进行apache的配置，其实nginx也是一个道理，把虚拟主机的配置和域名解析，反向代理都弄明白，基本的web开发知识也就是这个样子了，剩下就是配置了，不多说。</p>
<p>当架设好一个反向代理到node server的虚拟主机的时候，我成就感真的很大……当然那时候就只是一个hello world而已。但对于我这种菜鸟来说，你们懂的。</p>
<p>那么，下面开始进行开发了。读完整个node的官方文档和新手入门教程以后，知道了什么模块干什么的，模块的加载机制和如何编写自己的模块，基本就差不多了。语法和js一样，没的解释，写起来很流畅，web程序开发的过程一上来我就选择自己建立自己的mvc编码方式。</p>
<p>简单说一下，node的mvc，超级简单……我现在db层还没有写，但是v和c已经基本完成了。node的路由代码，应该所有网站都有介绍，配合mustache，我根本没有用到express……就把控制器和templates搞定了。虽然我的代码没express那么简洁，但是我觉得如果一上来就用各种框架，很难理解到node的精髓，就像你学js直接用jq开发一样，没意思。。</p>
<p>再然后db层，花了一下午的时候去看mongodb的资料，安装配置，以及简单的4个操作，增删改查……【对于我这种纯前端来说，也就是这个了】。mongodb为什么说和node配合最方便呢，node可以操作别的数据库，npm上应该各种模块都有，但是mongodb的shell居然就是用js的语法写的……包括各种sql。。好吧，那不用它还用啥？而且nosql和bson的方式也是第一次听说，详细看一下，我包你世界观又有改变。。，我在想如果再配合操作Memcache,又会如何呢，之后我会尝试。。</p>
<p>嗯，在写完几个简单的控制器和模板之后，我没有往m层走，而是转向去完成一个node版本的静态服务器，通过朴灵同学的这篇文章可以简单了解实现技术，我就不多说了。。最开始我实现的和他差不多，看过他的之后觉得他的那种方法更好。貌似是从老外的书上翻译来的……？看看你就知道了。<a href="http://cnodejs.org/blog/?p=3904">http://cnodejs.org/blog/?p=3904</a></p>
<p>在这个的基础上，【其实我最开始没在他的基础上】我直接就开始搞combo了，写过php版本combo的人都知道，无非就是解析url，抓文件拼合，缓存，返回请求，都不复杂。</p>
<p>期间我自己被自己纠结到了：</p>
<p>就是I/O读取硬盘文件，然后装载到响应体的过程，我开始是要做内存缓存的，后来问了几个人，发现其他语言，都是木有做过cache的，我自己就琢磨要cache。。但是朴灵说：内存永远大不过硬盘。我立刻醒悟了……</p>
<p>那就每次都直接去读吧。确实什么都装进内存，不太好，也不现实。</p>
<p>关于node的异步操作，很多没写过js的人可能不理解，这里我就可以跳来了，对与异步的理解个人觉得我还行。打算写一个自己简化版本的eventproxy实现。。</p>
<p>总之，在实现这个combo的时候，我了解大量以前前端根本不需要了解的知识点……包括对node的进程概念，server概念也是从无到有，逐渐建立起来了，很开心，又学到了。。【node的combo和其他语言不太一样，io是异步的，所以顺序很重要，之前写过一个前端的js加载器，所以这里实现起来很easy~，具体可以看我项目中的lithe v2的loader部分，无非就是异步操作同时发出，依赖关系列队处理，每次回调check列队，全部ok执行callback】</p>
<p>唔。好吧，先说这么多。由于好多东西很杂，我突然想记录一下自己的思绪，所以就这么写了，代码实现可以看github上的2个项目，一个node-board一个node-combo，当然都根本没有写完。。。 &#8211; -||</p>
<p>但是总算架子搭起来了。</p>
<p>好，期待下周，能够搞定，由于都是业余时间在弄，进度不保准了……：）</p>
<p>写的很匆忙，睡觉了……有问题欢迎交流，我爱上node这货了。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.designsor.com/2011/11/20/nodejs%e5%92%8clinux%e5%8e%86%e9%99%a9%e8%ae%b0%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>最近用vim替代了aptana，感觉一切良好。</title>
		<link>http://www.designsor.com/2011/09/13/%e6%9c%80%e8%bf%91%e7%94%a8vim%e6%9b%bf%e4%bb%a3%e4%ba%86aptana%ef%bc%8c%e6%84%9f%e8%a7%89%e4%b8%80%e5%88%87%e8%89%af%e5%a5%bd%e3%80%82/</link>
		<comments>http://www.designsor.com/2011/09/13/%e6%9c%80%e8%bf%91%e7%94%a8vim%e6%9b%bf%e4%bb%a3%e4%ba%86aptana%ef%bc%8c%e6%84%9f%e8%a7%89%e4%b8%80%e5%88%87%e8%89%af%e5%a5%bd%e3%80%82/#comments</comments>
		<pubDate>Tue, 13 Sep 2011 05:19:18 +0000</pubDate>
		<dc:creator>xiaojue</dc:creator>
				<category><![CDATA[随便写写]]></category>
		<category><![CDATA[aptana]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[前端开发环境]]></category>

		<guid isPermaLink="false">http://www.designsor.com/?p=1124</guid>
		<description><![CDATA[继续之前的vim小节，在对vim和vi有了初步认识之后，真心的觉得vim比什么eclipse，aptana，dreamweaver之类牛逼太多。虽然刚开始上手难受了一点，虽然现在有些时候还会被一些小问题纠结住，但总的使用了一周后感觉良好。 下面把配置文件再扔出来一次： set nocompatible source $VIMRUNTIME/vimrc_example.vim source $VIMRUNTIME/mswin.vim behave mswin set diffexpr=MyDiff() function MyDiff() let opt = '-a --binary ' if &#38;diffopt =~ 'icase' &#124; let opt = opt . '-i ' &#124; endif if &#38;diffopt =~ 'iwhite' &#124; let opt = opt . '-b ' &#124; endif let arg1 = v:fname_in if arg1 =~ [...]]]></description>
			<content:encoded><![CDATA[<p>继续之前的vim小节，在对vim和vi有了初步认识之后，真心的觉得vim比什么eclipse，aptana，dreamweaver之类牛逼太多。虽然刚开始上手难受了一点，虽然现在有些时候还会被一些小问题纠结住，但总的使用了一周后感觉良好。</p>
<p>下面把配置文件再扔出来一次：</p>
<pre lang="javascript">set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
function MyDiff()
  let opt = '-a --binary '
  if &amp;diffopt =~ 'icase' | let opt = opt . '-i ' | endif
  if &amp;diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
  let arg1 = v:fname_in
  if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
  let arg2 = v:fname_new
  if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
  let arg3 = v:fname_out
  if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
  let eq = ''
  if $VIMRUNTIME =~ ' '
    if &amp;sh =~ ' ' . arg3 . eq
endfunction

"配色
colorscheme slate
"字体
set guifont=Bitstream_Vera_Sans_Mono:h10:cANSI
"行号,行号栏目宽度
set nu
set numberwidth=2
"tab长度
set tabstop=2
"自动对齐
set autoindent
"语法高亮
syntax on
"设置gbk字符会有编码问题，设置字符集
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
"行间距
set linespace=2
"&lt;&gt;调整缩进时的长度
set shiftwidth=2
"初始化窗口宽度高度
set columns=150
set lines=30
"初始化窗口位置
winpos 52 42

"禁止自动换行
set nowrap
"在输入命令时列出匹配项目
set wildmenu
"显示光标位置
set ruler
"分割窗口保持相等宽高
set equalalways

"匹配括号规则，增加html的&lt;&gt;
set matchpairs=(:),{:},[:],&lt;:&gt;
"让退格，空格，上下箭头遇到行首位自动移到下一行(包括insert模式)
set whichwrap=b,s,&lt;,&gt;,[,]
"取消自动备份
set nobackup
"关闭文件之前保留一个备份
set writebackup

"js语法高亮脚本
let g:javascript_enable_domhtmlcss=1

"光标准星
set cursorline
hi cursorline guibg=NONE gui=underline
set cursorcolumn
hi cursorcolum gui=underline

"自动修改
set autoread

"不明字体宽度，按照double的来
set ambiwidth=double
"打开javascript折叠
"
setlocal foldlevel=1
let g:tlist_javascript_settings = 'javascript;s:string;a:array;o:object;f:function;m:member'
let b:javascript_fold=1  "开启折叠
"自动补齐括号等
:inoremap ( ()i
:inoremap ) =ClosePair(')')
:inoremap { {}O
:inoremap } =ClosePair('}')
:inoremap [ []i
:inoremap ] =ClosePair(']')
:inoremap " ""i
:inoremap ' ''i

function ClosePair(char)
  if getline('.')[col('.') - 1] == a:char
      return "/"
  else
      return a:char
  endif
endfunction

"自动补齐html"
function! InsertHtmlTag()
        let pat = 'c&lt;w+s*(s+w+s*=s*[''#$;,()."a-z0-9]+)*s*&gt;'
        normal! a&gt;
        let save_cursor = getpos('.')
        let result = matchstr(getline(save_cursor[1]), pat)
        "if (search(pat, 'b', save_cursor[1]) &amp;&amp; searchpair('&lt;','','&gt;','bn',0,  getline('.')) &gt; 0)
        if (search(pat, 'b', save_cursor[1]))
           normal! lyiwf&gt;
           normal! a<!--            normal! p            normal! a-->
        endif
        :call cursor(save_cursor[1], save_cursor[2], save_cursor[3])
endfunction
inoremap &gt; :call InsertHtmlTag()a

"半透明设置"
au GUIEnter * call libcallnr("vimtweak.dll", "SetAlpha", 234)
"git 配置"
set laststatus=2
set statusline=%{GitBranch()}

command Gogm cd E:apachehtdocsgm
</pre>
<p>看注释就明白了，简单说一下目前我觉得足够用的功能，其实都是想到了现google搜的，全部解决。然后在淘宝师傅给我的vim键盘表也排上了用场，这里也要谢谢猥琐的师傅啊……- -</p>
<p>简单说一下，之前用aptana主要是使用他得js，css，html代码提示功能。在vim里，用ctrl+n和p其实是可以直接调用的，牛逼的是提示不区分语言，而是从缓存里直接去读，甚至目录，我当时就被震惊了……这尼玛还要什么代码提示，先开一个jquery源文件，然后再写jq代码，确实是爽的不行,之后又安装了自动弹出提示的插件，感觉比那半残的aptana不知道好多少……。</p>
<p>然后是自定义的命令使用，每次打开vim都要cd一堆到我的工作目录，然后再开启目录树那个NERDTree插件，后来编辑了直接cd到目录的快捷命令，方便很多了，再之后调用bat脚本，直接！强制执行就OK了……更是便捷……再最后，增加括号补全，自动保存，一些颜色配置等，视觉效果比aptana牛逼多了，而且半透明的界面有时候还可以边抄边写代码。。。真是不错- -||</p>
<p>最后在aptana下有一个localstore，是我比较喜欢的，最后在vim下安装了git-vim插件，再也不用开bash界面了，再也不用再bash界面看恶心的diff了。。真是……而且也强迫了我把gitpro前面入门的章节看完了。。- -|| 总之 store的东西也就这样解决了~</p>
<p>周末用vim正则帮媳妇处理文本，1800多个ctrl+v，c，十几分钟就被搞定了……</p>
<p>我知道vim还有很多更强大的命令，期待以后慢慢挖掘……耶，哥终于转型vimer了……~发个文章，庆祝一下，而且新到的《学习vi，vim编辑器》也送到了~灭哈哈O(∩_∩)O~等着哥的读书笔记吧。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.designsor.com/2011/09/13/%e6%9c%80%e8%bf%91%e7%94%a8vim%e6%9b%bf%e4%bb%a3%e4%ba%86aptana%ef%bc%8c%e6%84%9f%e8%a7%89%e4%b8%80%e5%88%87%e8%89%af%e5%a5%bd%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>html5全局属性spellcheck</title>
		<link>http://www.designsor.com/2011/09/11/html5%e5%85%a8%e5%b1%80%e5%b1%9e%e6%80%a7spellcheck/</link>
		<comments>http://www.designsor.com/2011/09/11/html5%e5%85%a8%e5%b1%80%e5%b1%9e%e6%80%a7spellcheck/#comments</comments>
		<pubDate>Sun, 11 Sep 2011 07:34:20 +0000</pubDate>
		<dc:creator>xiaojue</dc:creator>
				<category><![CDATA[随便写写]]></category>

		<guid isPermaLink="false">http://www.designsor.com/?p=1118</guid>
		<description><![CDATA[顾名思义，拼写检查。 不多说，截图看一下说明问题： 设置元素的这个属性为false即可关闭拼写检查： 默认为true值，如果设置为readonly或者disabled，则默认为false。 除了ie之外，ff，chrome，safari，opera都支持~ 经常有产品或者测试问我这货是什么，这次你们都知道怎么和他们解释了吧，你妹的…… 同样还有chrome的元素outline（焦点移上带个黄色或者红色边框），max-height，max-width属性（textare的自带拖拽高宽）等小细节，经常让一些测试用chrome的时候感到迷茫，甚至给你提bug，真哭笑不得，可能要怪就怪浏览器帮你做的太多了吧。。。无奈。]]></description>
			<content:encoded><![CDATA[<p>顾名思义，拼写检查。</p>
<p>不多说，截图看一下说明问题：</p>
<p><a href="http://www.designsor.com/wp-content/uploads/2011/09/spellcheck.jpg"><img class="alignnone size-full wp-image-1119" title="spellcheck" src="http://www.designsor.com/wp-content/uploads/2011/09/spellcheck.jpg" alt="" width="314" height="70" /></a></p>
<p>设置元素的这个属性为false即可关闭拼写检查：</p>
<p><a href="http://www.designsor.com/wp-content/uploads/2011/09/spellcheck2.jpg"><img class="alignnone size-full wp-image-1120" title="spellcheck" src="http://www.designsor.com/wp-content/uploads/2011/09/spellcheck2.jpg" alt="" width="204" height="56" /></a></p>
<p>默认为true值，如果设置为readonly或者disabled，则默认为false。</p>
<p>除了ie之外，ff，chrome，safari，opera都支持~</p>
<p>经常有产品或者测试问我这货是什么，这次你们都知道怎么和他们解释了吧，你妹的……</p>
<p>同样还有chrome的元素outline（焦点移上带个黄色或者红色边框），max-height，max-width属性（textare的自带拖拽高宽）等小细节，经常让一些测试用chrome的时候感到迷茫，甚至给你提bug，真哭笑不得，可能要怪就怪浏览器帮你做的太多了吧。。。无奈。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.designsor.com/2011/09/11/html5%e5%85%a8%e5%b1%80%e5%b1%9e%e6%80%a7spellcheck/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>到底是学python还是学java…</title>
		<link>http://www.designsor.com/2011/08/30/%e5%88%b0%e5%ba%95%e6%98%af%e5%ad%a6python%e8%bf%98%e6%98%af%e5%ad%a6java%e2%80%a6/</link>
		<comments>http://www.designsor.com/2011/08/30/%e5%88%b0%e5%ba%95%e6%98%af%e5%ad%a6python%e8%bf%98%e6%98%af%e5%ad%a6java%e2%80%a6/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 09:30:55 +0000</pubDate>
		<dc:creator>xiaojue</dc:creator>
				<category><![CDATA[随便写写]]></category>

		<guid isPermaLink="false">http://www.designsor.com/?p=1113</guid>
		<description><![CDATA[最近越来越需要选择一门比较好，全能型的后端编程语言来学习了，javascript虽然万能，但是写了这么久，虽然自身不足还很多，但是多触类旁通一些别的编程语言，我相信对自己是有利无害的。以前目标订的比较大，想学as，想学python，想学c，想学ruby，想学nodejs，啥我都想学……= = 但是其实匆匆扫过一遍，我发现，到底选哪个真的不是谁告诉你好，就真的好了，还是需要你自己亲自去尝试。 之前我看jsdoc里通过rhino.jar给java扩展的一些js方法，让我对java又重拾了好感，搜索了一圈，发现java也具有自己的一些特点和特性，虽然10个程序员9个java男，但是我相信这么流行他是有理由的。 明确需求吧，我需要一个能做软件，能辅助做小工具，能做web又能做客户端的语言。其实java,python,ruby,c,.net是都满足的，那么好吧，这几天我会以此尝试用这几个语言编写同一段代码实现功能，来自我感受。 那这篇文章就先写对python和java的感觉： 我定制了一个小目标，虽然涵盖不是特别全，但是却都是我感兴趣的知识点-遍历一个目录，然后给目录的文件批量增加时间戳。 OK，就这么个功能，看下代码吧 java的代码 //package java.my.util; import java.util.Date; import java.io.*; public class ReadFile { public interface CallBack{ String callname(String fliename); } private static String[] ReadFolderName(String src) { File flie = new File(src); String[] names = flie.list(); return names; } private static File[] ReadFolder(String src) { File flie = new File(src); [...]]]></description>
			<content:encoded><![CDATA[<p>最近越来越需要选择一门比较好，全能型的后端编程语言来学习了，javascript虽然万能，但是写了这么久，虽然自身不足还很多，但是多触类旁通一些别的编程语言，我相信对自己是有利无害的。以前目标订的比较大，想学as，想学python，想学c，想学ruby，想学nodejs，啥我都想学……= =</p>
<p>但是其实匆匆扫过一遍，我发现，到底选哪个真的不是谁告诉你好，就真的好了，还是需要你自己亲自去尝试。</p>
<p>之前我看jsdoc里通过rhino.jar给java扩展的一些js方法，让我对java又重拾了好感，搜索了一圈，发现java也具有自己的一些特点和特性，虽然10个程序员9个java男，但是我相信这么流行他是有理由的。</p>
<p>明确需求吧，我需要一个能做软件，能辅助做小工具，能做web又能做客户端的语言。其实java,python,ruby,c,.net是都满足的，那么好吧，这几天我会以此尝试用这几个语言编写同一段代码实现功能，来自我感受。</p>
<p>那这篇文章就先写对python和java的感觉：</p>
<p>我定制了一个小目标，虽然涵盖不是特别全，但是却都是我感兴趣的知识点-遍历一个目录，然后给目录的文件批量增加时间戳。</p>
<p>OK，就这么个功能，看下代码吧</p>
<p>java的代码</p>
<pre lang="java">//package java.my.util;
import java.util.Date;
import java.io.*;
public class ReadFile
{
	public interface CallBack{
		String callname(String fliename);
	}
	private static String[] ReadFolderName(String src)
	{
		File flie = new File(src);
		String[] names = flie.list();
		return names;
	}
	private static File[] ReadFolder(String src)
	{
		File flie = new File(src);
		File[] files = flie.listFiles();
		return files;
	}
	private static void ChangeName(String src,CallBack callback){
		String[] names=ReadFile.ReadFolderName(src);
		File[] files=ReadFile.ReadFolder(src);
		for(int i=0;i&lt;files.length;i++){
			String newname = callback.callname(names[i]);
			files[i].renameTo(new File(src+"/"+newname));
		}
	}
	public static void main (String arg[])
	{
		ReadFile.ChangeName("../src/js",new CallBack(){
			public String callname(String fliename){
				Date date = new Date();
				long time = date.getTime();
				String newname = "";
				int dot = fliename.indexOf(".");
				String fordname = fliename.substring(0,dot);
				String remnant = fliename.substring(dot,fliename.length());
				int isAdd = fliename.indexOf("-");

				if(isAdd == -1){
					newname = fordname + "-" + time + remnant;
				}else{
					fordname = fliename.substring(0,isAdd);
					newname = fordname + "-" + time + remnant;
				}

				return newname;
		}
		});
	}
}
</pre>
<p>python代码:</p>
<pre lang="python">import os
import yaml
import string
import time

RootPath = os.getcwd()
configFile = open(RootPath + 'config.yaml')

CG = yaml.load(configFile)

def addstrftime(name):
  t = time.strftime('%Y%m%d%H%M%S',time.gmtime())
  if string.find(name,'-') != -1:
    oldname=string.split(name,'-')[0]
    return oldname+'-'+str(t)
  return name+'-'+str(t) 

def changeAllFileName (path, remnant = '' , callback = None):
  for filename in os.listdir(path):
    diction=string.split(filename,'.')
    if callback==None:
      name=diction[0]
    else:
      name=callback(diction[0])
    if remnant=='':
      remnant=diction[1]
    os.rename(path+filename,path+name+'.'+remnant)

changeAllFileName(CG['jsroot'],'css',addstrftime)
</pre>
<p>我是先写的python的代码，后写的java的代码，然后我就觉得我真不能写java，虽然上手感觉也不难，不得不说，写习惯了js，写别的语言，咔咔咔就可以引进一坨的工具包的感觉确实很爽。读取本地文件，配置文件也相当痛快，好吧，允许我这个没写过多少后台代码的人感叹一下吧= =。</p>
<p>然后就是对比2个语言，明显python的代码实现的更短，支持函数传参回调，当然java我也实现了，但是比较恶心，后来问了朋友，说java支持对象和整型，你要传函数就是不可以- -，python的话，代码写的少，简洁优雅，java的话类型太复杂- -。我写一会就觉得好讨厌，啥玩意都要先来个类型，怪不得以前的java男们总会问我，这个js支持不支持这个类型的参数？o，mygod- &#8211; 我当然知道这是避免报错，你看看连方法都要标明是不是void还是return回什么。。写习惯了js，我确实不习惯，但是我也知道，java男们从一入门就开始各种面向对象了，确实不易- -||</p>
<p>引用工具包得方法大同小异，就语言来说，写到这里已经决定了，我肯定是要搞python了，但是java的优点，从那个小例子也看的出来，强迫你写通用的东西，强迫你知道自己在干什么，强迫你搞单元测试，强迫你养成一些基础的编程习惯，就我看来也挺好的。</p>
<p>python相对更灵活，更贴近我现在写的js，当然他们说ruby更贴近，等我过几天把c和ruby的版本搬上来，再看吧。总之……╮(╯▽╰)╭，我也发现了，无论什么东西，其实任何语言都可以实现的，还是看个人喜好，和对“真正”的编程，理解又有多深了。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.designsor.com/2011/08/30/%e5%88%b0%e5%ba%95%e6%98%af%e5%ad%a6python%e8%bf%98%e6%98%af%e5%ad%a6java%e2%80%a6/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>如何在jquery的基础上构建一个中间层</title>
		<link>http://www.designsor.com/2011/08/22/%e5%a6%82%e4%bd%95%e5%9c%a8jquery%e7%9a%84%e5%9f%ba%e7%a1%80%e4%b8%8a%e6%9e%84%e5%bb%ba%e4%b8%80%e4%b8%aa%e4%b8%ad%e9%97%b4%e5%b1%82/</link>
		<comments>http://www.designsor.com/2011/08/22/%e5%a6%82%e4%bd%95%e5%9c%a8jquery%e7%9a%84%e5%9f%ba%e7%a1%80%e4%b8%8a%e6%9e%84%e5%bb%ba%e4%b8%80%e4%b8%aa%e4%b8%ad%e9%97%b4%e5%b1%82/#comments</comments>
		<pubDate>Mon, 22 Aug 2011 02:43:37 +0000</pubDate>
		<dc:creator>xiaojue</dc:creator>
				<category><![CDATA[随便写写]]></category>

		<guid isPermaLink="false">http://www.designsor.com/?p=1108</guid>
		<description><![CDATA[新岗位工作有快一个月了，一个月的产出和工作效率，用一个词来形容就是“荒芜”。意思是，啥积累都木有，零散的页面中的js脚本，和一些根本都没人实现的工作，在一来到这边就开始马不停蹄的开发了。 面对这样的情况，快速实现需求肯定是第一位的了。基于jquery1.6.2的一套自己设计的业务层，就这么被匆忙搭建起来了。 在进行搭架子的时候，最开始想到的是代码的版本管理，由于这边的服务器静态文件没有设置svn，所以我全部本地使用git+localhistory的方法管理自己的代码，由于现在开发人员只是我一个人，这种方式还算说的过去，以后人多了可以直接用git进行多人协作。于是申请了新的git代码仓库： https://github.com/xiaojue/goodmedia 嗯，目录结构很清晰我自己简单解释一下，里面很多的东西都不完善…… bulid是存放最后打包完的源码，打包采取ANT的方式。css是存放全站样式表的地方，每次bulid都会下载最新的，每次update都会上传本地我最新的。demo是存放一些简单的本地调试例子的，jquery存放jquery源码，php里存放一些本地调试需要的php脚本文件，src存放gm的源码，test里存放测试代码，(这里没有使用测试框架，只是简单的测试例子，可以也理解成demo，后期会转换成统一的测试用例)，tool一些自动化工具，xdoc是xweibo的文档【项目里有用到】，xwb放得是xweibo的源码，doc存放的是以后gm的说明文档。 架子搭好，我们主要来说src这一部分： src里分了4个目录，core主要维护核心的gm对象，widget一些通用性较强的组件，tools经常使用到的工具方法，apps一些通用性不强的单独代码文件。 最开始设计就是这样的，因为底层有jquery强大的支持，很多东西都不用自己写了，所以core主要维护中间层的组织关系和加载方式，调试等。widget和apps是2个对应关系的目录，一个有通用性，一个无通用性【大部分业务代码】，而tools则属于非常常用的方法集合，直接和core捆绑打包成最后的文件。通过这4个目录最后集成的这个东东，我叫它是js的一个中间层。 因为他们之间是有联系，又可以相互之间扩展通讯的，主要看下core目前的样子： https://github.com/xiaojue/goodmedia/blob/master/src/core/GMcore.js 很简单，以后可能还会扩展方法，目前来说就是用来维护命名空间，定义widget和apps的加载和协议方式，还有一些区分debug和本地开发调试的判断. 而这里widget在最开始我也是打包进最后的文件中的，但是发现它的通用性并不那么强，所以后来又增加了use方法来按需调用： 他和apps的require方法大同小异，这里单说require方法吧，所有的apps目录下的js文件书写是要按照一定的规格的，这里简单引用了一下commonjs的规范，对require进来的js文件，回调中使用exports这个通用接口来使用方法。 例如,随便起一个新的app，那么它初始的代码一定是这样子的： (function(W,G){ var newapp=function(){ //放置似有属性和方法 return{ exports:{} //存放对外接口。 } }(); if(G &#038;&#038; G.apps) G.apps.newapp=newapp; //挂在到相应命名空间。 })(window,GM) 再看那个gm的require方法： GM.apps.require=function(appname,callback){ var appuri = GM.host + 'apps/'+appname+'/'+appname+'-min.js'; if(GM.debug) appuri=locality(appuri); $(function(){ $.getScript(appuri,function(){ if(callback) callback(GM.apps[appname]['exports']) }); }); } 这里在getscript之后的回调中，只暴露了我们事先设置好的exports作为统一的模块接口。 那么好，简单的模块式开发的设计就这样完成了……余下的时间就可以专心的分文件编写我们的各种级别代码了。 最后我们用ant进行统一的打包，压缩，部署，这个是老生常谈了，具体可以看我的bulid文件，其中有一个地方要注意，就是在调试或者开发阶段，如何能快速的在线上看到效果而不用每次都跑一下bat脚本，然后等待呢？ 嗯，开一个debug，然后路径引用本地相应的src文件就ok了，但是这里只能让apps和widget下的有效，tools和core的还是需要重新打包，日后我可能还会把他们全部拆开，只用一个种子文件进行部署，那么就都可以解决了，学的yui么.. 其他的相关代码就没什么好讲的了，都是些应用级别的了~以后要继续完善的就是测试和文档这一块，再然后就是拆分更细的粒度，我感觉有点像kissy啊- -可是我毕竟没那么强大，恩，缺的东西还很多，毕竟jquery阻止代码这一块并不是做的最好的，噢，最后一点，所有的tools都最后用jquery的插件开发模式绑定到jquery对象上了，换句话说，每个tools里的js文件，以后单拆出来，就是一个jquery插件~ 恩，期待自己下个月的表现&#8230;]]></description>
			<content:encoded><![CDATA[<p>新岗位工作有快一个月了，一个月的产出和工作效率，用一个词来形容就是“荒芜”。意思是，啥积累都木有，零散的页面中的js脚本，和一些根本都没人实现的工作，在一来到这边就开始马不停蹄的开发了。</p>
<p>面对这样的情况，快速实现需求肯定是第一位的了。基于jquery1.6.2的一套自己设计的业务层，就这么被匆忙搭建起来了。</p>
<p>在进行搭架子的时候，最开始想到的是代码的版本管理，由于这边的服务器静态文件没有设置svn，所以我全部本地使用git+localhistory的方法管理自己的代码，由于现在开发人员只是我一个人，这种方式还算说的过去，以后人多了可以直接用git进行多人协作。于是申请了新的git代码仓库：</p>
<p>https://github.com/xiaojue/goodmedia</p>
<p>嗯，目录结构很清晰我自己简单解释一下，里面很多的东西都不完善……</p>
<p>bulid是存放最后打包完的源码，打包采取ANT的方式。css是存放全站样式表的地方，每次bulid都会下载最新的，每次update都会上传本地我最新的。demo是存放一些简单的本地调试例子的，jquery存放jquery源码，php里存放一些本地调试需要的php脚本文件，src存放gm的源码，test里存放测试代码，(这里没有使用测试框架，只是简单的测试例子，可以也理解成demo，后期会转换成统一的测试用例)，tool一些自动化工具，xdoc是xweibo的文档【项目里有用到】，xwb放得是xweibo的源码，doc存放的是以后gm的说明文档。</p>
<p>架子搭好，我们主要来说src这一部分：</p>
<p>src里分了4个目录，core主要维护核心的gm对象，widget一些通用性较强的组件，tools经常使用到的工具方法，apps一些通用性不强的单独代码文件。</p>
<p>最开始设计就是这样的，因为底层有jquery强大的支持，很多东西都不用自己写了，所以core主要维护中间层的组织关系和加载方式，调试等。widget和apps是2个对应关系的目录，一个有通用性，一个无通用性【大部分业务代码】，而tools则属于非常常用的方法集合，直接和core捆绑打包成最后的文件。通过这4个目录最后集成的这个东东，我叫它是js的一个中间层。</p>
<p>因为他们之间是有联系，又可以相互之间扩展通讯的，主要看下core目前的样子：</p>
<p>https://github.com/xiaojue/goodmedia/blob/master/src/core/GMcore.js</p>
<p>很简单，以后可能还会扩展方法，目前来说就是用来维护命名空间，定义widget和apps的加载和协议方式，还有一些区分debug和本地开发调试的判断.</p>
<p>而这里widget在最开始我也是打包进最后的文件中的，但是发现它的通用性并不那么强，所以后来又增加了use方法来按需调用：</p>
<p>他和apps的require方法大同小异，这里单说require方法吧，所有的apps目录下的js文件书写是要按照一定的规格的，这里简单引用了一下commonjs的规范，对require进来的js文件，回调中使用exports这个通用接口来使用方法。</p>
<p>例如,随便起一个新的app，那么它初始的代码一定是这样子的：</p>
<pre lang="javascript">
(function(W,G){
   var newapp=function(){
        //放置似有属性和方法
        return{
            exports:{} //存放对外接口。
        }
   }();
if(G &#038;&#038; G.apps) G.apps.newapp=newapp; //挂在到相应命名空间。
})(window,GM)
</pre>
<p>再看那个gm的require方法：</p>
<pre lang="javascript">
GM.apps.require=function(appname,callback){
  var appuri = GM.host + 'apps/'+appname+'/'+appname+'-min.js';
	if(GM.debug) appuri=locality(appuri);
	$(function(){
		$.getScript(appuri,function(){
			if(callback) callback(GM.apps[appname]['exports'])
		});
	});
}
</pre>
<p>这里在getscript之后的回调中，只暴露了我们事先设置好的exports作为统一的模块接口。</p>
<p>那么好，简单的模块式开发的设计就这样完成了……余下的时间就可以专心的分文件编写我们的各种级别代码了。<br />
最后我们用ant进行统一的打包，压缩，部署，这个是老生常谈了，具体可以看我的bulid文件，其中有一个地方要注意，就是在调试或者开发阶段，如何能快速的在线上看到效果而不用每次都跑一下bat脚本，然后等待呢？</p>
<p>嗯，开一个debug，然后路径引用本地相应的src文件就ok了，但是这里只能让apps和widget下的有效，tools和core的还是需要重新打包，日后我可能还会把他们全部拆开，只用一个种子文件进行部署，那么就都可以解决了，学的yui么..</p>
<p>其他的相关代码就没什么好讲的了，都是些应用级别的了~以后要继续完善的就是测试和文档这一块，再然后就是拆分更细的粒度，我感觉有点像kissy啊- -可是我毕竟没那么强大，恩，缺的东西还很多，毕竟jquery阻止代码这一块并不是做的最好的，噢，最后一点，所有的tools都最后用jquery的插件开发模式绑定到jquery对象上了，换句话说，每个tools里的js文件，以后单拆出来，就是一个jquery插件~</p>
<p>恩，期待自己下个月的表现&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.designsor.com/2011/08/22/%e5%a6%82%e4%bd%95%e5%9c%a8jquery%e7%9a%84%e5%9f%ba%e7%a1%80%e4%b8%8a%e6%9e%84%e5%bb%ba%e4%b8%80%e4%b8%aa%e4%b8%ad%e9%97%b4%e5%b1%82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何创建一个可以永远在顶层的浮动层。</title>
		<link>http://www.designsor.com/2011/08/21/%e5%a6%82%e4%bd%95%e5%88%9b%e5%bb%ba%e4%b8%80%e4%b8%aa%e5%8f%af%e4%bb%a5%e6%b0%b8%e8%bf%9c%e5%9c%a8%e9%a1%b6%e5%b1%82%e7%9a%84%e6%b5%ae%e5%8a%a8%e5%b1%82%e3%80%82/</link>
		<comments>http://www.designsor.com/2011/08/21/%e5%a6%82%e4%bd%95%e5%88%9b%e5%bb%ba%e4%b8%80%e4%b8%aa%e5%8f%af%e4%bb%a5%e6%b0%b8%e8%bf%9c%e5%9c%a8%e9%a1%b6%e5%b1%82%e7%9a%84%e6%b5%ae%e5%8a%a8%e5%b1%82%e3%80%82/#comments</comments>
		<pubDate>Sun, 21 Aug 2011 14:22:35 +0000</pubDate>
		<dc:creator>xiaojue</dc:creator>
				<category><![CDATA[随便写写]]></category>

		<guid isPermaLink="false">http://www.designsor.com/?p=1099</guid>
		<description><![CDATA[一直以为这是个不可能完成的任务，最近又被颠覆了价值观- -。 首先，最经典的例子，以前做BS应用，大多采用三栏布局，top，left，main三个iframe。然后总是有各种人问你，那个top里的js下拉导航菜单是否可以下拉覆盖住main或者left？ 我一直给他们的答案是，NO，不行…… 最近看新浪xweibo的浮动层源码还有my97日历里的一个新功能时，想到了，其实这是可以实现的。 后来看my97的源码，终于想明白了。我们回到最开始那个情景，几个iframe拼了一个布局，那么在子iframe里或者几个平行的iframe里，如何实现浮层能盖住他们2个呢？ 永远都在自己的top的那个window窗口里再创建一个顶级的iframe，然后装载浮层内容，再找到自己被激活的那个点的相对浏览器窗口的x，y坐标，（比如，我在子iframe里激活一个按钮，这个按钮相对自己窗口的x，y可以找到，简单递归，它可以累积加上自己这个点相对于parent的x，y一直找到top），然后再再top里相对自身窗口激活x，y这个坐标的浮动层，实现真正的顶层浮层，数据的操作由于都在一个iframe中完成，那当然就可以写一个通用的方法，把这个iframe和创建浮层的相对应的页面进行联系和通讯。 但是这里要说，相对于这种实现，涉及数据的操作，必须是要一个很相对独立完成的应用，比如my97日历，比如微博内部的那一套已经封装的很好的内部ajax套件，否则你自己每次生成这个都要自己再在操作完浮层写一堆代码回调回数据到子帧。最好的办法就是同域使用ajax，统一对浮层管理数据间的管理【这就要考虑业务代码了】，亦或者my97这样相比很单一的功能去实现几口接口。 不给出代码了。用jquery可以很容易的写出来，主要还在于是否有必要这么去做，值得考虑，毕竟有时候这样效率不高，在高密度的多iframe的应用里，或者未知的场景里做浮动，这样比较保险。 我最后还是我决定在自己的业务框架里增加这个功能……= =&#124;&#124;因为很多时候我这边的页面条件还都是很恶劣的。。]]></description>
			<content:encoded><![CDATA[<p>一直以为这是个不可能完成的任务，最近又被颠覆了价值观- -。</p>
<p>首先，最经典的例子，以前做BS应用，大多采用三栏布局，top，left，main三个iframe。然后总是有各种人问你，那个top里的js下拉导航菜单是否可以下拉覆盖住main或者left？</p>
<p>我一直给他们的答案是，NO，不行……</p>
<p>最近看新浪xweibo的浮动层源码还有my97日历里的一个新功能时，想到了，其实这是可以实现的。</p>
<p>后来看my97的源码，终于想明白了。我们回到最开始那个情景，几个iframe拼了一个布局，那么在子iframe里或者几个平行的iframe里，如何实现浮层能盖住他们2个呢？</p>
<p>永远都在自己的top的那个window窗口里再创建一个顶级的iframe，然后装载浮层内容，再找到自己被激活的那个点的相对浏览器窗口的x，y坐标，（比如，我在子iframe里激活一个按钮，这个按钮相对自己窗口的x，y可以找到，简单递归，它可以累积加上自己这个点相对于parent的x，y一直找到top），然后再再top里相对自身窗口激活x，y这个坐标的浮动层，实现真正的顶层浮层，数据的操作由于都在一个iframe中完成，那当然就可以写一个通用的方法，把这个iframe和创建浮层的相对应的页面进行联系和通讯。</p>
<p>但是这里要说，相对于这种实现，涉及数据的操作，必须是要一个很相对独立完成的应用，比如my97日历，比如微博内部的那一套已经封装的很好的内部ajax套件，否则你自己每次生成这个都要自己再在操作完浮层写一堆代码回调回数据到子帧。最好的办法就是同域使用ajax，统一对浮层管理数据间的管理【这就要考虑业务代码了】，亦或者my97这样相比很单一的功能去实现几口接口。</p>
<p>不给出代码了。用jquery可以很容易的写出来，主要还在于是否有必要这么去做，值得考虑，毕竟有时候这样效率不高，在高密度的多iframe的应用里，或者未知的场景里做浮动，这样比较保险。</p>
<p>我最后还是我决定在自己的业务框架里增加这个功能……= =||因为很多时候我这边的页面条件还都是很恶劣的。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.designsor.com/2011/08/21/%e5%a6%82%e4%bd%95%e5%88%9b%e5%bb%ba%e4%b8%80%e4%b8%aa%e5%8f%af%e4%bb%a5%e6%b0%b8%e8%bf%9c%e5%9c%a8%e9%a1%b6%e5%b1%82%e7%9a%84%e6%b5%ae%e5%8a%a8%e5%b1%82%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

