Category: 学习笔记

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

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

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

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

CS349 Assignment 2,3总结

偷懒把两个作业的总结写到一起了,呵呵。 不过也不仅仅是偷懒的问题,这两次作业都是在Java环境下通过swing库来编写图形界面程序。并且要使用MVC结构。对于熟悉JAVA的同学来说,这次作业的难度其实并不在与写JAVA,而是满足MVC结构。如何才算是满足呢? 简单地说,满足MVC的程序,将.java文件放在两个package里面,一个是model,另一个是view和controller,那么model里面的任何文件都不应该导入另外一个package。为什么不是3个packages? 因为虽然叫MVC但其实并没有必要刻意把View和Controller分开,毕竟两个合起来称作User Interface,甚至没有必要把view和controller放在不同的文件中。而且,各个不同的view也应该是相互独立的,换句话说,如果每一个view都是一个包含了自己所需要的controller的package的话,那么这些package之间也不应该相互导入,当然除了主窗口要导入所有的view和model之外。。。 正确的方法是,在model里面应该有一个public interface,每一个view都应该继承这个interface并通过model提供的函数向model注册自己。而model在内部数据发生任何变化的时候,都应该调用interface里面的函数来通知所有已经注册的view。这也是model唯一可能向view发出数据的地方。model必须提供完整的函数来满足各种view所需的数据并接收view发来的用户操作,而view也要在收到model通知的时候主动从model获取需要的数据并更新自己。而在用户进行任何操作的时候,view要尽量通知model并将变化的内容更新到model上。需要注意的是,自始至终应该只有一个model的实例在运行,这样是为了保证整个程序的数据是统一稳定的。 对于不熟悉JAVA的同学来说,Java Reference是非常好的学习资料。对于很多component和layout,reference里面都提供了一些tutorial来帮助理解。Component大都位于javax.swing下,而layout大多位于java.awt,还有一小部分位于javax.swing。事件和监听的类位于java.awt.event和javax.swing.event下。Eclipse是推荐的开发环境,它会帮助导入没有导入的包。对于一些需要大量数据的component,比如JTable, JList和JTree,他们都提供了model的interface,并有设置model的函数。可以通过implements这些model来实现对component数据的变化,也可以通过直接继承default model来只重载我们需要的部分。比如JTable有interface TableModel和class DefaultTableModel。 对于熟悉JAVA的同学来说,这两次作业一个星期就绰绰有余了。毕竟JAVA的debug简单,而且也不会有内存访问错误。对于不熟悉JAVA的同学来说,建议早点开始,这样有时间去看看reference,慢慢适应JAVA的图形开发。 Read More

CS349 Assignment 1总结

