Tuesday 26 December 2017

2017年终总结

MarkdownPad Document

转瞬之间,2017年的第一个学期,也是我在SWU计信院的第一个学期已经过去3/4了。昨天辅导员刚刚发了考试通知,这学期所有科目的考试时间已经发布了,我也感到了很大的紧迫感。昨天刚刚把我们python课的课程设计代码写完,洋洋洒洒800+行的代码,明天再改改小bug,就可以上交啦!然后,我觉得我就应该把代码的事情稍微放一放,开始专心复习了。而在此之前,我想先大概总结一下,这学期加上2017年大概学了什么东西,做了什么事情。

有关课程

  • 这学期我们开了以下几门课程:

1.编程导论:这门课使用 python3.6进行讲授,我学习的很认真。但是大家也知道,仅仅在课堂上跟随着老师学习是学不到什么东西的,所以我也有做了大量课外的代码,使用python写了一些爬虫,了解了譬如pyqt之类的第三方库。在此我还是想重申知乎姚冬老师的话

编程是一门手艺,如果想要精通,一定要大量的练习

这句话让我深以为然。只有大量的练习才能熟悉编程语言的语法和一些特定 的使用方法。我觉得我的练习量还不够,应该再多加练习。

2.计算机导论:这门课很重要,但是不知道为什么,我们老师把它讲成了水课。我通过阅读<<计算机科学概论>> J. glenn Brookshear 来了解整个计算机体系。同时,还想再给大家推荐一本书<<编码>> Charles Petzold, 一本非常好的硬件入门书。相信看完了这两本书,你就应该可以对计算机的体系有个整体性的认识了。

3.高等数学:这门课SWU使用的是<<托马斯微积分>>,是一本非常好的书,可以让读者对于整个微积分体系有个良好的认识。很惭愧,我在这门课上花的时间有点少,应该在期末复习这段时间内多花一些时间来弥补。我认为一个良好的数学基础对于计算机专业的学生是十分重要的,所以还是找到一个编码和数学的平衡点。

  • 这学期我参加了一个创新创业大赛,我们实验室的系统EZlearning获得了重庆市市级一等奖,而我作为ppt主讲人也获得了当时大赛组委会的赏识。

  • 坚持使用<<鸟哥的Linux私房菜>>学习Linux。我使用Ubuntu 16.04 LTS发行版来学习Linux,学习这样的开源系统真的为我打开了新世界的大门,让我感受到了开源软件的魅力与美,我也要将Linus作为自己的一个榜样来学习。虽然Linux学习曲线在逐渐变陡,但我认为这是值得的。以后我还会专门开一篇博文来谈一谈。

  • 坚持学习C语言。虽然我们下学期要开C语言的课,但是我非常喜欢C这种底层语言带给我的一种对系统的掌控感,所以还在坚持使用 <<K&R>> 学习。虽然这本书确实很难,但是没当你解开书上的一道习题的时候,那种满足感确实让人享受。

有关课外

  • 听了一场岸部真明先生的演奏会。岸部真明先生真的有大师风采,吉他演奏真的行云流水,他对于节奏,音色的控制真的让人如痴如醉。这个以后我会专门记录一下的。
  • 继续坚持健身,现在我的胳膊已经有了线条了,同时感觉人也有精神了许多。
  • 今年完成的最重要的事情就是成功的转专业到了SWU的计信院。虽然作为一名程序员,自学能力是非常必要的一点,但是,转专业到计信院更能为我提供一个氛围,每天和大牛在一起,时间久了我也会成为大牛。
  • 9月份和她分手了。当时确实很伤心,这种情感很复杂,但是每个人有不同的选择,即使偶尔走过那些和她一起走过的路,吃和她一起吃过的美食,心中会刺痛一下,我还是选择慢慢忘记。把这段经历当作生活中的一个小小的起伏,人生中的一笔财富。就像最后写给她的那张纸条中的话:有缘再见,不会忘记曾经的美好。时间会冲淡一切的。

总结

今年可以说是我人生的转折点,我感到精神百倍。乘风破浪会有时,直挂云帆济沧海,希望在2018年我能继续努力,实现自己给自己定下的目标。

Wednesday 29 November 2017

Python拾遗(二)strip()和split()函数

MarkdownPad Document

最近经常遇到strip()split()这两个字符串操作函数,现在记录下来,防止自己忘记。

1. strip()函数原型:

声明:s为字符串,rm为要删除的字符序列

  • s.strip(rm) 删除位于字符串开头结尾,同时位于rm删除序列中的字符。
  • s.lstrip(rm)删除位于字符串开头,同时位于rm删除序列中的字符。
  • s.rstrip(rm)删除位于字符串结尾,同时位于rm删除序列中的字符。

