我的第三代NAS方案

第三代NAS

三年前我开始探索DIY家用NAS方案,那时我组装了我家第一台NAS,我把它称之为ING第一代NAS。参见那时候写的《DIY了家用NAS》。

两年后,由于技展高清3号机箱的做工太差,前置面板螺孔全部断裂,我开始考虑新的NAS方案。这就是ING第二代NAS。当时的配置方案为:

  • 主板:七彩虹 i-AE50 V14(四个SATA3.0、两个USB3.0、一个千兆网卡、一个HDMI接口、高清硬解)
  • 内存:金士顿 4G DDR3 1333
  • 机箱:万由U-NAS N400(4盘位热插拔)
  • 电源:台达1U小电源 200W
  • 系统盘:威刚ASP900S3-64G
  • 数据盘:西数2TB绿盘

Mac/Linux 多线程下载解决方案

还记得我两年前写的《DIY了家用NAS》吗?现在又带来新的升级啦。当初的NAS最多能使用Transmission来进行BT下载,那时就在想,如果能下载普通的http资源就好了。再进一步,有什么方案可以通吃所有下载方式呢?
记得那个时候,我在NAS上装了个虚拟机跑XP,然后用迅雷下载各种资源。这种方式虽然可行,不过太不环保了。而且下载完成后,还要想办法把文件转到宿主硬盘上。小文件还好,大文件就彻底悲剧了。

现在好了,有了套完美的解决方案:迅雷离线助手+YAAW For Chrome+Aria2

迅雷离线助手+YAAW

iOS中UIWebView的Javascript与Objective-C通信

在iOS开发中经常要用到UIWebView,想让Html页面和native本身结合的更好,难免需要让Objective-C和Javascript通信。

那么如何让他们直接能通信呢?大部分用过UIWebView的朋友都知道stringByEvaluatingJavaScriptFromString:,使用这个消息,可以让UIWebView执行Objective-C发来的JS语句。这样Obj-C --> JS的问题解决了。

接下来,如何实现JS --> Obj-C呢?UIWebViewDelegate中有个webView:shouldStartLoadWithRequest:navigationType:。当UIWebView请求某个url之前都会调用这个消息,这个消息的返回值决定着UIWebView是否要加载这个url。我测试了一下改变JS中的location.href也可以触发这个消息。有了这条路子我们就有办法实现JS --> Obj-C

经过几番折腾就有了我的开源项目TGJSBridge,这个项目主要实现了JS与Obj-C之间的项目通信。JS可以向Obj-C发送JSON对象,Obj-C将收到相应的NSDictionary。反过来也一样,TGJSBridge会自动转换数据结构。JS通过bind订阅消息,Obj-C通过委托接收消息。

让UIColor支持Hex值

在使用Cocoa的地方,有个很奇怪问题。为什么每次实例化一个UIColor的时候非要分别指定RGBA四个值,而且每个值都需要除以255.0f。作为前端出生的我太不适应了。公司产品的界面自定义太多了,需要用到特殊颜色的地方也很多。一个颜色值从Photoshop吸取出来后,需要复制四个值。n个颜色也就需要复制4n次。每次都要我这么搞,这也太坑爹了吧。

那有没有办法让UIColor和网页中的CSS那样使用Hex(十六进制值)来指定呢?我写了个UIColor的Category解决了这个问题。

写在2011最后一天

半年没动blog了,28号的时候冷不丁的写了一篇《使用Quartz绘制带阴影的圆角图》,实际上我一直想写类似的技术博文,而且也积压了好多主题,苦于工作所迫一直没写。总之先写了这篇总结再说吧。

工作篇

去年的9月我再次来到阿里学院,与之前不同,这次是作为正式员工加入阿里巴巴。这也是我的第一份正式工作。这段日子有艰辛又有收获。出于个人梦想,在今年9月,也就是工作刚满一年之时,我辞去了这份工作来到了一家初创公司,任职前端开发。两个月后又因为公司需要我转向了iOS开发,直至今天。

一直想学Cocoa编程,现今刚好有机会可以在公司边学边做,每天都很充实。从我开始学习到先在应该有一个半月了,目前写了7000多行代码,我第一个移动应用预计会在春节前发布,大家拭目以待吧。

7Peers篇

加入阿里巴巴后,认识了很多业内的朋友。我们因拥有相同的梦想走在一起,也因梦想陆续离开,各奔前程。在大家相继离开前,我们创立了7Peers,目的是让大家在工作之余,可以一起做些感兴趣的产品。Stash就是我们第一个对外发布的产品。此外还有许多未发布、开发中的产品。比如:

  • nooon.in
  • Lento
  • DewDewTree

Stash本该在今年7月重构一个新版本,但由于那时公司开始了一个大型项目,而之后我又开始换工作,所以直到今天毫无进展。明年,我的事情应该会少很多,我将继续Stash的开发。

就在今年7月,随着Stash0.2.3版的发布,我们一起推出了7Peers.com。我们的天才设计师强生生同学的给力设计让我们的官网一下子受到了业内的关注。没过多久,某澳大利亚公司就给我们发邮件,想出钱让我们团队为他们设计开发产品。虽然最后我们还是婉拒了邀请,不过这封邮件让我们振奋不已。

如今7Peers成员均已离开阿里巴巴,我是最后一个走的。大家分散在全国各地,7Peers的项目并没有终止。而且明年还有一个全新的项目,目前唯一能透露的就是这是一个Mac应用。