Assignment 1主要是联系在C/C++环境下通过X11库来编写图形界面程序。相信对于C/C++的规范,各位都很熟悉了。要使用X11库,通常需要include的库有X11/Xlib.h和X11/Xutil.h。所有库的reference可以在X的官方网站查询到:http://www.x.org/releases/X11R7.6/doc/libX11/specs/libX11/libX11.html本文只是简单的介绍了X11的基础功能,抛砖引玉。具体的函数用法可以参考reference,这里就不再赘述了。 要注意的是,上面的官方reference是针对X11R7版编写的,而在这个作业中,我们使用的是X11R6。具体两个版本有什么区别,这点笔者也不是很清楚。。。= =||| 这里先总结一下X11相关的概念和定义。Sever指的是要显示这个图形界面的终端,也就是你面前的电脑,而不是运行程序的终端。display指的是程序到x11 server的连接。screen是显示器,为什么要把显示器单独列出来呢?因为根据显示器的基本属性,比如分辨率和配色的不同,显示的结果也可能会不同。window就指的是创建的窗口了,一个程序可以有多个窗口。 XOpenDisplay(“”)用来打开一个display,函数返回指向这个display的指针,函数参数是server的名称,一般留空即可,程序会自动使用默认值。相应的,XCloseDisplay(display)可以关闭这个display,其中的display就是前面返回的display指针。 XCreateSimpleWindow可以创建一个窗口,函数参数制定了窗口的display, screen, 在屏幕上的位置,大小,背景色,创建出来的窗口默认是不会映射到服务器显示的。XDestroyWindow则可以销毁窗口。窗口创建好了之后需要使用XMapRaised函数来把创建的窗口映射到服务器显示。 程序生成的X11指令并不是实时发送到服务器执行的,XFlush函数可以强制把队列中的x11指令发送到服务器执行。而XSync函数出了具有XFlush的功能,但是XFlush只是将指令发送就会返回,并不保证所有的指令都已经发送完毕了。XSync函数可以保证这一点。(注意,是指令都发送完毕,而不是服务器接受并处理完毕) XSelectInput指令可以制定窗口希望接收到的事件类型,比如窗口重绘,鼠标移动,鼠标点击,键盘按键按下和释放等等。XNextEvent可以用来接收事件,如果当前没有需要处理的事件的话,函数会一直等待,直到下一个事件接受之后才会返回。但有时候我们不希望程序因此而暂停执行,这时可以用XPending函数来检查当前事件队列的长度,如果返回0的话,我们就知道如果调用XNextEvent可能会导致线程被暂停了。 绘图指令函数有很多种,XDrawLine, XDrawPoint, XDrawRectangle, XDrawArc, XDrawLines, XDrawArcs, XFillPolygon, XFillRectangle, XFillArc等等。。。用法各位从函数名称基本就能猜出来了,参数也大同小异。 Graphic Context,简写GC,就像网页的css文件一样可以管理绘图函数的绘制风格,比如线条宽度,颜色,虚实线等等,几乎所有的绘图函数都需要传入一个gc。GC常用的建立方法有两种,一个是通过XGCValues;另一个则是直接创建GC,然后通过XSet类型的函数来设置。由于一个GC包含很多种属性,前者适合设置大量属性;后者则适合设置少量,或者在创建之后修改GC。 由于所有的绘图信号都是通过网络发送到本地X11服务器的,网速的快慢一定程度上会影响显示效果。usleep函数暂停线程执行的功能在这里就会显得尤为重要,一定程度上可以缓解由于网速而导致的画面闪烁。 整个assignment建议使用一个星期左右的时间完成。GL HF Read More

从C++到JAVA

JAVA和C++都是目前最常见的编程语言。众所周知,JAVA起源于C++,因而两种语言在很多地方大同小异。但不同之处也是需要我们注意的。JAVA禁用了很多C++独有的特性,也加入了非常丰富的库和函数。下面我们来看看以C++的基础如何迁移到JAVA。 1. 变量与数据类型 JAVA不再支持自动类型转换。在C/C++中,等号两边的数据类型不一致(比如int和float),会自动执行转换。但在JAVA中不可以;如果等号两边数据类型不一致,必须手动转换(cast)。 Boolean值不再能够使用任何数据代替。C++默认0(NULL)是false,否则都是true。但是JAVA不再允许这样。必须被声明成boolean的数据才可以是true, false。 JAVA不支持typedef JAVA不支持unsigned JAVA中所有的对象都是pass by reference的(换句话说,凡是new出来的东西都是pass by reference的,因为JAVA不支持pointer) JAVA的对象必须通过new来分配,不能像C++那样直接声明在函数的stack上。 JAVA的数组必须通过new来分配,不能直接放在函数stack上。 JAVA中字符不是char而是byte。 2. 对象(Object)和类(Class) JAVA是一个完全面向对象语言,也就是说,所有的函数和变量都必须放在类(Class)里面。类似C++里面的全局变量和函数是不会出现在JAVA里面的,因为C++只是给C加上了面向对象的功能而已。在C++里我们写 int global; int main(int argc, char* argv[]) {      return 0; } 而在JAVA里面就要写成 public class Main {      int global;      public static void main(String[] args) {      } } JAVA没有header file,也就是说不能像C/C++那样通过引用header文件来找到需要的函数。JAVA不必要在文件中做额外声明就可以使用同一个文件夹下面的其他class和里面的公共函数。但是要注意,一个JAVA文件只能有一个公共类,而该文件的文件名必须是类的名字。比如public class Main就必须在Main.java文件中,区分大小写。 JAVA是完全面向对象语言,也就是其中的一切都是一个object。包括C++里面最基本的数据结构,int, float还有array这种抽象概念在JAVA中都有相对应的class。这些数据结构可以在Oracle官方网站上面的Java Read More