示例代码:

>>> a="hheloooo goooodbyyyye"
>>> a.strip('helo ') # 注意这里有空格
'goooodbyyyy'
>>> a.strip('he')
'loooo goooodbyyyy'
>>> a.strip('o')
'hheloooo goooodbyyyye'

函数作用方式解析:

我们以

 a.strip('he')

这段代码为例: strip()函数从字符串a的首尾开始寻找含有'he'的字符,在开头找到了第一个'h',将其去掉,紧接着寻找第二个字符,发现又是'h',同时也将其去掉,以此类推,直到找到第一个不包含在'he'字符集中的字符,停止删除。结尾也同理。其他两个函数lstrip()rstrip()同理。这就是这个函数的作用方式。但是其具体是如何作用的,我没有考证过,希望有高人可以给予指点。

默认参数:

当rm为空时,strip()函数默认删除string结尾的空白符,包括\n,\t等。

示例代码:

 >>> a='    a\n\tbc'
 >>> print a
a
   bc
>>> a.strip()
'a\n\tbc'
>>> a='  abc'
>>> a.strip()
'abc'
>>> a='\n\tabc'
>>> a.strip()
'abc'
>>> a='abc\n\t'
>>> a.strip()
'abc'

注意

这里的rm删除序列是只要只要边(开头或结尾)上的字符在删除序列内,就删除掉。

示例代码:

>>> a='123abc'
>>> a.strip('21')
'3abc'
>>> a.strip('12')
'3abc'
>>> a.strip('1a')
'23abc'

2. split()函数原型:

split的英文翻译是分割的意思。Python split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔num个子字符串,同时将分割好的字符放在列表里。

示例代码:

>>> a='a b c d'
>>> a.split()
['a', 'b', 'c', 'd']

通过上述例子我们可以看出,当没有参数时,split()函数是以空格作为分割符的。

同时,我们可以传入参数,根据自己实际的需求进行分割:

示例代码:

>>> c='name=ding|age=25|job=it'
>>> c.split('|')
['name=ding', 'age=25', 'job=it']
>>> c.split('|')[0].split('=')
['name', 'ding']

还可以带上数字参数,表示“切几刀”如:

示例代码:

>>> d='a b c d e'
>>> d.split(' ',1)#以空格“切一刀”,就分成两块了
['a', 'b c d e']
>>> d.split(' ',2)
['a', 'b', 'c d e']
>>> d.split(' ',3)
['a', 'b', 'c', 'd e']
>>> d.split(' ',-1) #d.split(' ')结果一样
['a', 'b', 'c', 'd', 'e']
>>> d.split(' ')
['a', 'b', 'c', 'd', 'e']

最后,记录一个极好的例子:

>>> str="hello boy<[www.doiido.com]>byebye"
>>> str.split("[")[1].split("]")[0]
'www.doiido.com'
>>> str.split("[")[1].split("]")[0].split(".")
['www', 'doiido', 'com']

Saturday 25 November 2017

Linux学习(1) PuTTY的使用 : Connection refused问题

Linux

最近在学习使用Linux,于是在VirtualBox虚拟机上安装了Ubuntu 16.04 LTS版,当我需要在我的windows上远程登录Linux时,就需要用到PuTTY这样一款远程登录工具。这款工具的具体介绍在Google上都有,在此就不详细展开说了,现在记录一个我使用时遇到的问题。
当我下载好了PuTTY,配置好主机的所有信息开始使用时,我发现出现了这样的报错:
使用putty登录显示 network error:Connection refused
此处输入图片的描述
这是什么原因呢?
  1. 这说明物理机和虚拟机没有建立好通信。
为什么呢?这是因为PuTTY使用了ssh协议在物理机和虚拟机之间进行通信。默认情况下ssh协议使用端口22。操作系统要想使用ssh协议进行通信,就要提供ssh客户端服务ssh服务器端服务。默认情况下,ubuntu中只提供了ssh客户端服务,而没有提供ssh服务器端服务。所以windows和它通信就不成功。我们只需要进入到虚拟机的的linux操作系统ubuntu中安装好ssh服务器端服务就行了。
但是,经过排查,我发现我的ubuntu系统中已经安装好了ssh服务,这该怎么办呢?
我想首先可以在host os里ping一下guest os的ip地址,我这里是10.0.2.15,发现并不通,于是想到可以通过增加一张虚拟网卡(host-only),这样就可以ping通了!
紧接着,配置好PuTTY的参数,连接,大功告成!
BTW,需要注意的是,host os的ip地址不能设置为自动获取ip地址,不然的话也不能成功。

