好久没写了,过去一年

偶尔上自己的博客转转,突然发现有一年的时间没有发布新的文章了。感觉这样做貌似有些对不起自己博主的身份,于是决定写点什么。 从上次发布的CS452总结开始,实习一学期,酱油一学期。12月完事毕业,14年6月就要毕业典礼了,时光飞逝啊。4年前刚搬进UWP的情形还历历在目,第一次出去找吃的(subway的故事。。。。),自己办电话卡、银行账号。 上次有人问我说,我是怎么接触到这么多技术的,外部的HTML, JS, Node.JS, REST, 还有内部的Linux, C/C++, etc…我说,因为之前经常会有人来找我问东西,或者直接要我做,我慢慢就自学了,尤其是我当信息部长那阵子,经常要对其他部门提出的问题制定解决方案。出于成本控制,便捷程度等多种原因,我自然会在每一方面都做一些了解,以便我做出判断。 但说到Node.JS,虽然以前写过了一个投票系统,主要还是前段时间接受了Peter的邀请,一起参与一个起步公司的项目,Tagtalk。我负责设计并编写后台服务器,API,和其他相关的内容。后台服务器100%由Node.JS构成,因为我很喜欢node这样的模式,对closure原生的支持,我甚至可以把一堆function按照我的需求定义好,然后推到一个array里面,交给library去同时运行。由于只有一个线程,我也不用考虑其他平台上不能松懈的synchronization问题。Node虽然年轻,却因为有npm这样的模块源管理而省去了寻找开源library的烦恼。再者,node毕竟是有一个正式有工资的团队进行更新维护的,而在很多方面不逊色于其他的平台。 博主目前依然在辛苦的找full-time工作中,我也希望跟我一样between jobs的同学们加油努力。 Read More

CS452完结

好像还是在几天前,为自己马上要开始挑战CS最难课感到激动。 好像还是在几天前,为自己一次次完成之前从未见过的挑战而感到兴奋。 但昨天,这一切都随着final demo的完成而成为回忆。回头看这学期在452 lab里面写的这一万多行code,似乎能记起每行code,每个function写完时的心情。 毕竟,这是我大学期间写的最后一个CS作业,也是我大学期间写的最有成就感的东西。虽然期间有过数不清的困难,数不清的彷徨,也想过要放弃。 感谢这学期CS452的队友,狗,帮我在CS学生的生涯里写下这最后压轴的一笔。 ====================煽情的分割线====================== 这门课开学第一周就会有作业,而且是第二周的星期一交,占总分的5%。要上此课的同学请前几周不要翘课,因为452的程序开发和之前的课都不一样。课上老师会教你要做什么,和怎么开始。使用的语言是C和ARMv4 Assembly。虽然貌似可以使用C++,但是强烈不建议这么做,因为C++的compiler生成的assembly和C的不太一样,不利于理解compiler把程序编译成assembly的套路。第一周的作业主要在于熟悉开发环境和硬件配置,独立完成。 从第二个作业开始进入452的正题,由两人组队完成,从此开始写的东西以后都需要用。而且不像241,就算一个阶段写不出来,老师会给你一个能用的版本来写后面的作业。452不会,设计的时候尽量考虑之后会要增加功能的情况。第2到6个作业是realtime microkernel的开发,从基本的user program, context switch, exception handle到irq,和内核服务。microkernel使用大量的message-based线程间通讯。但不至于最后写出像CS350的OS161那样复杂的kernel,而且OS161并不是realtime kernel。至于具体的区别,写的时候会体会到。kernel的设计方案在很大程度上取决于你和你队友,并没有什么标准解。 第7-9个作业是train project,在自己写的系统的基础之上构建一个程序来控制火车的运行,具体的方式由自己确定。做出来的成果要进行demo,每阶段demo一次。 作业花费的时间非常多,但更多的时候是需要理解要怎么做和为什么要这么做。上452的学期建议不要报444,486这样同样需要大量时间的课。因为基本上你所有的在学校的时间都在写452作业,本人一学期在452全部收工之前天亮回家的次数依然可以用一只手的手指数出来。 学校官方对这门课的评价是会用到学生学过的所有CS课的知识,建议学生最后再上这门课。这么说不为过。从CS136的算法开始一直到4开头的课程教过的算法我很多都用过。 虽然很累,但是上完这门课的确能很大的加深对操作系统内核的理解,也可以培养出诸如快速扫描上千页文档并找到自己需要的东西的能力。 Read More

将文件打包成.tar.gz格式

不知道是不是CS447 prof有强迫症,交作业非要把格式打包成.tar.gz格式。 执行 tar -cvfz <输出文件名>.tar.gz [要压缩的文件] 比如 tar -cvfz output.tar.gz fie1 file2 folder1 folder2 不过貌似Mac系统上面的tar命令不支持z选项?(不确定) 备用方案如下: tar -cvf <输出文件名>.tar [要压缩的文件] gzip <输出文件名>.tar gzip命令会直接压缩指定的文件,并在后面加上.gz扩展名 Read More

