Monthly Archives: 十二月 2013

分析try catch finally

.net中利用异常机制来捕获错误或者异常信息。
在代码中尽量避免使用try-catch也是为了提升程序效率同时也使代码更加优化逻辑也更清晰。
try-catch 的使用一般是在代码中可能出错的位置使用。

关于try-catch-finally 的执行顺序,在不同的情景中也会有不同执行顺序。
try{} 代码块中包含可能出异常的代码.
catch{} 代码块用来捕获异常并进行处理的逻辑.
finally{} 一般用来释放资源使用,比如说try{} 中使用了非托管资源,finally{}就需要手动释放掉;这里需要注意的是,finally{}在代码中总会执行的,不论是否引发异常。

finally{}的执行有几种情况:
1. try{} 代码块中含有return 语句.
2. catch{}中含有return 语句.
3. finally{} 代码块的后面,函数体的末尾含有return 语句.
记住,finally{}一定会执行.对于1,2 中情况下,如果finally{} 对使用的变量或者资源进行操作并会影响函数最终的返回结果,因为在这2中情况下,finally{}的执行时间是在return 语句之后,函数返回之前,所以finally{}中对变量(或者返回结果)的操作 并不会影响函数的最终执行结果。

实例代码如下:

如上代码中,test2() 为一般使用方式,此时finally{}中进行修改变量a,会影响函数的最终返回结果,test2() 返回结果为:2.
test1() 代码中,因为return语句在catch{}中执行了,所以在函数返回前会执行finally{} 但是并会影响返回结果,test1{}返回结果为:1.

对于test1() 中的写法,为什么会返回1,不清除的同学可以将以上代码copy到 c#控制台程序中自己手动调试一下就会明白test1() 方法的执行顺序是: 先执行了catch{}中的return 语句后才执行的finally{}, 如下是test1() 的IL 反编译的代码.
IL_000x: 表示当前代码的执行顺序。

test1() IL代码

test1() IL代码

SVN update error: does not match expected url:’xxxx’

工作中遇到的一个问题,下午使用SVN 更新代码时出现的错误,如图:
1

造成这个问题的原因是,有同事提交了一个新的同名目录, 代码的原始目录为:
dbo\Scripts\(注意大小写)
而同事提交了一个同名目录:
dbo\scripts\(注意大小写)
2
所以当我在更新的时候,就出现了这个问题,解决方法,就是删除后来提交的目录就可以了。

参考资料:

http://stackoverflow.com/questions/6059201/url-of-existing-directory-does-not-match-expected-url

http://www.rowanhanna.com/blog/2011/02/svn-does-not-match-expected-url/

开发WebOS日志

在线测试地址:YOS

交流方式:
微博:@袁家小黑球
邮箱:xuanyuanziruo@gmail.com

预计开发的功能:
1.应用窗体8个方向调整大小
2.点击应用窗体时,窗口置顶
5.自定义增加Icon功能
6.cookie记录用户数据功能
7.右键菜单
8.扩展桌面

目前遇到的问题:
1. Iframe 加载的url 出问题是,会影响当前父页面, 例如 点击 博客园 icon
2. 任务栏不能紧靠底部问题, 怀疑是浮动原因或者是元素定位问题
3. 任务栏图标应该始终在最顶层,目前会被应用窗口遮盖住
4. 拖动应用窗口超过当前屏幕时,会出现滚动条。

2014-1-11
->修复IE下浏览器窗口调整时图标不自动排列
->‘添加’图标显示在桌面上,正在开发菜单以实现添加功能

2013-12-26
->利用遮盖层修正应用窗口向下拖动卡住bug
->底部任务栏功能(创建,删除,控制显隐)

2013-12-15
->分离Model层,代码结构调整
->完成窗体最大化与恢复,最小化按钮事件绑定
->应用窗口标题栏双击事件

2013-12-14
->div+css绘制应用窗口
->绑定窗体关闭事件
->拖放控件开发
->代码优化

2013-12-13
->创建文件结构,首页面 index.html
->完成Icon图标的动态创建与排列

Model层的诞生-开发WebOS(三)

昨天一个人跑到公司敲代码,虽然环境和22寸的屏幕对我很有吸引力,不过周末不给开空调腿很冷的,今天就在家继续coding了。

晚上回到家,吃过晚饭,公园散步时一直在思考开发webos遇到的问题以及接下来要完善的功能,最后确定下来,先完成窗体的拖放功能,之所以先完成这个功能是因为,自己不想使用网络上现有的拖放插件,打算自己动手写一个,不仅可以理解原理,也可以熟悉jQuery插件开发的流程,想到这点后马上回家coding了。