Tuesday 15 August 2017

由徐州申办国家文明城市引发的思考

MarkdownPad Document
年暑假回家,发现徐州在热火朝天地创办全国文明城市,城市出现了很多变化:比如,徐州是个“自行车城“,以往有很多骑行者不按交通秩序行驶,或闯红灯,或随意骑到机动车道、人行道上,造成了秩序的混乱,而如今街上多了很多交通志愿者,监督市民们的行为;再比如,现在交警强制要求机动车在斑马线礼让行人,违者罚款50块,扣两分;我的初中老师就因为违反了条例而被罚款。对于这些变化,很多市民都表示非常的赞同和支持,毕竟遵守规则是最基本的个人素质,如果创办国家文明城市能淘汰当今社会一些不文明的、素质不高的东西,那不是人人拍手称快吗?
但是最近一些事情引发了我新的思考。有天我坐公交出门,出门晚了,内心很是焦急,希望公交车能开的快一点。但是,忽然在一个路口,没有任何红绿灯,公交居然停了下来。我当时非常奇怪,也很不爽,不知道为什么公交车会停。在探头张望了一下之后,我才反应过来:原来刚才那是斑马线,司机在礼让行人。突然觉得有点羞愧。我这个自诩“素质很高”的大学生,长期浸淫在一种“无需遵守规则的”、“错误的”环境下,已经对正确的行为反应迟钝了。所谓近朱者赤,近墨者黑,说的就是这个道理,而我也如同汉人刘向说的一样“入鲍鱼之肆,久而不闻其臭,与之化矣”。
我们心中都有一个正义的超人,这个超人在我们还小的时候,总是提醒我们要做正确的事、要做一个好人、看到皇帝没穿衣服时要敢说出来。
而随着我们长大,我们越来越听到这样或那样的话:
  • 别傻了,那样做没用的
  • 这个世界就这样
  • 中国就这样,你改变不了的
  • 好好挣钱吧,别想这些没用的
  • 枪打出头鸟,别胡闹了
  • 都30岁了,怎么还像个小孩一样,说话不经大脑
  • 中国人都这样,承认了吧
  • ……
这些话第一次听,可能99%的人会抵触,第二次听,可能90%的人会抵触……第十次听,可能只有10%的人会抵触。
在电影《肖申克的救赎》里,有一个著名的词,叫做 体制化。犯人老瑞德(摩根·弗里曼饰)这样谈到“体制化(institutionalized)”:
“起初你讨厌它(监狱),然后你逐渐习惯它,足够的时间后你开始依赖它,这就是体制化”。
这些话听得越多,心中的超人就越被挤压,他本以为,你是一个正义的人;他本以为,你是一个踹车轮的人;他本以为,你不是一个容易被体制化的人;他本以为,他能生存更长的时间。
对你说这些话的人,往往是已经被体制化了,所谓体制化,就好像一个20来岁的人去当公务员(没有特别鄙视公务员的意思),每天做着一样的事,然后对你说,
人生就是这样,接下来我会结婚生子死去,我的孩子也是这样,我的孩子的孩子,还是这样。
对于他来说,世界就在这个体制里面。
于是,我们看到了中国式过马路,凑够一堆人就可以走,不管红灯绿灯;我们看到了百度的疯狂作恶,“卖血友病吧”、“魏泽西”、“竞价排名”、“虚假广告”、“百度全家桶”,真是罄竹难书;我们还看到了【根据相关法律法规和政策,部分搜索结果未予显示】,GFW的存在让多少网民失去了尊严?Google的离开,更让百度肆无忌惮。
我很喜欢这样的一个比喻,有人说,社会就像一个大车轮,很大、很沉,如果你踹它一脚,它纹丝不动。但如果从微观的角度去看,你踹的这一脚,可能让这个大车轮移动了几纳米,只是你肉眼看不到,而事实上,车轮却因为你的这一脚向前移动了一点点。如果每个人都能去踹一脚,车轮可能就能以微米,甚至毫米的速度向前进。但如果我们都仅凭肉眼直观地觉得我们踹一脚没用,社会就不会进步了。
我想我们应该感谢当今互联网的存在,使得一个个微小的个体都有了主动了解世界的机会,比如以前我只能在电视机和报纸上了解到主流媒体想让我了解到的信息,但是如今我可以利用互联网上Google等搜索引擎主动去了解信息;同时,互联网也给予了我们主动发声的机会,比如以前我可能只能给家人说百度很垃圾,但是现在我可以写文章让很多人看到。
勿以力小而不为,很多时候,改变世界并不是说一定要我们发明iPhone或者写出流传千古的音乐、文章,只要我们“有一分热发一分光”,都去踹一脚车轮,都能对社会产生一点点影响,就是在改变世界。
毕竟中国有10多亿人呢。

