请问申请GT的freshman 15(int...

C语言中可以限制输入类型吗??例如只可以输入数字,输入其他会报错!!_百度知道
C语言中可以限制输入类型吗??例如只可以输入数字,输入其他会报错!!
如可以的话,请教教小弟好吗??
%d&&#92.h& v=0,int*num){*num=s-&gt:&s-&typedef struct{int data[71],&num);n]:&Stack s={{0};}int main(){else printf(&,scanf (&n&; exit(1);),w+55);while(;Plen]=);DisChangeTo(,&f);%c&%d&%d&;if (v==1){printf (&}else {printf(&);}void Push(Stack*s;=f,&v);),0};=9) printf(&quot,f)!\void Pop(Stack*s:&if(f==8||f==16||f==2) {printf(&scanf (&quot,v,int num){s-&}void DisChangeTo(n--;);num/n&quot.n==0)return 1!IsEmptyStack(s)){Push(&s;\%d&else return 0;;=0&&w&if(w& v=0;Please input the jinzhi,int f){int w=0;}printf(&}printf(&Please chose the action 0 for exit 1data[s-&gt,&w);0){Pop(&s,w);}int IsEmptyStack(Stack s){if(s;}S;data[s-&while (1){printf (&quot#include&scanf (&quot:&s-&}else{printf (&n%);
while(num&The jinzhi is wrong\This action is wrong,num%f);),f);pause&n++;n&}} else if (v==0){system(&quot
提问者采纳
else&#47,如果只输入一个字符while去掉;&#47,申请变量的时候就申请int型的..假设你只想要数字;) /='如果是数字怎么样;='&#47.;接受输入;n&#39.}注意上面用while是循环输入;0&#39.{if(c&gt.while((c=getchar()).希望能给你些帮助;9') &#47,并且判断是否非空.估计还会崩溃~还一种方法就是接受输入后判断一下;这地方就不能用int了!=&#39,就如上边说的-接受到字母会崩溃,用户输入字母的话程序就报错了.;&#47.如果不想用while就用char[100]类这的数组.;&#92..&&c&/如果是非数字怎么样可以实现.;&#47
提问者评价
虽然还是没能解决,不过谢谢你们的帮忙!!
其他类似问题
为您推荐:
c语言的相关知识
其他2条回答
断是否为数值,不是则报错,就能把限定在数字范围内了。另外就从ASCII来判断。用个if判断就OK了,大于小于,应该有个函数能比较是否为数值的,是就通过
没有这个函数。不过可以自已编写。比如输入数字,你就把数字当作字符串进行录入,再作检查,如果其中有非数字字符刚报错。然后再写一个函数把字符串转为int型或者double。给你要用到的函数吧
template &class TYPE&
void CharToNum(char *string,TYPE *num)
//通过使用模版,把char型转换成任意型。
//这样通过读入字符串,再转换成int,
unsigned int m=strlen(string);
for(unsigned int i=0;i&m;i++)
*num=*num*10+(*(string++)-'0');
int InputIntOnly(char *string)
//用户只能向屏幕输入数字
while(*string!='\0')
if((*string&='0'&&*string&='9'))
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁1.1 回调函数(CallBack Function)
&&& 所谓回调函数,本质就是函数指针。所以先要搞清楚函数指针的问题。
1.1.1 函数指针
&&& 一个函数占用一段连续内存。当掉用一个函数,实际上是跳转到函数入口地址,执行函数体,完成后返回。函数的入口地址是由函数名来标记的。&&& 函数指针是一种特殊类型的指针,它指向一个函数的入口地址。&&& 声明函数指针的语法形式为:&&&& 类型 (*函数指针名)(形参列表)&&& 例如:&&& 定义指向函数int func1(int arg11,char arg12)与int func2(char arg)的函数指针&&& int (*pfunc1)(int ,char)&&& pfunc1=func1;//将函数func1的地址赋给函数指针pfunc1&&& int (*pfunc2)(int)&&& pfunc2=func2;&&& 从函数指针的定义可以看出,函数指针的类型实际上是由函数签名决定的。函数签名包括函数名、函数形参类型的有序列表和函数返回值类型。&&& 一个函数指针的定义规定了它只能指向特定类型的函数。如果两个函数的形参列表和返回值类型相同,只有函数名和函数体不同,则可以使用相同类型的函数指针。&&& 函数指针的使用:int (*fp)(int a);fp=//将函数test的地址赋给函数学指针fpcout&&fp(5)&&"|"&&(*fp)(10)&&&&& //上面的输出fp(5),这是标准c++的写法,(*fp)(10)这是兼容c语言的标准写法,两种同意,但注意区分,避免写的程序产生移植性问题!&&& 实际用途:&&& 实际上还有一种特殊的或说通用的函数指针,在定义这类函数指针时,只需要指定函数返回值类型,而留空形参列表,这样就可以指向返回值类型相同的所有函数。例如:int (*pfunc)();&&& 这样定义的pfunc就可以指向前面提到的func1和func2,因为他们都返回整型值。&&& 经常见到使用typedef来定义函数指针的类型,typedef 方法可以有效的减少括号的数量,以及理清层次,所以受到推荐。其方法如下&&& typedef void(* FP)(char);//这里不是声明函数指针,而是定一个函数指针的类型&&& FP func3; //用上面定义的函数指针类型定义了func3的函数指针
&&& 函数指针最常见的三个用途是:&&& ①作为参数传递给其他函数。&&& 这样可以把多个函数用一个函数体封装起来,得到一个具有多个函数功能的新函数,根据传递的函数指针变量值的不同,执行不同的函数功能。这是函数嵌套调用难以实现的。参数的传递可以由程序员设定,也可以由用户输入读取,因此具有较大的灵活性和交互性。&&& 另外还可以用于回调函数。使用void配合,还可以将对不同数据类型的数据进行相同处理的多个函数封装为一个函数,增强函数的生命力。&&& 函数指针、回调函数屏蔽了函数的差异性。具体理解。&&& ②用于散转程序。&&& 这种程序首先建立一个函数表(实际上是一个函数指针数组),表中存放了各个函数的入口地址(或函数名),根据条件的设定来查表选择执行相应的函数。这样也可以将多个函数封装为一个函数或者程序,散转分支条件可以由程序员设定,也可以由用户输入读取,甚至是外设的某种特定状态(这种状态可以是不受人为控制的)。&&& ③实现C的面向对象的类的封装。&&& C语言中的struct与C++中的class有很大不同,除了缺省的成员属性外(struct的成员缺省为public的,可随意使用,而class成员缺省为private的),struct还很难实现类成员函数的封装。struct的成员一般都是数据成员,而非函数成员。因此,为了在C语言中,为某个struct定义一套自己的函数对结构数据成员进行操作,可以在struct结构体中增加函数指针变量成员,在初始化时使它指向特定函数即可。应用举例:&&& 1、假设定义了四个函数:add(int, int)、sub(int, int)、mul(int, int)、div(int, int),可以将其封装为一个四则运算计算器函数:&
<span style="color: #&&double&calculator(int&x,int&y,int&(*pfunc)(int,int))&{<span style="color: #&&&&&double&<span style="color: #&&&&&result&=&pfunc(x,y);<span style="color: #&&&&&return&<span style="color: #&}
&&& 又例如,在一个链表查询程序中,要通过比较节点的特征值来查询节点,不同类型的数据的比较方式不一样,整型等可以直接比较,字符串却要用专门的字符串操作函数,为了使代码可重用性更高,可以使用一个比较函数来代替各种不同数据类型的直接比较代码,同时,比较函数也必然是数据类型相关的,因此要使用void指针和函数指针来转换为类型无关的比较函数,根据相应的数据类型,调用相应的函数(传递相应的函数指针)。一个实例是:&&& int (*compare)(void const *,void const *);&&& 这个函数指针可以接受任意类型的数据的指针参数,同时返回int值作为比较结果标志。一个比较整型数据的比较函数是:&&
int&compare_ints(void&const&*a,&void&const&*b)&{&&&&if(&*(int&*)a&==&*(int&*)b&)&&&&return&<span style="color: #;&&&&else&&&&return&<span style="color: #;}
&&& 2、散转程序。通过一个转移表(函数指针数组)来实现。还是上面定义的四个四则运算函数,可以建立这样一个转移表(注意初始化该转移表的语句前面应有add等相应函数原型声明或定义):double (*calculator[])(int, int) = {&&& add, sub, mul, div};&&& 这样,calculator[0] == add,calculator[1] == sub,...&&& 使用result = calculator[oper](x, y);就可以代替下面整个switch语句:
&switch( oper ) {&& case 0: result = add(x, y);&& case 1: result = sub(x, y);&& ...}
&&& 3、C的面向对象化。一个对象包括数据和对数据的操作。C语言中的struct只有数据成员,因此要增加一些&#8220;伪数据成员&#8221;即函数指针来实现对数据的操作。例如:
Code#ifndef&C_Class#define&C_Class&struct#endifC_Class&student{&&&&C_Class&student&*student_&&&&char&&&&&int&&&&&int&&&&&int&&&&&&&&&void&(*Oper)(&C_Class&student&*student_this&);&&&&}&
&&& 1.1.2 回调函数
&&& 简言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。&&& 为什么要使用回调函数?&&& 因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。&&& 回调函数在实际中的作用。先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。&&& 例如,回调用于通知机制。有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上,SetTimer() API使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的消息队列。&&& 【函数指针与函数回调的方法屏蔽了函数实现的差异性。对主调函数而言,回调函数可否看做主调函数的一个需接口。主调函数使用回调函数,有时需要为回调函数提供参数,但从不关心回调函数由谁来实现以及实现的细节。】
阅读(...) 评论() &推荐知行学社的分布式系统与Paxos算法视频课程,循序渐进,讲解地比较浅显易懂。&br&&a class=&video-box& href=&///?target=http%3A///programs/view/e8zM8dAL6hM/& target=&_blank&&
&img class=&thumbnail& src=&/154/851/155/p.jpg&&&span class=&content&&
&span class=&title&&paxos和分布式系统&span class=&z-ico-extern-gray&&&/span&&span class=&z-ico-extern-blue&&&/span&&/span&
&span class=&url&&&span class=&z-ico-video&&&/span&/programs/view/e8zM8dAL6hM/&/span&
推荐知行学社的分布式系统与Paxos算法视频课程,循序渐进,讲解地比较浅显易懂。
答案已更新(16.04.13)。&br&&br&其他回答者资料给的很充足了,这里补充点类似于学习路径的东西。&br&一个领域的成功,既要看自身的努力,也要考虑到历史的进程。&b&学习深度学习的一个很好的路线就是跟着历史的进程学习一番。&br&&/b&&br&除了一些基础的机器学习知识,在学习和理解Deep Learning之前,需要先对于Neural Network和AutoEncoder这两个模型有所了解,特别是后者,AutoEncoder的隐藏层与输入层的关系、使用AutoEncoder来pre-training一个多层网络。&br&&br&下一步就是要理解『简单的增加神经网络深度』会遇到什么问题。比如diffusion of gradients,比如严重的over-fitting,比如计算时间开销。&br&继续下去,要知道这些问题的原因与解决办法,这一步就映射到神经网络向深度学习的发展过程,比如pre-training(甚至包括大约在10年左右,pre-training技术的变化)、dropout、ReLU等技术的出现以及我们现在有能力(计算能力、相对于以前的大数据量)处理深层网络。&br&到这里,初步理解通常意义的Deep Learning模型就是深度神经网络。&br&&br&&b&但是接下来的才是关键。&/b&&br&&br&&u&对于不同的应用方向,有不同的具体的DNN的模型,比如CNN之于图像,RNN之于NLP。&/u&&br&&br&这里以CNN为例子。CNN的特殊的一些地方在于:卷积、池化、子采样、白化、权值共享等等非常多的技术。每一个都是一个概念/方法。这是CNN所特有的。如何理解这些技术呢?&br&动手实现一个LeNet然后跑一下Minst数据集的手写识别(或者自己搞点图像数据),学以致用,会帮助建立好的直觉,甚至可能不懂的地方也慢慢理解了。&br&不过一个比较有趣的概念是 卷积。&br&&i&------这个地方说得不是很好,但是我也不知道怎么表达更清楚点------&/i&&br&卷积这个东西有很多种理解方式:比如信号处理的理解、数学/物理上的理解、或者我的理解 :-D&br&『个人现在持有的看法是,这些技术都围绕一个重要的观点:减少网络参数(包括卷积也是有这个功能的)。其实每一个技术,都有自己更具体的意义,但是有共性的地方』。&br&对于使用CNN,要知道现在最常用的方法:AlexNet等的pre-training+具体问题的fine-tuning这种手段:&b&&u&一定要读一下一些相关paper&/u&&/b&。&br&&br&至于RNN,个人的经验是建议大家看一看Neural Network Language Model相关的工作。&br&&br&还有就是一定要动手,关于Deep Learning的库,除了经典的Caffe和Theano,这里推荐大家使用MXNet和TensorFlow。MXNet最令我喜欢的一点就是依赖极少(对我就是这么low。。。),轻便、易用以及丰富的文档和活跃的开发者社区;而TensorFlow,说真的这半年以来让我非常惊讶,具体参见这篇文章:&a href=&///?target=http%3A//www.gotoli.us/%25E8%25B0%%25B0%%25A4%25BA%25E5%258F%%25B7%25B1%25E5%25BA%25A6%25E5%25AD%25A6%25E4%25B9%25A0%25E5%25B7%25A5%25E4%25B8%259A%25E6%25A0%%E7%259A%%258D%25A3%25E8%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深度学习框架大&i class=&icon-external&&&/i&&/a&&br&除此之外,关于TensorFlow最近的进展&转自微博&:&br&&blockquote&TF迭代太快了,性能已经不比别的差了&a href=&///?target=https%3A///soumith/convnet-benchmarks& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub - soumith/convnet-benchmarks: Easy benchmarking of all publicly accessible implementations of convnets&i class=&icon-external&&&/i&&/a& ,这篇文章发时还是用cudnnv2,现在已经是v4了,v5版也在进行中,分布式版本预计下一个release接口会倾向稳定,最近刚加上了一个完全随机森林实现&/blockquote&--04.14更新--&br&昨天刚更新完答案,今早就看到Google最新博客:&br&&a href=&///?target=http%3A//googleresearch.blogspot.ru/2016/04/announcing-tensorflow-08-now-with.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&googleresearch.blogspot.ru&/span&&span class=&invisible&&/2016/04/announcing-tensorflow-08-now-with.html&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&&blockquote&Ever since we released TensorFlow as an open-source project, distributed training support has been one of the most requested features. Now the wait is over. &br&Today, we're excited to release TensorFlow 0.8 with distributed computing support, including everything you need to train distributed models on your own infrastructure. &/blockquote&也就是说:TF的0.8版本中,分布式的支持已经Ready!&br&&br&点评:你大爷还是你大爷...&br&&br&收藏之余,也给个赞吧~
答案已更新(16.04.13)。其他回答者资料给的很充足了,这里补充点类似于学习路径的东西。一个领域的成功,既要看自身的努力,也要考虑到历史的进程。学习深度学习的一个很好的路线就是跟着历史的进程学习一番。除了一些基础的机器学习知识,在学习和理解De…
谢邀。(严肃脸&br&(逼格是不是蹭蹭蹭连升了好几个档次?&br&1. 最好不要拿 Macbook 装 windows,即使必须要用 windows 的话能不装 xp 么?即使必须使用 xp 的话能麻烦升级一下 IE 么?&br&(以下均指使用 OS X)&br&&br&2. 不要装 360&br&&br&3. 不要装杀毒软件&br&&br&4. 不要装磁盘整理&br&&br&5. 自带的 Safari 很好用,Chrome for mac 也很棒。忘掉 IE 和什么三狗浏览器吧&br&&br&6. 合上盖就可以走,不需要经常关机…&br&&a data-hash=&e4c846aa6b7c9ae6b2cc387& href=&///people/e4c846aa6b7c9ae6b2cc387& class=&member_mention& data-editable=&true& data-title=&@慕楚云& data-tip=&p$b$e4c846aa6b7c9ae6b2cc387&&@慕楚云&/a& 提醒「就是这样我的朋友坏了个pro13的机械盘然后土豪地换了SSD么....」&br&修正一下:如果你用的是 ssd 那么没什么问题,如果是机械硬盘的话还是等呼吸灯好了再走吧…= = &br&&br&7. 日历的定时启动功能相当好用,夜深人静都睡着的时候下载小电影什么的…如下图:&br&&img src=&/5bd2f84291b_b.jpg& data-rawwidth=&281& data-rawheight=&434& class=&content_image& width=&281&&经&a data-hash=&34bae9f1afd7d2c7c3fe284& href=&///people/34bae9f1afd7d2c7c3fe284& class=&member_mention& data-editable=&true& data-title=&@朱文律 Wesley& data-tip=&p$b$34bae9f1afd7d2c7c3fe284&&@朱文律 Wesley&/a& 提醒发现,提醒里面可选的「信息」并不是指自动发 iMessage,而是蹦出来一个日历提醒…= = &br&&br&&b&&u&&i&亲们,这个休眠或者关机的时候真的不能自动运行啊……………………&/i&&/u&&/b&&br&&br&8. 如果你是程序员最好学会使用 Alfred,如果你只是普通用户那也应该学会用 Spotlight. Alfred 有各种好用的 workflow &b&&u&强烈推荐&/u&&/b&!具体请看:&a href=&///?target=https%3A///zenorocha/alfred-workflows& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&zenorocha/alfred-workflows · GitHub&i class=&icon-external&&&/i&&/a&&br&我最近最喜欢的是这个 workflow,不用再跑到 terminal 里面找 pid 了…&br&&img src=&/53eb8d219b83f859a2dfa_b.jpg& data-rawwidth=&611& data-rawheight=&177& class=&origin_image zh-lightbox-thumb& width=&611& data-original=&/53eb8d219b83f859a2dfa_r.jpg&&关于 alfred workflow 也可以看 &a href=&/question/& class=&internal&&借助 Alfred 2.0 的 Workflows 功能可以做哪些好玩的事情?&/a& 这里&br&&br&9. 触摸板可以设置成触摸板轻敲替代按下的…&br&&br&10. Bartender 可以把菜单栏中不太常用的给设置到二级菜单里,看图:&br&&img src=&/9f6fd553d5a8c79c3ba348b55ba5e379_b.jpg& data-rawwidth=&693& data-rawheight=&21& class=&origin_image zh-lightbox-thumb& width=&693& data-original=&/9f6fd553d5a8c79c3ba348b55ba5e379_r.jpg&&上面这个是平时的状态&br&&img src=&/7c58ecd6e0f0_b.jpg& data-rawwidth=&788& data-rawheight=&44& class=&origin_image zh-lightbox-thumb& width=&788& data-original=&/7c58ecd6e0f0_r.jpg&&这个是点开以后的状态,一些不常用的都丢到这里&br&好吧其实那个 Mem,CPU,上下行,温度,都是用 iStat Menu 2 看的…&br&&br&11. Dash + alfred 很好用,程序员必备&br&&img src=&/ef1c4f1fe66b29014e08de_b.jpg& data-rawwidth=&940& data-rawheight=&681& class=&origin_image zh-lightbox-thumb& width=&940& data-original=&/ef1c4f1fe66b29014e08de_r.jpg&&这是纯 Dash,加上了 alfred 以后就变成了下面这样:&br&&img src=&/2db6c66ca532b85407bce_b.jpg& data-rawwidth=&597& data-rawheight=&442& class=&origin_image zh-lightbox-thumb& width=&597& data-original=&/2db6c66ca532b85407bce_r.jpg&&&br&12. Moom 可以很方便地调整窗口,一目了然:&br&&img src=&/f0f2c203e8d04ded99fc84b_b.jpg& data-rawwidth=&211& data-rawheight=&91& class=&content_image& width=&211&&&br&&br&13. Boom 可以增大音量和增强音效,如图:&br&&img src=&/cff22dc213d489aadf31b4ec5b9785fa_b.jpg& data-rawwidth=&648& data-rawheight=&527& class=&origin_image zh-lightbox-thumb& width=&648& data-original=&/cff22dc213d489aadf31b4ec5b9785fa_r.jpg&&&br&14. Popclip 把 iOS 上面很方便的功能带回到了 Mac OS X 上面来,我不太喜欢这个东西,因为举得快捷键已经很方便了,具体效果请看官网:&a href=&///?target=http%3A///popclip/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PopClip for Mac&i class=&icon-external&&&/i&&/a& 各种插件请见:&a href=&///?target=http%3A///popclip/extensions/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PopClip Extensions&i class=&icon-external&&&/i&&/a&&br&&br&15. 如果你内存够大并且没有用 ssd 的话,那么可以考虑用 Tmpdisk 把一部分内存划出来当成缓存来用。512M 就足够了。&br&&br&16. 老板来围观你工作但是你的 SNS / IM 蹦个不停?乖,别怕!打开通知中心,往下划一下可以看到这个!&br&&img src=&/9cc82a892b8b97e7c2eca_b.jpg& data-rawwidth=&287& data-rawheight=&86& class=&content_image& width=&287&&&br&&br&以下是
&a data-hash=&aab926def3e943c58f895b8& href=&///people/aab926def3e943c58f895b8& class=&member_mention& data-tip=&p$b$aab926def3e943c58f895b8&&@华承韬&/a& 提到的改良版本,最近一直在用,确实很爽- - &br&&br&&blockquote&其实不用那么麻烦……&br&按住 Option 按键,并单击右上角的「通知中心」图标。图标变灰之后就不用怕老板啦。&br&再重复一遍上述操作可还原。&br&这招要比「打开通知中心,往下划一下」快多了。。&/blockquote&&br&&br&17. control + shift + eject(右上角倒三角)可以锁屏,什么?还嫌麻烦?没关系!触发角来帮助你!&br&&img src=&/62c492b16a4671138edbd67b27cf0d95_b.jpg& data-rawwidth=&589& data-rawheight=&193& class=&origin_image zh-lightbox-thumb& width=&589& data-original=&/62c492b16a4671138edbd67b27cf0d95_r.jpg&&从此以后离开电脑的时候优雅地甩一下鼠标~蹬蹬蹬蹬,电脑就锁上了!再也不怕有人偷看你的小黄片儿了!(触发角在「桌面与屏幕保护程序」-「屏幕保护程序」)&br&&br&18. Mission Control 可以用鼠标多出来的按键来触发的~&br&&img src=&/209b4cfff_b.jpg& data-rawwidth=&625& data-rawheight=&217& class=&origin_image zh-lightbox-thumb& width=&625& data-original=&/209b4cfff_r.jpg&&&br&19. 勾上这个「互联网共享」就可以把以太网接口的网络共享成 Wi-Fi 了……&br&&img src=&/bec96627dfb8f894afc4e18_b.jpg& data-rawwidth=&637& data-rawheight=&297& class=&origin_image zh-lightbox-thumb& width=&637& data-original=&/bec96627dfb8f894afc4e18_r.jpg&&类似的,「远程登录」是 ssh 连接,「屏幕共享」是 vnc……程序员都懂的……&br&&br&20. iTunes 智能播放列表很好用的…&br&&img src=&/7a0ea9cf8cf5_b.jpg& data-rawwidth=&537& data-rawheight=&186& class=&origin_image zh-lightbox-thumb& width=&537& data-original=&/7a0ea9cf8cf5_r.jpg&&这样可以把我最喜欢的并且不太大的歌曲(iPhone 16G 的所以…太大的可能是 FLAC/APE 等等)挑出来…&br&感谢 &a data-hash=&0df2dfb75d7eba046b53d9f& href=&///people/0df2dfb75d7eba046b53d9f& class=&member_mention& data-editable=&true& data-title=&@李浩博& data-tip=&p$b$0df2dfb75d7eba046b53d9f&&@李浩博&/a& 提醒,可以使用这个更方便的功能= = &img src=&/e07bf1ab57b52fd4d96a4f_b.jpg& data-rawwidth=&362& data-rawheight=&264& class=&content_image& width=&362&&&br&刚才随便测试了一下(码率没关注,就试试效果),之前 220M 的 mp3 勾选了这个以后再传到 iPhone 里大概是 160M 左右…&br&&br&21. 什么?你居然还不知道在 OS X 中空格键可以预览 &b&&u&几乎所有的 &/u&&/b&东西?&br&&br&22. 关注 Mac Apps 的可以关注一下 &a data-hash=&ebfb3dea54a18f96d4c8cbb& href=&///people/ebfb3dea54a18f96d4c8cbb& class=&member_mention& data-editable=&true& data-title=&@hzlzh& data-tip=&p$b$ebfb3dea54a18f96d4c8cbb&&@hzlzh&/a& 的这个 list:&a href=&///?target=https%3A///hzlzh/Best-App& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&hzlzh/Best-App · GitHub&i class=&icon-external&&&/i&&/a&(都是收费 apps 但是质量非常高)&br&&br&23. 我刚知道的,切换这里的「位置」就可以不用老是调网络设置了……(公司可能有固定 ip 什么的&br&&img src=&/5a93be2eb2fbdaed98501e_b.jpg& data-rawwidth=&360& data-rawheight=&265& class=&content_image& width=&360&&&br&&b&&u&注意&/u&&/b&经&a data-hash=&221c6ba2f5aa1f688da5& href=&///people/221c6ba2f5aa1f688da5& class=&member_mention& data-editable=&true& data-title=&@柯英& data-tip=&p$b$221c6ba2f5aa1f688da5&&@柯英&/a& 提醒发现,这个需要先在「网络偏好设置」顶部设置好才会出现……&br&&br&24. 对于程序员来说熟练掌握快捷键是很有必要的,下图可以自定义快捷键,就比如我就把 launchpad 绑定到了 F1 上(因为外接显示器的话好像还真没什么办法打开 launchpad?)mission control 是 F9&br&&img src=&/264b1939a2dca17f0b0f80dba9820a0f_b.jpg& data-rawwidth=&666& data-rawheight=&596& class=&origin_image zh-lightbox-thumb& width=&666& data-original=&/264b1939a2dca17f0b0f80dba9820a0f_r.jpg&&注意:这里的 F1 是需要按着 fn 键的&br&&br&25. 选中一个文件按 enter 可以直接改名的…&br&cmd + up 是回到上一层文件夹&br&cmd + down 如果是文件夹就进入文件夹,如果是文件就打开(比如说 .avi 就会自动调用播放器)&br&&br&26. 如果你尝试改过后缀名就会发现貌似直接改没效果,你需要右键,显示简介&br&&img src=&/0bd5d90cc10ebe23ed537a_b.jpg& data-rawwidth=&263& data-rawheight=&176& class=&content_image& width=&263&&然后在这里改好像才有用…不知道有没有人有更方便的办法?&br&感谢&a data-hash=&d8ea822ca313& href=&///people/d8ea822ca313& class=&member_mention& data-editable=&true& data-title=&@曾铭& data-tip=&p$b$d8ea822ca313&&@曾铭&/a& 提醒,在 Finder 的偏好设置中有相关设置。&br&不过…您的「编辑」为什么是 -1…&br&&img src=&/f771144bbbc602e9a74b3a_b.jpg& data-rawwidth=&631& data-rawheight=&266& class=&origin_image zh-lightbox-thumb& width=&631& data-original=&/f771144bbbc602e9a74b3a_r.jpg&&&br&27. 有的时候可能你需要改变默认的打开方式,比如说前一段我这里 MPlayerX 挂了,我就换了 VLC,但是我还需要把默认的播放软件改掉。继续看上面 26 的图,下面的打开方式可以改掉…再也不用担心看不了小电影了~&br&&br&28. 看到 &a data-hash=&ef4a4653bea6c24a2af1d0& href=&///people/ef4a4653bea6c24a2af1d0& class=&member_mention& data-editable=&true& data-title=&@刘帅& data-tip=&p$b$ef4a4653bea6c24a2af1d0&&@刘帅&/a& 推荐 zsh,那我就推荐个主题配合 git 一起用。&br&编辑 ~/.zshrc 把这一行改成:ZSH_THEME=&juanghurtado&&br&效果如图:&br&&img src=&/f8a960e2eb7d84c7df3aa7dcc3358a38_b.jpg& data-rawwidth=&591& data-rawheight=&218& class=&origin_image zh-lightbox-thumb& width=&591& data-original=&/f8a960e2eb7d84c7df3aa7dcc3358a38_r.jpg&&&br&29. 我是个懒人…所以…请看我的 git alias…用惯了以后去服务器配东西(没有 alias)就各种不适应= = &br&&img src=&/68378dde7bc7a1fb412e6edcce78744f_b.jpg& data-rawwidth=&343& data-rawheight=&214& class=&content_image& width=&343&&好吧,其实我也不明白当初为什么要把 branch 起名叫 develop 而不是 dev…&br&&br&30. 感谢 &a data-hash=&0062185bed018d61b1c44eac& href=&///people/0062185bed018d61b1c44eac& class=&member_mention& data-editable=&true& data-title=&@李嘉鹏& data-tip=&p$b$0062185bed018d61b1c44eac&&@李嘉鹏&/a& 补充:&br&&blockquote&查看多个文件占用的容量 ctrl + command + i&br&&br&把多个文件归类到一个文件夹中:选中你想要的文件 按control+command+n&br&&br&快速关机 正常左上角苹果-关机会出来个对话框 按住option再点关机就不会出现了 其实按住option很多菜单会发生些小变化,自己探索吧~&br&&br&调整声音的时候,系统会发出“嘟嘟”的声音,按住shift键就没了&br&&br&同时按shift+option, 可以4分1格调节(这个同样适用键盘背光和屏幕亮度)&/blockquote&
谢邀。(严肃脸(逼格是不是蹭蹭蹭连升了好几个档次?1. 最好不要拿 Macbook 装 windows,即使必须要用 windows 的话能不装 xp 么?即使必须使用 xp 的话能麻烦升级一下 IE 么?(以下均指使用 OS X)2. 不要装 3603. 不要装杀毒软件4. 不要装磁盘整理5. 自…
首先是:&br&x86汇编中,对任何内存地址中的1byte的读永远是原子的.也就是说对一个char的读取永远是原子的,对内存地址对齐2byte的int16类型的读取是原子的,对4byte对齐的int32类型读取是原子的,从从奔腾开始,对8byte对齐地址的int64读取是原子的.所以如果你用的是汇编,保证这些就行了.但C/C++中又是另一番情景:&br&&br&C/C++中,编译器保证基础类型的内存对齐,例如保证double类型的对齐是8(或者4,忘了),&br&即使是malloc出来的也可以保证对齐.但是由于各种不可避免的指针转换,例如 char a[4],float* p=(float*)a的存在,使得对齐的保证基本名存实亡.而且,当一个比较长的类型,例如double被编译器放入寄存器的时候,C++标准根本不保证只用一条指令就将它放入一个寄存器中.例如我可以先把前半部分放入eax,等一会儿再把后半部分放入edx等等.不过,如果你能够确保对齐,那么大多数情况下虽然UB,但你的代码还是有可能正常工作的.&br&&br&再然后,其实上面说的根本不用考虑,因为在C/C++标准中,一个变量除了使用atomic相关的函数以外,任何多线程同时进行的读写实际上都是UB.所以,除非使用标准中的atomic功能,或者使用编译器自带的一些扩展,例如InterlockedAdd之类的,否则都是bug的隐患.例如,有非常多的开O2以上优化就出错的多线程相关代码就是由于类似的原因导致的.&br&&br&一个很经典的例子就是一个网上流传的很广的C++的单例类,以下是那段代码:&br&&div class=&highlight&&&pre&&code class=&language-text&&class SingleTon{
static SingleTon* getInstance(){
if(NULL == instance){
EnterCriticalSection(&cs);
if(NULL == instance){//双检锁,在进入临界区后再检测一次是否对象已经建立
instance = new SingleTon();
LeaveCriticalSection(&cs);
static SingleTon*
//........................
&/code&&/pre&&/div&&br&这个双检锁的代码很可能不能正常工作,因为首先是编写者没有告知编译器必须假设instance是可能被其他线程改变的,因此编译器完全可以认为两次if只保留一个就行了(当然也可能不会).因此首先instance必须改为volatile的,然后就是上面所说的原子性,instance应该改为atomic&Singleton*&.&br&&br&C/C++中变量的原子性其实是个巨大的坑,C++11和C11之前对多线程的问题几乎只字不提,也没有语言层面对原子性的保证,(上文中那段单例的代码应该也是C11之前出现的).所以程序员也没有更好的办法,只能使用GCC和VC里自带的那堆原子操作,或者懒了就直接不考虑这问题了.因此只能写这种有隐含问题的代码,现在没问题了,大胆用atomic&&吧.
首先是:x86汇编中,对任何内存地址中的1byte的读永远是原子的.也就是说对一个char的读取永远是原子的,对内存地址对齐2byte的int16类型的读取是原子的,对4byte对齐的int32类型读取是原子的,从从奔腾开始,对8byte对齐地址的int64读取是原子的.所以如果你用的是…
&blockquote&彩蛋:&br&&br&彩蛋已关闭&br&&br&骚瑞&/blockquote&&br&为后来的同学解释一下彩蛋怎么回事,顺便对昨晚12点之后收不到彩蛋的同学抱歉(鞠躬),被屏蔽了&br&&br&&ul&&li&彩蛋是如果赞了这条答案会自动收到一条随机的私信,里面是一则短笑话&/li&&li&笑话是在某网站上爬下来的,一共几十条随机发送&/li&&/ul&&br&起因是昨天写完原答案,突然想到如果加上彩蛋会不会很多人点赞(说我不是骗赞自己也不信)&br&&br&于是写了个小脚本,跑了起来试了一下&br&&br&第一次高潮出现在回答完30分钟后,突然多了一两百的赞,由于私信发送时间间隔太短,挂掉了&br&&br&修复后坚持到了晚上十二点,本机和VPS都不能再持续发送私信,于是停掉了&br&&br&今早起来发现赞又多了3000,崩溃的我决定还是不接着发了。。。&br&&br&代码和逻辑如下:&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&// 代码不全,只有主要的逻辑
// 用到的库如下:
var request = require('superagent');
var cheerio = require('cheerio');
var fs = require('fs');
// 首先是这样的一个接口,可以取到某个答案所有赞同的人数
// 每次取会返回10条数据,是编译好的HTML模版,还有下一组数据的地址
// 遍历这10条数据并取到所有人的ID即可
// config 是Cookie、Host、Referer等配置
var sourceLink = '/answer/' + code + '/voters_profile';
function getVoterList(link, fn) {
var next = '';
if (postListLength && !sleepIng) {
console.log('waiting');
sleepIng =
return setTimeout(function () {
sleepIng =
sleep = 1;
getVoterList(link, fn);
}, 1000 * 60);
request.get(link)
.set(config)
.end(function (err, res) {
if (err || !res.ok) {
return console.log(err);
var result = JSON.parse(res.text), voterList = '', $;
if (result.paging && result.paging.next) {
next = result.paging.
if (result.payload && result.payload.length) {
voterList = result.payload.join('');
$ = cheerio.load(voterList);
$('.zm-rich-follow-btn').each(function () {
var id = $(this).attr('data-id');
if (voterIdList.indexOf(id) === -1 && oldIdList.indexOf(id) === -1) {
console.log('new id: ', id);
voterIdList.push(id);
dupIdLen += 1;
if (next && dupIdLen & 20) {
setTimeout(function () {
getVoterList('' + next, fn);
dupIdLen = 0;
// 在爬取完该接口后,新的点赞人数会暂存在数组中,遍历该数组,并发送请求
// 如请求发送成功,将各ID保存在某一个文件中,如发送失败,等几分钟后重试
function sendPost() {
var hasError =
var tempArr = [];
postListLength = voterIdList.
console.log('send post');
if (voterIdList.length) {
voterIdList.forEach(function (id, i) {
if (hasError) {
// 处理发送失败的情况,等待5分钟重试
if (!sleepIng) {
console.log('waiting');
sleepIng =
return setTimeout(function () {
sleepIng =
sleep = 1;
sendPost();
}, 1000 * 60 * 5);
return console.log('has error');
var index = (function () {
var postIndex = index & postList.length ? index % postList.length :
setTimeout(function () {
// 一波发送完成之前不会启动下一波私信发送
postListLength--;
request.post('/inbox/post')
member_id: id,
content: postList[postIndex],
token: '',
_xsrf: '' // 这里是发送者的Cookie
.set(config)
.set({&Accept&: &*/*&})
.set({&Content-Type&: &application/x-www-form- charset=UTF-8&})
.end(function (err, res) {
console.log('hasError: ', hasError);
console.log(new Date());
console.log(res.text);
var resObj = {};
resObj = JSON.parse(res.text);
} catch (e) {
console.log(e);
if (!sleepIng) {
hasError =
sleep = 5;
console.log('waiting');
sleepIng =
return setTimeout(function () {
sleepIng =
sleep = 1;
sendPost();
}, 1000 * 60 * 5);
if (err || !res.ok || resObj.r !== 0) {
console.log(err);
hasError =
sleep = 5;
tempArr = voterIdList.slice(0, index);
oldIdList = oldIdList.concat(tempArr);
fs.writeFile('./idlist.json', oldIdList, function (err) {
if (err) console.log(err);
}, 20 * 1000 * index * sleep);
if (index === voterIdList.length - 1) {
console.log('last');
oldIdList = oldIdList.concat(voterIdList);
voterIdList = [];
setTimeout(function () {
console.log('run again');
getVoterList(sourceLink, sendPost);
}, 1000 * 60 * 15);
fs.writeFile('./idlist.json', oldIdList, function (err) {
if (err) console.log(err);
console.log('done ');
setTimeout(function () {
console.log('run again');
getVoterList(sourceLink, sendPost);
}, 1000 * 60);
&/code&&/pre&&/div&&br&代码花了半个小时写的,比较糙,不过跑了一下确实能用,既然已经不发了就不改了,有同学要求就发上来了&br&&br&PS 知乎的策略应该有变化,昨晚12点之前只要对同一个人两条私信不重复,把握好发送时间间隔就没问题,12点之后我的VPS已经不能用了,时间间隔再久也会返回500错误,1点后我的本机也不行了,不断的返回500和403,Cookie也有更新,索性就停掉了&br&&br&这是昨晚爬到的ID&br&&br&&img src=&/c5b1bfc4f8fcd5aad081a0e_b.png& data-rawwidth=&1270& data-rawheight=&906& class=&origin_image zh-lightbox-thumb& width=&1270& data-original=&/c5b1bfc4f8fcd5aad081a0e_r.png&&&br&还有我的视角所看的我的私信列表= =&br&&br&&img src=&/ed0d9b66_b.png& data-rawwidth=&730& data-rawheight=&905& class=&origin_image zh-lightbox-thumb& width=&730& data-original=&/ed0d9b66_r.png&&&br&就酱&br&&br&&br&==============================&br&&br&某人有一天书荒了,想要看豆瓣上的高分书,然而豆瓣并没有提供按评分的检索,于是拜托我写一个小东西,要求是能按现有标签来分类检索豆瓣图书,并按分数从高到低排序&br&&br&需求不难,就是数据没有,于是写了个爬虫按标签爬下来豆瓣所有的书&br&&br&爬的时候只爬了分类的列表,这样有书籍的名称,链接,评分,分类,够用了,而且一次请求可以拿到较多的数据,并发不高的情况下能较快的爬完豆瓣所有的书&br&&br&爬数据的时间大概两个多小时左右,每次请求间隔3秒,倒是没被屏蔽&br&&br&代码用node写的,包括外网访问的服务器,基本满足了某人的需要,现在跑在我自己的VPS上,有域名可以直接访问&br&&br&爬完知道豆瓣热门标签下大概有6万多本书,是会不断更新的,所以还要定期爬一下更新一下数据&br&&br&下面是预览,时间所限页面写的糙了点,反正用户就一个- -&br&&br&&img src=&/8f321ad177b7f820d98aa71c3c0f9aca_b.png& data-rawwidth=&1661& data-rawheight=&964& class=&origin_image zh-lightbox-thumb& width=&1661& data-original=&/8f321ad177b7f820d98aa71c3c0f9aca_r.png&&&br&&img src=&/9c6b7ffccb5053_b.png& data-rawwidth=&1663& data-rawheight=&964& class=&origin_image zh-lightbox-thumb& width=&1663& data-original=&/9c6b7ffccb5053_r.png&&&br&&img src=&/fcf79abbadc896ca91503d_b.png& data-rawwidth=&434& data-rawheight=&777& class=&origin_image zh-lightbox-thumb& width=&434& data-original=&/fcf79abbadc896ca91503d_r.png&&
彩蛋:彩蛋已关闭骚瑞为后来的同学解释一下彩蛋怎么回事,顺便对昨晚12点之后收不到彩蛋的同学抱歉(鞠躬),被屏蔽了彩蛋是如果赞了这条答案会自动收到一条随机的私信,里面是一则短笑话笑话是在某网站上爬下来的,一共几十条随机发送起因是昨天写完原答案…
推荐几个平台与几门好课&br&1.MIT OPEN COURSEWARE&br&顶尖学府的公开课项目,非常良心,大部分undergraduate的cs可都有video lecture(具体的可以上官网查看),一些经典的课程像离散数学,概率论,线代,AI,SICP,CLRS包括一些安全,系统方面的课程都配有详细的学习材料,视频课件。唯一不爽的一点是好像要挂vpn才能看视频(视频的链接在油管上)&br&2.Stanford的公开课项目&br&MIT 与 STANFORD真是教育界的良心,其出产的公开课质量,水准都很高。目前Stanford大部分的cs课都有了coursera上的mooc版本(像ML,编译器,密码学),但除了c站课程我还是要安利一门非常好的代码课---编程范式(Programming Paradigms),这门课从c,c++的高级内存管理一直谈到了lisp,Python等语言中的设计理念,对拓宽眼界有很大帮助。&br&3.c站,edx,学堂在线上的资源&br&这三家应该是在国内普及率比较高的mooc课程站,有优秀的课程,但也有质量比较差的课程,大家一般都比较熟悉,就不多讨论了,推荐几门不错的课程。&br&Coursera:Programming Language(Washington),&br&软硬件接口(Washington, Csapp配套),Cryptography(Stanford,非常有意思的密码课,还能学到很多网络安全方面的知识)&br&Edx:概率论(Mit),HTML5(w3c 出品,非常简单,入门级好课)&br&学堂在线:数据结构(非常经典的一门好课,清华出品,老师的课件做得很漂亮,讲得也比较细)&br&组合数学(清华出品,一门颇有特色的数学课),计算机网络概论(台湾清华出品,深入浅出)&br&&br&欢迎补充~
推荐几个平台与几门好课1.MIT OPEN COURSEWARE顶尖学府的公开课项目,非常良心,大部分undergraduate的cs可都有video lecture(具体的可以上官网查看),一些经典的课程像离散数学,概率论,线代,AI,SICP,CLRS包括一些安全,系统方面的课程都配有详细的…
&p&&b&&/b&&/p&&p&收藏6654,点赞才1649。。。&/p&&p&阿菇心里苦啊。。。收藏同时点个赞呗TvT&/p&&br&&p&优质的计算机课程很多,这里以个人学习经验为根据,分平台来细说,选了两家英文,两家中文的。如无具体说明,课程均为免费。&/p&&br&&p&&b&英文&/b&&/p&&p&&b&一、Coursera&/b&&b&:&/b&&br&&/p&&p&&b&1&/b&&b&、《编译原理》&/b&&/p&&p&&a href=&///?target=https%3A//www.coursera.org/course/compilers& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&coursera.org/course/com&/span&&span class=&invisible&&pilers&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&名声在外的课程,内容讲得很清楚,但作为毫无计算基础的一个文科生我学到后面有点吃力,最后我是没学完。相反,有理工科背景的朋友们评价说,课程性价比简直爆表,最后都作出了一个完整的编译器,分分钟虐翻文科生,汗。。。建议有基础的理工科同学去修读。&/p&&p&&b&2&/b&&b&、《机器学习》&/b&&/p&&p&&a href=&///?target=https%3A//www.coursera.org/learn/machine-learning& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&coursera.org/learn/mach&/span&&span class=&invisible&&ine-learning&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&img src=&/620a1fbc91a60fdc566e4_b.jpg& data-rawwidth=&634& data-rawheight=&230& class=&origin_image zh-lightbox-thumb& width=&634& data-original=&/620a1fbc91a60fdc566e4_r.jpg&&&br&&p&Coursera创始人的课程,老师也是机器学习这方面的大牛,对想要了解和初步掌握机器学习的人来说是不二的选择。课程配有需要动手做的实践作业,学习的孩纸最好有MATLAB基础。这门课的难度得辩证着来看,计算机专业的同学觉得是浅尝辄止,深度不够,而如果只有文科学习背景的可能会有点吃力。&/p&&p&&b&3&/b&&b&、《编程语言》&/b&&/p&&p&&a href=&///?target=https%3A//www.coursera.org/course/proglang& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Coursera - Free Online Courses From Top Universities&i class=&icon-external&&&/i&&/a&&/p&&p&一门在函数式编程里的神级课程!一般学校里应该很少学到这块专业的内容,理论实践相结合,难易增加程度在可控范围内。印象深刻的是各种经典变成范式的比较,分分钟让你认清高下优劣,知道自己从前写代码的缺陷。老师也是又耐心又好玩,为了让学生记住编写规则不惜牺牲自己的形象。&/p&&br&&p&&b&二、Udacity&/b&:&/p&&p&请注意,使用Udacity时请保持&b&良好的&/b&网络环境&/p&&p&&b&1&/b&&b&、《人工智能》&/b&&/p&&p&&a href=&///?target=https%3A///course/intro-to-artificial-intelligence--cs271& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/course/intr&/span&&span class=&invisible&&o-to-artificial-intelligence--cs271&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&img src=&/d8dfbbc573babcb89aea_b.jpg& data-rawwidth=&779& data-rawheight=&225& class=&origin_image zh-lightbox-thumb& width=&779& data-original=&/d8dfbbc573babcb89aea_r.jpg&&&p&Udacity创始人的课程,同样来自斯坦福大学,和《机器学习》之于Coursera一样,是U家招牌。据说,Sebastian
Thrun在开设这门课程并取得成功后,就离开了斯坦福,创办了Udacity,而现在,Udacity在IT互联网领域表现远超Coursera,估值也比Coursera高出一截,也能算是里程碑式的课程了。&/p&&p&2、《计算机程序设计:编程原理》&/p&&p&&a href=&///?target=https%3A///course/design-of-computer-programs--cs212& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/course/desi&/span&&span class=&invisible&&gn-of-computer-programs--cs212&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&来自Google大牛Peter Norvig的课程,现在已经有10万多学生在同时学习这门课程,也是个大热门。学习这门课程前,需要有一定编程经验,初入门者有难度。Google之前,他还在NASA Ames研究中心工作过。&/p&&br&&p&&b&--------------------------------------我是中文/英文分割线-----------------------------------------------&/b&&/p&&br&&p&&b&中文&/b&&/p&&p&&b&一、网易云课堂:&/b&&/p&&p&&b&1&/b&&b&、翁恺老师的计算机课程&/b&&/p&&p&《HTML5入门》&/p&&p&&a href=&///?target=http%3A///course/courseMain.htm%3FcourseId%3D171001& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&HTML5入门 - 网易云课堂&i class=&icon-external&&&/i&&/a&&/p&&p&《JavaScript》&/p&&p&&a href=&///?target=http%3A///course/introduction/195001.htm%23/courseDetail& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&JavaScript - 网易云课堂&i class=&icon-external&&&/i&&/a&&/p&&p&《面向对象程序设计-C++》&/p&&p&&a href=&///?target=http%3A///course/introduction/271005.htm%23/courseDetail& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&面向对象程序设计-C++&i class=&icon-external&&&/i&&/a&&/p&&p&翁恺老师是浙大计算机学院的老师,是国内最早从事在线教育的老师。本身在课堂上因为讲课循循善诱,讲课经验丰富,受到很多学生的喜爱,在线授课的时候,也不会出现新人教师面部表情僵硬等诡异的场景,节奏把握得很好。而且他的声音也很好听,会给上课加了很多分。现在云课堂上开的课程,基本选修人数都是上万的,所有课程加起来,同时选修课程的人数都该超过20万了,确实有一手。&/p&&p&&b&2&/b&&b&、大学计算机专业课程体系&/b&&/p&&p&&a href=&///?target=http%3A///curricula/cs.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&大学计算机专业&i class=&icon-external&&&/i&&/a&&/p&&img src=&/dcb7205daaa6a9c06182bbbc_b.jpg& data-rawwidth=&883& data-rawheight=&476& class=&origin_image zh-lightbox-thumb& width=&883& data-original=&/dcb7205daaa6a9c06182bbbc_r.jpg&&&p&这门课程最大的优点是体系性强。就如同他的标题写的一样,这个课程涵盖了计算机专业从大一到大四的所有课程,学完这些课程就能由浅入深全面掌握大学计算机技能,而且授课老师都是行业中比较优秀的老师,授课水平也不错,适合入门学习,也可以在期末复习时用于恶补。&/p&&p&&b&3&/b&&b&、《C/C++黑客编程项目实战课程》&/b&&/p&&p&前两门课都属于理论性比较强的,而这门课则是以实用性见长。整个课堂风格轻松愉快,而且每个理论的讲解中都伴有相应的实践案例作支撑,细致易。懂最后三分之一的课时全都是与C++相关的游戏项目的开发制作,对想提升实际操作能力的人帮助很大。&/p&&br&&p&&b&二、中国大学MOOC:&/b&&/p&&p&&b&1&/b&&b&、《大学计算机基础》&/b&&/p&&p&&a href=&///?target=http%3A//www.icourse163.org/course/nudt-17003%23/info& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&大学计算机基础&i class=&icon-external&&&/i&&/a&&/p&&p&主要以大一计算机课程难度的内容来安排,属于入门级、零基础向的课程,只要认真听课、按时完成作业,即使是计算机小白,软妹子也能学会。对于第一次在线学习计算机的童鞋来说,可以帮助自己树立信心,让你亲近MOOC。&br&&b&2&/b&&b&、《程序设计基础》&/b&&/p&&p&&a href=&///?target=http%3A//www.icourse163.org/course/hit-56001%23/info& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&程序设计基础_中国大学MOOC(慕课)&i class=&icon-external&&&/i&&/a&&/p&&p&老牌名校哈工大开设的MOOC课程,主要讲解基础编程内容。为了降低课程难度,在设计课程时,特意把“程序设计”这块内容拆成两门课程:《程序设计基础》,《C语言程序设计精髓》,《程序设计基础》作为基础入门课程,亲民性高,同样适合零基础入门。&/p&&p&&b&3&/b&&b&、《数据结构》&/b&&/p&&p&&a href=&///?target=http%3A//www.icourse163.org/course/zju-93001%23/info& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数据结构_中国大学MOOC(慕课)&i class=&icon-external&&&/i&&/a&&/p&&br&&img src=&/f70ccbc17f5e8b7d50215c5_b.jpg& data-rawwidth=&731& data-rawheight=&458& class=&origin_image zh-lightbox-thumb& width=&731& data-original=&/f70ccbc17f5e8b7d50215c5_r.jpg&&&br&这门课需要有一定编程语言的基础,它的授课老师是被同学称为“姥姥”的陈越老师,也是计算机课程中比较少见的女老师,不仅讲课很棒,而且对学生的问题有求必应,十分热情,不少学生在浙大选不到她的课程就跑到中国大学MOOC来选,也是令人称奇。
收藏6654,点赞才1649。。。阿菇心里苦啊。。。收藏同时点个赞呗TvT优质的计算机课程很多,这里以个人学习经验为根据,分平台来细说,选了两家英文,两家中文的。如无具体说明,课程均为免费。英文一、Coursera:1、《编译原理》…
gzip 只是一个流压缩程序,输入一个流,输出压缩后的数据流。给它一个文件,文件本身自然就是一个流,读入、压缩、输出,还是保存成一个文件,没有问题。然而,如果是一个文件夹、多个文件,该怎么办呢?按什么顺序?怎么存储文件以外的信息?(例如路径、权限。)操作系统没有提供一种可以把若干个文件组织成一个流的 API ,gzip 就无能为力。&br&&br&tar 则相反,它就是一个打包程序。天生就是为了处理打包多个文件的问题,它有专门的 manifest 来存储一些 metadata ,包括包里有什么文件、(相对)路径是什么、在包里的偏移量是什么……不过,它(最早)没有压缩功能。&br&&br&想要打包多个文件,很简单,先 tar 再 gzip ,一个管道就搞定了。后缀名自然而然就是 .tar.gz 了。&br&&br&以上说的都是历史上最早的 UNIX 工具。这些工具的设计很好地体现了 UNIX 一个工具只做一件事情、使用管道组合多个工具的思想。&br&&br&当然,到了后来,大家也都觉得这样很麻烦,而且这个功能太过常用了。所以 GNU 项目在复刻 UNIX tar 的时候,选择了把各种常用的压缩解压都集成进 tar (详见下段),然后提供了一套(丧心病狂的)命令行参数,现在一条命令就可以完成打包加压缩了。解压也是一样,使用 GNU 的 tar 的话,一条命令就可以自动完成压缩加解包,不需要先 gunzip 。&br&&br&关于 tar 调用其他压缩解压程序,之前误以为是链接了 zlib 、 bzip2 等等这些库,然而只需要简单的 ldd `which tar` 或者看各个发行版里 tar 软件包的依赖信息,就可以知道事情并非如此。 tar 的依赖仍然是非常少的。而压缩解压其实仍然是通过管道调用了这些独立的外部程序来实现的。这可以通过看 tar 的源代码、看 tar 二进制里的 strings (有很多常见压缩解压程序的命令名)、或者看压缩解压时的进程来发现。感谢 &a class=&member_mention& href=&///people/bde9fd95b27ab643e42329& data-hash=&bde9fd95b27ab643e42329& data-tip=&p$b$bde9fd95b27ab643e42329&&@王铭烨 Arthur2e5&/a& 指出。&br&&br&最后,其实现代的 GNU tar 是有一套根据扩展名自动识别压缩算法的机制的,免去了手动通过参数指定压缩算法的麻烦。压缩时使用 tar caf ,解压时使用 tar xaf 即可。其中 a 表示自动检测,这个 a 也可以省略,然而个人还是习惯输入——因为如果万一某个地方的 tar 版本不支持自动检测,你至少还能得到一个警告,否则 tar cf 的话最后可能建立了一个 foo.tar.gz 的没有压缩的 tar 包……
gzip 只是一个流压缩程序,输入一个流,输出压缩后的数据流。给它一个文件,文件本身自然就是一个流,读入、压缩、输出,还是保存成一个文件,没有问题。然而,如果是一个文件夹、多个文件,该怎么办呢?按什么顺序?怎么存储文件以外的信息?(例如路径、…
不知道哪位的文章。&br&&br&评论中有同学说是:&br&&br&&b&张宏杰老师的著作《饥饿的盛世》的自序《得不偿失的盛世》。 &/b&&br&&br&一 &br&公元1793年,也就是乾隆五十八年夏天,英国派出的第一个访华使团到达中国。 &br&英国人对这个神秘的国度充满好奇。他们相信,中国就像马可波罗游记中所写的那样,黄金遍地,人人都身穿绫罗绸缎。 &br&然而,一登上中国的土地,他们马上发现了触目惊心的贫困。清王朝雇佣了许多老百姓来到英使团的船上,为英国人端茶倒水,扫地做饭。英国人注意到这些人“都如此消瘦”。“在普通中国人中间,人们很难找到类似英国公民的啤酒大肚或英国农夫喜气洋洋的脸。”这些普通中国人“每次接到我们的残羹剩饭,都要千恩万谢。对我们用过的茶叶,他们总是贪婪地争抢,然后煮水泡着喝。” &br&使团成员约翰·巴罗在《我看乾隆盛世》中说:“不管是在舟山还是在溯白河而上去京城的三天里,没有看到任何人民丰衣足食、农村富饶繁荣的证明。……除了村庄周围,难得有树,且形状丑陋。房屋通常都是泥墙平房,茅草盖顶。偶尔有一幢独立的小楼,但是决无一幢像绅士的府第,或者称得上舒适的农舍。……不管是房屋还是河道,都不能跟雷德里夫和瓦平(英国泰晤士河边的两个城镇)相提并论。事实上,触目所及无非是贫困落后的景象。” &br&&br&二 &br&毫无疑问,乾隆皇帝是中国历史上最伟大的皇帝之一。有的评论者甚至还去掉“之一”二字。 &br&确实,乾隆统治下的中国,纵向比,是中国几千年历史中人口最多、国力最盛的时期。横向比,是当时世界上最强大、最富庶的国家。称之为中国历史上最大的盛世,毫不为过。何以我们五千年文化结出的总结性的盛世在英国人眼中居然如此黯淡? &br&原因是,乾隆时代的普通英国人生活水平差距实在太大了。 &br&十四世纪,欧洲人并不中国人富裕多少。他们的食物中肉食比重并不算高,一大块面包加一碗浓汤就已经让辛苦了一天的英国农夫心满意足。但是随着经济的质变,欧洲人与中国人生活水平的差距已经越来越大。 &br&十八世纪工业革命前期,英国汉普郡农场的一个普通雇工,一日三餐的食谱如下:早餐是牛奶、面包和前一天剩下的咸猪肉;午饭是面包、奶酪、少量的啤酒、腌猪肉、马铃薯、白菜或萝卜;晚饭是面包和奶酪。星期天,可以吃上鲜猪肉。工业革命后,英国人的生活更是蒸蒸日上。1808年英国普通农民家庭的消费清单上还要加上2.3加仑脱脂牛奶,1磅奶酪,17品脱淡啤酒,黄油和糖各半磅,还有1英两茶。 &br&乾隆年间的中国人吃的是什么呢? &br&几千年来,中国农民主要食物是粗粮和青菜,肉蛋奶都少得可怜,通常情况下,在春荒之际,都要采摘野菜才能度日。乾隆时代,民众吃糠咽菜的记载笔笔皆是。据《十八世纪的中国与世界·农业卷》介绍,普通英国农户一年消费后,可剩余11镑,约合33-44两白银。而一个中等中国农户一年全部收入不过32两,而年支出为35两,也就是说,辛苦一年,还要负债3两,才能过活,根本没有生产剩余。所以一旦遇到饥荒,普通人家会立刻破产,卖儿卖女十分普遍。 &br&&br&三 &br&乾隆盛世的贫困,不仅仅体现在物质上,更主要的是体现在精神上。 &br&到达浙江沿海后,因为不熟悉中国航线,英国人请求当地总兵帮他们找一个领航员。总兵痛快地应答了。 &br&英国人看到了意想不到的一幕。总兵的办法是派出士兵,把所有从海路去过天津的百姓都找来。使团成员巴罗说:“他们派出的兵丁很快就带回了一群人。他们是我平生所见神情最悲惨的家伙了,一个个双膝跪地,接受询问。……他们徒劳地哀告道,离家远行会坏了他们的生意,给妻子儿女和家庭带来痛苦,总兵不为所动,命令他们一小时后准备妥当。” &br&中国人司空见惯的一幕让英国人不寒而栗,在欧洲这是不可想象的。英国人说:“总兵的专断反映了该朝廷的法制或给予百姓的保护都不怎么美妙。迫使一个诚实而勤劳的公民,事业有成的商人抛家离子,从事于己有害无益的劳役,是不公正和暴虐的行为。” &br&这仅仅是英国人一连串吃惊的一个开始,比这更让他们震惊的事还在后面。 &br&在船只行使于内河时,英国人注意到,官员们强迫大批百姓来拉纤,拉一天“约有六便士的工资”,但是不给回家的路费。这显然是不合算的,许多百姓并不想要这份工资,拉到一半往往连夜逃跑。“为了找到替手,官员们派手下的兵丁去附近的村庄,出其不意地把一些村民从床上拉出来加入民夫队。兵丁鞭打试图逃跑,或以年老体弱为由要求免役的民夫的事,几乎没有一夜不发生。看到他们当中一些人的悲惨状况,真令人痛苦。他们明显地缺衣少食,瘦弱不堪。……他们总是被兵丁或什么小官吏的随从监督着,其手中的长鞭会毫不犹豫地抽向他们的身子,仿佛他们就是一队马匹似的。” &br&乾隆盛世的秩序原来是这样建立起来的。 &br&&br&四 &br&而同时代的欧洲,人权观念已经深入人心。一个人不管地位多高,都不能任意将另一个人置于脚下。 &br&1747年,也就是乾隆十二年,普鲁士国王腓特烈二世建了一座夏宫,叫无忧宫。没想到这个无忧宫却给他带来了麻烦。原来他的这个王宫选在了一个平民百姓的风磨边上。在修建期间,磨坊主向法院起诉国王,说新建的王宫挡了风,不利于风磨转动。最后国王不得不屈膝让步,同意对磨坊主陪偿。 &br&这个故事有助于我们理解英国人何以对乾隆年间中国人的人权状况如此吃惊。 &br&&br&五 &br&乾隆盛世的出现,有赖于乾隆皇帝最大限度地调动了传统人治明君的所有技术资源,挖掘了中国传统体制的全部潜力。如果乾隆生活在汉朝或者唐朝,他也许无愧于伟大二字。因为那个时候,野蛮和贫困横行于整个地球。 &br&然而,乾隆时代的世界,与汉唐已经截然不同。在乾隆出生以前,世界就已经进入了全球化过程。 &br&1522年,麦哲伦船队完成了环球航行,标志着地理大发现的完成。葡萄牙、西班牙、荷兰、英国相继来到中国南面的海域,频频叩打中国的大门。全球化过程从此开始。任何国家想永远闭关自守,已经不可能。 &br&而乾隆所处的十八世纪,更是人类历史伟大的转折点。正是从这个世纪起,历史开始跑步前进,速度达到了令人头晕目眩的程度。“乾隆在位六十年,正好是英国经历了产业革命的全过程。”“在此之前,……地球的底层蕴含着庞大的资源和能量,人们一直在探求而少收获。十八世纪,一下子得到了打开宝库的钥匙,新的生产力像蛰伏地下的泉水,突然地喷涌进射出来。工农业产量几百倍、成千倍的增加,物质财富滚滚而来.源源不绝。” &br&而这个世纪政治文明的进步并不慢于物质文明。乾隆十三年(1748年),孟德斯鸠发表了名著《论法的精神》。1776年,也就是乾隆四十一年,美国宣布独立。1789年,也就是乾隆五十四年,法国爆发资产阶级大革命,发表《人权宣言》,提出了“主权在民原则”。1795年,乾隆皇帝退位后的第二年,华盛顿宣布拒绝担任第三任总统。 &br&十八世纪,世界文明大潮的主流是通过立宪制和代议制“实现了对统治者的驯化,把他们关到法律的笼子里”。西欧社会的政治结构发生了巨大变化,普通人的公民权利保障大为提高。人的主动性、积极性和创造性得到了空前的解放。 &br&&br&六 &br&而在地球的另一端,乾隆皇帝却在做着相反的事情。虽然乾隆的爷爷康熙皇帝已经知道地球是圆的,知道世界上有五大洲,知道有人环绕过地球。虽然乾隆年间西方传教士已经向他介绍了日心说,虽然英国使团给他带来了天体运行仪、地球仪、赫歇耳望远镜、帕克透镜、巨型战舰“君王”号舰艇模型,甚至还有热气球和复滑车表演,他却对世界大势的变化没有丝毫敏感。他视民间社会的活力和自发精神为大清江山永固的最大敌人,积六十余年努力,完成了中国历史上最缜密、最完善、最牢固的专制统治,把民众关进了更严密的专制统治的笼子里。 &br&大清社会各个层面都处于他的强力控制之下: &br&他通过胡萝卜加大棒的手段,杜绝了皇族、外戚干政的可能,使他们只能老老实实安享俸禄,不敢乱说乱动一下。他以高明的权术和超常的政治恐怖把大臣们牢牢控制在自己的股掌之间,以确保君主的意志在任何时候,任何领域都畅通无阻。 &br&对敢于反抗的“刁民”,他的态度是一味镇压。在他眼中,皇帝、官员和百姓,是父亲、儿子和孙子的关系。不管父亲如何虐待儿子,儿子也不许有丝毫反抗。因此,老百姓无论被贪官污吏如何压榨剥削,走投无路,也只能听天由命,不得“越级上访”。对于群众聚众抗议,维护自己的权利,他总是视如大敌,一再强调要“严加处置”,甚至“不分首从,即行正法”。 &br&对于知识分子,他更如临大敌。他以超级恐怖为手段,扫除一切可能危及统治的思想萌芽。乾隆年间仅大的文字狱就出现了一百三十件。三十余年的文字狱运动,如同把整个社会放入一个高压锅里进行灭菌处理,完成了从外到里的全面清洁,消灭了一切异端思想萌芽的完美局面,打造了一个他自认为万代无虞的铁打江山。 &br&&br&七 &br&因此,乾隆盛世是逆人类文明主流的产物。 &br&乾隆盛世的功绩是创造了空前的政治稳定,养活了数量空前的人口,奠定了今天的版图。 &br&然而乾隆时代给中华民族精神上造成的永久性创伤,远大于这一时一世的成就。 &br&中国历代统治者都认为,只要让全体中国人都“做稳了奴隶”,就是最大的德政,不管采取什么手段。横向对比十八世纪世界文明的发展,乾隆时代是一个只有生存权没有发展权的盛世。纵向对比中国历史,乾隆时代也是中国历史上民众权利被剥夺得最干净,意志被压制得最靡弱的时代。乾隆盛世是一个饥饿的盛世,恐怖的盛世,僵化的盛世,是基于少数统治者利益最大化而设计出来的盛世。乾隆时代的中国人,是“做稳了的奴隶”,只许有胃肠,不许有头脑。只有这样,大清江山才能亿万斯年。 &br&乾隆的盛世监狱精心塑造出来的国民,固然是驯服、听话、忍耐力极强,却无法挺起腰板,擦亮眼睛,迎接扑面而来的世界大潮。 &br&英国人一到中国,马上发现中国人远不是传说中的那样,是“全世界最聪明最礼貌的一个民族”。他们发现中国人普遍缺乏自尊心、自私、冷漠、对公众事物漠不关心。 &br&英国人在世界上其他地方接触过中国人,那些人看起来都很正常。在菲律宾群岛、巴达维亚、槟榔屿,“和其他我们东印度公司属地”,中国移民的“诚实跟他们的温顺和勤奋一样出色。……在那些地方,他们的发明创造和聪敏似乎也跟学习模仿的精确一样出色”。然而,生活在自己国家中的中国人,却远没有海外中国人那样活泼自然,也缺乏创造力。他们比世界上其他国家的人更胆小,同时也更冷漠、麻木和残酷。 &br&使团的船经过运河时,一伙看热闹的人压翻了河中的一艘小船,许多人掉进河中。巴罗说,“虽然这一带有不少船只在行驶,却没有一艘船前去救援在河里挣扎的人。……劝说我们船上的人开过去援救也得不到响应。不错,我们当时船速是一小时七英里,这居然就成了他们不肯停船的理由。我确信这些不幸的家伙中有几个一定是丧命了。” &br&英国人分析说,这是中国统治者精心塑造的结果:“就现政权(满清)而言,有充足的证据表明,其高压手段完全驯服了这个民族,并按自己的模式塑造了这个民族的性格。他们的道德观念和行为完全由朝廷的意识形态所左右,几乎完全处在朝廷的控制之下。” &br&马戛尔尼对中国政权的结论更广为人知:“这个政府正如它目前的存在状况,严格地说是一小撮鞑靼人对亿万汉人的专制统治。”这种专制统治有着灾难性的影响。“自从北方或满洲鞑靼征服以来,至少在过去的一百年里没有改善,没有前进,或者更确切地说反而倒退了;当我们每天都在艺术和科学领域前进他时,他们实际上正在成为半野蛮人。” &br&&br&八 &br&虽然登峰造极,但乾隆的统治并没有任何新意。乾隆盛世不过是文景之治、贞观之治和开元盛世的大总结和大重复。不幸的是,这个盛世出现在不应该出现的时候,因此其成就如果烛火遇到了太阳,一下子黯淡无光。 &br&面对几千年未有之世界大变局,如果中国的专制统治不那么密不透风,中国社会不那么铁板一块,西方涌来的文明新潮才有可能自然地浸润这片古老的土地。可惜,中国恰逢了一个执政能力空前提高的“盛世”。以乾隆为代表的专制精神造成的中华民族精神上的孱弱、保守、僵化,不但是鸦片战争中中国失败的原因,更是鸦片战争以来中国在现代化路上走得如此跌跌撞撞、艰难曲折的原因之一。在乾隆死去二百多年后,仍然有人连篇累牍地歌颂乾隆盛世的稳定和伟大,研究揣摩乾隆治术的高深。许多人仍坚定地认为,只有乾隆的风格和方法才适合这片独特的土地。 &br&只有透彻了解了乾隆时代的另一面,对这个时代的得与失进行一个全面准确的评估,我们这个民族才算没有白白经历“乾隆盛世”。
不知道哪位的文章。评论中有同学说是:张宏杰老师的著作《饥饿的盛世》的自序《得不偿失的盛世》。 一 公元1793年,也就是乾隆五十八年夏天,英国派出的第一个访华使团到达中国。 英国人对这个神秘的国度充满好奇。他们相信,中国就像马可波罗游记中所写的…
&img src=&/ecd5e0a2ecee18_b.jpg& data-rawwidth=&406& data-rawheight=&205& class=&content_image& width=&406&&“计算机科学的两件难事:缓存失效和命名。”&br&当然这里的命名有着更深层的意思,比如W3C的各种术语。已经有很多教我们如何命名的规范 &a href=&///?target=https%3A//en.wikipedia.org/wiki/Naming_convention_%28programming%29& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Naming convention (programming)&i class=&icon-external&&&/i&&/a& ,每个编程语言都有各式各样的命名规范【像CSS就有几套非常有效的规范(OOCSS,BEM,SMACSS,SUITCSS,Atomic...)】但这些规范并不能消除我们的问题,每个程序员或多或少都在编程过程中为变量和函数命名苦恼过。&br&借用网络上的一个例子试着解释一下:&br&&blockquote&你要开发一个游戏,有人,可以开枪。人的对象有个走的行为,你把方法命名为Walk(),很简单。枪的对象有个射击的行为,你把方法命名为Fire(),还是很简单。不过这两个对象在画布里需要动起来,你给他们命名为update()。当另一个人看到这个方法时他会有些疑问,这个update是更新什么?要不要持久化到数据库?&a href=&///?target=https%3A///Why-is-naming-things-hard-in-computer-science-and-how-can-it-can-be-made-easier& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/Why-is-naming&/span&&span class=&invisible&&-things-hard-in-computer-science-and-how-can-it-can-be-made-easier&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/blockquote&这是ITworld发起的一个投票,其中不分年龄不分经验接近半数的人认为命名是最头疼的事情。&br&&a href=&///?target=https%3A///r/ProgrammerHumor/comments/2f2on0/programmers_hardest_tasks/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Programmers' hardest tasks : ProgrammerHumor&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///50708/%23rd%3Fsukey%3Dfc78a5ac0d81ca5ff3dd56e6fcfe6fcaeddb3dcb3eb& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&程序员最头疼的事:命名&i class=&icon-external&&&/i&&/a&&br&&img src=&/5aa72e7ad866d8b9c6be_b.jpg& data-rawwidth=&485& data-rawheight=&566& class=&origin_image zh-lightbox-thumb& width=&485& data-original=&/5aa72e7ad866d8b9c6be_r.jpg&&&br&&br&母语是英文的开发者为命名苦恼,非英文母语的开发者更加为此苦恼。当你到github上参与开源项目的贡献的时候,或者准备开源自己的作品的时候,或者设计一个框架的时候,命名会是一个一直伴随你的不大不小的问题。&br&但开发语言跟语言一样除了语法外当然要堆词汇了,有各种计算机术语大全的书,还有计算机专用词典。但有趣的是开发语言也有很多“方言的词汇”,甚至不同的编程语言还有自己的”方言词汇“,要让别人看懂你的代码你还不得不用上这些方言常用的词汇。如果不是有了解你根本不可能想起这些词汇【好比说初始化就有很多方言(init,boot,launch...)】这就得堆经验了,要多看堆经验是很慢长的过程。&br&我们平时当然会先查单词,再比较近义词,必要还要Google一下与我们期望表达的关联性。但是还是没有底,还是不满意,对,没有底,不满意。就一个变量名函数名随着迭代的进行已经被我们改了多少次。有时候你巴不得身边有个人直接告诉你。&br&堆经验的方法是很笨的,没有捷径,多看书和源码。参与的越多经验自然就越多,找个大型的开源项目参与翻译文档是个不错的开始,但如果你并不用到这个项目或者说这个项目与你当前从事的领域关联不大,收效并不明显。因为缺乏实践。&br&如何不改变我们的平时的习惯就能日积月累的收获变量命名的经验呢?&br&回顾我们平时的习惯:1.查单词;2. 比较单词语义;3. 比较代码上下文;4.确定命名。&br&只要把这几个步骤缩短就能节省大量时间。&a href=&///?target=http%3A//unbug.github.io/codelf/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&i class=&icon-external&&&/i&&/a& 就是帮我们缩短这些步骤的一个变量名搜索工具。&br&&a href=&///?target=http%3A//www.solidot.org/story%3Fsid%3D46539& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Solidot | Codelf通过搜索在线开源平台的项目源码帮开发者给变量命名&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///articles/465237.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Codelf 搜索开源代码帮程序员命名_Open Source 开源_&i class=&icon-external&&&/i&&/a&&br&&img src=&/8dc9ee215e1d9e158042aebfd0e348f9_b.png& data-rawwidth=&764& data-rawheight=&227& class=&origin_image zh-lightbox-thumb& width=&764& data-original=&/8dc9ee215e1d9e158042aebfd0e348f9_r.png&&&br&&a href=&///?target=http%3A//unbug.github.io/codelf/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&i class=&icon-external&&&/i&&/a& 支持直接搜索中文,当你查中文的时候,Codelf 会直接查好单词和单词的近义词给你,然后再搜索Github, Bitbucket, Google Code, Codeplex, Sourceforge, Fedora Project上的开源项目的源码匹配出与这些词汇相关的变量名和函数名。Codelf 可以选择开发语言进行搜索,结果会把同个源码文件里匹配的变量名排在一起,如你选择“CSS”然后搜索“product”&img src=&/ff162addcefcd_b.png& data-rawwidth=&888& data-rawheight=&819& class=&origin_image zh-lightbox-thumb& width=&888& data-original=&/ff162addcefcd_r.png&&&br&&br&你可以立即查看对应的源码,多少能学习到别人的设计,如果代码的业务与自己相投,对梳理自己的业务是有帮助的。&br&&img src=&/0f25accfddaa4bf19cc4db3eecf1682c_b.png& data-rawwidth=&953& data-rawheight=&780& class=&origin_image zh-lightbox-thumb& width=&953& data-original=&/0f25accfddaa4bf19cc4db3eecf1682c_r.png&&&br&我们求知欲的本能是看到什么想到什么就想立即了解它知道它,过后就不了了之了,每个开发者都有想看源码学习的本能,可惜看源码是一件非常烧脑的过程,Codelf 有让碎片时间看看源码变得轻松有趣,随手掏出手机一搜索就可以打发时间了。如过圣诞节,选择JavaScript语言搜索“圣诞树”就看到一段短小的圣诞树代码,很有趣的算法呢&br&&a href=&///?target=http%3A//unbug.github.io/codelf/%23%25E5%259C%25A3%25E8%25AF%259E%25E6%25A0%2591& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&i class=&icon-external&&&/i&&/a&&br&&img src=&/24962daec88fb6edd980a871_b.png& data-rawwidth=&378& data-rawheight=&678& class=&content_image& width=&378&&&br&当然,你还可以直接查看源码来源的仓库Repo;直接拷贝变量名等。&br&&img src=&/fab79ce42e3e35e22c2ad426be85a9b3_b.png& data-rawwidth=&403& data-rawheight=&268& class=&content_image& width=&403&&Codelf会让你的变量命名变得有趣,如果你是个有文学细胞的人,那会更加欢乐了,让我们来搜索一些2015年的热词:&br&&a href=&///?target=http%3A//unbug.github.io/codelf/%23%25E8%E6%25B4%259E%25E5%25A4%25A7%25E5%25BC%2580& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&i class=&icon-external&&&/i&&/a&&br&&img src=&/36fec545e911ebbc3e040c_b.png& data-rawwidth=&468& data-rawheight=&684& class=&origin_image zh-lightbox-thumb& width=&468& data-original=&/36fec545e911ebbc3e040c_r.png&&&br&&br&&a href=&///?target=http%3A//unbug.github.io/codelf/%23%25E6%E6%& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&i class=&icon-external&&&/i&&/a&&br&&img src=&/9abcdfbf3f356e379e259_b.png& data-rawwidth=&470& data-rawheight=&616& class=&origin_image zh-lightbox-thumb& width=&470& data-original=&/9abcdfbf3f356e379e259_r.png&&&br&&a href=&///?target=http%3A//unbug.github.io/codelf/%23%25E4%25B8%25BB%25E8%25A6%%259C%258B%25E6%25B0%%25B4%25A8& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&i class=&icon-external&&&/i&&/a&&br&&img src=&/42ba99bf1efe_b.png& data-rawwidth=&487& data-rawheight=&640& class=&origin_image zh-lightbox-thumb& width=&487& data-original=&/42ba99bf1efe_r.png&&&br&&a href=&///?target=http%3A//unbug.github.io/codelf/%23%25E8%2589%25AF%25E8%25BE%25B0%25E5%25A5%%2599%25AA%25E5%%25E5%25BA%2595& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&i class=&icon-external&&&/i&&/a&&br&&img src=&/78cafd1daf7fad9ff238dd_b.png& data-rawwidth=&477& data-rawheight=&736& class=&origin_image zh-lightbox-thumb& width=&477& data-original=&/78cafd1daf7fad9ff238dd_r.png&&&br&&a href=&///?target=http%3A//unbug.github.io/codelf/%23%25E5%25B8%25A6%25E4%25BD%25A0%25E8%25A3%%2580%25BC%25E5%25B8%25A6%25E4%25BD%25A0%25E9%25A3%259E& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&i class=&icon-external&&&/i&&/a&&br&&img src=&/17b03b0caacb1adbfb1e6_b.png& data-rawwidth=&473& data-rawheight=&701& class=&origin_image zh-lightbox-thumb& width=&473& data-original=&/17b03b0caacb1adbfb1e6_r.png&&&br&&br&下面是一些相关连接:&br&&ul&&li&&b&Codelf: &a href=&///?target=http%3A//unbug.github.io/codelf/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CODELF&i class=&icon-external&&&/i&&/a&&/b&&br&&/li&&li&&b&Codelf 的 github repo: &a href=&///?target=https%3A///unbug/codelf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&unbug/codelf · GitHub&i class=&icon-external&&&/i&&/a&&/b&&br&&/li&&li&&b&Two hard things: &a href=&///?target=http%3A///bliki/TwoHardThings.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TwoHardThings&i class=&icon-external&&&/i&&/a&&/b&&br&&/li&&/ul&&br&最后是一个找到的与Codelf相关的段子,哈哈:&br&&blockquote&场景1,话说,今天产品汪又来找我了,我昨天才切完图,肯定是改需求&br&场景2,尼玛,又要改好友列表,要在里面添加关注状态&br&场景3,关注,未关注,互相关注,前面两个好命名,后面那个怎么写好呢?作为一个有点英文水平的程序员肯定不会用什么Each-follow之类的,想想就不对劲,但是用什么我还真特么不知道&br&场景4,看看微博怎么搞的呗,我先找个互相关注的按钮瞧瞧,一点进去就是女神的,可女神没有关注我啊,怎么办&br&场景5,女神是交互MM啊,我就找个借口说测试一个渣浪,我X,我特么好2,这么明显谁不知道啊,但是我特么还是干了啊,天啦撸啊&br&场景6,女神关注我了也,赶紧把之前发的一些不正经的微博删除了,别在女神山前损形象啊,我去,我怎么转发了那么多苍老师的。。。太没品了,尼玛,sister是什么鬼,我竟然寂寞到转发韩国妹&br&场景7,好了,回来看微博的关注按钮吧,可是我X,这是什么鬼命名,我实在看不懂,难道压缩了?&br&场景8,难倒我了,那我看看twitter的啊,必须啊,人家歪果仁肯定有好的命名&br&场景9,我得翻墙啊,不然上不去,GFW草泥马啊。&br&场景10,花了10块钱买了个mz代理总算上去了,可是我特么没人关注我啊,有注意了,叫女神上去关注我呗,这样之前的嫌疑就可以避开了,哈哈,机智如我&br&场景11,好说歹说女神上去了,又花了10块帮女神买了个代理,本来想请女神吃饭的,怕太明显了被看出来。&br&场景12,我叼,女神关注我了啊,女神里面也是唯一一个我关注了她,好像荒岛上就我俩个一样,又YY了一把。&br&场景13,我了个X,Twitter并没有互相关注的按钮,人家直接显示“followrs you”,我去,这太明了了,我们的产品汪真是没法比啊&br&场景14,我把产品汪喷了一顿,结果人家还是没有改,因为人家给我买罐可乐,我太没种了,竟然就让了&br&场景15,明天再想吧,命名是大事,就为了这个整天啥活也没干,下班都不好意思走啊。。。。&br&场景16,我想起来了,有个叫 Codelf 的变量命名神器,我去搜搜索。&br&场景17,直接搜索 “相互 follow”&br&&img src=&/ba9f0c4d7fef_b.png& data-rawwidth=&475& data-rawheight=&573& class=&origin_image zh-lightbox-thumb& width=&475& data-original=&/ba9f0c4d7fef_r.png&&神器就是神器啊!!!!此时一万只草泥马打了我的脸&/blockquote&
“计算机科学的两件难事:缓存失效和命名。”当然这里的命名有着更深层的意思,比如W3C的各种术语。已经有很多教我们如何命名的规范
,每个编程语言都有各式各样的命名规范【像CSS就有几套非常有效的规范(OOCSS,BEM,SMACS…
已有帐号?
无法登录?
社交帐号登录
3213 人关注
192 个回答
4725 人关注
2401 个回答
3409 人关注
161 个回答
2817 人关注
625 个回答
4717 人关注
372 个回答

我要回帖

更多关于 freshman 15 的文章

 

随机推荐