建站手记

写在前面: 由于答应了另外一个nerd朋友写下我全部的建站过程,博主特决定在此跟大家分享我建立这个网站的经过和一些经验。   1、从零开始      刚拿到服务器root权限的时候无比激动,果断ssh连接服务器。因为此前没有任何建站经验,除了玩过xampp。而xampp的“罪恶”之处就在于他把什么都给你配置好了,自己什么都不用管。。。。但是他是以最开放模式来配置的,也就是最不安全,但是功能最全面的模式。在真正的服务器上面,必然是不能这样的,除非你这个服务器是用来给大众娱乐的。。。。      废话少说,刚拿到的Ubuntu服务器是纯净的,纯净到连编译器都没有。幸好我们有apt-get     apt-get update     apt-get install gcc       第一步更新apt软件源缓存,第二部安装gcc。这里特别注意apt-get参数update和upgrade的区别,前者更新软件源缓存,后者则是根据当前软件源和已安装软件检查是否有更新。     如果你喜欢的话,可以接着安装g++,方便以后编译C++程序。 由于后面我们要添加对php5的支持,而php5需要libxml2才能运行,这里建议安装libxml2。打开http://xmlsoft.org/downloads.html下载libxml2并解压。 ./configure make make install 安装过程跟大多数针对linux开发的开源软件大同小异。 2、菜鸟上路      由于木有那么多钞票,我买的空间没有附带任何文件管理,不支持FTP。。。。于是除了学会使用wget命令下载,还要有个更方便顺手的工具来帮助我们配置服务器。这里我使用的webmin,可以前往官方网站下载最新版。(注意是用wget命令下载到服务器上,不会用wget的朋友请自己man之,学无止境)      建议下载tar包,因为是ubuntu,rpm神马的用起来就会比较麻烦。用tar -xvf webmin.tar.gz命令解压(请替换webmin.tar.gz为真实的文件名)进入解压出来的文件夹,执行一键安装脚本 sh setup.sh     安装程序会问你几个问题,大多数保持默认就可以了。port不建议使用默认的10000,因为容易被别人猜到。后面还有设置登录用户名密码什么的,按照自己情况写就行。安装完成之后,就可以通过在浏览器输入IP:port登录了。webmin提供非常丰富的服务器配置功能,甚至可以自动帮你安装MySQL。(我就是这么装的,在webmin主页选择severs->MySQL会提示没有安装MySQL,同时有安装选项) apt-get拉了我第一把,但是提供的软件源却很少。接下载我们要换用另外一个软件安装程序,aptitude。   3、渐入佳境 输入apt-get install aptitude来安装aptitude。 由于我买的VPS自带了apache2,(这点很令我惊异啊,连gcc都没有居然有apache)这里我就不详述apache2的安装过程了。安装命令是aptitude install apache2 Read More

Interprocess Communication

问得最多的问题: What is message boundary?     Message boundary应用于UDP通讯(datagram model),是因为UDP通讯不保证从一个端口送出的前后两个数据包会发送到同一个目的地。因而发送数据也不需要connect()。所以每次发送数据,我们都要把数据包的收件人写进去,这个就是message boundary。TCP通讯(stream model),在传输数据之前需要connect(),从一次connect之后发送的数据一定会发送到跟你connect的地方。     为什么说TCP是可靠的,一个原因就是因为连接可以保证整个数据传输通道是两个end-point processes独享的,数据是怎么发出去的,就是怎么接到的。而UDP每次发出的数据都是独立的,而网络设备(网卡,路由器。。。)在同时接收到两个数据包的时候,会随机选择发送顺序。也就是说,你发出数据包的顺序(包括两个数据包发送时间的间隔)不一定会是对方接收到的顺序(或时间间隔)。 Read More