Sunday 18 June 2017

Python拾遗(一)python内建函数str()和repr()的区别

MarkdownPad Document
对于python而言,可以使用内建函数str()和repr()来将数值转化成字符串。但是,对于这两个方法,究竟有什么区别呢?
在Python tutorial中,是这么说的:
The str() function is meant to return representations of values which are fairly human-readable, while repr() is meant to generate representations which can be read by the interpreter (or will force a SyntaxError if there is no equivalent syntax).
意思是,str()这个函数用于返回相当具有可读性的数值,而repr()主要用于返回适宜解释器读取的数值,并且当该数值没有对应的字符串时,会返回一个SyntaxError
这个解释还是让人似懂非懂。什么是“具有可读性的数值”?什么又是“适合于解释器读取的数值”?
让我们先看几个例子吧。
>>> # The repr() of a string adds string quotes and backslashes:
... hello = 'hello, world\n'
>>> hellos = repr(hello)
>>> print(hellos)
'hello, world\n'
在这段例子中,变量hellos保留了原来的格式,显示出了\n和引号;不过这段例子可能还是无法真正良好的表达出repr()str()函数的真正区别,让我们再看下一个例子:
>>> from datetime import datetime
>>> now = datetime.nxow()
>>> print(str(now))
2017-04-22 15:41:33.012917
>>> print(repr(now))
datetime.datetime(2017, 4, 22, 15, 41, 33, 12917)
通过str()的输出结果我们能很好知道now实例的内容,但是却丢失了now实例的数据类型信息。而通过repr()的输出结果我们不仅能获得now实例的内容,还能知道now是datetime.datetime对象的实例。
因此str()repr()的不同在于:
  • str()的输出追求可读性,输出格式要便于理解,适合用于输出内容到用户终端。
  • repr()的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用。 另外如果想要自定义类的实例能够被str()repr()所调用,那么就需要在自定义类中重载__str____repr__方法。

Thursday 15 June 2017

回望那个纯真的年代——读《七十年代》有感

        很久没有发博文了,俺最近忙着转专业的事情,焦头烂额,所幸终于转成功了,要稍微的庆贺一下。最近读书很杂,历史、文学、政治、经济都略有涉及,所以俺今天就来写一写这段时间的读后感吧:)

        上周读完了由北岛、李陀先生主编的《七十年代》这样一本回忆录集,选了三十多个当代知识分子(包括了作家,诗人北岛、王安忆;画家陈丹青、张朗朗等人),记述了他们对于七十年代的回忆。在维基百科的年代记事上,七十年代指1970年至1979年这十年的历史。这段历史距离我们这一代,只有短短三十年的长度,却已经如同泛黄的老照片,让人难以捉摸。偶然间看到了这本书,如获至宝,很快读了下来。

        那段历史在我脑海中曾经只是一个个支离破碎的大记事:1971年中美建交、1972年日本首相田中角荣访华、1976年9月毛泽东去世、10月文化大革命结束、1978年十一届三中全会召开,中国改革开放正式开始.......如果说,这些大记事只是骨架的话,这本书能给予了骨架以血肉和细节,让我们能从一个个人的角度去重新回顾和反思那段历史。无论是知青们收听美国之音、BBC之类的“敌台”;还是北岛先生抱着自己的书稿躲避审查;亦或者是中学生们只需要背熟几条“毛主席语录”便可以升学,都让人捧腹、恐惧、亦或者困惑。回忆录的作者们在七十年代大多是二十岁的黄金时代,那种年轻人的对权威的反叛、对自由的追求、对于知识的渴望无不让我感慨不已。

        而让我最为意外的是,在那样一个贫困、混乱而又灰暗的年代,那个时代的青年的精神是如此的纯真和理想主义。