关于拖放,之前自己写过拖放,原理不复杂,拖动元素必须是绝对定位,主要用到的事件是 mousedown(), mousemove(), mouseup() , 同时还需要个canMove 标记是否拖放的状态,
1. mousedown()事件中主要记录下鼠标点击时,鼠标相对于拖放元素内部的坐标并将canMove标记设为true。
2. mousemove()事件中记录鼠标的偏移量并改变拖放容器的top和left属性。
3. mouseup()事件中将 canMove设为false.拖放结束。
参考博友的文章:<JQuery之拖拽插件>

在此插件开发过程中遇到的问题:
1. offset() 和position() 竟然搞混了。
offset() :在匹配的元素集合中,获取的第一个元素的当前坐标,或设置每一个元素的坐标,坐标相对于文档。
position() :获取匹配元素中第一个元素的当前坐标,相对于offset parent的坐标。
2.快速移动鼠标,就会出现div跟不上鼠标的现象
这个问题产的原因是因为,鼠标移动速度很快,超出了移动容器的范围后,容器不在移动,鼠标离开了容器的范围所以mousemove()事件不在继续执行了。我是用的解决方式是对document对象上监听mousemove()事件。
3.jQuery插件开发时,注意$.fn.FunctionName 和$.FunctionName 的区别。
$.fn.FunctionName ,此时的FunctionName可以被jQuery元素对象调用。
$.FunctionName, 是全局函数,不能被jQuery元素调用。

拖放插件开发完,就一直在思考代码组织的问题,之所以思考这个问题是因为感觉自己现在代码很乱。组织方式如下:
2
这种写法,其实就相当于定义了不同事件的命名空间而已,可是随着方法的增多,这里就会显得混乱,比如说,icon的事件,icon窗体的事件,仅仅是命名空间来区分还是会感觉很乱,里面不仅有元素创建,事件绑定,元素的控制等等,所有的事件控制全部写在这里了。我自己预感这个YxjOSCore会越来越臃肿。

所以脑海里总是想着分离,临睡前看到桌子上的mvc的书,灵光一闪,mvc讲究关注分离,同时想起了面向对象编程,因为自己偏后端开发,这些经常用的东西,放在Js里竟然一下没有想起来,不禁汗颜,同时也因为自己找到了解决思路而高兴,如不是半夜12点多了,真想爬起来马上实践一下了。

今天早上一醒来,就开始分析如何对目前的结构抽象出对象,首先想到的是窗体,因为每个图标都会打开新的窗口;然后是图标也可抽离成一个对象。 既然是对象了那么接下来就容易很多了。代码备份了一份,立刻开始重构代码了,新的代码中,增加一个model.js专门用来存储对象,原来的core.js专门作为调用对象的控制层。

如此一来代码结构就比之前清晰了.core.js只要专注开发控制对象就可以了,对象自己内部维护自己的创建、事件绑定,对于特定的事件只要公布出回调函数公布出来,core.js就能调用了。

抽离出的windowModel示例:
1
这次的重构,也让自己感觉到js的强大以及超强的灵活性,也让自己意识到时刻要用面向对象的思路去看待问题。

总结一下重构学到的知识:
1. js中的oop (参考资料:js面向对象编程)
js中对象的创建方式有很多种,有构造函数式定义,原型式类定义, json式定义。我自己使用的是构造函数式,这点跟C#创建类很像,用起来熟悉。

2. this对象的理解
对this对象有了明确的理解,细心的朋友,应该会注意到上面的代码片段中定义的_self变量,这个变量是解决jQuery函数里this 引用问题。
3. call 方法的使用 (参考资料:js call)

call方法的使用很好的对外提供了回调函数机制。 call方法还有其他用法,比如:可以让a对象来执行b对象的方法。

在线测试地址:http://www.yuanxj.net/YOS/index.html

窗体制作 – 开发WebOS(二)

花了将近一天的时间终于将样子看上去还行的窗体画出来了,再次感谢@Hooray 的博客,感谢Web+, 有他们的思路,真实代码,我就厚着脸皮直接模仿了,呵呵。
参考@Hooray和web+加上自己的理解画出来的窗体结构跟以上2位均不相同,这是因为自己DIV+CSS处理页面的水平实在有限,对前端布局设计之类的完全没有概念,模仿web+的结构和自认为用简单的结构画出来的界面。结果图如下:
2

html结构如下:3

为了实现窗体边缘的8个方向的调整大小的按钮,这里实际上在窗体周围增加了8个层来实现的。