UWaterloo的CS课程介绍,一篇充斥着淡淡忧伤的总结…..ˋ(╯ω╰)ˊ

(原文地址:http://blog.renren.com/blog/237573071/889197245) 转眼在UW的时间也3年多了,虽然还没有毕业,但是林林总总下来,基本UW的CS课还是上过了不少了,特此把自己或者周围朋友上过的CS课程介绍以及一些资料整合一下。能帮到人最好,也算是纪念一下自己的大学生活吧。 同时,也希望能尽可能的补完此CS课程总结,CS专业或者非CS专业的CS课程,如果有同学希望能贡献一份力量请联系我。 特别感谢: @张俊亚(263179881) 其他CS众神: @丁柏宇Anakin(247575564) @朱剑Jayson(264410843) @刘博(251980561) ============因为不只是我一个人在卖萌。。。所以好像得有个版权声明====================== 纯原创内容,转载请注明出处 谢谢各位 ============================有事儿没事儿ge一下========================== 首先常用的几个link给大家发一下: 官方CS课程介绍(2012-2013年) – Bachelor Of Computer Science(BCS) degree requirement ========================正文开始前的废话快结束了=========================== 因为版权问题,所以我po上来的全部都是可以直接从google上面搜索到的内容。并没有直接转发粘贴等,只以link形式出现。不过基本在这篇总结中出现的课程的作业原题我都可以搞到,有需要的话可以试着联系一下我,但是答案什么的就算了,在UW学CS的,抄作业答案这种幸福的事情是跟你没关系的。。 你如果想说。。。。 是不是这么悲剧啊老湿。。。。。。。。。。。   恩。。。现实就这么悲剧。。。。谁让你选CS了。。。。千万不要想着去抄神马的。。否则学校方面很容易就可以发现,然后把你XXOO^$%^$什么的。。。绝对惨不忍睹 最后再废话一句,后面提到的作业所需coding时间,是实打实的坐在电脑前面,敲code的时间,要除去写不出来找基友扯淡一下,刷个人人微博Facebook,clash of clans抢个钱,赛车游戏跑一把,出去买个咖啡什么的划水时间的。。所以。。恩。。大家都懂的。。。这就叫coding时间。。 =========================正文终于开始了耶(兴奋个P啊。。)======================   CS115 非CS专业的学生必上的2门课。内容涉及一种叫做scheme的编程语言。算是很基础的入门编程课程。很多的利用了一种叫做recursion的概念,中文叫递归(其实我不知道递归是什么东西。。)这个概念搞明白会用了,基本115就无压力了。作业拿分要点,code是一方面,design recipe占的比重同样的大(个人认为很脑残的一项设置)前面几个作业在你没有摸清楚老师的判分标准前会被各种莫名其妙的理由扣分。(此特性,116,135同样适用) CS115官方网站(包含作业,notes,课程介绍等,但是作业和notes会在每学期末删除) – CS 116( preq CS115) CS 116的上半学期的课程仍然是进阶的讲解关于scheme的内容,具体设计到lambda的使用(abstract function, 其实是什么东西不用深究也可以,会用就行了。。) 下半个学期会涉及到一种新的语言,python。有兴趣的可以去google一下。建议刚开始讲python这个部分的几节课一定要去听(大部分人会跳掉CS115和116的课吧。。恩。。大家懂的)因为python除了recursion之外允许使用loop的概念,跟scheme相比还可以随便更改variable的值等等,总之跟scheme很不一样,所以入门去听一下还是很重要的。 CS116 官方网站(包含作业,notes,课程介绍等,但是作业和notes会在每学期末删除) – CS 135 CS专业的第一们课。和115一样,专攻scheme的语言,同样是recursion。只是编程难度增加了而已。没啥好说的。但是由于不和其他语言一样可以用什么for while loop只能用recursion,刚上手可能会有一些难度。作业的分数和115一样脑残,design Read More

iPhone 5开箱照

外包装打开之后,手机被塑料膜封在盒子上。 包装盒 打开之后,手感很好,的确感觉很轻 还有配件,包含数据线,充电器和新的耳机 Read More

让英文的iOS和OS X在联系人列表中正确排序中文

iOS和OS X都有AddressBook这个功能(现在OS X里面貌似叫做Contacts了),但是这个工具在排序里面联系人的时候是按照当前系统语言为标准排序的。于是在英文系统里面,中文名字全都很悲剧的随机排列在了#下面。 下面的方法可以让中文按照姓氏的音序正确被排列。操作之前请关闭AddressBook或相关程序。 进入目录/System/Library/Frameworks/AddressBook.framework/ 注意:如果是OS X的话,那么还需进入Resources文件夹 打开zh_CN.lproj文件夹,复制里面的ABContactSections.plist文件。回到上级目录,再打开English.lproj文件夹,重命名或在其他地方备份原有的ABContactSections.plist文件,然后用刚才复制的文件替换。 再次打开联系人,看看是不是已经按照正确方式排列了?这才是正确的打开方式嘛。 P.S. 由于涉及系统文件的操作,请同学们小心操作,玩坏了不关我的事哦。而且相信大家已经看出来了,这个方法只对于已经越狱的iOS设备有效。 P.S.2 本人已在OS X 10.8.1,iOS 5.1.1下亲测成功 P.S.3 在iOS下面要使更改生效必须把系统语言切换回中文再切换成英文才可以 Read More

Buffer Overflow攻略

Buffer Overflow是通过程序在设计上的缺陷,向程序输入特殊设计的字符串来达到获取计算机权限的程序漏洞。由于C语言本身对程序使用内存的限制并不严格,这就给了漏洞可乘之机。 下面这段代码就存在严重的buffer overflow漏洞。 void printSomething(char* str) {     char string[50];     strcpy(string, str);     printf("Printing %s\n", string); }   int main(int argc, char* argv[]) { if ( argc >= 2 ) { printSomething( argv[1] ); } } 代码在把参数str存入string之前并没有检查str的长度,而string这个array的最大长度却只有50。如果str是一个长度大于49(C字符串以0结尾)的字符串,那么就会引发问题。 下面看一个更加直白的例子:(因为是在64位系统上面进行的测试,所以用来保存地址的地方用了long long。 long long ago….) void pt(long long in, int num) { long long a[1];     Read More

Apple Again Ranked as World’s Most Valuable Brand – Mac Rumors(转发)

Apple Again Ranked as World's Most Valuable Brand – Mac Rumors. 两点不仅仅是Apple,还有中国移动哦。。。 Read More

Android学习笔记:ProgressDialog与多线程

在UI的线程中执行需要花费一些时间的后台操作,比如下载数据,会导致UI线程拖慢对用户操作做出响应。超过一段时间没有响应的Activity会被Android操作系统报告给用户,并询问用户希望结束程序还是继续等待。这显然是我们不希望的,后台的操作不应该导致前台操作被拖延。(想象一下,如果你用UI线程执行下载1GB数据的工作,那么在下载结束之前,用户甚至都没有点暂停的机会) Java中一般解决这种问题的思路是是用Thread来创建新的线程执行后台操作,但这样在Android里面行不通。因为不允许在非UI线程上执行调用影响UI显示的函数,比如关闭对话框。官方对此的解释是,因为Android UI不是线程安全的,在非UI上执行UI操作会有concurrency的问题。Android为此提供了一个新的方法来解决这个问题,叫做AsyncTask。 通过重载AsyncTask的一些函数,我们可以在后台执行操作,并且在执行完成后在UI线程上执行另外的操作。以下是一个显示进度对话框,并执行后台任务,完成后关闭进度对话框的例子。 private ProgressDialog dialog; // 此处省略这个class其他的函数 private void doSomething() { dialog = ProgressDialog.show(this, “wait”, “something is in progress”); dialog.setCancelable(false);   //如果不希望用户在执行过程中用返回键关闭这个窗口,设置此项 new backgroundWorker().execute(param);     //这里的param后面会发送给AsyncTask的doInBackground函数 …… } private void backgroundDone() { dialog.dismiss(); } class backgroundWorker extends AsyncTask<Integer, Void, Boolean> { //这三项分别是param,progress,result的类型,注意这里不能用int而要使用Integer,因为Integer是int的class版。Void也是一个道理 //三个类型具体可以根据实际情况选择,这里我们只是举例。 //doInBackground的参数类型必须是param的类型,返回值必须是result的类型 @Override protected Boolean doInBackground(Integer… params) { //这里的param就是刚才execute传入的参数 //do Read More

Android学习笔记:关于getInstance

Android的Activity是主要的UI显示框架,相当于Java的JFrame。但是Activity类的初始化并不是我们操作的,只有onCreate重载函数可以初始化Activity。这样一来就不能像Java中那样进行Model实例的传递。getInstance就成为了解决这个问题的方法。 我们知道,在Java中,被声明为static的函数和变量是可以在全局访问的,所有的实例都可以访问到同样的数据。我们只要把Model的实例放在一个static的变量上,就可以随时访问了。 public class model { private static model instance = null; protected model() { // initiate model } public static model getInstance() { if(instance == null) instance = new model(); return instance; } } 以上代码演示了一个getInstance的例子。无论在任何地方调用model.getInstance()函数,返回的永远是同一个instance的实例。这样就可以保证程序的数据统一稳定了。   Read More

1 2 3