“当蜘蛛网无情的查封了我的炉台/当灰烬的余烟叹息着贫困的悲哀/我依然固执的铺平失望的灰烬/用美丽的雪花写下:相信未来”,郭路生(食指)的诗道出了青年们的心声。于是我们看到,张朗朗先生在被“四人帮”用莫须有的“间谍罪、恶毒攻击中央首长”等罪名关进监狱之后,依然能够在铁窗中坚持自己的信仰,不屈不挠,最后成功的活了下来;遇罗克能在《血统论》红色恐怖的笼罩下,借着形势的变化,一篇《出身论》横空出世,如同流星划破漆黑的夜空,成为当时很多人精神的领袖。我想,在那样一个人人自危的时代,敢于说出自己内心的想法的人,是应该被称作英雄的了。虽然对他们有这样或者那样的诋毁,但是,鲁迅先生曾说,“有缺点的战士终究是战士,完美的苍蝇也终究不过是苍蝇”,这样的人,是我辈之楷模。

  看看如今,似乎理想主义这样一个词已经变成了一种嘲讽,抑或者是当今社会的一种稀缺品。这种现象,我深不以为然。在日本,有一种精神叫做“工匠精神”,指工匠以极致的态度对自己的产品精雕细琢,不断追求完美的过程。在我看来这就是一种理想主义。今天的社会追求一种快销化的增长方式,如赚快钱、看快书、追求快速的个人增值,这无可厚非;但我们不应该忘记,在生活中,还可以有另外一种选择,选择在这样一个社会中保持理想主义的生活方式,如同普罗米修斯盗火,将理想传递下去。如果一个时代没有了这样的人,那将会是悲哀的。

我们应该向那些拿着“民主、自由、独立、社会正义和人道主义”的普罗米修斯致敬。


Friday 17 March 2017

shadowsocks翻墙,PAC模式和全局模式的区别

    最近上网,发现在电脑端使用shadowsocks无法进入一些比较小众的网站,并且自己的博客也出现了偶尔能上去偶尔上不去的状况。我上网查阅了一下各种资料,最后终于解决了这个问题:
    首先我们要知道,传统的VPN有一大弊端,就是只能支持全局代理模式,这样的情况下,虽然上网都没问题,但是容易出现打开国内网站速度变慢的问题。而ss不但支持全局代理模式,同时还支持PAC模式(智能分流)代理,可以根据需求进行更改,在GFWlist上的网站走代理,而不在GFWlist上的网站不走代理,非常智能。
    但是!PAC模式有个弊端就是,由于PAC更新不及时或者GFWlist更新不及时,会导致部国外网站无法登录的问题。而我就是遇到了这样的问题
    解决方案如下:
    
        可以自己手动编辑本地PAC列表,把缺失的网站加进去就可以上网了。具体添加规则请自行观察,或者google:)很简单

今日转载:shadowsocks搭建教程: 【倾力原创】史上最详尽Shadowsocks从零开始一站式翻墙教程

感谢作者,现在转载在自己的博客,多多传播。shadowsocks搭建教程: 【倾力原创】史上最详尽Shadowsocks从零开始一站式翻墙教程: 原创声明 本教程由本人( Anonymous V )原创,于2014年11月7日在 Google+首发 ,根据各位G友的积极反馈,历经持续2个多月的维护和更新,已 成功 帮助上千网友通过shadowsocks流畅翻墙,现在整理成图文混排版本发在本博客,以进一步方便大家查阅。...

Sunday 26 February 2017

C 语言学习点滴 2 —— 指针的理解

    前一阵子学习了指针(pointer)的概念,略微感觉有些复杂。我仔细思考了一下,感觉并不是逻辑复杂,而是概念复杂。
    指针在C语言中用于储存变量的地址。或者,从根本上看,指针(pointer)是一个值为内存地址的变量。我们可以类比来看,int类型变量的值是整数,char类型变量的值是字符,那么指针变量的值就是地址。
    接下来,我们要弄清楚几个概念。
  1. 假设一个指针变量名是ptr,我们可以编写以下语句: Source file
     1 ptr = &pooh;
    
    对于这条语句,我们可以说,ptr“指向”pooh,那么现在ptr的值就是pooh的地址。
  2. 紧接着,我们可以使用间接运算符 *(indirection operator)找出储存在pooh上的值(也可以说是找出ptr所指向的值)。 Source file
     1 val = *ptr;
    
    说了这么多,其实我们可以这样来理解指针的概念:
    将计算机的整个内存想象成你所在的宿舍楼,宿舍楼里都是挨个的小房间(相当于一个个宿舍)。

    计算机的内存就是由一组组的储存单元在一起构成的,为了定位每一个单元格,我们会使用十六进制给予每个储存单元一个唯一的身份识别码,称之为地址。比如第一个宿舍我们称之为0x00,第二个宿舍称之为0x01,以此类推。内存的寻址是线性的,对于32位寻址的内存,其最大地址刚好是0xFFFFFFFF,从0到0xFFFFFFFF恰好是4GBytes个单元。诸如此般,我们即可以通过地址来定位一个宿舍了啦!

    但是呢,通过数字来记忆宿舍的位置实在是太麻烦了,很容易就记混,我们可以选择给一个特定的宿舍起一个别名。
    比如,我们给内存位置是0x02的宿舍起名字叫做DOC。这样,DOC就代替了0x02这个地址,帮我们找到这个宿舍。
    这就是指针。我们可以这么说,DOC指向了0x02。
    宿舍里都会住人,在DOC中住了一个我,小汪。我刚刚去上大学,班主任还要很多同学都不认识我,但他们知道我住在DOC房间里,所以呢,都叫我“住在DOC里的那个人”。
    在C语言中的表示就是, *DOC。
    结果我因为敢于发言,当了班长,所以大家都叫我monitor了。
    这个在C语言中就是 monitor = *DOC
    不知道大家看懂了没有,monitor就是变量名,而我,小汪,就是变量啦。