经过画窗体这个过程,开始慢慢对css熟悉起来了,界面花完了,当然是开始开发功能了,这里我遇到一个问题,就是关于代码如何组织的问题,对js的设计模式完全不懂,唯一知道的一个还是工厂模式,关于这点,我同时也在看@汤姆大叔 的深入理解Javascript系列>的文章,只能边看边学习同时慢慢应用了。
针对窗体接下来的开发主要是功能性的,包括:关闭,最小化,拖动,改变界面大小,刷新。
要点:
1.为了防止同一个图表打开多个窗口,定义了个窗口编号数组,每次创建窗口时会检查是否已经创建
2.创建窗口时的位置,目前我才用的是随机数来随机定位窗口在页面上的位置,后面会改进这里
3.最新打开的窗口应该置于所有窗口的前面,这个使用过修改窗口的z-index来实现,全局有个z-index变量而且总是增加的。
4.最小化,目前的思路是隐藏或者改变z-index.
5.改变大小通过修改内部iframe来实现,注意窗体的最小机值还是限制一下比较好。

开发时遇到的问题:
0.Jasascript代码组织,设计模式。
1.关于元素事件绑定的问题,比如窗体的关闭,页面初次打开时,我在ready()事件中使用on()为关闭按钮绑定关闭事件,每个窗体打开时都是重新创建的元素,此时关闭事件没有绑定上去。目前我的处理方式是,创建完窗体后,为关闭按钮绑定关闭事件,这样做似乎不是很好。
2.DIV圆角问题,CSS不是很强,所以目前窗体的圆角只能先去查资料怎么用,明白原理才能做了
3.不会PS,这个问题暂时没办法了,只能一个一个使用零碎的图片了,对css sprite技术,也只能望而兴叹了。

总结一下,今天完成的功能:
1.代码优化,统一了全局命名空间,优化了Var声明方式(参考:编写高质量JavaScript代码的基本要点)
2.完成了窗体的绘制
3.窗体交互事件开发:仅仅完成了关闭按钮。

在线测试地址:http://www.yuanxj.net/YOS/index.html

 

实践出真知-开发WebOS(一)

去年的时候看到@Hooray 开发一套自己的webos,并且将自己的开发过程也在博客中记录下来,整理成了一个开发webos的系列文章(HoorayOS——Web桌面应用框架),当时看到他开发webos框架不由得对牛人愈加佩服,同时也为自己的执行力感到不好意思。

昨天,偶然间翻出了Hooary的文章,于是,决定自己利用空闲时间,追寻@Hooray的脚步,尝试一下自己开发一套webos出来,本着可以学习新的知识以及磨练自己的技术,同时也想挑战一下自己的代码编写能力达到了何种水品,完成了将来也算是对自己编程这么久以来一个成功的作品。

关于webos 我能想到就是腾讯的web+,这个很成熟的产品了,于是,昨天晚上特地研究并去体验了一下web+,体验的过程,不仅仅折服前段大牛的技术能力同时佩服大牛的奇思妙想,本身就对前段蛮有兴趣的我,昨天晚上构思了一晚并学习@Hooray的系列文章,今天终于完成了雏形,这是我的测试地址: http://www.yuanxj.net/YOS/index.html.

目前完成的功能有:1.图标的动态绑定 2.窗口调整时的图标重新绑定
下一个努力完成的功能:打开窗口功能,这个功能正在思考中。

总结一下,完成目前成果学到的成果:
1.对div+Css设计页面不熟悉,时间花在了样式调整上。 遇到的问题是,图标定位问题,对定位的概念(绝对定位,相对定位)没有理解透彻。