使用Quartz绘制带阴影的圆角图

最近在做iOS开发的时候,遇到这样的需求:需要开发一个高度自适应的控件,背景使用图案平铺,控件下方两个角为圆角,控件的下边有5像素宽的阴影。具体如图所示:

需求效果图

方案A

在做这个需求时首先想到是用colorWithPatternImage来平铺图片,然后使用CALayer添加阴影。

7Peers即将到来 & Stash的下一版本

7Peers即将到来!什么是7Peers呢?7Peers其实就是指我们团队。团队创立之初,大家抱着共同的梦想聚在一起,那时候我们有七人。而如今我们又要各奔东西分散各地,但是我们的梦想不变。我们相约,继续通过网络交流,继续一起创作互联网产品。Peer预示着节点、同伴、同等,而7Peers彼此联系,构成网络,预示着我们共同的织网梦想。这就是我们——Seven Team。

我们注册了7peers.com的域名,coming soon页面已经上线,网站本身很快也会发布。此外我们还开通了twitter、facebook、新浪微博。请关注我们:

另外,Stash的下一版本已经进入紧张的开发阶段。新版本会带来两大特性,一个是列表锁定,另一个特性是快捷键。

stash 3.0预览

Stash来啦!我开发的第一个Chrome扩展

stash availble

stash preview

很久很久很久很久没写博客啦,难得写一次博客,居然是来发布产品的。言归正传,我和一个朋友(强生)打磨的Chrome扩展——Stash来啦!绝对是你需要的工具,请耐心看完下面的内容。

什么是Stash?Stash是一个以全新的方式储存和管理标签页的chrome扩展程序。这个小东西由强生和我合力完成。从构思到开发我们花了不到一个月的时间,而且都是在业余时间进行的。我们希望以这个项目作为起点和尝试,能做出更多有意思的产品。

那么究竟Stash有什么用呢?我们来看一下当初我们构思的故事吧。

构建大型jQuery应用

原文:http://addyosmani.com/blog/large-scale-jquery/

1.依赖管理

目前常用的script loader主要有两个,RequireJS (by James Burke) 与LabJS (by Kyle Simpson)。有些人会认为这其中一个会比另一个要好,但事实上他们各自有各自的特点。以我的经验来讲,RequireJS的特性之一是提供结构化模块的支持,而LabJS更适合不需要额外特性或者需要轻量级库的时候。

如果你想知道更多关于如何选择 RequireJS、LabJS,请看这里:http://msdn.microsoft.com/en-us/scriptjunkie/ff943568。如果这两个还不能满足你的需求,你还可以看看下面的内容。

解决方案:

RequireJS – 如果你期望你的代码更加模块化,我强烈推荐它。它会试图限制模块对全局命名空间的影响,并使得依赖更加明确。同时它还提供一个优化工具,帮助你合并压缩脚本 - http://requirejs.org/docs/jquery.html

LabJS – 如果你需要按照一定的顺序高效的加载脚本,或者你正在寻找比RequireJS更轻量级的框架,或者你对模块化依赖管理根本不感兴趣,那么你不妨试试LabJS。 – http://www.labjs.com (Alex Sexton 还在LabJS的基础上开发了条件化的loader,YepNope JS - http://www.yepnopejs.com)

StealJS – 又一个非常棒的依赖管理工具。Steal是 JavaScriptMVC框架的一部分,不过你可以单独使用它。它也提供了合并、压缩、清理等功能。 – http://jupiterjs.com/news/stealjs-script-manager

JSL Script Loader – 提供了加载、防重复加载、缓存等功能。但是它的用户也许没有LabJS、RequireJS那么多 – http://www.andresvidal.com/jsl

Bootstrap – 它的功能很少,但足以完成任务。如在你在寻找一个最小的没有任何多余功能的解决方案,那么也许它是最合适的。 – https://bitbucket.org/scott_koon/bootstrap

2.MVC&管理大型jQuery应用

软件工程中的设计模式、架构模式可以让你创建可重用的,结构化的,更具组织性的代码。我认为在开发中使用设计模式是必要的,尤其当你需要确保团队编写的代码的风格和结构是一致的时候。

清理浮动的整理

清理浮动是前端工程师每天都会用到的技术,目前清理浮动的技术形形色色,另很多新手眼花缭乱。所以我就结合了几篇文章,做了一些整理。

一、为什么要清理浮动?

这里我不做细讲,请新手参考《CSS Mastery》中有关浮动的章节。

简单的讲,当我们把一个框向左浮动起来时,它就会脱离文档流,并且向左移动,直到它左边缘碰到其父框的左边缘。当我们把框浮动起来后,会出现各种问题,比如下一个非浮动元素环绕着浮动框。这时候为了正确排版,我们需要把浮动清理。

二、如何清理浮动?

1、采用div标签clear的方式

1
<div class="clear"></div>
1
2
3
4
5
6
7
8
9
div.clear {
	clear:both;
	height:0;
	line-height:0;
	margin:0;
	padding:0;
	border:0;
	overflow:hidden;
}

优点:代码量极少,复用性极高。

缺点:完全不能完美的适应语义化,不利于改版以及需求变更。

建议:初学者使用,可以让你快速的解决浮动问题。

2、采用br标签clear的方式

浙ICP备14031546号