C语言学习点滴 1—— 对函数的理解

    近期正在逐步地深入学习C语言,为了将自己学习的知识整理成体系,同时加深理解与记忆,我决定开始写写关于C语言的博文。就让我现在就开始吧!

    一,函数
    函数就像我们儿时搭积木的一个个造型各异的木块一样,我们只需要关心该如何使用这些小木块搭建成摩天大楼,而并不需要关心小木块内部究竟有什么结构。函数的设计思想即是将程序内部复杂的逻辑结构封装起来,使用者只需要弄清楚每一个函数的作用,而不需要知道这个函数究竟是如何实现的。我在未学习函数时,写过一个简陋的飞机大战游戏(无GUI界面,只打击移动靶):


Source file



#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int main(void)
{
    int i, j;
    int x = 5;
    int y = 10;
    char input;
    int isFire = 0;

    int ny = 5; // 一个靶子,放在第一行,ny列上
    int isKilled = 0;

    while (1)
    {
        system("cls");   // 清屏函数

        //
        if (!isKilled)  // 输出靶子
        {
            for (j = 0; j<ny; j++)
                printf(" ");
            printf("+\n");
        }

        if (isFire == 0) // 输出飞机上面的空行
        {
            for (i = 0; i<x; i++)
                printf("\n");
        }
        else   // 输出飞机上面的激光竖线
        {
            for (i = 0; i<x; i++)
            {
                for (j = 0; j<y; j++)
                    printf(" ");
                printf("  |\n");
            }
            if (y + 2 == ny)
                isKilled = 1; // 击中靶子
            isFire = 0;
        }

        // 下面输出一个复杂的飞机图案
        for (j = 0; j<y; j++)
            printf(" ");
        printf("  *\n");
        for (j = 0; j<y; j++)
            printf(" ");
        printf("*****\n");
        for (j = 0; j<y; j++)
            printf(" ");
        printf(" * * \n");

        if (kbhit())  // 判断是否有输入
        {
            input = getch();  // 根据用户的不同输入来移动,不必输入回车
            if (input == 'a')
                y--;  // 位置左移
            if (input == 'd')
                y++;  // 位置右移
            if (input == 'w')
                x--;  // 位置上移
            if (input == 's')
                x++;  // 位置下移
            if (input == ' ')
                isFire = 1;
        }
    }
    return 0;
}
如果把全部的功能都放在一个main()函数之中实现,那是比较痛苦的事情,但有了函数,我们可以对每一个功能进行封装实现,这样后期代码的维护以及调试都会比较容易。
     在C中,使用函数要注意:
  1. 首先要使用函数原型(function prototype),告诉编译器函数的类型,包括是否接收变量以及是否返回值。
  2. 函数调用(function call),表示在某处使用该函数。
  3. 函数定义(function definition),明确指明函数要做什么。
    要注意几个概念:
  1. 全局变量与局部变量,局部变量(如变量count)只属于某一个函数私有,程序员可以在程序的其他地方,包括main()函数中使用count,这样并不会引起名称的冲突。
  2. 形式参数与实际参数:实际参数是出现在函数调用圆括号中的表达式,而形式参数则是函数定义的函数头中声明的变量。
    为什么我们在使用函数之前需要先声明函数原型呢?
        原因是:我们首先假设一个函数,需要读取两个int类型的数值,而函数调用只使用了imax(3),在C中,主调函数把它的参数储存在栈(stack)中,被调函数从栈中读取这些参数,被调函数根据函数原型中函数声明的形式参数来读取值,因此,函数调用imax(3),将一个整数放在栈中,而当imax()开始执行时,它要从栈中读取两个整数,但是栈中实际上只放了一个待读取的整数,这样就会引起错误,而如果不首先声明函数原型,并完整的声明函数参数的话,编译器是不会报错的。有了函数原型中的这些信息,编译器可以检查函数调用是否与函数原型相匹配。
    