2.对HTML5,CSS3的特性,细节完全不知道。 虽然HTML5,Css3已经流行起来了,但是自己不是专业美工,所以没有去关注,当自己真心去用的时候发现完全不知道怎么做,我记得我在做腾信的[前段特工] ‘潜入TX’的闯关是,第二关就过去不了,暴汗啊,不过也非常感谢TX,也让我找到了一些学习CSS3不错的好网站(CSS3属性教程与案例分享

3.对设计模式知识的欠缺,我预感到这个将会在以后开发中,随着代码量的增加,代码结构会变得臃肿,所以,在以后的开发工程中,我也会努力去学习一些js设计模式方面的知识。

4.浏览器兼容性问题, 目前我是用jquery来解决主要的兼容性问题,但是对样式兼容性,只能在后续开发中慢慢积累了。

5.创造性,这个也是自己所欠缺的,我是做后端开发的,思维模式难免有些死板,而前段开发,有着丰富的展现形式与互动方式,我会努力学习并挖掘自己的创造潜能。

6.插件开发能力,之前对插件开发一直停留在理论上,以后我会多多练习插件的开发,孰能生巧。

今天基本上就这些了,以后慢慢总结,慢慢改进。

我的web os 在线测试地址(努力开发中):http://www.yuanxj.net/YOS/index.html

看你能坚持多久?!

看你能坚持多久! 是说给自己听的。

今年3月份,在同事的提醒下,我开始在扇贝网上记单词,之所以使用扇贝网是因为它有打卡功能,所以如果想打卡,就必须把当天的单词背完,才能累计天数。现在回头望望,已经坚持了275天了(我的扇贝打卡),记得当初自己还没有信心自己可以坚持这么久。

刚开始背单词的时候,完全是凭兴趣爱好,我喜欢英语,说英语会让我感觉很开心,总感觉讲英语是件非常有意思并且高兴的事儿,我的基础很差,高中水品,而且我记不住单词,不过为了向往自己将来可以讲一口流利的英语并以此为动力,从那时起,就开始了背单词的路。

现在回想这将近一年背单词的过程,也是一段值得自己回忆并反思的记忆。我也是年轻人,年轻人做事爱冲动,三分钟热度,很难持久,这些去特点我也有,记得刚开始的一个月是最难的,再开始背单词之前,我有读过羊皮卷,当时想将整个羊皮卷读完的,然而,羊皮卷第一卷读了不到一个月就断掉了,不过羊皮卷也没有白读,起码让我知道了,新的习惯在刚开始养成时的确很难,那个时候,我就以羊皮卷为指导,鼓励自己坚持了下来。

印象中比较深刻的一次,有天公司加班回家比较晚了,当时真的很累,回家趴在床上就想睡,可那个时候背单词已经坚持了1个多月了,不忍放弃,就在疲惫状态开始背单词,当时是趴在床上用ipad背单词,不知不觉中竟然睡过去了,当我醒来时凌晨1点多了,醒来继续将单词背完才脱衣服睡觉。

记得有一阵子情绪相当低落,做什么事情都提不起精神来,也就在这个时候,中断了背单词,那个时候不知道突然怎么了,也可能是感觉累了,倦了,或许是工作压力太大了,我只记得我休整了一个多星期,每天花更多时间在休息,慢慢的一个多星期后,感觉力量慢慢回来了,又重新踏上了打卡之路,现在回望打卡这个期间,不仅仅是背单词打卡,同时也是自我意志力,毅力的考验,随着打卡天数的增多,我经常鼓励自己的一句话就是:那么多天都坚持过来了,能在这一天放弃吗?!我用行动证明着,我会继续努力,从次,我不在关注打卡天数,因为慢慢背单词已经成为一种习惯了。

后来我有培养了坚持学习的习惯,这些好的习惯始终都离不开,背单词这个习惯的养成,因为这个习惯,我也更有信心养成新的习惯。正如羊皮卷第一卷中所说:’这些习惯有什么好处呢?这里隐含着人类成功的秘诀。当我每天重复这些话的时候,它们成了我精神活动的一部分,更重要的是,它们渗入我的心灵。那是个神秘的世界,永不静止,创造梦境,在不知不觉中影响我的行为。’

在这里我也非常感谢曾经指导我养成这些习惯的朋友们,是@四姑娘 开启了我扇贝背单词打卡的开始,是@郑哥 带我一起读羊皮卷,让我知道了习惯的力量。

我依然清晰的记得自己的格言: 与人为善,善待人生。 用自己努力的程度品别人聪明的程度。

看你能坚持多久,我想在未来的某一天我会看到这篇文字,并为自己感动,所以,我还会继续努力!

Install-Package 那点事儿

为了练习使用SignaR,新建了一个.net 4.0的MVC4项目, 第一步,不用说就是先将SignaR安装到项目中,考虑到SignaR 目前已经更新到2.0 并且无法在 4.0框架下面使用,此时通过Nuget 管理工具去安装的话,默认是安装最新版本的程序集。然后问题就来了…

问题一:不使用Package管理工具如何安装Package呢?
答:使用Package Manager Console.

问题二: 如何安装特定版本的程序集?
答: 在 Package Manager Console 中使用 带参数的 Install-Package 命令
通过  TooLS -> Libary Manager Console -> Package Manager Console 即可打卡面板。
输入Install-Package Microsoft.AspNet.SignalR -Version 1.1.0(使用SignaR 1.1.0 为例子)

问题三:如何卸载特定的Package呢?
答:使用 Uninstall-Package 命令
例如:Uninstall-Package Microsoft.AspNet.SignalR -Version 1.1.0

问题四:指定项目
答:使用-Project
例如:Install-Package Moq -Project SportsStore.Domain(项目名称)

郁闷的事儿
我在安装过成中,第一次SignaR2.0在.net4.0下安装失败。
第二次安装失败,错误提示:The remote name could not be resolved:’www.nuget.org’。
尼玛,nuget.org罢工了,洗洗睡了。