Friday 6 January 2017

摘抄:中国高校“智库热”的冷思考

今天浏览了南华早报中文网上的一篇文章,觉得写的颇有味道,让我对于中国高校的内在有了新的思考,现在摘抄几段话,留着以后慢慢品味。


  1. 大学,原本就应是一块与世俗社会保持距离,带有一定理想主义色彩的所在。“反建制”的核心并不在于反对一切体制及体制因素,而在于跳出体制内固有的思维、理念和利益格局去思考体制本身。否则,当“反建制”力量不存在,体制调整依赖于体制内部力量的博弈,那么体制就缺乏真正革新的动力。因为“反建制”本质上反的是精英及其话语权,精英群体不可能改革他们所领导和得益的体制。作为“反建制”的集大成者,卡尔·马克思对欧洲当时统治力量资产阶级的批判和斗争,为欧洲社会革命的爆发创造了巨大的思想力量。                                                
  2. 大学建智库行为本身不应受到苛责,但如果将精力倾注于此,则失去了大学存在的意义。大学存在之根本,乃是育人。即便在中国古代,“大学”也会与行政机关和行政权力保持一定的距离,坚守“传道授业解惑”之要。古代所设太学、书院、学馆等,目的乃是为朝廷培育人才。这种教育虽然带有强烈的工具色彩,但无形的“道统”也不断在一代又一代师生中传承,甚至在面对强大的公权力乃至皇权时,许多文士都保持着难能可贵的卫道精神,与皇帝面折庭争。直至清代,皇帝采用严酷的思想审查,从根本上灭绝了“道统”,中国文士才真正开始向朝廷匍匐于地。现代中国大学一方面保存了古代文士浓郁的入世和治世的情怀,教育工具化色彩浓厚,另一方面也积极融入当今行政资源分配的体系,接受权力对教育与学术的主导。其中影响最为深远的,乃是权力结构对中国大学的知识范式的建构。
  3. 大学如果对建设智库倾注太多的精力,不仅是对基础研究的过度贴现,更是对教书育人的不负责任。对智库的执着容易落入“楚门的世界”,因为他们所得到的研究对象不过是实相在那个世界的投影,而他们的一生都是在一套精致的人为规则下围绕着一个虚像打转。然而,即便知道真相,又有多少人愿意离开?外面的世界,或许更为不堪。正因如此,才需要改变。想想,中国的大学生里又有多少人梦想着,让这个世界变得更加美好?                       





Thursday 5 January 2017

今日转载:记念 ss,向一个伟大的创造告别

毫无征兆地,Github 上 shadowsocks 项目 Wiki 被全部删除。那时的我天真地寄希望于作者只是厌倦于和无穷无尽的小白和 SSR 项目的抄袭,天真的以为这个项目还会以相对高的门槛运行下去。
之后就传出 clowwindy 被喝茶的消息,我震惊,我一直以为他是在墙外维护这些项目的,以至于我目瞪口呆许久不知道该用什么词来形容我对他的敬佩。
我早就知道 ss 这个神话总会有终结的这么一天,只是没有想到是今天,也没想到是以这样的形式。
我自认为不是愤青,甚至我曾经以为我不会谈论一个政治事件浪费我的人生,只是我在我的生活受到损害的时候才再次体会到,个人命运和国家是紧密相联的,身在一个国家,想和这个国家的政治无关,是不可能的。
起初,他们追杀共产主义者,我不是共产主义者,我不说话;
接着,他们追杀犹太人,我不是犹太人,我不说话;
后来,他们追杀工会成员,我不是工会成员,我不说话;
此后,他们追杀天主教徒,我是新教徒,我不说话;
最后,他们奔我而来,再也没有人站出来为我说话了。
可是我实在无话可说。我只觉得所住的并非人间。ss 多年的开发进程,残存在Github 的编辑记录里,使我艰于呼吸视听,那里还能有什么言语?长歌当哭,是必须在痛定之后的。而此后几个所谓 SSR 支持者的阴险的论调,尤使我觉得悲哀。我已经出离愤怒了。我将深味这非人间的浓黑的悲凉;以我的最大哀痛显示于非人间,使它们快意于我的苦痛,就将这作为后死者的菲薄的祭品,奉献于逝者的灵前。
作为一个在 IT 这个圈子里的人,我无非是比普通网民多了一点点手段,有能力在高墙之上钻出一两个洞,一窥外面的世界,偶尔还能拉上朋友,和我一起坐在洞旁,讨论那些可贵的风景。而 ss 便是让我有机会在高墙上打孔的锤子镰刀。可是我也知道,我现在所拥有的数个巴掌大的所谓风景,只是在伏在高墙之下,对高墙之上的肉食者摇首乞怜的结果;因为我心知肚明,白名单这一对民众而已彻底无解的手段始终作为王牌掌握在肉食者手里,也是悬在无数 IT 业者头顶的达摩克利斯之剑。
我在20日下午,才知道 ss 停止维护的事,晚上便得到噩耗,说 clowwindy 被约谈。但我对于这些传说,竟至于颇为怀疑。我向来是不惮以最坏的恶意,来推测中国人的,然而我还不料,也不信竟会下劣凶残到这地步。
然而即日证明是事实了,作证的便是 Github 上的残余无几的代码。还有一些,是谷歌的网页快照。而且又证明着这不但是约谈,简直是逼迫,clowwindy 已然关闭了他的 Twitter 帐号。
但当局就有令,说他们是“反动分子”!
但接着就有流言,说他们是被人利用的。
惨象,已使我目不忍视了;流言,尤使我耳不忍闻。我还有什么话可说呢?我懂得衰亡民族之所以默无声息的缘由了。沉默呵,沉默呵!不在沉默中爆发,就在沉默中灭亡。
在这次事件中,尤使我心寒的,是一位抄袭者及其支持者不堪入目的言论,https://github.com/breakwa11/shadowsocks-rss/ 在他们的眼里,GPL 不算什么,版权不算什么,他们的眼里,只有大大开发软件让他们上网,只有你是大大你要支持小白的逻辑。对于这样毁灭一个开源软件生态的人,我希望他们永远的挂在历史的耻辱柱上。
当时的 clowwindy 是以怎样的心情看着 SSR 的作者和这些小白的呢,我想应该是失望透顶的。
方校长在虚拟的国境线上画了一个圈,于是大大们在圈子里自封为王,小白们抓住大大的腿毛,在充满了中国特色社会主义网络主权的圈子里,大大们和小白们形成了一个奇特的自给系统。当然,有人会觉得,没有谷歌,我们有百度;没有 Twitter,我们有微博;没有 YouTube,我们有优酷土豆,有人会觉得墙内世界已经确实可以自给自足。当然,不可否认在墙的滋养下,一批所谓的国产成长了起来,但是,请你睁大眼睛,看一看在实质垄断下的中国互联网,滋生了多少流氓。当你下载一个软件缺惨遭百度杀毒全家桶的时候、当你搜一个关键词满屏都是竞价排名的时候、当你的微博充满了僵尸粉的时候、当微博主页都挂满了毫无意义的推广的时候、当你看一集视频要看三分钟广告的时候——你是不是还认为墙里的世界和墙外没什么区别呢?
没有竞争的寡头世界,注定充满了流氓。保护主义下的互联网,只是一个大号的局域网罢了。
如果你不理解,没有关系,世界上总不可能只有一类人。
ss 从发布到终结的这三年,有人借助它看世界,也有人借助它发财;ss 毕竟只是一个工具,让它成为看世界的眼睛或是攫取利益的手,全凭一念之差。至少我是希望,我所维护的 ss 节点,能成为更多人的眼睛,我相信,视野是能改变一个人的命运的,虽然看的更远并不能让一个人站的更高,但是至少会带来前进的动力。
也许 ss 这个项目就此沉寂下去,也许会有抱着同样理想的人默默的维护下去,时间永是流驶,街市依旧太平,有限的几个项目,在中国是不算什么的,至多,不过供无恶意的闲人以饭后的谈资,或者给有恶意的闲人作“流言”的种子。
不要尝试玩猫抓老鼠的游戏,尤其是那只猫曾经还是一只老鼠。
我恨我自己,恨我曾经对高墙之上的肉食者抱有的高度期望;
我恨我自己,恨我没有足够的能力在 ss 有生之年贡献一句代码;
我恨我自己,恨我没有选择舍弃一切地离开。
再见了,ss 的神话时代;
加油,clowwindy,祝你武运昌隆。
苟活者在淡红的血色中,会依稀看见微茫的希望;真的猛士,将更奋然而前行。
 原帖地址:https://www.starduster.me/2015/08/21/say-goodbye-to-ss/ 感谢作者stardust,贡献了一篇这么好的文章。